From 32ed8e248393880f737b3127fe7e6e98dbc8c99e Mon Sep 17 00:00:00 2001
From: Roland Ottensamer <roland.ottensamer@univie.ac.at>
Date: Wed, 22 Jul 2020 16:13:48 +0200
Subject: [PATCH] Public release of IFSW 1.1

---
 CompressionEntity/src/IfswConversions.c       |    1 +
 CompressionEntity/src/IfswConversions.h       |    1 +
 CompressionEntity/src/IfswMath.c              |    1 +
 CompressionEntity/src/IfswMath.h              |    1 +
 .../src/SdpAlgorithmsImplementation.c         | 3005 +++++++
 .../src/SdpAlgorithmsImplementation.h         |  145 +
 .../src/SdpAlgorithmsImplementationLlc.c      |  818 ++
 .../src/SdpAlgorithmsImplementationLlc.h      |  105 +
 CompressionEntity/src/SdpBuffers.c            | 1429 +++
 CompressionEntity/src/SdpBuffers.h            |  299 +
 CompressionEntity/src/SdpCeDefinitions.h      |  251 +
 CompressionEntity/src/SdpCollect.c            |  409 +
 CompressionEntity/src/SdpCollect.h            |    9 +
 CompressionEntity/src/SdpCompress.c           |  825 ++
 CompressionEntity/src/SdpCompress.h           |   30 +
 .../src/SdpCompressionEntityStructure.h       |  249 +
 CompressionEntity/src/SdpNlcPhot.c            |  885 ++
 CompressionEntity/src/SdpNlcPhot.h            |   53 +
 CrFramework/CHANGELOG                         |    5 +
 CrFramework/README                            |    9 +
 CrFramework/src/AppStartUp/CrFwAppResetProc.h |   52 +
 .../src/AppStartUp/CrFwAppShutdownProc.h      |   52 +
 CrFramework/src/AppStartUp/CrFwAppSm.c        |  249 +
 CrFramework/src/AppStartUp/CrFwAppSm.h        |  182 +
 .../src/AppStartUp/CrFwAppStartUpProc.h       |   52 +
 CrFramework/src/Aux/CrFwAux.c                 |  273 +
 CrFramework/src/Aux/CrFwAux.h                 |  164 +
 CrFramework/src/BaseCmp/CrFwBaseCmp.c         |  232 +
 CrFramework/src/BaseCmp/CrFwBaseCmp.h         |  221 +
 CrFramework/src/BaseCmp/CrFwDummyExecProc.c   |   73 +
 CrFramework/src/BaseCmp/CrFwDummyExecProc.h   |   69 +
 CrFramework/src/BaseCmp/CrFwInitProc.c        |   91 +
 CrFramework/src/BaseCmp/CrFwInitProc.h        |  125 +
 CrFramework/src/BaseCmp/CrFwResetProc.c       |   88 +
 CrFramework/src/BaseCmp/CrFwResetProc.h       |  109 +
 CrFramework/src/CrFwConstants.h               |  628 ++
 CrFramework/src/CrFwRepErr.h                  |  157 +
 CrFramework/src/CrFwRepInCmdOutcome.h         |  162 +
 CrFramework/src/CrFwTime.h                    |   50 +
 CrFramework/src/InCmd/CrFwInCmd.c             |  413 +
 CrFramework/src/InCmd/CrFwInCmd.h             |  244 +
 CrFramework/src/InFactory/CrFwInFactory.c     |  547 ++
 CrFramework/src/InFactory/CrFwInFactory.h     |  231 +
 CrFramework/src/InLoader/CrFwInLoader.c       |  259 +
 CrFramework/src/InLoader/CrFwInLoader.h       |  212 +
 CrFramework/src/InManager/CrFwInManager.c     |  322 +
 CrFramework/src/InManager/CrFwInManager.h     |  170 +
 CrFramework/src/InRegistry/CrFwInRegistry.c   |  216 +
 CrFramework/src/InRegistry/CrFwInRegistry.h   |  151 +
 CrFramework/src/InRep/CrFwInRep.c             |  121 +
 CrFramework/src/InRep/CrFwInRep.h             |  148 +
 CrFramework/src/InRep/CrFwInRepExecProc.c     |   79 +
 CrFramework/src/InRep/CrFwInRepExecProc.h     |   52 +
 CrFramework/src/InStream/CrFwInStream.c       |  386 +
 CrFramework/src/InStream/CrFwInStream.h       |  255 +
 CrFramework/src/OutCmp/CrFwOutCmp.c           |  408 +
 CrFramework/src/OutCmp/CrFwOutCmp.h           |  348 +
 CrFramework/src/OutFactory/CrFwOutFactory.c   |  376 +
 CrFramework/src/OutFactory/CrFwOutFactory.h   |  218 +
 CrFramework/src/OutLoader/CrFwOutLoader.c     |  149 +
 CrFramework/src/OutLoader/CrFwOutLoader.h     |  146 +
 CrFramework/src/OutManager/CrFwOutManager.c   |  303 +
 CrFramework/src/OutManager/CrFwOutManager.h   |  164 +
 CrFramework/src/OutRegistry/CrFwOutRegistry.c |  397 +
 CrFramework/src/OutRegistry/CrFwOutRegistry.h |  263 +
 CrFramework/src/OutStream/CrFwOutStream.c     |  433 +
 CrFramework/src/OutStream/CrFwOutStream.h     |  261 +
 CrFramework/src/Pckt/CrFwPckt.h               |  368 +
 CrFramework/src/Pckt/CrFwPcktQueue.c          |  146 +
 CrFramework/src/Pckt/CrFwPcktQueue.h          |  136 +
 .../UtilityFunctions/CrFwUtilityFunctions.c   |  148 +
 .../UtilityFunctions/CrFwUtilityFunctions.h   |  176 +
 CrIa/Makefile                                 |  150 +
 CrIa/Makefile-dpu.mk                          |  147 +
 CrIa/Makefile-eval.mk                         |   68 +
 CrIa/Makefile-pc.mk                           |   70 +
 CrIa/doc/Doxyfile                             | 2482 +++++
 CrIa/doc/DoxygenLayout.xml                    |  194 +
 CrIa/doc/Makefile                             |   16 +
 CrIa/doc/bootstrap.min.css                    |    6 +
 CrIa/doc/bootstrap.min.js                     |    7 +
 CrIa/doc/customdoxygen.css                    |  306 +
 CrIa/doc/doxy-boot.js                         |  121 +
 CrIa/doc/extradoc/mainpage.dox                |   66 +
 CrIa/doc/footer.html                          |   26 +
 CrIa/doc/header.html                          |   47 +
 CrIa/doc/images/Interlopers_1.png             |  Bin 0 -> 80000 bytes
 CrIa/doc/images/Interlopers_2.png             |  Bin 0 -> 80633 bytes
 .../images/cheops-logo-with-additional3.png   |  Bin 0 -> 11478 bytes
 CrIa/doc/images/fingerprint.png               |  Bin 0 -> 78579 bytes
 CrIa/doc/images/obsDB_fingerprint.png         |  Bin 0 -> 97604 bytes
 .../radius_photometry_real_psf_shape.png      |  Bin 0 -> 68634 bytes
 .../radius_photometry_real_psf_signal.png     |  Bin 0 -> 55784 bytes
 CrIa/doc/images/radius_photometry_sim_psf.png |  Bin 0 -> 56983 bytes
 CrIa/doc/images/star_extraction_process.png   |  Bin 0 -> 108144 bytes
 CrIa/ifsw.c                                   |  334 +
 CrIa/ifsw.h                                   |   27 +
 CrIa/src/CrConfigIa/CrFwAppSmUserPar.h        |   54 +
 CrIa/src/CrConfigIa/CrFwCmpData.h             |  110 +
 CrIa/src/CrConfigIa/CrFwInFactoryUserPar.h    |  237 +
 CrIa/src/CrConfigIa/CrFwInLoaderUserPar.h     |   50 +
 CrIa/src/CrConfigIa/CrFwInManagerUserPar.h    |   39 +
 CrIa/src/CrConfigIa/CrFwInRegistryUserPar.h   |   24 +
 CrIa/src/CrConfigIa/CrFwInStreamUserPar.h     |  208 +
 CrIa/src/CrConfigIa/CrFwOutFactoryUserPar.h   |  207 +
 CrIa/src/CrConfigIa/CrFwOutLoaderUserPar.h    |  131 +
 CrIa/src/CrConfigIa/CrFwOutManagerUserPar.h   |   40 +
 CrIa/src/CrConfigIa/CrFwOutRegistryUserPar.h  |  115 +
 CrIa/src/CrConfigIa/CrFwOutStreamUserPar.h    |  204 +
 CrIa/src/CrConfigIa/CrFwUserConstants.h       |  279 +
 CrIa/src/CrConfigIa/genOutReg.sh              |   20 +
 CrIa/src/CrFwRepErr.c                         |  234 +
 CrIa/src/CrFwRepInCmdOutcome.c                |  115 +
 CrIa/src/CrIaDataPool.c                       | 7988 +++++++++++++++++
 CrIa/src/CrIaDataPool.h                       | 1316 +++
 CrIa/src/CrIaDataPoolId.h                     | 1019 +++
 CrIa/src/CrIaIasw.c                           | 2967 ++++++
 CrIa/src/CrIaIasw.h                           |  204 +
 CrIa/src/CrIaInCmp.c                          |  114 +
 CrIa/src/CrIaInCmp.h                          |   28 +
 CrIa/src/CrIaInLoader.c                       |   42 +
 CrIa/src/CrIaInLoader.h                       |   26 +
 CrIa/src/CrIaMain.c                           |  279 +
 CrIa/src/CrIaOutCmp.c                         |   48 +
 CrIa/src/CrIaOutCmp.h                         |   20 +
 CrIa/src/CrIaOutLoader.c                      |   64 +
 CrIa/src/CrIaOutLoader.h                      |   23 +
 CrIa/src/CrIaPckt.c                           |  777 ++
 CrIa/src/CrIaPckt.h                           |  287 +
 CrIa/src/CrIaPrSm/CrIaAcqFullDropCreate.c     |  138 +
 CrIa/src/CrIaPrSm/CrIaAcqFullDropCreate.h     |  234 +
 CrIa/src/CrIaPrSm/CrIaAcqFullDropFunc.c       |  442 +
 CrIa/src/CrIaPrSm/CrIaAcqFullDropInit.txt     |   20 +
 CrIa/src/CrIaPrSm/CrIaAcquAlgoExecCreate.c    |   39 +
 CrIa/src/CrIaPrSm/CrIaAcquAlgoExecCreate.h    |   48 +
 CrIa/src/CrIaPrSm/CrIaAcquAlgoExecFunc.c      |  144 +
 CrIa/src/CrIaPrSm/CrIaAlgoCreate.c            |   46 +
 CrIa/src/CrIaPrSm/CrIaAlgoCreate.h            |  101 +
 CrIa/src/CrIaPrSm/CrIaAlgoFunc.c              |  482 +
 CrIa/src/CrIaPrSm/CrIaAlgoInit.txt            |   22 +
 CrIa/src/CrIaPrSm/CrIaCalFullSnapCreate.c     |   59 +
 CrIa/src/CrIaPrSm/CrIaCalFullSnapCreate.h     |  207 +
 CrIa/src/CrIaPrSm/CrIaCalFullSnapFunc.c       |  360 +
 CrIa/src/CrIaPrSm/CrIaCalFullSnapInit.txt     |   20 +
 CrIa/src/CrIaPrSm/CrIaCentAlgoCreate.c        |   41 +
 CrIa/src/CrIaPrSm/CrIaCentAlgoCreate.h        |   67 +
 CrIa/src/CrIaPrSm/CrIaCentAlgoFunc.c          |  136 +
 CrIa/src/CrIaPrSm/CrIaCentAlgoInit.txt        |   20 +
 CrIa/src/CrIaPrSm/CrIaCentValProcCreate.c     |   89 +
 CrIa/src/CrIaPrSm/CrIaCentValProcCreate.h     |  105 +
 CrIa/src/CrIaPrSm/CrIaCentValProcFunc.c       |  210 +
 CrIa/src/CrIaPrSm/CrIaCentValProcInit.txt     |   20 +
 CrIa/src/CrIaPrSm/CrIaCmprAlgoExecCreate.c    |   39 +
 CrIa/src/CrIaPrSm/CrIaCmprAlgoExecCreate.h    |   48 +
 CrIa/src/CrIaPrSm/CrIaCmprAlgoExecFunc.c      |   92 +
 CrIa/src/CrIaPrSm/CrIaCmprAlgoExecInit.txt    |   20 +
 CrIa/src/CrIaPrSm/CrIaCtrldSwitchOffCreate.c  |   39 +
 CrIa/src/CrIaPrSm/CrIaCtrldSwitchOffCreate.h  |   67 +
 CrIa/src/CrIaPrSm/CrIaCtrldSwitchOffFunc.c    |   72 +
 CrIa/src/CrIaPrSm/CrIaCtrldSwitchOffInit.txt  |   20 +
 CrIa/src/CrIaPrSm/CrIaFbfLoadCreate.c         |   76 +
 CrIa/src/CrIaPrSm/CrIaFbfLoadCreate.h         |   99 +
 CrIa/src/CrIaPrSm/CrIaFbfLoadFunc.c           |  196 +
 CrIa/src/CrIaPrSm/CrIaFbfLoadInit.txt         |   20 +
 CrIa/src/CrIaPrSm/CrIaFbfSaveCreate.c         |   98 +
 CrIa/src/CrIaPrSm/CrIaFbfSaveCreate.h         |  133 +
 CrIa/src/CrIaPrSm/CrIaFbfSaveFunc.c           |  248 +
 CrIa/src/CrIaPrSm/CrIaFbfSaveInit.txt         |   20 +
 CrIa/src/CrIaPrSm/CrIaFdCheckCreate.c         |   67 +
 CrIa/src/CrIaPrSm/CrIaFdCheckCreate.h         |  169 +
 CrIa/src/CrIaPrSm/CrIaFdCheckFunc.c           | 2051 +++++
 CrIa/src/CrIaPrSm/CrIaFdCheckInit.txt         |   19 +
 CrIa/src/CrIaPrSm/CrIaHbSemMonCreate.c        |  125 +
 CrIa/src/CrIaPrSm/CrIaHbSemMonCreate.h        |  176 +
 CrIa/src/CrIaPrSm/CrIaHbSemMonFunc.c          |  273 +
 CrIa/src/CrIaPrSm/CrIaIaswCreate.c            |   55 +
 CrIa/src/CrIaPrSm/CrIaIaswCreate.h            |  151 +
 CrIa/src/CrIaPrSm/CrIaIaswFunc.c              |  282 +
 CrIa/src/CrIaPrSm/CrIaIaswInit.txt            |   24 +
 CrIa/src/CrIaPrSm/CrIaNomSciCreate.c          |  146 +
 CrIa/src/CrIaPrSm/CrIaNomSciCreate.h          |  279 +
 CrIa/src/CrIaPrSm/CrIaNomSciFunc.c            |  530 ++
 CrIa/src/CrIaPrSm/CrIaNomSciInit.txt          |   20 +
 CrIa/src/CrIaPrSm/CrIaPrepSciCreate.c         |   75 +
 CrIa/src/CrIaPrSm/CrIaPrepSciCreate.h         |  127 +
 CrIa/src/CrIaPrSm/CrIaPrepSciFunc.c           |  208 +
 CrIa/src/CrIaPrSm/CrIaPrepSciInit.txt         |   20 +
 CrIa/src/CrIaPrSm/CrIaPrgAct6s2Create.c       |   59 +
 CrIa/src/CrIaPrSm/CrIaPrgAct6s2Create.h       |   83 +
 CrIa/src/CrIaPrSm/CrIaPrgAct6s2Func.c         |   53 +
 CrIa/src/CrIaPrSm/CrIaPrgAct6s2Init.txt       |   20 +
 CrIa/src/CrIaPrSm/CrIaSaaEvalAlgoExecCreate.c |   72 +
 CrIa/src/CrIaPrSm/CrIaSaaEvalAlgoExecCreate.h |   99 +
 CrIa/src/CrIaPrSm/CrIaSaaEvalAlgoExecFunc.c   |  140 +
 CrIa/src/CrIaPrSm/CrIaSaaEvalAlgoExecInit.txt |   20 +
 CrIa/src/CrIaPrSm/CrIaSaveImagesCreate.c      |   61 +
 CrIa/src/CrIaPrSm/CrIaSaveImagesCreate.h      |  116 +
 CrIa/src/CrIaPrSm/CrIaSaveImagesFunc.c        |  323 +
 CrIa/src/CrIaPrSm/CrIaSaveImagesInit.txt      |   20 +
 CrIa/src/CrIaPrSm/CrIaSciDataUpdCreate.c      |  118 +
 CrIa/src/CrIaPrSm/CrIaSciDataUpdCreate.h      |  119 +
 CrIa/src/CrIaPrSm/CrIaSciDataUpdFunc.c        |  794 ++
 CrIa/src/CrIaPrSm/CrIaSciDataUpdInit.txt      |   20 +
 CrIa/src/CrIaPrSm/CrIaSciWinCreate.c          |   57 +
 CrIa/src/CrIaPrSm/CrIaSciWinCreate.h          |  193 +
 CrIa/src/CrIaPrSm/CrIaSciWinFunc.c            |  375 +
 CrIa/src/CrIaPrSm/CrIaSciWinInit.txt          |   20 +
 CrIa/src/CrIaPrSm/CrIaSdbCreate.c             |   59 +
 CrIa/src/CrIaPrSm/CrIaSdbCreate.h             |  105 +
 CrIa/src/CrIaPrSm/CrIaSdbFunc.c               |  304 +
 CrIa/src/CrIaPrSm/CrIaSdbInit.txt             |   23 +
 CrIa/src/CrIaPrSm/CrIaSdsEvalAlgoExecCreate.c |   72 +
 CrIa/src/CrIaPrSm/CrIaSdsEvalAlgoExecCreate.h |   90 +
 CrIa/src/CrIaPrSm/CrIaSdsEvalAlgoExecFunc.c   |  127 +
 CrIa/src/CrIaPrSm/CrIaSdsEvalAlgoExecInit.txt |   20 +
 CrIa/src/CrIaPrSm/CrIaSduCreate.c             |   63 +
 CrIa/src/CrIaPrSm/CrIaSduCreate.h             |  135 +
 CrIa/src/CrIaPrSm/CrIaSduFunc.c               |  428 +
 CrIa/src/CrIaPrSm/CrIaSduInit.txt             |   22 +
 CrIa/src/CrIaPrSm/CrIaSemAnoEvtRPCreate.c     |   72 +
 CrIa/src/CrIaPrSm/CrIaSemAnoEvtRPCreate.h     |   86 +
 CrIa/src/CrIaPrSm/CrIaSemAnoEvtRPFunc.c       |  196 +
 CrIa/src/CrIaPrSm/CrIaSemAnoEvtRPInit.txt     |   20 +
 CrIa/src/CrIaPrSm/CrIaSemConsCheckCreate.c    |   74 +
 CrIa/src/CrIaPrSm/CrIaSemConsCheckCreate.h    |   93 +
 CrIa/src/CrIaPrSm/CrIaSemConsCheckFunc.c      |  197 +
 CrIa/src/CrIaPrSm/CrIaSemCreate.c             |  102 +
 CrIa/src/CrIaPrSm/CrIaSemCreate.h             |  381 +
 CrIa/src/CrIaPrSm/CrIaSemEvtUpdPrCreate.c     |   55 +
 CrIa/src/CrIaPrSm/CrIaSemEvtUpdPrCreate.h     |   69 +
 CrIa/src/CrIaPrSm/CrIaSemEvtUpdPrFunc.c       |   41 +
 CrIa/src/CrIaPrSm/CrIaSemEvtUpdPrInit.txt     |   20 +
 CrIa/src/CrIaPrSm/CrIaSemFunc.c               |  480 +
 CrIa/src/CrIaPrSm/CrIaSemHkUpdPrCreate.c      |   55 +
 CrIa/src/CrIaPrSm/CrIaSemHkUpdPrCreate.h      |   75 +
 CrIa/src/CrIaPrSm/CrIaSemHkUpdPrFunc.c        |   41 +
 CrIa/src/CrIaPrSm/CrIaSemHkUpdPrInit.txt      |   20 +
 CrIa/src/CrIaPrSm/CrIaSemInit.txt             |   27 +
 CrIa/src/CrIaPrSm/CrIaSemInitCreate.c         |   37 +
 CrIa/src/CrIaPrSm/CrIaSemInitCreate.h         |   64 +
 CrIa/src/CrIaPrSm/CrIaSemInitFunc.c           |  135 +
 CrIa/src/CrIaPrSm/CrIaSemInitInit.txt         |   20 +
 CrIa/src/CrIaPrSm/CrIaSemOperFunc.c           |  684 ++
 CrIa/src/CrIaPrSm/CrIaSemOperInit.txt         |   23 +
 CrIa/src/CrIaPrSm/CrIaSemShutdownCreate.c     |   39 +
 CrIa/src/CrIaPrSm/CrIaSemShutdownCreate.h     |   72 +
 CrIa/src/CrIaPrSm/CrIaSemShutdownFunc.c       |  159 +
 CrIa/src/CrIaPrSm/CrIaSemShutdownInit.txt     |   20 +
 CrIa/src/CrIaPrSm/CrIaTTC1Create.c            |   58 +
 CrIa/src/CrIaPrSm/CrIaTTC1Create.h            |   92 +
 CrIa/src/CrIaPrSm/CrIaTTC1Func.c              |  377 +
 CrIa/src/CrIaPrSm/CrIaTTC1Init.txt            |   20 +
 CrIa/src/CrIaPrSm/CrIaTTC2Create.c            |   91 +
 CrIa/src/CrIaPrSm/CrIaTTC2Create.h            |  105 +
 CrIa/src/CrIaPrSm/CrIaTTC2Func.c              |  481 +
 CrIa/src/CrIaPrSm/CrIaTTC2Init.txt            |   20 +
 .../CrIaPrSm/CrIaTransferFbfToGroundCreate.c  |   59 +
 .../CrIaPrSm/CrIaTransferFbfToGroundCreate.h  |  107 +
 .../CrIaPrSm/CrIaTransferFbfToGroundFunc.c    |  225 +
 .../CrIaPrSm/CrIaTransferFbfToGroundInit.txt  |   20 +
 CrIa/src/CrIaPrSm/codeextract.sh              |   22 +
 CrIa/src/CrIaPrSm/codeextraction.ods          |  Bin 0 -> 14709 bytes
 CrIa/src/CrIaSemEvents.c                      |   91 +
 CrIa/src/CrIaSemEvents.h                      |   64 +
 CrIa/src/EngineeringAlgorithms.c              |  875 ++
 CrIa/src/EngineeringAlgorithms.h              |   67 +
 CrIa/src/IfswConversions.c                    |  313 +
 CrIa/src/IfswConversions.h                    |   20 +
 CrIa/src/IfswDebug.c                          |  312 +
 CrIa/src/IfswDebug.h                          |   61 +
 CrIa/src/IfswMath.c                           |  317 +
 CrIa/src/IfswMath.h                           |   91 +
 CrIa/src/IfswUtilities.c                      | 1197 +++
 CrIa/src/IfswUtilities.h                      |  103 +
 CrIa/src/ScienceDataProcessing.c              |  331 +
 CrIa/src/ScienceDataProcessing.h              |   23 +
 CrIa/src/Sdp/SdpAlgorithmsImplementation.c    |    1 +
 CrIa/src/Sdp/SdpAlgorithmsImplementation.h    |    1 +
 CrIa/src/Sdp/SdpAlgorithmsImplementationLlc.c |    1 +
 CrIa/src/Sdp/SdpAlgorithmsImplementationLlc.h |    1 +
 CrIa/src/Sdp/SdpBuffers.c                     |    1 +
 CrIa/src/Sdp/SdpBuffers.h                     |    1 +
 CrIa/src/Sdp/SdpCeDefinitions.h               |    1 +
 CrIa/src/Sdp/SdpCollect.c                     |    1 +
 CrIa/src/Sdp/SdpCollect.h                     |    1 +
 CrIa/src/Sdp/SdpCompress.c                    |    1 +
 CrIa/src/Sdp/SdpCompress.h                    |    1 +
 CrIa/src/Sdp/SdpCompressionEntityStructure.h  |    1 +
 CrIa/src/Sdp/SdpNlcPhot.c                     |    1 +
 CrIa/src/Sdp/SdpNlcPhot.h                     |    1 +
 .../InCmd/CrIaServ13AbrtDwlk.c                |  154 +
 .../InCmd/CrIaServ13AbrtDwlk.h                |   39 +
 .../InCmd/CrIaServ13TrgLrgDataTsfr.c          |  149 +
 .../InCmd/CrIaServ13TrgLrgDataTsfr.h          |   39 +
 .../OutRep/CrIaServ13DwlkAbrt.c               |   35 +
 .../OutRep/CrIaServ13DwlkAbrt.h               |   24 +
 .../OutRep/CrIaServ13FstDwlk.c                |  178 +
 .../OutRep/CrIaServ13FstDwlk.h                |   48 +
 .../OutRep/CrIaServ13IntmDwlk.c               |  178 +
 .../OutRep/CrIaServ13IntmDwlk.h               |   40 +
 .../OutRep/CrIaServ13LastDwlk.c               |  180 +
 .../OutRep/CrIaServ13LastDwlk.h               |   40 +
 .../InCmd/CrIaServ17PerfConnTest.c            |   91 +
 .../InCmd/CrIaServ17PerfConnTest.h            |   31 +
 .../InCmd/CrIaServ191DisFdChk.c               |  227 +
 .../InCmd/CrIaServ191DisFdChk.h               |   39 +
 .../InCmd/CrIaServ191DisRecovProc.c           |  227 +
 .../InCmd/CrIaServ191DisRecovProc.h           |   39 +
 .../InCmd/CrIaServ191EnbFdChk.c               |  227 +
 .../InCmd/CrIaServ191EnbFdChk.h               |   39 +
 .../InCmd/CrIaServ191EnbRecovProc.c           |  227 +
 .../InCmd/CrIaServ191EnbRecovProc.h           |   39 +
 .../InCmd/CrIaServ191GlobDisFdChk.c           |   90 +
 .../InCmd/CrIaServ191GlobDisFdChk.h           |   31 +
 .../InCmd/CrIaServ191GlobDisRecovProc.c       |   90 +
 .../InCmd/CrIaServ191GlobDisRecovProc.h       |   31 +
 .../InCmd/CrIaServ191GlobEnbFdChk.c           |   90 +
 .../InCmd/CrIaServ191GlobEnbFdChk.h           |   31 +
 .../InCmd/CrIaServ191GlobEnbRecovProc.c       |   90 +
 .../InCmd/CrIaServ191GlobEnbRecovProc.h       |   31 +
 .../InCmd/CrIaServ192AbortDiag.c              |  121 +
 .../InCmd/CrIaServ192AbortDiag.h              |   31 +
 .../InCmd/CrIaServ192GoCcdFull.c              |   99 +
 .../InCmd/CrIaServ192GoCcdFull.h              |   31 +
 .../InCmd/CrIaServ192GoCcdWin.c               |   99 +
 .../InCmd/CrIaServ192GoCcdWin.h               |   31 +
 .../InCmd/CrIaServ192GoDiag.c                 |   99 +
 .../InCmd/CrIaServ192GoDiag.h                 |   31 +
 .../InCmd/CrIaServ192GoSafe.c                 |   99 +
 .../InCmd/CrIaServ192GoSafe.h                 |   31 +
 .../InCmd/CrIaServ192GoStab.c                 |  104 +
 .../InCmd/CrIaServ192GoStab.h                 |   31 +
 .../InCmd/CrIaServ192GoStby.c                 |   98 +
 .../InCmd/CrIaServ192GoStby.h                 |   31 +
 .../InCmd/CrIaServ192SwchOffSem.c             |   92 +
 .../InCmd/CrIaServ192SwchOffSem.h             |   31 +
 .../InCmd/CrIaServ192SwchOnSem.c              |   98 +
 .../InCmd/CrIaServ192SwchOnSem.h              |   31 +
 .../InCmd/CrIaServ193PrepareSci.c             |   92 +
 .../InCmd/CrIaServ193PrepareSci.h             |   31 +
 .../InCmd/CrIaServ193StartOfflineOper.c       |   96 +
 .../InCmd/CrIaServ193StartOfflineOper.h       |   31 +
 .../InCmd/CrIaServ193StartSci.c               |  108 +
 .../InCmd/CrIaServ193StartSci.h               |   31 +
 .../InCmd/CrIaServ193StopScience.c            |   92 +
 .../InCmd/CrIaServ193StopScience.h            |   31 +
 .../InCmd/CrIaServ193StopSem.c                |   92 +
 .../InCmd/CrIaServ193StopSem.h                |   31 +
 .../InCmd/CrIaServ193SwitchOffIasw.c          |   87 +
 .../InCmd/CrIaServ193SwitchOffIasw.h          |   31 +
 .../InCmd/CrIaServ194ResAlgo.c                |  130 +
 .../InCmd/CrIaServ194ResAlgo.h                |   39 +
 .../InCmd/CrIaServ194StartAlgo.c              |  163 +
 .../InCmd/CrIaServ194StartAlgo.h              |   39 +
 .../InCmd/CrIaServ194StopAlgo.c               |  130 +
 .../InCmd/CrIaServ194StopAlgo.h               |   39 +
 .../InCmd/CrIaServ194SusAlgo.c                |  130 +
 .../InCmd/CrIaServ194SusAlgo.h                |   39 +
 .../OutRep/CrIaServ195HbRep.c                 |   83 +
 .../OutRep/CrIaServ195HbRep.h                 |   32 +
 .../InCmd/CrIaServ196StarMapCmd.c             |  289 +
 .../InCmd/CrIaServ196StarMapCmd.h             |   39 +
 .../OutRep/CrIaServ196AocsRep.c               |  179 +
 .../OutRep/CrIaServ196AocsRep.h               |   40 +
 .../InCmd/CrIaServ197RepBoot.c                |  351 +
 .../InCmd/CrIaServ197RepBoot.h                |   39 +
 .../OutRep/CrIaServ197BootRep.c               |   31 +
 .../OutRep/CrIaServ197BootRep.h               |   24 +
 .../InCmd/CrIaServ198ProcStart.c              | 1203 +++
 .../InCmd/CrIaServ198ProcStart.h              |   50 +
 .../InCmd/CrIaServ198ProcStop.c               |  146 +
 .../InCmd/CrIaServ198ProcStop.h               |   39 +
 .../OutRep/CrIaServ1AccFail.c                 |   32 +
 .../OutRep/CrIaServ1AccFail.h                 |   24 +
 .../OutRep/CrIaServ1AccSucc.c                 |   32 +
 .../OutRep/CrIaServ1AccSucc.h                 |   24 +
 .../OutRep/CrIaServ1StartFail.c               |   32 +
 .../OutRep/CrIaServ1StartFail.h               |   24 +
 .../OutRep/CrIaServ1StartSucc.c               |   32 +
 .../OutRep/CrIaServ1StartSucc.h               |   24 +
 .../OutRep/CrIaServ1TermFail.c                |   32 +
 .../OutRep/CrIaServ1TermFail.h                |   24 +
 .../OutRep/CrIaServ1TermSucc.c                |   32 +
 .../OutRep/CrIaServ1TermSucc.h                |   24 +
 .../InCmd/CrIaServ210DisWdog.c                |  101 +
 .../InCmd/CrIaServ210DisWdog.h                |   31 +
 .../InCmd/CrIaServ210EnbWdog.c                |  101 +
 .../InCmd/CrIaServ210EnbWdog.h                |   31 +
 .../InCmd/CrIaServ210ResetDpu.c               |   91 +
 .../InCmd/CrIaServ210ResetDpu.h               |   31 +
 .../InCmd/CrIaServ211UpdatePar.c              |  263 +
 .../InCmd/CrIaServ211UpdatePar.h              |   39 +
 .../InCmd/CrIaServ3ClrHkDr.c                  |  152 +
 .../InCmd/CrIaServ3ClrHkDr.h                  |   39 +
 .../InCmd/CrIaServ3DefineHkDr.c               |  347 +
 .../InCmd/CrIaServ3DefineHkDr.h               |   39 +
 .../InCmd/CrIaServ3DisHkDrGen.c               |  148 +
 .../InCmd/CrIaServ3DisHkDrGen.h               |   39 +
 .../InCmd/CrIaServ3EnbHkDrGen.c               |  153 +
 .../InCmd/CrIaServ3EnbHkDrGen.h               |   39 +
 .../InCmd/CrIaServ3SetHkRepFreq.c             |  160 +
 .../InCmd/CrIaServ3SetHkRepFreq.h             |   39 +
 .../OutRep/CrIaServ3HkDr.c                    |  263 +
 .../OutRep/CrIaServ3HkDr.h                    |   40 +
 .../InCmd/CrIaServ5DisEvtRepGen.c             |  149 +
 .../InCmd/CrIaServ5DisEvtRepGen.h             |   39 +
 .../InCmd/CrIaServ5EnbEvtRepGen.c             |  149 +
 .../InCmd/CrIaServ5EnbEvtRepGen.h             |   39 +
 .../OutRep/CrIaServ5Event.c                   |  236 +
 .../OutRep/CrIaServ5Event.h                   |   51 +
 .../InCmd/CrIaServ6DumpMem.c                  |  185 +
 .../InCmd/CrIaServ6DumpMem.h                  |   39 +
 .../InCmd/CrIaServ6LoadMem.c                  |  219 +
 .../InCmd/CrIaServ6LoadMem.h                  |   39 +
 .../OutRep/CrIaServ6MemDump.c                 |   91 +
 .../OutRep/CrIaServ6MemDump.h                 |   24 +
 .../InRep/CrSemServ1ComVerif.c                |  137 +
 .../InRep/CrSemServ1ComVerif.h                |   32 +
 .../InRep/CrSemServ21DatCcdWindow.c           |   62 +
 .../InRep/CrSemServ21DatCcdWindow.h           |   34 +
 .../OutCmd/CrSemServ21CmdCcdDataDisable.c     |   25 +
 .../OutCmd/CrSemServ21CmdCcdDataDisable.h     |   24 +
 .../OutCmd/CrSemServ21CmdCcdDataEnable.c      |   20 +
 .../OutCmd/CrSemServ21CmdCcdDataEnable.h      |   24 +
 .../InRep/CrSemServ220DatFunctParam.c         |   63 +
 .../InRep/CrSemServ220DatFunctParam.h         |   24 +
 .../InRep/CrSemServ220DatOperParam.c          |   63 +
 .../InRep/CrSemServ220DatOperParam.h          |   24 +
 .../OutCmd/CrSemServ220CmdFunctParam.c        |   79 +
 .../OutCmd/CrSemServ220CmdFunctParam.h        |   24 +
 .../OutCmd/CrSemServ220CmdOperParam.c         |   73 +
 .../OutCmd/CrSemServ220CmdOperParam.h         |   24 +
 .../OutCmd/CrSemServ220CmdTempCtrlEnable.c    |   36 +
 .../OutCmd/CrSemServ220CmdTempCtrlEnable.h    |   24 +
 .../OutCmd/CrSemServ221FpmPowerDis.c          |   26 +
 .../OutCmd/CrSemServ221FpmPowerDis.h          |   23 +
 .../OutCmd/CrSemServ221FpmPowerEnb.c          |   26 +
 .../OutCmd/CrSemServ221FpmPowerEnb.h          |   23 +
 .../InRep/CrSemServ222DatTestLog.c            |   63 +
 .../InRep/CrSemServ222DatTestLog.h            |   24 +
 .../OutCmd/CrSemServ222DiagEnable.c           |   67 +
 .../OutCmd/CrSemServ222DiagEnable.h           |   23 +
 .../InRep/CrSemServ3DatHk.c                   | 1184 +++
 .../InRep/CrSemServ3DatHk.h                   |   38 +
 .../InRep/CrSemServ5EvtErrHighSev.c           |  103 +
 .../InRep/CrSemServ5EvtErrHighSev.h           |   32 +
 .../InRep/CrSemServ5EvtErrLowSev.c            |  103 +
 .../InRep/CrSemServ5EvtErrLowSev.h            |   32 +
 .../InRep/CrSemServ5EvtErrMedSev.c            |  103 +
 .../InRep/CrSemServ5EvtErrMedSev.h            |   32 +
 .../InRep/CrSemServ5EvtNorm.c                 |  228 +
 .../InRep/CrSemServ5EvtNorm.h                 |   32 +
 .../OutCmd/CrSemServ9CmdTimeUpdate.c          |   97 +
 .../OutCmd/CrSemServ9CmdTimeUpdate.h          |   48 +
 CrIa/src/Services/General/CrIaConstants.h     | 1581 ++++
 CrIa/src/Services/General/CrIaParamGetter.c   |  897 ++
 CrIa/src/Services/General/CrIaParamGetter.h   |  948 ++
 CrIa/src/Services/General/CrIaParamSetter.c   | 1888 ++++
 CrIa/src/Services/General/CrIaParamSetter.h   | 1093 +++
 CrIa/src/Services/General/CrSemConstants.h    |  739 ++
 CrIa/src/Services/General/CrSemParamGetter.c  |  930 ++
 CrIa/src/Services/General/CrSemParamGetter.h  |  983 ++
 CrIa/src/Services/General/CrSemParamSetter.c  |  344 +
 CrIa/src/Services/General/CrSemParamSetter.h  |  233 +
 CrIa/src/Ta/AngleMethod.c                     |    1 +
 CrIa/src/Ta/AngleMethod.h                     |    1 +
 CrIa/src/Ta/StarExtractor.c                   |    1 +
 CrIa/src/Ta/StarExtractor.h                   |    1 +
 CrIa/src/Ta/StarPosDistortCorr.c              |    1 +
 CrIa/src/Ta/StarPosDistortCorr.h              |    1 +
 CrIa/src/Ta/TaDatatypes.h                     |    1 +
 CrIa/src/Ta/TargetAcquisition.c               |    1 +
 CrIa/src/Ta/TargetAcquisition.h               |    1 +
 CrIa/src/byteorder.h                          |  273 +
 FwProfile/.tup/db                             |  Bin 0 -> 37888 bytes
 FwProfile/.tup/object                         |    0
 FwProfile/.tup/shared                         |    0
 FwProfile/.tup/tri                            |    0
 FwProfile/Makefile                            |   28 +
 FwProfile/Makefile-dpu.mk                     |   35 +
 FwProfile/Makefile-pc.mk                      |   35 +
 FwProfile/src/FwPrConfig.c                    |  475 +
 FwProfile/src/FwPrConfig.h                    |  459 +
 FwProfile/src/FwPrConstants.h                 |  227 +
 FwProfile/src/FwPrCore.c                      |  154 +
 FwProfile/src/FwPrCore.h                      |  163 +
 FwProfile/src/FwPrDCreate.c                   |  228 +
 FwProfile/src/FwPrDCreate.h                   |  196 +
 FwProfile/src/FwPrPrivate.h                   |  290 +
 FwProfile/src/FwPrSCreate.c                   |  102 +
 FwProfile/src/FwPrSCreate.h                   |  278 +
 FwProfile/src/FwRtConfig.c                    |  278 +
 FwProfile/src/FwRtConfig.h                    |  414 +
 FwProfile/src/FwRtConstants.h                 |  274 +
 FwProfile/src/FwRtCore.c                      |  290 +
 FwProfile/src/FwRtCore.h                      |  220 +
 FwProfile/src/FwSmAux.c                       |  352 +
 FwProfile/src/FwSmAux.h                       |   99 +
 FwProfile/src/FwSmConfig.c                    |  529 ++
 FwProfile/src/FwSmConfig.h                    |  546 ++
 FwProfile/src/FwSmConstants.h                 |  245 +
 FwProfile/src/FwSmCore.c                      |  271 +
 FwProfile/src/FwSmCore.h                      |  226 +
 FwProfile/src/FwSmDCreate.c                   |  264 +
 FwProfile/src/FwSmDCreate.h                   |  235 +
 FwProfile/src/FwSmPrivate.h                   |  341 +
 FwProfile/src/FwSmSCreate.c                   |  110 +
 FwProfile/src/FwSmSCreate.h                   |  333 +
 IBSW/.gitignore                               |    6 +
 IBSW/doc/Doxyfile                             | 2482 +++++
 IBSW/doc/DoxygenLayout.xml                    |  194 +
 IBSW/doc/Makefile                             |   16 +
 IBSW/doc/README                               |    5 +
 IBSW/doc/bootstrap.min.css                    |    6 +
 IBSW/doc/bootstrap.min.js                     |    7 +
 IBSW/doc/customdoxygen.css                    |  306 +
 IBSW/doc/doxy-boot.js                         |  121 +
 IBSW/doc/extradoc/mainpage.dox                |   58 +
 IBSW/doc/footer.html                          |   26 +
 IBSW/doc/header.html                          |   47 +
 .../images/cheops-logo-with-additional3.png   |  Bin 0 -> 11478 bytes
 .../core1553brm_as250/irq_handler.graphml     | 1669 ++++
 .../images/core1553brm_as250/irq_handler.png  |  Bin 0 -> 202249 bytes
 .../split_packetstreams.graphml               | 1221 +++
 ...t_packetstreams_direct_buffer_drop.graphml | 1034 +++
 ...split_packetstreams_direct_buffer_drop.png |  Bin 0 -> 73326 bytes
 .../images/cpus_buffer/cpus_get_free.graphml  |  559 ++
 IBSW/doc/images/cpus_buffer/cpus_get_free.png |  Bin 0 -> 26832 bytes
 .../cpus_buffer/sliding_window_buffer.graphml |  880 ++
 .../cpus_buffer/sliding_window_buffer.png     |  Bin 0 -> 38421 bytes
 .../ibsw_interface/GetLinkCapacity.graphml    |  592 ++
 .../images/ibsw_interface/GetLinkCapacity.png |  Bin 0 -> 51228 bytes
 IBSW/doc/images/ibsw_logical_model.graphml    |  951 ++
 IBSW/doc/images/ibsw_logical_model.png        |  Bin 0 -> 141016 bytes
 .../images/irq_dispatch/irq_dispatch.graphml  | 2138 +++++
 IBSW/doc/images/irq_dispatch/irq_dispatch.png |  Bin 0 -> 155336 bytes
 .../packet_tracker/CrIbGndPcktCollect.graphml |  601 ++
 .../packet_tracker/CrIbGndPcktCollect.png     |  Bin 0 -> 33514 bytes
 .../packet_tracker/CrIbIsGrdPcktAvail.graphml |  480 +
 .../packet_tracker/CrIbIsGrdPcktAvail.png     |  Bin 0 -> 20478 bytes
 .../packet_tracker/CrIbIsObcPcktAvail.graphml |  480 +
 .../packet_tracker/CrIbIsObcPcktAvail.png     |  Bin 0 -> 20527 bytes
 .../CrIbMilBusPckHandover_1kbuf.graphml       |  745 ++
 .../CrIbMilBusPcktHandover.graphml            |  914 ++
 .../packet_tracker/CrIbMilBusPcktHandover.png |  Bin 0 -> 115460 bytes
 .../packet_tracker/CrIbObcPcktCollect.graphml |  601 ++
 .../packet_tracker/CrIbObcPcktCollect.png     |  Bin 0 -> 33508 bytes
 IBSW/include/ahb.h                            |   40 +
 IBSW/include/asm/leon.h                       |  208 +
 IBSW/include/byteorder.h                      |  273 +
 IBSW/include/circular_buffer16.h              |   45 +
 IBSW/include/circular_buffer8.h               |   45 +
 IBSW/include/clkgate.h                        |   50 +
 IBSW/include/compiler.h                       |   46 +
 IBSW/include/core1553brm_as250.h              |  766 ++
 IBSW/include/cpus_buffers.h                   |   73 +
 IBSW/include/edac.h                           |   34 +
 IBSW/include/error_log.h                      |   83 +
 IBSW/include/errors.h                         |  377 +
 IBSW/include/event_report.h                   |   65 +
 IBSW/include/exchange_area.h                  |   79 +
 IBSW/include/grspw2.h                         |  567 ++
 IBSW/include/ibsw.h                           |   73 +
 IBSW/include/ibsw_interface.h                 |  213 +
 IBSW/include/io.h                             |  141 +
 IBSW/include/iwf_flash.h                      |  128 +
 IBSW/include/iwf_fpga.h                       |  351 +
 IBSW/include/leon/irq.h                       |  110 +
 IBSW/include/leon/irq_dispatch.h              |   40 +
 IBSW/include/leon/leon_reg.h                  |  172 +
 IBSW/include/leon3_dsu.h                      |  263 +
 IBSW/include/leon3_gptimer.h                  |   70 +
 IBSW/include/leon3_grtimer.h                  |   73 +
 IBSW/include/leon3_grtimer_longcount.h        |   51 +
 IBSW/include/leon3_timers.h                   |   35 +
 IBSW/include/list.h                           |  349 +
 IBSW/include/memcfg.h                         |  108 +
 IBSW/include/memscrub.h                       |   31 +
 IBSW/include/packet_tracker.h                 |   92 +
 IBSW/include/spinlock.h                       |  257 +
 IBSW/include/stacktrace.h                     |  160 +
 IBSW/include/syncpulse.h                      |   42 +
 IBSW/include/sysctl.h                         |   84 +
 IBSW/include/timing.h                         |  134 +
 IBSW/include/traps.h                          |   36 +
 IBSW/include/watchdog.h                       |   29 +
 IBSW/include/wrap_malloc.h                    |  105 +
 IBSW/lib/ahb.c                                |  142 +
 IBSW/lib/asm/data_access_exception_trap.S     |   75 +
 IBSW/lib/asm/floating_point_exception_trap.S  |   70 +
 IBSW/lib/asm/reset_trap.S                     |   75 +
 IBSW/lib/asm/trace_trap.S                     |   33 +
 IBSW/lib/circular_buffer16.c                  |  286 +
 IBSW/lib/circular_buffer8.c                   |  286 +
 IBSW/lib/core1553brm_as250.c                  | 2255 +++++
 IBSW/lib/cpus_buffer.c                        |  603 ++
 IBSW/lib/edac.c                               |  410 +
 IBSW/lib/error_log.c                          |  243 +
 IBSW/lib/event_report.c                       |  276 +
 IBSW/lib/fpe.c                                |  447 +
 IBSW/lib/grspw2.c                             | 1787 ++++
 IBSW/lib/ibsw_init/ibsw_init.c                |  158 +
 IBSW/lib/ibsw_init/ibsw_mainloop.c            |  287 +
 IBSW/lib/ibsw_init/init_1553.c                |  182 +
 IBSW/lib/ibsw_init/init_cpu_0_idle_timing.c   |   94 +
 IBSW/lib/ibsw_init/init_cpus.c                |   74 +
 IBSW/lib/ibsw_init/init_edac.c                |   75 +
 IBSW/lib/ibsw_init/init_error_log.c           |   47 +
 IBSW/lib/ibsw_init/init_ptrack.c              |   76 +
 IBSW/lib/ibsw_init/init_spw.c                 |  186 +
 IBSW/lib/ibsw_init/init_sync_timing.c         |  116 +
 IBSW/lib/ibsw_interface/ibsw_1553.c           |  247 +
 .../lib/ibsw_interface/ibsw_datapool_update.c |  458 +
 IBSW/lib/ibsw_interface/ibsw_error_log.c      |  547 ++
 IBSW/lib/ibsw_interface/ibsw_execute_op.c     |  287 +
 IBSW/lib/ibsw_interface/ibsw_fbf.c            |  537 ++
 IBSW/lib/ibsw_interface/ibsw_interface.c      |   47 +
 IBSW/lib/ibsw_interface/ibsw_memscrub.c       |  157 +
 IBSW/lib/ibsw_interface/ibsw_spw.c            |  393 +
 IBSW/lib/ibsw_interface/ibsw_time.c           |  132 +
 IBSW/lib/ibsw_interface/ibsw_utility.c        |  352 +
 IBSW/lib/ibsw_interface/ibsw_watchdog.c       |  102 +
 IBSW/lib/irq_dispatch.c                       |  737 ++
 IBSW/lib/iwf_flash.c                          | 1086 +++
 IBSW/lib/iwf_fpga.c                           |  871 ++
 IBSW/lib/leon3_dsu.c                          |  832 ++
 IBSW/lib/memcfg.c                             |  653 ++
 IBSW/lib/memscrub.c                           |  282 +
 IBSW/lib/packet_tracker.c                     |  370 +
 IBSW/lib/reset.c                              |   35 +
 IBSW/lib/stacktrace.c                         |   84 +
 IBSW/lib/sysctl.c                             |  779 ++
 IBSW/lib/timing/leon3_gptimer.c               |  363 +
 IBSW/lib/timing/leon3_grtimer.c               |  390 +
 IBSW/lib/timing/leon3_grtimer_longcount.c     |  203 +
 IBSW/lib/timing/syncpulse.c                   |  248 +
 IBSW/lib/timing/timing.c                      |  358 +
 IBSW/lib/timing/watchdog.c                    |   88 +
 IBSW/lib/traps.c                              |  120 +
 IBSW/lib/wrap_malloc.c                        |  289 +
 README.md                                     |   25 +-
 TargetAcquisition/src/AngleMethod.c           | 3020 +++++++
 TargetAcquisition/src/AngleMethod.h           |   82 +
 TargetAcquisition/src/CrIaDataPool.c          |    1 +
 TargetAcquisition/src/CrIaDataPool.h          |    1 +
 TargetAcquisition/src/CrIaDataPoolId.h        |    1 +
 TargetAcquisition/src/IfswConversions.c       |    1 +
 TargetAcquisition/src/IfswConversions.h       |    1 +
 TargetAcquisition/src/StarExtractor.c         |  822 ++
 TargetAcquisition/src/StarExtractor.h         |   40 +
 TargetAcquisition/src/StarPosDistortCorr.c    |  145 +
 TargetAcquisition/src/StarPosDistortCorr.h    |   16 +
 TargetAcquisition/src/TaDatatypes.h           |  441 +
 TargetAcquisition/src/TargetAcquisition.c     |  575 ++
 TargetAcquisition/src/TargetAcquisition.h     |   41 +
 include/CrFramework                           |    1 +
 include/FwProfile                             |    1 +
 657 files changed, 142403 insertions(+), 1 deletion(-)
 create mode 120000 CompressionEntity/src/IfswConversions.c
 create mode 120000 CompressionEntity/src/IfswConversions.h
 create mode 120000 CompressionEntity/src/IfswMath.c
 create mode 120000 CompressionEntity/src/IfswMath.h
 create mode 100644 CompressionEntity/src/SdpAlgorithmsImplementation.c
 create mode 100644 CompressionEntity/src/SdpAlgorithmsImplementation.h
 create mode 100644 CompressionEntity/src/SdpAlgorithmsImplementationLlc.c
 create mode 100644 CompressionEntity/src/SdpAlgorithmsImplementationLlc.h
 create mode 100644 CompressionEntity/src/SdpBuffers.c
 create mode 100644 CompressionEntity/src/SdpBuffers.h
 create mode 100644 CompressionEntity/src/SdpCeDefinitions.h
 create mode 100644 CompressionEntity/src/SdpCollect.c
 create mode 100644 CompressionEntity/src/SdpCollect.h
 create mode 100644 CompressionEntity/src/SdpCompress.c
 create mode 100644 CompressionEntity/src/SdpCompress.h
 create mode 100644 CompressionEntity/src/SdpCompressionEntityStructure.h
 create mode 100644 CompressionEntity/src/SdpNlcPhot.c
 create mode 100644 CompressionEntity/src/SdpNlcPhot.h
 create mode 100644 CrFramework/CHANGELOG
 create mode 100644 CrFramework/README
 create mode 100644 CrFramework/src/AppStartUp/CrFwAppResetProc.h
 create mode 100644 CrFramework/src/AppStartUp/CrFwAppShutdownProc.h
 create mode 100644 CrFramework/src/AppStartUp/CrFwAppSm.c
 create mode 100644 CrFramework/src/AppStartUp/CrFwAppSm.h
 create mode 100644 CrFramework/src/AppStartUp/CrFwAppStartUpProc.h
 create mode 100644 CrFramework/src/Aux/CrFwAux.c
 create mode 100644 CrFramework/src/Aux/CrFwAux.h
 create mode 100644 CrFramework/src/BaseCmp/CrFwBaseCmp.c
 create mode 100644 CrFramework/src/BaseCmp/CrFwBaseCmp.h
 create mode 100644 CrFramework/src/BaseCmp/CrFwDummyExecProc.c
 create mode 100644 CrFramework/src/BaseCmp/CrFwDummyExecProc.h
 create mode 100644 CrFramework/src/BaseCmp/CrFwInitProc.c
 create mode 100644 CrFramework/src/BaseCmp/CrFwInitProc.h
 create mode 100644 CrFramework/src/BaseCmp/CrFwResetProc.c
 create mode 100644 CrFramework/src/BaseCmp/CrFwResetProc.h
 create mode 100644 CrFramework/src/CrFwConstants.h
 create mode 100644 CrFramework/src/CrFwRepErr.h
 create mode 100644 CrFramework/src/CrFwRepInCmdOutcome.h
 create mode 100644 CrFramework/src/CrFwTime.h
 create mode 100644 CrFramework/src/InCmd/CrFwInCmd.c
 create mode 100644 CrFramework/src/InCmd/CrFwInCmd.h
 create mode 100644 CrFramework/src/InFactory/CrFwInFactory.c
 create mode 100644 CrFramework/src/InFactory/CrFwInFactory.h
 create mode 100644 CrFramework/src/InLoader/CrFwInLoader.c
 create mode 100644 CrFramework/src/InLoader/CrFwInLoader.h
 create mode 100644 CrFramework/src/InManager/CrFwInManager.c
 create mode 100644 CrFramework/src/InManager/CrFwInManager.h
 create mode 100644 CrFramework/src/InRegistry/CrFwInRegistry.c
 create mode 100644 CrFramework/src/InRegistry/CrFwInRegistry.h
 create mode 100644 CrFramework/src/InRep/CrFwInRep.c
 create mode 100644 CrFramework/src/InRep/CrFwInRep.h
 create mode 100644 CrFramework/src/InRep/CrFwInRepExecProc.c
 create mode 100644 CrFramework/src/InRep/CrFwInRepExecProc.h
 create mode 100644 CrFramework/src/InStream/CrFwInStream.c
 create mode 100644 CrFramework/src/InStream/CrFwInStream.h
 create mode 100644 CrFramework/src/OutCmp/CrFwOutCmp.c
 create mode 100644 CrFramework/src/OutCmp/CrFwOutCmp.h
 create mode 100644 CrFramework/src/OutFactory/CrFwOutFactory.c
 create mode 100644 CrFramework/src/OutFactory/CrFwOutFactory.h
 create mode 100644 CrFramework/src/OutLoader/CrFwOutLoader.c
 create mode 100644 CrFramework/src/OutLoader/CrFwOutLoader.h
 create mode 100644 CrFramework/src/OutManager/CrFwOutManager.c
 create mode 100644 CrFramework/src/OutManager/CrFwOutManager.h
 create mode 100644 CrFramework/src/OutRegistry/CrFwOutRegistry.c
 create mode 100644 CrFramework/src/OutRegistry/CrFwOutRegistry.h
 create mode 100644 CrFramework/src/OutStream/CrFwOutStream.c
 create mode 100644 CrFramework/src/OutStream/CrFwOutStream.h
 create mode 100644 CrFramework/src/Pckt/CrFwPckt.h
 create mode 100644 CrFramework/src/Pckt/CrFwPcktQueue.c
 create mode 100644 CrFramework/src/Pckt/CrFwPcktQueue.h
 create mode 100644 CrFramework/src/UtilityFunctions/CrFwUtilityFunctions.c
 create mode 100644 CrFramework/src/UtilityFunctions/CrFwUtilityFunctions.h
 create mode 100644 CrIa/Makefile
 create mode 100644 CrIa/Makefile-dpu.mk
 create mode 100644 CrIa/Makefile-eval.mk
 create mode 100644 CrIa/Makefile-pc.mk
 create mode 100644 CrIa/doc/Doxyfile
 create mode 100644 CrIa/doc/DoxygenLayout.xml
 create mode 100644 CrIa/doc/Makefile
 create mode 100644 CrIa/doc/bootstrap.min.css
 create mode 100644 CrIa/doc/bootstrap.min.js
 create mode 100644 CrIa/doc/customdoxygen.css
 create mode 100644 CrIa/doc/doxy-boot.js
 create mode 100644 CrIa/doc/extradoc/mainpage.dox
 create mode 100644 CrIa/doc/footer.html
 create mode 100644 CrIa/doc/header.html
 create mode 100644 CrIa/doc/images/Interlopers_1.png
 create mode 100644 CrIa/doc/images/Interlopers_2.png
 create mode 100644 CrIa/doc/images/cheops-logo-with-additional3.png
 create mode 100644 CrIa/doc/images/fingerprint.png
 create mode 100644 CrIa/doc/images/obsDB_fingerprint.png
 create mode 100644 CrIa/doc/images/radius_photometry_real_psf_shape.png
 create mode 100644 CrIa/doc/images/radius_photometry_real_psf_signal.png
 create mode 100644 CrIa/doc/images/radius_photometry_sim_psf.png
 create mode 100644 CrIa/doc/images/star_extraction_process.png
 create mode 100644 CrIa/ifsw.c
 create mode 100644 CrIa/ifsw.h
 create mode 100644 CrIa/src/CrConfigIa/CrFwAppSmUserPar.h
 create mode 100644 CrIa/src/CrConfigIa/CrFwCmpData.h
 create mode 100644 CrIa/src/CrConfigIa/CrFwInFactoryUserPar.h
 create mode 100644 CrIa/src/CrConfigIa/CrFwInLoaderUserPar.h
 create mode 100644 CrIa/src/CrConfigIa/CrFwInManagerUserPar.h
 create mode 100644 CrIa/src/CrConfigIa/CrFwInRegistryUserPar.h
 create mode 100644 CrIa/src/CrConfigIa/CrFwInStreamUserPar.h
 create mode 100644 CrIa/src/CrConfigIa/CrFwOutFactoryUserPar.h
 create mode 100644 CrIa/src/CrConfigIa/CrFwOutLoaderUserPar.h
 create mode 100644 CrIa/src/CrConfigIa/CrFwOutManagerUserPar.h
 create mode 100644 CrIa/src/CrConfigIa/CrFwOutRegistryUserPar.h
 create mode 100644 CrIa/src/CrConfigIa/CrFwOutStreamUserPar.h
 create mode 100644 CrIa/src/CrConfigIa/CrFwUserConstants.h
 create mode 100755 CrIa/src/CrConfigIa/genOutReg.sh
 create mode 100644 CrIa/src/CrFwRepErr.c
 create mode 100644 CrIa/src/CrFwRepInCmdOutcome.c
 create mode 100644 CrIa/src/CrIaDataPool.c
 create mode 100644 CrIa/src/CrIaDataPool.h
 create mode 100644 CrIa/src/CrIaDataPoolId.h
 create mode 100644 CrIa/src/CrIaIasw.c
 create mode 100644 CrIa/src/CrIaIasw.h
 create mode 100644 CrIa/src/CrIaInCmp.c
 create mode 100644 CrIa/src/CrIaInCmp.h
 create mode 100644 CrIa/src/CrIaInLoader.c
 create mode 100644 CrIa/src/CrIaInLoader.h
 create mode 100644 CrIa/src/CrIaMain.c
 create mode 100644 CrIa/src/CrIaOutCmp.c
 create mode 100644 CrIa/src/CrIaOutCmp.h
 create mode 100644 CrIa/src/CrIaOutLoader.c
 create mode 100644 CrIa/src/CrIaOutLoader.h
 create mode 100644 CrIa/src/CrIaPckt.c
 create mode 100644 CrIa/src/CrIaPckt.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaAcqFullDropCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaAcqFullDropCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaAcqFullDropFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaAcqFullDropInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaAcquAlgoExecCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaAcquAlgoExecCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaAcquAlgoExecFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaAlgoCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaAlgoCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaAlgoFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaAlgoInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaCalFullSnapCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaCalFullSnapCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaCalFullSnapFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaCalFullSnapInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaCentAlgoCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaCentAlgoCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaCentAlgoFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaCentAlgoInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaCentValProcCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaCentValProcCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaCentValProcFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaCentValProcInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaCmprAlgoExecCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaCmprAlgoExecCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaCmprAlgoExecFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaCmprAlgoExecInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaCtrldSwitchOffCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaCtrldSwitchOffCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaCtrldSwitchOffFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaCtrldSwitchOffInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaFbfLoadCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaFbfLoadCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaFbfLoadFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaFbfLoadInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaFbfSaveCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaFbfSaveCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaFbfSaveFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaFbfSaveInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaFdCheckCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaFdCheckCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaFdCheckFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaFdCheckInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaHbSemMonCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaHbSemMonCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaHbSemMonFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaIaswCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaIaswCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaIaswFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaIaswInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaNomSciCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaNomSciCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaNomSciFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaNomSciInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaPrepSciCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaPrepSciCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaPrepSciFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaPrepSciInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaPrgAct6s2Create.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaPrgAct6s2Create.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaPrgAct6s2Func.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaPrgAct6s2Init.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSaaEvalAlgoExecCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSaaEvalAlgoExecCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSaaEvalAlgoExecFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSaaEvalAlgoExecInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSaveImagesCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSaveImagesCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSaveImagesFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSaveImagesInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSciDataUpdCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSciDataUpdCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSciDataUpdFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSciDataUpdInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSciWinCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSciWinCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSciWinFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSciWinInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSdbCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSdbCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSdbFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSdbInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSdsEvalAlgoExecCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSdsEvalAlgoExecCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSdsEvalAlgoExecFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSdsEvalAlgoExecInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSduCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSduCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSduFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSduInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemAnoEvtRPCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemAnoEvtRPCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemAnoEvtRPFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemAnoEvtRPInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemConsCheckCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemConsCheckCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemConsCheckFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemEvtUpdPrCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemEvtUpdPrCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemEvtUpdPrFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemEvtUpdPrInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemHkUpdPrCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemHkUpdPrCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemHkUpdPrFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemHkUpdPrInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemInitCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemInitCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemInitFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemInitInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemOperFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemOperInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemShutdownCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemShutdownCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemShutdownFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaSemShutdownInit.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaTTC1Create.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaTTC1Create.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaTTC1Func.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaTTC1Init.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaTTC2Create.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaTTC2Create.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaTTC2Func.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaTTC2Init.txt
 create mode 100644 CrIa/src/CrIaPrSm/CrIaTransferFbfToGroundCreate.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaTransferFbfToGroundCreate.h
 create mode 100644 CrIa/src/CrIaPrSm/CrIaTransferFbfToGroundFunc.c
 create mode 100644 CrIa/src/CrIaPrSm/CrIaTransferFbfToGroundInit.txt
 create mode 100755 CrIa/src/CrIaPrSm/codeextract.sh
 create mode 100644 CrIa/src/CrIaPrSm/codeextraction.ods
 create mode 100644 CrIa/src/CrIaSemEvents.c
 create mode 100644 CrIa/src/CrIaSemEvents.h
 create mode 100644 CrIa/src/EngineeringAlgorithms.c
 create mode 100644 CrIa/src/EngineeringAlgorithms.h
 create mode 100644 CrIa/src/IfswConversions.c
 create mode 100644 CrIa/src/IfswConversions.h
 create mode 100644 CrIa/src/IfswDebug.c
 create mode 100644 CrIa/src/IfswDebug.h
 create mode 100644 CrIa/src/IfswMath.c
 create mode 100644 CrIa/src/IfswMath.h
 create mode 100644 CrIa/src/IfswUtilities.c
 create mode 100644 CrIa/src/IfswUtilities.h
 create mode 100644 CrIa/src/ScienceDataProcessing.c
 create mode 100644 CrIa/src/ScienceDataProcessing.h
 create mode 120000 CrIa/src/Sdp/SdpAlgorithmsImplementation.c
 create mode 120000 CrIa/src/Sdp/SdpAlgorithmsImplementation.h
 create mode 120000 CrIa/src/Sdp/SdpAlgorithmsImplementationLlc.c
 create mode 120000 CrIa/src/Sdp/SdpAlgorithmsImplementationLlc.h
 create mode 120000 CrIa/src/Sdp/SdpBuffers.c
 create mode 120000 CrIa/src/Sdp/SdpBuffers.h
 create mode 120000 CrIa/src/Sdp/SdpCeDefinitions.h
 create mode 120000 CrIa/src/Sdp/SdpCollect.c
 create mode 120000 CrIa/src/Sdp/SdpCollect.h
 create mode 120000 CrIa/src/Sdp/SdpCompress.c
 create mode 120000 CrIa/src/Sdp/SdpCompress.h
 create mode 120000 CrIa/src/Sdp/SdpCompressionEntityStructure.h
 create mode 120000 CrIa/src/Sdp/SdpNlcPhot.c
 create mode 120000 CrIa/src/Sdp/SdpNlcPhot.h
 create mode 100644 CrIa/src/Services/CrIaServ13LargeDataTransferService/InCmd/CrIaServ13AbrtDwlk.c
 create mode 100644 CrIa/src/Services/CrIaServ13LargeDataTransferService/InCmd/CrIaServ13AbrtDwlk.h
 create mode 100644 CrIa/src/Services/CrIaServ13LargeDataTransferService/InCmd/CrIaServ13TrgLrgDataTsfr.c
 create mode 100644 CrIa/src/Services/CrIaServ13LargeDataTransferService/InCmd/CrIaServ13TrgLrgDataTsfr.h
 create mode 100644 CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13DwlkAbrt.c
 create mode 100644 CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13DwlkAbrt.h
 create mode 100644 CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13FstDwlk.c
 create mode 100644 CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13FstDwlk.h
 create mode 100644 CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13IntmDwlk.c
 create mode 100644 CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13IntmDwlk.h
 create mode 100644 CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13LastDwlk.c
 create mode 100644 CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13LastDwlk.h
 create mode 100644 CrIa/src/Services/CrIaServ17TestService/InCmd/CrIaServ17PerfConnTest.c
 create mode 100644 CrIa/src/Services/CrIaServ17TestService/InCmd/CrIaServ17PerfConnTest.h
 create mode 100644 CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191DisFdChk.c
 create mode 100644 CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191DisFdChk.h
 create mode 100644 CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191DisRecovProc.c
 create mode 100644 CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191DisRecovProc.h
 create mode 100644 CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191EnbFdChk.c
 create mode 100644 CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191EnbFdChk.h
 create mode 100644 CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191EnbRecovProc.c
 create mode 100644 CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191EnbRecovProc.h
 create mode 100644 CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobDisFdChk.c
 create mode 100644 CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobDisFdChk.h
 create mode 100644 CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobDisRecovProc.c
 create mode 100644 CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobDisRecovProc.h
 create mode 100644 CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobEnbFdChk.c
 create mode 100644 CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobEnbFdChk.h
 create mode 100644 CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobEnbRecovProc.c
 create mode 100644 CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobEnbRecovProc.h
 create mode 100644 CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192AbortDiag.c
 create mode 100644 CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192AbortDiag.h
 create mode 100644 CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoCcdFull.c
 create mode 100644 CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoCcdFull.h
 create mode 100644 CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoCcdWin.c
 create mode 100644 CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoCcdWin.h
 create mode 100644 CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoDiag.c
 create mode 100644 CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoDiag.h
 create mode 100644 CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoSafe.c
 create mode 100644 CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoSafe.h
 create mode 100644 CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoStab.c
 create mode 100644 CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoStab.h
 create mode 100644 CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoStby.c
 create mode 100644 CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoStby.h
 create mode 100644 CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192SwchOffSem.c
 create mode 100644 CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192SwchOffSem.h
 create mode 100644 CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192SwchOnSem.c
 create mode 100644 CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192SwchOnSem.h
 create mode 100644 CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193PrepareSci.c
 create mode 100644 CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193PrepareSci.h
 create mode 100644 CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StartOfflineOper.c
 create mode 100644 CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StartOfflineOper.h
 create mode 100644 CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StartSci.c
 create mode 100644 CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StartSci.h
 create mode 100644 CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StopScience.c
 create mode 100644 CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StopScience.h
 create mode 100644 CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StopSem.c
 create mode 100644 CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StopSem.h
 create mode 100644 CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193SwitchOffIasw.c
 create mode 100644 CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193SwitchOffIasw.h
 create mode 100644 CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194ResAlgo.c
 create mode 100644 CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194ResAlgo.h
 create mode 100644 CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194StartAlgo.c
 create mode 100644 CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194StartAlgo.h
 create mode 100644 CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194StopAlgo.c
 create mode 100644 CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194StopAlgo.h
 create mode 100644 CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194SusAlgo.c
 create mode 100644 CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194SusAlgo.h
 create mode 100644 CrIa/src/Services/CrIaServ195HeartbeatService/OutRep/CrIaServ195HbRep.c
 create mode 100644 CrIa/src/Services/CrIaServ195HeartbeatService/OutRep/CrIaServ195HbRep.h
 create mode 100644 CrIa/src/Services/CrIaServ196AOCSService/InCmd/CrIaServ196StarMapCmd.c
 create mode 100644 CrIa/src/Services/CrIaServ196AOCSService/InCmd/CrIaServ196StarMapCmd.h
 create mode 100644 CrIa/src/Services/CrIaServ196AOCSService/OutRep/CrIaServ196AocsRep.c
 create mode 100644 CrIa/src/Services/CrIaServ196AOCSService/OutRep/CrIaServ196AocsRep.h
 create mode 100644 CrIa/src/Services/CrIaServ197BootReportService/InCmd/CrIaServ197RepBoot.c
 create mode 100644 CrIa/src/Services/CrIaServ197BootReportService/InCmd/CrIaServ197RepBoot.h
 create mode 100644 CrIa/src/Services/CrIaServ197BootReportService/OutRep/CrIaServ197BootRep.c
 create mode 100644 CrIa/src/Services/CrIaServ197BootReportService/OutRep/CrIaServ197BootRep.h
 create mode 100644 CrIa/src/Services/CrIaServ198ProcedureControlService/InCmd/CrIaServ198ProcStart.c
 create mode 100644 CrIa/src/Services/CrIaServ198ProcedureControlService/InCmd/CrIaServ198ProcStart.h
 create mode 100644 CrIa/src/Services/CrIaServ198ProcedureControlService/InCmd/CrIaServ198ProcStop.c
 create mode 100644 CrIa/src/Services/CrIaServ198ProcedureControlService/InCmd/CrIaServ198ProcStop.h
 create mode 100644 CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1AccFail.c
 create mode 100644 CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1AccFail.h
 create mode 100644 CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1AccSucc.c
 create mode 100644 CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1AccSucc.h
 create mode 100644 CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1StartFail.c
 create mode 100644 CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1StartFail.h
 create mode 100644 CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1StartSucc.c
 create mode 100644 CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1StartSucc.h
 create mode 100644 CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1TermFail.c
 create mode 100644 CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1TermFail.h
 create mode 100644 CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1TermSucc.c
 create mode 100644 CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1TermSucc.h
 create mode 100644 CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210DisWdog.c
 create mode 100644 CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210DisWdog.h
 create mode 100644 CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210EnbWdog.c
 create mode 100644 CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210EnbWdog.h
 create mode 100644 CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210ResetDpu.c
 create mode 100644 CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210ResetDpu.h
 create mode 100644 CrIa/src/Services/CrIaServ211ParameterUpdateService/InCmd/CrIaServ211UpdatePar.c
 create mode 100644 CrIa/src/Services/CrIaServ211ParameterUpdateService/InCmd/CrIaServ211UpdatePar.h
 create mode 100644 CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3ClrHkDr.c
 create mode 100644 CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3ClrHkDr.h
 create mode 100644 CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3DefineHkDr.c
 create mode 100644 CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3DefineHkDr.h
 create mode 100644 CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3DisHkDrGen.c
 create mode 100644 CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3DisHkDrGen.h
 create mode 100644 CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3EnbHkDrGen.c
 create mode 100644 CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3EnbHkDrGen.h
 create mode 100644 CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3SetHkRepFreq.c
 create mode 100644 CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3SetHkRepFreq.h
 create mode 100644 CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/OutRep/CrIaServ3HkDr.c
 create mode 100644 CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/OutRep/CrIaServ3HkDr.h
 create mode 100644 CrIa/src/Services/CrIaServ5EventReportingService/InCmd/CrIaServ5DisEvtRepGen.c
 create mode 100644 CrIa/src/Services/CrIaServ5EventReportingService/InCmd/CrIaServ5DisEvtRepGen.h
 create mode 100644 CrIa/src/Services/CrIaServ5EventReportingService/InCmd/CrIaServ5EnbEvtRepGen.c
 create mode 100644 CrIa/src/Services/CrIaServ5EventReportingService/InCmd/CrIaServ5EnbEvtRepGen.h
 create mode 100644 CrIa/src/Services/CrIaServ5EventReportingService/OutRep/CrIaServ5Event.c
 create mode 100644 CrIa/src/Services/CrIaServ5EventReportingService/OutRep/CrIaServ5Event.h
 create mode 100644 CrIa/src/Services/CrIaServ6MemoryManagementService/InCmd/CrIaServ6DumpMem.c
 create mode 100644 CrIa/src/Services/CrIaServ6MemoryManagementService/InCmd/CrIaServ6DumpMem.h
 create mode 100644 CrIa/src/Services/CrIaServ6MemoryManagementService/InCmd/CrIaServ6LoadMem.c
 create mode 100644 CrIa/src/Services/CrIaServ6MemoryManagementService/InCmd/CrIaServ6LoadMem.h
 create mode 100644 CrIa/src/Services/CrIaServ6MemoryManagementService/OutRep/CrIaServ6MemDump.c
 create mode 100644 CrIa/src/Services/CrIaServ6MemoryManagementService/OutRep/CrIaServ6MemDump.h
 create mode 100644 CrIa/src/Services/CrSemServ1CommandVerificationService/InRep/CrSemServ1ComVerif.c
 create mode 100644 CrIa/src/Services/CrSemServ1CommandVerificationService/InRep/CrSemServ1ComVerif.h
 create mode 100644 CrIa/src/Services/CrSemServ21ScienceDataService/InRep/CrSemServ21DatCcdWindow.c
 create mode 100644 CrIa/src/Services/CrSemServ21ScienceDataService/InRep/CrSemServ21DatCcdWindow.h
 create mode 100644 CrIa/src/Services/CrSemServ21ScienceDataService/OutCmd/CrSemServ21CmdCcdDataDisable.c
 create mode 100644 CrIa/src/Services/CrSemServ21ScienceDataService/OutCmd/CrSemServ21CmdCcdDataDisable.h
 create mode 100644 CrIa/src/Services/CrSemServ21ScienceDataService/OutCmd/CrSemServ21CmdCcdDataEnable.c
 create mode 100644 CrIa/src/Services/CrSemServ21ScienceDataService/OutCmd/CrSemServ21CmdCcdDataEnable.h
 create mode 100644 CrIa/src/Services/CrSemServ220PrivateService220/InRep/CrSemServ220DatFunctParam.c
 create mode 100644 CrIa/src/Services/CrSemServ220PrivateService220/InRep/CrSemServ220DatFunctParam.h
 create mode 100644 CrIa/src/Services/CrSemServ220PrivateService220/InRep/CrSemServ220DatOperParam.c
 create mode 100644 CrIa/src/Services/CrSemServ220PrivateService220/InRep/CrSemServ220DatOperParam.h
 create mode 100644 CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdFunctParam.c
 create mode 100644 CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdFunctParam.h
 create mode 100644 CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdOperParam.c
 create mode 100644 CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdOperParam.h
 create mode 100644 CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdTempCtrlEnable.c
 create mode 100644 CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdTempCtrlEnable.h
 create mode 100644 CrIa/src/Services/CrSemServ221PrivateService221/OutCmd/CrSemServ221FpmPowerDis.c
 create mode 100644 CrIa/src/Services/CrSemServ221PrivateService221/OutCmd/CrSemServ221FpmPowerDis.h
 create mode 100644 CrIa/src/Services/CrSemServ221PrivateService221/OutCmd/CrSemServ221FpmPowerEnb.c
 create mode 100644 CrIa/src/Services/CrSemServ221PrivateService221/OutCmd/CrSemServ221FpmPowerEnb.h
 create mode 100644 CrIa/src/Services/CrSemServ222PrivateService222/InRep/CrSemServ222DatTestLog.c
 create mode 100644 CrIa/src/Services/CrSemServ222PrivateService222/InRep/CrSemServ222DatTestLog.h
 create mode 100644 CrIa/src/Services/CrSemServ222PrivateService222/OutCmd/CrSemServ222DiagEnable.c
 create mode 100644 CrIa/src/Services/CrSemServ222PrivateService222/OutCmd/CrSemServ222DiagEnable.h
 create mode 100644 CrIa/src/Services/CrSemServ3HousekeepingDataReportingService/InRep/CrSemServ3DatHk.c
 create mode 100644 CrIa/src/Services/CrSemServ3HousekeepingDataReportingService/InRep/CrSemServ3DatHk.h
 create mode 100644 CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrHighSev.c
 create mode 100644 CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrHighSev.h
 create mode 100644 CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrLowSev.c
 create mode 100644 CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrLowSev.h
 create mode 100644 CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrMedSev.c
 create mode 100644 CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrMedSev.h
 create mode 100644 CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtNorm.c
 create mode 100644 CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtNorm.h
 create mode 100644 CrIa/src/Services/CrSemServ9HousekeepingDataReportingService/OutCmd/CrSemServ9CmdTimeUpdate.c
 create mode 100644 CrIa/src/Services/CrSemServ9HousekeepingDataReportingService/OutCmd/CrSemServ9CmdTimeUpdate.h
 create mode 100644 CrIa/src/Services/General/CrIaConstants.h
 create mode 100644 CrIa/src/Services/General/CrIaParamGetter.c
 create mode 100644 CrIa/src/Services/General/CrIaParamGetter.h
 create mode 100644 CrIa/src/Services/General/CrIaParamSetter.c
 create mode 100644 CrIa/src/Services/General/CrIaParamSetter.h
 create mode 100644 CrIa/src/Services/General/CrSemConstants.h
 create mode 100644 CrIa/src/Services/General/CrSemParamGetter.c
 create mode 100644 CrIa/src/Services/General/CrSemParamGetter.h
 create mode 100644 CrIa/src/Services/General/CrSemParamSetter.c
 create mode 100644 CrIa/src/Services/General/CrSemParamSetter.h
 create mode 120000 CrIa/src/Ta/AngleMethod.c
 create mode 120000 CrIa/src/Ta/AngleMethod.h
 create mode 120000 CrIa/src/Ta/StarExtractor.c
 create mode 120000 CrIa/src/Ta/StarExtractor.h
 create mode 120000 CrIa/src/Ta/StarPosDistortCorr.c
 create mode 120000 CrIa/src/Ta/StarPosDistortCorr.h
 create mode 120000 CrIa/src/Ta/TaDatatypes.h
 create mode 120000 CrIa/src/Ta/TargetAcquisition.c
 create mode 120000 CrIa/src/Ta/TargetAcquisition.h
 create mode 100644 CrIa/src/byteorder.h
 create mode 100644 FwProfile/.tup/db
 create mode 100644 FwProfile/.tup/object
 create mode 100644 FwProfile/.tup/shared
 create mode 100644 FwProfile/.tup/tri
 create mode 100644 FwProfile/Makefile
 create mode 100644 FwProfile/Makefile-dpu.mk
 create mode 100644 FwProfile/Makefile-pc.mk
 create mode 100644 FwProfile/src/FwPrConfig.c
 create mode 100644 FwProfile/src/FwPrConfig.h
 create mode 100644 FwProfile/src/FwPrConstants.h
 create mode 100644 FwProfile/src/FwPrCore.c
 create mode 100644 FwProfile/src/FwPrCore.h
 create mode 100644 FwProfile/src/FwPrDCreate.c
 create mode 100644 FwProfile/src/FwPrDCreate.h
 create mode 100644 FwProfile/src/FwPrPrivate.h
 create mode 100644 FwProfile/src/FwPrSCreate.c
 create mode 100644 FwProfile/src/FwPrSCreate.h
 create mode 100644 FwProfile/src/FwRtConfig.c
 create mode 100644 FwProfile/src/FwRtConfig.h
 create mode 100644 FwProfile/src/FwRtConstants.h
 create mode 100644 FwProfile/src/FwRtCore.c
 create mode 100644 FwProfile/src/FwRtCore.h
 create mode 100644 FwProfile/src/FwSmAux.c
 create mode 100644 FwProfile/src/FwSmAux.h
 create mode 100644 FwProfile/src/FwSmConfig.c
 create mode 100644 FwProfile/src/FwSmConfig.h
 create mode 100644 FwProfile/src/FwSmConstants.h
 create mode 100644 FwProfile/src/FwSmCore.c
 create mode 100644 FwProfile/src/FwSmCore.h
 create mode 100644 FwProfile/src/FwSmDCreate.c
 create mode 100644 FwProfile/src/FwSmDCreate.h
 create mode 100644 FwProfile/src/FwSmPrivate.h
 create mode 100644 FwProfile/src/FwSmSCreate.c
 create mode 100644 FwProfile/src/FwSmSCreate.h
 create mode 100644 IBSW/.gitignore
 create mode 100644 IBSW/doc/Doxyfile
 create mode 100644 IBSW/doc/DoxygenLayout.xml
 create mode 100644 IBSW/doc/Makefile
 create mode 100644 IBSW/doc/README
 create mode 100644 IBSW/doc/bootstrap.min.css
 create mode 100644 IBSW/doc/bootstrap.min.js
 create mode 100644 IBSW/doc/customdoxygen.css
 create mode 100644 IBSW/doc/doxy-boot.js
 create mode 100644 IBSW/doc/extradoc/mainpage.dox
 create mode 100644 IBSW/doc/footer.html
 create mode 100644 IBSW/doc/header.html
 create mode 100644 IBSW/doc/images/cheops-logo-with-additional3.png
 create mode 100644 IBSW/doc/images/core1553brm_as250/irq_handler.graphml
 create mode 100644 IBSW/doc/images/core1553brm_as250/irq_handler.png
 create mode 100644 IBSW/doc/images/core1553brm_as250/split_packetstreams.graphml
 create mode 100644 IBSW/doc/images/core1553brm_as250/split_packetstreams_direct_buffer_drop.graphml
 create mode 100644 IBSW/doc/images/core1553brm_as250/split_packetstreams_direct_buffer_drop.png
 create mode 100644 IBSW/doc/images/cpus_buffer/cpus_get_free.graphml
 create mode 100644 IBSW/doc/images/cpus_buffer/cpus_get_free.png
 create mode 100644 IBSW/doc/images/cpus_buffer/sliding_window_buffer.graphml
 create mode 100644 IBSW/doc/images/cpus_buffer/sliding_window_buffer.png
 create mode 100644 IBSW/doc/images/ibsw_interface/GetLinkCapacity.graphml
 create mode 100644 IBSW/doc/images/ibsw_interface/GetLinkCapacity.png
 create mode 100644 IBSW/doc/images/ibsw_logical_model.graphml
 create mode 100644 IBSW/doc/images/ibsw_logical_model.png
 create mode 100644 IBSW/doc/images/irq_dispatch/irq_dispatch.graphml
 create mode 100644 IBSW/doc/images/irq_dispatch/irq_dispatch.png
 create mode 100644 IBSW/doc/images/packet_tracker/CrIbGndPcktCollect.graphml
 create mode 100644 IBSW/doc/images/packet_tracker/CrIbGndPcktCollect.png
 create mode 100644 IBSW/doc/images/packet_tracker/CrIbIsGrdPcktAvail.graphml
 create mode 100644 IBSW/doc/images/packet_tracker/CrIbIsGrdPcktAvail.png
 create mode 100644 IBSW/doc/images/packet_tracker/CrIbIsObcPcktAvail.graphml
 create mode 100644 IBSW/doc/images/packet_tracker/CrIbIsObcPcktAvail.png
 create mode 100644 IBSW/doc/images/packet_tracker/CrIbMilBusPckHandover_1kbuf.graphml
 create mode 100644 IBSW/doc/images/packet_tracker/CrIbMilBusPcktHandover.graphml
 create mode 100644 IBSW/doc/images/packet_tracker/CrIbMilBusPcktHandover.png
 create mode 100644 IBSW/doc/images/packet_tracker/CrIbObcPcktCollect.graphml
 create mode 100644 IBSW/doc/images/packet_tracker/CrIbObcPcktCollect.png
 create mode 100644 IBSW/include/ahb.h
 create mode 100644 IBSW/include/asm/leon.h
 create mode 100644 IBSW/include/byteorder.h
 create mode 100644 IBSW/include/circular_buffer16.h
 create mode 100644 IBSW/include/circular_buffer8.h
 create mode 100644 IBSW/include/clkgate.h
 create mode 100644 IBSW/include/compiler.h
 create mode 100644 IBSW/include/core1553brm_as250.h
 create mode 100644 IBSW/include/cpus_buffers.h
 create mode 100644 IBSW/include/edac.h
 create mode 100644 IBSW/include/error_log.h
 create mode 100644 IBSW/include/errors.h
 create mode 100644 IBSW/include/event_report.h
 create mode 100644 IBSW/include/exchange_area.h
 create mode 100644 IBSW/include/grspw2.h
 create mode 100644 IBSW/include/ibsw.h
 create mode 100644 IBSW/include/ibsw_interface.h
 create mode 100644 IBSW/include/io.h
 create mode 100644 IBSW/include/iwf_flash.h
 create mode 100644 IBSW/include/iwf_fpga.h
 create mode 100644 IBSW/include/leon/irq.h
 create mode 100644 IBSW/include/leon/irq_dispatch.h
 create mode 100644 IBSW/include/leon/leon_reg.h
 create mode 100644 IBSW/include/leon3_dsu.h
 create mode 100644 IBSW/include/leon3_gptimer.h
 create mode 100644 IBSW/include/leon3_grtimer.h
 create mode 100644 IBSW/include/leon3_grtimer_longcount.h
 create mode 100644 IBSW/include/leon3_timers.h
 create mode 100644 IBSW/include/list.h
 create mode 100644 IBSW/include/memcfg.h
 create mode 100644 IBSW/include/memscrub.h
 create mode 100644 IBSW/include/packet_tracker.h
 create mode 100644 IBSW/include/spinlock.h
 create mode 100644 IBSW/include/stacktrace.h
 create mode 100644 IBSW/include/syncpulse.h
 create mode 100644 IBSW/include/sysctl.h
 create mode 100644 IBSW/include/timing.h
 create mode 100644 IBSW/include/traps.h
 create mode 100644 IBSW/include/watchdog.h
 create mode 100644 IBSW/include/wrap_malloc.h
 create mode 100644 IBSW/lib/ahb.c
 create mode 100644 IBSW/lib/asm/data_access_exception_trap.S
 create mode 100644 IBSW/lib/asm/floating_point_exception_trap.S
 create mode 100644 IBSW/lib/asm/reset_trap.S
 create mode 100644 IBSW/lib/asm/trace_trap.S
 create mode 100644 IBSW/lib/circular_buffer16.c
 create mode 100644 IBSW/lib/circular_buffer8.c
 create mode 100644 IBSW/lib/core1553brm_as250.c
 create mode 100644 IBSW/lib/cpus_buffer.c
 create mode 100644 IBSW/lib/edac.c
 create mode 100644 IBSW/lib/error_log.c
 create mode 100644 IBSW/lib/event_report.c
 create mode 100644 IBSW/lib/fpe.c
 create mode 100644 IBSW/lib/grspw2.c
 create mode 100644 IBSW/lib/ibsw_init/ibsw_init.c
 create mode 100644 IBSW/lib/ibsw_init/ibsw_mainloop.c
 create mode 100644 IBSW/lib/ibsw_init/init_1553.c
 create mode 100644 IBSW/lib/ibsw_init/init_cpu_0_idle_timing.c
 create mode 100644 IBSW/lib/ibsw_init/init_cpus.c
 create mode 100644 IBSW/lib/ibsw_init/init_edac.c
 create mode 100644 IBSW/lib/ibsw_init/init_error_log.c
 create mode 100644 IBSW/lib/ibsw_init/init_ptrack.c
 create mode 100644 IBSW/lib/ibsw_init/init_spw.c
 create mode 100644 IBSW/lib/ibsw_init/init_sync_timing.c
 create mode 100644 IBSW/lib/ibsw_interface/ibsw_1553.c
 create mode 100644 IBSW/lib/ibsw_interface/ibsw_datapool_update.c
 create mode 100644 IBSW/lib/ibsw_interface/ibsw_error_log.c
 create mode 100644 IBSW/lib/ibsw_interface/ibsw_execute_op.c
 create mode 100644 IBSW/lib/ibsw_interface/ibsw_fbf.c
 create mode 100644 IBSW/lib/ibsw_interface/ibsw_interface.c
 create mode 100644 IBSW/lib/ibsw_interface/ibsw_memscrub.c
 create mode 100644 IBSW/lib/ibsw_interface/ibsw_spw.c
 create mode 100644 IBSW/lib/ibsw_interface/ibsw_time.c
 create mode 100644 IBSW/lib/ibsw_interface/ibsw_utility.c
 create mode 100644 IBSW/lib/ibsw_interface/ibsw_watchdog.c
 create mode 100644 IBSW/lib/irq_dispatch.c
 create mode 100644 IBSW/lib/iwf_flash.c
 create mode 100644 IBSW/lib/iwf_fpga.c
 create mode 100644 IBSW/lib/leon3_dsu.c
 create mode 100644 IBSW/lib/memcfg.c
 create mode 100644 IBSW/lib/memscrub.c
 create mode 100644 IBSW/lib/packet_tracker.c
 create mode 100644 IBSW/lib/reset.c
 create mode 100644 IBSW/lib/stacktrace.c
 create mode 100644 IBSW/lib/sysctl.c
 create mode 100644 IBSW/lib/timing/leon3_gptimer.c
 create mode 100644 IBSW/lib/timing/leon3_grtimer.c
 create mode 100644 IBSW/lib/timing/leon3_grtimer_longcount.c
 create mode 100644 IBSW/lib/timing/syncpulse.c
 create mode 100644 IBSW/lib/timing/timing.c
 create mode 100644 IBSW/lib/timing/watchdog.c
 create mode 100644 IBSW/lib/traps.c
 create mode 100644 IBSW/lib/wrap_malloc.c
 create mode 100644 TargetAcquisition/src/AngleMethod.c
 create mode 100644 TargetAcquisition/src/AngleMethod.h
 create mode 120000 TargetAcquisition/src/CrIaDataPool.c
 create mode 120000 TargetAcquisition/src/CrIaDataPool.h
 create mode 120000 TargetAcquisition/src/CrIaDataPoolId.h
 create mode 120000 TargetAcquisition/src/IfswConversions.c
 create mode 120000 TargetAcquisition/src/IfswConversions.h
 create mode 100644 TargetAcquisition/src/StarExtractor.c
 create mode 100644 TargetAcquisition/src/StarExtractor.h
 create mode 100644 TargetAcquisition/src/StarPosDistortCorr.c
 create mode 100644 TargetAcquisition/src/StarPosDistortCorr.h
 create mode 100644 TargetAcquisition/src/TaDatatypes.h
 create mode 100644 TargetAcquisition/src/TargetAcquisition.c
 create mode 100644 TargetAcquisition/src/TargetAcquisition.h
 create mode 120000 include/CrFramework
 create mode 120000 include/FwProfile

diff --git a/CompressionEntity/src/IfswConversions.c b/CompressionEntity/src/IfswConversions.c
new file mode 120000
index 0000000..b61b15f
--- /dev/null
+++ b/CompressionEntity/src/IfswConversions.c
@@ -0,0 +1 @@
+../../CrIa/src/IfswConversions.c
\ No newline at end of file
diff --git a/CompressionEntity/src/IfswConversions.h b/CompressionEntity/src/IfswConversions.h
new file mode 120000
index 0000000..a2674b8
--- /dev/null
+++ b/CompressionEntity/src/IfswConversions.h
@@ -0,0 +1 @@
+../../CrIa/src/IfswConversions.h
\ No newline at end of file
diff --git a/CompressionEntity/src/IfswMath.c b/CompressionEntity/src/IfswMath.c
new file mode 120000
index 0000000..3225fdc
--- /dev/null
+++ b/CompressionEntity/src/IfswMath.c
@@ -0,0 +1 @@
+../../CrIa/src/IfswMath.c
\ No newline at end of file
diff --git a/CompressionEntity/src/IfswMath.h b/CompressionEntity/src/IfswMath.h
new file mode 120000
index 0000000..444c337
--- /dev/null
+++ b/CompressionEntity/src/IfswMath.h
@@ -0,0 +1 @@
+../../CrIa/src/IfswMath.h
\ No newline at end of file
diff --git a/CompressionEntity/src/SdpAlgorithmsImplementation.c b/CompressionEntity/src/SdpAlgorithmsImplementation.c
new file mode 100644
index 0000000..4cc97bc
--- /dev/null
+++ b/CompressionEntity/src/SdpAlgorithmsImplementation.c
@@ -0,0 +1,3005 @@
+/**
+ * @file    SdpAlgorithmsImplementation.c
+ * @ingroup Compression
+ * @author  Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @date    August, 2016
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ *
+ * @defgroup Compression Science Data Compression
+ * @ingroup Sdp
+ *
+ * @brief The big @ref Compress function together with its many auxiliary functions and algorithms.
+ *
+ * ## Overview
+ *
+ * This group contains the @ref Compress function, which is called once for each product during the science compression.
+ *
+ * ### @anchor ping-pong Playing ping-pong with buffers
+ *
+ * The data processing chain consists of six consecutive steps, which are user-configurable.
+ * There are several scenarios in which such a step operates:
+ *   1. it processes data from an input buffer and generates data in an output buffer
+ *   2. it works in place, i.e. the input data are overwritten with the output data
+ *   3. there are no input data, but output data (e.g. @ref PRODUCT_DUMMY data generation)
+ *   4. the input data will not be modified, but are needed by the next processing step
+ *
+ * Other cases have been removed from CHEOPS (e.g. dumping data or centroid calculation inside
+ * the data processing chain).
+ *
+ * For all these cases, a memory-saving buffering scheme had to be found, which at the same time
+ * reduces the number of memcopy operations. This is achieved by the following paradigms:
+ *   - the information about datatype and dimensions are carried along the steps
+ *     in the source @ref ScienceBuf structure and only updated after a lossy step
+ *   - one step always starts with the data in the source @ScienceBuf
+ *   - the compressed data are tracked through a @ref CompressedBuf structure
+ *   - in each step, the output buffer (compressed->data) is __not__ copied back into the input
+ *     buffer (source->data), instead
+ *     their pointers are exchanged in the @ref ScienceBuf and @ref CompressedBuf. The metadata
+ *     are __not__ exchanged.
+ *   - the actual input and output buffers (source->data and compressed->data) must both have the
+ *     biggest size that a product can take on during an allowed processing step.
+ *   - a step must not assume that useful data are in the compressed->data at the beginning
+ *     (i.e. it has to assume that the original source was overwritten)
+ *   - after the lossy steps are completed and before the lossless compression steps, a checksum
+ *     is taken. This goes into the downlink as part of the @ref CompressionEntity for each product.
+ *   - after lossless compression, the size is stored in the compressed->llcsize variable.
+ *   - at the end of the processing chain the actual buffer may or may not need to be copied to the
+ *     desired output buffer (given by the location parameter), depending on the number of times
+ *     the buffers were exchanged.
+ *
+ * ### Fetching the Products
+ *
+ * The steps of the data processing chain are very similar in how they are applied, but the first step
+ * is very different. In this step, the data for the product are acquired from the @ref SIBs and
+ * copied into the source buffer. Note that no way was found to avoid this initial memcopy step,
+ * because the data for the products in the SIBs are structured, whereas the data processing steps
+ * need uninterrupted data cubes.
+ *
+ * The fetching itself is quite similar for each product. The general flow is:
+ *   - for each frame,
+ *     - pull the @ref SIB structure on the sibOut slot using @ref CrIaSetupSibWin (or full)
+ *     - copy the relevant data from the SIB into the source->data
+ *     - increment the sibOut (only locally, do not write back to data pool)
+ * ... and we are ready for the next step.
+ *
+ * Some of the products directly acquire the data from the SIBs to the source->data that way.
+ * Some, i.e. those which already carry out a lossy step such as cropping (imagettes) or
+ * the margins, first acquire the data into the swapped buffer and get the reduced data back in the
+ * source to save memory. The swapped buffer at the beginning is the ProcBuf, which was dimensioned
+ * for the largest product, so this is always fine. Otherwise we would need to reserve 4 MiB for the
+ * compressed imagettes buffer, which are cropped in the PRODUCT step. Clearly, this would be unwise.
+ *
+ * Please also read the section about buffer preparations in @ref SdpCompress.
+ */
+
+#include "SdpAlgorithmsImplementation.h"
+#include "SdpAlgorithmsImplementationLlc.h"
+#include "SdpCeDefinitions.h" /* for CeKey defines, TYPESIZE */
+#include "CrIaDataPoolId.h"
+#include "CrIaDataPool.h"
+#include "SdpCompressionEntityStructure.h"
+#include "SdpNlcPhot.h"
+#include "EngineeringAlgorithms.h"
+
+#include <stdio.h> /* for SDPRINT */
+#include <string.h> /* for memcpy, strncopy */
+#include <stdlib.h> /* for qsort */
+
+#include "IfswMath.h"
+
+#ifndef ISOLATED
+#include "Services/General/CrIaConstants.h"
+#include "CrIaIasw.h" /* for SdpEvtRaise */
+#endif
+
+#ifdef DEBUGFILES
+#include <fitsio.h> /* used to save the intermediate debug images on PC */
+#endif
+
+#define ANSI_COLOR_RED     "\x1b[31m"
+#define ANSI_COLOR_RESET   "\x1b[0m"
+
+#ifdef DEBUGFILES
+#include <fitsio.h> /* used to save the intermediate debug images on PC */
+#endif
+
+#ifdef DEBUGFILES
+char debugfilename[256];
+
+void saveFitsImage (char *filename, struct ScienceBuf *imgdata)
+{
+  fitsfile *outfptr;
+  int status = 0;
+  int bitpix, naxis;
+  long naxes[2];
+
+  /* create output file */
+  if (fits_create_file(&outfptr, filename, &status))
+    SDPRINT("error %d creating fits file\n", status);
+
+  /* create image HDU for BW image */
+  bitpix = 32;
+  naxis = 2;
+  naxes[0] = imgdata->xelements;
+  naxes[1] = imgdata->yelements * imgdata->zelements;
+  fits_create_img(outfptr, bitpix, naxis, naxes, &status);
+
+  /* save image data */
+  fits_write_2d_int (outfptr, 0, naxes[0], naxes[0], naxes[1], (int *)(imgdata->data), &status);
+
+  /* close file */
+  if (fits_close_file(outfptr,  &status))
+    SDPRINT("error %d closing fits file\n", status);
+
+  return;
+}
+#endif
+
+
+/**
+ * @brief    very slow but very safe memcpy replacement for the SRAM2
+ *           Makes a byte-wise copy through @ref GETBYTE and @ref PUTBYTE
+ * @param    dest    address where to copy data to
+ * @param    src     address where to take the data from
+ * @param    n       number of bytes to be copied
+ * @returns  destination address, because we want to be compatible with memcpy and are never supposed to fail here
+ * @note     here, the address does not need to be aligned!
+ * @note     wherever you can, use the faster aligned version instead
+ * @todo     this is really painfully slow, but it can't be helped much because this one is alignment safe.
+ */
+
+void *sram2memcpy(void *dest, const void *src, unsigned long int n)
+{
+  unsigned char value;
+  unsigned int i;
+  unsigned int *src_aligned, *dest_aligned;
+  unsigned long int srcoff, destoff;
+
+  src_aligned = (unsigned int *)((unsigned long int)src & ~0x3L);
+  srcoff = ((unsigned long int)src - (unsigned long int)src_aligned) * 8;
+
+  dest_aligned = (unsigned int *)((unsigned long int)dest & ~0x3L);
+  destoff = ((unsigned long int)dest - (unsigned long int)dest_aligned) * 8;
+
+  for (i=0; i < n; i++)
+    {
+      value = GetByte32 (i + srcoff, (unsigned int *)src_aligned);
+      PutByte32 (value, i + destoff, (unsigned int *)dest_aligned);
+    }
+
+  return dest;
+}
+
+
+/**
+ * @brief    function to copy shorts from SRAM1 to SRAM2, taking care of the alignment in SRAM2.
+ *           In SRAM1 short access is OK, whereas in SRAM2 it will yield wrong results. This function
+ *           takes care of this and still tries to copy the bulk of the data as integers which are assembled
+ *           from the source short array.
+ * @param    dest    address where to copy data to, must be 2-byte aligned, does not need to be 4-byte aligned
+ * @param    src     address where to take the data from, must be 2-byte aligned, does not need to be 4-byte aligned
+ * @param    n       number of shorts to be copied
+ * @returns  destination address, can be 2-byte aligned. In case of an error, NULL is returned.
+ * @warning  once more, alignment matters here!
+ */
+
+unsigned short *sram1tosram2_shorts (unsigned short *p_src, unsigned int nshorts, unsigned short *p_dest_short)
+{
+  unsigned int i;
+  unsigned int destval;  
+  unsigned int *p_dest;
+  
+  /* check the requirements on the alignment of the buffers */  
+  if ((unsigned long int)p_src & 0x1)
+    return NULL;
+  if ((unsigned long int)p_dest_short & 0x1)
+    return NULL;
+
+  /* bring the destination to 4-byte alignment by copying the first short */
+  if ((unsigned long int)p_dest_short & 0x2)
+    {
+      p_dest = (unsigned int *)((unsigned long int)p_dest_short & ~0x3L); /* NOTE: round off the short pointer to align to next lowest int */
+#if (__sparc__)
+      destval = (p_dest[0] & 0xffff0000) | (unsigned int) p_src[0]; /* NOTE: big endian */
+#else
+      destval = (p_dest[0] & 0x0000ffff) | ((unsigned int) p_src[0] << 16); /* NOTE: little endian */
+#endif
+      p_dest[0] = destval;
+      nshorts--;
+      p_src++; 
+      p_dest++;
+    }
+  else
+    {
+      p_dest = (unsigned int *) p_dest_short;
+    }
+  
+  /* aligned copy nshorts/2 pairs of shorts */
+  for (i=0; i < (nshorts >> 1); i++)
+    {
+#if (__sparc__)
+      destval = p_src[2*i] << 16; /* NOTE: big endian */
+      destval |= p_src[2*i+1];
+#else
+      destval = p_src[2*i]; /* NOTE: little endian */
+      destval |= p_src[2*i+1] << 16;      
+#endif
+      p_dest[i] = destval;
+    }
+
+  p_dest_short = (unsigned short *)&p_dest[i];
+  
+  /* care for a remaining odd short */
+  if (nshorts & 0x1)
+    {
+#if (__sparc__)
+      destval = (p_dest[i] & 0x0000ffff) | ((unsigned int) p_src[nshorts - 1] << 16); /* NOTE: big endian */
+#else
+      destval = (p_dest[i] & 0xffff0000) | (unsigned int) p_src[nshorts - 1]; /* NOTE: little endian */
+#endif
+      p_dest[i] = destval;
+      p_dest_short++; 
+    }
+      
+  return p_dest_short;
+}
+
+
+
+/**
+ * @brief    safe (but slow) way to put the value of a single bit into a bitstream accessed as 32-bit RAM
+ *           in big endian
+ * @param    value      the value to put, either 0 or 1
+ * @param    bitOffset  index of the bit as seen from the very beginning of the bitstream
+ * @param    destAddr   this is the pointer to the beginning of the bitstream
+ * @note     Do not use values like 23 and assume that the LSB will be set. It won't.
+ * @note     works in SRAM2
+ */
+
+void PutBit32 (unsigned int value, unsigned int bitOffset, unsigned int *destAddr)
+{
+  unsigned int wordpos, bitpos;
+  unsigned int destval, mask;
+
+  wordpos = bitOffset >> 5; /* division by 32 */
+  /*  bitpos = bitOffset - 32*wordpos; */
+  bitpos = bitOffset & 0x1f; /* 5 bits */
+
+  /* shape a mask with the required bit set true */
+  mask = 1 << (31-bitpos);
+
+  /* get the destination word and clear the bit */
+  destval = destAddr[wordpos];
+  destval &= ~mask;
+
+  /* set bit if the value was true */
+  if (value == 1)
+    destval |= mask;
+
+  /* write it back */
+  destAddr[wordpos] = destval;
+
+  return;
+}
+
+
+/**
+ * @brief    safe (but slow) way to get the value of a single bit from a bitstream accessed as 32-bit RAM
+ *           in big endian
+ * @returns  value      the value, either 0 or 1, as an unsigned int
+ * @param    bitOffset  index of the bit as seen from the very beginning of the bitstream
+ * @param    src        this is the pointer to the beginning of the bitstream
+ * @note     works in SRAM2
+ */
+
+unsigned int GetBit32 (unsigned int bitOffset, unsigned int *src)
+{
+  unsigned int wordpos, bitpos;
+  unsigned int destval, mask;
+
+  wordpos = bitOffset >> 5; /* division by 32 */
+  /*  bitpos = bitOffset - 32*wordpos; */
+  bitpos = bitOffset & 0x1f; /* 5 bits */
+
+  /* shape a mask with the required bit set true */
+  mask = 1 << (31-bitpos);
+
+  /* get the destination word and mask all other bits */
+  destval = src[wordpos];
+  destval &= mask;
+
+  if (destval != 0)
+    return 1;
+
+  return 0;
+}
+
+
+/**
+ * @brief    safe (but slow) way to put the value of up to 32 bits into a bitstream accessed as 32-bit RAM
+ *           in big endian
+ * @param    value      the value to put, it will be masked
+ * @param    bitOffset  bit index where the bits will be put, seen from the very beginning of the bitstream
+ * @param    nBits      number of bits to put
+ * @param    destAddr   this is the pointer to the beginning of the bitstream
+ * @returns  number of bits written or 0 if the number was too big
+ * @note     works in SRAM2
+ */
+
+unsigned int PutNBits32 (unsigned int value, unsigned int bitOffset, unsigned int nBits, unsigned int *destAddr)
+{
+  unsigned int *localAddr;
+  unsigned int bitsLeft, shiftRight, shiftLeft, localEndPos;
+  unsigned int mask, n2;
+
+  /* leave in case of erroneous input */
+  if (nBits == 0)
+    return 0;
+  if (nBits > 32)
+    return 0;
+
+  /* separate the bitOffset into word offset (set localAddr pointer) and local bit offset (bitsLeft) */
+  localAddr = destAddr + (bitOffset >> 5);
+  bitsLeft = bitOffset & 0x1f;
+
+  /* (M) we mask the value first to match its size in nBits */
+  /* the calculations can be re-used in the unsegmented code, so we have no overhead */
+  shiftRight = 32 - nBits;
+  mask = 0xffffffff >> shiftRight;
+  value &= mask;
+
+  /* to see if we need to split the value over two words we need the right end position */
+  localEndPos = bitsLeft + nBits;
+
+  if (localEndPos <= 32)
+    {
+      /*         UNSEGMENTED
+
+       |-----------|XXXXX|----------------|
+          bitsLeft    n       bitsRight
+
+      -> to get the mask:
+      shiftRight = bitsLeft + bitsRight = 32 - n
+      shiftLeft = bitsRight
+
+      */
+
+      /* shiftRight = 32 - nBits; */ /* see (M) above! */
+      shiftLeft = shiftRight - bitsLeft;
+
+      /* generate the mask, the bits for the values will be true */
+      /* mask = (0xffffffff >> shiftRight) << shiftLeft; */ /* see (M) above! */
+      mask <<= shiftLeft;
+
+      /* clear the destination with inverse mask */
+      *(localAddr) &= ~mask;
+
+      /* assign the value */
+      *(localAddr) |= (value << (32-localEndPos)); /* NOTE: 32-localEndPos = shiftLeft can be simplified */
+    }
+
+  else
+    {
+      /*                             SEGMENTED
+
+       |-----------------------------|XXX| |XX|------------------------------|
+                 bitsLeft              n1   n2          bitsRight
+
+       -> to get the mask part 1:
+       shiftright = bitsleft
+       n1 = n - (bitsleft + n - 32) = 32 - bitsleft
+
+       -> to get the mask part 2:
+       n2 = bitsleft + n - 32
+       shiftleft = 32 - n2 = 32 - (bitsleft + n - 32) = 64 - bitsleft - n
+
+      */
+
+      n2 = bitsLeft + nBits - 32;
+
+      /* part 1: */
+      shiftRight = bitsLeft;
+      mask = 0xffffffff >> shiftRight;
+
+      /* clear the destination with inverse mask */
+      *(localAddr) &= ~mask;
+
+      /* assign the value part 1 */
+      *(localAddr) |= (value >> n2);
+
+      /* part 2: */
+      /* adjust address */
+      localAddr += 1;
+      shiftLeft = 64 - bitsLeft - nBits;
+      mask = 0xffffffff << shiftLeft;
+
+      /* clear the destination with inverse mask */
+      *(localAddr) &= ~mask;
+
+      /* assign the value part 2 */
+      *(localAddr) |= (value << (32-n2));
+    }
+
+  return nBits;
+}
+
+
+/**
+ * @brief       safe (but slow) way to get the value of several bits from a bitstream accessed as 32-bit RAM
+ * @param[out]  p_value         pointer to the output value, where the retrieved bit will be stored on the LSB end
+ * @param[in]   bitOffset       the current stream offset in bits
+ * @param[in]   nBits           number of bits to be acquired (0-32)
+ * @param[in]   srcAddr         pointer to a bitstream array
+ * @returns     number of bits retrieved or 0 if too many bits were asked
+ * @note        works in SRAM2
+ */
+
+unsigned int GetNBits32 (unsigned int *p_value, unsigned int bitOffset, unsigned int nBits, unsigned int *srcAddr)
+{
+  unsigned int *localAddr;
+  unsigned int bitsLeft, bitsRight, shiftRight, localEndPos;
+  unsigned int mask, n1, n2;
+
+  /* leave in case of erroneous input */
+  if (nBits == 0)
+    return 0;
+  if (nBits > 32)
+    return 0;
+
+  /* separate the bitOffset into word offset (set localAddr pointer) and local bit offset (bitsLeft) */
+  localAddr = srcAddr + (bitOffset >> 5);
+  bitsLeft = bitOffset & 0x1f;
+
+  /* to see if we need to split the value over two words we need the right end position */
+  localEndPos = bitsLeft + nBits;
+
+  if (localEndPos <= 32)
+    {
+      /* UNSEGMENTED */
+
+      shiftRight = 32 - nBits;
+      bitsRight = shiftRight - bitsLeft;
+
+      /* shift the value to the right */
+      *(p_value) = *(localAddr) >> bitsRight; /* bitsRight is the same as shiftLeft */
+
+      /* generate the mask, the bits for the values will be true */
+      mask = (0xffffffff >> shiftRight);
+
+      /* extract the value using the mask */
+      *(p_value) &= mask;
+    }
+
+  else
+    {
+      /* SEGMENTED - see PutNbits32 for details */
+
+      n1 = 32 - bitsLeft;
+      n2 = nBits - n1;
+
+      /* part 1: */
+      mask = 0xffffffff >> bitsLeft;
+      *(p_value) = (*localAddr) & mask;
+      *(p_value) <<= n2;
+
+      /* part 2: */
+      /* adjust address */
+      localAddr += 1;
+
+      bitsRight = 32 - n2;
+      *(p_value) |= *(localAddr) >> bitsRight;
+    }
+
+  return nBits;
+}
+
+
+/**
+ * @brief    safe (but slow) way to put the value of a byte into a byte array accessed as 32-bit RAM
+ *           in big endian
+ * @param    value       the value to put
+ * @param    byteOffset  index of the byte as seen from the very beginning of the byte array
+ * @param    destAddr    this is the pointer to the beginning of the byte array
+ * @note     works in SRAM2, but array address must be word aligned!
+ */
+
+void PutByte32 (unsigned char value, unsigned int byteOffset, unsigned int *destAddr)
+{
+  unsigned int *localAddr;
+  unsigned int bytesLeft, bitsRight;
+  unsigned int mask;
+  unsigned int uivalue;
+
+  /* separate the byteOffset into word offset (set localAddr pointer) and local byte offset (bytesLeft) */
+  localAddr = destAddr + (byteOffset >> 2);
+
+  /* calculate the destination byte position within the dest word expressed as a left shift (24 for MSB, 0 for LSB) */
+  bytesLeft = byteOffset & 0x3;
+  bitsRight = (3 - bytesLeft) << 3;
+
+  /* create mask and shift the dest value */
+  mask = 0xff << bitsRight;
+  uivalue = ((unsigned int) value) << bitsRight;
+
+  /* clear the destination with inverse mask */
+  *(localAddr) &= ~mask;
+
+  /* assign the value */
+  *(localAddr) |= uivalue;
+
+  return;
+}
+
+
+/**
+ * @brief    safe (but slow) way to read the value of a byte from a byte array accessed as 32-bit RAM
+ *           in big endian
+ * @returns  the value of the byte in question
+ * @param    byteOffset  index of the byte as seen from the very beginning of the byte array
+ * @param    srcAddr     this is the pointer to the beginning of the byte array
+ * @note     works in SRAM2, but array address must be word aligned!
+ */
+
+unsigned char GetByte32 (unsigned int byteOffset, unsigned int *srcAddr)
+{
+  unsigned int *localAddr;
+  unsigned int bytesLeft, bitsRight;
+
+  /* separate the byteOffset into word offset (set localAddr pointer) and local byte offset (bytesLeft) */
+  localAddr = srcAddr + (byteOffset >> 2);
+
+  /* calculate the destination byte position within the dest word expressed as a left shift (24 for MSB, 0 for LSB) */
+  bytesLeft = byteOffset & 0x3;
+  bitsRight = (3 - bytesLeft) << 3;
+
+  /* get and shift the word */
+  return (unsigned char) ((*(localAddr) >> bitsRight) & 0xff);
+}
+
+
+/**
+ * @brief    coaddition of N frames to a stacked frame
+ * @returns  the number of frames that were stacked or 0 if one of the dimensions was 0
+ * @param    source    address where the image cube starts
+ * @param    Xdim      length of first axis, e.g. 200
+ * @param    Ydim      length of second axis, e.g. 200
+ * @param    N         stack depth
+ * @note     also works in place (i.e. if source and dest are identical)
+ * @warning  There is no saturation, i.e. values can over- or underflow. For CHEOPS this can become a problem if you
+ *           stack more than 32767 images. Fortunately, we don't have RAM for so many images.
+ */
+
+int CoAdd32s (int *source, unsigned short Xdim, unsigned short Ydim, unsigned short N, int *dest)
+{
+  int x, y, n;
+
+  if (N*Xdim*Ydim == 0)
+    return 0;
+
+  /* copy first frame to dest if the two buffers are not identical; */
+  if ((unsigned long int) source != (unsigned long int)dest)
+    for (x=0; x < Xdim*Ydim; x++)
+      dest[x] = source[x];
+
+  /* stack up remaining frames */
+  for (n=1; n < N; n++)
+    for (y=0; y < Ydim; y++)
+      for (x=0; x < Xdim; x++)
+        dest[y*Xdim + x] += source[n*Xdim*Ydim + y*Xdim + x];
+
+  return n;
+}
+
+/**
+ * @brief    averaging of N frames to a stacked frame in integer (using rounding)
+ * @returns  the number of frames that were stacked or 0 if one of the dimensions was 0
+ * @param    source    address where the image cube starts
+ * @param    Xdim      length of first axis, e.g. 200
+ * @param    Ydim      length of second axis, e.g. 200
+ * @param    N         stack depth
+ * @note     also works in place (i.e. if source and dest are identical)
+ * @warning  This uses the @ref CoAdd32s function, so we are restricted to average stacks of less than 32767 frames.
+ */
+
+int Average32s (int *source, unsigned short Xdim, unsigned short Ydim, unsigned short N, int *dest)
+{
+  int i, status;
+
+  float reciprocal;
+
+  if (N == 0)
+    return 0;
+  if (Xdim == 0)
+    return 0;
+  if (Ydim == 0)
+    return 0;
+  
+  /* stack up */
+  status = CoAdd32s (source, Xdim, Ydim, N, dest);
+ 
+  /* divide by N and round */
+  reciprocal = 1.f/(float)N;
+  
+  for (i=0; i < Xdim*Ydim; i++)
+    dest[i] = (int) roundf(reciprocal * (float)dest[i]);
+
+  return status;
+}
+
+/**
+ * @brief    averaging of N frames per group (using truncation)
+ * @returns  the number of groups that result
+ * @param    source    address where the image cube starts
+ * @param    Xdim      length of first axis, e.g. 200
+ * @param    Ydim      length of second axis, e.g. 200
+ * @param    Zdim      number of input frames, e.g. 6
+ * @param    N         number of frames to stack per group, e.g. 3
+ * @param    operation 0 for averaging, otherwise coaddition
+ * @note     also works in place (i.e. if source and dest are identical)
+ * @warning  This uses the @ref CoAdd32s function, so we are restricted to average stacks of less than 32767 frames.
+ */
+
+int ProcessGroups32s (int *source, unsigned short Xdim, unsigned short Ydim, unsigned short Zdim, unsigned char N, unsigned char operation, int *dest)
+{
+  unsigned int i, groups, remaining;
+
+  int *indata;
+  int *outdata;  
+  
+  if (N == 0)
+    return 0;
+  if (Xdim == 0)
+    return 0;
+  if (Ydim == 0)
+    return 0;
+  if (Zdim == 0)
+    return 0;
+
+  groups = (unsigned int)Zdim / (unsigned int)N; 
+  remaining = (unsigned int)Zdim - groups*(unsigned int)N;  
+  
+  for (i=0; i < groups; i++)
+    {
+      indata = source + i * N * Xdim * Ydim;
+      outdata = dest + i * Xdim * Ydim;
+      
+      if (operation == 0)
+	{
+	  Average32s (indata, Xdim, Ydim, N, outdata);            
+	}
+      else
+	{
+	  CoAdd32s (indata, Xdim, Ydim, N, outdata);
+	}
+    }
+
+  if (remaining > 0)
+    {
+      /* average the remaining frames */
+      indata = source + groups * N * Xdim * Ydim;
+      outdata = dest + groups * Xdim * Ydim;
+
+      if (operation == 0)
+	{
+	  Average32s (indata, Xdim, Ydim, remaining, outdata);            
+	}
+      else
+	{
+	  CoAdd32s (indata, Xdim, Ydim, remaining, outdata);
+	}
+      
+      return groups + 1;
+    }
+
+  return groups;
+}
+
+
+/**
+ * @brief    apply bit rounding for unsigned integers in place
+ * @param    source    pointer to the input data
+ * @param    nbits     number of bits to round
+ * @param    n         number of samples to process
+ *
+ * @note     the result is right-shifted by nbits, but we round in float 
+ */
+
+void BitRounding32u (unsigned int *source, unsigned int nbits, unsigned int n)
+{
+  unsigned int i;
+  unsigned int cellwidth;
+  float reciprocal;
+
+  if (nbits >= 32)
+    return;
+
+  cellwidth = 1u << nbits;
+  reciprocal = 1.0f / (float)cellwidth;
+  
+  for (i=0; i < n; i++)
+    source[i] = (unsigned int)roundf((float)source[i] * reciprocal);
+  
+  return;
+}
+
+  
+
+
+/**
+ * @brief    safe (but slow) way to read the value of a short from a packed array accessed as 32-bit RAM
+ *           in big endian
+ * @returns  the value of the short in question
+ * @param    shortOffset  index of the short as seen from the very beginning of the short array
+ * @param    srcAddr      this is the pointer to the beginning of the array (4B aligned)
+ * @note     works in SRAM2
+ */
+
+unsigned int GetUShort32 (unsigned int shortOffset, unsigned int *srcAddr)
+{
+  /* determine if it is the upper (most significant) halfword or the lower one */
+#if (__sparc__)
+  if ((shortOffset & 1) == 0)
+#else
+  if ((shortOffset & 1) == 1)
+#endif
+    {
+      /* left halfword */
+      return srcAddr[shortOffset >> 1] >> 16;
+    }
+  else
+    {
+      /* right halfword */
+      return srcAddr[shortOffset >> 1] & 0xffff;
+    } 
+}
+
+
+/**
+ * @brief    copy a 2d sub-image from an image in SIB.
+ * @param    source    
+ * @param    Xdim      length of the X dimension
+ * @param    Ydim      length of the Y dimension
+ * @param    XcDim     length of the X dimension for the cropped image
+ * @param    YcDim     length of the Y dimension for the cropped image
+ * @param    XcStart   offset of the crop in X
+ * @param    YcStart   offset of the crop in Y
+ * @param    dest      pointer to the destination
+ * @returns  0 on success, or -1 if the crop extends over the window
+ * @note     works in place (input and output can be identical)
+ */
+
+int CropCopyFromSibAndUnpack (unsigned int *source, unsigned short Xdim, unsigned short Ydim, unsigned short XcDim, unsigned short YcDim, unsigned short XcStart, unsigned short YcStart, unsigned int *dest)
+{
+  unsigned int i, j;
+
+  /* if the imagette extends over the window, we return an error */
+  if (((XcStart + XcDim) > Xdim) || ((YcStart + YcDim) > Ydim))
+    return -1;
+
+  for (j=0; j < YcDim; j++)
+    for (i=0; i < XcDim; i++)
+      dest[i + j*XcDim] = GetUShort32(XcStart+i + YcStart*Xdim + Xdim*j, source);
+  
+  return 0;
+}
+
+
+/**
+ * @brief    this is a popcount, a sideway sum, it counts the number of ones that are set in a short
+ * @param    value    the input value we are interested in
+ * @returns  the number of bits set to 1
+ */
+
+unsigned int CountOnes16 (unsigned short value)
+{
+  int i, ones;
+
+  for (i=0, ones=0; i<16; i++)
+    ones += (value >> i) & 0x1;
+
+  return ones;
+}
+
+
+/**
+ * @brief    copy columns selected in the mask to the output
+ * @param    data    pointer to the input data
+ * @param    y       length of the y dimension
+ * @param    mask    0xffff means all 16 columns, 0 means none, bit patterns inbetween work as switches
+ * @param    output  pointer to the destination
+ * @note     works in place (input and output can be identical)
+ */
+
+void ColSelect16_32 (unsigned int *data, unsigned int y, unsigned short mask, unsigned int *output)
+{
+  unsigned int i, j, iout;
+  unsigned int outwidth = CountOnes16(mask);
+
+  for (i=0, iout=0; i < 16; i++)
+    if ((mask << i) & 0x8000)
+      {
+        for (j=0; j < y; j++)
+          {
+            output[iout+j*outwidth] = data[i+j*16];
+          }
+        iout++;
+      }
+
+  return;
+}
+
+
+/**
+ * @brief    overwrite values outside a circular mask with a given value
+ * @param    source    pointer to the image data
+ * @param    Xdim      length of first image axis
+ * @param    Ydim      length of second image axis
+ * @param    xoff      offset of the centre in the first image axis (negaitve shifts left)
+ * @param    yoff      offset of the centre in the second image axis (negaitve shifts up)
+ * @param    radius    radius (in fractional pixels) of the aperture
+ * @param    maskval   replacement value. all pixels outside the aperture will be set to that value
+ * @param    dest      pointer to destination data
+ * @returns  number of processed values
+ * @note     works in place (input and output can be identical)
+ */
+
+int CircMask32 (unsigned int *source, unsigned int Xdim, unsigned int Ydim, int xoff, int yoff, float radius, unsigned int maskval, unsigned int *dest)
+{
+  unsigned int cenX, cenY;
+  unsigned int n = 0;
+  unsigned int x, y;
+  unsigned int rsquare = 0;
+  int vecX, vecY;
+
+  if (radius > 0.0f)
+    rsquare = (unsigned int) (radius*radius + 1.0);
+
+  /* for even number, it will be the left pixel */
+  cenX = ((Xdim - 1) >> 1) + xoff;
+  cenY = ((Ydim - 1) >> 1) + yoff;
+
+  for (y=0; y < Ydim; y++)
+    for (x=0; x < Xdim; x++)
+      {
+        vecX = cenX - x;
+        vecY = cenY - y;
+        if ((unsigned int)(vecX*vecX + vecY*vecY) < rsquare)
+          {
+            /* inside circle */
+            dest[n] = source[x + y*Xdim];
+            n++;
+          }
+        else
+          {
+            /* outside circle */
+            dest[n] = maskval;
+            n++;
+          }
+      }
+
+  return n;
+}
+
+/**
+ * @brief    discard values inside an inner ring and outside an outer ring. This will create a 1d vector out of a 2d image
+ * @param    source    pointer to the image data
+ * @param    Xdim      length of first image axis
+ * @param    Ydim      length of second image axis
+ * @param    xoff      offset of the centre in the first image axis (negaitve shifts left)
+ * @param    yoff      offset of the centre in the second image axis (negaitve shifts up)
+ * @param    iradius   radius (in fractional pixels) of the inner circle
+ * @param    oradius   radius (in fractional pixels) of the outer circle
+ * @param    dest      pointer to destination data
+ * @returns  length of the resulting vector, or number of remaining pixels if that is more understandable
+ * @note     works in place (input and output can be identical)
+ */
+
+int RingExtract32 (unsigned int *source, unsigned int Xdim, unsigned int Ydim, int xoff, int yoff, float iradius, float oradius, unsigned int *dest)
+{
+  unsigned int cenX, cenY;
+  unsigned int n = 0;
+  unsigned int x, y;
+  unsigned int irsquare = 0;
+  unsigned int orsquare = 0;
+  int vecX, vecY, vrad;
+
+  if (iradius > 0.0f)
+    {
+      irsquare = (unsigned int) (iradius*iradius + 1.0);
+    }
+  
+  if (oradius > 0.0f)
+    {
+      orsquare = (unsigned int) (oradius*oradius + 1.0);
+    }
+  
+  /* for even number, it will be the left pixel */
+  cenX = ((Xdim - 1) >> 1) + xoff;
+  cenY = ((Ydim - 1) >> 1) + yoff;
+  
+  for (y=0; y < Ydim; y++)
+    {
+      for (x=0; x < Xdim; x++)
+	{
+	  vecX = cenX - x;
+	  vecY = cenY - y;
+	  vrad = vecX*vecX + vecY*vecY;
+	  
+	  if ((unsigned int)vrad < orsquare)
+	    {
+	      /* inside the outer circle */
+	      
+	      if ((unsigned int)vrad < irsquare)
+		{
+		  /* inside the inner circle */
+		  /* do nothing */
+		}
+	      else
+		{
+		  /* the ring */       
+		  dest[n] = source[x + y*Xdim];
+		  n++;
+		}
+	    }
+	  else
+	    {
+	      /* outside the outer circle */
+	      /* do nothing */
+	    }
+	}
+    }
+  
+  return n;
+}
+
+
+/**
+ * @brief    checksum function used in the compression. It is the usual CRC16 (big endian).
+ * @param    data    pointer to the image data
+ * @param    N       size of the data
+ * @returns  the crc
+ * @note     works in SRAM2
+ */
+
+unsigned short Checksum_CRC16_32 (unsigned int *data, unsigned int N)
+{
+  unsigned int i;
+  int j;
+
+  unsigned int Syndrome = 0xffff;
+  unsigned char dataBits;
+
+  for (i=0; i < N; i++)
+    {
+      dataBits = GetByte32(i, data);
+
+      for (j=0; j<8; j++)
+        {
+          if ((dataBits & 0x80) ^ ((Syndrome & 0x8000) >> 8))
+            {
+              Syndrome = ((Syndrome << 1) ^ 0x1021) & 0xFFFF;
+            }
+          else
+            {
+              Syndrome = (Syndrome << 1) & 0xFFFF;
+            }
+          dataBits = dataBits << 1;
+        }
+    }
+  return (unsigned short)(Syndrome & 0xffff);
+}
+
+
+/**
+ * @brief    calculates mean and standard deviation for a given dataset
+ * @param[in]    data    pointer to the input data (integer)
+ * @param[in]    len     number of values to process
+ * @param[out]   pointer to the mean (float) to store the result
+ * @param[out]   pointer to the stdev (float) to store the result
+ * @note         considers Bessel correction
+ */
+
+void MeanSigma (int *data, int len, float *m, float *sig)
+{
+  int i;
+  double sum = 0;
+  double sumq = 0;
+  double mean, var, sigma;
+
+  /* avoid division by zero */
+  if (len == 0)
+    {
+      /* m and sig will be undefined */
+      return;
+    }
+  else if (len == 1)
+    {
+      *m = data[0];
+      *sig = 0.0f;
+      return;
+    }
+  
+  for (i=0; i<len; i++)
+    sum += data[i];
+
+  mean = (double)sum/len;
+
+  for (i=0; i<len; i++)
+    sumq += (data[i]-mean) * (data[i]-mean);
+
+  var = 1./(len-1.) * sumq; /* with Bessel corr. */
+  sigma = fsqrtd(var);
+
+  *m = (float) mean;
+  *sig = (float) sigma;
+
+  return;
+}
+
+
+/**
+ * @brief    calculates mean and standard deviation for a given dataset
+ * @param[in]    data    pointer to the input data (integer)
+ * @param[in]    len     number of values to process
+ * @param[out]   pointer to the mean (float) to store the result
+ * @param[out]   pointer to the stdev (float) to store the result
+ * @note         considers Bessel correction
+ */
+
+float Mean32 (int *data, int len)
+{
+  int i;
+  double sum = 0;
+  float mean;
+
+  for (i=0; i<len; i++)
+    sum += (double)data[i];
+
+  mean = (float)(sum/(double)len);
+
+  return mean;
+}
+
+
+/**
+ * @brief       Median calculation using the Algorithm by Torben Mogensen.
+ *              Based on a public domain implementation by N. Devillard.
+ * @param       data  place where the data are stored
+ * @param       len   number of values to process
+ * @returns     median of the given values
+ * @note        for an even number of elements, it returns the smaller one
+ * @note        The Torben mehtod does not need a separate buffer and it does not mix the input
+ */
+
+int Median (int *data, int len)
+{
+  int i, less, greater, equal;
+  int min, max, guess, maxltguess, mingtguess;
+
+  min = max = data[0] ;
+
+  /* find min and max */
+  for (i=1 ; i < len ; i++)
+    {
+      if (data[i] < min)
+        min=data[i];
+
+      if (data[i] > max)
+        max=data[i];
+    }
+
+  while (1)
+    {
+      /* update guesses */
+      guess = (min + max) >> 1;
+      less = 0;
+      greater = 0;
+      equal = 0;
+      maxltguess = min;
+      mingtguess = max;
+
+      /* find number of smaller and larger elements than guess */
+      for (i=0; i < len; i++)
+        {
+          if (data[i] < guess)
+            {
+              less++;
+              if (data[i] > maxltguess)
+                maxltguess = data[i];
+            }
+          else if (data[i] > guess)
+            {
+              greater++;
+              if (data[i] < mingtguess)
+                mingtguess = data[i];
+            }
+          else
+            equal++;
+        }
+
+      /* half the elements are less and half are greater, we hav found the median */
+      if ((less <= (len+1)>>1) && (greater <= (len+1)/2))
+        break;
+
+      else if (less > greater)
+        max = maxltguess ;
+      else
+        min = mingtguess;
+    }
+
+  if (less >= (len+1)>>1)
+    return maxltguess;
+  else if (less+equal >= (len+1)>>1)
+    return guess;
+
+  return mingtguess;
+}
+
+
+/**
+ * @brief       Median Absolute Deviation calculation
+ *              MAD = median(abs(x-median(x)))
+ * @param       data  place where the data are stored
+ * @param       len   number of values to process
+ * @param       median pre-calculated median
+ * @returns     MAD of the given values
+ * @note        it used the @ref Median function
+ */
+
+int MedAbsDev (int *data, int len, int median, int *swap)
+{
+  int mad, i;
+
+  for (i=0; i < len; i++)
+    swap[i] = abs(data[i] - median);
+
+  mad = Median (swap, len);
+
+  return mad;
+}
+
+
+#ifdef GROUNDSW
+int compint (const void *a, const void *b)
+{
+  return *(int *)a - *(int *)b;
+}
+#endif
+
+
+
+/**
+ * @brief	core function of the IWT
+ *              transforms one line, one scale
+ *              Implementation is based on D. Solomon, Data Compression, 4th ed, 2007, Springer
+ * @param	Input    pointer to the input data
+ * @param	Output   pointer to the output data
+ * @param	n        number of values to transform
+ * @returns     0
+ */
+
+int IntegerWaveletTransform_Core (int *Input, int *Output, unsigned int n)
+{
+  int exception = 0;
+
+  unsigned int i;
+  unsigned int odd = n % 2;
+  unsigned int k = n/2 + odd;
+
+  /*
+   *  In case of an odd number of coefficients,
+   *  we have 1 additional LP coeff, which is the last input value.
+   */
+
+  /*
+   *  HP coefficients
+   *    even case: n/2 (no truncation) consisting of n/2-1 normal coeff + 1 half coeff
+   *    odd case: only the n/2 (truncated number) normal coeff
+   */
+
+  for (i=0; i < n/2 - 1 + odd ; i++) /* normal coefficients (+odd) */
+    Output[k+i] = Input[2*i+1] - FLOORSH((Input[2*i] + Input[2*i+2]),1); /* was: floor((Input[2*i] + Input[2*i+2])/2.); */
+
+  if (odd == 0) /* in the even case the last one is a "half" HP coefficient */
+    Output[n-1] = Input[n-1] - Input[n-2];
+
+  /*
+   *  LP coefficients
+   *  even case: n/2 (no truncation)
+   *  odd case: n/2 (truncated) + 1
+   */
+
+  Output[0] = Input[0] + FLOORSH(Output[k],1); /* was: floor(Output[k]/2.); */ /* the first one is a "half" coefficient  */
+
+  for (i=1; i < k - odd; i++) /* normal coefficients */
+    Output[i] = Input[2*i] + FLOORSH((Output[k+i-1] + Output[k+i]),2); /* was: floor((Output[k+i-1] + Output[k+i])/4.); */ /* integer truncation */
+
+  if (odd) /* in the odd case the last one is a "half" LP coefficient */
+    Output[k-1] = Input[n-1] + FLOORSH(Output[n-1],1); /* was: floor(Output[n-1]/2.); */
+
+  return exception;
+}
+
+
+/**
+ * @brief	top-level function applying the 1D IWT
+ *              applies standard decomposition
+ * @param	Input    pointer to the input data
+ * @param	Output   pointer to the output data
+ * @param	n        number of values to transform
+ * @returns     0
+ * @warning     overwrites the input data
+ */
+
+int IntegerWaveletTransform_Decompose (int *Input, int *Output, unsigned int n)
+{
+  int exception = 0;
+
+  int i, size;
+
+  for (size = n; size > 1; )
+    {
+      IntegerWaveletTransform_Core (Input, Output, size); /* transform */
+
+      for (i=0; i < size; i++) Input[i] = Output[i]; /* copy back */
+
+      size = (size % 2 ? size/2 + 1 : size/2); /* adjust size */
+    }
+
+  for (i=0; i < size; i++) Output[i] = Input[i]; /* copy out */
+
+  return exception;
+}
+
+
+/**
+ * @brief       reversible differencing of a buffer
+ * @param       buf     an integer pointer to a buffer
+ * @param       words   number of values to process
+ *
+ * Differences are made in place, from bottom to top
+ * @note        Is applied in place.
+ */
+
+void Delta32 (int *buf, int words)
+{
+  int i;
+
+  for (i=words-1; i>0; i--)
+    {
+      buf[i] = (buf[i] - buf[i-1]);
+    }
+
+  return;
+}
+
+
+/**
+ * @brief       fold negative values into positive, interleaving the positive ones
+ * @param       buffer     an integer pointer to a buffer
+ * @param       N          number of values to process
+ *
+ * @note        Is applied in place.
+ */
+
+void Map2Pos32 (int *buffer, unsigned int N)
+{
+  unsigned int i;
+
+  for (i=0; i < N; i++)
+    {
+      if (buffer[i] < 0)
+        buffer[i] = ((0xFFFFFFFF - buffer[i]) << 1) + 1; /* NOTE: the integer overflow is intended */
+      else
+        buffer[i] = buffer[i] << 1;
+    }
+
+  return;
+}
+
+
+/**
+ * @brief       Transpose a 2D array (matrix)
+ * @param       src       an integer pointer to a buffer
+ * @param       src_xdim  length of first axis
+ * @param       src_ydim  length of second axis
+ * @param       dest      pointer to the output buffer
+ */
+
+void Transpose2Di (int *src, unsigned int src_xdim, unsigned int src_ydim, int *dest)
+{
+  unsigned int i,j;
+
+  for (j=0; j < src_ydim; j++)
+    {
+      for (i=0; i < src_xdim; i++)
+        {
+          dest[j+i*src_ydim] = src[i+j*src_xdim];
+        }
+    }
+  return;
+}
+
+
+/**
+ * @brief	differentiate a data cube from end to start, leaving the first frame as keyframe
+ * @param	fdata      pointer to the @ref ScienceBuf structure holding the buffer to be processed and carrying the correct dimensions
+ * @returns     number of difference frames or 0 if the input dimensions were wrong
+ *
+ * @note        this is not a difference of each frame to the keyframe, but a differentiation
+ * @note        only works on integer datatype
+ */
+
+int FrameSubtract(struct ScienceBuf *fdata)
+{
+  unsigned int p, f, framelen;
+
+  framelen = fdata->xelements * fdata->yelements;
+
+  if (fdata->xelements * fdata->yelements * fdata->zelements == 0)
+    return 0;
+
+  if (fdata->zelements == 1)
+    return 0;
+
+  /* differentiate in place from end to start of file */
+  for (f=fdata->zelements-1; f > 0; f--)
+    for (p=0; p < framelen; p++)
+      ((int *)fdata->data)[f*framelen + p] = ((int *)fdata->data)[f*framelen + p] - ((int *)fdata->data)[(f-1)*framelen + p];
+
+  return fdata->zelements - f; /* should return frames - 1	  */
+}
+
+/**
+ * @brief	run the data processing chain once for a given product
+ * @param	source      pointer to the @ref ScienceBuf structure holding a buffer with sufficient size and carrying the correct dimensions
+ * @param	cestruct    pointer to the @ref ComprEntStructure which has all the required settings and buffers properly initialized
+ * @param	CeKey       the compression entity key, the processing recipe. Take from CHEOPS-UVIE-INST-ICD-003
+ * @param	compressed  pointer to the @ref CompressedBuf structure holding a buffer with sufficient size
+ * @param	location    decide whether you want the result back in the source buffer @ref SRCBUF (=0) or in the compressed buffer @ref DESTBUF (=1)
+ * @param	compressed  pointer to a @ref ScienceBuf structure holding a buffer that will be used as a swap buffer
+ *
+ * @returns     0
+ *
+ * @note
+ */
+
+int Compress(struct ScienceBuf *source, struct ComprEntStructure *cestruct, unsigned int CeKey, struct CompressedBuf *compressed, int location, struct ScienceBuf *swapbuffer)
+{
+  int status = 0;
+  unsigned int i, j, w;
+  unsigned int product, preproc, lossy1, lossy2, lossy3, decorr, llc;
+
+  struct CrIaSib sib;
+  struct SibPhotometry *sibPhotometry;
+  struct ScienceBuf photData;
+  unsigned short sibOut, newSibOut, sibIn, sibSizeWin, sibNWin, sibSizeFull, sibNFull;
+  unsigned short colmask; /* for column selection in LDK and RDK */
+  unsigned short sdbstate;
+  unsigned long int xibOffset;
+  
+  unsigned int local_start_x, local_start_y;
+  float productRadius = 0.0f;
+  float ampl;
+  
+  void *comprdata = compressed->data;
+
+  /* local handle of frame elements */
+  unsigned int FrameElements;
+
+  struct StatValues stat;
+  struct Coordinates Coord;
+  struct SibHeader *sibHeader;
+  struct SibCentroid *sibCentroid;  
+  unsigned short follow;
+  unsigned char stackGroup = 1; /* Mantis 1909 */
+
+  unsigned short ccProduct, ccStep;
+  unsigned short evt_data[2];
+  unsigned char sdpCrc;
+
+  CrIaCopy(CCPRODUCT_ID, &ccProduct);
+  
+  ccStep = ccProduct | CC_COMPR_STARTED;
+  CrIaPaste(CCSTEP_ID, &ccStep);
+
+  /* prepare compressed metadata, may be overwritten during lossy steps */
+  compressed->datatype  = source->datatype;
+  compressed->xelements = source->xelements;
+  compressed->yelements = source->yelements;
+  compressed->zelements = source->zelements;
+  compressed->nelements = source->nelements;
+  compressed->lossyCrc = 0;
+  compressed->llcsize = 0;
+
+  /* disentangle the CeKey  */
+  product = CeKey & SDP_PRODUCT;
+  preproc = CeKey & SDP_PREPROC;
+  lossy1  = CeKey & SDP_LOSSY1;
+  lossy2  = CeKey & SDP_LOSSY2;
+  lossy3  = CeKey & SDP_LOSSY3;
+  decorr  = CeKey & SDP_DECORR;
+  llc     = CeKey & SDP_LLC;
+
+  SDPRINT("+--------------+\n");
+  SDPRINT("| Compression: |\n");
+  SDPRINT("+--------------+\n");
+  SDPRINT("  CeKey: Product=%01x PP=%01x L1=%01x L2=%01x D=%01x LL=%01x\n", product >> 28, preproc >> 24, lossy1 >> 20, lossy2 >> 16, decorr >> 8, llc);
+  SDPRINT("  Datatype: %x Elem=%d X=%d Y=%d Z=%d\n", source->datatype, source->nelements, \
+          source->xelements, source->yelements, source->zelements);
+
+  /*********************/
+  /*      Product      */
+  /*********************/
+
+  /* carry out product-specific setup stuff */
+
+  /* get state of SDB (WIN or FULL) */
+  CrIaCopy (SDBSTATE_ID, &sdbstate);
+
+  /* get SibOut */
+  CrIaCopy(SIBOUT_ID, &sibOut);
+  CrIaCopy(SIBIN_ID, &sibIn);
+  CrIaCopy(SIBSIZEWIN_ID, &sibSizeWin);
+  CrIaCopy(SIBNWIN_ID, &sibNWin);
+  CrIaCopy(SIBSIZEFULL_ID, &sibSizeFull);
+  CrIaCopy(SIBNFULL_ID, &sibNFull);
+
+  SDPRINT("*** Compress: SIBOUT = %d\n", sibOut);
+  
+  /* Mantis 2212: We need to estimate the bias before we enter the chain 
+     for the case of NLC2. This is done by reading each LOS frame and writing 
+     the bias back to the SIB phot->annulus2.
+     Note that NLC2 is only available in window mode */
+  
+  if ((preproc == PREPROC_NLC2) && (sdbstate == CrIaSdb_CONFIG_WIN))
+    {
+      /* for each frame get LOS, calc median and write to the SIB */
+      for (i=0; i < source->zelements; i++)
+	{
+	  /* setup SIB structure */
+	  if (CrIaSetupSibWin (&sib, sibOut, cestruct->SemWindowSizeX, cestruct->SemWindowSizeY) == 0)
+	    {
+	      /* error gets reported by setup function */
+	      break;
+	    }
+	      
+	  sibHeader = (struct SibHeader *) sib.Header;
+	  sibPhotometry = (struct SibPhotometry *) sib.Photometry;
+	      
+	  if (GetFpmSide(sibHeader->CcdTimingScriptId) == FPM_SIDE_B)
+	    {
+	      status = CropCopyFromSibAndUnpack (sib.Lsm, LSM_XDIM, sib.Ydim, IMGMRG_LOS_W, sib.Ydim, IMGMRG_LDK_W + IMGMRG_LBLK_W, 0, (unsigned int *)source->data);
+	    }
+	  else
+	    {
+	      status = CropCopyFromSibAndUnpack (sib.Lsm, LSM_XDIM, sib.Ydim, IMGMRG_LOS_W, sib.Ydim, 0, 0, (unsigned int *)source->data);
+	    }
+	      
+	  if (status == -1) /* could not crop */
+	    sibPhotometry->annulus2 = 0.0f;
+	      
+	  /* calculate the bias here */
+	  sibPhotometry->annulus2 = (float) Median ((int *)source->data, IMGMRG_LOS_W * source->yelements);  
+	      
+	  if (i < source->zelements - 1) /* don't update for the last frame */
+	    {
+	      /* move to the next sibOut in sequence */
+	      xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)sibAddressWin);
+	      newSibOut = updateXibFwd((unsigned int)sibOut, (unsigned int)sibIn, xibOffset, (unsigned int)sibSizeWin, (unsigned int)sibNWin, SIBOUT_WIN_XIB);
+
+	      /* NOTE: if SIBOUT couldn't be incremented, the last one is cloned */
+	      
+	      sibOut = newSibOut;
+	    }
+        }
+      
+      /* sibOut has been altered and needs to be reloaded */
+      CrIaCopy(SIBOUT_ID, &sibOut);      
+    }
+    
+  
+  /* 
+     Here the data processing chain starts 
+  */
+  
+  switch (product)
+    {
+    case PRODUCT_HEADERS :
+
+      ccStep = ccProduct | CC_PRODUCT_HEADERS;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      /* get state of SDB (WIN or FULL) */
+      CrIaCopy (SDBSTATE_ID, &sdbstate);
+
+      /* as input, we need SEM window sizes and stacking order to calculate SIB structure layout */
+      SibToFlatHeaders (source, cestruct);
+      
+      /* from here on, headers are treated as X x Z array */
+      source->datatype = DATATYPE_UINT32;
+      source->xelements = FLAT_HEADER_VALUES;
+      source->yelements = 1;
+      source->nelements = source->xelements * source->yelements * source->zelements;
+      compressed->datatype = source->datatype;
+      compressed->xelements = source->xelements;
+      compressed->yelements = source->yelements;
+      compressed->nelements = source->nelements;
+      
+      SDPRINT("source Input data are: %d %d .. %d\n", ((unsigned int *)source->data)[0], ((unsigned int *)source->data)[1], ((unsigned int *)source->data)[source->nelements-1]);
+      break;
+
+    case PRODUCT_STACKED :
+
+      ccStep = ccProduct | CC_PRODUCT_STACKED;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      productRadius = cestruct->SemWindowSizeX / 2;
+      
+      for (i=0; i < source->zelements; i++)
+        {
+          /* setup SIB structure using current sibOut (the compression is the SIB consumer, thus it reads from "out") */
+          status = 0;
+          if (sdbstate == CrIaSdb_CONFIG_WIN)
+            status = CrIaSetupSibWin (&sib, sibOut, cestruct->SemWindowSizeX, cestruct->SemWindowSizeY);
+
+          if (sdbstate == CrIaSdb_CONFIG_FULL)
+            status = CrIaSetupSibFull (&sib, sibOut);
+
+          if (status == 0)
+            {
+              /* error gets reported by setup function */
+              break;
+            }
+
+          /* we need to initialize the SibPhotometry values in all cases, but we must not in NLC2 */
+	  if (preproc != PREPROC_NLC2)
+	    {
+	      sibPhotometry = (struct SibPhotometry *) sib.Photometry;
+	      sibPhotometry->centrum = 0.0f;
+	      sibPhotometry->annulus1 = 0.0f;
+	      sibPhotometry->annulus2 = 0.0f;
+	    }
+	      
+          /* get the expos data into the local source buffer */
+          FrameElements = source->xelements * source->yelements;
+#if (__sparc__)
+	  UnpackU16ToU32 ((uint32_t *)sib.Expos, FrameElements, &(((uint32_t *)source->data)[i*FrameElements]), UNPACK_NOSWAP);
+#else
+	  UnpackU16ToU32 ((uint32_t *)sib.Expos, FrameElements, &(((uint32_t *)source->data)[i*FrameElements]), UNPACK_SWAP);
+#endif
+
+	  if (i < source->zelements - 1) /* don't update for the last frame */
+	    {
+	      /* move to the next sibOut in sequence */
+	      if (sdbstate == CrIaSdb_CONFIG_WIN)
+		{
+		  xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)sibAddressWin);
+		  newSibOut = updateXibFwd((unsigned int)sibOut, (unsigned int)sibIn, xibOffset, (unsigned int)sibSizeWin, (unsigned int)sibNWin, SIBOUT_WIN_XIB);
+		}
+	      else
+		{
+		  xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)sibAddressFull);
+		  newSibOut = updateXibFwd((unsigned int)sibOut, (unsigned int)sibIn, xibOffset, (unsigned int)sibSizeFull, (unsigned int)sibNFull, SIBOUT_FULL_XIB);
+		}
+
+	      /* NOTE: if SIBOUT couldn't be incremented, the last one is cloned */
+
+	      sibOut = newSibOut;
+	    }
+        }
+
+      SDPRINT("source Input data are at %lx: %d %d .. %d\n", (unsigned long int)source->data, ((unsigned int *)source->data)[0], ((unsigned int *)source->data)[1], ((unsigned int *)source->data)[source->nelements-1]);
+
+      break;
+
+
+    case PRODUCT_IMAGETTES :
+
+      ccStep = ccProduct | CC_PRODUCT_IMAGETTES;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      /* Mantis 1909: set group stacking order */
+      CrIaCopy (SDPIMGTTSTCKORDER_ID, &stackGroup);
+      if (stackGroup > source->zelements)
+	stackGroup = source->zelements;
+      
+      productRadius = cestruct->Imagettes_ApertureSizeX / 2;
+      
+      /* get state of SDB (WIN or FULL) */
+      CrIaCopy (SDBSTATE_ID, &sdbstate);
+
+      for (i=0; i < source->zelements; i++)
+        {
+          /* setup SIB structure using current sibOut (the compression is the SIB consumer, thus it reads from "out") */
+          status = 0;
+          if (sdbstate == CrIaSdb_CONFIG_WIN)
+            status = CrIaSetupSibWin (&sib, sibOut, cestruct->SemWindowSizeX, cestruct->SemWindowSizeY);
+
+          if (sdbstate == CrIaSdb_CONFIG_FULL)
+            status = CrIaSetupSibFull (&sib, sibOut);
+
+          if (status == 0)
+            {
+              /* error gets reported by setup function */
+              break;
+            }
+
+	  /* use target location and sem offsets to calculate the ROI 
+	     the SEM window size is taken from the SIB, the POS is taken from the DP */
+
+	  sibCentroid = (struct SibCentroid *) sib.Centroid;
+	    
+	  Coord.TargetLocX_I = sibCentroid->targetLocX;
+	  Coord.TargetLocY_I = sibCentroid->targetLocY;
+	  Coord.SemWinSizeX_L = sib.Xdim;
+	  Coord.SemWinSizeY_L = sib.Ydim;
+	  Coord.SemWinPosX_L = (unsigned int) cestruct->SemWindowPosX;
+	  Coord.SemWinPosY_L = (unsigned int) cestruct->SemWindowPosY;
+	  Coord.SubWinSizeX_L = cestruct->Imagettes_ApertureSizeX;
+	  Coord.SubWinSizeY_L = cestruct->Imagettes_ApertureSizeY;
+	  Coord.StartLocationX_L = 0;
+	  Coord.StartLocationY_L = 0;
+	  
+	  getStartCoord (&Coord);
+	  
+	  local_start_x = Coord.StartLocationX_L;
+	  local_start_y = Coord.StartLocationY_L;
+
+	  CrIaCopy(SDPIMGTTSTRAT_ID, &follow);
+	  
+	  if (follow == STRAT_MOVING)
+	    {		
+	      /* apply offset only if valid */
+	      if ((sibCentroid->validityStatus == CEN_VAL_WINDOW) || (sibCentroid->validityStatus == CEN_VAL_FULL)) 
+		{
+		  local_start_x -= roundf(sibCentroid->offsetX / 100.0f);
+		  local_start_y -= roundf(sibCentroid->offsetY / 100.0f);
+		}
+	    }
+	  
+	  status = CropCopyFromSibAndUnpack (sib.Expos, sib.Xdim, sib.Ydim, cestruct->Imagettes_ApertureSizeX, cestruct->Imagettes_ApertureSizeY, local_start_x, local_start_y, &(((unsigned int *)source->data)[i * cestruct->Imagettes_ApertureSizeX * cestruct->Imagettes_ApertureSizeY]));
+	  
+	  if (status == -1) /* could not crop */
+	    return 0;	
+	  
+	  if (i < source->zelements - 1) /* don't update for the last frame */
+	    {
+	      /* move to the next sibOut in sequence */
+	      if (sdbstate == CrIaSdb_CONFIG_WIN)
+		{
+		  xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)sibAddressWin);
+		  newSibOut = updateXibFwd((unsigned int)sibOut, (unsigned int)sibIn, xibOffset, (unsigned int)sibSizeWin, (unsigned int)sibNWin, SIBOUT_WIN_XIB);
+		}
+	      else
+		{
+		  xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)sibAddressFull);
+		  newSibOut = updateXibFwd((unsigned int)sibOut, (unsigned int)sibIn, xibOffset, (unsigned int)sibSizeFull, (unsigned int)sibNFull, SIBOUT_FULL_XIB);
+		}
+
+	      /* NOTE: if SIBOUT couldn't be incremented, the last one is cloned */
+
+	      sibOut = newSibOut;
+	    }
+        }
+      
+      /* adjust product sizes */
+      source->xelements = cestruct->Imagettes_ApertureSizeX;
+      source->yelements = cestruct->Imagettes_ApertureSizeY;
+      source->nelements = source->xelements * source->yelements * source->zelements;
+
+      SDPRINT("source Input data are: %d %d .. %d\n", ((unsigned int *)source->data)[0], ((unsigned int *)source->data)[1], ((unsigned int *)source->data)[source->nelements-1]);
+
+      break;
+
+
+    case PRODUCT_MRGLOS :
+
+      ccStep = ccProduct | CC_PRODUCT_MRGLOS;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      /* Mantis 1909: set group stacking order */
+      CrIaCopy (SDPLOSSTCKORDER_ID, &stackGroup);
+      if (stackGroup > source->zelements)
+	stackGroup = source->zelements;
+      
+      for (i=0; i < source->zelements; i++)
+        {
+          /* setup SIB structure */
+          if (CrIaSetupSibWin (&sib, sibOut, cestruct->SemWindowSizeX, cestruct->SemWindowSizeY) == 0)
+            {
+              /* error gets reported by setup function */
+              break;
+            }
+
+	  sibHeader = (struct SibHeader *) sib.Header;
+	  
+	  if (GetFpmSide(sibHeader->CcdTimingScriptId) == FPM_SIDE_B)
+	    {
+	      status = CropCopyFromSibAndUnpack (sib.Lsm, LSM_XDIM, sib.Ydim, IMGMRG_LOS_W, sib.Ydim, IMGMRG_LDK_W + IMGMRG_LBLK_W, 0, &(((unsigned int *)source->data)[i * IMGMRG_LOS_W * sib.Ydim]));
+	    }
+	  else
+	    {
+	      status = CropCopyFromSibAndUnpack (sib.Lsm, LSM_XDIM, sib.Ydim, IMGMRG_LOS_W, sib.Ydim, 0, 0, &(((unsigned int *)source->data)[i * IMGMRG_LOS_W * sib.Ydim]));	      
+	    }
+
+	  if (status == -1) /* could not crop */
+	    return 0;
+	  
+	  if (i < source->zelements - 1) /* don't update for the last frame */
+	    {
+	      /* move to the next sibOut in sequence */
+	      xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)sibAddressWin);
+	      newSibOut = updateXibFwd((unsigned int)sibOut, (unsigned int)sibIn, xibOffset, (unsigned int)sibSizeWin, (unsigned int)sibNWin, SIBOUT_WIN_XIB);
+
+	      /* NOTE: if SIBOUT couldn't be incremented, the last one is cloned */
+	      
+	      sibOut = newSibOut;
+	    }
+        }
+
+      /* adjust product sizes */
+      source->xelements = IMGMRG_LOS_W;
+      source->nelements = source->xelements * source->yelements * source->zelements;
+
+      if (source->nelements >= 2)
+	SDPRINT("source Input data are: %d %d .. %d\n", ((unsigned int *)source->data)[0], ((unsigned int *)source->data)[1], ((unsigned int *)source->data)[source->nelements-1]);
+
+      break;
+
+    case PRODUCT_MRGLDK :
+
+      ccStep = ccProduct | CC_PRODUCT_MRGLDK;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      /* Mantis 1909: set group stacking order */
+      CrIaCopy (SDPLDKSTCKORDER_ID, &stackGroup);
+      if (stackGroup > source->zelements)
+	stackGroup = source->zelements;
+      
+      for (i=0; i < source->zelements; i++)
+        {
+          /* setup SIB structure */
+          if (CrIaSetupSibWin (&sib, sibOut, cestruct->SemWindowSizeX, cestruct->SemWindowSizeY) == 0)
+            {
+              /* error gets reported by setup function */
+              break;
+            }
+
+	  sibHeader = (struct SibHeader *) sib.Header;
+	  
+	  if (GetFpmSide(sibHeader->CcdTimingScriptId) == FPM_SIDE_B)
+	    {
+	      status = CropCopyFromSibAndUnpack (sib.Lsm, LSM_XDIM, sib.Ydim, IMGMRG_LDK_W, sib.Ydim, 0, 0, &(((unsigned int *)source->data)[i * IMGMRG_LDK_W * sib.Ydim]));
+	    }
+	  else
+	    {
+	      status = CropCopyFromSibAndUnpack (sib.Lsm, LSM_XDIM, sib.Ydim, IMGMRG_LDK_W, sib.Ydim, IMGMRG_LOS_W + IMGMRG_LBLK_W, 0, &(((unsigned int *)source->data)[i * IMGMRG_LDK_W * sib.Ydim]));
+	    }
+
+	  if (status == -1) /* could not crop */
+	    return 0;
+	  
+	  if (i < source->zelements - 1) /* don't update for the last frame */
+	    {
+	      /* move to the next sibOut in sequence */
+	      xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)sibAddressWin);
+	      newSibOut = updateXibFwd((unsigned int)sibOut, (unsigned int)sibIn, xibOffset, (unsigned int)sibSizeWin, (unsigned int)sibNWin, SIBOUT_WIN_XIB);
+
+	      /* NOTE: if SIBOUT couldn't be incremented, the last one is cloned */
+
+	      sibOut = newSibOut;
+	    }
+        }
+
+      /* and apply the column mask (in place) */
+      colmask = cestruct->ImgMrgLDK_ColumnSelectionMask;
+      ColSelect16_32 ((unsigned int *)source->data, source->yelements * source->zelements, colmask, (unsigned int *)source->data);
+      
+      /* adjust product sizes */
+      source->xelements = CountOnes16 (colmask);
+      source->nelements = source->xelements * source->yelements * source->zelements;
+
+      break;
+
+    case PRODUCT_MRGLBLK :
+
+      ccStep = ccProduct | CC_PRODUCT_MRGLBLK;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      /* Mantis 1909: set group stacking order */
+      CrIaCopy (SDPLBLKSTCKORDER_ID, &stackGroup);
+      if (stackGroup > source->zelements)
+	stackGroup = source->zelements;
+      
+      for (i=0; i < source->zelements; i++)
+        {
+          /* setup SIB structure */
+          if (CrIaSetupSibWin (&sib, sibOut, cestruct->SemWindowSizeX, cestruct->SemWindowSizeY) == 0)
+            {
+              /* error gets reported by setup function */
+              break;
+            }
+
+	  sibHeader = (struct SibHeader *) sib.Header;
+	  
+	  if (GetFpmSide(sibHeader->CcdTimingScriptId) == FPM_SIDE_B)
+	    {
+	      status = CropCopyFromSibAndUnpack (sib.Lsm, LSM_XDIM, sib.Ydim, IMGMRG_LBLK_W, sib.Ydim, IMGMRG_LDK_W, 0, &(((unsigned int *)source->data)[i * IMGMRG_LBLK_W * sib.Ydim]));
+	    }
+	  else
+	    {
+	      status = CropCopyFromSibAndUnpack (sib.Lsm, LSM_XDIM, sib.Ydim, IMGMRG_LBLK_W, sib.Ydim, IMGMRG_LOS_W, 0, &(((unsigned int *)source->data)[i * IMGMRG_LBLK_W * sib.Ydim]));
+	    }
+
+	  if (status == -1) /* could not crop */
+	    return 0;
+	  
+	  if (i < source->zelements - 1) /* don't update for the last frame */
+	    {
+	      /* move to the next sibOut in sequence */
+	      xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)sibAddressWin);
+	      newSibOut = updateXibFwd((unsigned int)sibOut, (unsigned int)sibIn, xibOffset, (unsigned int)sibSizeWin, (unsigned int)sibNWin, SIBOUT_WIN_XIB);
+
+	      /* NOTE: if SIBOUT couldn't be incremented, the last one is cloned */
+
+	      sibOut = newSibOut;
+	    }
+	}
+      
+      /* adjust product sizes */
+      source->xelements = IMGMRG_LBLK_W;
+      source->nelements = source->xelements * source->yelements * source->zelements;
+
+      break;
+
+    case PRODUCT_MRGRDK :
+
+      ccStep = ccProduct | CC_PRODUCT_MRGRDK;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      /* Mantis 1909: set group stacking order */
+      CrIaCopy (SDPRDKSTCKORDER_ID, &stackGroup);
+      if (stackGroup > source->zelements)
+	stackGroup = source->zelements;
+
+      for (i=0; i < source->zelements; i++)
+        {
+          /* setup SIB structure */
+          if (CrIaSetupSibWin (&sib, sibOut, cestruct->SemWindowSizeX, cestruct->SemWindowSizeY) == 0)
+            {
+              /* error gets reported by setup function */
+              break;
+            }
+
+	  sibHeader = (struct SibHeader *) sib.Header;
+	  
+	  if (GetFpmSide(sibHeader->CcdTimingScriptId) == FPM_SIDE_B)
+	    {
+	      status = CropCopyFromSibAndUnpack (sib.Rsm, RSM_XDIM, sib.Ydim, IMGMRG_RDK_W, sib.Ydim, IMGMRG_RBLK_W, 0, &(((unsigned int *)source->data)[i * IMGMRG_RDK_W * sib.Ydim]));
+	    }
+	  else
+	    {
+	      status = CropCopyFromSibAndUnpack (sib.Rsm, RSM_XDIM, sib.Ydim, IMGMRG_RDK_W, sib.Ydim, 0, 0, &(((unsigned int *)source->data)[i * IMGMRG_RDK_W * sib.Ydim]));
+	    }
+
+	  if (status == -1) /* could not crop */
+	    return 0;
+
+	  if (i < source->zelements - 1) /* don't update for the last frame */
+	    {
+	      /* move to the next sibOut in sequence */
+	      xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)sibAddressWin);
+	      newSibOut = updateXibFwd((unsigned int)sibOut, (unsigned int)sibIn, xibOffset, (unsigned int)sibSizeWin, (unsigned int)sibNWin, SIBOUT_WIN_XIB);
+
+	      /* NOTE: if SIBOUT couldn't be incremented, the last one is cloned */
+
+	      sibOut = newSibOut;
+	    }
+        }
+
+      /* and apply the column mask (in place) */
+      colmask = cestruct->ImgMrgRDK_ColumnSelectionMask;
+      ColSelect16_32 ((unsigned int *)source->data, source->yelements * source->zelements, colmask, (unsigned int *)source->data);
+
+      /* adjust product sizes */
+      source->xelements = CountOnes16 (colmask);
+      source->nelements = source->xelements * source->yelements * source->zelements;
+
+      break;
+
+    case PRODUCT_MRGRBLK :
+
+      ccStep = ccProduct | CC_PRODUCT_MRGRBLK;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      /* Mantis 1909: set group stacking order */
+      CrIaCopy (SDPRBLKSTCKORDER_ID, &stackGroup);
+      if (stackGroup > source->zelements)
+	stackGroup = source->zelements;
+      
+      for (i=0; i < source->zelements; i++)
+        {
+          /* setup SIB structure */
+          if (CrIaSetupSibWin (&sib, sibOut, cestruct->SemWindowSizeX, cestruct->SemWindowSizeY) == 0)
+            {
+              /* error gets reported by setup function */
+              break;
+            }
+
+	  sibHeader = (struct SibHeader *) sib.Header;
+	  
+	  if (GetFpmSide(sibHeader->CcdTimingScriptId) == FPM_SIDE_B)
+	    {
+	      status = CropCopyFromSibAndUnpack (sib.Rsm, RSM_XDIM, sib.Ydim, IMGMRG_RBLK_W, sib.Ydim, 0, 0, &(((unsigned int *)source->data)[i * IMGMRG_RBLK_W * sib.Ydim]));
+	    }
+	  else
+	    {
+	      status = CropCopyFromSibAndUnpack (sib.Rsm, RSM_XDIM, sib.Ydim, IMGMRG_RBLK_W, sib.Ydim, IMGMRG_RDK_W, 0, &(((unsigned int *)source->data)[i * IMGMRG_RBLK_W * sib.Ydim]));
+	    }
+
+	  if (status == -1) /* could not crop */
+	    return 0; 
+
+	  if (i < source->zelements - 1) /* don't update for the last frame */
+	    {
+	      /* move to the next sibOut in sequence */
+	      xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)sibAddressWin);
+	      newSibOut = updateXibFwd((unsigned int)sibOut, (unsigned int)sibIn, xibOffset, (unsigned int)sibSizeWin, (unsigned int)sibNWin, SIBOUT_WIN_XIB);
+
+	      /* NOTE: if SIBOUT couldn't be incremented, the last one is cloned */
+	      
+	      sibOut = newSibOut;
+	    }
+        }
+
+      /* adjust product sizes */
+      source->xelements = IMGMRG_RBLK_W;
+      source->nelements = source->xelements * source->yelements * source->zelements;
+
+      break;
+
+    case PRODUCT_MRGTDK :
+
+      ccStep = ccProduct | CC_PRODUCT_MRGTDK;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      /* Mantis 1909: set group stacking order */
+      CrIaCopy (SDPTDKSTCKORDER_ID, &stackGroup);
+      if (stackGroup > source->zelements)
+	stackGroup = source->zelements;
+      
+      for (i=0; i < source->zelements; i++)
+        {
+          /* setup SIB structure */
+          if (CrIaSetupSibWin (&sib, sibOut, cestruct->SemWindowSizeX, cestruct->SemWindowSizeY) == 0)
+            {
+              /* error gets reported by setup function */
+              break;
+            }
+
+	  /* Mantis 2091: the image is read bottom up, so the TDK comes before the TOS */
+	  status = CropCopyFromSibAndUnpack (sib.Tm, sib.Xdim, TM_YDIM, sib.Xdim, IMGMRG_TDK_H, 0, 0, &(((unsigned int *)source->data)[i * sib.Xdim * IMGMRG_TDK_H]));
+
+	  if (status == -1) /* could not crop */
+	    return 0; 
+	  
+	  if (i < source->zelements - 1) /* don't update for the last frame */
+	    {
+	      /* move to the next sibOut in sequence */
+	      xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)sibAddressWin);
+	      newSibOut = updateXibFwd((unsigned int)sibOut, (unsigned int)sibIn, xibOffset, (unsigned int)sibSizeWin, (unsigned int)sibNWin, SIBOUT_WIN_XIB);
+
+	      /* NOTE: if SIBOUT couldn't be incremented, the last one is cloned */
+	      
+	      sibOut = newSibOut;
+	    }
+	}
+
+      /* adjust product sizes */
+      source->yelements = IMGMRG_TDK_H;
+      source->nelements = source->xelements * source->yelements * source->zelements;
+
+      if (source->nelements >= 2)
+	SDPRINT("source Input data are: %d %d .. %d\n", ((unsigned int *)source->data)[0], ((unsigned int *)source->data)[1], ((unsigned int *)source->data)[source->nelements-1]);
+
+      break;
+
+    case PRODUCT_MRGTOS :
+
+      ccStep = ccProduct | CC_PRODUCT_MRGTOS;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      /* Mantis 1909: set group stacking order */
+      CrIaCopy (SDPTOSSTCKORDER_ID, &stackGroup);
+      if (stackGroup > source->zelements)
+	stackGroup = source->zelements;
+      
+      for (i=0; i < source->zelements; i++)
+        {
+          /* setup SIB structure */
+          if (CrIaSetupSibWin (&sib, sibOut, cestruct->SemWindowSizeX, cestruct->SemWindowSizeY) == 0)
+            {
+              /* error gets reported by setup function */
+              break;
+            }
+	  
+	  /* Mantis 2091: the image is read bottom up, so the TOS comes after the TDK */
+	  status = CropCopyFromSibAndUnpack (sib.Tm, sib.Xdim, TM_YDIM, sib.Xdim, IMGMRG_TOS_H, 0, IMGMRG_TDK_H, &(((unsigned int *)source->data)[i * sib.Xdim * IMGMRG_TOS_H]));
+
+	  if (status == -1) /* could not crop */
+	    return 0;
+	  
+	  if (i < source->zelements - 1) /* don't update for the last frame */
+	    {
+	      /* move to the next sibOut in sequence */
+	      xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)sibAddressWin);
+	      newSibOut = updateXibFwd((unsigned int)sibOut, (unsigned int)sibIn, xibOffset, (unsigned int)sibSizeWin, (unsigned int)sibNWin, SIBOUT_WIN_XIB);
+
+	      /* NOTE: if SIBOUT couldn't be incremented, the last one is cloned */
+	      
+	      sibOut = newSibOut;
+	    }
+	}
+
+      /* adjust product sizes */
+      source->yelements = IMGMRG_TOS_H;
+      source->nelements = source->xelements * source->yelements * source->zelements;
+
+      if (source->nelements >= 2)
+	SDPRINT("source Input data are: %d %d .. %d\n", ((unsigned int *)source->data)[0], ((unsigned int *)source->data)[1], ((unsigned int *)source->data)[source->nelements-1]);
+
+      break;
+
+    case PRODUCT_DISABLE :
+    default :
+
+      ccStep = ccProduct | CC_PRODUCT_DISABLE;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+      
+      source->xelements = 0;
+      source->yelements = 0;
+      source->zelements = 0;
+      source->nelements = 0;
+
+      break;
+    }
+
+  /***************************************************************
+   Run through the different steps of the science data processing
+   Each step assumes to have the input data in the source buffer.
+   If a step finishes with data in the dest buffer, it needs to
+   switch the pointers afterwards. The last step, however, shall
+   leave its output in the location desired by parameter.
+   Note that all of this assumes, that the source can be
+   overwritten!
+  ****************************************************************/
+
+  /*********************/
+  /*      Preproc      */
+  /*********************/
+
+  switch (preproc)
+    {
+      
+    case PREPROC_NLC     :
+
+      ccStep = ccProduct | CC_PREPROC_NLC;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+      
+      SDPRINT("- carrying out the old nonlinearity correction\n");
+      
+      NlcSplineCorr28 ((unsigned int *)(source->data), source->nelements);     
+
+      break;
+
+    case PREPROC_NLC2    :
+
+      ccStep = ccProduct | CC_PREPROC_NLC2;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+      
+      SDPRINT("- carrying out the new nonlinearity correction NLC2\n");
+
+      if (sdbstate != CrIaSdb_CONFIG_WIN)
+	{
+	  /* NLC2 is only effective for window mode */
+	  break;
+	}
+
+      /* NLC2 block */
+      { 
+	float ftemp;
+	unsigned short utemp16;
+	unsigned int framelen = source->xelements * source->yelements;
+	double nlcBias0, nlcBias, nlcGain0, nlcGain;
+	
+	union
+	{
+	  unsigned int ui;
+	  float f;
+	} VoltFeeVss, VoltFeeVrd, VoltFeeVod, VoltFeeVog, TempFeeCcd; 
+
+	unsigned char readoutFreq;
+	
+	/* the NLC2 reads the measured bias from the SibPhotometry values,
+	   so we have to again fetch the SIB structure of each frame and loop over the frames,
+	   like it was done in the PRODUCT step (and in the initial NLC2 step) */ 
+	
+	CrIaCopy(SIBOUT_ID, &sibOut); /* sibOut was modified in the PRODUCT step, we fetch it again */
+	
+	for (i=0; i < source->zelements; i++)
+	  {
+	    /* setup SIB structure using current sibOut (the compression is the SIB consumer, thus it reads from "out") */
+	    status = 0;
+	    if (sdbstate == CrIaSdb_CONFIG_WIN)
+	      status = CrIaSetupSibWin (&sib, sibOut, cestruct->SemWindowSizeX, cestruct->SemWindowSizeY);
+	    
+	    if (sdbstate == CrIaSdb_CONFIG_FULL)
+	      status = CrIaSetupSibFull (&sib, sibOut);
+	    
+	    if (status == 0)
+	      {
+		/* error gets reported by setup function */
+		break;
+	      }
+	  
+	    sibHeader = (struct SibHeader *) sib.Header;
+	    sibPhotometry = (struct SibPhotometry *) sib.Photometry;
+	
+	    nlcBias = (double) sibPhotometry->annulus2;
+	    VoltFeeVss.ui = sibHeader->VoltFeeVss;
+	    VoltFeeVrd.ui = sibHeader->VoltFeeVrd;
+	    VoltFeeVod.ui = sibHeader->VoltFeeVod;
+	    VoltFeeVog.ui = sibHeader->VoltFeeVog;
+	    TempFeeCcd.ui = sibHeader->TempFeeCcd;
+	    readoutFreq = GetRf(sibHeader->CcdTimingScriptId & 0xff);
+	    
+	    /* calculate gain from voltages and CCD temp */
+	    nlcGain = (double) NlcCalcGain (VoltFeeVss.f, VoltFeeVrd.f, VoltFeeVod.f, VoltFeeVog.f, TempFeeCcd.f);
+
+	    /* get Bias0 and Gain0 from data pool array D */
+	    CrIaCopyArrayItem (NLCCOEFF_D_ID, &ftemp, NLCI_Bias0);
+	    nlcBias0 = (double) ftemp;
+	    CrIaCopyArrayItem (NLCCOEFF_D_ID, &ftemp, NLCI_Gain0);
+	    nlcGain0 = (double) ftemp;
+
+	    /* carry out the correction */
+	    NlcSplineCorr16 ((unsigned int *)(source->data) + i * framelen, nlcBias, nlcBias0, nlcGain, nlcGain0, framelen, readoutFreq);
+
+	    /* write gain0 and bias0 to the SIB */
+	    sibPhotometry->centrum = (float) nlcGain0;
+	    sibPhotometry->annulus1 = (float) nlcBias0;
+	    /* NOTE: nlcBias is already in annulus2 */
+
+	    /* write gain0 and bias0 to the DataPool */
+	    utemp16 = (unsigned short) nlcBias0;
+	    CrIaPaste(SDPGLOBALBIAS_ID, &utemp16);
+	    ftemp = (float) nlcGain0;
+	    CrIaPaste(SDPGLOBALGAIN_ID, &ftemp);
+	    
+	    if (i < source->zelements - 1) /* don't update for the last frame */
+	      {
+		/* move to the next sibOut in sequence */
+		if (sdbstate == CrIaSdb_CONFIG_WIN)
+		  {
+		    xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)sibAddressWin);
+		    newSibOut = updateXibFwd((unsigned int)sibOut, (unsigned int)sibIn, xibOffset, (unsigned int)sibSizeWin, (unsigned int)sibNWin, SIBOUT_WIN_XIB);
+		  }
+		else
+		  {
+		    xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)sibAddressFull);
+		    newSibOut = updateXibFwd((unsigned int)sibOut, (unsigned int)sibIn, xibOffset, (unsigned int)sibSizeFull, (unsigned int)sibNFull, SIBOUT_FULL_XIB);
+		  }
+		
+		/* NOTE: if SIBOUT couldn't be incremented, the last one is cloned */
+		
+		sibOut = newSibOut;
+	      }
+	  }
+      } /* NLC2 block */
+      
+      break;
+      
+    case PREPROC_NLCPHOT :
+
+      ccStep = ccProduct | CC_PREPROC_NLCPHOT;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+      
+      SDPRINT("- carrying out the nonlinearity correction + quick photometry\n");
+      
+      NlcSplineCorr28 ((unsigned int *)(source->data), source->nelements);
+
+      /* 
+	 no break here 
+	 in order to quiet the fallthrough warning, we use a useless goto...
+       */
+      goto SDP_PREPROC_PHOT;      
+      
+    case PREPROC_PHOT    :
+
+SDP_PREPROC_PHOT:
+
+      ccStep = ccProduct | CC_PREPROC_PHOT;    
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      SDPRINT("- carrying out quick photometry\n");
+
+      /* the quick photometry needs to write back the SibPhotometry values to the SIB,
+	 so we have to again fetch the SIB structure of each frame and loop over the frames,
+	 like it was done in the PRODUCT step */ 
+
+      CrIaCopy(SIBOUT_ID, &sibOut); /* sibOut was modified in the PRODUCT step, we fetch it again */
+
+      for (i=0; i < source->zelements; i++)
+        {
+          /* setup SIB structure using current sibOut (the compression is the SIB consumer, thus it reads from "out") */
+          status = 0;
+          if (sdbstate == CrIaSdb_CONFIG_WIN)
+            status = CrIaSetupSibWin (&sib, sibOut, cestruct->SemWindowSizeX, cestruct->SemWindowSizeY);
+	  
+          if (sdbstate == CrIaSdb_CONFIG_FULL)
+            status = CrIaSetupSibFull (&sib, sibOut);
+	  
+          if (status == 0)
+            {
+              /* error gets reported by setup function */
+              break;
+            }
+	  
+	  sibPhotometry = (struct SibPhotometry *) sib.Photometry;
+
+	  photData.datatype = source->datatype;
+	  photData.xelements = source->xelements;
+	  photData.yelements = source->yelements;
+	  photData.zelements = source->zelements;
+	  photData.nelements = source->nelements;
+	  photData.data = (unsigned int *)source->data + i * source->xelements * source->yelements;
+      
+	  QuickPhotometry (&photData, (unsigned int *) swapbuffer->data, sibPhotometry);  
+
+	  if (i < source->zelements - 1) /* don't update for the last frame */
+	    {
+	      /* move to the next sibOut in sequence */
+	      if (sdbstate == CrIaSdb_CONFIG_WIN)
+		{
+		  xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)sibAddressWin);
+		  newSibOut = updateXibFwd((unsigned int)sibOut, (unsigned int)sibIn, xibOffset, (unsigned int)sibSizeWin, (unsigned int)sibNWin, SIBOUT_WIN_XIB);
+		}
+	      else
+		{
+		  xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)sibAddressFull);
+		  newSibOut = updateXibFwd((unsigned int)sibOut, (unsigned int)sibIn, xibOffset, (unsigned int)sibSizeFull, (unsigned int)sibNFull, SIBOUT_FULL_XIB);
+		}
+
+	      /* NOTE: if SIBOUT couldn't be incremented, the last one is cloned */
+	      
+	      sibOut = newSibOut;
+	    }
+        }
+      
+      break;
+
+    case PREPROC_NONE    :
+    default :
+
+      ccStep = ccProduct | CC_PREPROC_NONE;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+      
+      break;
+    }
+
+  /*********************/
+  /*      Lossy 1      */
+  /*********************/
+
+  switch (lossy1)
+    {
+
+    case LOSSY1_COADD :
+
+      ccStep = ccProduct | CC_LOSSY1_COADD;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      SDPRINT("- calculate the coadded frame\n");
+
+      status = CoAdd32s ((int *)(source->data), source->xelements, source->yelements, source->zelements, (int *)(compressed->data)); /* NOTE: this could be done in place */
+
+      if (status == 0)
+        source->zelements = 0;
+      else
+        source->zelements = 1;
+
+      /* adapt source elements */
+      source->nelements = source->xelements * source->yelements * source->zelements;
+
+      /* shift source pointer to the processed data and vice versa       */
+      SWITCH_PTRS(source->data, compressed->data);
+	
+      break;
+
+    case LOSSY1_MEAN :
+
+      SDPRINT("- calculate the average frame\n");
+
+      status = Average32s ((int *)(source->data), source->xelements, source->yelements, source->zelements, (int *)(compressed->data)); /* NOTE: this could be done in place */
+
+      if (status == 0)
+        source->zelements = 0;
+      else
+        source->zelements = 1;
+
+      /* adapt source elements */
+      source->nelements = source->xelements * source->yelements * source->zelements;
+
+      /* shift source pointer to the processed data and vice versa       */
+      SWITCH_PTRS(source->data, compressed->data);
+
+      break;
+     
+    case LOSSY1_GMEAN :
+
+      ccStep = ccProduct | CC_LOSSY1_GMEAN;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      SDPRINT("- averaging frames in groups\n");
+
+      source->zelements = ProcessGroups32s ((int *)(source->data), source->xelements, source->yelements, source->zelements, stackGroup, 0, (int *)(compressed->data)); /* NOTE: this could be done in place */
+
+      /* adapt source elements */
+      source->nelements = source->xelements * source->yelements * source->zelements;
+
+      /* shift source pointer to the processed data and vice versa       */
+      SWITCH_PTRS(source->data, compressed->data);
+      
+      break;
+      
+    case LOSSY1_GCOADD :
+
+      ccStep = ccProduct | CC_LOSSY1_GCOADD;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      SDPRINT("- coadding frames in groups\n");
+
+      source->zelements = ProcessGroups32s ((int *)(source->data), source->xelements, source->yelements, source->zelements, stackGroup, 1, (int *)(compressed->data)); /* NOTE: this could be done in place */
+
+      /* adapt source elements */
+      source->nelements = source->xelements * source->yelements * source->zelements;
+
+      /* shift source pointer to the processed data and vice versa       */
+      SWITCH_PTRS(source->data, compressed->data);
+      
+      break;
+      
+    case LOSSY1_NONE :
+    default :
+      
+      ccStep = ccProduct | CC_LOSSY1_NONE;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      break;
+    }
+
+
+  /*********************/
+  /*      Lossy 2      */
+  /*********************/
+
+  switch (lossy2)
+    {
+
+    case LOSSY2_3STAT :
+
+      ccStep = ccProduct | CC_LOSSY2_3STAT;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      SDPRINT("- calculate mean, stdev, median\n");
+
+      FrameElements = source->xelements * source->yelements;
+      w = 0; /* write counter for output words       */
+      for (i=0; i < source->zelements; i++)
+        {
+          MeanSigma ((int *)source->data + i*FrameElements, FrameElements, &(stat.mean), &(stat.stdev));
+          stat.median = (unsigned int) Median ((int *)source->data + i*FrameElements, FrameElements);
+
+          /* enter the values in the output array */
+          ((float *)(compressed->data))[w] = stat.mean;
+          w++;
+          ((float *)(compressed->data))[w] = stat.stdev;
+          w++;
+          ((unsigned int *)(compressed->data))[w] = stat.median;
+          w++;
+        }
+
+      /* adjust array metadata */
+      source->datatype = DATATYPE_UINT32;
+      source->xelements = 3;
+      source->yelements = 1;
+      source->zelements = i;
+      source->nelements = w;
+
+      /* shift source pointer to the processed data and vice versa       */
+      SWITCH_PTRS(source->data, compressed->data);
+
+      break;
+
+    case LOSSY2_3STATUI_ROW :
+
+      ccStep = ccProduct | CC_LOSSY2_3STATUI_ROW;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      SDPRINT("- calculate mean, stdev, median in uint for every row\n");
+
+      CrIaCopy(SDP3STATAMPL_ID, &ampl);
+      
+      FrameElements = source->xelements * source->yelements;
+      w = 0; /* write counter for output words       */
+      for (i=0, j=0; i < source->zelements; i++)
+        {
+	  for (j=0; j < source->yelements; j++)
+	    {
+	      MeanSigma ((int *)source->data + i*FrameElements + j*source->xelements, source->xelements, &(stat.mean), &(stat.stdev));
+	      stat.median = (unsigned int) Median ((int *)source->data + i*FrameElements + j*source->xelements, source->xelements);
+
+	      /* enter the values in the output array */
+	      ((unsigned int *)(compressed->data))[w] = (unsigned int) roundf(stat.mean);
+	      w++;
+	      ((unsigned int *)(compressed->data))[w] = (unsigned int) roundf(ampl * stat.stdev);
+	      w++;
+	      ((unsigned int *)(compressed->data))[w] = stat.median;
+	      w++;
+	    }
+	}
+
+      /* adjust array metadata */
+      source->datatype = DATATYPE_UINT32;
+      source->xelements = 3;
+      source->yelements = j;
+      source->zelements = i;
+      source->nelements = w;
+
+      /* shift source pointer to the processed data and vice versa       */
+      SWITCH_PTRS(source->data, compressed->data);
+
+      break;
+
+    case LOSSY2_3STATUI_COL :
+
+      ccStep = ccProduct | CC_LOSSY2_3STATUI_COL;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      SDPRINT("- calculate mean, stdev, median in uint for every column\n");
+
+      CrIaCopy(SDP3STATAMPL_ID, &ampl);
+      
+      FrameElements = source->xelements * source->yelements;
+      w = 0; /* write counter for output words */
+      for (i=0; i < source->zelements; i++)
+        {
+	  /* transpose frame */
+	  Transpose2Di ((int *)source->data, source->xelements, source->yelements, (int *)swapbuffer->data);
+	  
+	  for (j=0; j < source->xelements; j++) /* x is now the y dimension due to the transpose */
+	    {
+	      /* calculate statistics */
+	      MeanSigma ((int *)swapbuffer->data + i*FrameElements + j*source->yelements, source->yelements, &(stat.mean), &(stat.stdev));
+	      stat.median = (unsigned int) Median ((int *)swapbuffer->data + i*FrameElements + j*source->yelements, source->yelements);
+	      
+	      /* enter the values in the output array */
+	      ((unsigned int *)(compressed->data))[w] = (unsigned int) roundf(stat.mean);
+	      w++;
+	      ((unsigned int *)(compressed->data))[w] = (unsigned int) roundf(ampl * stat.stdev);
+	      w++;
+	      ((unsigned int *)(compressed->data))[w] = stat.median;
+	      w++;
+	    }
+	}
+      
+      /* adjust array metadata */
+      source->datatype = DATATYPE_UINT32;
+      source->xelements = source->xelements;
+      source->yelements = 3;
+      source->zelements = i;
+      source->nelements = w;
+      
+      /* shift source pointer to the processed data and vice versa       */
+      SWITCH_PTRS(source->data, compressed->data);
+      
+      break;
+      
+    case LOSSY2_3STATUI :
+
+      ccStep = ccProduct | CC_LOSSY2_3STATUI;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      SDPRINT("- calculate mean, stdev, median in uint\n");
+
+      CrIaCopy(SDP3STATAMPL_ID, &ampl);
+      
+      FrameElements = source->xelements * source->yelements;
+
+      w = 0; /* write counter for output words       */
+      for (i=0; i < source->zelements; i++)
+        {
+          MeanSigma ((int *)source->data + i*FrameElements, FrameElements, &(stat.mean), &(stat.stdev));
+          stat.median = (unsigned int) Median ((int *)source->data + i*FrameElements, FrameElements);
+
+          /* enter the values in the output array */
+          ((unsigned int *)(compressed->data))[w] = (unsigned int) roundf(stat.mean);
+          w++;
+          ((unsigned int *)(compressed->data))[w] = (unsigned int) roundf(ampl * stat.stdev);
+          w++;
+          ((unsigned int *)(compressed->data))[w] = stat.median;
+          w++;
+        }
+
+      /* adjust array metadata */
+      source->datatype = DATATYPE_UINT32;
+      source->xelements = 3;
+      source->yelements = i;
+      source->zelements = 1;
+      source->nelements = w;
+
+      /* shift source pointer to the processed data and vice versa       */
+      SWITCH_PTRS(source->data, compressed->data);
+
+      break;
+
+    case LOSSY2_4STAT :
+
+      ccStep = ccProduct | CC_LOSSY2_4STAT;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      SDPRINT("- calculate mean, stdev, median and MAD for every frame\n");
+
+      FrameElements = source->xelements * source->yelements;
+
+      w = 0; /* write counter for output words       */
+      for (i=0; i < source->zelements; i++)
+        {
+          MeanSigma ((int *)source->data + i*FrameElements, FrameElements, &(stat.mean), &(stat.stdev));
+          stat.median = (unsigned short) Median ((int *)source->data + i*FrameElements, FrameElements);
+          stat.mad = (unsigned short) MedAbsDev ((int *)source->data + i*FrameElements, FrameElements, stat.median, (int *)swapbuffer->data); /* use swapbuf as workbuffer */
+
+          /* enter the values in the output array */
+          ((float *)(compressed->data))[w] = stat.mean;
+          w++;
+          ((float *)(compressed->data))[w] = stat.stdev;
+          w++;
+          ((unsigned int *)(compressed->data))[w] = stat.median;
+          w++;
+          ((unsigned int *)(compressed->data))[w] = stat.mad;
+          w++;
+        }
+
+      /* adjust array metadata */
+      source->datatype = DATATYPE_UINT32;
+      source->xelements = 4;
+      source->yelements = i;
+      source->zelements = 1;
+      source->nelements = w;
+
+      /* shift source pointer to the processed data and vice versa       */
+      SWITCH_PTRS(source->data, compressed->data);
+
+      break;
+
+    case LOSSY2_CIRCMASK :
+
+      {
+	unsigned int maskvalue;
+	unsigned int xoff, yoff;
+
+	ccStep = ccProduct | CC_LOSSY2_CIRCMASK;
+	CrIaPaste(CCSTEP_ID, &ccStep);
+
+	SDPRINT("- applying circular mask for every frame\n");
+	
+	FrameElements = source->xelements * source->yelements;
+	
+	for (i=0; i < source->zelements; i++)
+	  {
+	    /* use average of image as mask value */
+	    maskvalue = (unsigned int) roundf (Mean32((int *)source->data + i*FrameElements, FrameElements));
+	    
+	    xoff = RINGEXTRACT_XOFF;
+	    yoff = RINGEXTRACT_YOFF;
+
+	    /* mask in place */
+	    CircMask32 ((unsigned int *)source->data + i*FrameElements, source->xelements, source->yelements, xoff, yoff, productRadius, maskvalue, (unsigned int *)source->data + i*FrameElements);
+	  }
+      
+	/* no change of source dimensions or type */
+
+	break;
+      }
+	    
+    case LOSSY2_CIRCEXTRACT :
+
+      {
+	int extracted = 0;
+	unsigned int xoff, yoff;
+
+	ccStep = ccProduct | CC_LOSSY2_CIRCEXTRACT;
+	CrIaPaste(CCSTEP_ID, &ccStep);
+
+	SDPRINT("- applying circular extraction for frames: %d\n", source->zelements);
+	
+	FrameElements = source->xelements * source->yelements;
+		
+	/* apply for the other frames */
+	for (i=0; i < source->zelements; i++)
+	  {
+	    xoff = RINGEXTRACT_XOFF;
+	    yoff = RINGEXTRACT_YOFF;
+
+	    extracted = RingExtract32 ((unsigned int *)source->data + i*FrameElements, source->xelements, source->yelements, xoff, yoff, 0.0f, productRadius, (unsigned int *)compressed->data + i*extracted);
+	  }
+	
+	/* adjust array metadata */
+	source->datatype = DATATYPE_UINT32;
+	source->xelements = extracted;
+	source->yelements = 1;
+	source->nelements = source->xelements * source->yelements * source->zelements;
+	
+	/* shift source pointer to the processed data and vice versa */
+	SWITCH_PTRS(source->data, compressed->data);
+	
+	break;
+      }
+      
+    case LOSSY2_NONE :
+    default :
+
+      ccStep = ccProduct | CC_LOSSY2_NONE;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      break;
+    }
+
+
+  /*********************/
+  /*      Lossy 3      */
+  /*********************/
+
+  switch (lossy3)
+    {
+
+    case LOSSY3_ROUND1 :
+
+      ccStep = ccProduct | CC_LOSSY3_ROUND1;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      SDPRINT("- applying 1-bit rounding for %d elements\n", source->zelements);
+      
+      BitRounding32u((unsigned int *)(source->data), 1, source->nelements);
+
+      break;
+      
+    case LOSSY3_ROUND2 :
+
+      ccStep = ccProduct | CC_LOSSY3_ROUND2;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      SDPRINT("- applying 2-bit rounding for %d elements\n", source->zelements);
+      
+      BitRounding32u((unsigned int *)(source->data), 2, source->nelements);
+
+      break;
+
+    case LOSSY3_ROUND3 :
+
+      ccStep = ccProduct | CC_LOSSY3_ROUND3;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      SDPRINT("- applying 3-bit rounding for %d elements\n", source->zelements);
+      
+      BitRounding32u((unsigned int *)(source->data), 3, source->nelements);
+
+      break;
+
+    case LOSSY3_ROUND4 :
+
+      ccStep = ccProduct | CC_LOSSY3_ROUND4;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      SDPRINT("- applying 4-bit rounding for %d elements\n", source->zelements);
+      
+      BitRounding32u((unsigned int *)(source->data), 4, source->nelements);
+
+      break;
+
+    case LOSSY3_ROUND5 :
+
+      ccStep = ccProduct | CC_LOSSY3_ROUND5;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      SDPRINT("- applying 5-bit rounding for %d elements\n", source->zelements);
+      
+      BitRounding32u((unsigned int *)(source->data), 5, source->nelements);
+
+      break;
+
+    case LOSSY3_ROUND6 :
+
+      ccStep = ccProduct | CC_LOSSY3_ROUND6;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      SDPRINT("- applying 6-bit rounding for %d elements\n", source->zelements);
+      
+      BitRounding32u((unsigned int *)(source->data), 6, source->nelements);
+
+      break;
+      
+    case LOSSY3_NONE :
+    default :
+
+      ccStep = ccProduct | CC_LOSSY3_NONE;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      break;
+    }
+  
+
+  /*********************/
+  /*     lossy CRC     */
+  /*********************/
+
+  /* after the lossy steps the CRC is calculated */
+  compressed->lossyCrc = 0xffff;
+  CrIaCopy(SDPCRC_ID, &sdpCrc);
+  if (sdpCrc == 1)
+    {
+      compressed->lossyCrc = (unsigned int) Checksum_CRC16_32 ((unsigned int *)(source->data), source->nelements * TYPESIZE(source->datatype));
+    }
+      
+  /* also paste dimensions now */
+  compressed->datatype = source->datatype;
+  compressed->xelements = source->xelements;
+  compressed->yelements = source->yelements;
+  compressed->zelements = source->zelements;
+  compressed->nelements = source->nelements;
+
+
+  /*********************/
+  /*       Decorr      */
+  /*********************/
+
+  switch (decorr)
+    {
+
+    case DECORR_DIFF :
+
+      ccStep = ccProduct | CC_DECORR_DIFF;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      SDPRINT("- carrying out 1D differencing on %d samples\n", source->nelements);
+
+      Delta32 ((int *)source->data, source->nelements);
+      Map2Pos32 ((int *)source->data, source->nelements);
+
+      break;
+
+    case DECORR_KEYFR :
+
+      ccStep = ccProduct | CC_DECORR_KEYFR;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      SDPRINT("- carrying out keyframe subtraction on %d (%dx%d) frames\n", source->zelements, source->xelements, source->yelements);
+
+      FrameSubtract(source);
+
+      Map2Pos32 ((int *)source->data + source->xelements, source->nelements - source->xelements); /* NOTE: do not map the 1st line (the keyframe is assumed to be positive) */
+
+      break;
+
+    case DECORR_IWT1 :
+
+      ccStep = ccProduct | CC_DECORR_IWT1;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      SDPRINT("- carrying out 1D IWT/PD on %d samples\n", source->nelements);
+      IntegerWaveletTransform_Decompose ((int *)source->data, (int *)compressed->data, source->nelements);
+      /* note: elements and datatype stay the same */
+
+      /* shift source pointer to the processed data and vice versa       */
+      SWITCH_PTRS(source->data, compressed->data);
+      Map2Pos32 ((int *)source->data, source->nelements);
+
+      break;
+
+    case DECORR_IWT2 :
+
+    {
+      /* in order to transform 3d data sets, we use y*z for the y dimension. So we actually transform a "film strip".  */
+      unsigned int source_xelements = source->xelements;
+      unsigned int source_yelements = source->yelements * source->zelements;
+
+      ccStep = ccProduct | CC_DECORR_IWT2;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      SDPRINT("- carrying out 2D IWT/PD on %d x %d = %d samples\n", source_xelements, source_yelements, source->nelements);
+
+      SDPRINT("D0: %d %d .. %d\n", ((int *)source->data)[0], ((int *)source->data)[1], ((int *)source->data)[source->nelements-1]);
+
+      /* transform all lines */
+      for (i=0; i < source_yelements; i++)
+        IntegerWaveletTransform_Decompose ((int *)source->data + i*source_xelements, (int *)compressed->data + i*source_xelements, source_xelements);
+
+      /*SDPRINT("D1: %d %d .. %d\n", ((int *)compressed->data)[0], ((int *)compressed->data)[1], ((int *)compressed->data)[source->nelements-1]); */
+
+      /* transpose	 */
+      Transpose2Di ((int *)compressed->data, source_xelements, source_yelements, (int *)source->data);
+
+      /*SDPRINT("D4: %d %d .. %d\n", ((int *)source->data)[0], ((int *)source->data)[1], ((int *)source->data)[source->nelements-1]); */
+
+      /* loop over all transposed lines */
+      for (i=0; i < source_xelements; i++)
+        IntegerWaveletTransform_Decompose ((int *)source->data + i*source_yelements, (int *)compressed->data + i*source_yelements, source_yelements);
+
+      /*SDPRINT("D3: %d %d .. %d\n", ((int *)compressed->data)[0], ((int *)compressed->data)[1], ((int *)compressed->data)[source->nelements-1]); */
+
+      /* For the entropy it is not needed to transpose again, but for nonsquare image dimensions it is nice. */
+      Transpose2Di ((int *)compressed->data, source_yelements, source_xelements, (int *)source->data);
+
+      /*SDPRINT("D4: %d %d .. %d\n", ((int *)source->data)[0], ((int *)source->data)[1], ((int *)source->data)[source->nelements-1]); */
+
+      Map2Pos32((int *)source->data, source->nelements);
+      break;
+    }
+
+    case DECORR_NONE :
+    default :
+
+      ccStep = ccProduct | CC_DECORR_NONE;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      break;
+    }
+
+#ifdef DEBUGFILES
+
+  /* save fits file for debug purposes */
+  if (product == PRODUCT_IMAGETTES)
+    {
+      strncpy (debugfilename, "!Debug_Image_DECORR.fits\0", 256); /* ! means overwrite */
+      SDPRINT("  the source buffer has: %d %d %d .. %d\n", ((int *)(source->data))[0], ((int *)(source->data))[1], ((int *)(source->data))[2], ((int *)(source->data))[source->nelements-1]);
+      saveFitsImage (debugfilename, source);
+    }
+#endif
+
+  /*********************/
+  /*        Llc        */
+  /*********************/
+
+  switch (llc)
+    {
+
+    case LLC_RZIP :
+
+      ccStep = ccProduct | CC_LLC_RZIP;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      SDPRINT("- carrying out RZip on %d samples\n", source->nelements);
+      SDPRINT("  U: %d %d %d .. %d CRC %04x\n", ((unsigned int *)(source->data))[0], ((unsigned int *)(source->data))[1], ((unsigned int *)(source->data))[2], ((unsigned int *)(source->data))[source->nelements-1], Checksum_CRC16_32 ((unsigned int *)(source->data), 4*source->nelements));
+
+      if (swapbuffer->nelements < source->nelements) /* alpha channel has same size as input for speed reason */
+        {
+#ifdef ISOLATED
+	  (void) evt_data;
+	  SDPRINT(ANSI_COLOR_RED "ERROR: (RZIP) Not enough RAM for work buffer!\n" ANSI_COLOR_RESET);
+#else
+	  evt_data[0] = ccStep; 
+	  evt_data[1] = 0;
+	  SdpEvtRaise(3, CRIA_SERV5_EVT_SDP_NOMEM, evt_data, 4);
+#endif    
+        }
+
+      /* compress the buffer */
+      /* we skip one output word for the range codes */
+      compressed->llcsize = RZip32 ((unsigned int *)(source->data), source->nelements, (unsigned int *)(compressed->data) + 1, (unsigned int *)swapbuffer->data, 5); 
+      /* NOTE: data pool variables RZIP_ITER1, RZIP_ITER2, RZIP_ITER3, RZIP_ITER4 are not used, 
+	 because there is little gain from iterative application on the many floats in the header. */
+
+      ((unsigned int *)(compressed->data))[0] = 5 << 24;
+      compressed->llcsize += 4;
+      
+      SDPRINT("  compressed output is %d bytes\n", compressed->llcsize);
+      SDPRINT("  C: %08x %08x %08x .. %08x\n", ((unsigned int *)(compressed->data))[0], ((unsigned int *)(compressed->data))[1], ((unsigned int *)(compressed->data))[2], ((unsigned int *)(compressed->data))[(compressed->llcsize + 3)/4 - 1]);
+      
+      break;
+
+    case LLC_ARI1 :
+
+      ccStep = ccProduct | CC_LLC_ARI1;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      SDPRINT("- carrying out semi-adaptive Arithmetic compression on %d samples\n", source->nelements);
+      SDPRINT("  U: %d %d %d .. %d CRC %04x\n", ((unsigned int *)(source->data))[0], ((unsigned int *)(source->data))[1], ((unsigned int *)(source->data))[2], ((unsigned int *)(source->data))[source->nelements-1], Checksum_CRC16_32 ((unsigned int *)(source->data), 4*source->nelements));
+
+      if (swapbuffer->nelements < (source->nelements + 257 + 258)) /* magic numbers (c) RO */
+        {
+#ifdef ISOLATED
+	  (void) evt_data;
+	  SDPRINT(ANSI_COLOR_RED "ERROR: (ARI1) Not enough RAM for work buffer!\n" ANSI_COLOR_RESET);
+#else
+	  evt_data[0] = ccStep; 
+	  evt_data[1] = 0;
+	  SdpEvtRaise(3, CRIA_SERV5_EVT_SDP_NOMEM, evt_data, 4);
+#endif    
+        }
+
+      /* compress the buffer */
+      compressed->llcsize = fmari_compress((unsigned int *)(source->data), source->nelements, (unsigned int *)(compressed->data), (unsigned int *)swapbuffer->data, 0);
+      compressed->llcsize *= 4; /* ARI counts words, we want bytes */
+
+      SDPRINT("  compressed output is %d bytes\n", compressed->llcsize);
+      SDPRINT("  C: %08x %08x %08x .. %08x\n", ((unsigned int *)(compressed->data))[0], ((unsigned int *)(compressed->data))[1], ((unsigned int *)(compressed->data))[2], ((unsigned int *)(compressed->data))[(compressed->llcsize + 3)/4 - 1]);
+
+      break;
+      
+    case LLC_PACK16 :
+
+      ccStep = ccProduct | CC_LLC_PACK16;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      SDPRINT("- simple packing of %d samples in 16 bits (with truncation)\n", source->nelements);
+      if (source->nelements >= 3)
+	SDPRINT("  U: %08x %08x %08x .. %08x\n", ((unsigned int *)(source->data))[0], ((unsigned int *)(source->data))[1], ((unsigned int *)(source->data))[2], ((unsigned int *)(source->data))[source->nelements - 1]);
+
+      PackU16FromU32 ((uint32_t *)(source->data), source->nelements, (uint32_t *)(compressed->data), UNPACK_NOSWAP);
+      compressed->llcsize = source->nelements * 2;
+      
+      SDPRINT("  compressed output is %d bytes\n", compressed->llcsize);
+      if (source->nelements >= 3)
+	SDPRINT("  C: %08x %08x %08x .. %08x\n", ((unsigned int *)(compressed->data))[0], ((unsigned int *)(compressed->data))[1], ((unsigned int *)(compressed->data))[2], ((unsigned int *)(compressed->data))[(compressed->llcsize + 3)/4 - 1]);
+
+      break;
+
+    case LLC_NONE :
+    default :
+
+      ccStep = ccProduct | CC_LLC_NONE;
+      CrIaPaste(CCSTEP_ID, &ccStep);
+
+      /* if nothing is to be done at all, we still have to enter the "compressed" size */
+      compressed->llcsize = source->nelements * TYPESIZE(source->datatype);
+
+      /* SDPRINT("at this point, the data are: %u %u %u\n", ((unsigned int *)(source->data))[0],((unsigned int *)(source->data))[1],((unsigned int *)(source->data))[2]); */
+
+      /* and copy the data */
+      sram2memcpy(compressed->data, source->data, compressed->llcsize);
+
+      break;
+    }
+
+  /* The steps above finish with the compressed data in compressed->data */
+  /* However, we don't know if this is the true (non-SWITCHED) buffer. */
+  /* We have to make sure that the compressed data are in the originally */
+  /* reserved buffer, administered by the right structure  */
+  if ((unsigned long)(compressed->data) != (unsigned long)(comprdata))
+    {
+      sram2memcpy(source->data, compressed->data, compressed->llcsize);
+      SWITCH_PTRS(source->data, compressed->data);
+    }
+
+  /* NOTE: this strategy could be revised to avoid extra copy,
+     taking advantage of the location parameter. */
+  if (location == SRCBUF)
+    {
+      /* copy data from dest back */
+      sram2memcpy(source->data, compressed->data, compressed->llcsize);
+    }
+
+  return 0;
+}
+
diff --git a/CompressionEntity/src/SdpAlgorithmsImplementation.h b/CompressionEntity/src/SdpAlgorithmsImplementation.h
new file mode 100644
index 0000000..232d4f3
--- /dev/null
+++ b/CompressionEntity/src/SdpAlgorithmsImplementation.h
@@ -0,0 +1,145 @@
+/**
+ * @file    SdpAlgorithmsImplementation.h
+ * @author  Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @date    September, 2016
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef SDP_ALGORITHMS_IMPLEMENTATION_H
+#define SDP_ALGORITHMS_IMPLEMENTATION_H
+
+#include "SdpBuffers.h"
+#include "IfswMath.h"
+
+#define FLOATASUINT(f) ( *((unsigned int *)(&f)) )
+
+#define UINTASFLOAT(u) ( *((float *)(&u)) )
+
+#define FILLBYTE(bpos) (7 - ((bpos+7)%8))
+
+#define SWITCH_PTRS(ptra, ptrb) { void *tmp; tmp = (void *)ptra; ptra = ptrb; ptrb = tmp; }
+
+#define SWITCH_VALUES_UI(vala, valb) { unsigned int tmp; tmp = vala; vala = valb; valb = tmp; }
+
+/** @{
+ * @brief retrieve masked value from the key for the respective step
+ */
+#define GETPRODUCT(key) (key & 0xf0000000)
+#define GETPREPROC(key) (key & 0x0f000000)
+#define GETLOSSY1(key)  (key & 0x00f00000)
+#define GETLOSSY2(key)  (key & 0x000f0000)
+#define GETDECORR(key)  (key & 0x00000f00)
+#define GETLLC(key)     (key & 0x0000000f)
+/* @} */
+
+/** !@{
+ * @brief macros to unify the function calls of the different bitstream access functions
+ */
+#define PUTNBITS(putval, putoff, putn, putptr) (PutNBits32 (putval, putoff, putn, (unsigned int *)putptr))
+#define GETNBITS(getval, getoff, getn, getptr) { unsigned int gv; GetNBits32 (&gv, getoff, getn, (unsigned int *)getptr); getval = gv; }
+#define PUTBYTE(putval, putoff, putptr) (PutByte32 ((putval), (putoff) >> 3, (unsigned int *)putptr)) 
+#define GETBYTE(getval, getoff, getptr) { getval = GetByte32 ((getoff) >> 3, (unsigned int *)getptr); }
+/** !@} */
+
+
+#ifdef DEBUGFILES
+extern char debugfilename[256];
+void saveFitsImage (char *filename, struct ScienceBuf *imgdata);
+#endif
+
+
+#define RINGEXTRACT_XOFF 0
+#define RINGEXTRACT_YOFF 0
+#define RINGEXTRACT_MASKVAL 0
+
+
+/**
+ * @brief    replacement of the floor function after a division by 2^n
+ * @param    a    the integer value to operate on
+ * @param    n    the number of bits to shift
+ * @returns  a/2^n
+ */
+
+#define FLOORSH(a,n) (a >> n)
+
+  
+void *sram2memcpy(void *dest, const void *src, unsigned long int n);
+
+void *sram2memcpy_aligned(void *dest, const void *src, unsigned long int n);
+
+unsigned short *sram1tosram2_shorts (unsigned short *p_src, unsigned int nshorts, unsigned short *p_dest_short);
+
+void PutBit32 (unsigned int value, unsigned int bitOffset, unsigned int *destAddr);
+
+unsigned int GetBit32 (unsigned int bitOffset, unsigned int *src);
+
+unsigned int PutNBits32 (unsigned int value, unsigned int bitOffset, unsigned int nBits, unsigned int *destAddr);
+
+unsigned int GetNBits32 (unsigned int *p_value, unsigned int bitOffset, unsigned int nBits, unsigned int *srcAddr);
+
+void PutByte32 (unsigned char value, unsigned int byteOffset, unsigned int *destAddr);
+
+unsigned char GetByte32 (unsigned int byteOffset, unsigned int *srcAddr);
+
+
+int CoAdd32s (int *source, unsigned short Xdim, unsigned short Ydim, unsigned short N, int *dest);
+
+int Average32s (int *source, unsigned short Xdim, unsigned short Ydim, unsigned short N, int *dest);
+
+int ProcessGroups32s (int *source, unsigned short Xdim, unsigned short Ydim, unsigned short Zdim, unsigned char N, unsigned char operation, int *dest);
+
+int CropCopyFromSibAndUnpack (unsigned int *source, unsigned short Xdim, unsigned short Ydim, unsigned short XcDim, unsigned short YcDim, unsigned short XcStart, unsigned short YcStart, unsigned int *dest);
+
+unsigned int CountOnes16 (unsigned short value);
+
+void ColSelect16_32 (unsigned int *data, unsigned int y, unsigned short mask, unsigned int *output);
+
+int CircMask32 (unsigned int *source, unsigned int Xdim, unsigned int Ydim, int xoff, int yoff, float radius, unsigned int maskval, unsigned int *dest);
+
+int RingExtract32 (unsigned int *source, unsigned int Xdim, unsigned int Ydim, int xoff, int yoff, float iradius, float oradius, unsigned int *dest);
+
+unsigned short Checksum_CRC16_32 (unsigned int *data, unsigned int N);
+
+
+void MeanSigma (int *data, int len, float *m, float *sig);
+
+#ifdef GROUNDSW
+int compint (const void *a, const void *b);
+#endif
+  
+int Median (int *data, int len);
+
+int MedAbsDev (int *data, int len, int median, int* swap);
+
+typedef struct {
+    int symbol;
+    int freq;
+} symentry ;
+
+
+int IntegerWaveletTransform_Core (int *Input, int *Output, unsigned int n);
+
+int IntegerWaveletTransform_Decompose (int *Input, int *Output, unsigned int n);
+
+void Delta32 (int *buf, int words);
+
+void Map2Pos32 (int *buffer, unsigned int N);
+
+void Transpose2Di (int *src, unsigned int src_xdim, unsigned int src_ydim, int *dest);
+
+int FrameSubtract(struct ScienceBuf *fdata);
+
+int Compress(struct ScienceBuf *source, struct ComprEntStructure *cestruct, unsigned int CeKey, struct CompressedBuf *compressed, int location, struct ScienceBuf *swapbuffer);
+
+
+#endif
diff --git a/CompressionEntity/src/SdpAlgorithmsImplementationLlc.c b/CompressionEntity/src/SdpAlgorithmsImplementationLlc.c
new file mode 100644
index 0000000..6eeacc5
--- /dev/null
+++ b/CompressionEntity/src/SdpAlgorithmsImplementationLlc.c
@@ -0,0 +1,818 @@
+/**
+ * @file    SdpAlgorithmsImplementationLlc.c
+ * @ingroup SdpAlgorithmsImplementationLlc
+ * @author  Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @date    August, 2016
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ *
+ *
+ * @defgroup SdpAlgorithmsImplementationLlc
+ * @ingroup Sdp
+ *
+ * @brief various lossless compression algorithms used in the data processing chain
+ *
+ */
+
+#include <CrIaDataPool.h> /* for reporting the spillctr */
+#include <CrIaDataPoolId.h> /* for reporting the spillctr */
+
+#include "SdpAlgorithmsImplementationLlc.h"
+#include "SdpAlgorithmsImplementation.h" /* for putnbits getnbits */
+#include <stdio.h> /* for SDPRINT */
+
+
+/**
+ * @brief    minimalistic lexical (kind of) lossless compressor.
+ * @detail   published in "Herschel/PACS On-board Reduction/Compression Software Implementation", 
+ *           R. Ottensamer et al., Proceedings of the SPIE, Astronomical Telescopes and Instrumentation, 2004.
+ * @date     22.12.2001, revised for CHEOPS in Mar 2017 -- yeah!
+ * @param    source    array of input samples to compress
+ * @param    len       number of samples to compress      
+ * @param    cstream   buffer to save the destination bitstream
+ * @param    alpha     work buffer, imagine as alpha channel. Should allow len elements.
+ * @param    range     saturated at 31, defines the length of the look ahead window, basically len = 2^range - 1
+ * @note     this is not exhaustive, it can be applied in a few iterations, e.g. with ranges 5-3-5
+ * @returns  size in bytes of the compressed buffer
+ */
+
+unsigned int RZip32 (unsigned int *source, unsigned int len, unsigned int *cstream, unsigned int *alpha, unsigned int range) 
+{ 
+  unsigned int cmprSize;       /* compressed size in bytes */	
+  unsigned int maxoff;         /* maximum offset possible with the current range setting */ 
+  unsigned int symbol, ctr, i; 
+	
+  /* inner loop variables to carry out the entry search */ 
+  unsigned int sctr;           /* search counter, to find next equal symbol */
+  unsigned int uctr;           /* number of symbols left out during the search */ 
+  unsigned int wctr;           /* counts destination bits */ 
+  unsigned int lastpos;        /* holds the positions where symbols occur */ 
+
+  if (range == 0)
+    {
+      return 0;
+    }
+  
+  /* maximum offset according to the range */ 
+  maxoff = 0xffffffffU >> (32-(range & 31)); 
+	
+  /* clean the alpha channel */ 
+  for (i=0; i < len; i++) 
+    alpha[i] = 0; 
+	
+  /* 
+     now loop over the samples 
+     we start filling the bit stream at pos 32 because, later, the 32 first bits will contain a small header with the range and the input size
+  */ 
+  for (ctr=0, wctr=32; ctr < len; ctr++) 
+    { 
+      /* find a fresh symbol */ 
+      while ((alpha[ctr] == 1) && (ctr < len)) 
+	{
+	  ctr++;
+	}
+	  
+      /* read and set to used in alpha channel */
+      symbol = source[ctr];	        
+      alpha[ctr] = 1; 
+      
+      /* encode the symbol */ 
+      PUTNBITS (symbol, wctr, 32, cstream);
+      wctr += 32;
+      
+      /* search the buffer from the symbol onward */
+      for (uctr=0, sctr = ctr+1, lastpos = ctr; (sctr < len) & ((sctr-lastpos-uctr) < maxoff); sctr++) 
+	{ 
+	  /* if the current entry has already been coded before, keep this in mind */ 
+	  uctr += (alpha[sctr] == 1); 
+			
+	  /* find and code an offset */ 
+	  if (symbol == source[sctr]) 
+	    { 
+	      /* first code YES */ 
+	      PutBit32 (1, wctr, cstream);
+	      wctr++;
+	      
+	      /* code the reduced offset 
+		 
+		 That is: (current search position) - (where the last occurrence was) - 
+		          - (number of already coded entries) - 1 (0 means neighbour)   */
+
+	      PUTNBITS (sctr-lastpos-uctr-1, wctr, range, cstream);
+	      wctr += range; 
+				
+	      /* set the current finding to used state */
+	      alpha[sctr] = 1; 
+				
+	      /* set the last position of occurrence to the current one */ 
+	      lastpos = sctr; 
+				
+	      /* reset the number of uncountable entries */
+	      uctr = 0; 
+	    } 
+	} 
+		
+      /* we come here if no entry was found for the current symbol */ 
+      if (ctr < len) 
+	{	 
+	  /* we code a NO */
+	  PutBit32 (0, wctr, cstream);
+	  wctr++;
+	} 
+      /* go back until the end of the file is reached */ 
+    }
+
+  /* stuff the stream with bits to be %0 */
+  PUTNBITS (0, wctr, FILLBYTE(wctr), cstream);
+  wctr += FILLBYTE(wctr);
+
+  /* compressed size in bytes */
+  cmprSize = wctr >> 3; 
+
+  /* write the original size in bytes into the header */
+  cstream[0] = len * 4;
+	
+  return cmprSize; 
+}
+
+
+/**
+ * @brief    initialize the model table for arithmetic compression (internal function)
+ * @param    model    pointer to the @ref arimodel structure
+ * @param    buffer   pointer to the buffer where the table will reside
+ * @param    symbols  number of symbols covered by the model (i.e. the number of histogram bins)
+ */
+
+void init_arimodel (struct arimodel *model, unsigned int *buffer, int symbols)
+{
+  /* note: symbols is counted here without the spill probability */
+  model->freqtable   = buffer;
+  model->cptable     = model->freqtable + symbols + 1;  /* cumulative probability table  */
+  model->ncptable    = model->cptable + 1;              /* next cumulative probability table */
+  model->spillover   = model->ncptable + symbols + 1;   /* swap buffer for spillover, i.e. words > 8 Bit    */
+  model->spillctr    = 0;
+  model->probability = 0;
+
+  return;
+}
+
+
+/**
+ * @brief    initialize the cumulative frequency in the model table for arithmetic compression (internal function)
+ * @param    table    pointer to the frequency table of the @ref arimodel (freqtable)
+ * @param    cumu     pointer to the cumulative frequency table of the @ref arimodel (cptable)
+ * @param    nrows    number of symbols covered by the model (i.e. the number of histogram bins)
+ * @returns  last value of the cumulative table, i.e. the number of samples, the sum of the histogram
+ */
+
+int makeCumulative (unsigned int *table, unsigned int nrows, unsigned int *cumu)
+{
+  unsigned int ctr;
+
+  for (ctr=0; ctr < nrows; ctr++) /* clean table for the "cumulative probabilities" */
+    cumu[ctr] = 0;
+
+  for (ctr=0; ctr < nrows; ctr++) /* the new table is +1 in size !!     */
+    cumu[ctr+1] = cumu[ctr] + table[ctr];
+
+  return cumu[nrows];
+}
+
+
+/**
+ * @brief    create a new model from a histogram of a buffer
+ * @param    buffer   pointer to the buffer of samples to make the histogram
+ * @param    nwords   number of samples in that buffer
+ * @param    symbols  number of samples to skip at the beginning of the buffer (where the spillover values are)
+ * @param    initval  bias value used in every histogram bin. We recommend 1.
+ * @param    model    pointer to the @ref armodel structure
+ */
+
+void update_fm_ari_model (unsigned int *buffer, unsigned int nwords, unsigned int symbols, int initval, struct arimodel *model)
+{
+  unsigned int ctr;
+  unsigned int value;
+
+  /* start model with 0 or 1 in every entry -> smooth */
+  for (ctr=0; ctr < FMARISPILL; ctr++)
+    model->freqtable[ctr] = initval;
+
+  /* count freqs over the buffer, but leave out the first FMACROWS words for smoothing   */
+  for (ctr=symbols; ctr < nwords; ctr++)
+    {
+      value = buffer[ctr];
+      /*SDPRINT ("updatemodel [%d] = %d\n", ctr, buffer[ctr]); */
+
+      if (value < FMARIROWS)
+        model->freqtable[value]++;
+      else
+        model->freqtable[FMARIROWS]++; /* spillover */
+    }
+
+  /* make new (n)cp array */
+  model->probability = makeCumulative (model->freqtable, FMARISPILL, model->cptable);
+
+  return;
+}
+
+
+/**
+ * @brief    set the initial values for the arithemtic compression model (histogram) for the first chunk
+ * @param    destmodel    pointer to the histogram buffer in the @ref arimodel
+ * @param    ModeID       select which model to use
+ * @note     this is still from PACS, need a CHEOPS statistic here
+ */
+
+void initAriTable (int *destmodel, int ModeID)
+{
+  switch ( ModeID )
+    {
+    case ( PHOT_STANDARD ) :
+    default :
+    {
+      /* startmodel for default full-frame compression */
+      destmodel[0] = 201;
+      destmodel[1] = 200;
+      destmodel[2] = 200;
+      destmodel[3] = 197;
+      destmodel[4] = 199;
+      destmodel[5] = 194;
+      destmodel[6] = 195;
+      destmodel[7] = 190;
+      destmodel[8] = 192;
+      destmodel[9] = 184;
+      destmodel[10] = 186;
+      destmodel[11] = 178;
+      destmodel[12] = 181;
+      destmodel[13] = 172;
+      destmodel[14] = 174;
+      destmodel[15] = 165;
+      destmodel[16] = 167;
+      destmodel[17] = 157;
+      destmodel[18] = 160;
+      destmodel[19] = 150;
+      destmodel[20] = 153;
+      destmodel[21] = 143;
+      destmodel[22] = 145;
+      destmodel[23] = 134;
+      destmodel[24] = 138;
+      destmodel[25] = 127;
+      destmodel[26] = 130;
+      destmodel[27] = 120;
+      destmodel[28] = 123;
+      destmodel[29] = 113;
+      destmodel[30] = 116;
+      destmodel[31] = 107;
+      destmodel[32] = 109;
+      destmodel[33] = 99;
+      destmodel[34] = 102;
+      destmodel[35] = 93;
+      destmodel[36] = 95;
+      destmodel[37] = 87;
+      destmodel[38] = 89;
+      destmodel[39] = 81;
+      destmodel[40] = 83;
+      destmodel[41] = 75;
+      destmodel[42] = 78;
+      destmodel[43] = 70;
+      destmodel[44] = 72;
+      destmodel[45] = 65;
+      destmodel[46] = 67;
+      destmodel[47] = 60;
+      destmodel[48] = 62;
+      destmodel[49] = 56;
+      destmodel[50] = 58;
+      destmodel[51] = 51;
+      destmodel[52] = 54;
+      destmodel[53] = 47;
+      destmodel[54] = 49;
+      destmodel[55] = 44;
+      destmodel[56] = 46;
+      destmodel[57] = 40;
+      destmodel[58] = 42;
+      destmodel[59] = 37;
+      destmodel[60] = 39;
+      destmodel[61] = 34;
+      destmodel[62] = 36;
+      destmodel[63] = 31;
+      destmodel[64] = 33;
+      destmodel[65] = 28;
+      destmodel[66] = 30;
+      destmodel[67] = 26;
+      destmodel[68] = 28;
+      destmodel[69] = 24;
+      destmodel[70] = 26;
+      destmodel[71] = 22;
+      destmodel[72] = 23;
+      destmodel[73] = 20;
+      destmodel[74] = 22;
+      destmodel[75] = 18;
+      destmodel[76] = 19;
+      destmodel[77] = 16;
+      destmodel[78] = 18;
+      destmodel[79] = 15;
+      destmodel[80] = 16;
+      destmodel[81] = 14;
+      destmodel[82] = 15;
+      destmodel[83] = 12;
+      destmodel[84] = 14;
+      destmodel[85] = 11;
+      destmodel[86] = 12;
+      destmodel[87] = 10;
+      destmodel[88] = 11;
+      destmodel[89] = 10;
+      destmodel[90] = 10;
+      destmodel[91] = 9;
+      destmodel[92] = 9;
+      destmodel[93] = 8;
+      destmodel[94] = 9;
+      destmodel[95] = 7;
+      destmodel[96] = 8;
+      destmodel[97] = 7;
+      destmodel[98] = 7;
+      destmodel[99] = 6;
+      destmodel[100] = 7;
+      destmodel[101] = 5;
+      destmodel[102] = 6;
+      destmodel[103] = 5;
+      destmodel[104] = 5;
+      destmodel[105] = 4;
+      destmodel[106] = 5;
+      destmodel[107] = 4;
+      destmodel[108] = 5;
+      destmodel[109] = 4;
+      destmodel[110] = 4;
+      destmodel[111] = 4;
+      destmodel[112] = 4;
+      destmodel[113] = 3;
+      destmodel[114] = 4;
+      destmodel[115] = 3;
+      destmodel[116] = 3;
+      destmodel[117] = 3;
+      destmodel[118] = 3;
+      destmodel[119] = 3;
+      destmodel[120] = 3;
+      destmodel[121] = 2;
+      destmodel[122] = 3;
+      destmodel[123] = 2;
+      destmodel[124] = 2;
+      destmodel[125] = 2;
+      destmodel[126] = 2;
+      destmodel[127] = 2;
+      destmodel[128] = 2;
+      destmodel[129] = 2;
+      destmodel[130] = 2;
+      destmodel[131] = 2;
+      destmodel[132] = 2;
+      destmodel[133] = 2;
+      destmodel[134] = 2;
+      destmodel[135] = 2;
+      destmodel[136] = 2;
+      destmodel[137] = 2;
+      destmodel[138] = 2;
+      destmodel[139] = 2;
+      destmodel[140] = 2;
+      destmodel[141] = 1;
+      destmodel[142] = 2;
+      destmodel[143] = 1;
+      destmodel[144] = 2;
+      destmodel[145] = 1;
+      destmodel[146] = 2;
+      destmodel[147] = 1;
+      destmodel[148] = 1;
+      destmodel[149] = 1;
+      destmodel[150] = 1;
+      destmodel[151] = 1;
+      destmodel[152] = 1;
+      destmodel[153] = 1;
+      destmodel[154] = 1;
+      destmodel[155] = 1;
+      destmodel[156] = 1;
+      destmodel[157] = 1;
+      destmodel[158] = 1;
+      destmodel[159] = 1;
+      destmodel[160] = 1;
+      destmodel[161] = 1;
+      destmodel[162] = 1;
+      destmodel[163] = 1;
+      destmodel[164] = 1;
+      destmodel[165] = 1;
+      destmodel[166] = 1;
+      destmodel[167] = 1;
+      destmodel[168] = 1;
+      destmodel[169] = 1;
+      destmodel[170] = 1;
+      destmodel[171] = 1;
+      destmodel[172] = 1;
+      destmodel[173] = 1;
+      destmodel[174] = 1;
+      destmodel[175] = 1;
+      destmodel[176] = 1;
+      destmodel[177] = 1;
+      destmodel[178] = 1;
+      destmodel[179] = 1;
+      destmodel[180] = 1;
+      destmodel[181] = 1;
+      destmodel[182] = 1;
+      destmodel[183] = 1;
+      destmodel[184] = 1;
+      destmodel[185] = 1;
+      destmodel[186] = 1;
+      destmodel[187] = 1;
+      destmodel[188] = 1;
+      destmodel[189] = 1;
+      destmodel[190] = 1;
+      destmodel[191] = 1;
+      destmodel[192] = 1;
+      destmodel[193] = 1;
+      destmodel[194] = 1;
+      destmodel[195] = 1;
+      destmodel[196] = 1;
+      destmodel[197] = 1;
+      destmodel[198] = 1;
+      destmodel[199] = 1;
+      destmodel[200] = 1;
+      destmodel[201] = 1;
+      destmodel[202] = 1;
+      destmodel[203] = 1;
+      destmodel[204] = 1;
+      destmodel[205] = 1;
+      destmodel[206] = 1;
+      destmodel[207] = 1;
+      destmodel[208] = 1;
+      destmodel[209] = 1;
+      destmodel[210] = 1;
+      destmodel[211] = 1;
+      destmodel[212] = 1;
+      destmodel[213] = 1;
+      destmodel[214] = 1;
+      destmodel[215] = 1;
+      destmodel[216] = 1;
+      destmodel[217] = 1;
+      destmodel[218] = 1;
+      destmodel[219] = 1;
+      destmodel[220] = 1;
+      destmodel[221] = 1;
+      destmodel[222] = 1;
+      destmodel[223] = 1;
+      destmodel[224] = 1;
+      destmodel[225] = 1;
+      destmodel[226] = 1;
+      destmodel[227] = 1;
+      destmodel[228] = 1;
+      destmodel[229] = 1;
+      destmodel[230] = 1;
+      destmodel[231] = 1;
+      destmodel[232] = 1;
+      destmodel[233] = 1;
+      destmodel[234] = 1;
+      destmodel[235] = 1;
+      destmodel[236] = 1;
+      destmodel[237] = 1;
+      destmodel[238] = 1;
+      destmodel[239] = 1;
+      destmodel[240] = 1;
+      destmodel[241] = 1;
+      destmodel[242] = 1;
+      destmodel[243] = 1;
+      destmodel[244] = 1;
+      destmodel[245] = 1;
+      destmodel[246] = 1;
+      destmodel[247] = 1;
+      destmodel[248] = 1;
+      destmodel[249] = 1;
+      destmodel[250] = 1;
+      destmodel[251] = 1;
+      destmodel[252] = 1;
+      destmodel[253] = 1;
+      destmodel[254] = 1;
+      destmodel[255] = 1;
+      destmodel[256] = 131; /* NOTE: spillover, yes this table has 257 entries! */
+      break;
+    }
+    }
+  return;
+}
+
+
+/**
+ *
+ * these variables are shared among the core coding functions of fmari
+ *
+ *@{*/
+
+/** lower bound of local encoding interval */
+unsigned int fm_ari_low = 0;
+
+/** upper bound of local encoding interval */
+unsigned int fm_ari_high = 0xffff;
+
+/** flag to signal underflow */
+unsigned int fm_ari_underflow = 0;
+
+/** the write counter for the output bitstream */
+unsigned int fm_ari_wctr = 0;
+
+/**@}*/
+
+
+/**
+ * @brief calculate the new interval and output bits to the bitstream if necessary
+ * @param dest    pointer to the base of the output bitstream
+ * @param cp      the cumulative probability of that value (taken from the @ref arimodel)
+ * @param ncp     the next cumulative probability of that value (taken from the @ref arimodel)
+ * @par Globals
+ * @ref fm_ari_low, @ref fm_ari_high, @ref fm_ari_underflow, @ref fm_ari_wctr
+ */
+
+void fmari_encodeSym8k (unsigned int *dest, unsigned int cp, unsigned int ncp)
+{
+  unsigned int width;
+  unsigned int a;
+
+  /* calculate the new interval */
+  width = (fm_ari_high - fm_ari_low) + 1;
+
+  fm_ari_high = fm_ari_low + ((ncp * width) >> 13) - 1; /* L + Pni * (H - L) */
+
+  fm_ari_low  = fm_ari_low + ((cp * width) >> 13);       /* L + Pci * (H - L) */
+
+  for ( ; ; )
+    {
+      a = fm_ari_high & 0x8000;
+
+      /* write out equal bits */
+      if (a == (fm_ari_low & 0x8000))
+        {
+          PutBit32 (a >> 15, fm_ari_wctr++, dest);
+
+          while (fm_ari_underflow > 0)
+            {
+              PutBit32 ((~fm_ari_high & 0x8000) >> 15, fm_ari_wctr++, dest);
+              fm_ari_underflow--;
+            }
+        }
+
+      /* underflow coming up, because <> and the 2nd bits are just one apart       */
+      else if ((fm_ari_low & 0x4000) && !(fm_ari_high & 0x4000))
+        {
+          fm_ari_underflow++;
+          fm_ari_low  &= 0x3fff;
+          fm_ari_high |= 0x4000;
+        }
+      else
+        {
+          return;
+        }
+
+      fm_ari_low  <<= 1;
+      fm_ari_low   &= 0xffff;
+      fm_ari_high <<= 1;
+      fm_ari_high  |= 1;
+      fm_ari_high  &= 0xffff;
+    }
+
+  /* the return is inside the for loop */
+}
+
+
+/**
+ * @brief at the end of an encoding chunk, flush out necessary remaining bits
+ * @param dest    pointer to the base of the output bitstream
+ * @par Globals
+ * @ref fm_ari_low, @ref fm_ari_underflow, @ref fm_ari_wctr
+ */
+
+void fmari_flushEncoder (unsigned int *dest)
+{
+
+  PutBit32 ((fm_ari_low & 0x4000) >> 14, fm_ari_wctr++, dest);
+
+  fm_ari_underflow++;
+
+  while (fm_ari_underflow-- > 0)
+    PutBit32 ((~fm_ari_low & 0x4000) >> 14, fm_ari_wctr++, dest);
+
+  return;
+}
+
+
+/**
+ * @brief encode a chunk of symbols to an output bitstream. Spillover values are saved in the @ref arimodel's dedicated buffer
+ * @param chunk   pointer to the input data
+ * @param chunksize  number of symbols in this chunk, best use @ref MAXFREQ (or less if the chunk is smaller)
+ * @param dest    pointer to the base of the output bitstream of that chunk segment
+ * @param model   pointer to the @ref arimodel structure
+ * @par Globals
+ * A number of (local) globals are initialized here
+ * @ref fm_ari_low, @ref fm_ari_high, @ref fm_ari_underflow, @ref fm_ari_wctr
+ * @note  make the (local) globales either static or move to arimodel or pass as arguments (or live with it)
+ */
+
+int fmari_encode_chunk (int *chunk, int chunksize, int *dest, struct arimodel *model)
+{
+  int ctr, tail;
+  unsigned int symbol, cp, ncp;
+
+  /* now init ari */
+  fm_ari_low       = 0;
+  fm_ari_high      = 0xffff;
+  fm_ari_underflow = 0;
+  fm_ari_wctr      = 32; /* offset for chunksize_w */
+
+  for (ctr=0; ctr < chunksize; ctr++)
+    {
+      symbol = chunk[ctr]; /* get next symbol */
+
+      /* look it up in the tables */
+      /* first we check for spillover */
+      if (symbol >= SPILLCUT)
+        {
+          /* encode spillover signal in ari stream */
+          cp = model->cptable[FMARIROWS];
+          ncp = model->ncptable[FMARIROWS];
+
+          fmari_encodeSym8k ((unsigned int *) dest, cp, ncp);
+
+          /* put the symbol into the spillover buffer and increment counter  */
+          model->spillover[(model->spillctr)++] = symbol;
+        }
+      else /* valid symbol */
+        {
+          cp = model->cptable[symbol];
+          ncp = model->ncptable[symbol];
+
+          fmari_encodeSym8k ((unsigned int *)dest, cp, ncp);
+        }
+
+    }
+
+  /* encode the rest */
+  fmari_flushEncoder ((unsigned int *) dest);
+
+  /* calc fillup and fill up with 0s */
+  tail = (32 - fm_ari_wctr % 32) % 32;
+  fm_ari_wctr += tail;
+  dest[0] = (fm_ari_wctr / 32);
+
+  return dest[0]; /* now in words  */
+}
+
+
+unsigned int bits_used (unsigned int num)
+{
+  unsigned int u;
+
+  for (u=0; num != 0; u++)
+    {
+      num >>= 1;
+    }
+  
+  return u;
+}
+
+
+/**
+ * @brief variable block word length encoding. Used for the spillover in FmAri
+ * @param source    pointer to the input data
+ * @param words     number of symbols to encode
+ * @param dest      pointer to the base of the output bitstream
+ * @param BS        block size, i.e. how many symbols are put into a group
+ * @note  this function is the weak point of the FmAri (ARI1) implementation.
+ *        Ok, it has worked for Herschel, where we had very few spill counts, but we want to get rid of it in CHEOPS.
+ * @returns  size in 32-bit words of the output stream, rounded up
+ */
+
+int vbwl_midsize (int *source, int words, int *dest, int BS)
+{
+  int ctr, bctr;
+  int bits, width;
+  int outbits = 32; /* keep track of the output bits; we start at dest[1] */
+
+  /* main loop counts through the source words */
+  for (ctr=0; ctr < words; ctr++)
+    {
+      /* block-loop, we count through the words of a block */
+      for (width=0, bctr=ctr; (bctr < ctr+BS) & (bctr < words); bctr++)
+        {
+          /* determine used bits of current word */
+          /* bits = 32-lzeros */
+	  bits = bits_used(((unsigned int *)source)[bctr]);
+	  
+          width = bits > width ? bits : width;
+        }
+
+      /* now we know width = the number of bits to encode the block */
+      /* first code the width */
+      if (width < VBWLMINW) /* ... due to the optional -FMARIROWS */
+        width = VBWLMINW;
+
+      /* use VBWLCODE bits for the encoding of the width */
+      PutNBits32(width-VBWLMINW, outbits, VBWLCODE, (unsigned int *) dest);
+      outbits += VBWLCODE;
+
+      /* now code the words of the block in width bits */
+      for (bctr=ctr; (ctr < bctr+BS) & (ctr < words); ctr++)
+        {
+          PutNBits32 (source[ctr], outbits, width, (unsigned int *)dest);
+          outbits += width;
+        }
+      ctr--;
+    }
+
+  /* store the original size */
+  dest[0] = words;
+
+  /* return the size in words, rounding up */
+  return (outbits+31)/32;
+}
+
+
+/**
+ * @brief The FM Arithmetic compression function. ARI1 in CHEOPS-slang.
+ * @param source    pointer to the input data.
+ * @param nwords    number of symbols to encode
+ * @param dest      pointer to the base of the output bitstream
+ * @param swap      a working buffer is needed with a size of (strictly speaking) nwords+257+258 words,
+ *                  but if you can guess the spillcount, use spillcount+257+258
+ * @param modeltype initial probability model to start with. Choose from @ref initAriTable
+ * @returns  size in 32-bit words of the output stream, rounded up
+ * @note  The spillover is encoded with @ref vbwl_midsize and that algorithm is quite inefficient.
+ *        Ok, it is difficult to encode the spill, but that algorithm really does a bad job at it.
+ *        In particular, the @ref VBWLCODE define is limiting the range of values.
+ */
+
+int fmari_compress (unsigned int *source, unsigned int nwords, unsigned int *dest, unsigned int *swap, unsigned int modeltype)
+{
+  int ctr;
+  int src_ctr;
+  int remaining;
+  int *streamctr_w;
+  unsigned int *stream;
+
+  struct arimodel model;
+
+  init_arimodel (&model, swap, FMARIROWS);
+
+  dest[0]   = nwords; /* store original size in words */
+  remaining = nwords;
+
+  src_ctr = 0;
+
+  streamctr_w  = (int *) (dest + 1); /* here the size of the ari stream in words will grow */
+  *streamctr_w = 0;                     /* we start with 2, because we have the osize and the streamctr */
+
+  stream = dest + ARIHDR; /* set dest stream and counter */
+
+  initAriTable((int *) model.freqtable, modeltype);  /* initialize starting model */
+
+  /* make probability model */
+  model.probability = makeCumulative(model.freqtable, FMARISPILL, model.cptable);
+
+  /* start compressing chunks with initial model     */
+  while (remaining > MAXFREQ)
+    {
+      *streamctr_w += fmari_encode_chunk((int *)(source + src_ctr), MAXFREQ, \
+                                         (int *)(stream + *streamctr_w), &model);
+
+      /* derive new model from current data */
+      update_fm_ari_model (source + src_ctr, MAXFREQ, FMARISPILL, 1, &model);
+
+      src_ctr   += MAXFREQ;
+      remaining -= MAXFREQ;
+    }
+
+  /* encode the last chunk */
+  if (remaining > 0)
+    *streamctr_w += fmari_encode_chunk ((int *)(source + src_ctr), remaining, \
+                                        (int *)(stream + *streamctr_w), &model);
+
+  /* report the spill to DP */
+  {
+    unsigned int spill_ctr;
+    spill_ctr = model.spillctr;
+    CrIaPaste(SPILL_CTR_ID, &spill_ctr);
+  }  
+
+  /* .. treat the spillover here */
+  /* subtract FMARIROWS from the spill values */
+  for (ctr=0; ctr < model.spillctr; ctr++)
+    model.spillover[ctr] -= FMARIROWS;
+
+  model.spillctr = vbwl_midsize ((int *) model.spillover, model.spillctr, \
+                                 (int *)(dest + ARIHDR + (*streamctr_w)), 4);
+
+
+  return (int)(ARIHDR + *streamctr_w + model.spillctr);
+}
+
+
diff --git a/CompressionEntity/src/SdpAlgorithmsImplementationLlc.h b/CompressionEntity/src/SdpAlgorithmsImplementationLlc.h
new file mode 100644
index 0000000..a1bbad7
--- /dev/null
+++ b/CompressionEntity/src/SdpAlgorithmsImplementationLlc.h
@@ -0,0 +1,105 @@
+/**
+ * @file    SdpAlgorithmsImplementationLlc.h
+ * @author  Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @date    September, 2016
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef SDP_ALGORITHMS_IMPLEMENTATION_LLC_H
+#define SDP_ALGORITHMS_IMPLEMENTATION_LLC_H
+
+
+#ifdef COMPR_DEBUG_ARI
+#define DUMPMODEL(m)  { int c; for (c=0; c < FMARISPILL; c++) SDPRINT ("i: %d p: %d cp: %d ncp: %d\n", c, m[c], m[c+FMARISPILL], m[c+FMARISPILL+1]); }
+#define CHECKMODEL(m) { int v, c; for (v=0, c=0; c < FMARISPILL; c++) v += m[c]; SDPRINT ("Model sum is: %d\n", v); }
+#endif
+
+
+
+/**
+ * ARI parameters 
+ */
+#define ARIHDR 2
+#define FMARIROWS 256
+#define FMARISPILL 257
+#define MAXFREQ 8192
+#define SPILLCUT FMARIROWS
+#define PHOT_STANDARD 0
+
+
+/**
+ * @brief structure used by the @ref fmari_compress algorithm
+ */
+
+struct arimodel {
+  unsigned int *freqtable; 
+  unsigned int *cptable;   /* cumulative probability table */
+  unsigned int *ncptable;  /* next cumulative probability table */
+  unsigned int *spillover; /* swap buffer for spillover, i.e. words > 8 Bit */
+  int spillctr;
+  int probability;
+};
+
+
+/** 
+ * This number defines the number of bits used for the codeword in the @ref vbwl_midsize
+ * algorithm, which is located at the start of each group and says how many bits are used for 
+ * the symbols in this group.
+ *
+ * set to 3 if you are sure that there are no larger values than 16 bits (the length code L = 9..16 
+ * will be encoded as L-VBWLMINW = C = 0..7 in 4 bits. Each symbol of the group will be encoded in L bits)
+ * 
+ * set to 4 for a cap of 24 bits, set to 5 for a cap of 40 bits
+ *
+ * @warning Larger values than what you set as cap will corrupt the output stream 
+ *          and it would be hard to decode such a stream.
+ * 
+ */
+
+#define VBWLCODE 5
+
+/**
+ * The minimum number of bits to encode a spillover value is 9,
+ * because if it was 8, it would not have landed in the spill.
+ * There is one exception, because the bias @ref FMARIROWS is subtracted 
+ * from the spill before calling the @ref vbwl_midyize function. 
+ * This leaves a small range of values to get a width of < 9, but
+ * at present vbwl does not make efficient use of it and encodes them in 9 bits.
+ */
+
+#define VBWLMINW 9
+
+unsigned int RZip32 (unsigned int *source, unsigned int len, unsigned int *cstream, unsigned int *alpha, unsigned int range);
+
+void init_arimodel (struct arimodel *model, unsigned int *buffer, int symbols);
+
+void initAriTable (int *destmodel, int ModeID);
+
+int makeCumulative (unsigned int *table, unsigned int nrows, unsigned int *cumu);
+
+void update_fm_ari_model (unsigned int *buffer, unsigned int nwords, unsigned int symbols, int initval, struct arimodel *model);
+
+void fmari_encodeSym8k (unsigned int *dest, unsigned int cp, unsigned int ncp);
+
+void fmari_flushEncoder (unsigned int *dest);
+
+int fmari_encode_chunk (int *chunk, int chunksize, int *dest, struct arimodel *model);
+
+unsigned int bits_used (unsigned int num);
+
+int vbwl_midsize (int *source, int words, int *dest, int BS);
+
+int fmari_compress (unsigned int *source, unsigned int nwords, unsigned int *dest, unsigned int *swap, unsigned int modeltype);
+
+
+#endif
diff --git a/CompressionEntity/src/SdpBuffers.c b/CompressionEntity/src/SdpBuffers.c
new file mode 100644
index 0000000..5db212d
--- /dev/null
+++ b/CompressionEntity/src/SdpBuffers.c
@@ -0,0 +1,1429 @@
+/**
+ * @file    SdpBuffers.c
+ * @ingroup SdpBuffers
+ * @author  Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @date    August, 2016
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ *
+ * @defgroup SdpBuffers Science Data Processing Buffers
+ * @ingroup  Sdp
+ *
+ * @brief various functions to initialize and manage buffers related with the
+ *        science data processing
+ *
+ * ## Overview
+ *
+ * This file contains functions to set up the compression entity, to set up
+ * the image buffers (@ref SIB) and increment them during input buffering, functions that
+ * manage the compression buffers internally, to convert header data to flat arrays
+ * and a set of small helper functions to deal with science-related memory access.
+ *
+ * ### @anchor SDB SDB (Science Data Buffer)
+ *
+ * For science data processing, a simple decision was taken -- it gets the second CPU core and the second half of the RAM, the SRAM2.
+ * Unfortunately this RAM bank is accessed with 32 bit granularity, i.e. access of shorts and characters will be wrong, consequently
+ * only 32 bit values can be read or stored. Second, there is one wait state on this bank, which increases the already slow data
+ * access by another ~10%. With these restrictions in mind, all of the 32 MiB of the SRAM2 are completely available for SDB data allocation.
+ *
+ * ## Mode of Operation
+ *
+ * ### Image Buffer Model
+ *
+ * Each input image is stored in a @anchor SIB __SIB__ (Single Image Buffer) before a number of images are picked up
+ * by the compression and processed to create a @ref CompressionEntity. Such a SIB has a certain
+ * reserved size and the number of consecutive SIBs is configured by the Configure SDB
+ * procedure through Service 198.
+ *
+ * An input image is not just a 2-dimensional array of pixel values, but a set of 5 sub-images. In addition,
+ * header data, such as temeperatures and voltages, the measured centroid for that image, quick photometry,
+ * counters, settings such as exposure time etc. are also stored within a SIB. In order to generate the internal
+ * layout of the SIB, the @ref CrIaSib structure is set up for an incoming image (set) whenever the first packet
+ * of such a set is processed. In window mode, the @ref CrIaSetupSibWin function is used, in full-frame mode,
+ * CrIaSetupSibFull is used.
+ *
+ * As already mentioned, a number of SIB slots is available as configured by the user per command. The current slot
+ * to be written and the current slot to be read are pointed to by the @ref SibIn and @ref SibOut pointers. These
+ * are two of the four @anchor XIB __XIB__ pointers (the others are GibIn and GibOut), which are 16 bit pointers
+ * of 1024 B unit and their base is the @ref SDB.
+ *
+ * They are managed in circular fashion using the following rules:
+ *   - the SibIn must not run into the SibOut, i.e. if all slots are full (because of misconfiguration by the used),
+ *     the slot pointed to by SibOut must not be overwritten by the new incoming data. This would corrupt the ongoing compression!
+ *     For a better understanding of the incrementation mechanism described beneath, the term __border__ is introduced here. Here, the
+ *     SibOut acts as a border to SibIn.
+ *   - at the beginning SibIn and SibOut are equal. SibIn can start, but SibOut must not.
+ *   - if there is no free slot available for incoming data, the most recently written SIB will be overwritten.
+ *     We do not simply discard the new data, because they are needed for the @ref Centroid generation
+ *   - The SibOut may assume the value of the SibIn, i.e. if all buffered images have been processed, it moves on.
+ *     The SibOut cannot get ahead of the SibIn. In a misconfigured situation, where only 2 images are buffered, but 3 are
+ *     commanded to be read, the last image will be read twice. This can happen, if the user has configured less slots
+ *     than the number of images to be stacked.
+ *   - the user must allow sufficient slots to be available.
+ *
+ * Similar to the SIB, the output data are stored in @anchor GIB GIB (Ground Image Buffer) slots. They are not structured with
+ * a setup function, because a GIB only
+ * holds one @ref CompressionEntity, the result of a data processing run. The same rules as for the SIB also apply to the GIB, in
+ * particular, a GibIn must not assume the value of the GibOut by incrementation, otherwise the currently being down transferred data
+ * may be corrupted.
+ *
+ * The two functions @ref updateXib and @ref updateXibFwd are available to increment the buffers in accordance with the rules above.
+ * @ref updateXib will not allow to run into a border, @updateXibFwd will allow to assume the border value, but not go further.
+ * In other words, @ref updateXibFwd goes one slot further than @ref updateXib, but none of the two ever get ahead of the border.
+ * @ref updateXib is used for the SibIn and for the GibIn, updateXibFwd is used for the SibOut and the GibOut.
+ *
+ * ### Data Processing Buffer
+ *
+ * Only one Compression is run at a time, and the data porcessing chain consists of several (optional) very different steps,
+ * so that the processing buffers need to be specially managed. For this purpose, all the @anchor CIB CIBs (Compression Image Buffer) that were
+ * configured are combined and then subdivided into CompressionEntity buffers using the @ref SetupCeBuffers function. All the metadata
+ * of the processing buffers are stored in the @ref ComprEntStructure. @ref SetupCeBuffers creates a buffer layout based on maximum product sizes
+ * for the compressed products. The first buffer will hold the compressed headers, the next one the compressed imagettes etc.
+ * At the tail of these 10 buffers, a processing buffer @anchor ProcBuf __ProcBuf__ is established, which starts at the beginning of the
+ * rest of the combined CIB area. This buffer can be used directly, or it can serve as a heap, where a special allocation
+ * function @ref AllocFromProcBuf is available. At the beginning, its size is set to 0. Use @ref ProcBufBorgMode to assimilate the whole
+ * remaining space.
+ *
+ *
+ * ## Notes
+ *
+ * As a guideline for the user to set up the @ref SDB, be greedy with the SIB (2x stacking order slots are sufficient) and the
+ * GIB (2 slots are sufficient), but give all the rest to the CIB (doesn't matter which one and how many slots, it will all be combined).
+ *
+ */
+
+#include "SdpBuffers.h"
+#include "SdpCompressionEntityStructure.h"
+#include "CrIaDataPoolId.h"
+#include "CrIaDataPool.h"
+#ifndef ISOLATED
+#include "Services/General/CrIaConstants.h"
+#endif
+
+#include <stdio.h>
+
+#ifndef GROUNDSW
+#include "CrIaIasw.h" /* for CrFwGetCurrentTime */
+#else
+#include "GroundSupport.h"
+extern struct cuctime GetCurrentTime(void); /* is in GroundSupport.c */
+extern unsigned char __BUILD_ID;
+#endif
+
+#ifdef PC_TARGET
+/**
+ * @brief	allocate memory from the @ref SDB
+ * @param	size the number of bytes to allocate. Use sizes which are multiples of 4
+ * @param	reset a bool which resets the whole SDB
+ *
+ * @returns     the real address of the allocated buffer
+ * @note	the size is not tracked internally, and there is no
+ *		error if too much ram is requested.
+ */
+
+unsigned int * sdballoc (unsigned int size, unsigned char reset)
+{
+  static unsigned int used;
+  unsigned long int allocmem;
+
+  if (reset == 1)
+    {
+      used = 0;
+      return NULL;
+    }
+
+  allocmem =  GET_ADDR_FROM_SDB_OFFSET(0) + used;
+  used += size;
+
+  return (unsigned int *)allocmem; /* this shall return the real address */
+}
+
+
+/**
+ * @brief	allocate memory from the @ref RESERVED area
+ * @param	size the number of bytes to allocate. Use sizes which are multiples of 4
+ * @param	reset a bool which resets the whole RESERVED area
+ *
+ * @returns     the real address of the allocated buffer
+ * @note	the size is not tracked internally, and there is no
+ *		error if too much ram is requested.
+ */
+
+unsigned int * resalloc (unsigned int size, unsigned char reset)
+{
+  static unsigned int used;
+  unsigned long int allocmem;
+
+  if (reset == 1)
+    {
+      used = 0;
+      return NULL;
+    }
+
+  allocmem =  GET_ADDR_FROM_RES_OFFSET(0) + used;
+  used += size;
+
+  return (unsigned int *)allocmem; /* this shall return the real address */
+}
+
+unsigned int * auxalloc (unsigned int size, unsigned char reset)
+{
+  static unsigned int used;
+  unsigned long int allocmem;
+
+  if (reset == 1)
+    {
+      used = 0;
+      return NULL;
+    }
+
+  allocmem =  GET_ADDR_FROM_AUX_OFFSET(0) + used;
+  used += size;
+
+  return (unsigned int *)allocmem; /* this shall return the real address */
+}
+
+unsigned int * swapalloc (unsigned int size, unsigned char reset)
+{
+  static unsigned int used;
+  unsigned long int allocmem;
+
+  if (reset == 1)
+    {
+      used = 0;
+      return NULL;
+    }
+
+  allocmem =  GET_ADDR_FROM_SWAP_OFFSET(0) + used;
+  used += size;
+
+  return (unsigned int *)allocmem; /* this shall return the real address */
+}
+
+#endif
+
+
+/**
+ * @brief	initialize the CompressionEntity with values taken from the data pool
+ * @param	cestruct pointer to the ComprEntStructure
+ *
+ * @note        Some of these data pool variables are mandatory to be set. Make
+ *              sure they contain no rubbish before starting the compression.
+ */
+
+void InitComprEntStructureFromDataPool (struct ComprEntStructure *cestruct)
+{
+  unsigned short uint16, sdbstate;
+  unsigned int uint32;
+  unsigned char uint8;
+  
+  CrIaCopy (OBSERVATIONID_ID, &uint32);
+  cestruct->Obsid = uint32;
+
+#ifndef GROUNDSW
+  {
+    CrFwTimeStamp_t timetag;
+    
+    timetag = CrFwGetCurrentTime();
+    /* NOTE: the next two lines are big endian. */
+    uint32 = (((unsigned int)timetag.t[0]) << 24) | (((unsigned int)timetag.t[1]) << 16) | (((unsigned int)timetag.t[2]) << 8) | ((unsigned int)timetag.t[3]);
+    uint16 = (unsigned short) ((((unsigned int)timetag.t[4]) << 8) | ((unsigned int)timetag.t[5]));
+    cestruct->Timetag.coarse = uint32;
+    cestruct->Timetag.fine = uint16;
+    cestruct->Timetag.sync = uint16 & 0x1;
+  }
+#else
+  /* 
+     On ground we look at the cestruct->Timetag.
+     - If there is a nonzero value, we go ahead with it.
+     - If it is zero, we fetch the current PC time.
+
+     Note, that in order to work, the CE constructor 
+     must clear the field upon instantiation (it does so.).
+  */
+
+  if (cestruct->Timetag.coarse == 0)
+    {  
+      cestruct->Timetag = GetCurrentTime();
+    }
+  uint32 = cestruct->Timetag.coarse;
+  uint16 = cestruct->Timetag.fine;
+#endif
+  CrIaPaste (CE_TIMETAG_CRS_ID, &uint32);
+  CrIaPaste (CE_TIMETAG_FINE_ID, &uint16);
+			     
+  CrIaCopy (CE_COUNTER_ID, &uint16);
+  cestruct->Counter = uint16;
+
+  /* NOTE: the build number (previously updated here) is now filled in the CrIaInit function */
+  uint16 = VERSION;
+  CrIaPaste (CE_VERSION_ID, &uint16);
+  cestruct->Version = uint16;
+
+  CrIaCopy(STCK_ORDER_ID, &uint16); 
+  cestruct->StackingNumber = uint16 & 0xff;
+
+  /* 
+     NOTE: The following cestruct parameters are not initialized here,
+     but in the SibToFlatHeaders function, because they come from the SIB:
+
+     "AcquisitionMode" is set in SIB by the science update function. On ground we set it through RawHeadersToSib.
+     "FrameSource" is set in SIB by the science update function. On ground it is set by RawHeadersToSib to 0 (CCD).
+     "ExposureTime" is set in SIB by the science update function. On ground we set it through RawHeadersToSib. 
+  */ 
+
+  /* "Integrity" is set here to "OK", but later overwritten by SdpCompress as well as by the ScienceProcessing function. */
+  uint8 = DATA_OK;
+  CrIaPaste(CE_INTEGRITY_ID, &uint8);
+  cestruct->Integrity = uint8;
+  
+  CrIaCopy(PCCDRDMODE_ID, &uint16);
+  cestruct->ReadoutMode = (unsigned char) uint16;
+
+  CrIaCopy(PDATAOS_ID, &uint16);
+  cestruct->Oversampling = (unsigned char) uint16;
+    
+  CrIaCopy (PIMAGEREP_ID, &uint32);
+  cestruct->RepetitionPeriod = uint32;
+  
+  CrIaCopy (CE_SEMWINDOWPOSX_ID, &uint16); 
+  cestruct->SemWindowPosX = uint16;
+
+  CrIaCopy (CE_SEMWINDOWPOSY_ID, &uint16);
+  cestruct->SemWindowPosY = uint16;
+
+  CrIaCopy (CE_SEMWINDOWSIZEX_ID, &uint16);
+  cestruct->SemWindowSizeX = uint16;
+
+  CrIaCopy (CE_SEMWINDOWSIZEY_ID, &uint16);
+  cestruct->SemWindowSizeY = uint16;
+
+  CrIaCopy (TARGETLOCATIONX_ID, &uint32);
+  cestruct->Target_LocationX = uint32;
+
+  CrIaCopy (TARGETLOCATIONY_ID, &uint32);
+  cestruct->Target_LocationY = uint32;
+
+  /* NOTE: win and full have different CeKeys for Headers and Stacked. */
+  CrIaCopy(SDBSTATE_ID, &sdbstate);
+
+  if (sdbstate == CrIaSdb_CONFIG_FULL)
+    {
+      CrIaCopy (SDPFULLHDRCEKEY_ID, &uint32);
+      cestruct->HeaderData_CeKey = uint32;
+
+      CrIaCopy (SDPFULLIMGCEKEY_ID, &uint32);
+      cestruct->Stacked_CeKey = uint32;
+    }
+  else
+    {
+      CrIaCopy (SDPWINHDRCEKEY_ID, &uint32);
+      cestruct->HeaderData_CeKey = uint32;
+
+      CrIaCopy (SDPWINIMAGECEKEY_ID, &uint32);
+      cestruct->Stacked_CeKey = uint32;
+    }
+
+  CrIaCopy (SDPIMAGEAPTSHAPE_ID, &uint16);
+  cestruct->Stacked_Shape = uint16;
+
+  CrIaCopy (SDPIMAGEAPTX_ID, &uint16); 
+  cestruct->Stacked_SizeX = uint16;
+
+  CrIaCopy (SDPIMAGEAPTY_ID, &uint16);
+  cestruct->Stacked_SizeY = uint16;
+
+  CrIaCopy (SDPWINIMGTTCEKEY_ID, &uint32);
+  cestruct->Imagettes_CeKey = uint32;
+
+  CrIaCopy (SDPIMGTTAPTSHAPE_ID, &uint16);
+  cestruct->Imagettes_ApertureShape = uint16;
+
+  CrIaCopy (SDPIMGTTSTRAT_ID, &uint16);
+  cestruct->Imagettes_CroppingStrategy = uint16;
+
+  CrIaCopy (SDPIMGTTAPTX_ID, &uint16);
+  cestruct->Imagettes_ApertureSizeX = uint16;
+
+  CrIaCopy (SDPIMGTTAPTY_ID, &uint16);
+  cestruct->Imagettes_ApertureSizeY = uint16;
+
+  CrIaCopy (SDPIMGTTSTCKORDER_ID, &uint8); 
+  cestruct->Imagettes_StackingOrder = uint8;
+  
+  CrIaCopy (SDPWINMLOSCEKEY_ID, &uint32);
+  cestruct->ImgMrgLOS_CeKey = uint32;
+
+  CrIaCopy (SDPWINMLBLKCEKEY_ID, &uint32);
+  cestruct->ImgMrgLBLK_CeKey = uint32;
+
+  CrIaCopy (SDPWINMLDKCEKEY_ID, &uint32);
+  cestruct->ImgMrgLDK_CeKey = uint32;
+
+  CrIaCopy (SDPWINMRDKCEKEY_ID, &uint32);
+  cestruct->ImgMrgRDK_CeKey = uint32;
+
+  CrIaCopy (SDPWINMRBLKCEKEY_ID, &uint32);
+  cestruct->ImgMrgRBLK_CeKey = uint32;
+
+  CrIaCopy (SDPWINMTOSCEKEY_ID, &uint32);
+  cestruct->ImgMrgTOS_CeKey = uint32;
+
+  CrIaCopy (SDPWINMTDKCEKEY_ID, &uint32);
+  cestruct->ImgMrgTDK_CeKey = uint32;
+
+  CrIaCopy(SDPLDKCOLMASK_ID, &uint16);
+  cestruct->ImgMrgLDK_ColumnSelectionMask = uint16;
+
+  CrIaCopy(SDPRDKCOLMASK_ID, &uint16);
+  cestruct->ImgMrgRDK_ColumnSelectionMask = uint16;
+
+  return;
+}
+
+
+/**
+ * @brief	Increment the XIB pointer by one slot unless we would land on the the border. If we start on the border, move.
+ * @param	currentXib XIB pointer to be incremented
+ * @param	borderXibXIB pointer acting as @ref border
+ * @param       xibOffset  the local xib offset calculated from the real address of the XIB (e.g. sibAddressWin, must be aligned to 1024 B)
+ *                         best use GET_SDB_OFFSET_FROM_ADDR(xibAddress) for it
+ * @param	xibSize the size of a XIB slot
+ * @param	xibN the number of slots in this XIB
+ * @param	xib_err_id the id to put into the EVT_XIB_FULL
+ *
+ * @returns	the updated XIB pointer. If it cannot be incremented, hand back the input XIB
+ *
+ * @note        This is the "In" strategy.
+ */
+
+unsigned short updateXib(unsigned int currentXib, unsigned int borderXib, unsigned long int xibOffset, unsigned int xibSize, unsigned int xibN, unsigned short xib_err_id)
+{
+  unsigned int lastXib;
+  unsigned int nextXib;
+  unsigned long int localOff;
+  unsigned short fails;
+  unsigned short evt_data[2];
+  
+  localOff = (unsigned int) xibOffset; 
+
+  /* calcualte what the next XIB would be */
+  nextXib = currentXib + xibSize;
+
+  /* calcualte the 16 bit offset pointing to the last possible Slot */
+  lastXib = localOff + xibSize*(xibN-1);
+
+  /*  l_SDPRINT("xibin = %d and lastxib=%d and nextXib=%d\n", currentXib, lastXib, nextXib); */
+
+  /* if the last slot was used, the new slot will be the first one */
+  if (currentXib == lastXib)
+    nextXib = localOff;
+
+  /* if this collides with the output xib, return the unmodified XIB with error */
+  if (nextXib == borderXib)
+    {
+      /* in this case the buffer is full */
+      CrIaCopy(XIB_FAILURES_ID, &fails);
+      fails++;
+      CrIaPaste(XIB_FAILURES_ID, &fails);
+#ifdef ISOLATED
+      (void) evt_data;
+      SDPRINT("ERROR incrementing XIB with id %u\n", xib_err_id);
+#else
+      evt_data[0] = xib_err_id;
+      SdpEvtRaise(3, CRIA_SERV5_EVT_XIB_FULL, evt_data, 4);
+#endif
+      
+      return currentXib;
+    }
+  
+  return nextXib;
+}
+
+
+/**
+ * @brief	Increment the XIB pointer by one slot and allow to land on the the border. If we start on the border, do not move.
+ * @param	currentXib XIB pointer to be incremented
+ * @param	borderXib XIB pointer acting as @ref border
+ * @param       xibOffset  the local xib offset calculated from the real address of the XIB (e.g. sibAddressWin, must be aligned to 1024 B)
+ *                         best use GET_SDB_OFFSET_FROM_ADDR(xibAddress) for it
+ * @param	xibSize the size of a XIB slot
+ * @param	xibN the number of slots in this XIB
+ * @param	xib_err_id the id to put into the EVT_XIB_FULL
+ *
+ * @returns	the updated XIB pointer. If it cannot be incremented, hand back the input XIB
+ *
+ * @note        This is the "Out" strategy.
+ */
+
+unsigned short updateXibFwd(unsigned int currentXib, unsigned int borderXib, unsigned long int xibOffset, unsigned int xibSize, unsigned int xibN, unsigned short xib_err_id)
+{
+  unsigned int lastXib;
+  unsigned int nextXib;
+  unsigned int localOff;
+  unsigned short fails;
+  unsigned short evt_data[2];
+
+
+  if (currentXib == borderXib)
+    {
+      /* in this case the buffer is full */
+      CrIaCopy(XIB_FAILURES_ID, &fails);
+      fails++;
+      CrIaPaste(XIB_FAILURES_ID, &fails);
+#ifdef ISOLATED
+      (void) evt_data;
+      SDPRINT("ERROR incrementing XIB with id %u\n", xib_err_id);
+#else
+      evt_data[0] = xib_err_id;
+      SdpEvtRaise(3, CRIA_SERV5_EVT_XIB_FULL, evt_data, 4);
+#endif
+      return currentXib;
+    }
+  
+  localOff = (unsigned int) xibOffset; 
+
+  /* calcualte what the next XIB would be */
+  nextXib = currentXib + xibSize;
+
+  /* calcualte the 16 bit offset pointing to the last possible Slot */
+  lastXib = localOff + xibSize*(xibN-1);
+
+  /*  l_SDPRINT("xibin = %d and lastxib=%d and nextXib=%d\n", currentXib, lastXib, nextXib); */
+
+  /* if the last slot was used, the new slot will be the first one */
+  if (currentXib == lastXib)
+    nextXib = localOff;
+
+  /* if this collides with the output xib, return the new one, so they are equal */
+
+  return nextXib;
+}
+
+
+/**
+ * @brief	Attempt to increment the XIB pointer by N slots and allow to land on the the border. If we start on the border, do not move.
+ * @param	currentXib XIB pointer to be incremented
+ * @param	borderXib XIB pointer acting as @ref border
+ * @param       xibOffset  the local xib offset calculated from the real address of the XIB (e.g. sibAddressWin, must be aligned to 1024 B)
+ *                         best use GET_SDB_OFFSET_FROM_ADDR(xibAddress) for it
+ * @param	xibSize the size of a XIB slot
+ * @param	xibN the number of slots in this XIB
+ * @param	Nupdates the number of slots to move
+ * @param	xib_err_id the id to put into the EVT_XIB_FULL
+ *
+ * @returns	the updated XIB pointer. If it cannot be incremented, hand back the last XIB that was successfully incremented.
+ *
+ * @note        This is the "Out" strategy.
+ */
+
+unsigned short updateXibNTimesFwd(unsigned int currentXib, unsigned int borderXib, unsigned long int xibOffset, unsigned int xibSize, unsigned int xibN, unsigned int Nupdates, unsigned short xib_err_id)
+{
+  unsigned int i;
+
+  if (Nupdates == 0)
+    return currentXib;
+
+  for (i=0; i < Nupdates-1; i++)
+    currentXib = updateXib(currentXib, borderXib, xibOffset, xibSize, xibN, xib_err_id);
+
+  currentXib = updateXibFwd(currentXib, borderXib, xibOffset, xibSize, xibN, xib_err_id);
+
+  return currentXib;
+}
+
+
+/**
+ * @brief	Set this @ref SIB up in window mode
+ * @param	sib pointer to sib structure
+ * @param	sibIn @ref XIB pointer to the slot
+ * @param	Xdim horizontal size of the input image area (the main image), e.g. 200
+ * @param	Ydim vertical size, e.g. 200
+ *
+ * @returns	the size of the SIB that has been internally distibuted, or 0 if the distribution would exceed the SIB size.
+ *
+ */
+
+unsigned int CrIaSetupSibWin (struct CrIaSib *sib, unsigned short sibIn, unsigned int Xdim, unsigned int Ydim)
+{
+  unsigned short sibSize;
+  unsigned int usedSize;
+  unsigned short evt_data[2];
+  
+  sib->LsmSamples = 0;
+  sib->RsmSamples = 0;
+  sib->TmSamples = 0;
+  sib->ExposSamples = 0;
+  sib->Xdim = Xdim;
+  sib->Ydim = Ydim;
+
+  sib->Base = (unsigned int *)GET_ADDR_FROM_SDB_OFFSET(sibIn);
+
+  sib->Header = sib->Base;
+  sib->HeaderSize = SEM_DAT_HEADER_VALUES * BPW_SRAM2;
+
+  sib->Centroid = (unsigned int *)((unsigned long int)(sib->Header) + sib->HeaderSize);
+  sib->CentroidSize = SIB_CENTROID_VALUES * BPW_SRAM2;
+
+  sib->Photometry = (unsigned int *)((unsigned long int)(sib->Centroid) + sib->CentroidSize);
+  sib->PhotometrySize = SIB_PHOTOMETRY_VALUES * BPW_SRAM2;
+
+  sib->Lsm = (unsigned int *)((unsigned long int)(sib->Photometry) + sib->PhotometrySize);
+  sib->LsmSize = sib->Ydim * LSM_XDIM * BPW_PIXEL;
+  sib->LsmSize = (sib->LsmSize + 3) & 0xfffffffc; /* round up to 4B */
+  
+  sib->Rsm = (unsigned int *)((unsigned long int)(sib->Lsm) + sib->LsmSize);
+  sib->RsmSize = sib->Ydim * RSM_XDIM * BPW_PIXEL;
+  sib->RsmSize = (sib->RsmSize + 3) & 0xfffffffc; /* round up to 4B */
+  
+  sib->Tm = (unsigned int *)((unsigned long int)(sib->Rsm) + sib->RsmSize);
+  sib->TmSize = sib->Xdim * TM_YDIM * BPW_PIXEL;
+  sib->TmSize = (sib->TmSize + 3) & 0xfffffffc; /* round up to 4B */
+  
+  sib->Expos = (unsigned int *)((unsigned long int)(sib->Tm) + sib->TmSize);
+  sib->ExposSize = sib->Xdim * sib->Ydim * BPW_PIXEL;
+  sib->ExposSize = (sib->ExposSize + 3) & 0xfffffffc; /* round up to 4B */
+
+  usedSize = (unsigned long int)(sib->Expos) + sib->ExposSize - (unsigned long int)(sib->Base);
+
+  sib->UsedSize = usedSize;
+
+  CrIaCopy (SIBSIZEWIN_ID, &sibSize);
+
+  if (((unsigned int)sibSize * 1024) >= sib->UsedSize)
+    return sib->UsedSize;
+
+#ifdef ISOLATED
+  (void) evt_data;
+  SDPRINT("ERROR setting up SIB WIN structure with size of %u\n", sib->UsedSize);
+#else
+  evt_data[0] = (unsigned short)((sib->UsedSize >> 16) & 0xffff);
+  evt_data[1] = (unsigned short)(sib->UsedSize & 0xffff);
+  SdpEvtRaise(3, CRIA_SERV5_EVT_IMG_INSUF, evt_data, 4);
+#endif
+  
+  /* we keep the sizes for the header, centroid and photometry, but set the others to 0 */
+  sib->LsmSize = 0;
+  sib->RsmSize = 0;
+  sib->TmSize = 0;
+  sib->ExposSize = 0;
+
+  /* set the pointers right after the photometry */
+  sib->Rsm = sib->Lsm;
+  sib->Tm = sib->Rsm;
+  sib->Expos = sib->Tm;  
+ 
+  return 0;
+}
+
+
+/**
+ * @brief	Set this @ref SIB up in full frame
+ * @param	sib pointer to sib structure
+ * @param	sibIn @ref XIB pointer to the slot
+ *
+ * @returns	the size of the SIB that has been internally distibuted, or 0 if the distribution would exceed the SIB size.
+ *
+ */
+
+unsigned int CrIaSetupSibFull (struct CrIaSib *sib, unsigned short sibIn)
+{
+  unsigned short sibSize;
+  unsigned int usedSize;
+  unsigned short evt_data[2];
+  
+  sib->LsmSamples = 0;
+  sib->RsmSamples = 0;
+  sib->TmSamples = 0;
+  sib->ExposSamples = 0;
+  sib->Xdim = FULL_SIZE_X;
+  sib->Ydim = FULL_SIZE_Y;
+
+  sib->Base = (unsigned int *)GET_ADDR_FROM_SDB_OFFSET(sibIn);
+
+  sib->Header = sib->Base;
+  sib->HeaderSize = SEM_DAT_HEADER_VALUES * BPW_SRAM2;
+
+  sib->Centroid = (unsigned int *)((unsigned long int)(sib->Header) + sib->HeaderSize);
+  sib->CentroidSize = SIB_CENTROID_VALUES * BPW_SRAM2;
+
+  sib->Photometry = (unsigned int *)((unsigned long int)(sib->Centroid) + sib->CentroidSize);
+  sib->PhotometrySize = SIB_PHOTOMETRY_VALUES * BPW_SRAM2;
+
+  sib->Lsm = (unsigned int *)((unsigned long int)(sib->Photometry) + sib->PhotometrySize);
+  sib->LsmSize = 0;
+
+  sib->Rsm = (unsigned int *)((unsigned long int)(sib->Lsm) + sib->LsmSize);
+  sib->RsmSize = 0;
+
+  sib->Tm = (unsigned int *)((unsigned long int)(sib->Rsm) + sib->RsmSize);
+  sib->TmSize = 0;
+
+  sib->Expos = (unsigned int *)((unsigned long int)(sib->Tm) + sib->TmSize);
+  sib->ExposSize = sib->Xdim * sib->Ydim * BPW_PIXEL;
+  sib->ExposSize = (sib->ExposSize + 3) & 0xfffffffc; /* round up to 4B */
+
+  usedSize = ((unsigned long int)sib->Expos) + sib->ExposSize - (unsigned long int)(sib->Base);
+
+  sib->UsedSize = usedSize;
+
+  CrIaCopy (SIBSIZEFULL_ID, &sibSize);
+
+  if (((unsigned int)sibSize * 1024) >= sib->UsedSize)
+    return sib->UsedSize;
+
+#ifdef ISOLATED
+  (void) evt_data;
+  SDPRINT("ERROR setting up SIB FULL structure with size of %u\n", sib->UsedSize);
+#else
+  evt_data[0] = (unsigned short)((sib->UsedSize >> 16) & 0xffff);
+  evt_data[1] = (unsigned short)(sib->UsedSize & 0xffff);
+  SdpEvtRaise(3, CRIA_SERV5_EVT_IMG_INSUF, evt_data, 4);
+#endif
+
+  /* we keep the sizes for the header, centroid and photometry, but set the expos to 0 */
+  sib->ExposSize = 0;
+
+  /* set the pointers right after the photometry */
+  sib->Expos = sib->Tm;  
+  
+  return 0;
+}
+
+
+#ifdef GROUNDSW
+/**
+ * @brief	allocate a working buffer from the @ref ProcBuf
+ * @param	requested_size size of the buffer that you request (see note)
+ * @param	cestruct pointer to ComprEntStructure (it owns the ProcBuf)
+ *
+ * @returns	pointer to the requested buffer or NULL if insufficient space was available
+ *
+ * @note        requested size is rounded up to be word-aligned
+ *
+ */
+
+unsigned int *AllocFromProcBuf (unsigned int requested_size, struct ComprEntStructure *cestruct)
+{
+  unsigned int wordsleft;
+  unsigned int *newbuffer;
+  unsigned short evt_data[2];
+  
+  /* round up the requested size to word alignment */
+  requested_size = (requested_size + 3) & ~0x3;
+
+  /* check if enough space is left in the cib */
+  wordsleft = (cestruct->CibSize - cestruct->UsedBufferSize) >> 2;
+
+  SDPRINT("SIZES are: space: %d used: %d\n", cestruct->CibSize, cestruct->UsedBufferSize);
+  
+  if (4*wordsleft < requested_size)
+    {
+#ifdef ISOLATED
+      (void) evt_data;
+      SDPRINT("ERROR: could not allocate %u bytes from PROCBUF with %u bytes left!\n", 4*wordsleft, requested_size);
+#else
+      evt_data[0] = (unsigned short)((requested_size >> 16) & 0xffff); 
+      evt_data[1] = (unsigned short)(requested_size & 0xffff);
+      SdpEvtRaise(3, CRIA_SERV5_EVT_SDP_NOMEM, evt_data, 4);
+#endif    
+      return NULL;
+    }
+    
+  /* take the tail of the procbuffer as baseptr */
+  newbuffer = (unsigned int *)((unsigned long int)(cestruct->ProcBuf) + cestruct->ProcBufBufferSize);
+
+  /* adjust procbuffer size and used size */
+  cestruct->ProcBufBufferSize += requested_size;
+  cestruct->UsedBufferSize += requested_size;
+
+  
+  return newbuffer;
+}
+#endif
+
+/**
+ * @brief	moves the new ProcBuf pointer to the end of the previous one
+ * @param	cestruct pointer to ComprEntStructure (it owns the ProcBuf)
+ *
+ * @note        use this after @ref AllocFromProcBuf
+ *
+ */
+
+void ForwardProcBuf (struct ComprEntStructure *cestruct)
+{
+  cestruct->ProcBuf = (unsigned int *)((unsigned long int)(cestruct->ProcBuf) + cestruct->ProcBufBufferSize);
+  cestruct->ProcBufBufferSize = 0;
+
+  return;
+}
+
+#ifdef GROUNDSW
+/**
+ * @brief	moves the ProcBuf pointer back to where it originally started
+ * @param	cestruct pointer to ComprEntStructure (it owns the ProcBuf)
+ *
+ */
+
+void ResetProcBuf (struct ComprEntStructure *cestruct)
+{
+  cestruct->ProcBuf = (unsigned int *)((unsigned long int)(cestruct->ComprImgMrgTDK) + cestruct->ComprImgMrgTDKBufferSize);
+  cestruct->ProcBufBufferSize = 0;
+
+  cestruct->UsedBufferSize = (unsigned long int)(cestruct->ProcBuf) + cestruct->ProcBufBufferSize - (unsigned long int)(cestruct->Base);
+  return;
+}
+#endif
+
+/**
+ * @brief	Forward the ProbBuf and set its Size such that it comsumes all the remaining space
+ * @param	cestruct pointer to ComprEntStructure (it owns the ProcBuf)
+ *
+ */
+
+void ProcBufBorgMode (struct ComprEntStructure *cestruct)
+{
+  ForwardProcBuf (cestruct);
+
+  cestruct->ProcBufBufferSize = (cestruct->CibSize - cestruct->UsedBufferSize) & ~0x3;
+
+  cestruct->UsedBufferSize += cestruct->ProcBufBufferSize;
+
+  return;
+}
+
+/**
+ * @brief	Set up the buffer layout in the @ref CIB for compression.
+ * @param	cestruct pointer to ComprEntStructure (it has all the controls)
+ * @param	cibIn XIB pointer where to set it all up (just use what is set in the CrIaSdbFunc.c)
+ * @param	Xdim horizontal size of main input image
+ * @param	Ydim vertical size of main input image
+ * @param	Zdim transversal size, or better stack depth, number of frames
+ * @param	cemode @ref CEMODE_WIN (=1) or @ref CEMODE_FULL (=0)
+ *
+ * @todo        this can be rewritten using the @ref AllocFromProcBuf function, such as this is done in @ref SetupDecomprBuffers, (but that does not make it shorter or simpler...)
+ */
+
+unsigned int SetupCeBuffers (struct ComprEntStructure *cestruct, unsigned short cibIn, unsigned int Xdim, unsigned int Ydim, unsigned int Zdim, unsigned int cemode)
+{
+  unsigned short cibSizeWin, cibNWin, cibSizeFull, cibNFull;
+  unsigned int usedBufferSize;
+  unsigned short evt_data[2];
+ 
+  cestruct->Base = (unsigned int *)GET_ADDR_FROM_SDB_OFFSET(cibIn);
+  /* SDPRINT("---> the CIB base is set up at %x\n", (unsigned int)cestruct->Base); */
+
+  cestruct->ComprHeaders = cestruct->Base;
+  cestruct->ComprHeadersBufferSize = MAX_FLAT_HEADER_VALUES * Zdim * BPW_SRAM2 + OVERSIZE_HEADERS;
+
+  cestruct->ComprImagettes = (unsigned int *)((unsigned long int)(cestruct->ComprHeaders) + cestruct->ComprHeadersBufferSize);
+  cestruct->ComprImagettesBufferSize = (MAX_IMAGETTES_VALUES * Zdim * BPW_SRAM2 + OVERSIZE_IMAGETTES) * cemode ;
+
+  cestruct->ComprStacked = (unsigned int *)((unsigned long int)(cestruct->ComprImagettes) + cestruct->ComprImagettesBufferSize);
+  cestruct->ComprStackedBufferSize = Xdim * Ydim * Zdim * BPW_SRAM2 + OVERSIZE_STACKED;
+
+  cestruct->ComprImgMrgLOS = (unsigned int *)((unsigned long int)(cestruct->ComprStacked) + cestruct->ComprStackedBufferSize);
+cestruct->ComprImgMrgLOSBufferSize = (IMGMRG_LOS_W * Ydim * Zdim * BPW_SRAM2 + OVERSIZE_LOS) * cemode ;
+
+  cestruct->ComprImgMrgLDK = (unsigned int *)((unsigned long int)(cestruct->ComprImgMrgLOS) + cestruct->ComprImgMrgLOSBufferSize);
+cestruct->ComprImgMrgLDKBufferSize = (IMGMRG_LDK_W * Ydim * Zdim * BPW_SRAM2 + OVERSIZE_LDK) * cemode ;
+
+  cestruct->ComprImgMrgLBLK = (unsigned int *)((unsigned long int)(cestruct->ComprImgMrgLDK) + cestruct->ComprImgMrgLDKBufferSize);
+cestruct->ComprImgMrgLBLKBufferSize = (IMGMRG_LBLK_W * Ydim * Zdim * BPW_SRAM2 + OVERSIZE_LBLK) * cemode ;
+
+  cestruct->ComprImgMrgRBLK = (unsigned int *)((unsigned long int)(cestruct->ComprImgMrgLBLK) + cestruct->ComprImgMrgLBLKBufferSize);
+cestruct->ComprImgMrgRBLKBufferSize = (IMGMRG_RBLK_W * Ydim * Zdim * BPW_SRAM2 + OVERSIZE_RBLK) * cemode ;
+
+  cestruct->ComprImgMrgRDK = (unsigned int *)((unsigned long int)(cestruct->ComprImgMrgRBLK) + cestruct->ComprImgMrgRBLKBufferSize);
+cestruct->ComprImgMrgRDKBufferSize = (IMGMRG_RDK_W * Ydim * Zdim * BPW_SRAM2 + OVERSIZE_RDK) * cemode ;
+
+  cestruct->ComprImgMrgTOS = (unsigned int *)((unsigned long int)(cestruct->ComprImgMrgRDK) + cestruct->ComprImgMrgRDKBufferSize);
+cestruct->ComprImgMrgTOSBufferSize = (IMGMRG_TOS_H * Xdim * Zdim * BPW_SRAM2 + OVERSIZE_TOS) * cemode ;
+
+  cestruct->ComprImgMrgTDK = (unsigned int *)((unsigned long int)(cestruct->ComprImgMrgTOS) + cestruct->ComprImgMrgTOSBufferSize);
+cestruct->ComprImgMrgTDKBufferSize = (IMGMRG_TDK_H * Xdim * Zdim * BPW_SRAM2 + OVERSIZE_TDK) * cemode;
+
+  /* NOTE: do not change the order here, or the ProcBuf reset will no longer work */
+  cestruct->ProcBuf = (unsigned int *)((unsigned long int)(cestruct->ComprImgMrgTDK) + cestruct->ComprImgMrgTDKBufferSize);
+  cestruct->ProcBufBufferSize = 0; /* NOTE: ProcBuf is "allocated" 0 bytes here, but in fact you can use cestruct->CibBufferSize - cestruct->UsedBufferSize bytes. */
+
+  /* overloaded buffers */
+  cestruct->FlatHeaders = cestruct->ProcBuf; /* Fetcher uses the ProcBuf */
+  cestruct->Stacked     = cestruct->ProcBuf;
+  cestruct->Imagettes   = cestruct->ProcBuf;
+  cestruct->ImgMrgLOS   = cestruct->ProcBuf;
+  cestruct->ImgMrgLDK   = cestruct->ProcBuf;
+  cestruct->ImgMrgLBLK  = cestruct->ProcBuf;
+  cestruct->ImgMrgRBLK  = cestruct->ProcBuf;
+  cestruct->ImgMrgRDK   = cestruct->ProcBuf;
+  cestruct->ImgMrgTOS   = cestruct->ProcBuf;
+  cestruct->ImgMrgTDK   = cestruct->ProcBuf;
+#if (__sparc__)
+  cestruct->SwapBuf     = (unsigned int *)SRAM1_SWAP_ADDR;
+#else
+  swapalloc(0, 1);
+  cestruct->SwapBuf     = SWAPALLOC (SRAM1_SWAP_SIZE, SWAP);
+#endif
+  
+  cestruct->FlatHeadersBufferSize = 0;
+  cestruct->StackedBufferSize     = 0;
+  cestruct->ImagettesBufferSize   = 0;
+  cestruct->ImgMrgLOSBufferSize   = 0;
+  cestruct->ImgMrgLDKBufferSize   = 0;
+  cestruct->ImgMrgLBLKBufferSize  = 0;
+  cestruct->ImgMrgRBLKBufferSize  = 0;
+  cestruct->ImgMrgRDKBufferSize   = 0;
+  cestruct->ImgMrgTOSBufferSize   = 0;
+  cestruct->ImgMrgTDKBufferSize   = 0;
+  cestruct->SwapBufBufferSize     = SRAM1_SWAP_SIZE;
+
+  usedBufferSize = (unsigned long int)(cestruct->ProcBuf) + cestruct->ProcBufBufferSize - (unsigned long int)(cestruct->Base);
+
+  cestruct->UsedBufferSize = usedBufferSize;
+
+  /* we combine all CIBs, win and full into one cib */
+  /* NOTE: make sure they are allocated sequentially */
+  CrIaCopy (CIBSIZEWIN_ID, &cibSizeWin);
+  CrIaCopy (CIBSIZEFULL_ID, &cibSizeFull);
+  CrIaCopy (CIBNWIN_ID, &cibNWin);
+  CrIaCopy (CIBNFULL_ID, &cibNFull);
+
+  /*  SDPRINT("CIB Win Size: %d N:%d\n", cibSizeWin, cibNWin); */
+  /*  SDPRINT("CIB Full Size: %d N:%d\n", cibSizeFull, cibNFull); */
+
+  /* overall, the CIB is dimensioned after the larger one of Win/Full */  
+  cestruct->CibSize = (unsigned int)cibSizeWin * (unsigned int)cibNWin * 1024;
+  
+  if ((unsigned int)cibSizeFull * (unsigned int)cibNFull > (unsigned int)cibSizeWin * (unsigned int)cibNWin)
+    {
+      cestruct->CibSize = (unsigned int)cibSizeFull * (unsigned int)cibNFull * 1024;
+    }
+  
+  if (cestruct->CibSize >= cestruct->UsedBufferSize)
+    return cestruct->UsedBufferSize;
+
+#ifdef ISOLATED
+  (void) evt_data;
+  SDPRINT("ERROR setting up CIB compressed structure with size of %u\n", cestruct->UsedBufferSize);
+#else
+  evt_data[0] = (unsigned short)((cestruct->UsedBufferSize >> 16) & 0xffff);
+  evt_data[1] = (unsigned short)(cestruct->UsedBufferSize & 0xffff);
+  SdpEvtRaise(3, CRIA_SERV5_EVT_CMPR_SIZE, evt_data, 4);
+#endif
+  
+  return 0;
+}
+
+
+#ifdef GROUNDSW
+/**
+ * @brief	Set up the buffer layout in the @ref CIB for de-compression.
+ * @param	cestruct pointer to ComprEntStructure (it has all the controls)
+ * @param	cibIn XIB pointer where to set it all up (just use what is set in the CrIaSdbFunc.c)
+ * @param	Xdim horizontal size of main input image
+ * @param	Ydim vertical size of main input image
+ * @param	Zdim transversal size, or better stack depth, number of frames
+ *
+ * @note	This is only used on ground
+ */
+
+unsigned int SetupDecomprBuffers (struct ComprEntStructure *cestruct, unsigned short cibIn, unsigned int Xdim, unsigned int Ydim, unsigned int Zdim)
+{
+  unsigned short cibSizeWin, cibNWin, cibSizeFull, cibNFull;
+  unsigned int request, gbOffset;
+
+  cestruct->Base = (unsigned int *)GET_ADDR_FROM_SDB_OFFSET(cibIn);
+
+  /* all is ProcBuf */
+  cestruct->ProcBuf = cestruct->Base;
+
+  /* and we allocate from it ... but the cibsize must be calculated first, 
+     because it is used in AllocFroProcBuf */
+
+  /* we combine all CIBs, win and full into one cib */
+  /* NOTE: make sure they are allocated sequentially */
+  CrIaCopy (CIBSIZEWIN_ID, &cibSizeWin);
+  CrIaCopy (CIBSIZEFULL_ID, &cibSizeFull);
+  CrIaCopy (CIBNWIN_ID, &cibNWin);
+  CrIaCopy (CIBNFULL_ID, &cibNFull);
+
+  /* overall, the CIB is dimensioned after the larger one of Win/Full */  
+  cestruct->CibSize = (unsigned int)cibSizeWin * (unsigned int)cibNWin * 1024;
+  
+  if ((unsigned int)cibSizeFull * (unsigned int)cibNFull > (unsigned int)cibSizeWin * (unsigned int)cibNWin)
+    {
+      cestruct->CibSize = (unsigned int)cibSizeFull * (unsigned int)cibNFull * 1024;
+    } 
+
+  /* NOTE: On ground, we allocate the buffers for the decompressed products separately */
+  gbOffset = 0;
+  
+  /* Flat headers */
+  request = MAX_FLAT_HEADER_VALUES * Zdim * BPW_SRAM2 + OVERSIZE_HEADERS;  
+  cestruct->FlatHeaders = groundBuffer + gbOffset;
+  gbOffset += (request+3)/4;
+  cestruct->FlatHeadersBufferSize = request;
+
+  /* Imagettes */
+  request = MAX_IMAGETTES_VALUES * Zdim * BPW_SRAM2 + OVERSIZE_IMAGETTES;
+  cestruct->Imagettes = groundBuffer + gbOffset;
+  gbOffset += (request+3)/4;
+  cestruct->ImagettesBufferSize = request;
+
+  /* Stacked */
+  request = Xdim * Ydim * Zdim * BPW_SRAM2 + OVERSIZE_STACKED;
+  cestruct->Stacked = groundBuffer + gbOffset;
+  gbOffset += (request+3)/4;
+  cestruct->StackedBufferSize = request;
+
+  /* ImgMrgLOS */
+  request = IMGMRG_LOS_W * Ydim * Zdim * BPW_SRAM2 + OVERSIZE_LOS;
+  cestruct->ImgMrgLOS = groundBuffer + gbOffset;
+  gbOffset += (request+3)/4;
+  cestruct->ImgMrgLOSBufferSize = request;
+
+  /* ImgMrgLDK */
+  request = IMGMRG_LDK_W * Ydim * Zdim * BPW_SRAM2 + OVERSIZE_LDK;
+  cestruct->ImgMrgLDK = groundBuffer + gbOffset;
+  gbOffset += (request+3)/4;
+  cestruct->ImgMrgLDKBufferSize = request;
+
+  /* ImgMrgLBLK */
+  request = IMGMRG_LBLK_W * Ydim * Zdim * BPW_SRAM2 + OVERSIZE_LBLK;
+  cestruct->ImgMrgLBLK = groundBuffer + gbOffset;
+  gbOffset += (request+3)/4;
+  cestruct->ImgMrgLBLKBufferSize = request;
+
+  /* ImgMrgRBLK */
+  request = IMGMRG_RBLK_W * Ydim * Zdim * BPW_SRAM2 + OVERSIZE_RBLK;
+  cestruct->ImgMrgRBLK = groundBuffer + gbOffset;
+  gbOffset += (request+3)/4;
+  cestruct->ImgMrgRBLKBufferSize = request;
+
+  /* ImgMrgRDK */
+  request = IMGMRG_RDK_W * Ydim * Zdim * BPW_SRAM2 + OVERSIZE_RDK;
+  cestruct->ImgMrgRDK = groundBuffer + gbOffset;
+  gbOffset += (request+3)/4;
+  cestruct->ImgMrgRDKBufferSize = request;
+
+  /* ImgMrgTOS */
+  request = IMGMRG_TOS_H * Xdim * Zdim * BPW_SRAM2 + OVERSIZE_TOS;
+  cestruct->ImgMrgTOS = groundBuffer + gbOffset;
+  gbOffset += (request+3)/4;
+  cestruct->ImgMrgTOSBufferSize = request;
+
+  /* ImgMrgTDK */
+  request = IMGMRG_TDK_H * Xdim * Zdim * BPW_SRAM2 + OVERSIZE_TDK;
+  cestruct->ImgMrgTDK = groundBuffer + gbOffset;
+  gbOffset += (request+3)/4;
+  cestruct->ImgMrgTDKBufferSize = request;
+
+  if ((gbOffset * 4) > GROUNDBUFFERSIZE)
+    {
+      SDPRINT("ERROR: We cannot reserve enough space in the groundBuffer for the decompressed products!\n");
+    }
+  
+  /* The buffers for the compressed data are allocated from the CIB */
+  request = MAX_FLAT_HEADER_VALUES * Zdim * BPW_SRAM2 + OVERSIZE_HEADERS;
+  if ((cestruct->ComprHeaders = AllocFromProcBuf (request, cestruct)) != NULL)
+    cestruct->ComprHeadersBufferSize = request;
+  
+  request = MAX_IMAGETTES_VALUES * Zdim * BPW_SRAM2 + OVERSIZE_IMAGETTES;
+  if ((cestruct->ComprImagettes = AllocFromProcBuf (request, cestruct)) != NULL)
+    cestruct->ComprImagettesBufferSize = request;
+
+  request = Xdim * Ydim * Zdim * BPW_SRAM2 + OVERSIZE_STACKED;
+  if ((cestruct->ComprStacked = AllocFromProcBuf (request, cestruct)) != NULL)
+    cestruct->ComprStackedBufferSize = request;
+
+  request = IMGMRG_LOS_W * Ydim * Zdim * BPW_SRAM2 + OVERSIZE_LOS;
+  if ((cestruct->ComprImgMrgLOS = AllocFromProcBuf (request, cestruct)) != NULL)
+    cestruct->ComprImgMrgLOSBufferSize = request;
+
+  request = IMGMRG_LDK_W * Ydim * Zdim * BPW_SRAM2 + OVERSIZE_LDK;
+  if ((cestruct->ComprImgMrgLDK = AllocFromProcBuf (request, cestruct)) != NULL)
+    cestruct->ComprImgMrgLDKBufferSize = request;
+
+  request = IMGMRG_LBLK_W * Ydim * Zdim * BPW_SRAM2 + OVERSIZE_LBLK;
+  if ((cestruct->ComprImgMrgLBLK = AllocFromProcBuf (request, cestruct)) != NULL)
+    cestruct->ComprImgMrgLBLKBufferSize = request;
+
+  request = IMGMRG_RBLK_W * Ydim * Zdim * BPW_SRAM2 + OVERSIZE_RBLK;
+  if ((cestruct->ComprImgMrgRBLK = AllocFromProcBuf (request, cestruct)) != NULL)
+    cestruct->ComprImgMrgRBLKBufferSize = request;
+
+  request = IMGMRG_RDK_W * Ydim * Zdim * BPW_SRAM2 + OVERSIZE_RDK;
+  if ((cestruct->ComprImgMrgRDK = AllocFromProcBuf (request, cestruct)) != NULL)
+    cestruct->ComprImgMrgRDKBufferSize = request;
+
+  request = IMGMRG_TOS_H * Xdim * Zdim * BPW_SRAM2 + OVERSIZE_TOS;
+  if ((cestruct->ComprImgMrgTOS = AllocFromProcBuf (request, cestruct)) != NULL)
+    cestruct->ComprImgMrgTOSBufferSize = request;
+
+  request = IMGMRG_TDK_H * Xdim * Zdim * BPW_SRAM2 + OVERSIZE_TDK;
+  if ((cestruct->ComprImgMrgTDK = AllocFromProcBuf (request, cestruct)) != NULL)
+    cestruct->ComprImgMrgTDKBufferSize = request;
+
+  
+  /* NOTE: do not change the order here, or the ProcBuf reset will no longer work */
+  /* NOTE: ProcBuf is implicitly forwarded here */
+  cestruct->ProcBuf = (unsigned int *)((unsigned long int)(cestruct->ComprImgMrgTDK) + cestruct->ComprImgMrgTDKBufferSize);
+  cestruct->ProcBufBufferSize = 0; /* NOTE: ProcBuf is "allocated" 0 bytes here, but in fact you can use cestruct->CibBufferSize - cestruct->UsedBufferSize bytes. */
+
+#if (__sparc__)
+  cestruct->SwapBuf = (unsigned int *)SRAM1_SWAP_ADDR;
+#else
+  swapalloc(0, 1);
+  cestruct->SwapBuf = SWAPALLOC (SRAM1_SWAP_SIZE, SWAP);
+#endif  
+  cestruct->SwapBufBufferSize  = SRAM1_SWAP_SIZE;
+
+  cestruct->UsedBufferSize = (unsigned long int)(cestruct->ProcBuf) + cestruct->ProcBufBufferSize - (unsigned long int)(cestruct->Base);
+
+  
+  if (cestruct->CibSize >= cestruct->UsedBufferSize)
+    return cestruct->UsedBufferSize;
+
+  return 0;
+}
+#endif
+
+
+#ifdef ISOLATED
+/**
+ * @brief       print CE buffer layout for debugging
+ * @param	cestruct pointer to ComprEntStructure
+ */
+
+void PrintoutCeBuffers (struct ComprEntStructure *cestruct)
+{
+#if (__sparc__)
+  SDPRINT("Base           : %x\n", (unsigned int)cestruct->Base);
+  SDPRINT("FlatHeaders    : %x \t %d\n", (unsigned int)cestruct->FlatHeaders, cestruct->FlatHeadersBufferSize);
+  SDPRINT("Stacked        : %x \t %d\n", (unsigned int)cestruct->Stacked, cestruct->StackedBufferSize);
+  SDPRINT("Imagettes      : %x \t %d\n", (unsigned int)cestruct->Imagettes, cestruct->ImagettesBufferSize);
+  SDPRINT("ImgMrgLOS      : %x \t %d\n", (unsigned int)cestruct->ImgMrgLOS, cestruct->ImgMrgLOSBufferSize);
+  SDPRINT("ImgMrgLDK      : %x \t %d\n", (unsigned int)cestruct->ImgMrgLDK, cestruct->ImgMrgLDKBufferSize);
+  SDPRINT("ImgMrgLBLK     : %x \t %d\n", (unsigned int)cestruct->ImgMrgLBLK, cestruct->ImgMrgLBLKBufferSize);
+  SDPRINT("ImgMrgRBLK     : %x \t %d\n", (unsigned int)cestruct->ImgMrgRBLK, cestruct->ImgMrgRBLKBufferSize);
+  SDPRINT("ImgMrgRDK      : %x \t %d\n", (unsigned int)cestruct->ImgMrgRDK, cestruct->ImgMrgRDKBufferSize);
+  SDPRINT("ImgMrgTOS      : %x \t %d\n", (unsigned int)cestruct->ImgMrgTOS, cestruct->ImgMrgTOSBufferSize);
+  SDPRINT("ImgMrgTDK      : %x \t %d\n", (unsigned int)cestruct->ImgMrgTDK, cestruct->ImgMrgTDKBufferSize);
+  SDPRINT("ComprHeaders   : %x \t %d\n", (unsigned int)cestruct->ComprHeaders, cestruct->ComprHeadersBufferSize);
+  SDPRINT("ComprImagettes : %x \t %d\n", (unsigned int)cestruct->ComprImagettes, cestruct->ComprImagettesBufferSize);
+  SDPRINT("ComprStacked   : %x \t %d\n", (unsigned int)cestruct->ComprStacked, cestruct->ComprStackedBufferSize);
+  SDPRINT("ComprImgMrgLOS : %x \t %d\n", (unsigned int)cestruct->ComprImgMrgLOS, cestruct->ComprImgMrgLOSBufferSize);
+  SDPRINT("ComprImgMrgLDK : %x \t %d\n", (unsigned int)cestruct->ComprImgMrgLDK, cestruct->ComprImgMrgLDKBufferSize);
+  SDPRINT("ComprImgMrgLBLK: %x \t %d\n", (unsigned int)cestruct->ComprImgMrgLBLK, cestruct->ComprImgMrgLBLKBufferSize);
+  SDPRINT("ComprImgMrgRBLK: %x \t %d\n", (unsigned int)cestruct->ComprImgMrgRBLK, cestruct->ComprImgMrgRBLKBufferSize);
+  SDPRINT("ComprImgMrgRDK : %x \t %d\n", (unsigned int)cestruct->ComprImgMrgRDK, cestruct->ComprImgMrgRDKBufferSize);
+  SDPRINT("ComprImgMrgTOS : %x \t %d\n", (unsigned int)cestruct->ComprImgMrgTOS, cestruct->ComprImgMrgTOSBufferSize);
+  SDPRINT("ComprImgMrgTDK : %x \t %d\n", (unsigned int)cestruct->ComprImgMrgTDK, cestruct->ComprImgMrgTDKBufferSize);
+  SDPRINT("ProcBuf        : %x \t %d\n", (unsigned int)cestruct->ProcBuf, cestruct->ProcBufBufferSize);
+  SDPRINT("SwapBuf         : %x \t %d\n", (unsigned int)cestruct->SwapBuf, cestruct->SwapBufBufferSize);
+
+  SDPRINT("Used size: %d\n", cestruct->UsedBufferSize);
+  SDPRINT("Cib size: %d\n", cestruct->CibSize);
+#else
+  SDPRINT("Base           : %lx\n", (unsigned long int)cestruct->Base);
+  SDPRINT("FlatHeaders    : %lx \t %d\n", (unsigned long int)cestruct->FlatHeaders, cestruct->FlatHeadersBufferSize);
+  SDPRINT("Stacked        : %lx \t %d\n", (unsigned long int)cestruct->Stacked, cestruct->StackedBufferSize);
+  SDPRINT("Imagettes      : %lx \t %d\n", (unsigned long int)cestruct->Imagettes, cestruct->ImagettesBufferSize);
+  SDPRINT("ImgMrgLOS      : %lx \t %d\n", (unsigned long int)cestruct->ImgMrgLOS, cestruct->ImgMrgLOSBufferSize);
+  SDPRINT("ImgMrgLDK      : %lx \t %d\n", (unsigned long int)cestruct->ImgMrgLDK, cestruct->ImgMrgLDKBufferSize);
+  SDPRINT("ImgMrgLBLK     : %lx \t %d\n", (unsigned long int)cestruct->ImgMrgLBLK, cestruct->ImgMrgLBLKBufferSize);
+  SDPRINT("ImgMrgRBLK     : %lx \t %d\n", (unsigned long int)cestruct->ImgMrgRBLK, cestruct->ImgMrgRBLKBufferSize);
+  SDPRINT("ImgMrgRDK      : %lx \t %d\n", (unsigned long int)cestruct->ImgMrgRDK, cestruct->ImgMrgRDKBufferSize);
+  SDPRINT("ImgMrgTOS      : %lx \t %d\n", (unsigned long int)cestruct->ImgMrgTOS, cestruct->ImgMrgTOSBufferSize);
+  SDPRINT("ImgMrgTDK      : %lx \t %d\n", (unsigned long int)cestruct->ImgMrgTDK, cestruct->ImgMrgTDKBufferSize);
+  SDPRINT("ComprHeaders   : %lx \t %d\n", (unsigned long int)cestruct->ComprHeaders, cestruct->ComprHeadersBufferSize);
+  SDPRINT("ComprImagettes : %lx \t %d\n", (unsigned long int)cestruct->ComprImagettes, cestruct->ComprImagettesBufferSize);
+  SDPRINT("ComprStacked   : %lx \t %d\n", (unsigned long int)cestruct->ComprStacked, cestruct->ComprStackedBufferSize);
+  SDPRINT("ComprImgMrgLOS : %lx \t %d\n", (unsigned long int)cestruct->ComprImgMrgLOS, cestruct->ComprImgMrgLOSBufferSize);
+  SDPRINT("ComprImgMrgLDK : %lx \t %d\n", (unsigned long int)cestruct->ComprImgMrgLDK, cestruct->ComprImgMrgLDKBufferSize);
+  SDPRINT("ComprImgMrgLBLK: %lx \t %d\n", (unsigned long int)cestruct->ComprImgMrgLBLK, cestruct->ComprImgMrgLBLKBufferSize);
+  SDPRINT("ComprImgMrgRBLK: %lx \t %d\n", (unsigned long int)cestruct->ComprImgMrgRBLK, cestruct->ComprImgMrgRBLKBufferSize);
+  SDPRINT("ComprImgMrgRDK : %lx \t %d\n", (unsigned long int)cestruct->ComprImgMrgRDK, cestruct->ComprImgMrgRDKBufferSize);
+  SDPRINT("ComprImgMrgTOS : %lx \t %d\n", (unsigned long int)cestruct->ComprImgMrgTOS, cestruct->ComprImgMrgTOSBufferSize);
+  SDPRINT("ComprImgMrgTDK : %lx \t %d\n", (unsigned long int)cestruct->ComprImgMrgTDK, cestruct->ComprImgMrgTDKBufferSize);
+  SDPRINT("ProcBuf        : %lx \t %d\n", (unsigned long int)cestruct->ProcBuf, cestruct->ProcBufBufferSize);
+  SDPRINT("SwapBuf         : %lx \t %d\n", (unsigned long int)cestruct->SwapBuf, cestruct->SwapBufBufferSize);
+
+  SDPRINT("Used size: %d\n", cestruct->UsedBufferSize);
+  SDPRINT("Cib size: %d\n", cestruct->CibSize);
+#endif
+
+  return;
+}
+#endif
+
+
+/**
+ * @brief	collect data from the @ref SIB header and assemble as flat array in the FlatHeader section of the CeBuffer.
+ * @param	Headers pointer to a ScienceBuf structure (the Compression has one)
+ */
+
+void SibToFlatHeaders (struct ScienceBuf *Headers, struct ComprEntStructure *cestruct)
+{
+  unsigned int i, push_back;
+  unsigned int *uip;
+  int status;
+  unsigned short ustemp1, ustemp2;
+  struct CrIaSib sib;
+  struct SibHeader *sibHeader;
+  struct SibCentroid *sibCentroid;
+  struct SibPhotometry *sibPhotometry;
+  unsigned short sibIn, sibOut, newSibOut, sibSizeWin, sibNWin, sibSizeFull, sibNFull, sdbstate;
+  unsigned long int xibOffset;
+  unsigned int *FlatHeaders = (unsigned int *) Headers->data;
+  
+  /* get Sib parameters and state of SDB (WIN or FULL) */
+  CrIaCopy (SIBIN_ID, &sibIn);
+  CrIaCopy (SIBOUT_ID, &sibOut);
+  CrIaCopy (SIBSIZEWIN_ID, &sibSizeWin);
+  CrIaCopy (SIBNWIN_ID, &sibNWin);
+  CrIaCopy (SIBSIZEFULL_ID, &sibSizeFull);
+  CrIaCopy (SIBNFULL_ID, &sibNFull);
+  CrIaCopy (SDBSTATE_ID, &sdbstate);
+
+  push_back = 0;
+
+  /* loop over frames */
+  for (i=0; i < Headers->zelements; i++)
+    {
+      /* setup SIB structure using current sibOut (the compression is the SIB consumer, thus it reads from "out") */
+      status = 0;
+      if (sdbstate == CrIaSdb_CONFIG_WIN)
+        status = CrIaSetupSibWin (&sib, sibOut, Headers->xelements, Headers->yelements);
+
+      if (sdbstate == CrIaSdb_CONFIG_FULL)
+        status = CrIaSetupSibFull (&sib, sibOut);
+
+      if (status == 0)
+        {
+	  /* error gets reported by setup function */
+          break;
+        }
+
+      /* init structure pointers */
+      sibHeader = (struct SibHeader *) sib.Header;
+      sibCentroid = (struct SibCentroid *) sib.Centroid;
+      sibPhotometry = (struct SibPhotometry *) sib.Photometry;
+      
+      /* NOTE: There are a few cestruct parameters left, which were not initialized from data pool,
+	 but which shall come from the first SIB header. We initialize them here. 
+	 They are not used at all by the compression, but the collection wants them. */
+      if (i == 0)
+	{
+	  cestruct->AcquisitionMode = sibHeader->AcqType; /* CCD_FULL etc */
+	  cestruct->FrameSource = sibHeader->AcqSrc;
+	  cestruct->ExposureTime = sibHeader->ExposureTime;
+	}
+
+      /* enter the header parameters from the SIB into the flat header array */
+      FlatHeaders[push_back++] = sibHeader->AcqId;       /* 4B SemHkStatDataAcqId */
+      FlatHeaders[push_back++] = sibHeader->VoltFeeVod;  /* 4B HkVoltFeeVod */      
+      FlatHeaders[push_back++] = sibHeader->VoltFeeVrd;  /* 4B HkVoltFeeVrd */
+      FlatHeaders[push_back++] = sibHeader->VoltFeeVog;  /* 4B HkVoltFeeVog */
+      FlatHeaders[push_back++] = sibHeader->VoltFeeVss;  /* 4B HkVoltFeeVss */
+      FlatHeaders[push_back++] = sibHeader->TempFeeCcd;  /* 4B HkTempFeeCcd */
+      FlatHeaders[push_back++] = sibHeader->TempFeeAdc;  /* 4B HkTempFeeAdc */
+      FlatHeaders[push_back++] = sibHeader->TempFeeBias; /* 4B HkTempFeeBias */
+      ustemp1 = sibHeader->N5V;
+      ustemp2 = sibHeader->Temp1;
+      FlatHeaders[push_back++] = PACKSHORTS(ustemp1,ustemp2); /* 2B | 2B */
+      ustemp1 = sibHeader->TempOh1A;
+      ustemp2 = sibHeader->TempOh1B;
+      FlatHeaders[push_back++] = PACKSHORTS(ustemp1,ustemp2); /* 2B | 2B */
+      ustemp1 = sibHeader->TempOh2A;
+      ustemp2 = sibHeader->TempOh2B;
+      FlatHeaders[push_back++] = PACKSHORTS(ustemp1,ustemp2); /* 2B | 2B */
+      ustemp1 = sibHeader->TempOh3A;
+      ustemp2 = sibHeader->TempOh3B;
+      FlatHeaders[push_back++] = PACKSHORTS(ustemp1,ustemp2); /* 2B | 2B */
+      ustemp1 = sibHeader->TempOh4A;
+      ustemp2 = sibHeader->TempOh4B;
+      FlatHeaders[push_back++] = PACKSHORTS(ustemp1,ustemp2); /* 2B | 2B */
+      ustemp1 = sibHeader->CcdTimingScriptId;
+      ustemp2 = sibHeader->PixDataOffset;
+      FlatHeaders[push_back++] = PACKSHORTS(ustemp1,ustemp2); /* 2B CcdTimingScript | 2B PixDataOffset */
+      /* pack Centroid */
+      FlatHeaders[push_back++] = sibCentroid->offsetX;                 /* 3B stored in 4B */ 
+      FlatHeaders[push_back++] = sibCentroid->offsetY;                 /* 3B stored in 4B */
+      FlatHeaders[push_back++] = sibCentroid->targetLocX;              /* 3B stored in 4B */
+      FlatHeaders[push_back++] = sibCentroid->targetLocY;              /* 3B stored in 4B */
+      FlatHeaders[push_back++] = sibCentroid->startIntegCoarse;        /* 4B */
+      FlatHeaders[push_back++] = sibCentroid->startIntegFine;          /* 2B stored in 4B */
+      FlatHeaders[push_back++] = sibCentroid->endIntegCoarse;          /* 4B */
+      FlatHeaders[push_back++] = sibCentroid->endIntegFine;            /* 2B stored in 4B */
+      FlatHeaders[push_back++] = PACKSHORTS(sibCentroid->dataCadence, sibCentroid->validityStatus);     /* 2B Cadence | 1B spare | 1B Validity */
+      /* pack Photometry */
+      uip = (unsigned int *)&sibPhotometry->centrum; /* 4B */
+      FlatHeaders[push_back++] = *uip;
+      uip = (unsigned int *)&sibPhotometry->annulus1;
+      FlatHeaders[push_back++] = *uip;
+      uip = (unsigned int *)&sibPhotometry->annulus2;
+      FlatHeaders[push_back++] = *uip;
+
+
+      if (i < Headers->zelements - 1) /* don't update for the last frame */
+	{
+	  /* move to the next sibIn in sequence */
+	  if (sdbstate == CrIaSdb_CONFIG_WIN)
+	    {
+	      xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)sibAddressWin);
+	      newSibOut = updateXibFwd((unsigned int)sibOut, (unsigned int)sibIn, xibOffset, (unsigned int)sibSizeWin, (unsigned int)sibNWin, SIBOUT_WIN_XIB);
+	    }
+	  else
+	    {
+	      xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)sibAddressFull);
+	      newSibOut = updateXibFwd((unsigned int)sibOut, (unsigned int)sibIn, xibOffset, (unsigned int)sibSizeFull, (unsigned int)sibNFull, SIBOUT_FULL_XIB);
+	    }
+	  
+	  /* NOTE: if SIBOUT couldn't be incremented, we clone the last one */
+	  
+	  sibOut = newSibOut;
+	}
+	  
+      /* NOTE: We do not write back SIBOUT into the DP here */
+    }
+
+  if (MAX_FLAT_HEADER_VALUES * i != push_back)
+    SDPRINT("ERROR assembling flat header array! %d != %d\n", MAX_FLAT_HEADER_VALUES * i, push_back);
+
+  return;
+}
+
+
+
+/**
+ * @brief       copy values packed as unsigned shorts into ints
+ *
+ * @param[out]  dest            pointer to the output array
+ * @param[in]   src             pointer to the input array of shorts
+ * @param[in]   nValues         number of values to be copied
+ *
+ * @returns     number of words written
+ * @note        the output data must be 4-byte aligned
+ * @note        this version also works in SRAM2
+ */
+
+unsigned int UnpackU16ToU32 (uint32_t *src, uint32_t nValues, uint32_t *dest, uint32_t swapFlag)
+{
+  uint32_t i, j, nHalf;
+
+  nHalf = nValues >> 1;
+
+  if (swapFlag == UNPACK_NOSWAP)
+    {
+      for (i=0, j=0; i < nHalf; i++)
+        {
+          dest[j++] = src[i] >> 16;
+          dest[j++] = src[i] & 0xffff;
+        }
+
+      /* treat the last sample of an odd number of input samples */
+      if (nValues & 0x01)
+        dest[j++] = src[i] >> 16;
+    }
+  else
+    {
+      for (i=0, j=0; i < nHalf; i++)
+        {
+          dest[j++] = src[i] & 0xffff;
+          dest[j++] = src[i] >> 16;
+        }
+
+      /* treat the last sample of an odd number of input samples */
+      if (nValues & 0x01)
+        dest[j++] = src[i] & 0xffff;
+    }
+
+  return j;
+}
+
+/**
+ * @brief       copy values packed as unsigned shorts into ints
+ * @param[out]  dest            pointer to the output array
+ * @param[in]   src             pointer to the input array of shorts
+ * @param[in]   nValues         number of values to be copied
+ * @returns     number of halfwords written
+ *
+ * @note        the output data must be 4-byte aligned
+ * @note        this version also works in SRAM2
+ */
+
+/* NOTE: the input data must be 4-byte aligned */
+unsigned int PackU16FromU32 (uint32_t *src, uint32_t nValues, uint32_t *dest, uint32_t swapFlag)
+{
+  uint32_t i, j, nHalf;
+
+  nHalf = nValues >> 1;
+
+  if (swapFlag == 0)
+    {
+      for (i=0, j=0; i < nHalf; i++)
+        {
+          dest[i] = src[j++] << 16;
+          dest[i] |= src[j++] & 0xffff;
+        }
+
+      /* treat the last sample of an odd number of input samples */
+      if (nValues & 0x01)
+        {
+          /* do not overwrite the other half word */
+          dest[i] &= 0xffff;
+          dest[i] |= src[j++] << 16;
+          /* i++; */
+        }
+    }
+  else
+    {
+      for (i=0, j=0; i < nHalf; i++)
+        {
+          dest[i] = src[j++] & 0xffff;
+          dest[i] |= src[j++] << 16;
+        }
+
+      /* treat the last sample of an odd number of input samples */
+      if (nValues & 0x01)
+        {
+          /* do not overwrite the other half word */
+          dest[i] &= 0xffff0000;
+          dest[i] |= src[j++] & 0xffff;
+          /* i++; */
+        }
+    }
+
+  return j;
+}
+
+
+/**
+ * @brief       initialize a swap science buffer with the needed values
+ * @param       swapbuffer   pointer to a @ref ScienceBuf struct
+ * @param       cestruct     pointer to the ComprEntStructure (where the buffer location is taken from)
+ */
+
+void PrepareSwap (struct ScienceBuf *swapbuffer, struct ComprEntStructure *cestruct)
+{
+  /* prepare a swap buffer that uses the SwapBuf of the CE structure */
+  swapbuffer->datatype = DATATYPE_UINT32;
+  swapbuffer->xelements = cestruct->SwapBufBufferSize / TYPESIZE(DATATYPE_UINT32);
+  swapbuffer->yelements = 1;
+  swapbuffer->zelements = 1;
+  swapbuffer->nelements = swapbuffer->xelements * swapbuffer->yelements * swapbuffer->zelements;
+  swapbuffer->data = (void *) cestruct->SwapBuf;
+
+  return;
+}
+
diff --git a/CompressionEntity/src/SdpBuffers.h b/CompressionEntity/src/SdpBuffers.h
new file mode 100644
index 0000000..6f6e261
--- /dev/null
+++ b/CompressionEntity/src/SdpBuffers.h
@@ -0,0 +1,299 @@
+/**
+ * @file    SdpBuffers.h
+ * @author  Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @date    September, 2016
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef SDP_BUFFERS_H
+#define SDP_BUFFERS_H
+
+#include <stdint.h> /* for uint32_t */
+#include "SdpCeDefinitions.h"
+#include "SdpCompressionEntityStructure.h"
+
+/* access to RAM */
+#if (__sparc__)
+#include <wrap_malloc.h>
+#else
+#define SRAM1_SWAP_SIZE  0x600000
+#define SRAM1_RES_SIZE   0x800000
+#define SRAM1_FLASH_SIZE 0x420000
+#endif
+
+#define MAX_FLAT_HEADER_VALUES 26
+#define MAX_IMAGETTES_VALUES (100*100)
+#define MAX_STCK_ORDER 100
+#define OVERSIZE_HEADERS 32
+#define OVERSIZE_IMAGETTES 0
+#define OVERSIZE_STACKED 0
+#define OVERSIZE_LOS 0
+#define OVERSIZE_LDK 0
+#define OVERSIZE_LBLK 0
+#define OVERSIZE_RBLK 0
+#define OVERSIZE_RDK 0
+#define OVERSIZE_TOS 0
+#define OVERSIZE_TDK 0 
+
+/* from CrIaIasw.h */
+extern unsigned long int sdb_offset, res_offset, aux_offset, swap_offset;
+extern unsigned int *sibAddressFull, *cibAddressFull, *gibAddressFull;
+extern unsigned int *sibAddressWin, *cibAddressWin, *gibAddressWin;
+
+#define GET_SDB_OFFSET_FROM_ADDR(address) ( ((unsigned long int)address - sdb_offset) >> 10 )
+#define GET_RES_OFFSET_FROM_ADDR(address) ( ((unsigned long int)address - res_offset) >> 10 )
+
+#define GET_ADDR_FROM_SDB_OFFSET(iboffset) ( (unsigned long int)sdb_offset + 1024*iboffset )
+#define GET_ADDR_FROM_RES_OFFSET(iboffset) ( (unsigned long int)res_offset + 1024*iboffset )
+#define GET_ADDR_FROM_AUX_OFFSET(iboffset) ( (unsigned long int)aux_offset + 1024*iboffset )
+#define GET_ADDR_FROM_SWAP_OFFSET(iboffset) ( (unsigned long int)swap_offset + 1024*iboffset ) 
+
+#define PACKSHORTS(a,b) ( ((unsigned int)a << 16) | ((unsigned int)b & 0xffff) )
+
+
+/* from wrap_malloc.h */
+#define BPW_SRAM2 4
+#define BPW_PIXEL 2
+
+#define DESTBUF 1
+#define SRCBUF  0
+
+#define SEM_DAT_HEADER_VALUES ((sizeof(struct SibHeader) + 3)>>2) /* = 26 */
+#define FLAT_HEADER_VALUES 26    /* as used in FlatHeaders */
+#define SIB_CENTROID_VALUES 10
+#define SIB_PHOTOMETRY_VALUES 4
+
+#define LSM_XDIM 28
+#define RSM_XDIM 24
+#define TM_YDIM   9
+
+#ifndef CRIA_CONSTANTS_H 
+#define FULL_SIZE_X 1076
+#define FULL_SIZE_Y 1033
+#endif
+
+#ifndef CrIaSdbCreate_H_
+#define CrIaSdb_CONFIG_FULL 1 
+#define CrIaSdb_CONFIG_WIN 2  
+#define CrIaSdb_UNCONFIGURED 3
+#endif
+
+#define CEMODE_FULL 0
+#define CEMODE_WIN 1
+
+#define DATA_OK 0
+#define DATA_SAA 1
+#define DATA_NOK 2
+#define DATA_SUSPEND 3
+
+#define SIBIN_FULL_XIB 1
+#define SIBIN_WIN_XIB 2
+#define SIBOUT_FULL_XIB 3
+#define SIBOUT_WIN_XIB 4
+#define GIBIN_FULL_XIB 5
+#define GIBIN_WIN_XIB 6
+#define GIBOUT_FULL_XIB 7 
+#define GIBOUT_WIN_XIB 8
+
+/**
+ * @brief      SIB sub-structure to keep centroid data for later inclusion in science header
+ * @note       all of these need to be 4-byte aligned because it will be used in SRAM2
+ */
+
+struct SibCentroid {
+  int offsetX;
+  int offsetY;
+  unsigned int startIntegFine;
+  unsigned int endIntegFine;
+  unsigned int dataCadence;
+  unsigned int targetLocX;
+  unsigned int targetLocY;
+  unsigned int startIntegCoarse;
+  unsigned int endIntegCoarse;
+  unsigned int validityStatus;    
+} ;
+
+
+/**
+ * @brief      SIB Sub-structure to keep quick photometry results of science data processing 
+ */
+
+struct SibPhotometry {
+  unsigned int FlagsActive; /* this has the SAA/SDS flag info */
+  float centrum;  /* Mantis 2212: This is used to store Gain0 */
+  float annulus1; /* Mantis 2212: This is used to store Bias0 */
+  float annulus2; /* Mantis 2212: This is used to store Bias */
+} ;
+
+
+/**
+ * @brief      Structure to hold the variables extracted from the DAT_CCD packets from SEM
+ */
+
+struct SibHeader {
+  unsigned int AcqId;
+  unsigned int AcqType;
+  unsigned int AcqSrc;
+  unsigned int CcdTimingScriptId; /* new in ICD 2.1 */
+  unsigned int startTimeCoarse;
+  unsigned int startTimeFine;
+  unsigned int ExposureTime;
+  unsigned int TotalPacketNum;
+  unsigned int CurrentPacketNum;
+  unsigned int VoltFeeVod;
+  unsigned int VoltFeeVrd;
+  unsigned int VoltFeeVog;
+  unsigned int VoltFeeVss;
+  unsigned int TempFeeCcd;
+  unsigned int TempFeeAdc;
+  unsigned int TempFeeBias;
+  unsigned int N5V;
+  unsigned int Temp1;
+  unsigned int PixDataOffset; /* new in ICD 2.1 */ 
+  unsigned int NumDataWords;
+  unsigned int TempOh1A;
+  unsigned int TempOh1B;
+  unsigned int TempOh2A;
+  unsigned int TempOh2B;
+  unsigned int TempOh3A;
+  unsigned int TempOh3B;
+  unsigned int TempOh4A;
+  unsigned int TempOh4B;
+} ;
+
+
+/**
+ * @brief      this structure keeps track of a @ref SIB's  internal pointers 
+ * @note       all types have to be 4 bytes aligned
+ */
+
+struct CrIaSib {
+  unsigned int *Base;
+  unsigned int *Header; /* int[26] */
+  unsigned int *Centroid; /* int[10] */
+  unsigned int *Photometry; /* float[3] */
+  unsigned int *Lsm;
+  unsigned int *Rsm;
+  unsigned int *Tm;
+  unsigned int *Expos;
+  unsigned int LsmSamples;
+  unsigned int RsmSamples;
+  unsigned int TmSamples;
+  unsigned int ExposSamples;
+  unsigned int HeaderSize;
+  unsigned int CentroidSize;
+  unsigned int PhotometrySize;
+  unsigned int LsmSize;
+  unsigned int RsmSize;
+  unsigned int TmSize;
+  unsigned int ExposSize;
+  unsigned int Xdim;
+  unsigned int Ydim;
+  unsigned int UsedSize;
+} ;
+
+
+/**
+ * @brief      a flat buffer structure for the science data processing steps.
+ *             Such a buffer has a pointer to the data, a datatype for the elements (see @ref SdpCeDefinitions.h and the @ref TYPESIZE macro)
+ *             and length specifiers in three dimensions (XYZ). @ref nelements is the product of the three.
+ */
+
+struct ScienceBuf {
+  unsigned int datatype;
+  unsigned int nelements;
+  unsigned int xelements;
+  unsigned int yelements;
+  unsigned int zelements;
+  void *data;
+} ;
+
+
+/**
+ * @brief      same as the @ref ScienceBuf structure, but also with two additional variables, one keeping track of the compressed size
+ *             and the other one stores the checksum on the buffer's way through the compression.
+ *
+ */
+
+/* a flat buffer structure for compressed data */
+struct CompressedBuf {
+  unsigned int datatype;
+  unsigned int llcsize;     /* compressed size (bytes) */
+  unsigned int nelements;   /* number of elements that went into llc */
+  unsigned int xelements;
+  unsigned int yelements;
+  unsigned int zelements;   /* number of frames, e.g. for imagettes */
+  unsigned int lossyCrc;    /* CRC after lossy steps */
+  void *data;
+} ;
+
+#if (__sparc__)
+#define SDBALLOC(s,id) alloc(s, id)
+#define RESALLOC(s,id) alloc(s, id)
+#define AUXALLOC(s,id) alloc(s, id)
+#define SWAPALLOC(s,id) alloc(s, id)
+#else
+#define SDBALLOC(s,id) ((unsigned int *)sdballoc(s, 0))
+#define RESALLOC(s,id) ((unsigned int *)resalloc(s, 0))
+#define AUXALLOC(s,id) ((unsigned int *)auxalloc(s, 0))
+#define SWAPALLOC(s,id) ((unsigned int *)swapalloc(s, 0))
+unsigned int * sdballoc (unsigned int size, unsigned char reset);
+unsigned int * resalloc (unsigned int size, unsigned char reset);
+unsigned int * auxalloc (unsigned int size, unsigned char reset);
+unsigned int * swapalloc (unsigned int size, unsigned char reset);
+#endif
+
+unsigned int * FloatpAsUintp (float *fp);
+
+float * UintpAsFloatp (unsigned int *uip);
+
+void InitComprEntStructureFromDataPool (struct ComprEntStructure *cestruct);
+
+unsigned short updateXib(unsigned int currentXib, unsigned int borderXib, unsigned long int xibOffset, unsigned int xibSize, unsigned int xibN, unsigned short xib_err_id);
+
+unsigned short updateXibFwd(unsigned int currentXib, unsigned int borderXib, unsigned long int xibOffset, unsigned int xibSize, unsigned int xibN, unsigned short xib_err_id);
+
+unsigned short updateXibNTimesFwd(unsigned int currentXib, unsigned int borderXib, unsigned long int xibOffset, unsigned int xibSize, unsigned int xibN, unsigned int Nupdates, unsigned short xib_err_id);
+
+unsigned int CrIaSetupSibWin (struct CrIaSib *sib, unsigned short sibIn, unsigned int Xdim, unsigned int Ydim);
+
+unsigned int CrIaSetupSibFull (struct CrIaSib *sib, unsigned short sibIn);
+
+void ForwardProcBuf (struct ComprEntStructure *cestruct);
+
+void ProcBufBorgMode (struct ComprEntStructure *cestruct);
+
+unsigned int SetupCeBuffers (struct ComprEntStructure *cestruct, unsigned short cibIn, unsigned int Xdim, unsigned int Ydim, unsigned int Zdim, unsigned int cemode);
+
+#ifdef GROUNDSW
+void ResetProcBuf (struct ComprEntStructure *cestruct);
+unsigned int *AllocFromProcBuf (unsigned int requested_size, struct ComprEntStructure *cestruct);
+unsigned int SetupDecomprBuffers (struct ComprEntStructure *cestruct, unsigned short cibIn, unsigned int Xdim, unsigned int Ydim, unsigned int Zdim);
+#endif
+
+#ifdef DEBUGSDP
+void PrintoutCeBuffers (struct ComprEntStructure *cestruct);
+#endif
+
+void SibToFlatHeaders (struct ScienceBuf *Headers, struct ComprEntStructure *cestruct);
+
+#define UNPACK_NOSWAP 0
+#define UNPACK_SWAP 1
+
+unsigned int UnpackU16ToU32 (uint32_t *src, uint32_t nValues, uint32_t *dest, uint32_t swapFlag);
+
+unsigned int PackU16FromU32 (uint32_t *src, uint32_t nValues, uint32_t *dest, uint32_t swapFlag);
+
+void PrepareSwap (struct ScienceBuf *swapbuffer, struct ComprEntStructure *cestruct);
+
+#endif
diff --git a/CompressionEntity/src/SdpCeDefinitions.h b/CompressionEntity/src/SdpCeDefinitions.h
new file mode 100644
index 0000000..268f439
--- /dev/null
+++ b/CompressionEntity/src/SdpCeDefinitions.h
@@ -0,0 +1,251 @@
+/**
+ * @file    SdpCeDefinitions.h
+ * @author  Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @date    September, 2016
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief    various structures and defines used when dealing with a @ref ComprEntStructure
+ *
+ */
+
+#ifndef SDP_COMPRESSION_ENTITY_DEFINITIONS_H
+#define SDP_COMPRESSION_ENTITY_DEFINITIONS_H
+
+
+/**
+ * @brief    datatypes used in compression, especially in the @ref TYPESIZE macro  
+ * @warning  never change!
+ */
+
+#define DATATYPE_INT8    1
+#define DATATYPE_UINT8   2 
+#define DATATYPE_INT16   3
+#define DATATYPE_UINT16  4
+#define DATATYPE_INT32   7
+#define DATATYPE_UINT32  8 
+
+
+/**
+ * @brief    return the number of bytes used by a particular type
+ * @note     this is a funny way to do it, but it could be done in a safer way
+ */
+
+#define TYPESIZE(x) ((unsigned int)(x+1)/2)
+
+
+/**
+ * @{
+ * @brief CCD window types and dimensions 
+ */
+
+#define ACQ_TYPE_WIN_EXPOS  1 /* used in CE header to identify a window observation */
+#define ACQ_TYPE_WIN_LSM    2
+#define ACQ_TYPE_WIN_RSM    3
+#define ACQ_TYPE_WIN_TM         4
+#define ACQ_TYPE_FULL           5 /* used in CE header to identify a full frame observation */
+/** @} */
+
+
+/**
+ * @brief    CCD window dimensions 
+ */
+
+#define CCD_IMAGE_X        1024
+#define CCD_IMAGE_Y        1024
+#define CCD_WIN_LSM        28
+#define CCD_WIN_RSM        24
+#define CCD_FULL_X         1076
+#define CCD_FULL_Y         1033
+#define CCD_FULL_YRED      1027
+#define IMGMRG_TOS_H       6
+#define IMGMRG_TDK_H       3
+#define IMGMRG_LOS_W       4
+#define IMGMRG_LBLK_W      8
+#define IMGMRG_LDK_W       16
+#define IMGMRG_RDK_W       16
+#define IMGMRG_RBLK_W      8
+
+/* possible values for the windows, stacked and imagettes shape */
+#define SHAPE_RECTANGULAR  0
+#define SHAPE_CIRCULAR     1
+
+#define STRAT_STATIC 0
+#define STRAT_MOVING 1
+
+#define STAT_MEAN 0
+#define STAT_MEDIAN 1
+
+/* masks for the keys */
+#define SDP_PRODUCT 0xf0000000
+#define SDP_PREPROC 0x0f000000
+#define SDP_LOSSY1  0x00f00000
+#define SDP_LOSSY2  0x000f0000
+#define SDP_LOSSY3  0x0000f000
+#define SDP_DECORR  0x00000f00
+#define SDP_SPARE2  0x000000f0
+#define SDP_LLC     0x0000000f
+
+/* defines used to shape the CeKey */
+#define PRODUCT_HEADERS     0x10000000
+#define PRODUCT_IMAGETTES   0x20000000
+#define PRODUCT_STACKED     0x30000000
+#define PRODUCT_MRGLOS      0x40000000
+#define PRODUCT_MRGLBLK     0x50000000
+#define PRODUCT_MRGLDK      0x60000000
+#define PRODUCT_MRGRDK      0x70000000
+#define PRODUCT_MRGRBLK     0x80000000
+#define PRODUCT_MRGTOS      0x90000000
+#define PRODUCT_MRGTDK      0xA0000000
+#define PRODUCT_DISABLE     0xF0000000
+/* Preprocessing */
+#define PREPROC_NONE        0x00000000
+#define PREPROC_NLC         0x01000000
+#define PREPROC_NLCPHOT     0x02000000 
+#define PREPROC_NLC2        0x03000000
+#define PREPROC_PHOT        0x05000000 
+/* Lossy Step 1 */
+#define LOSSY1_NONE         0x00000000
+#define LOSSY1_COADD        0x00100000
+#define LOSSY1_MEAN         0x00200000
+#define LOSSY1_GMEAN        0x00800000
+#define LOSSY1_GCOADD       0x00900000
+/* Lossy Step 2 */
+#define LOSSY2_NONE         0x00000000
+#define LOSSY2_3STAT        0x00010000
+#define LOSSY2_3STATUI      0x00020000
+#define LOSSY2_4STAT        0x00030000
+#define LOSSY2_CIRCMASK     0x00040000
+#define LOSSY2_CIRCEXTRACT  0x00050000
+#define LOSSY2_3STATUI_ROW  0x00090000
+#define LOSSY2_3STATUI_COL  0x000A0000
+/* Lossy Step 3 */
+#define LOSSY3_NONE         0x00000000
+#define LOSSY3_ROUND1       0x00001000
+#define LOSSY3_ROUND2       0x00002000
+#define LOSSY3_ROUND3       0x00003000
+#define LOSSY3_ROUND4       0x00004000
+#define LOSSY3_ROUND5       0x00005000
+#define LOSSY3_ROUND6       0x00006000
+/* Decorrelation */
+#define DECORR_NONE         0x00000000
+#define DECORR_DIFF         0x00000100
+#define DECORR_KEYFR        0x00000200
+#define DECORR_IWT1         0x00000300
+#define DECORR_IWT2         0x00000400
+/* 
+   in principle there is space for another step: 
+   here:                    0x000000X0 
+*/
+/* Lossless Compression */
+#define LLC_NONE            0x00000000
+#define LLC_RZIP            0x00000001
+#define LLC_ARI1            0x00000003
+#define LLC_PACK16          0x00000007
+
+
+/** 
+ * @brief convenient CUC time structure 
+ */
+
+struct cuctime
+{
+  /* in the CE, the sizes are 32 + 15 + 1
+     here we use more convenient types
+  
+     coarse time counts seconds since 01-01-2000 00:00:00 TAI
+     This is defined by requirement CIS-SW-ICD-057 of ICD-049 */
+  unsigned int    coarse;
+
+  /* fine time counts fractions of seconds */
+  unsigned short  fine; /* last bit is cleared (it is the sync bit) */
+
+  /* flag showing synchronization is LSbit of fine time */
+  unsigned short  sync; /* 0..desync 1..sync */
+} ;
+
+
+#ifdef GROUNDSW
+/**
+ * @brief convenient centroid structure for ground usage
+ * @note  The origin is the bottom left pixel starting with the margin, its center is 50/50
+ *        before you ask: (we don't care about the rounded 5 mas systematic shift) 
+ * @warning  Do not mix with struct SibCentroid!
+ * @note  only used on ground
+ */
+
+struct Centroid {
+  int             OffsetX;           /* residual (measured-intended) in X given in centiarcsec   [24 bits used] */
+  int             OffsetY;           /* residual in Y given in centiarcsec                       [24 bits used] */
+  unsigned int    TargetLocationX;   /* position on CCD in centiarcsec,                          [24 bits used] */
+  unsigned int    TargetLocationY;   /* origin is bottom left pixel corner in margin area        [24 bits used] */
+  struct cuctime  StartIntegration;  /* start time of integration (no sync)                      [48 bits used] */
+  struct cuctime  EndIntegration;    /* timestamp end of exposure (no sync)                      [48 bits used] */
+  unsigned short  Cadence;           /* centroid data cadence in centisec                        [16 bits used] */
+  unsigned char   Validity;          /* validity of this centroid                                [ 8 bits used] */
+} ; /* total size = 27 B, actually: 36 */
+
+
+/**
+ * @brief data structure for the uncompressed header data 
+ * @note  only used on ground
+ */
+
+struct Meterology {
+  unsigned int    SemHkStatDataAcqId; 
+  float           HkVoltFeeVod;
+  float           HkVoltFeeVrd;  
+  float           HkVoltFeeVog;
+  float           HkVoltFeeVss;  
+  float           HkTempFeeCcd;
+  float           HkTempFeeAdc;
+  float           HkTempFeeBias;
+  float           ThermAft1;  
+  float           ThermAft2;      
+  float           ThermAft3;   
+  float           ThermAft4;   
+  float           ThermFront1;    
+  float           ThermFront2;
+  float           ThermFront3;   
+  float           ThermFront4;
+  float           N5V;
+  float           Temp1;
+  unsigned short  CcdTimingScript;
+  unsigned short  PixDataOffset;
+  struct Centroid Centroid; /* 27B packed in 36B, not as a pointer because we want sizeof(Meterology) consider this */
+  float           Phot1;
+  float           Phot2; 
+  float           Phot3;  
+} ; /* 4 + 28 + 32 + 8 + 27 + 3*4 = 111, actually: 120 (Centroid is 36 in aligned words) */
+#endif
+
+
+/**
+ * @brief small structure to hold the mean, stdev, median and MAD
+ *
+ */
+
+struct StatValues {
+  float mean;
+  float stdev;
+  unsigned int median;
+  unsigned int mad;
+} ;
+
+#if (__sparc__)
+#include "IfswDebug.h"
+#define SDPRINT SDDEBUGP
+#else
+#define SDPRINT printf
+#endif
+
+
+#endif
diff --git a/CompressionEntity/src/SdpCollect.c b/CompressionEntity/src/SdpCollect.c
new file mode 100644
index 0000000..3e34dec
--- /dev/null
+++ b/CompressionEntity/src/SdpCollect.c
@@ -0,0 +1,409 @@
+/**
+ * @file    SdpCollect.c
+ * @ingroup SdpCollect
+ * @author  Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @date    August, 2016
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ *
+ * @defgroup SdpCollect Science Data Collect Function
+ * @ingroup Sdp
+ *
+ * @brief A single function which packs the contents of a ComprEntStructure into a bitstream.
+ *        This output bitstream follows strictly the format described in CHEOPS-UVIE-ICD-003
+ *
+ */
+
+
+#include "SdpCollect.h"
+#include "SdpBuffers.h"
+#include "SdpAlgorithmsImplementation.h"
+
+#include "CrIaDataPool.h"
+#include "CrIaDataPoolId.h"
+
+#include <stdio.h> /* for SDPRINT */
+
+
+
+/**
+ * @brief	collect the various contents of a @ref ComprEntStructure and pack them out in a bitstream
+ * @param	cestruct pointer to the @ref ComprEntStructure
+ * @note        The packed output bitstream is in the GibIn (see @ref GIB)
+ */
+
+void SdpCollect (struct ComprEntStructure *cestruct)
+{
+  unsigned int *cstream = NULL;
+  unsigned int streampos, i, value;
+  unsigned int CeSizePos; /* to track where to enter the size at the end */
+
+  unsigned short gibIn;
+
+  /* get Gib parameters and state of SDB (WIN or FULL) */
+  CrIaCopy (GIBIN_ID, &gibIn);
+
+  /* point cstream to gibIn */
+  cstream = (unsigned int *)GET_ADDR_FROM_RES_OFFSET(gibIn);
+
+  /* start to copy all components entries into the bitstream */
+  streampos = 0;
+
+  /*
+     -0- pack the CE Header
+  */
+  PUTNBITS (cestruct->Obsid, streampos, 32, cstream);
+  streampos += 32;
+  PUTNBITS (cestruct->Timetag.coarse, streampos, 32, cstream);
+  streampos += 32;
+  PUTNBITS (cestruct->Timetag.fine, streampos, 16, cstream);
+  streampos += 15; /* 1 less to overwrite with sync */
+  PUTNBITS (cestruct->Timetag.sync, streampos, 1, cstream);
+  streampos += 1;
+  PUTNBITS (cestruct->Counter, streampos, 16, cstream);
+  streampos += 16;
+  CeSizePos = streampos;
+  streampos += 32; /* NOTE: the size is entered at the end! */
+  PUTNBITS (cestruct->Version, streampos, 16, cstream);
+  streampos += 16;
+  PUTNBITS (cestruct->StackingNumber, streampos, 8, cstream);
+  streampos += 8;
+  PUTNBITS (cestruct->AcquisitionMode, streampos, 4, cstream);
+  streampos += 4;
+  PUTNBITS (cestruct->ReadoutMode, streampos, 4, cstream);
+  streampos += 4;
+  PUTNBITS (cestruct->Oversampling, streampos, 4, cstream);
+  streampos += 4;
+  PUTNBITS (cestruct->FrameSource, streampos, 2, cstream);
+  streampos += 2;
+  PUTNBITS (cestruct->Integrity, streampos, 2, cstream);
+  streampos += 2;
+  PUTNBITS (cestruct->RepetitionPeriod, streampos, 32, cstream);
+  streampos += 32;
+  PUTNBITS (cestruct->ExposureTime, streampos, 32, cstream);
+  streampos += 32;
+  PUTNBITS (cestruct->SemWindowPosX, streampos, 16, cstream);
+  streampos += 16;
+  PUTNBITS (cestruct->SemWindowPosY, streampos, 16, cstream);
+  streampos += 16;
+  PUTNBITS (cestruct->SemWindowSizeX, streampos, 16, cstream);
+  streampos += 16;
+  PUTNBITS (cestruct->SemWindowSizeY, streampos, 16, cstream);
+  streampos += 16;
+
+  /* PRINTCE(); */
+
+  SDPRINT("  CeHeader Size: %d bits\n", streampos);
+
+  /* stuff the stream with bits to be %0 */
+  PUTNBITS (0, streampos, FILLBYTE(streampos), cstream);
+  streampos += FILLBYTE(streampos);
+
+  /*
+    -1- continue with Header Data
+  */
+  if ((cestruct->HeaderData_CeKey & SDP_PRODUCT) != PRODUCT_DISABLE)
+    {
+      if (cestruct->HeaderData_OriginalSize != 0)
+        {
+          PUTNBITS (cestruct->HeaderData_CeKey, streampos, 32, cstream);
+          streampos += 32;
+          PUTNBITS (cestruct->HeaderData_OriginalSize, streampos, 24, cstream);
+          streampos += 24;
+          PUTNBITS (cestruct->HeaderData_ComprSize, streampos, 24, cstream);
+          streampos += 24;
+          PUTNBITS (cestruct->HeaderData_Checksum, streampos, 16, cstream);
+          streampos += 16;
+
+          /* handle CeHeaderData */
+          for (i=0; i < cestruct->HeaderData_ComprSize; i++)
+            {
+              GETBYTE (value, i*8, cestruct->ComprHeaders);
+              PUTBYTE (value, streampos, cstream);
+              streampos += 8;
+            }
+        }
+    }
+
+  /*
+    -2- Stacked Image Frame
+  */
+  if ((cestruct->Stacked_CeKey & SDP_PRODUCT) != PRODUCT_DISABLE)
+    {
+      if (cestruct->Stacked_OriginalSize != 0)
+        {
+          PUTNBITS (cestruct->Stacked_CeKey, streampos, 32, cstream);
+          streampos += 32;
+          PUTNBITS (cestruct->Stacked_OriginalSize, streampos, 24, cstream);
+          streampos += 24;
+          PUTNBITS (cestruct->Stacked_ComprSize, streampos, 24, cstream);
+          streampos += 24;
+          PUTNBITS (cestruct->Stacked_Checksum, streampos, 16, cstream);
+          streampos += 16;
+          PUTNBITS (cestruct->Stacked_Datatype, streampos, 8, cstream);
+          streampos += 8;
+          PUTNBITS (cestruct->Stacked_Shape, streampos, 8, cstream);
+          streampos += 8;
+          PUTNBITS (cestruct->Stacked_SizeX, streampos, 16, cstream);
+          streampos += 16;
+          PUTNBITS (cestruct->Stacked_SizeY, streampos, 16, cstream);
+          streampos += 16;
+
+          /* handle Stacked Data */
+          for (i=0; i < cestruct->Stacked_ComprSize; i++)
+            {
+              GETBYTE (value, i*8, cestruct->ComprStacked);
+              PUTBYTE (value, streampos, cstream);
+              streampos += 8;
+            }
+        }
+    }
+
+  if (cestruct->AcquisitionMode == ACQ_TYPE_FULL)
+    {
+      /* don't wanna make an if clause over the next 260 lines */  
+      goto exit_collect;
+    }
+  
+  /*
+    -3- continue with Imagettes
+  */
+  if ((cestruct->Imagettes_CeKey & SDP_PRODUCT) != PRODUCT_DISABLE)
+    {
+      if (cestruct->Imagettes_OriginalSize != 0)
+        {
+          PUTNBITS (cestruct->Imagettes_CeKey, streampos, 32, cstream);
+          streampos += 32;
+          PUTNBITS (cestruct->Imagettes_OriginalSize, streampos, 24, cstream);
+          streampos += 24;
+          PUTNBITS (cestruct->Imagettes_ComprSize, streampos, 24, cstream);
+          streampos += 24;
+          PUTNBITS (cestruct->Imagettes_Checksum, streampos, 16, cstream);
+          streampos += 16;
+          PUTNBITS (cestruct->Imagettes_ApertureShape, streampos, 2, cstream);
+          streampos += 2;
+          PUTNBITS (cestruct->Imagettes_CroppingStrategy, streampos, 2, cstream);
+          streampos += 2;
+          PUTNBITS (cestruct->Imagettes_StackingOrder, streampos, 4, cstream);
+          streampos += 4;
+          PUTNBITS (cestruct->Imagettes_ApertureSizeX, streampos, 8, cstream);
+          streampos += 8;
+          PUTNBITS (cestruct->Imagettes_ApertureSizeY, streampos, 8, cstream);
+          streampos += 8;
+
+          /* handle Imagettes Data */
+          for (i=0; i < cestruct->Imagettes_ComprSize; i++)
+            {
+              GETBYTE (value, i*8, cestruct->ComprImagettes);
+              PUTBYTE (value, streampos, cstream);
+              streampos += 8;
+            }
+        }
+    }
+
+  /*
+     -4- same for Image Margins LOS
+  */
+  if ((cestruct->ImgMrgLOS_CeKey & SDP_PRODUCT) != PRODUCT_DISABLE)
+    {
+      if (cestruct->ImgMrgLOS_OriginalSize != 0)
+        {
+          PUTNBITS (cestruct->ImgMrgLOS_CeKey, streampos, 32, cstream);
+          streampos += 32;
+          PUTNBITS (cestruct->ImgMrgLOS_OriginalSize, streampos, 24, cstream);
+          streampos += 24;
+          PUTNBITS (cestruct->ImgMrgLOS_ComprSize, streampos, 24, cstream);
+          streampos += 24;
+          PUTNBITS (cestruct->ImgMrgLOS_Checksum, streampos, 16, cstream);
+          streampos += 16;
+
+          /* handle LOS Margins Data */
+          for (i=0; i < cestruct->ImgMrgLOS_ComprSize; i++)
+            {
+              GETBYTE (value, i*8, cestruct->ComprImgMrgLOS);
+              PUTBYTE (value, streampos, cstream);
+              streampos += 8;
+            }
+        }
+    }
+
+  /*
+     -5- same for Image Margins LDK
+  */
+  if ((cestruct->ImgMrgLDK_CeKey & SDP_PRODUCT) != PRODUCT_DISABLE)
+    {
+      if (cestruct->ImgMrgLDK_OriginalSize != 0)
+        {
+          PUTNBITS (cestruct->ImgMrgLDK_CeKey, streampos, 32, cstream);
+          streampos += 32;
+          PUTNBITS (cestruct->ImgMrgLDK_OriginalSize, streampos, 24, cstream);
+          streampos += 24;
+          PUTNBITS (cestruct->ImgMrgLDK_ComprSize, streampos, 24, cstream);
+          streampos += 24;
+          PUTNBITS (cestruct->ImgMrgLDK_Checksum, streampos, 16, cstream);
+          streampos += 16;
+          PUTNBITS (cestruct->ImgMrgLDK_ColumnSelectionMask, streampos, 16, cstream);
+          streampos += 16;
+
+          /* handle LDK Margins Data */
+          for (i=0; i < cestruct->ImgMrgLDK_ComprSize; i++)
+            {
+              GETBYTE (value, i*8, cestruct->ComprImgMrgLDK);
+              PUTBYTE (value, streampos, cstream);
+              streampos += 8;
+            }
+        }
+    }
+
+  /*
+     -6- same for Image Margins LBLK
+  */
+  if ((cestruct->ImgMrgLBLK_CeKey & SDP_PRODUCT) != PRODUCT_DISABLE)
+    {
+      if (cestruct->ImgMrgLBLK_OriginalSize != 0)
+        {
+          PUTNBITS (cestruct->ImgMrgLBLK_CeKey, streampos, 32, cstream);
+          streampos += 32;
+          PUTNBITS (cestruct->ImgMrgLBLK_OriginalSize, streampos, 24, cstream);
+          streampos += 24;
+          PUTNBITS (cestruct->ImgMrgLBLK_ComprSize, streampos, 24, cstream);
+          streampos += 24;
+          PUTNBITS (cestruct->ImgMrgLBLK_Checksum, streampos, 16, cstream);
+          streampos += 16;
+
+          /* handle LBLK Margins Data */
+          for (i=0; i < cestruct->ImgMrgLBLK_ComprSize; i++)
+            {
+              GETBYTE (value, i*8, cestruct->ComprImgMrgLBLK);
+              PUTBYTE (value, streampos, cstream);
+              streampos += 8;
+            }
+        }
+    }
+
+  /*
+     -7- same for Image Margins RDK
+  */
+  if ((cestruct->ImgMrgRDK_CeKey & SDP_PRODUCT) != PRODUCT_DISABLE)
+    {
+      if (cestruct->ImgMrgRDK_OriginalSize != 0)
+        {
+          PUTNBITS (cestruct->ImgMrgRDK_CeKey, streampos, 32, cstream);
+          streampos += 32;
+          PUTNBITS (cestruct->ImgMrgRDK_OriginalSize, streampos, 24, cstream);
+          streampos += 24;
+          PUTNBITS (cestruct->ImgMrgRDK_ComprSize, streampos, 24, cstream);
+          streampos += 24;
+          PUTNBITS (cestruct->ImgMrgRDK_Checksum, streampos, 16, cstream);
+          streampos += 16;
+          PUTNBITS (cestruct->ImgMrgRDK_ColumnSelectionMask, streampos, 16, cstream);
+          streampos += 16;
+
+          /* handle RDK Margins Data */
+          for (i=0; i < cestruct->ImgMrgRDK_ComprSize; i++)
+            {
+              GETBYTE (value, i*8, cestruct->ComprImgMrgRDK);
+              PUTBYTE (value, streampos, cstream);
+              streampos += 8;
+            }
+        }
+    }
+
+  /*
+     -8- same for Image Margins RBLK
+  */
+  if ((cestruct->ImgMrgRBLK_CeKey & SDP_PRODUCT) != PRODUCT_DISABLE)
+    {
+      if (cestruct->ImgMrgRBLK_OriginalSize != 0)
+        {
+          PUTNBITS (cestruct->ImgMrgRBLK_CeKey, streampos, 32, cstream);
+          streampos += 32;
+          PUTNBITS (cestruct->ImgMrgRBLK_OriginalSize, streampos, 24, cstream);
+          streampos += 24;
+          PUTNBITS (cestruct->ImgMrgRBLK_ComprSize, streampos, 24, cstream);
+          streampos += 24;
+          PUTNBITS (cestruct->ImgMrgRBLK_Checksum, streampos, 16, cstream);
+          streampos += 16;
+
+          /* handle RBLK Margins Data */
+          for (i=0; i < cestruct->ImgMrgRBLK_ComprSize; i++)
+            {
+              GETBYTE (value, i*8, cestruct->ComprImgMrgRBLK);
+              PUTBYTE (value, streampos, cstream);
+              streampos += 8;
+            }
+        }
+    }
+
+  /*
+     -9- same for Image Margins TOS
+  */
+  if ((cestruct->ImgMrgTOS_CeKey & SDP_PRODUCT) != PRODUCT_DISABLE)
+    {
+      if (cestruct->ImgMrgTOS_OriginalSize != 0)
+        {
+          PUTNBITS (cestruct->ImgMrgTOS_CeKey, streampos, 32, cstream);
+          streampos += 32;
+          PUTNBITS (cestruct->ImgMrgTOS_OriginalSize, streampos, 24, cstream);
+          streampos += 24;
+          PUTNBITS (cestruct->ImgMrgTOS_ComprSize, streampos, 24, cstream);
+          streampos += 24;
+          PUTNBITS (cestruct->ImgMrgTOS_Checksum, streampos, 16, cstream);
+          streampos += 16;
+
+          /* handle TOS Margins Data */
+          for (i=0; i < cestruct->ImgMrgTOS_ComprSize; i++)
+            {
+              GETBYTE (value, i*8, cestruct->ComprImgMrgTOS);
+              PUTBYTE (value, streampos, cstream);
+              streampos += 8;
+            }
+        }
+    }
+
+  /*
+     -10- same for Image Margins TDK
+  */
+  if ((cestruct->ImgMrgTDK_CeKey & SDP_PRODUCT) != PRODUCT_DISABLE)
+    {
+      if (cestruct->ImgMrgTDK_OriginalSize != 0)
+        {
+          PUTNBITS (cestruct->ImgMrgTDK_CeKey, streampos, 32, cstream);
+          streampos += 32;
+          PUTNBITS (cestruct->ImgMrgTDK_OriginalSize, streampos, 24, cstream);
+          streampos += 24;
+          PUTNBITS (cestruct->ImgMrgTDK_ComprSize, streampos, 24, cstream);
+          streampos += 24;
+          PUTNBITS (cestruct->ImgMrgTDK_Checksum, streampos, 16, cstream);
+          streampos += 16;
+
+          /* handle TDK Margins Data */
+          for (i=0; i < cestruct->ImgMrgTDK_ComprSize; i++)
+            {
+              GETBYTE (value, i*8, cestruct->ComprImgMrgTDK);
+              PUTBYTE (value, streampos, cstream);
+              streampos += 8;
+            }
+        }
+    }
+
+ exit_collect :
+  
+  /* finally enter the size */
+  cestruct->Size = streampos / 8;
+  PUTNBITS (cestruct->Size, CeSizePos, 32, cstream);
+
+  /* NOTE: the GIB is incremented in the caller */
+
+  return;
+}
+
diff --git a/CompressionEntity/src/SdpCollect.h b/CompressionEntity/src/SdpCollect.h
new file mode 100644
index 0000000..481b784
--- /dev/null
+++ b/CompressionEntity/src/SdpCollect.h
@@ -0,0 +1,9 @@
+#ifndef SDPCOLLECT_H
+#define SDPCOLLECT_H
+
+#include "SdpCompressionEntityStructure.h"
+
+void SdpCollect (struct ComprEntStructure *cestruct);
+
+
+#endif
diff --git a/CompressionEntity/src/SdpCompress.c b/CompressionEntity/src/SdpCompress.c
new file mode 100644
index 0000000..62adecd
--- /dev/null
+++ b/CompressionEntity/src/SdpCompress.c
@@ -0,0 +1,825 @@
+/**
+* @file    SdpCompress.c
+* @ingroup SdpCompress
+* @author  Roland Ottensamer (roland.ottensamer@univie.ac.at)
+* @date    August, 2016
+*
+* @copyright
+* This program is free software; you can redistribute it and/or modify it
+* under the terms and conditions of the GNU General Public License,
+* version 2, as published by the Free Software Foundation.
+*
+* This program is distributed in the hope 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.
+*
+*
+* @defgroup SdpCompress Science Data Processing Chain
+* @ingroup Sdp
+*
+* @brief Top-level compression function, sets up buffers and executes @ref Compress for each product to be added to the @ref CompressionEntity
+*
+*
+* ## Overview
+*
+* Once the @ref ComprEntStructure has been initialized (@ref InitComprEntStructureFromDataPool), we are good to go for the
+* compression of the up to 10 products. The @ref SdpCompress function first sets up the buffers in the @ref ComprEntStructure
+* using @ref SetupCeBuffers, then calls a "Compress..." function for each product, for instance @ref CompressHeaders.
+* That function will make dedicated preparations for that particular product, then call @ref Compress.
+*
+* The @ref Compression section has the details how the @ref Compress function works.
+*
+* ### The ten products
+*
+* For each product it is the same procedure: call Compress...
+* In principle the order in which these are called does not matter, with a few exceptions:
+*   - the @ref CompressStacked should be executed before @ref CompressHeaders if on-board quick photometry
+*     is desired (options @ref PREPROC_PHOT, @ref PREPROC_NLCPHOT in the @ref SdpWinImageCeKey).
+*     The reason is that the photometry is carried out by that preprocessing step and entered in the @ref CrIaSib, from
+*     where the @ref CompressHeaders functions gathers its input.
+*   - To be extra safe, execute the order in the same order in which the compressed buffers are arranged by the
+*     @ref SetupCeBuffers. In this case, a buffer overrun (which should of course not happen) does not corrupt any
+*     previously prepared output data. @ref SetupCeBuffers arranges buffers such that the maximum product size is reserved
+*     for that segment, but we could theoretically squeeze them to the predicted output size to gain some more memory.
+*     It is not recommended, though.
+*
+* ### The preparations for the ten products
+*
+* Here, we take a look at the particular preparations that are done by the 10 Compress... functions.
+* Their purpose is to set the dimensions of the dataset and to prepare the input and output buffers, the processing buffer,
+* the auxiliary buffer in a memory-saving way, knowing that the @ref Compress function will use them in a @ref ping-pong way.
+* The detailed description here is necessary, because some of the ways how we minimize memory usage need to be explained.
+*
+* @ref CompressHeaders
+* The flow in this function is the following:
+*   - set the input buffer (source->data) to be the the ComprHeaders buffer from the ComprEntStructure
+*   - set source dimensions to the actual SEM window size
+*     This is needed because the headers are fetched from the SIB using @ref SibToFlatHeaders and the
+*     SIB structure therein is given by the window size.
+*     The source dimensions will be overwritten by the PRODUCT_HEADERS step in @ref Compress.
+*   - prepare a swap buffer using @ref PrepareSwap
+*   - check if the @ref ProcBuf has sufficient space left
+*   - set the output buffer to the @ref ProcBuf
+*   - call @ref Compress function stating that the result should be returned in the source (here it was the ComprHeaders)
+*   - enter the returned @ref CompressedBuf parameters relevant for that product in the @ref ComprEntStructure
+*
+* @ref CompressStacked
+* The flow of the stacked frame is the same as above, only the ComprStacked buffer is used as source
+* and we have more output parameters.
+*
+* @ref CompressStacked
+* The flow of the imagettes is the same as for the headers, only the ComprImagettes buffer is used as source
+*
+* @ref CompressImgMrgLOS
+* The flow of the stacked frame is the same as for the headers, with the following deviations:
+*   - the ComprImgMrgLOS buffer is used as source
+*   - the X dimension used for the source is @ref LSM_XDIM, because the LSM segment contains the LOS in the @ref SIB
+*
+* @ref CompressImgMrgLOS
+* Likewise
+*
+* @ref CompressImgMrgLDK
+* Likewise
+*
+* @ref CompressImgMrgLBLK
+* Likewise
+*
+* @ref CompressImgMrgRBLK
+* Likewise, with @ref RSM_XDIM
+*
+* @ref CompressImgMrgRDK
+* Likewise
+*
+* @ref CompressImgMrgTDK
+* Likewise, with TM_YDIM for the second axis
+*
+* @ref CompressImgMrgTOS
+* Likewise
+*
+*
+* ### Errors and Reporting
+* 
+* The science data processing can report a number of fatal errors. In each case the data processing is severely compromised
+* and it does not make sense to continue. The main cause is a mismatch between the configured SIB/CIB/GIB buffers and the
+* actual data structures that are created by the compression. The following events are used:
+* 
+* - EVT_IMG_INSUF, with parameter: 32 bit requested size for SIB structure. It is raised by @ref SetupSibWin to report that 
+*   the SIB size does not allow to configure a SIB structure matching PWINSIZEX and PWINSIZEY. This event will already be seen
+*   during the incoming image buffering.
+*
+* - EVT_CMPR_SIZE, with parameter: 32 bit requested size for compressed data structure. This one is raised by @ref SetupCeBuffers 
+*   to report that the CIB is too small for allocating the compressed data structure.
+*
+* - EVT_PROCBUF_INSUF, with parameter: 16 bit product ID. This error is reported by the @ref CompressStacked, @ref CompressImagettes, 
+*   etc. functions to report that the CIB is too small to allocate sufficient space for the processing buffer from what is left after
+*   @ref SetupCeBuffers has made its reservations.
+*
+* - EVT_SDP_NOMEM, with parameter: 16 bit step ID. It is raised by the @ref Compress function to report that the swap buffer is too 
+*   small to allocate memory for the lossless compression.
+*
+* - EVT_CLCT_SIZE, with parameter: 16 bit requested GIB size in kiB. This event is raised by the @ref Collect function to report that 
+*   the compression entity is too big for the configured GIB.
+*
+* @todo the size of the aux buffer is presently fixed to a large size. Needs to be smaller!
+*/
+
+
+#include "SdpCompress.h"
+#include "SdpBuffers.h"
+#include "SdpAlgorithmsImplementation.h"
+#include "SdpCompressionEntityStructure.h"
+
+#include "CrIaDataPool.h"
+#include "CrIaDataPoolId.h"
+#ifndef ISOLATED
+#include "Services/General/CrIaConstants.h"
+#include "CrIaIasw.h"
+#endif
+
+#include <stdio.h> /* for SDPRINT */
+
+
+#define ANSI_COLOR_CYAN    "\x1b[36m"
+#define ANSI_COLOR_RESET   "\x1b[0m"
+
+
+int CompressHeaders (struct ComprEntStructure *cestruct)
+{
+  unsigned int outsize;
+  struct ScienceBuf source, swap;
+  struct CompressedBuf compressed;
+  unsigned short prodId;
+  unsigned short evt_data[2];
+  
+  int status = 0;
+
+  prodId = CC_HEADERS;
+  CrIaPaste(CCPRODUCT_ID, &prodId);
+  
+  /* prepare source buffer */
+  /* NOTE: the product step which fetches the headers from SIB needs Sem Window size and stacking order to deal with the sib */
+  source.datatype = DATATYPE_UINT32;
+  source.xelements = cestruct->SemWindowSizeX; /* yes we want the image size! */
+  source.yelements = cestruct->SemWindowSizeY;
+  source.zelements = cestruct->StackingNumber;
+  source.nelements = source.xelements * source.yelements * source.zelements;
+  source.data = (void *) cestruct->ComprHeaders;
+
+  /* prepare swap buffer */
+  PrepareSwap (&swap, cestruct);
+
+  /* check size of processing buffer */
+  outsize = FLAT_HEADER_VALUES * TYPESIZE(DATATYPE_UINT32) * cestruct->StackingNumber;
+  if (outsize > cestruct->ProcBufBufferSize)
+    {
+#ifdef ISOLATED
+      (void) evt_data;
+      SDPRINT("ERROR: could not allocate %u bytes for HEADER from PROCBUF with %u bytes left!\n", outsize, cestruct->ProcBufBufferSize);
+#else
+      evt_data[0] = prodId; /* product ID */
+      evt_data[1] = 0;
+
+      SdpEvtRaise(3, CRIA_SERV5_EVT_PROCBUF_INSUF, evt_data, 4);
+#endif          
+      return 0;
+    }
+
+  /* prepare processing buffer */
+  compressed.data = (void *) cestruct->ProcBuf;
+
+  status = Compress (&source, cestruct, cestruct->HeaderData_CeKey, &compressed, SRCBUF, &swap);
+
+  cestruct->HeaderData_OriginalSize = outsize;
+  cestruct->HeaderData_Checksum = (unsigned short) compressed.lossyCrc;
+  cestruct->HeaderData_ComprSize = compressed.llcsize;
+
+  return status;
+}
+
+int CompressStacked (struct ComprEntStructure *cestruct)
+{
+  unsigned int outsize;
+  struct ScienceBuf source, swap;
+  struct CompressedBuf compressed;
+  unsigned short prodId;
+  unsigned short evt_data[2];
+  int status = 0;
+
+  prodId = CC_STACKED;
+  CrIaPaste(CCPRODUCT_ID, &prodId);
+
+  /* prepare source buffer */
+  source.datatype = DATATYPE_UINT32;
+  source.xelements = cestruct->SemWindowSizeX;
+  source.yelements = cestruct->SemWindowSizeY;
+  source.zelements = cestruct->StackingNumber;
+  source.nelements = source.xelements * source.yelements * source.zelements;
+  source.data = (void *) cestruct->ComprStacked;
+
+  /* prepare swap buffer */
+  PrepareSwap (&swap, cestruct);
+
+  /* check size of processing buffer */
+  outsize = source.nelements * TYPESIZE(source.datatype);
+  if (outsize > cestruct->ProcBufBufferSize)
+    {
+#ifdef ISOLATED
+      (void) evt_data;
+      SDPRINT("ERROR: could not allocate %u bytes for STACKED from PROCBUF with %u bytes left!\n", outsize, cestruct->ProcBufBufferSize);
+#else
+      evt_data[0] = prodId; /* product ID */
+      evt_data[1] = 0;
+
+      SdpEvtRaise(3, CRIA_SERV5_EVT_PROCBUF_INSUF, evt_data, 4);
+#endif          
+      return 0;
+    }
+
+  /* prepare processing buffer */
+  compressed.data = (void *) cestruct->ProcBuf;
+
+  status = Compress (&source, cestruct, cestruct->Stacked_CeKey, &compressed, SRCBUF, &swap);
+
+  if ((cestruct->Stacked_CeKey & SDP_LOSSY2) != LOSSY2_CIRCEXTRACT)
+    {
+      cestruct->Stacked_SizeX = compressed.xelements;
+      cestruct->Stacked_SizeY = compressed.yelements;
+    }
+  else
+    {
+      /* for the CIRCEXTRACT option, remember the original window size */
+      cestruct->Stacked_SizeX = cestruct->SemWindowSizeX;
+      cestruct->Stacked_SizeY = cestruct->SemWindowSizeY;      
+    }
+
+  cestruct->Stacked_OriginalSize = compressed.nelements * TYPESIZE(compressed.datatype);
+  cestruct->Stacked_Checksum = (unsigned short) compressed.lossyCrc;
+  cestruct->Stacked_ComprSize = compressed.llcsize;
+  cestruct->Stacked_Datatype = compressed.datatype;
+
+  return status;
+}
+
+
+int CompressImagettes (struct ComprEntStructure *cestruct)
+{
+  unsigned int outsize;
+  struct ScienceBuf source, swap;
+  struct CompressedBuf compressed;
+  unsigned short prodId;
+  unsigned short evt_data[2];
+  int status = 0;
+
+  prodId = CC_IMAGETTES;
+  CrIaPaste(CCPRODUCT_ID, &prodId);
+
+  /* prepare source buffer */
+  source.datatype = DATATYPE_UINT32;
+  source.xelements = cestruct->Imagettes_ApertureSizeX; 
+  source.yelements = cestruct->Imagettes_ApertureSizeY;
+  source.zelements = cestruct->StackingNumber; 
+  source.nelements = source.xelements * source.yelements * source.zelements;
+  source.data = (void *) cestruct->ComprImagettes;
+
+  /* prepare swap buffer */
+  PrepareSwap (&swap, cestruct);
+
+  /* check size of processing buffer */
+  outsize = source.nelements * TYPESIZE(source.datatype);
+  if (outsize > cestruct->ProcBufBufferSize)
+    {
+#ifdef ISOLATED
+      (void) evt_data;
+      SDPRINT("ERROR: could not allocate %u bytes from PROCBUF with %u bytes left!\n", outsize, cestruct->ProcBufBufferSize);
+#else
+      evt_data[0] = prodId; /* product ID */
+      evt_data[1] = 0;
+
+      SdpEvtRaise(3, CRIA_SERV5_EVT_PROCBUF_INSUF, evt_data, 4);
+#endif          
+      return 0;
+    }
+
+  /* prepare processing buffer */
+  compressed.data = (void *) cestruct->ProcBuf;
+
+  SDPRINT("  Handing over uncompressed Imagettes: Size = %d B\n", outsize);
+
+  status = Compress(&source, cestruct, cestruct->Imagettes_CeKey, &compressed, SRCBUF, &swap);
+
+  cestruct->Imagettes_OriginalSize = compressed.nelements * TYPESIZE(compressed.datatype);
+  cestruct->Imagettes_ComprSize = compressed.llcsize; /* is in bytes */
+  cestruct->Imagettes_Checksum = compressed.lossyCrc;
+
+  return status;
+}
+
+int CompressImgMrgLOS (struct ComprEntStructure *cestruct)
+{
+  unsigned int outsize;
+  struct ScienceBuf source, swap;
+  struct CompressedBuf compressed;
+  unsigned short prodId;
+  unsigned short evt_data[2];
+  int status = 0;
+
+  prodId = CC_MRGLOS;
+  CrIaPaste(CCPRODUCT_ID, &prodId);
+
+  /* prepare source buffer */
+  source.datatype = DATATYPE_UINT32;
+  source.xelements = LSM_XDIM;
+  source.yelements = cestruct->SemWindowSizeY;
+  source.zelements = cestruct->StackingNumber;
+  source.nelements = source.xelements * source.yelements * source.zelements;
+  source.data = (void *) cestruct->ComprImgMrgLOS;
+
+  /* prepare swap buffer */
+  PrepareSwap (&swap, cestruct);
+
+  /* check size of processing buffer */
+  outsize = source.nelements * TYPESIZE(source.datatype);
+  if (outsize > cestruct->ProcBufBufferSize)
+    {
+#ifdef ISOLATED
+      (void) evt_data;
+      SDPRINT("ERROR: could not allocate %u bytes from PROCBUF with %u bytes left!\n", outsize, cestruct->ProcBufBufferSize);
+#else
+      evt_data[0] = prodId; /* product ID */
+      evt_data[1] = 0;
+
+      SdpEvtRaise(3, CRIA_SERV5_EVT_PROCBUF_INSUF, evt_data, 4);
+#endif          
+      return 0;
+    }
+
+  /* prepare dest buffer */
+  compressed.data = (void *) cestruct->ProcBuf;
+
+  status = Compress(&source, cestruct, cestruct->ImgMrgLOS_CeKey, &compressed, SRCBUF, &swap);
+
+  cestruct->ImgMrgLOS_OriginalSize = compressed.nelements * TYPESIZE(compressed.datatype);
+  cestruct->ImgMrgLOS_ComprSize = compressed.llcsize; /* is in bytes */
+  cestruct->ImgMrgLOS_Checksum = compressed.lossyCrc;
+
+  return status;
+}
+
+int CompressImgMrgLDK (struct ComprEntStructure *cestruct)
+{
+  unsigned int outsize;
+  struct ScienceBuf source, swap;
+  struct CompressedBuf compressed;
+  unsigned short prodId;
+  unsigned short evt_data[2];
+  int status = 0;
+
+  prodId = CC_MRGLDK;
+  CrIaPaste(CCPRODUCT_ID, &prodId);
+
+  /* prepare source buffer */
+  source.datatype = DATATYPE_UINT32;
+  source.xelements = LSM_XDIM;
+  source.yelements = cestruct->SemWindowSizeY;
+  source.zelements = cestruct->StackingNumber;
+  source.nelements = source.xelements * source.yelements * source.zelements;
+  source.data = (void *) cestruct->ComprImgMrgLDK;
+
+  /* prepare swap buffer */
+  PrepareSwap (&swap, cestruct);
+
+  /* check size of processing buffer */
+  outsize = source.nelements * TYPESIZE(source.datatype);
+  if (outsize > cestruct->ProcBufBufferSize)
+    {
+#ifdef ISOLATED
+      (void) evt_data;
+      SDPRINT("ERROR: could not allocate %u bytes from PROCBUF with %u bytes left!\n", outsize, cestruct->ProcBufBufferSize);
+#else
+      evt_data[0] = prodId; /* product ID */
+      evt_data[1] = 0;
+
+      SdpEvtRaise(3, CRIA_SERV5_EVT_PROCBUF_INSUF, evt_data, 4);
+#endif          
+      return 0;
+    }
+
+  /* prepare dest buffer */
+  compressed.data = (void *) cestruct->ProcBuf;
+
+  status = Compress(&source, cestruct, cestruct->ImgMrgLDK_CeKey, &compressed, SRCBUF, &swap);
+
+  cestruct->ImgMrgLDK_OriginalSize = compressed.nelements * TYPESIZE(compressed.datatype);
+  cestruct->ImgMrgLDK_ComprSize = compressed.llcsize; /* is in bytes */
+  cestruct->ImgMrgLDK_Checksum = compressed.lossyCrc;
+
+  return status;
+}
+
+int CompressImgMrgLBLK (struct ComprEntStructure *cestruct)
+{
+  unsigned int outsize;
+  struct ScienceBuf source, swap;
+  struct CompressedBuf compressed;
+  unsigned short prodId;
+  unsigned short evt_data[2];
+  int status = 0;
+
+  prodId = CC_MRGLBLK;
+  CrIaPaste(CCPRODUCT_ID, &prodId);
+
+  /* prepare source buffer */
+  source.datatype = DATATYPE_UINT32;
+  source.xelements = LSM_XDIM;
+  source.yelements = cestruct->SemWindowSizeY;
+  source.zelements = cestruct->StackingNumber;
+  source.nelements = source.xelements * source.yelements * source.zelements;
+  source.data = (void *) cestruct->ComprImgMrgLBLK;
+
+  /* prepare swap buffer */
+  PrepareSwap (&swap, cestruct);
+
+  /* check size of processing buffer */
+  outsize = source.nelements * TYPESIZE(source.datatype);
+  if (outsize > cestruct->ProcBufBufferSize)
+    {
+#ifdef ISOLATED
+      (void) evt_data;
+      SDPRINT("ERROR: could not allocate %u bytes from PROCBUF with %u bytes left!\n", outsize, cestruct->ProcBufBufferSize);
+#else
+      evt_data[0] = prodId; /* product ID */
+      evt_data[1] = 0;
+
+      SdpEvtRaise(3, CRIA_SERV5_EVT_PROCBUF_INSUF, evt_data, 4);
+#endif          
+      return 0;
+    }
+
+  /* prepare dest buffer */
+  compressed.data = (void *) cestruct->ProcBuf;
+
+  status = Compress(&source, cestruct, cestruct->ImgMrgLBLK_CeKey, &compressed, SRCBUF, &swap);
+
+  cestruct->ImgMrgLBLK_OriginalSize = compressed.nelements * TYPESIZE(compressed.datatype);
+  cestruct->ImgMrgLBLK_ComprSize = compressed.llcsize; /* is in bytes */
+  cestruct->ImgMrgLBLK_Checksum = compressed.lossyCrc;
+
+  return status;
+}
+
+
+int CompressImgMrgRBLK (struct ComprEntStructure *cestruct)
+{
+  unsigned int outsize;
+  struct ScienceBuf source, swap;
+  struct CompressedBuf compressed;
+  unsigned short prodId;
+  unsigned short evt_data[2];
+  int status = 0;
+
+  prodId = CC_MRGRBLK;
+  CrIaPaste(CCPRODUCT_ID, &prodId);
+
+  /* prepare source buffer */
+  source.datatype = DATATYPE_UINT32;
+  source.xelements = RSM_XDIM;
+  source.yelements = cestruct->SemWindowSizeY;
+  source.zelements = cestruct->StackingNumber;
+  source.nelements = source.xelements * source.yelements * source.zelements;
+  source.data = (void *) cestruct->ComprImgMrgRBLK;
+
+  /* prepare swap buffer */
+  PrepareSwap (&swap, cestruct);
+
+  /* check size of processing buffer */
+  outsize = source.nelements * TYPESIZE(source.datatype);
+  if (outsize > cestruct->ProcBufBufferSize)
+    {
+#ifdef ISOLATED
+      (void) evt_data;
+      SDPRINT("ERROR: could not allocate %u bytes from PROCBUF with %u bytes left!\n", outsize, cestruct->ProcBufBufferSize);
+#else
+      evt_data[0] = prodId; /* product ID */
+      evt_data[1] = 0;
+
+      SdpEvtRaise(3, CRIA_SERV5_EVT_PROCBUF_INSUF, evt_data, 4);
+#endif          
+      return 0;
+    }
+
+  /* prepare dest buffer */
+  compressed.data = (void *) cestruct->ProcBuf;
+
+  status = Compress(&source, cestruct, cestruct->ImgMrgRBLK_CeKey, &compressed, SRCBUF, &swap);
+
+  cestruct->ImgMrgRBLK_OriginalSize = compressed.nelements * TYPESIZE(compressed.datatype);
+  cestruct->ImgMrgRBLK_ComprSize = compressed.llcsize; /* is in bytes */
+  cestruct->ImgMrgRBLK_Checksum = compressed.lossyCrc;
+
+  return status;
+}
+
+
+int CompressImgMrgRDK (struct ComprEntStructure *cestruct)
+{
+  unsigned int outsize;
+  struct ScienceBuf source, swap;
+  struct CompressedBuf compressed;
+  unsigned short prodId;
+  unsigned short evt_data[2];
+  int status = 0;
+
+  prodId = CC_MRGRDK;
+  CrIaPaste(CCPRODUCT_ID, &prodId);
+
+  /* prepare source buffer */
+  source.datatype = DATATYPE_UINT32;
+  source.xelements = RSM_XDIM;
+  source.yelements = cestruct->SemWindowSizeY;
+  source.zelements = cestruct->StackingNumber;
+  source.nelements = source.xelements * source.yelements * source.zelements;
+  source.data = (void *) cestruct->ComprImgMrgRDK;
+
+  /* prepare swap buffer */
+  PrepareSwap (&swap, cestruct);
+
+  /* check size of processing buffer */
+  outsize = source.nelements * TYPESIZE(source.datatype);
+  if (outsize > cestruct->ProcBufBufferSize)
+    {
+#ifdef ISOLATED
+      (void) evt_data;
+      SDPRINT("ERROR: could not allocate %u bytes from PROCBUF with %u bytes left!\n", outsize, cestruct->ProcBufBufferSize);
+#else
+      evt_data[0] = prodId; /* product ID */
+      evt_data[1] = 0;
+
+      SdpEvtRaise(3, CRIA_SERV5_EVT_PROCBUF_INSUF, evt_data, 4);
+#endif
+      return 0;
+    }
+
+  /* prepare dest buffer */
+  compressed.data = (void *) cestruct->ProcBuf;
+
+  status = Compress(&source, cestruct, cestruct->ImgMrgRDK_CeKey, &compressed, SRCBUF, &swap);
+
+  cestruct->ImgMrgRDK_OriginalSize = compressed.nelements * TYPESIZE(compressed.datatype);
+  cestruct->ImgMrgRDK_ComprSize = compressed.llcsize; /* is in bytes */
+  cestruct->ImgMrgRDK_Checksum = compressed.lossyCrc;
+
+  return status;
+}
+
+
+int CompressImgMrgTDK (struct ComprEntStructure *cestruct)
+{
+  unsigned int outsize;
+  struct ScienceBuf source, swap;
+  struct CompressedBuf compressed;
+  unsigned short prodId;
+  unsigned short evt_data[2];
+  int status = 0;
+
+  prodId = CC_MRGTDK;
+  CrIaPaste(CCPRODUCT_ID, &prodId);
+
+  /* prepare source buffer */
+  source.datatype = DATATYPE_UINT32;
+  source.xelements = cestruct->SemWindowSizeX;
+  source.yelements = TM_YDIM;
+  source.zelements = cestruct->StackingNumber;
+  source.nelements = source.xelements * source.yelements * source.zelements;
+  source.data = (void *) cestruct->ComprImgMrgTDK;
+
+  /* prepare swap buffer */
+  PrepareSwap (&swap, cestruct);
+
+  /* check size of processing buffer */
+  outsize = source.nelements * TYPESIZE(source.datatype);
+  if (outsize > cestruct->ProcBufBufferSize)
+    {
+#ifdef ISOLATED
+      (void) evt_data;
+      SDPRINT("ERROR: could not allocate %u bytes from PROCBUF with %u bytes left!\n", outsize, cestruct->ProcBufBufferSize);
+#else
+      evt_data[0] = prodId; /* product ID */
+      evt_data[1] = 0;
+
+      SdpEvtRaise(3, CRIA_SERV5_EVT_PROCBUF_INSUF, evt_data, 4);
+#endif          
+      return 0;
+    }
+
+  /* prepare dest buffer */
+  compressed.data = (void *) cestruct->ProcBuf;
+
+  status = Compress(&source, cestruct, cestruct->ImgMrgTDK_CeKey, &compressed, SRCBUF, &swap);
+
+  cestruct->ImgMrgTDK_OriginalSize = compressed.nelements * TYPESIZE(compressed.datatype);
+  cestruct->ImgMrgTDK_ComprSize = compressed.llcsize; /* is in bytes */
+  cestruct->ImgMrgTDK_Checksum = compressed.lossyCrc;
+
+  return status;
+}
+
+
+int CompressImgMrgTOS (struct ComprEntStructure *cestruct)
+{
+  unsigned int outsize;
+  struct ScienceBuf source, swap;
+  struct CompressedBuf compressed;
+  unsigned short prodId;
+  unsigned short evt_data[2];
+  int status = 0;
+
+  prodId = CC_MRGTOS;
+  CrIaPaste(CCPRODUCT_ID, &prodId);
+
+  /* prepare source buffer */
+  source.datatype = DATATYPE_UINT32;
+  source.xelements = cestruct->SemWindowSizeX;
+  source.yelements = TM_YDIM;
+  source.zelements = cestruct->StackingNumber;
+  source.nelements = source.xelements * source.yelements * source.zelements;
+  source.data = (void *) cestruct->ComprImgMrgTOS;
+
+  /* prepare swap buffer */
+  PrepareSwap (&swap, cestruct);
+
+  /* check size of processing buffer */
+  outsize = source.nelements * TYPESIZE(source.datatype);
+  if (outsize > cestruct->ProcBufBufferSize)
+    {
+#ifdef ISOLATED
+      (void) evt_data;
+      SDPRINT("ERROR: could not allocate %u bytes from PROCBUF with %u bytes left!\n", outsize, cestruct->ProcBufBufferSize);
+#else
+      evt_data[0] = prodId; /* product ID */
+      evt_data[1] = 0;
+
+      SdpEvtRaise(3, CRIA_SERV5_EVT_PROCBUF_INSUF, evt_data, 4);
+#endif          
+      return 0;
+    }
+
+  /* prepare dest buffer */
+  compressed.data = (void *) cestruct->ProcBuf;
+
+  status = Compress(&source, cestruct, cestruct->ImgMrgTOS_CeKey, &compressed, SRCBUF, &swap);
+
+  cestruct->ImgMrgTOS_OriginalSize = compressed.nelements * TYPESIZE(compressed.datatype);
+  cestruct->ImgMrgTOS_ComprSize = compressed.llcsize; /* is in bytes */
+  cestruct->ImgMrgTOS_Checksum = compressed.lossyCrc;
+
+  return status;
+}
+
+
+void SdpCompress (struct ComprEntStructure *cestruct)
+{
+  unsigned short cib, sdbstate;
+  unsigned int cemode = CEMODE_WIN;
+    
+  /* setup CIB */
+  CrIaCopy(CIBIN_ID, &cib);
+  CrIaCopy(SDBSTATE_ID, &sdbstate);
+
+  if (sdbstate == CrIaSdb_CONFIG_FULL)
+    cemode = CEMODE_FULL;
+
+  SetupCeBuffers (cestruct, cib, cestruct->SemWindowSizeX, cestruct->SemWindowSizeY, cestruct->StackingNumber, cemode);
+
+  SDPRINT("buffer sizes: SWAP %d; CIB %d\n", cestruct->SwapBufBufferSize, cestruct->CibSize);
+  SDPRINT("1st ping-pong buffer: USED = %d. rest goes to PROC\n", cestruct->UsedBufferSize);
+  
+  /* use the remaining CIB size for the ProcBuf */
+  ProcBufBorgMode (cestruct);
+    
+  /*
+    Stack and Compress Image Frame
+  */
+
+  SDPRINT(ANSI_COLOR_CYAN "Stacked Frame\n" ANSI_COLOR_RESET);
+
+  CompressStacked (cestruct);
+
+  
+  /*
+    Compressed Header Data
+    NOTE: The Image Frame should be compressed before the Headers to have
+    the three SibPhotometry values initialized!
+  */
+  SDPRINT(ANSI_COLOR_CYAN "Header Data\n" ANSI_COLOR_RESET);
+
+  CompressHeaders (cestruct);
+  SDPRINT("  Headers have been compressed to %d bytes, CRC=%04x\n\n", cestruct->HeaderData_ComprSize, cestruct->HeaderData_Checksum);
+
+
+  /*
+    Imagettes
+  */
+
+  if (sdbstate != CrIaSdb_CONFIG_FULL)
+    {
+      SDPRINT(ANSI_COLOR_CYAN "Imagettes\n" ANSI_COLOR_RESET);
+
+      CompressImagettes (cestruct);
+      SDPRINT("  Imagettes have been compressed to %ld bytes\n\n", (unsigned long int)cestruct->Imagettes_ComprSize);
+    }
+
+  /*
+    Image Margins: LOS
+  */
+  
+  if (sdbstate != CrIaSdb_CONFIG_FULL)
+    {
+      SDPRINT(ANSI_COLOR_CYAN "ImgMrgLOS\n" ANSI_COLOR_RESET);
+
+      CompressImgMrgLOS (cestruct);
+      SDPRINT("  LOS has been compressed to %d bytes\n\n", cestruct->ImgMrgLOS_ComprSize);
+
+      /*      SDPRINT("LOS are: %f .. %f .. %08x\n", ((float *)cestruct->ComprImgMrgLOS)[0], ((float *)cestruct->ComprImgMrgLOS)[21], cestruct->ComprImgMrgLOS[23]); */
+    }
+
+  /*
+    Image Margins: LDK
+  */
+  
+  if (sdbstate != CrIaSdb_CONFIG_FULL)
+    {
+      SDPRINT(ANSI_COLOR_CYAN "ImgMrgLDK\n" ANSI_COLOR_RESET);
+      CompressImgMrgLDK (cestruct);
+      SDPRINT("  LDK has been compressed to %d bytes\n\n", cestruct->ImgMrgLDK_ComprSize);
+
+      /*      SDPRINT("LDK are: %f .. %f .. %08x\n", ((float *)cestruct->ComprImgMrgLDK)[0], ((float *)cestruct->ComprImgMrgLDK)[21], cestruct->ComprImgMrgLDK[23]); */
+    }
+
+  /*
+    Image Margins: LBLK
+  */
+
+  if (sdbstate != CrIaSdb_CONFIG_FULL)
+    {
+      SDPRINT(ANSI_COLOR_CYAN "ImgMrgLBLK\n" ANSI_COLOR_RESET);
+      CompressImgMrgLBLK (cestruct);
+      SDPRINT("  LBLK has been compressed to %d bytes\n\n", cestruct->ImgMrgLBLK_ComprSize);
+
+      /*      SDPRINT("LBLK are: %f .. %f .. %08x\n", ((float *)cestruct->ComprImgMrgLBLK)[0], ((float *)cestruct->ComprImgMrgLBLK)[21], cestruct->ComprImgMrgLBLK[23]); */
+    }
+
+  /*
+    Image Margins: RBLK
+  */
+
+  if (sdbstate != CrIaSdb_CONFIG_FULL)
+    {
+      SDPRINT(ANSI_COLOR_CYAN "ImgMrgRBLK\n" ANSI_COLOR_RESET);
+      CompressImgMrgRBLK (cestruct);
+      SDPRINT("  RBLK has been compressed to %d bytes\n\n", cestruct->ImgMrgRBLK_ComprSize);
+
+      /*      SDPRINT("RBLK are: %f .. %f .. %08x\n", ((float *)cestruct->ComprImgMrgRBLK)[0], ((float *)cestruct->ComprImgMrgRBLK)[21], cestruct->ComprImgMrgRBLK[23]); */
+    }
+
+  /*
+    Image Margins: RDK
+  */
+
+  if (sdbstate != CrIaSdb_CONFIG_FULL)
+    {
+      SDPRINT(ANSI_COLOR_CYAN "ImgMrgRDK\n" ANSI_COLOR_RESET);
+      CompressImgMrgRDK (cestruct);
+      SDPRINT("  RDK has been compressed to %d bytes\n\n", cestruct->ImgMrgRDK_ComprSize);
+
+      /*      SDPRINT("RDK are: %f .. %f .. %08x\n", ((float *)cestruct->ComprImgMrgRDK)[0], ((float *)cestruct->ComprImgMrgRDK)[21], cestruct->ComprImgMrgRDK[23]); */
+    }
+
+  /*
+    Image Margins: TOS
+  */
+
+  if (sdbstate != CrIaSdb_CONFIG_FULL)
+    {
+      SDPRINT(ANSI_COLOR_CYAN "ImgMrgTOS\n" ANSI_COLOR_RESET);
+      CompressImgMrgTOS (cestruct);
+      SDPRINT("  TOS has been compressed to %d bytes\n\n", cestruct->ImgMrgTOS_ComprSize);
+
+      /*      SDPRINT("TOS are: %f .. %f .. %08x\n", ((float *)cestruct->ComprImgMrgTOS)[0], ((float *)cestruct->ComprImgMrgTOS)[21], cestruct->ComprImgMrgTOS[23]); */
+    }
+
+  /*
+    Image Margins: TDK
+  */
+
+  if (sdbstate != CrIaSdb_CONFIG_FULL)
+    {
+      SDPRINT(ANSI_COLOR_CYAN "ImgMrgTDK\n" ANSI_COLOR_RESET);
+      CompressImgMrgTDK (cestruct);
+      SDPRINT("  TDK has been compressed to %d bytes\n\n", cestruct->ImgMrgTDK_ComprSize);
+
+      /*      SDPRINT("TDK are: %f .. %f .. %08x\n", ((float *)cestruct->ComprImgMrgTDK)[0], ((float *)cestruct->ComprImgMrgTDK)[21], cestruct->ComprImgMrgTDK[23]); */
+    }
+
+  return;
+}
diff --git a/CompressionEntity/src/SdpCompress.h b/CompressionEntity/src/SdpCompress.h
new file mode 100644
index 0000000..2c49e34
--- /dev/null
+++ b/CompressionEntity/src/SdpCompress.h
@@ -0,0 +1,30 @@
+#ifndef SDPCOMPRESS_H
+#define SDPCOMPRESS_H
+
+#include "SdpCompressionEntityStructure.h"
+
+
+int CompressHeaders (struct ComprEntStructure *cestruct);
+
+int CompressStacked (struct ComprEntStructure *cestruct);
+
+int CompressImagettes (struct ComprEntStructure *cestruct);
+
+int CompressImgMrgLOS (struct ComprEntStructure *cestruct);
+
+int CompressImgMrgLDK (struct ComprEntStructure *cestruct);
+
+int CompressImgMrgLBLK (struct ComprEntStructure *cestruct);
+
+int CompressImgMrgRBLK (struct ComprEntStructure *cestruct);
+
+int CompressImgMrgRDK (struct ComprEntStructure *cestruct);
+
+int CompressImgMrgTDK (struct ComprEntStructure *cestruct);
+
+int CompressImgMrgTOS (struct ComprEntStructure *cestruct);
+
+void SdpCompress (struct ComprEntStructure *cestruct);
+
+
+#endif
diff --git a/CompressionEntity/src/SdpCompressionEntityStructure.h b/CompressionEntity/src/SdpCompressionEntityStructure.h
new file mode 100644
index 0000000..9799836
--- /dev/null
+++ b/CompressionEntity/src/SdpCompressionEntityStructure.h
@@ -0,0 +1,249 @@
+/**
+ * @file    SdpCompressionEntityStructure.h
+ * @author  Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @date    September, 2016
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @defgroup CompressionEntity Compression Entity Structure
+ * @ingroup Sdp
+ *
+ * @brief this structure is a key component of the of the science data processing chain
+ *
+ * The term __Compression Entity__ is used in the following two ways:
+ * A Compression Entity (bitstream) is quasi the zip-File of the science data processing chain. 
+ * A Compression Entity Structure (@ref ComprEntStructure) is the construct holding the various components and parameters in memory.
+ * Think of the Compression Entity being the serialization of the Compression Entity Structure.
+ * This serialization process is carried out by the @ref SdpCollect function. The equivalent
+ * on ground is the Decompose function in the CompressionEntity class.
+ *
+ * A @ref ComprEntStructure has a header with the most important parameters describing the contained science data.
+ * It starts with the Observation ID (@ref OBSID), equivalently called "visit ID" by some. The Compression Entity
+ * is supposed to hold up to 10 products (imagettes, 7 margin areas, the frame, headers). Also for these we have
+ * the most important parameters which are needed to de-compress and interpret the data.
+ * The structure then contains a number of pointers to buffers. The structure itself should be initialized with
+ * the @ref InitComprEntStructureFromDataPool function, before the @ref SdpCompress function can be executed. That will set up 
+ * the buffers using the @ref SetupCeBuffers 
+ * function in the @ref SDB, more precisely, in the @ref CIB. For each product, we have a pointer to the uncompressed data
+ * and one to the compressed data. In addition, a pointer to the @ref ProcBuf and one to an auxiliary buffer (@ref SwapBuf) is included.
+ * They are used by the @ref SdpCompress function. Navigate there, if you are interested in how they are used precisely.
+ */
+
+#ifndef SDP_COMPRESSION_ENTITY_STRUCTURE_H
+#define SDP_COMPRESSION_ENTITY_STRUCTURE_H
+
+#include "SdpCeDefinitions.h"
+
+
+/* Offset in bits within a CE where the integrity flags (e.g. Science Data Suspend (SDS)) are located */
+#define STREAMPOS_INTEGRITY 166
+
+  
+/**
+ * \struct ComprEntStructure
+ * @brief Compression Entity structure for IFSW and GS  
+ * @note  see CHEOPS-UVIE-ICD-003 Tables 3-7      
+ */
+
+struct ComprEntStructure {
+
+  /*** CE Header Parameters */
+  unsigned int    Obsid;             /**< Observation ID */
+  struct cuctime  Timetag;           /**< CUC time of CE                     [CE datatype is 48 bits] */
+  unsigned short  Counter;           /**< CE counter */
+  unsigned int    Size;              /**< size in B of the CE including CE headers */
+  unsigned short  Version;           /**< IFSW build number / SW version */
+  unsigned char   StackingNumber;    /**< nr of raw frames per stacked frame */
+  unsigned char   AcquisitionMode;   /**< SEM CCD mode (eg. full frame)      [CE datatype is 4 bits] */
+  unsigned char   ReadoutMode;       /**< SEM readout mode (eg. faint)       [CE datatype is 4 bits] */
+  unsigned char   Oversampling;      /**< SEM data oversampling              [CE datatype is 4 bits] */
+  unsigned char   FrameSource;       /**< SEM data acquisition source        [CE datatype is 2 bits] */
+  unsigned char   Integrity;         /**< CE integrity                       [CE datatype is 2 bits] */
+  unsigned int    RepetitionPeriod;  /**< inverse of frame rate in ms. this has changed to int */
+  unsigned int    ExposureTime;      /**< exposure time in ms */
+  unsigned short  SemWindowPosX;     /**< Window bottom left coordinate, it counts pixels the very bottom left pixel is in the overscan margin area */
+  unsigned short  SemWindowPosY;     
+  unsigned short  SemWindowSizeX;   
+  unsigned short  SemWindowSizeY;
+  unsigned int    Target_LocationX;  /**< intended target location as taken from the @ref StarMap command */
+  unsigned int    Target_LocationY;  
+  /**@*/
+
+  
+  /*** Compressed Header Data ***/
+  unsigned int    HeaderData_CeKey;          /**< MSB = ProductId, 3 LSB = compression mode */
+  unsigned int    HeaderData_OriginalSize;   /**< uncompressed size in B */
+  unsigned int    HeaderData_ComprSize;      /**< compressed size in B */
+  unsigned short  HeaderData_Checksum;
+
+  unsigned int *Base;                        /**< will point to the base of the @ref CIB */
+  unsigned int *FlatHeaders;                 /**< "raw" headers going into the CompressHeaders function */
+  unsigned int *ComprHeaders;                /**< container for binary blob */ 
+  struct Meterology *CeHeaderData;           /**< uncompressed headers for your convenience. Has @ref StackingNumber dimension. */
+  
+  /*** Stacked Frame (or single raw frame) ***/
+  unsigned int    Stacked_CeKey;
+  unsigned int    Stacked_OriginalSize;
+  unsigned int    Stacked_ComprSize;
+  unsigned short  Stacked_Checksum;
+  unsigned char   Stacked_Datatype; 
+  unsigned char   Stacked_Shape;
+  unsigned short  Stacked_SizeX;             /**< @note also diameter of circular shape */
+  unsigned short  Stacked_SizeY;
+
+  unsigned int *Stacked;
+  unsigned int *ComprStacked;                /**< container for binary blob */
+
+
+  /*** Imagettes ***/
+  unsigned int    Imagettes_CeKey;
+  unsigned int    Imagettes_OriginalSize;
+  unsigned int    Imagettes_ComprSize;
+  unsigned short  Imagettes_Checksum;
+  unsigned char   Imagettes_ApertureShape;
+  unsigned char   Imagettes_CroppingStrategy;
+  unsigned char   Imagettes_ApertureSizeX;
+  unsigned char   Imagettes_ApertureSizeY;
+  unsigned char   Imagettes_StackingOrder;
+
+  unsigned int *Imagettes;                   /**< uncompressed imagettes */
+  unsigned int *ComprImagettes;              /**< container for binary blob */ 
+
+
+  /*** Image Margins ***/
+  /* LOS */
+  unsigned int    ImgMrgLOS_CeKey;
+  unsigned int    ImgMrgLOS_OriginalSize;
+  unsigned int    ImgMrgLOS_ComprSize;
+  unsigned short  ImgMrgLOS_Checksum;
+
+  unsigned int    *ImgMrgLOS;                /**< uncompressed margin */
+  unsigned int    *ComprImgMrgLOS;           /**< container for binary blob */
+
+  /* LDK */
+  unsigned int    ImgMrgLDK_CeKey;
+  unsigned int    ImgMrgLDK_OriginalSize;
+  unsigned int    ImgMrgLDK_ComprSize;
+  unsigned short  ImgMrgLDK_Checksum;
+  unsigned short  ImgMrgLDK_ColumnSelectionMask;
+  
+  unsigned int    *ImgMrgLDK;                /**< uncompressed margin */      
+  unsigned int    *ComprImgMrgLDK;           /**< container for binary blob */
+
+  /* LBLK */
+  unsigned int    ImgMrgLBLK_CeKey;
+  unsigned int    ImgMrgLBLK_OriginalSize;
+  unsigned int    ImgMrgLBLK_ComprSize;
+  unsigned short  ImgMrgLBLK_Checksum;
+ 
+  unsigned int    *ImgMrgLBLK;               /**< uncompressed margin */      
+  unsigned int    *ComprImgMrgLBLK;          /**< container for binary blob */
+
+  /* RBLK */
+  unsigned int    ImgMrgRBLK_CeKey;
+  unsigned int    ImgMrgRBLK_OriginalSize;
+  unsigned int    ImgMrgRBLK_ComprSize;
+  unsigned short  ImgMrgRBLK_Checksum;
+  
+  unsigned int    *ImgMrgRBLK;               /**< uncompressed margin */      
+  unsigned int    *ComprImgMrgRBLK;          /**< container for binary blob */
+
+  /* RDK */
+  unsigned int    ImgMrgRDK_CeKey;
+  unsigned int    ImgMrgRDK_OriginalSize;
+  unsigned int    ImgMrgRDK_ComprSize;
+  unsigned short  ImgMrgRDK_Checksum;
+  unsigned short  ImgMrgRDK_ColumnSelectionMask;
+ 
+  unsigned int    *ImgMrgRDK;                /**< uncompressed margin */      
+  unsigned int    *ComprImgMrgRDK;           /**< container for binary blob */
+
+  /* TOS */
+  unsigned int    ImgMrgTOS_CeKey;
+  unsigned int    ImgMrgTOS_OriginalSize;
+  unsigned int    ImgMrgTOS_ComprSize;
+  unsigned short  ImgMrgTOS_Checksum;
+
+  unsigned int    *ImgMrgTOS;                /**< uncompressed margin */      
+  unsigned int    *ComprImgMrgTOS;           /**< container for binary blob */
+
+  /* TDK */
+  unsigned int    ImgMrgTDK_CeKey;
+  unsigned int    ImgMrgTDK_OriginalSize;
+  unsigned int    ImgMrgTDK_ComprSize;
+  unsigned short  ImgMrgTDK_Checksum;
+
+  unsigned int    *ImgMrgTDK;                /**< uncompressed margin */      
+  unsigned int    *ComprImgMrgTDK;           /**< container for binary blob */
+
+  /* additional Buffers and buffer size */
+  unsigned int *ProcBuf;                     /**< the processing buffer needs to be at least as large as the largest raw input product */
+  unsigned int *SwapBuf;                     /**< the SwapBuf is needed for arithmetic compression (see @ref fmari_compress) */
+  unsigned int FlatHeadersBufferSize;
+  unsigned int StackedBufferSize;
+  unsigned int ImagettesBufferSize;
+  unsigned int ImgMrgLOSBufferSize;
+  unsigned int ImgMrgLDKBufferSize;
+  unsigned int ImgMrgLBLKBufferSize;
+  unsigned int ImgMrgRBLKBufferSize;
+  unsigned int ImgMrgRDKBufferSize;
+  unsigned int ImgMrgTOSBufferSize;
+  unsigned int ImgMrgTDKBufferSize;
+  unsigned int ComprHeadersBufferSize;
+  unsigned int ComprImagettesBufferSize;
+  unsigned int ComprStackedBufferSize;
+  unsigned int ComprImgMrgLOSBufferSize;
+  unsigned int ComprImgMrgLDKBufferSize;
+  unsigned int ComprImgMrgLBLKBufferSize;
+  unsigned int ComprImgMrgRBLKBufferSize;
+  unsigned int ComprImgMrgRDKBufferSize;
+  unsigned int ComprImgMrgTOSBufferSize;
+  unsigned int ComprImgMrgTDKBufferSize;
+  unsigned int ProcBufBufferSize;
+  unsigned int SwapBufBufferSize;
+  unsigned int UsedBufferSize;
+  unsigned int CibSize;
+
+#ifdef GROUNDSW  
+  unsigned int    ImgMrgLOS_Xdim;            /**< dimension caclulated during decompression */
+  unsigned int    ImgMrgLOS_Ydim;           
+  unsigned int    ImgMrgLOS_Zdim;           
+
+  unsigned int    ImgMrgLDK_Xdim;           
+  unsigned int    ImgMrgLDK_Ydim;           
+  unsigned int    ImgMrgLDK_Zdim;           
+
+  unsigned int    ImgMrgLBLK_Xdim;          
+  unsigned int    ImgMrgLBLK_Ydim;          
+  unsigned int    ImgMrgLBLK_Zdim;          
+
+  unsigned int    ImgMrgRBLK_Xdim;          
+  unsigned int    ImgMrgRBLK_Ydim;          
+  unsigned int    ImgMrgRBLK_Zdim;          
+
+  unsigned int    ImgMrgRDK_Xdim;           
+  unsigned int    ImgMrgRDK_Ydim;           
+  unsigned int    ImgMrgRDK_Zdim;           
+
+  unsigned int    ImgMrgTOS_Xdim;           
+  unsigned int    ImgMrgTOS_Ydim;           
+  unsigned int    ImgMrgTOS_Zdim;           
+  
+  unsigned int    ImgMrgTDK_Xdim;           
+  unsigned int    ImgMrgTDK_Ydim;           
+  unsigned int    ImgMrgTDK_Zdim;
+
+  unsigned short overrideCRC;
+#endif
+  
+};
+
+#endif
diff --git a/CompressionEntity/src/SdpNlcPhot.c b/CompressionEntity/src/SdpNlcPhot.c
new file mode 100644
index 0000000..1b1850e
--- /dev/null
+++ b/CompressionEntity/src/SdpNlcPhot.c
@@ -0,0 +1,885 @@
+/**
+ * @file    SdpNlcPhot.c
+ * @ingroup SdpNlcPhot
+ * @author  Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @date    March, 2017
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ *
+ * @defgroup SdpNlcPhot Linearization and Quick Photometry
+ * @ingroup Sdp
+ *
+ * @brief Contains the nonlinearity correction function @ref NlcSplineCorr28 and the quick photometry function @ref QuickPhotometry which can be 
+ *        used in the preprocessing step of the @ref Compress function.         
+ *
+ */
+
+
+#include "SdpNlcPhot.h"
+#include "SdpAlgorithmsImplementation.h" /* for Median, CircExtract32 */
+#include "SdpBuffers.h" /* for struct ScienceBuf and SibPhotometry */
+
+#include "IfswMath.h"
+
+#include "CrIaDataPool.h"
+#include "CrIaDataPoolId.h"
+
+#include <stdio.h> /* for SDPRINT */
+
+
+#define SPLINE_SEGMENTS 28
+#define GAIN_PARAMS SPLINE_SEGMENTS
+#define NLC2_SEGMENTS 16
+
+/* NOTE: these global arrays are sized after the old NLC */
+unsigned int rborder[SPLINE_SEGMENTS]; /* right borders of spline segment intervals */
+double A[SPLINE_SEGMENTS]; /* 0th order coefficients for nlcSplineCorr28 */
+double B[SPLINE_SEGMENTS]; /* 1st order coefficients for nlcSplineCorr28 */
+double C[SPLINE_SEGMENTS]; /* 2nd order coefficients for nlcSplineCorr28 */
+double D[SPLINE_SEGMENTS]; /* 3rd order coefficients for nlcSplineCorr28 */
+
+
+/**
+ * @brief    Function used by @ref NlcSplineCorr28. It returns the index of the right (=upper) border of the interval that the 
+ *           given number belongs to. This function is designed to handle exactly 28 intervals.
+ * @param    value    the value which is sought within the intervals given by rborder
+ * @param    rb       an array of right (=upper) borders
+ * @note     the right border is assumed to belong to the interval 
+ * @note     this is implemented as a bisection to be as fast as possible 
+ *
+ * @returns  the index of the interval to which the input value belongs
+ */
+
+int GetInterval28 (unsigned int value, unsigned int *rb)
+{
+  int r=0;
+  
+  if (value <= rb[13])
+    {
+      /* 0..13 */
+      if (value <= rb[6])
+	{
+	  /* 0..6 */
+	  if (value <= rb[3])
+	    {
+	      /* 0..3 */
+	      if (value <= rb[1])
+		{
+		  /* 0..1 */		  
+		  if (value <= rb[0])
+		    {
+		      /* 0 */
+		      r = 0;
+		    }
+		  else
+		    {
+		      /* 1 */
+		      r = 1;
+		    }
+		}
+	      else
+		{
+		  /* 2..3 */
+		  if (value <= rb[2])
+		    {
+		      /* 2 */
+		      r = 2;
+		    }
+		  else
+		    {
+		      /* 3 */
+		      r = 3;
+		    }		      
+		}
+	    }
+	  else
+	    {
+	      /* 4..6 */
+	      if (value <= rb[5])
+		{
+		  /* 4..5 */
+		  if (value <= rb[4])
+		    {
+		      /* 4 */
+		      r = 4;
+		    }
+		  else
+		    {
+		      /* 5 */
+		      r = 5;
+		    }		  
+		}
+	      else
+		{
+		  /* 6 */
+		  r = 6;		  
+		}
+	    }
+	}
+      else
+	{
+	  /* 7..13 */
+	  if (value <= rb[10])
+	    {
+	      /* 7..10 */
+	      if (value <= rb[8])
+		{
+		  /* 7..8 */		  
+		  if (value <= rb[7])
+		    {
+		      /* 7 */
+		      r = 7;
+		    }
+		  else
+		    {
+		      /* 8 */
+		      r = 8;
+		    }
+		}
+	      else
+		{
+		  /* 9..10 */
+		  if (value <= rb[9])
+		    {
+		      /* 9 */
+		      r = 9;
+		    }
+		  else
+		    {
+		      /* 10 */
+		      r = 10;
+		    }
+		}
+	    }
+	  else
+	    {
+	      /* 11..13 */
+	      if (value <= rb[12])
+		{
+		  /* 11..12 */
+		  if (value <= rb[11])
+		    {
+		      /* 11 */
+		      r = 11;
+		    }
+		  else
+		    {
+		      /* 12 */
+		      r = 12;
+		    }		  
+		}
+	      else
+		{
+		  /* 13 */
+		  r = 13; 
+		}
+	    }
+	}
+    }
+  else
+    {
+      /* 14..27 */
+      if (value <= rb[20])
+	{
+	  /* 14..20 */
+	  if (value <= rb[17])
+	    {
+	      /* 14..17 */
+	      if (value <= rb[15])
+		{
+		  /* 14..15 */		  
+		  if (value <= rb[14])
+		    {
+		      /* 14 */
+		      r = 14;
+		    }
+		  else
+		    {
+		      /* 15 */
+		      r = 15;
+		    }
+		}
+	      else
+		{
+		  /* 16..17 */
+		  if (value <= rb[16])
+		    {
+		      /* 16 */
+		      r = 16;
+		    }
+		  else
+		    {
+		      /* 17 */
+		      r = 17;
+		    }		      
+		}
+	    }
+	  else
+	    {
+	      /* 18..20 */
+	      if (value <= rb[20])
+		{
+		  /* 18..19 */
+		  if (value <= rb[18])
+		    {
+		      /* 18 */
+		      r = 18;
+		    }
+		  else
+		    {
+		      /* 19 */
+		      r = 19;
+		    }		  
+		}
+	      else
+		{
+		  /* 20 */
+		  r = 20;		  
+		}
+	    }
+	}
+      else
+	{
+	  /* 21..27 */
+	  if (value <= rb[24])
+	    {
+	      /* 21..24 */
+	      if (value <= rb[22])
+		{
+		  /* 21..22 */		  
+		  if (value <= rb[21])
+		    {
+		      /* 21 */
+		      r = 21;
+		    }
+		  else
+		    {
+		      /* 22 */
+		      r = 22;
+		    }
+		}
+	      else
+		{
+		  /* .. */
+		  if (value <= rb[23])
+		    {
+		      /* 23 */
+		      r = 23;
+		    }
+		  else
+		    {
+		      /* 24 */
+		      r = 24;
+		    }
+		}
+	    }
+	  else
+	    {
+	      /* 25..27 */
+	      if (value <= rb[26])
+		{
+		  /* 25..26 */
+		  if (value <= rb[25])
+		    {
+		      /* 25 */
+		      r = 25;
+		    }
+		  else
+		    {
+		      /* 26 */
+		      r = 26;
+		    }		  
+		}
+	      else
+		{
+		  /* 27 */
+		  r = 27; 
+		}
+	    }
+	}
+    }
+
+  return r;
+}
+
+
+/**
+ * @brief    Function used by @ref NlcSplineCorr16. It returns the index of the right (=upper) border of the interval that the 
+ *           given number belongs to. This function is designed to handle exactly 16 intervals. 
+ *           When there are less, coefficients should be adapted accordingly.
+ * @param    value    the value which is sought within the intervals given by rborder
+ * @param    rb       an array of right (=upper) borders
+ * @note     the right border is assumed to belong to the interval 
+ * @note     this is implemented as a bisection to be as fast as possible 
+ *
+ * @returns  the index of the interval to which the input value belongs
+ */
+
+int GetInterval16 (unsigned int value, unsigned int *rb)
+{
+  int r=0;
+  
+  if (value <= rb[7])
+    {
+      /* 0..7 */
+      if (value <= rb[3])
+	{
+	  /* 0..3 */
+	  if (value <= rb[1])
+	    {
+	      /* 0..1 */
+	      if (value <= rb[0])
+		{
+		  /* 0 */
+		  r = 0;
+		}
+	      else
+		{
+		  /* 1 */
+		  r = 1;
+		}
+	    }
+	  else
+	    {
+	      /* 2..3 */
+	      if (value <= rb[2])
+		{
+		  /* 2 */
+		  r = 2;
+		}
+	      else
+		{
+		  /* 3 */
+		  r = 3;
+		}
+	    }
+	}
+      else
+	{
+	  /* 4..7 */
+	  if (value <= rb[5])
+	    {
+	      /* 4..5 */
+	      if (value <= rb[4])
+		{
+		  /* 4 */
+		  r = 4;
+		}
+	      else
+		{
+		  /* 5 */
+		  r = 5;
+		}
+	    }
+	  else
+	    {
+	      /* 6..7 */
+	      if (value <= rb[6])
+		{
+		  /* 6 */
+		  r = 6;
+		}
+	      else
+		{
+		  /* 7 */
+		  r = 7;
+		}
+	    }
+	}
+    }
+  else
+    {
+      /* 8..15 */
+      if (value <= rb[11])
+	{
+	  /* 8..11 */
+	  if (value <= rb[9])
+	    {
+	      /* 8..9 */
+	      if (value <= rb[8])
+		{
+		  /* 8 */
+		  r = 8;
+		}
+	      else
+		{
+		  /* 9 */
+		  r = 9;
+		}
+	    }
+	  else
+	    {
+	      /* 10..11 */
+	      if (value <= rb[10])
+		{
+		  /* 10 */
+		  r = 10;
+		}
+	      else
+		{
+		  /* 11 */
+		  r = 11;
+		}
+	    }
+	}
+      else
+	{
+	  /* 12..15 */
+	  if (value <= rb[13])
+	    {
+	      /* 12..13 */
+	      if (value <= rb[12])
+		{
+		  /* 12 */
+		  r = 12;
+		}
+	      else
+		{
+		  /* 13 */
+		  r = 13;
+		}
+	    }
+	  else
+	    {
+	      /* 14..15 */
+	      if (value <= rb[14])
+		{
+		  /* 14 */
+		  r = 14;
+		}
+	      else
+		{
+		  /* 15 */
+		  r = 15;
+		}
+	    }
+	}
+    }
+  
+  return r;
+}
+
+
+/**
+ * @brief    Nonlinearity correction for the CHEOPS CCD readout values.
+ *           It uses a set of splines as correction function.
+ * @param[in,out]  data   the array of pixel values stored as unsigned ints; 
+ *                        this will be overwritten by the corrected values
+ * @param          n      the number of pixel values to be corrected      
+ * @note     overwrites input array
+ * @note     saturates the corrected values at 65535
+ */
+
+void NlcSplineCorr28 (unsigned int *data, unsigned int n)
+{
+  unsigned int i, value, rightBorderIndex;
+  double x, xx, xxx;
+  unsigned int utemp32;
+  float ftemp;
+
+  for (i=0; i < SPLINE_SEGMENTS; i++)
+    {
+      CrIaCopyArrayItem (NLCBORDERS_ID, &utemp32, i);
+      rborder[i] = utemp32;
+
+      CrIaCopyArrayItem (NLCCOEFF_A_ID, &ftemp, i);
+      A[i] = (double) ftemp;
+
+      CrIaCopyArrayItem (NLCCOEFF_B_ID, &ftemp, i);
+      B[i] = (double) ftemp;
+
+      CrIaCopyArrayItem (NLCCOEFF_C_ID, &ftemp, i);
+      C[i] = (double) ftemp;
+
+      CrIaCopyArrayItem (NLCCOEFF_D_ID, &ftemp, i);
+      D[i] = (double) ftemp;
+    }
+  
+  for (i=0; i < n; i++)
+    {
+      value = data[i];
+
+      /* get the index of the right border of the interval the current value belongs to */
+      rightBorderIndex = GetInterval28 (value, rborder);
+
+      /* The spline coefficients assume that x starts at 0 within the interval,
+	 but our x counts from 0 to 65k, so we have to shift the x axis for 
+	 every interval back to zero by subtracting the left border.
+	 The first interval starts at 0, so nothing has to be done for it. */
+      
+      if (rightBorderIndex != 0)
+	{
+	  x = (double) (value - rborder[rightBorderIndex-1]);
+	}
+      else		      
+	{
+	  x = (double) value;
+	}
+
+      /* this saves one multiplication */
+      xx = x*x;
+      xxx = x*xx;          
+            
+      x = D[rightBorderIndex]*xxx + C[rightBorderIndex]*xx + B[rightBorderIndex]*x + A[rightBorderIndex];
+
+      /* the result is not truncated to integer, but rounded with the help of the inbuilt fdtoi instruction */
+      value = (unsigned int) roundf ((float)x);
+
+      /* saturate a corrected value at 16 bits */
+      if (value > 0xffff)
+	value = 0xffff;
+      
+      data[i] = value;
+    }  
+
+  return;
+}
+
+
+float NlcCalcGain (float Vss, float Vrd, float Vod, float Vog, float Tccd)
+{
+  double gain, gcorr, temp;
+  float ftemp;
+  unsigned int i;
+  
+  for (i=0; i < GAIN_PARAMS; i++)
+    {
+      /* D coefficients are used for the GAIN calculation */
+      CrIaCopyArrayItem (NLCCOEFF_D_ID, &ftemp, i);
+      D[i] = (double) ftemp;
+    }
+
+  /* sum up the terms with the coefficients */
+  gcorr = 1.0;
+
+  /* Vss - Rss */
+  temp = (Vss - D[NLCI_Rss]);
+  gcorr += temp * D[NLCI_VssRss];
+
+  /* Vod - Vss - Rodss */
+  temp = (Vod - Vss - D[NLCI_Rodss]);
+  gcorr += temp * D[NLCI_VodVssRodss];
+
+  /* (Vod - Vss - Rodss)**2 */
+  temp = (Vod - Vss - D[NLCI_Rodss]);
+  gcorr += temp * temp * D[NLCI_VodVssRodss2];
+
+  /* Vrd - Vss - Rrdss */
+  temp = (Vrd - Vss - D[NLCI_Rrdss]);
+  gcorr += temp * D[NLCI_VrdVssRrdss];
+
+  /* (Vrd - Vss - Rrdss)**2 */
+  temp = (Vrd - Vss - D[NLCI_Rrdss]);  
+  gcorr += temp * temp * D[NLCI_VrdVssRrdss2];
+
+  /* Vog - Vss - Rogss */
+  temp = (Vog - Vss - D[NLCI_Rogss]);
+  gcorr += temp * D[NLCI_VogVssRogss];
+
+  /* (Vog - Vss - Rogss)**2 */
+  temp = (Vog - Vss - D[NLCI_Rogss]);  
+  gcorr += temp * temp * D[NLCI_VogVssRogss2];
+
+  /* (Vog - Vss - Rogss)**3 */
+  temp = (Vog - Vss - D[NLCI_Rogss]);
+  gcorr += temp * temp * temp * D[NLCI_VogVssRogss3];
+
+  /* (Vod - Vss - Rodss) * (Vrd - Vss - Rrdss) */
+  temp = (Vod - Vss - D[NLCI_Rodss]) * (Vrd - Vss - D[NLCI_Rrdss]);
+  gcorr += temp * D[NLCI_VodxVrd];
+
+  /* (Vod - Vss - Rodss)**2 * (Vrd - Vss - Rrdss) */
+  temp = (Vod - Vss - D[NLCI_Rodss]);
+  temp = temp * temp * (Vrd - Vss - D[NLCI_Rrdss]);
+  gcorr += temp * D[NLCI_Vod2xVrd];
+
+  /* (Vod - Vss - Rodss) * (Vrd - Vss - Rrdss)**2 */
+  temp = (Vod - Vss - D[NLCI_Rodss]);
+  temp = temp * (Vrd - Vss - D[NLCI_Rrdss]) * (Vrd - Vss - D[NLCI_Rrdss]);
+  gcorr += temp * D[NLCI_VodxVrd2];
+
+  /* (Vod - Vss - Rodss)**2 * (Vrd - Vss - Rrdss)**2 */
+  temp = (Vod - Vss - D[NLCI_Rodss]);
+  temp = temp * temp * (Vrd - Vss - D[NLCI_Rrdss]) * (Vrd - Vss - D[NLCI_Rrdss]);
+  gcorr += temp * D[NLCI_Vod2xVrd2];
+
+  /* (Vrd - Vss - Rrdss) * (Vog - Vss - Rogss) */
+  temp = (Vrd - Vss - D[NLCI_Rrdss]) * (Vog - Vss - D[NLCI_Rogss]);
+  gcorr += temp * D[NLCI_VrdxVog];
+
+  /* (Vrd - Vss - Rrdss)**2 * (Vog - Vss - Rogss) */
+  temp = (Vrd - Vss - D[NLCI_Rrdss]);
+  temp = temp * temp * (Vog - Vss - D[NLCI_Rogss]);
+  gcorr += temp * D[NLCI_Vrd2xVog];
+
+  /* (Vrd - Vss - Rrdss) * (Vog - Vss - Rogss)**2 */
+  temp = (Vrd - Vss - D[NLCI_Rrdss]);
+  temp = temp * (Vog - Vss - D[NLCI_Rogss]) * (Vog - Vss - D[NLCI_Rogss]);
+  gcorr += temp * D[NLCI_VrdxVog2];
+
+  /* (Vrd - Vss - Rrdss)**2 * (Vog - Vss - Rogss)**2 */
+  temp = (Vrd - Vss - D[NLCI_Rrdss]);
+  temp = temp * temp * (Vog - Vss - D[NLCI_Rogss]) * (Vog - Vss - D[NLCI_Rogss]);
+  gcorr += temp * D[NLCI_Vrd2xVog2];
+
+  /* (Vod - Vss - Rodss) * (Vog - Vss - Rogss) */
+  temp = (Vod - Vss - D[NLCI_Rodss]) * (Vog - Vss - D[NLCI_Rogss]);
+  gcorr += temp * D[NLCI_VodxVog];
+
+  /* (Vod - Vss - Rodss)**2 * (Vog - Vss - Rogss) */
+  temp = (Vod - Vss - D[NLCI_Rodss]);
+  temp = temp * temp * (Vog - Vss - D[NLCI_Rogss]);
+  gcorr += temp * D[NLCI_Vod2xVog];
+
+  /* (Vod - Vss - Rodss) * (Vog - Vss - Rogss)**2 */
+  temp = (Vod - Vss - D[NLCI_Rodss]);
+  temp = temp * (Vog - Vss - D[NLCI_Rogss]) * (Vog - Vss - D[NLCI_Rogss]);
+  gcorr += temp * D[NLCI_VodxVog2];
+
+  /* (Vod - Vss - Rodss)**2 * (Vog - Vss - Rogss)**2 */
+  temp = (Vod - Vss - D[NLCI_Rodss]);
+  temp = temp * temp * (Vog - Vss - D[NLCI_Rogss]) * (Vog - Vss - D[NLCI_Rogss]);
+  gcorr += temp * D[NLCI_Vod2xVog2];
+
+  /* Tccd + 40 */
+  temp = Tccd + 40.0;
+  gcorr += temp * D[NLCI_Tccdmod];
+
+  gain = D[NLCI_Gain0] * gcorr;
+  
+  return (float) gain;
+}
+
+/**
+ * @brief    Nonlinearity correction for the CHEOPS CCD readout values.
+ *           It uses a set of splines as correction function.
+ * @param[in,out]  data   the array of pixel values stored as unsigned ints; 
+ *                        this will be overwritten by the corrected values
+ * @param          bias   the actual bias value derived from the image data (LOS part)      
+ * @param          bias0  the fixed "back-conversion" bias value      
+ * @param          gain   actual gain derived from the voltages      
+ * @param          gain0  fixed gain used for back-conversion      
+ * @param          n      the number of pixel values to be corrected      
+ * @param          rf     the readout frequency, 100 or 230 kHz (default)      
+ * @note     overwrites input array
+ * @note     bias0 should be set higher than the smallest value to be corrected: bias0 > min(data)
+ */
+
+void NlcSplineCorr16 (unsigned int *data, double bias, double bias0, double gain, double gain0, unsigned int n, unsigned char rf)
+{
+  unsigned int i, rightBorderIndex;
+  double gaininv;
+  double g0_div_g, g0_div_gg;
+  double x;
+  unsigned int utemp32;
+  float ftemp;
+
+  if ((gain == 0.0) || (gain0 == 0.0))
+    {
+      return;
+    }
+  
+  gaininv = (double)1.0 / gain;
+  
+  g0_div_g = gain0 * gaininv;
+  g0_div_gg = g0_div_g * gaininv;
+
+  if (rf != RF100KHZ) /* 230 kHz is default */
+    {
+      for (i=0; i < NLC2_SEGMENTS; i++)
+	{
+	  CrIaCopyArrayItem (NLCBORDERS_ID, &utemp32, i);
+	  rborder[i] = utemp32;
+	  
+	  CrIaCopyArrayItem (NLCCOEFF_A_ID, &ftemp, i);
+	  A[i] = (double) ftemp;
+	  
+	  CrIaCopyArrayItem (NLCCOEFF_B_ID, &ftemp, i);
+	  B[i] = (double) ftemp;
+	  
+	  CrIaCopyArrayItem (NLCCOEFF_C_ID, &ftemp, i);
+	  C[i] = (double) ftemp;      
+	}
+    }
+  else /* use the parameter setup for 100 kHz */
+    {
+      for (i=0; i < NLC2_SEGMENTS; i++)
+	{
+	  CrIaCopyArrayItem (NLCBORDERS_2_ID, &utemp32, i);
+	  rborder[i] = utemp32;
+	  
+	  CrIaCopyArrayItem (NLCCOEFF_A_2_ID, &ftemp, i);
+	  A[i] = (double) ftemp;
+	  
+	  CrIaCopyArrayItem (NLCCOEFF_B_2_ID, &ftemp, i);
+	  B[i] = (double) ftemp;
+	  
+	  CrIaCopyArrayItem (NLCCOEFF_C_2_ID, &ftemp, i);
+	  C[i] = (double) ftemp;      
+	}      
+    }
+  
+  /* CHEOPS-UBE-INST-TN-TBC Equation 4 */      
+  for (i=0; i < NLC2_SEGMENTS; i++)
+    {
+      if (i == 0)
+	{
+	  /* do nothing */
+	}
+      else
+        {      
+	  C[i] = C[i] - B[i] * rborder[i-1] + A[i] * rborder[i-1]*rborder[i-1];
+	  
+	  B[i] = B[i] - 2. * A[i] * rborder[i-1];
+	  
+	  A[i] = A[i];
+	}
+    }	  
+  
+  /* CHEOPS-UBE-INST-TN-TBC Equation 5 */
+  for (i=0; i < NLC2_SEGMENTS; i++)
+    {
+      rborder[i] = roundf((float)((double)rborder[i] * gain + bias));
+    } 
+  
+  /* CHEOPS-UBE-INST-TN-TBC Equation 10 */
+  for (i=0; i < NLC2_SEGMENTS; i++)
+    {
+      C[i] = C[i] * gain0 + (double) bias0 - B[i] * bias * g0_div_g + A[i] * bias * bias * g0_div_gg;
+      
+      B[i] = B[i] * g0_div_g - 2. * A[i] * bias * g0_div_gg;
+      
+      A[i] = A[i] * g0_div_gg;
+    }      
+  
+  /* apply NLC to each pixel */  
+  for (i=0; i < n; i++)
+    {
+      /* get the index of the right border of the interval the current value belongs to */
+      rightBorderIndex = GetInterval16 (data[i], rborder);
+      
+      x = (double)data[i];      
+
+      x = A[rightBorderIndex]*x*x + B[rightBorderIndex]*x + C[rightBorderIndex];
+      
+      data[i] = (unsigned int)roundf((float)x);
+    }
+
+  return;
+}
+
+
+unsigned int SumU32 (unsigned int *data, unsigned int len)
+{
+  unsigned int i;
+  unsigned int sum = 0;
+
+  for (i=0; i < len; i++)
+    sum += data[i];
+  
+  return sum;
+}
+
+
+void QuickPhotometry (struct ScienceBuf *frame, unsigned int *workbuffer, struct SibPhotometry *phot)
+{
+  int centNPix, ann1NPix, ann2NPix;
+
+  unsigned short Strategy;
+  unsigned char Rcent, Rann1, Rann2;
+  unsigned int TlocX, TlocY, xoff, yoff; 
+
+  unsigned int Cent, Ann1, Ann2;
+
+  /* get relevant data pool variables */
+  CrIaCopy(SDPPHOTSTRAT_ID, &Strategy);
+  CrIaCopy(SDPPHOTRCENT_ID, &Rcent);
+  CrIaCopy(SDPPHOTRANN1_ID, &Rann1);
+  CrIaCopy(SDPPHOTRANN2_ID, &Rann2);
+
+  /* get target location from data pool */
+  CrIaCopy(TARGETLOCATIONX_ID, &TlocX);
+  CrIaCopy(TARGETLOCATIONY_ID, &TlocY);
+
+  xoff = TlocX - 51200; /* centre in target location system is at 51200 */
+  yoff = TlocY - 51200;
+  
+  phot->centrum  = 0.0f;
+  phot->annulus1 = 0.0f;
+  phot->annulus2 = 0.0f;
+  
+  /* extract the circular area of interest for the center */
+  centNPix = RingExtract32 ((unsigned int *)(frame->data), frame->xelements, frame->yelements, xoff, yoff, 0.0f, (float) Rcent, workbuffer);
+
+  if (Strategy == STAT_MEAN)
+    {
+      Cent = SumU32 (workbuffer, centNPix);
+    }
+  else if (Strategy == STAT_MEDIAN)
+    {
+      Cent = (unsigned int) Median ((int *)workbuffer, centNPix); /* NOTE: uint -> int conversion is ok because our pixel values are 16 bit anyway */
+    }
+  else
+    {
+      Cent = 0U;
+    }
+  
+  /* extract the ring for the annulus 1 */
+  ann1NPix = RingExtract32 ((unsigned int *)(frame->data), frame->xelements, frame->yelements, xoff, yoff, (float) Rcent, (float) Rann1, workbuffer);
+
+  if (Strategy == STAT_MEAN)
+    {
+      Ann1 = SumU32 (workbuffer, ann1NPix);
+    }
+  else if (Strategy == STAT_MEDIAN)
+    {
+      Ann1 = (unsigned int) Median ((int *)workbuffer, ann1NPix);
+    }
+  else
+    {
+      Ann1 = 0U;
+    }
+
+  /* extract the ring for the annulus 2 */
+  ann2NPix = RingExtract32 ((unsigned int *)(frame->data), frame->xelements, frame->yelements, xoff, yoff, (float) Rann1, (float) Rann2, workbuffer);
+
+  if (Strategy == STAT_MEAN)
+    {
+      Ann2 = SumU32 (workbuffer, ann2NPix);
+    }
+  else if (Strategy == STAT_MEDIAN)
+    {
+      Ann2 = (unsigned int) Median ((int *)workbuffer, ann2NPix);
+    }
+  else
+    {
+      Ann2 = 0U;
+    }
+
+  if (Strategy == STAT_MEAN)
+    {
+      if (centNPix > 0)
+	phot->centrum  = (float) Cent / (float) centNPix;
+      if (ann1NPix > 0)
+	phot->annulus1 = (float) Ann1 / (float) ann1NPix;
+      if (ann2NPix > 0)
+	phot->annulus2 = (float) Ann2 / (float) ann2NPix;
+    }
+  else
+    {
+      phot->centrum  = (float) Cent;
+      phot->annulus1 = (float) Ann1;
+      phot->annulus2 = (float) Ann2;
+    }
+  
+  return;
+}
diff --git a/CompressionEntity/src/SdpNlcPhot.h b/CompressionEntity/src/SdpNlcPhot.h
new file mode 100644
index 0000000..2351012
--- /dev/null
+++ b/CompressionEntity/src/SdpNlcPhot.h
@@ -0,0 +1,53 @@
+#ifndef SDPNLCPHOT_H
+#define SDPNLCPHOT_H
+
+#include "SdpBuffers.h" /* for struct ScienceBuf and struct SibPhotometry */
+
+
+/* NLC2 indices for easier access of the coefficients stored in the NLCCOEFF_D array */
+#define NLCI_Bias0         0 
+#define NLCI_Gain0         1 
+#define NLCI_Rss           2
+#define NLCI_Rodss         3
+#define NLCI_Rrdss         4
+#define NLCI_Rogss         5
+#define NLCI_VssRss        6 
+#define NLCI_VodVssRodss   7
+#define NLCI_VodVssRodss2  8
+#define NLCI_VrdVssRrdss   9
+#define NLCI_VrdVssRrdss2 10
+#define NLCI_VogVssRogss  11
+#define NLCI_VogVssRogss2 12
+#define NLCI_VogVssRogss3 13
+#define NLCI_VodxVrd      14
+#define NLCI_Vod2xVrd     15
+#define NLCI_VodxVrd2     16
+#define NLCI_Vod2xVrd2    17
+#define NLCI_VrdxVog      18
+#define NLCI_Vrd2xVog     19
+#define NLCI_VrdxVog2     20
+#define NLCI_Vrd2xVog2    21
+#define NLCI_VodxVog      22
+#define NLCI_Vod2xVog     23
+#define NLCI_VodxVog2     24
+#define NLCI_Vod2xVog2    25
+#define NLCI_Tccdmod      26
+#define NLCI_Spare        27
+
+
+int GetInterval28 (unsigned int value, unsigned int *rborder);
+
+int GetInterval16 (unsigned int value, unsigned int *rb);
+
+void NlcSplineCorr28 (unsigned int *data, unsigned int n);
+
+float NlcCalcGain (float Vss, float Vrd, float Vod, float Vog, float Tccd);
+
+void NlcSplineCorr16 (unsigned int *data, double bias, double bias0, double gain, double gain0, unsigned int n, unsigned char rf);
+
+unsigned int SumU32 (unsigned int *data, unsigned int len);
+
+void QuickPhotometry (struct ScienceBuf *frame, unsigned int *workbuffer, struct SibPhotometry *phot);
+
+
+#endif
diff --git a/CrFramework/CHANGELOG b/CrFramework/CHANGELOG
new file mode 100644
index 0000000..5ed8b02
--- /dev/null
+++ b/CrFramework/CHANGELOG
@@ -0,0 +1,5 @@
+*****************************
+* Changelog for CrFramework *
+*****************************
+
+* directory and files put here by RO on 8-MAR-2015
diff --git a/CrFramework/README b/CrFramework/README
new file mode 100644
index 0000000..352dd7b
--- /dev/null
+++ b/CrFramework/README
@@ -0,0 +1,9 @@
+- This package contains the source code and documentation of the C2 Implementation of the CORDET Framework
+- The source code is released under GNU LGPLv3
+- The FwProfile is a product of P&P Software GmbH, @copyright P&P Software GmbH 
+- More information can be found on: http://pnp-software.com/cordetfw
+- Please don't hesitate to contact us if you would like to know more about FW Profile: pnp-software@pnp-software.com 
+
+The CORDET Framework and its C2 implementation are distributed in the hope that they will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
diff --git a/CrFramework/src/AppStartUp/CrFwAppResetProc.h b/CrFramework/src/AppStartUp/CrFwAppResetProc.h
new file mode 100644
index 0000000..2f3f345
--- /dev/null
+++ b/CrFramework/src/AppStartUp/CrFwAppResetProc.h
@@ -0,0 +1,52 @@
+/**
+ * @file
+ * @ingroup crOpenIfGroup
+ * Interface to the Application Reset Procedure.
+ * The Application Reset Procedure is started by the Application
+ * State Machine (see <code>CrFwAppSm.h</code>).
+ * It executes while the state machine is in state RESET.
+ * This procedure is responsible for resetting all
+ * the application components and for performing any other reset action
+ * for the application.
+ * The Application Reset Procedure is entirely application-specific.
+ * This header file declares a function to retrieve a pointer to the procedure
+ * descriptor.
+ * The implementation of this file provides an implementation of the procedure
+ * and is therefore application-specific.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_APP_RESET_PROC_H_
+#define CRFW_APP_RESET_PROC_H_
+
+#include "FwSmConstants.h"
+#include "FwPrConstants.h"
+#include "CrFwConstants.h"
+
+/**
+ * Retrieve the singleton instance of the Application Reset Procedure.
+ * @return the singleton instance of the Application Reset Procedure.
+ */
+FwPrDesc_t CrFwAppSmGetAppResetProc();
+
+#endif /* CRFW_APP_RESET_PROC_H_ */
diff --git a/CrFramework/src/AppStartUp/CrFwAppShutdownProc.h b/CrFramework/src/AppStartUp/CrFwAppShutdownProc.h
new file mode 100644
index 0000000..d30af6c
--- /dev/null
+++ b/CrFramework/src/AppStartUp/CrFwAppShutdownProc.h
@@ -0,0 +1,52 @@
+/**
+ * @file
+ * @ingroup crOpenIfGroup
+ * Interface to the Application Shutdown Procedure.
+ * The Application Shutdown Procedure is started by the Application
+ * State Machine (see <code>CrFwAppSm.h</code>).
+ * It executes while the state machine is in state SHUTDOWN.
+ * This procedure is responsible for shutting down all
+ * the application components and for performing any other shutdown action
+ * for the application.
+ * The Application Shutdown Procedure is entirely application-specific.
+ * This header file declares a function to retrieve a pointer to the procedure
+ * descriptor.
+ * The implementation of this file provides an implementation of the procedure
+ * and is therefore application-specific.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_APP_SHUTDOWN_PROC_H_
+#define CRFW_APP_SHUTDOWN_PROC_H_
+
+#include "FwSmConstants.h"
+#include "FwPrConstants.h"
+#include "CrFwConstants.h"
+
+/**
+ * Retrieve the singleton instance of the Application Shutdown Procedure.
+ * @return the singleton instance of the Application Shutdown Procedure.
+ */
+FwPrDesc_t CrFwAppSmGetAppShutdownProc();
+
+#endif /* CRFW_APP_SHUTDOWN_PROC_H_ */
diff --git a/CrFramework/src/AppStartUp/CrFwAppSm.c b/CrFramework/src/AppStartUp/CrFwAppSm.c
new file mode 100644
index 0000000..bfb289b
--- /dev/null
+++ b/CrFramework/src/AppStartUp/CrFwAppSm.c
@@ -0,0 +1,249 @@
+/**
+ * @file
+ *
+ * Implementation of Application State Machine.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include <stdlib.h>
+/* Include framework files */
+#include "CrFwConstants.h"
+#include "UtilityFunctions/CrFwUtilityFunctions.h"
+#include "CrFwAppSm.h"
+#include "CrFwAppStartUpProc.h"
+#include "CrFwAppResetProc.h"
+#include "CrFwAppShutdownProc.h"
+/* Include FW Profile files */
+#include "FwSmConstants.h"
+#include "FwSmDCreate.h"
+#include "FwSmConfig.h"
+#include "FwSmCore.h"
+#include "FwPrConstants.h"
+#include "FwPrDCreate.h"
+#include "FwPrConfig.h"
+#include "FwPrCore.h"
+/* Include FW Profile files */
+#include "CrFwAppSmUserPar.h"
+
+/** State identifier for state START_UP in the application State Machine. */
+#define CR_FW_APP_STATE_START_UP 1
+
+/** State identifier for state NORMAL in the application State Machine. */
+#define CR_FW_APP_STATE_NORMAL 2
+
+/** State identifier for state RESET in the application State Machine. */
+#define CR_FW_APP_STATE_RESET 3
+
+/** State identifier for state SHUTDOWN in the application State Machine. */
+#define CR_FW_APP_STATE_SHUTDOWN 4
+
+/** Identifier for transition command "Reset" in the Application State Machine. */
+#define CR_FW_APP_TR_RESET CR_FW_APP_TYPE*CR_FW_MAX_NOF_TRANS_CMDS+0
+
+/** Identifier for transition command "Shutdown" in the Application State Machine. */
+#define CR_FW_APP_TR_SHUTDOWN CR_FW_APP_TYPE*CR_FW_MAX_NOF_TRANS_CMDS+1
+
+/** The singleton instance of the Application State Machine. */
+static FwSmDesc_t appSmDesc = NULL;
+
+/**
+ * Function which starts the Application Start-Up Procedure.
+ * This function is used as entry action for the START_UP state.
+ * @param smDesc the state machine descriptor
+ */
+static void StartAppStartUpPr(FwSmDesc_t smDesc);
+
+/**
+ * Function which starts the Application Reset Procedure.
+ * This function is used as entry action for the RESET state.
+ * @param smDesc the state machine descriptor
+ */
+static void StartAppResetPr(FwSmDesc_t smDesc);
+
+/**
+ * Function which starts the Application Shutdown Procedure.
+ * This function is used as entry action for the SHUTDOWN state.
+ * @param smDesc the state machine descriptor
+ */
+static void StartAppShutdownPr(FwSmDesc_t smDesc);
+
+/**
+ * Function which checks whether the Application Start-Up Procedure has terminated.
+ * This function acts as guard on the transition out of START_UP.
+ * @param smDesc the state machine descriptor
+ * @return 1 if the Application Start-Up Procedure has terminated, 0 otherwise
+ */
+static FwSmBool_t IsStartUpPrTerminated(FwSmDesc_t smDesc);
+
+/**
+ * Function which checks whether the Application Reset Procedure has terminated.
+ * This function acts as guard on the transition out of RESET.
+ * @param smDesc the state machine descriptor
+ * @return 1 if the Application Reset Procedure has terminated, 0 otherwise
+ */
+static FwSmBool_t IsResetPrTerminated(FwSmDesc_t smDesc);
+
+/**
+ * Function which checks whether the Application Shutdown Procedure has terminated.
+ * This function acts as guard on the transition out of SHUTDOWN.
+ * @param smDesc the state machine descriptor
+ * @return 1 if the Application Shutdown Procedure has terminated, 0 otherwise
+ */
+static FwSmBool_t IsShutdownPrTerminated(FwSmDesc_t smDesc);
+
+/*-----------------------------------------------------------------------------------------*/
+FwSmDesc_t CrFwAppSmMake() {
+	FwSmCounterS1_t nOfStates = 4;	/* Number of states */
+	FwSmCounterS1_t nOfChoicePseudoStates = 0;	/* Number of choice pseudo-states */
+	FwSmCounterS1_t nOfTrans = 6;	/* Number of transitions */
+	FwSmCounterS1_t nOfActions = 3;	/* Number of actions */
+	FwSmCounterS1_t nOfGuards = 3;	/* Number of guards */
+
+	if (appSmDesc != NULL)
+		return appSmDesc;
+
+	/* Create the application state machine */
+	appSmDesc = FwSmCreate(nOfStates, nOfChoicePseudoStates, nOfTrans, nOfActions, nOfGuards);
+
+	/* Configure the application state machine */
+	FwSmAddState(appSmDesc, CR_FW_APP_STATE_START_UP, 1, &StartAppStartUpPr, NULL, NULL, CR_FW_APPSM_STARTUP_ESM);
+	FwSmAddState(appSmDesc, CR_FW_APP_STATE_NORMAL, 2, NULL, NULL, NULL, CR_FW_APPSM_NORMAL_ESM);
+	FwSmAddState(appSmDesc, CR_FW_APP_STATE_RESET, 1, &StartAppResetPr, NULL, NULL, CR_FW_APPSM_RESET_ESM);
+	FwSmAddState(appSmDesc, CR_FW_APP_STATE_SHUTDOWN, 1, &StartAppShutdownPr, NULL, NULL, CR_FW_APPSM_SHUTDOWN_ESM);
+	FwSmAddTransIpsToSta(appSmDesc, CR_FW_APP_STATE_START_UP, NULL);
+	FwSmAddTransStaToSta(appSmDesc, FW_TR_EXECUTE, CR_FW_APP_STATE_START_UP, CR_FW_APP_STATE_NORMAL,
+	                     NULL, &IsStartUpPrTerminated);
+	FwSmAddTransStaToSta(appSmDesc, CR_FW_APP_TR_RESET, CR_FW_APP_STATE_NORMAL, CR_FW_APP_STATE_RESET,
+	                     NULL, NULL);
+	FwSmAddTransStaToSta(appSmDesc, FW_TR_EXECUTE, CR_FW_APP_STATE_RESET, CR_FW_APP_STATE_NORMAL,
+	                     NULL, &IsResetPrTerminated);
+	FwSmAddTransStaToSta(appSmDesc, CR_FW_APP_TR_SHUTDOWN, CR_FW_APP_STATE_NORMAL, CR_FW_APP_STATE_SHUTDOWN,
+	                     NULL, NULL);
+	FwSmAddTransStaToFps(appSmDesc, FW_TR_EXECUTE, CR_FW_APP_STATE_SHUTDOWN, NULL, &IsShutdownPrTerminated);
+
+	return appSmDesc;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwAppSmStart() {
+	FwSmStart(appSmDesc);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwAppSmExecute() {
+	FwSmExecute(appSmDesc);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwAppSmReset() {
+	FwSmMakeTrans(appSmDesc, CR_FW_APP_TR_RESET);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwAppSmShutdown() {
+	FwSmMakeTrans(appSmDesc, CR_FW_APP_TR_SHUTDOWN);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwBool_t CrFwAppSmIsStarted() {
+	return FwSmIsStarted(appSmDesc);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwBool_t CrFwAppSmIsInStartUp() {
+	return (FwSmGetCurState(appSmDesc) == CR_FW_APP_STATE_START_UP);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwBool_t CrFwAppSmIsInNormal() {
+	return (FwSmGetCurState(appSmDesc) == CR_FW_APP_STATE_NORMAL);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwBool_t CrFwAppSmIsInReset() {
+	return (FwSmGetCurState(appSmDesc) == CR_FW_APP_STATE_RESET);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwBool_t CrFwAppSmIsInShutdown() {
+	return (FwSmGetCurState(appSmDesc) == CR_FW_APP_STATE_SHUTDOWN);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void StartAppStartUpPr(FwSmDesc_t smDesc) {
+	(void)(smDesc);
+	FwPrStart(CrFwAppSmGetAppStartUpProc());
+	return;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void StartAppResetPr(FwSmDesc_t smDesc) {
+	(void)(smDesc);
+	FwPrStart(CrFwAppSmGetAppResetProc());
+	return;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void StartAppShutdownPr(FwSmDesc_t smDesc) {
+	(void)(smDesc);
+	FwPrStart(CrFwAppSmGetAppShutdownProc());
+	return;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static FwSmBool_t IsStartUpPrTerminated(FwSmDesc_t smDesc) {
+	(void)(smDesc);
+	return (FwPrIsStarted(CrFwAppSmGetAppStartUpProc()) == 0);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static FwSmBool_t IsResetPrTerminated(FwSmDesc_t smDesc) {
+	(void)(smDesc);
+	return (FwPrIsStarted(CrFwAppSmGetAppResetProc()) == 0);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static FwSmBool_t IsShutdownPrTerminated(FwSmDesc_t smDesc) {
+	(void)(smDesc);
+	return (FwPrIsStarted(CrFwAppSmGetAppShutdownProc()) == 0);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+FwSmDesc_t CrFwAppSmGetEsmStartUp() {
+	return FwSmGetEmbSm(appSmDesc, CR_FW_APP_STATE_START_UP);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+FwSmDesc_t CrFwAppSmGetEsmNormal() {
+	return FwSmGetEmbSm(appSmDesc, CR_FW_APP_STATE_NORMAL);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+FwSmDesc_t CrFwAppSmGetEsmReset() {
+	return FwSmGetEmbSm(appSmDesc, CR_FW_APP_STATE_RESET);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+FwSmDesc_t CrFwAppSmGetEsmShutdown()  {
+	return FwSmGetEmbSm(appSmDesc, CR_FW_APP_STATE_SHUTDOWN);
+}
diff --git a/CrFramework/src/AppStartUp/CrFwAppSm.h b/CrFramework/src/AppStartUp/CrFwAppSm.h
new file mode 100644
index 0000000..d6c399e
--- /dev/null
+++ b/CrFramework/src/AppStartUp/CrFwAppSm.h
@@ -0,0 +1,182 @@
+/**
+ * @file
+ * @ingroup appSmgroup
+ * Definition of Application State Machine.
+ * The Application State Machine implements the application start-up behaviour
+ * (see figures below).
+ *
+ * The Application State Machine is a singleton.
+ * Initially, after it has been started through function <code>FwSmStart</code>,
+ * it is in state START-UP.
+ * At entry into this state, the Application Start-Up Procedure is executed.
+ * This procedure is an adaptation point for the application (it is defined in
+ * <code>CrFwAppShutdownProc.c</code>).
+ *
+ * Normal operation takes place in state NORMAL.
+ * In particular, the services provided by an application to its users are only
+ * guaranteed to be available when the application is in state NORMAL and it is
+ * only from this state that the application makes use of the services provided by
+ * other applications.
+ * Thus, in state NORMAL, an application may assume that its service interfaces
+ * are all operational.
+ *
+ * When state NORMAL is entered or exited, a notification is sent to the users
+ * of the application services.
+ * The content of this notification is an adaptation point.
+ *
+ * An application can be reset by sending command Reset to its Application State
+ * Machine (this is done through function <code>::CrFwAppSmReset</code>).
+ * This causes a transition to state RESET where the Application Reset Procedure
+ * is executed.
+ * This procedure is an adaptation point for the application (it is defined in
+ * <code>CrFwAppResetProc.c</code>).
+ *
+ * Finally, the orderly shutdown of an application is performed by sending command
+ * Shutdown to the Application State Machine (this is done through function
+ * <code>::CrFwAppSmShutdown</code>).
+ * This triggers a transition to state SHUTDOWN where the Application Shutdown Procedure
+ * is executed.
+ * This procedure is an adaptation point for the application (it is defined in
+ * <code>CrFwAppShutdownProc.c</code>).
+ *
+ * Applications may define embedded state machines in the states
+ * of the Application State Machine.
+ * The embedded state machines are adaptation points for the framework.
+ * They are defined in <code>CrFwAppSmUserPar.h</code>.
+ *
+ * @image html ApplicationSM.png
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_APP_SM_H_
+#define CRFW_APP_SM_H_
+
+/* Include FW Profile Files */
+#include "FwSmConstants.h"
+#include "FwPrConstants.h"
+/* Include Framework Files */
+#include "CrFwConstants.h"
+/* Include Configuration Files */
+#include "CrFwUserConstants.h"
+
+/**
+ * Retrieve the singleton instance of the Application State Machine.
+ * The Application State Machine is a singleton.
+ * The first time this function is called, it creates the Application State
+ * Machine.
+ * Subsequently, it always returns the same instance.
+ *
+ * The first time this function is called, it returns the Application State Machine
+ * before it has been started.
+ * @return the descriptor of the Application State Machine or NULL
+ * if the state machine could not be created.
+ */
+FwSmDesc_t CrFwAppSmMake();
+
+/**
+ * Start the Application State Machine.
+ * This function causes the Application State Machine to make the transition from
+ * its initial pseudo-state into its initial state START_UP.
+ */
+void CrFwAppSmStart();
+
+/**
+ * Execute the Application State Machine.
+ * This function sends command <code>Execute</code> to the Application State Machine.
+ */
+void CrFwAppSmExecute();
+
+/**
+ * Reset the Application State Machine.
+ * This function sends command <code>Reset</code> to the Application State Machine.
+ */
+void CrFwAppSmReset();
+
+/**
+ * Shutdown the Application State Machine.
+ * This function sends command <code>Shutdown</code> to the Application State Machine.
+ */
+void CrFwAppSmShutdown();
+
+/**
+ * Return true if the Application State Machine has been started.
+ * @return 1 if the Application State Machine has been started; 0 otherwise
+ */
+CrFwBool_t CrFwAppSmIsStarted();
+
+/**
+ * Return true if the Application State Machine is in state START_UP.
+ * @return 1 if the Application State Machine is in state START_UP; 0 otherwise
+ */
+CrFwBool_t CrFwAppSmIsInStartUp();
+
+/**
+ * Return true if the Application State Machine is in state NORMAL.
+ * @return 1 if the Application State Machine is in state NORMAL; 0 otherwise
+ */
+CrFwBool_t CrFwAppSmIsInNormal();
+
+/**
+ * Return true if the Application State Machine is in state RESET.
+ * @return 1 if the Application State Machine is in state RESET; 0 otherwise
+ */
+CrFwBool_t CrFwAppSmIsInReset();
+
+/**
+ * Return true if the Application State Machine is in state SHUTDOWN.
+ * @return 1 if the Application State Machine is in state SHUTDOWN; 0 otherwise
+ */
+CrFwBool_t CrFwAppSmIsInShutdown();
+
+/**
+ * Return the state machine embedded in state START-UP (or NULL if no state machine
+ * is embedded in START-UP).
+ * @return the state machine embedded in state START-UP (or NULL if no state machine
+ * is embedded in START-UP)
+ */
+FwSmDesc_t CrFwAppSmGetEsmStartUp();
+
+/**
+ * Return the state machine embedded in state NORMAL (or NULL if no state machine
+ * is embedded in NORMAL).
+ * @return the state machine embedded in state NORMAL (or NULL if no state machine
+ * is embedded in NORMAL)
+ */
+FwSmDesc_t CrFwAppSmGetEsmNormal();
+
+/**
+ * Return the state machine embedded in state RESET (or NULL if no state machine
+ * is embedded in RESET).
+ * @return the state machine embedded in state RESET (or NULL if no state machine
+ * is embedded in RESET)
+ */
+FwSmDesc_t CrFwAppSmGetEsmReset();
+
+/**
+ * Return the state machine embedded in state SHUTDOWN (or NULL if no state machine
+ * is embedded in SHUTDOWN).
+ * @return the state machine embedded in state SHUTDOWN (or NULL if no state machine
+ * is embedded in SHUTDOWN)
+ */
+FwSmDesc_t CrFwAppSmGetEsmShutdown();
+
+#endif /* CRFW_APP_SM_H_ */
diff --git a/CrFramework/src/AppStartUp/CrFwAppStartUpProc.h b/CrFramework/src/AppStartUp/CrFwAppStartUpProc.h
new file mode 100644
index 0000000..11e30e2
--- /dev/null
+++ b/CrFramework/src/AppStartUp/CrFwAppStartUpProc.h
@@ -0,0 +1,52 @@
+/**
+ * @file
+ * @ingroup crOpenIfGroup
+ * Interface to the Application Start-Up Procedure.
+ * The Application Start-Up Procedure is started by the Application
+ * State Machine (see <code>CrFwAppSm.h</code>).
+ * It executes while the state machine is in state START_UP.
+ * This procedure is responsible for creating, initializing and configuring all
+ * the application components and for performing any other initialization action
+ * for the application.
+ * The Application Start-Up Procedure is entirely application-specific.
+ * This header file declares a function to retrieve a pointer to the procedure
+ * descriptor.
+ * The implementation of this file provides an implementation of the procedure
+ * and is therefore application-specific.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_APP_START_UP_PROC_H_
+#define CRFW_APP_START_UP_PROC_H_
+
+#include "FwSmConstants.h"
+#include "FwPrConstants.h"
+#include "CrFwConstants.h"
+
+/**
+ * Retrieve the singleton instance of the Application Start-Up Procedure.
+ * @return the singleton instance of the Application Start-Up Procedure.
+ */
+FwPrDesc_t CrFwAppSmGetAppStartUpProc();
+
+#endif /* CRFW_APP_START_UP_PROC_H_ */
diff --git a/CrFramework/src/Aux/CrFwAux.c b/CrFramework/src/Aux/CrFwAux.c
new file mode 100644
index 0000000..a597944
--- /dev/null
+++ b/CrFramework/src/Aux/CrFwAux.c
@@ -0,0 +1,273 @@
+/**
+ * @file
+ * @ingroup auxGroup
+ * Implementation of Auxiliary Module.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include <stdlib.h>
+/* Include framework files */
+#include "CrFwConstants.h"
+#include "UtilityFunctions/CrFwUtilityFunctions.h"
+#include "CrFwAux.h"
+#include "OutCmp/CrFwOutCmp.h"
+/* Include configuration files */
+#include "CrFwOutRegistryUserPar.h"
+#include "CrFwOutFactoryUserPar.h"
+#include "CrFwInFactoryUserPar.h"
+#include "CrFwInStreamUserPar.h"
+#include "CrFwOutStreamUserPar.h"
+#include "CrFwOutManagerUserPar.h"
+
+/** Array of OutComponent descriptors. */
+static CrFwOutCmpKindDesc_t outCmpKindDesc[CR_FW_OUTCMP_NKINDS] = CR_FW_OUTCMP_INIT_KIND_DESC;
+
+/** Array of InCommand descriptors. */
+static CrFwInCmdKindDesc_t inCmdKindDesc[CR_FW_INCMD_NKINDS] = CR_FW_INCMD_INIT_KIND_DESC;
+
+/** Array of InReport service descriptors. */
+static CrFwInRepKindDesc_t inRepKindDesc[CR_FW_INREP_NKINDS] = CR_FW_INREP_INIT_KIND_DESC;
+
+/** Array of service descriptors. */
+static CrFwServDesc_t servDesc[CR_FW_OUTREGISTRY_NSERV] = CR_FW_OUTREGISTRY_INIT_SERV_DESC;
+
+/** The sizes of the packet queues in the InStream components. */
+static CrFwCounterU1_t inStreamPcktQueueSize[CR_FW_NOF_INSTREAM] = CR_FW_INSTREAM_PQSIZE;
+
+/** The sizes of the packet queues in the OutStream components. */
+static CrFwCounterU1_t outStreamPcktQueueSize[CR_FW_NOF_OUTSTREAM] = CR_FW_OUTSTREAM_PQSIZE;
+
+/** The sizes of the POCL in the OutManager components. */
+static CrFwCounterU1_t outManagerPoclSize[CR_FW_NOF_OUTMANAGER] = CR_FW_OUTMANAGER_POCLSIZE;
+
+/* -------------------------------------------------------------------------- */
+CrFwConfigCheckOutcome_t CrFwAuxConfigCheck() {
+
+	if (CrFwAuxOutRegistryConfigCheck() == 0)
+		return crOutRegistryConfigParInconsistent;
+
+	if (CrFwAuxOutFactoryConfigCheck() == 0)
+		return crOutFactoryConfigParInconsistent;
+
+	if (CrFwAuxInFactoryInCmdConfigCheck() == 0)
+		return crInFactoryInCmdConfigParInconsistent;
+
+	if (CrFwAuxInFactoryInRepConfigCheck() == 0)
+		return crInFactoryInRepConfigParInconsistent;
+
+	return crConsistencyCheckSuccess;
+}
+
+/* -------------------------------------------------------------------------- */
+CrFwBool_t CrFwAuxOutRegistryConfigCheck() {
+	CrFwCmdRepIndex_t i;
+	CrFwCmdRepKindIndex_t j;
+	CrFwCounterU1_t k;
+	CrFwServType_t servType;
+	CrFwServSubType_t servSubType;
+	CrFwBool_t found;
+
+	if (CR_FW_OUTREGISTRY_N < 1)
+		return 0;
+
+	for (i=0; i<(CR_FW_OUTREGISTRY_NSERV-1); i++) {
+		if (servDesc[i].servType > servDesc[i+1].servType)
+			/* The following can be dead code, depending on the specific
+			 * instantiation of the FW Profile.*/
+			return 0;
+		if (servDesc[i].servType == servDesc[i+1].servType)
+			if (servDesc[i].servSubType > servDesc[i+1].servSubType)
+				/* The following can be dead code, depending on the specific
+				 * instantiation of the FW Profile.*/
+				return 0;
+	}
+
+	for (i=0; i<CR_FW_OUTREGISTRY_NSERV; i++) {
+		servType = servDesc[i].servType;
+		servSubType = servDesc[i].servSubType;
+		found = 0;
+		for (j=0; j<CR_FW_OUTCMP_NKINDS; j++) {
+			if (outCmpKindDesc[j].servType == servType)
+				if (outCmpKindDesc[j].servSubType == servSubType) {
+					found = 1;
+					break;
+				}
+			if (outCmpKindDesc[j].servType > servType)
+				break;
+		}
+		if (found == 0)
+			/* The following can be dead code, depending on the specific
+			 * instantiation of the FW Profile.*/
+			return 0;
+	}
+
+	for (k=0; k<CR_FW_NOF_INSTREAM; k++)
+		/* The following can be dead code, depending on the specific
+		 * instantiation of the FW Profile.*/
+		if (inStreamPcktQueueSize[k]<1)
+			return 0;
+
+	for (k=0; k<CR_FW_NOF_OUTSTREAM; k++)
+		/* The following can be dead code, depending on the specific
+		 * instantiation of the FW Profile.*/
+		if (outStreamPcktQueueSize[k]<1)
+			return 0;
+
+	for (k=0; k<CR_FW_NOF_OUTMANAGER; k++)
+		/* The following can be dead code, depending on the specific
+		 * instantiation of the FW Profile.*/
+		if (outManagerPoclSize[k]<1)
+			return 0;
+
+	return 1;
+}
+
+/* -------------------------------------------------------------------------- */
+CrFwBool_t CrFwAuxOutFactoryConfigCheck() {
+	CrFwCmdRepIndex_t j;
+	CrFwCmdRepKindIndex_t i;
+	CrFwServType_t servType;
+	CrFwServSubType_t servSubType;
+	CrFwDiscriminant_t disc;
+	CrFwBool_t found;
+
+	if (CR_FW_OUTFACTORY_MAX_NOF_OUTCMP < 1)
+		return 0;
+
+	if (CR_FW_OUTCMP_NKINDS < 1)
+		return 0;
+
+	for (i=0; i<(CR_FW_OUTCMP_NKINDS-1); i++) {
+		if (outCmpKindDesc[i].servType > outCmpKindDesc[i+1].servType)
+			return 0;
+
+		if (outCmpKindDesc[i].servType == outCmpKindDesc[i+1].servType)
+			if (outCmpKindDesc[i].servSubType > outCmpKindDesc[i+1].servSubType)
+				return 0;
+
+		if (outCmpKindDesc[i].servType == outCmpKindDesc[i+1].servType)
+			if (outCmpKindDesc[i].servSubType == outCmpKindDesc[i+1].servSubType)
+				if (outCmpKindDesc[i].discriminant > outCmpKindDesc[i+1].discriminant)
+					return 0;
+
+		if (outCmpKindDesc[i].pcktLength < 1)
+			return 0;
+	}
+
+	for (i=0; i<CR_FW_OUTCMP_NKINDS; i++) {
+		servType = outCmpKindDesc[i].servType;
+		servSubType = outCmpKindDesc[i].servSubType;
+		disc = outCmpKindDesc[i].discriminant;
+		found = 0;
+		for (j=0; j<CR_FW_OUTREGISTRY_NSERV; j++) {
+			if (servDesc[j].servType == servType)
+				if (servDesc[j].servSubType == servSubType)
+					if (servDesc[j].maxDiscriminant >= disc) {
+						found = 1;
+						break;
+					}
+			if (servDesc[j].servType > servType)
+				break;
+		}
+		if (found == 0)
+			return 0;
+	}
+
+	return 1;
+}
+
+/* -------------------------------------------------------------------------- */
+CrFwBool_t CrFwAuxInFactoryInCmdConfigCheck() {
+	CrFwCmdRepKindIndex_t i;
+
+	if (CR_FW_INFACTORY_MAX_NOF_INCMD < 1)
+		return 0;
+
+	if (CR_FW_OUTCMP_NKINDS < 1)
+		return 0;
+
+	for (i=0; i<(CR_FW_INCMD_NKINDS-1); i++) {
+		if (inCmdKindDesc[i].servType > inCmdKindDesc[i+1].servType)
+			return 0;
+
+		if (inCmdKindDesc[i].servType == inCmdKindDesc[i+1].servType)
+			if (inCmdKindDesc[i].servSubType > inCmdKindDesc[i+1].servSubType)
+				return 0;
+
+		if (inCmdKindDesc[i].servType == inCmdKindDesc[i+1].servType)
+			if (inCmdKindDesc[i].servSubType == inCmdKindDesc[i+1].servSubType)
+				if (inCmdKindDesc[i].discriminant > inCmdKindDesc[i+1].discriminant)
+					return 0;
+	}
+
+	for (i=0; i<CR_FW_INCMD_NKINDS; i++) {
+		if (inCmdKindDesc[i].servType > CR_FW_MAX_SERV_TYPE)
+			return 0;
+
+		if (inCmdKindDesc[i].servSubType > CR_FW_MAX_SERV_SUBTYPE)
+			return 0;
+
+		if (inCmdKindDesc[i].discriminant > CR_FW_MAX_DISCRIMINANT)
+			return 0;
+	}
+
+	return 1;
+}
+
+/* -------------------------------------------------------------------------- */
+CrFwBool_t CrFwAuxInFactoryInRepConfigCheck() {
+	CrFwCmdRepKindIndex_t i;
+
+	if (CR_FW_INFACTORY_MAX_NOF_INREP < 1)
+		return 0;
+
+	if (CR_FW_INREP_NKINDS < 1)
+		return 0;
+
+	for (i=0; i<(CR_FW_INREP_NKINDS-1); i++) {
+		if (inRepKindDesc[i].servType > inRepKindDesc[i+1].servType)
+			return 0;
+
+		if (inRepKindDesc[i].servType == inRepKindDesc[i+1].servType)
+			if (inRepKindDesc[i].servSubType > inRepKindDesc[i+1].servSubType)
+				return 0;
+
+		if (inRepKindDesc[i].servType == inRepKindDesc[i+1].servType)
+			if (inRepKindDesc[i].servSubType == inRepKindDesc[i+1].servSubType)
+				if (inRepKindDesc[i].discriminant > inRepKindDesc[i+1].discriminant)
+					return 0;
+	}
+
+	for (i=0; i<CR_FW_INREP_NKINDS; i++) {
+		if (inRepKindDesc[i].servType > CR_FW_MAX_SERV_TYPE)
+			return 0;
+
+		if (inRepKindDesc[i].servSubType > CR_FW_MAX_SERV_SUBTYPE)
+			return 0;
+
+		if (inRepKindDesc[i].discriminant > CR_FW_MAX_DISCRIMINANT)
+			return 0;
+	}
+
+	return 1;
+}
diff --git a/CrFramework/src/Aux/CrFwAux.h b/CrFramework/src/Aux/CrFwAux.h
new file mode 100644
index 0000000..5bd6f71
--- /dev/null
+++ b/CrFramework/src/Aux/CrFwAux.h
@@ -0,0 +1,164 @@
+/**
+ * @file
+ * @ingroup auxGroup
+ * Auxiliary module to check the static part of an application's configuration.
+ * The configuration of an application instantiated from the CORDET Framework is,
+ * for the most part, defined statically in files with names like:
+ * <code>CrFwXxxUserPar</code> where "Xxx" is the name of the framework component
+ * to which the configuration information applies.
+ * This module defines a set of functions which check the consistency of the
+ * configuration information in these configuration files.
+ * A function is defined for each configuration file and, additionally,
+ * function <code>::CrFwAuxConfigCheck</code> checks all the configuration files.
+ *
+ * <b>Mode of Use of the Aux Module</b>
+ *
+ * Applications would normally use the functions in this module during the
+ * application development phase to verify the correctness of the information
+ * in the configuration files.
+ * Once this correctness has been confirmed, the configuration checks can be
+ * omitted.
+ * It is therefore not expected that this module will be included in the final
+ * executable for an application.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_AUX_H_
+#define CRFW_AUX_H_
+
+#include "CrFwConstants.h"
+
+/** Type for the outcome of the consistency check on the configuration parameters */
+typedef enum {
+	/** All configuration consistency checks have been passed  */
+	crConsistencyCheckSuccess = 1,
+	/** OutRegistry configuration parameters are inconsistent (see <code>CrFwAuxOutRegistryConfigCheck.h</code>) */
+	crOutRegistryConfigParInconsistent = 2,
+	/** OutFactory configuration parameters are inconsistent (see <code>CrFwAuxOutFactoryConfigCheck.h</code>) */
+	crOutFactoryConfigParInconsistent = 3,
+	/** InFactory configuration parameters for InCommands are inconsistent (see <code>CrFwAuxInFactoryInCmdConfigCheck.h</code>) */
+	crInFactoryInCmdConfigParInconsistent = 4,
+	/** InFactory configuration parameters for InReports are inconsistent (see <code>CrFwAuxInFactoryInRepConfigCheck.h</code>) */
+	crInFactoryInRepConfigParInconsistent = 5
+} CrFwConfigCheckOutcome_t;
+
+/**
+ * Check the configuration of an application.
+ * This function calls all the configuration check functions and verifies that
+ * they all return true (to signify: "no configuration error detected").
+ * The function returns false as soon as it encounters a configuration check function
+ * which returns false.
+ * @return a value from <code>CrFwConfigCheckOutcome_t</code> indicating which configuration
+ * check has failed.
+ */
+CrFwConfigCheckOutcome_t CrFwAuxConfigCheck();
+
+/**
+ * Check the configuration of the OutRegistry component.
+ * The following checks are performed on the configuration data in
+ * <code>CrFwOutRegistryUserPar.h</code>:
+ * - CR_FW_OUTREGISTRY_N is greater than zero
+ * - The service types are listed in increasing order in the service descriptor
+ *   initializer (<code>CR_FW_OUTREGISTRY_INIT_SERV_DESC</code>)
+ * - The service sub-types within a type are listed in increasing order in the service
+ *   descriptor initializer (<code>CR_FW_OUTREGISTRY_INIT_SERV_DESC</code>)
+ * - The service types, sub-types and discriminant values defined in the
+ *   <code>#CR_FW_OUTREGISTRY_INIT_SERV_DESC</code> initializer are consistent with
+ *   service type, sub-types and discriminant values defined in the
+ *   <code>#CR_FW_OUTCMP_INIT_KIND_DESC</code>.
+ * - The size of the InStream packet queue is greater than zero.
+ * - The size of the OutStream packet queue is greater than zero.
+ * - The size of the Pending OutComponent List (POCL) is greater than zero.
+ * .
+ * @return true if no errors are detected in the configuration data;
+ * false otherwise.
+ */
+CrFwBool_t CrFwAuxOutRegistryConfigCheck();
+
+/**
+ * Check the configuration of the OutFactory component.
+ * The following checks are performed on the configuration data in
+ * <code>CrFwOutFactoryUserPar.h</code>:
+ * - CR_FW_OUTFACTORY_MAX_NOF_OUTCMP is greater than zero
+ * - CR_FW_OUTCMP_NKINDS is greater than zero
+ * - The service types are listed in increasing order in the service descriptor
+ *   initializer (<code>CR_FW_OUTCMP_INIT_KIND_DESC</code>)
+ * - The service sub-types within a type are listed in increasing order in the service
+ *   descriptor initializer (<code>CR_FW_OUTCMP_INIT_KIND_DESC</code>)
+ * - The discriminant values within a type/sub-type are listed in increasing order
+ *   in the service descriptor initializer (<code>CR_FW_OUTCMP_INIT_KIND_DESC</code>)
+ * - The service types, sub-types and discriminant values defined in the
+ *   <code>#CR_FW_OUTCMP_INIT_KIND_DESC</code> initializer are consistent with
+ *   service type, sub-types and discriminant values defined in the
+ *   <code>#CR_FW_OUTREGISTRY_INIT_SERV_DESC</code>.
+ * - The packet lengths specified in <code>#CR_FW_OUTCMP_INIT_KIND_DESC</code> are
+ *   greater than zero.
+ * .
+ * @return true if no errors are detected in the configuration data;
+ * false otherwise.
+ */
+CrFwBool_t CrFwAuxOutFactoryConfigCheck();
+
+/**
+ * Check the configuration of the InCommand part of the InFactory component.
+ * The following checks are performed on the configuration data in
+ * <code>CrFwInFactoryUserPar.h</code>:
+ * - CR_FW_INFACTORY_MAX_NOF_INCMD is greater than zero
+ * - CR_FW_INCMD_NKINDS is greater than zero
+ * - The service types are listed in increasing order in the service descriptor
+ *   initializer (<code>CR_FW_INCMD_INIT_KIND_DESC</code>)
+ * - The service sub-types within a type are listed in increasing order in the service
+ *   descriptor initializer (<code>CR_FW_INCMD_INIT_KIND_DESC</code>)
+ * - The discriminant values within a type/sub-type are listed in increasing order
+ *   in the service descriptor initializer (<code>CR_FW_INCMD_INIT_KIND_DESC</code>)
+ * - The values of the service types, sub-types and discriminant are lower than
+ * 	 <code>#CR_FW_MAX_SERV_TYPE</code>, <code>#CR_FW_MAX_SERV_SUBTYPE</code> and
+ * 	 <code>#CR_FW_MAX_DISCRIMINANT</code>.
+ * .
+ * @return true if no errors are detected in the configuration data;
+ * false otherwise.
+ */
+CrFwBool_t CrFwAuxInFactoryInCmdConfigCheck();
+
+/**
+ * Check the configuration of the InReport part of the InFactory component.
+ * The following checks are performed on the configuration data in
+ * <code>CrFwInFactoryUserPar.h</code>:
+ * - CR_FW_INFACTORY_MAX_NOF_INREP is greater than zero
+ * - CR_FW_INREP_NKINDS is greater than zero
+ * - The service types are listed in increasing order in the service descriptor
+ *   initializer (<code>CR_FW_INREP_INIT_KIND_DESC</code>)
+ * - The service sub-types within a type are listed in increasing order in the service
+ *   descriptor initializer (<code>CR_FW_INREP_INIT_KIND_DESC</code>)
+ * - The discriminant values within a type/sub-type are listed in increasing order
+ *   in the service descriptor initializer (<code>CR_FW_INREP_INIT_KIND_DESC</code>)
+ * - The values of the service types, sub-types and discriminant are lower than
+ * 	 <code>#CR_FW_MAX_SERV_TYPE</code>, <code>#CR_FW_MAX_SERV_SUBTYPE</code> and
+ * 	 <code>#CR_FW_MAX_DISCRIMINANT</code>.
+ * .
+ * @return true if no errors are detected in the configuration data;
+ * false otherwise.
+ */
+CrFwBool_t CrFwAuxInFactoryInRepConfigCheck();
+
+#endif /* CRFW_AUX_H_ */
diff --git a/CrFramework/src/BaseCmp/CrFwBaseCmp.c b/CrFramework/src/BaseCmp/CrFwBaseCmp.c
new file mode 100644
index 0000000..b746029
--- /dev/null
+++ b/CrFramework/src/BaseCmp/CrFwBaseCmp.c
@@ -0,0 +1,232 @@
+/**
+ * @file
+ *
+ * Implementation of Base State Machine.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include <stdlib.h>
+/* Include framework files */
+#include "CrFwConstants.h"
+#include "UtilityFunctions/CrFwUtilityFunctions.h"
+#include "CrFwBaseCmp.h"
+#include "CrFwInitProc.h"
+#include "CrFwResetProc.h"
+/* Include FW Profile files */
+#include "FwSmConstants.h"
+#include "FwSmDCreate.h"
+#include "FwSmConfig.h"
+#include "FwSmCore.h"
+#include "FwPrConstants.h"
+#include "FwPrDCreate.h"
+#include "FwPrConfig.h"
+#include "FwPrCore.h"
+/* Include configuration files */
+#include "CrFwCmpData.h"
+
+/** The singleton instance of the Base State Machine. */
+static FwSmDesc_t baseCmpSmDesc = NULL;
+
+/**
+ * Function which runs the Component Initialization Procedure.
+ * This function is used as exit action for the CREATED state.
+ * @param smDesc the state machine descriptor
+ */
+static void RunCIP(FwSmDesc_t smDesc);
+
+/**
+ * Function which runs the Component Reset Procedure.
+ * This function is used as exit action for the INITIALIZED state.
+ * @param smDesc the state machine descriptor
+ */
+static void RunCRP(FwSmDesc_t smDesc);
+
+/**
+ * Function which starts the Component Execution Procedure.
+ * This function is used as entry action for the CONFIGURED state.
+ * @param smDesc the state machine descriptor
+ */
+static void StartCEP(FwSmDesc_t smDesc);
+
+/**
+ * Function which executes the Component Execution Procedure.
+ * This function is used as do-action for the CONFIGURED state.
+ * @param smDesc the state machine descriptor
+ */
+static void ExecCEP(FwSmDesc_t smDesc);
+
+/**
+ * Function which stops the Component Execution Procedure.
+ * This function is used as exit action for the CONFIGURED state.
+ * @param smDesc the state machine descriptor
+ */
+static void StopCEP(FwSmDesc_t smDesc);
+
+/*-----------------------------------------------------------------------------------------*/
+FwSmDesc_t CrFwBaseCmpMake() {
+	FwSmCounterS1_t nOfStates = 3;	/* Number of states */
+	FwSmCounterS1_t nOfChoicePseudoStates = 2;	/* Number of choice pseudo-states */
+	FwSmCounterS1_t nOfTrans = 9;	/* Number of transitions */
+	FwSmCounterS1_t nOfActions = 6;	/* Number of actions */
+	FwSmCounterS1_t nOfGuards = 1;	/* Number of guards */
+	FwSmCounterS1_t CPS_1 = 1;		/* Identifier of first choice pseudo-state */
+	FwSmCounterS1_t CPS_2 = 2;		/* Identifier of second choice pseudo-state */
+
+	if (baseCmpSmDesc != NULL)
+		return baseCmpSmDesc;
+
+	/* Create the base component state machine */
+	baseCmpSmDesc = FwSmCreate(nOfStates, nOfChoicePseudoStates, nOfTrans, nOfActions, nOfGuards);
+
+	/* Configure the base component state machine */
+	FwSmAddState(baseCmpSmDesc, CR_FW_BASE_STATE_CREATED, 1, NULL, &RunCIP, NULL, NULL);
+	FwSmAddState(baseCmpSmDesc, CR_FW_BASE_STATE_INITIALIZED, 1, NULL, &RunCRP, NULL, NULL);
+	FwSmAddState(baseCmpSmDesc, CR_FW_BASE_STATE_CONFIGURED, 2, &StartCEP, &StopCEP, &ExecCEP, NULL);
+	FwSmAddChoicePseudoState(baseCmpSmDesc, CPS_1, 2);
+	FwSmAddChoicePseudoState(baseCmpSmDesc, CPS_2, 2);
+	FwSmAddTransIpsToSta(baseCmpSmDesc, CR_FW_BASE_STATE_CREATED, NULL);
+	FwSmAddTransStaToCps(baseCmpSmDesc, CR_FW_BASE_TR_INIT, CR_FW_BASE_STATE_CREATED, CPS_1, NULL, NULL);
+	FwSmAddTransCpsToSta(baseCmpSmDesc, CPS_1, CR_FW_BASE_STATE_INITIALIZED, NULL, &CrFwIsSmOutcomeOne);
+	FwSmAddTransCpsToSta(baseCmpSmDesc, CPS_1, CR_FW_BASE_STATE_CREATED, NULL, NULL);	/* Else Transition */
+	FwSmAddTransStaToCps(baseCmpSmDesc, CR_FW_BASE_TR_RESET, CR_FW_BASE_STATE_INITIALIZED, CPS_2, NULL, NULL);
+	FwSmAddTransCpsToSta(baseCmpSmDesc, CPS_2, CR_FW_BASE_STATE_CONFIGURED, NULL, &CrFwIsSmOutcomeOne);
+	FwSmAddTransCpsToSta(baseCmpSmDesc, CPS_2, CR_FW_BASE_STATE_INITIALIZED, NULL, NULL);	/* Else Transition */
+	FwSmAddTransStaToCps(baseCmpSmDesc, CR_FW_BASE_TR_RESET, CR_FW_BASE_STATE_CONFIGURED, CPS_2, &RunCRP, NULL);
+	FwSmAddTransStaToFps(baseCmpSmDesc, CR_FW_BASE_TR_SHUTDOWN, CR_FW_BASE_STATE_CONFIGURED, &CrFwBaseCmpDefShutdownAction, NULL);
+
+	return baseCmpSmDesc;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwCmpInit(FwSmDesc_t smDesc) {
+	FwSmMakeTrans(smDesc, CR_FW_BASE_TR_INIT);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwCmpReset(FwSmDesc_t smDesc) {
+	FwSmMakeTrans(smDesc, CR_FW_BASE_TR_RESET);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwCmpShutdown(FwSmDesc_t smDesc) {
+	FwSmMakeTrans(smDesc, CR_FW_BASE_TR_SHUTDOWN);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwCmpExecute(FwSmDesc_t smDesc) {
+	FwSmMakeTrans(smDesc, FW_TR_EXECUTE);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+FwPrDesc_t CrFwCmpGetInitPr(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* baseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	return baseData->initProc;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+FwPrDesc_t CrFwCmpGetResetPr(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* baseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	return baseData->resetProc;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+FwPrDesc_t CrFwCmpGetExecPr(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* baseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	return baseData->execProc;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwInstanceId_t CrFwCmpGetInstanceId(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* baseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	return baseData->instanceId;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwTypeId_t CrFwCmpGetTypeId(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* baseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	return baseData->typeId;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwBool_t CrFwCmpIsStarted(FwSmDesc_t smDesc) {
+	return FwSmIsStarted(smDesc);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwBool_t CrFwCmpIsInCreated(FwSmDesc_t smDesc) {
+	return (FwSmGetCurState(smDesc) == CR_FW_BASE_STATE_CREATED);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwBool_t CrFwCmpIsInInitialized(FwSmDesc_t smDesc) {
+	return (FwSmGetCurState(smDesc) == CR_FW_BASE_STATE_INITIALIZED);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwBool_t CrFwCmpIsInConfigured(FwSmDesc_t smDesc) {
+	return (FwSmGetCurState(smDesc) == CR_FW_BASE_STATE_CONFIGURED);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void RunCIP(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* baseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	FwPrRun(baseData->initProc);
+	return;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void RunCRP(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* baseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	FwPrRun(baseData->resetProc);
+	return;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void StartCEP(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* baseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	FwPrStart(baseData->execProc);
+	return;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void StopCEP(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* baseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	FwPrStop(baseData->execProc);
+	return;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void ExecCEP(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* baseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	FwPrExecute(baseData->execProc);
+	return;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwBaseCmpDefShutdownAction(FwSmDesc_t smDesc) {
+	CRFW_UNUSED(smDesc);
+	return;
+}
+
+
+
diff --git a/CrFramework/src/BaseCmp/CrFwBaseCmp.h b/CrFramework/src/BaseCmp/CrFwBaseCmp.h
new file mode 100644
index 0000000..de8ca05
--- /dev/null
+++ b/CrFramework/src/BaseCmp/CrFwBaseCmp.h
@@ -0,0 +1,221 @@
+/**
+ * @file
+ * @ingroup baseCmpGroup
+ * Definition of Base Component.
+ * A Base Component implements the behaviour of the Base State Machine
+ * (see figures below).
+ *
+ * All components used in the framework are derived from the Base Component
+ * (i.e. all framework components are implemented by state machines which are
+ * derived from the Base State Machine).
+ * Hence, all framework components inherit the behaviour of the Base
+ * State Machine.
+ *
+ * The Base State Machine is a singleton.
+ * This header file defines the operation to create and access this singleton
+ * instance.
+ *
+ * A Base State Machine responds to three transition commands: Init,
+ * Reset and Shutdown.
+ * This header file defines functions to send these three commands to a Base Component
+ * or to one of its derived components.
+ *
+ * The Base State Machine uses three procedures, the
+ * Component Initialization Procedure, the Component Reset Procedure,
+ * and the Component Execution Procedure.
+ * The first two procedures are defined in <code>CrFwInitProc.h</code> and
+ * <code>CrFwResetProc</code>.
+ * The third procedure is defined as a dummy in <code>CrFwExecProc.h</code>.
+ *
+ * The Base Component defines the Instance Identifier and Type Identifier
+ * attributes.
+ * The Type Identifier identifies the type of a component.
+ * The Instance Identifier identifies an instance within a type.
+ * This module defines the functions to access the type and instance identifier of
+ * a Base Component or of a component derived from a Base Component.
+ *
+ * @image html BaseSM.png
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_BASE_CMP_H_
+#define CRFW_BASE_CMP_H_
+
+/* Include FW Profile Files */
+#include "FwSmConstants.h"
+#include "FwPrConstants.h"
+/* Include Framework Files */
+#include "CrFwConstants.h"
+/* Include Configuration Files */
+#include "CrFwUserConstants.h"
+
+/**
+ * Retrieve the singleton instance of the Base State Machine.
+ * The Base State Machine is a singleton.
+ * The first time this function is called, it creates the Base State Machine.
+ * Subsequently, it always returns the same instance.
+ *
+ * The first time this function is called, it returns the Base State Machine
+ * in state STOPPED.
+ * @return the descriptor of the Base State Machine or NULL
+ * if the state machine could not be created.
+ */
+FwSmDesc_t CrFwBaseCmpMake();
+
+/**
+ * Initialize a framework component.
+ * This function sends command Init to a Base State Machine.
+ * This function can be used either on a Base State Machine or on a state
+ * machine that has been derived from a Base State Machine.
+ * @param smDesc the descriptor of the Base State Machine to be initialized.
+ */
+void CrFwCmpInit(FwSmDesc_t smDesc);
+
+/**
+ * Reset a framework component.
+ * This function sends command Reset to a Base State Machine.
+ * This function can be used either on a Base State Machine or on a state
+ * machine that has been derived from a Base State Machine.
+ * @param smDesc the descriptor of the Base State Machine to be reset.
+ */
+void CrFwCmpReset(FwSmDesc_t smDesc);
+
+/**
+ * Shutdown a framework component.
+ * This function sends command Shutdown to a Base State Machine.
+ * This function can be used either on a Base State Machine or on a state
+ * machine that has been derived from a Base State Machine.
+ * @param smDesc the descriptor of the Base State Machine to be shutdown.
+ */
+void CrFwCmpShutdown(FwSmDesc_t smDesc);
+
+/**
+ * Execute a framework component.
+ * This function sends command Execute to a Base State Machine.
+ * This function can be used either on a Base State Machine or on a state
+ * machine that has been derived from a Base State Machine.
+ * @param smDesc the descriptor of the Base State Machine to be executed.
+ */
+void CrFwCmpExecute(FwSmDesc_t smDesc);
+
+/**
+ * Function which performs the Shutdown Action for the Base State Machine.
+ * This implementation of the Shutdown Action returns without doing anything.
+ *
+ * This action is an adaptation point of the framework.
+ * Components which extend the Base Component may want to override this function
+ * to implement their own shutdown behaviour.
+ * @param smDesc the descriptor of the Base State Machine.
+ */
+void CrFwBaseCmpDefShutdownAction(FwSmDesc_t smDesc);
+
+/**
+ * Return the descriptor of the Initialization Procedure of the argument component.
+ * Each component derived from the Base Component has an Initialization Procedure.
+ * This function returns the descriptor of the Initialization Procedure of the
+ * argument component.
+ * @param smDesc the descriptor of the Base State Machine.
+ * @return the descriptor of the Initialization Procedure
+ */
+FwPrDesc_t CrFwCmpGetInitPr(FwSmDesc_t smDesc);
+
+/**
+ * Return the descriptor of the Reset Procedure of the argument component.
+ * Each component derived from the Base Component has a Reset Procedure.
+ * This function returns the descriptor of the Reset Procedure of the
+ * argument component.
+ * @param smDesc the descriptor of the Base State Machine.
+ * @return the descriptor of the Reset Procedure
+ */
+FwPrDesc_t CrFwCmpGetResetPr(FwSmDesc_t smDesc);
+
+/**
+ * Return the descriptor of the Execution Procedure of the argument component.
+ * Each component derived from the Base Component has an Execution Procedure.
+ * This function returns the descriptor of the Execution Procedure of the
+ * argument component.
+ * @param smDesc the descriptor of the Base State Machine.
+ * @return the descriptor of the Reset Procedure
+ */
+FwPrDesc_t CrFwCmpGetExecPr(FwSmDesc_t smDesc);
+
+/**
+ * Return the instance identifier of the argument component.
+ * Each component derived from the Base Component has an Instance Identifier
+ * which identifies a certain instance of a component within all instances of
+ * the same type.
+ * This function returns the value of the Instance Identifier.
+ * @param smDesc the descriptor of the Base State Machine.
+ * @return the instance identifier
+ */
+CrFwInstanceId_t CrFwCmpGetInstanceId(FwSmDesc_t smDesc);
+
+/**
+ * Return the type identifier of the argument component.
+ * Each component belongs to a type.
+ * This function returns the value of the Type Identifier.
+ * @param smDesc the descriptor of the Base State Machine.
+ * @return the instance identifier
+ */
+CrFwTypeId_t CrFwCmpGetTypeId(FwSmDesc_t smDesc);
+
+/**
+ * Return true if the state machine of the argument component has been started.
+ * This function checks whether the Base State Machine has been started.
+ * This function can be used either on a Base State Machine or on a state
+ * machine that has been derived from a Base State Machine.
+ * @param smDesc the descriptor of the Base State Machine.
+ * @return 1 if the argument state machine has been started; 0 otherwise
+ */
+CrFwBool_t CrFwCmpIsStarted(FwSmDesc_t smDesc);
+
+/**
+ * Return true if the argument component is in state CREATED.
+ * This function checks whether the Base State Machine is in state CREATED.
+ * This function can be used either on a Base State Machine or on a state
+ * machine that has been derived from a Base State Machine.
+ * @param smDesc the descriptor of the Base State Machine.
+ * @return 1 if the argument state machine is in state CREATED; 0 otherwise
+ */
+CrFwBool_t CrFwCmpIsInCreated(FwSmDesc_t smDesc);
+
+/**
+ * Return true if the argument component is in state INITIALIZED.
+ * This function checks whether the Base State Machine is in state INITIALIZED.
+ * This function can be used either on a Base State Machine or on a state
+ * machine that has been derived from a Base State Machine.
+ * @param smDesc the descriptor of the Base State Machine.
+ * @return 1 if the argument state machine is in state INITIALIZED; 0 otherwise
+ */
+CrFwBool_t CrFwCmpIsInInitialized(FwSmDesc_t smDesc);
+
+/**
+ * Return true if the argument component is in state CONFIGURED.
+ * This function checks whether the Base State Machine is in state CONFIGURED.
+ * This function can be used either on a Base State Machine or on a state
+ * machine that has been derived from a Base State Machine.
+ * @param smDesc the descriptor of the Base State Machine.
+ * @return 1 if the argument state machine is in state CONFIGURED; 0 otherwise
+ */
+CrFwBool_t CrFwCmpIsInConfigured(FwSmDesc_t smDesc);
+
+#endif /* CRFW_BASE_CMP_H_ */
diff --git a/CrFramework/src/BaseCmp/CrFwDummyExecProc.c b/CrFramework/src/BaseCmp/CrFwDummyExecProc.c
new file mode 100644
index 0000000..570e562
--- /dev/null
+++ b/CrFramework/src/BaseCmp/CrFwDummyExecProc.c
@@ -0,0 +1,73 @@
+/**
+ * @file
+ *
+ * Implementation of Dummy Component Execution Procedure.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include <stdlib.h>
+#include "CrFwInitProc.h"
+#include "CrFwBaseCmp.h"
+#include "UtilityFunctions/CrFwUtilityFunctions.h"
+/* FW Profile Files */
+#include "FwPrConstants.h"
+#include "FwPrDCreate.h"
+#include "FwPrConfig.h"
+#include "FwPrCore.h"
+
+/** The singleton instance of the CIP. */
+static FwPrDesc_t dummyExecPrDesc = NULL;
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void CwFwBaseCmpDummyExecAction(FwPrDesc_t prDesc) {
+	CRFW_UNUSED(prDesc);
+	return;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+FwPrDesc_t CrFwBaseCmpGetDummyExecProc() {
+	const FwPrCounterS1_t nOfANodes = 1;	/* Number of action nodes */
+	const FwPrCounterS1_t nOfDNodes = 0;	/* Number of decision nodes */
+	const FwPrCounterS1_t nOfFlows = 2;		/* Number of control flows */
+	const FwPrCounterS1_t nOfActions = 1;	/* Number of actions */
+	const FwPrCounterS1_t nOfGuards = 1;	/* Number of guards */
+	const FwPrCounterS1_t N1 = 1;			/* Identifier of first action node */
+
+	if (dummyExecPrDesc != NULL)
+		return dummyExecPrDesc;
+
+	/* Create the execution procedure */
+	dummyExecPrDesc = FwPrCreate(nOfANodes, nOfDNodes, nOfFlows, nOfActions, nOfGuards);
+
+	/* Configure the initialization procedure */
+	FwPrAddActionNode(dummyExecPrDesc, N1, &CwFwBaseCmpDummyExecAction);
+	FwPrAddFlowIniToAct(dummyExecPrDesc, N1, NULL);
+	FwPrAddFlowActToAct(dummyExecPrDesc, N1, N1, &CrFwWaitOnePrCycle);
+
+	return dummyExecPrDesc;
+}
+
+
+
+
+
diff --git a/CrFramework/src/BaseCmp/CrFwDummyExecProc.h b/CrFramework/src/BaseCmp/CrFwDummyExecProc.h
new file mode 100644
index 0000000..dfa7d60
--- /dev/null
+++ b/CrFramework/src/BaseCmp/CrFwDummyExecProc.h
@@ -0,0 +1,69 @@
+/**
+ * @file
+ * @ingroup baseCmpGroup
+ * Dummy Component Execution Procedure (CEP) for the Base Component.
+ * The CEP is one of the procedures which implement the behaviour of the
+ * Base Component (see <code>CrFwBaseCmp.h</code>).
+ * This procedure is an adaptation point in the Base Component.
+ * The implementation provided in this file is the default defined
+ * at the level of the Base Component.
+ * Components which extend the Base Component may override it and define
+ * their own implementation.
+ *
+ * The CORDET Framework does not define a generic CEP.
+ * This implementation therefore defines a dummy CEP which can be used
+ * by components which do not need a CEP.
+ * This dummy CEP (see figure below) has one single action node which
+ * executes a dummy action every time the procedure is executed.
+ * The dummy action can be overridden.
+ *
+ * The Dummy CEP (like the Base Component) is a singleton.
+ * This header file gives access to the singleton instance of the Dummy CEP.
+ *
+ * @image html DummyExecution.png
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_DUMMY_EXEC_PROC_H_
+#define CRFW_DUMMY_EXEC_PROC_H_
+
+#include "FwSmConstants.h"
+#include "FwPrConstants.h"
+#include "CrFwConstants.h"
+
+/**
+ * Retrieve the singleton instance of the Dummy CEP.
+ * This function returns the descriptor of the Dummy CEP.
+ * Note that no data are attached to the descriptor as it is returned by this
+ * function.
+ * @return the descriptor of the CEP or NULL if the procedure could not be created.
+ */
+FwPrDesc_t CrFwBaseCmpGetDummyExecProc();
+
+/**
+ * Dummy action executed in the single node of the Dummy Execution Procedure.
+ * This dummy action returns without doing anything.
+ * @param prDesc the procedure descriptor
+ */
+void CwFwBaseCmpDummyExecAction(FwPrDesc_t prDesc);
+
+#endif /* CRFW_DUMMY_EXEC_PROC_H_ */
diff --git a/CrFramework/src/BaseCmp/CrFwInitProc.c b/CrFramework/src/BaseCmp/CrFwInitProc.c
new file mode 100644
index 0000000..2b31459
--- /dev/null
+++ b/CrFramework/src/BaseCmp/CrFwInitProc.c
@@ -0,0 +1,91 @@
+/**
+ * @file
+ *
+ * Implementation of Component Initialization Procedure.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include <stdlib.h>
+/* Include framework files */
+#include "CrFwInitProc.h"
+#include "CrFwBaseCmp.h"
+#include "UtilityFunctions/CrFwUtilityFunctions.h"
+/* Include configuration files */
+#include "CrFwCmpData.h"
+/* Include FW Profile files */
+#include "FwPrConstants.h"
+#include "FwPrDCreate.h"
+#include "FwPrConfig.h"
+#include "FwPrCore.h"
+
+/** The singleton instance of the CIP. */
+static FwPrDesc_t initPrDesc = NULL;
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwBaseCmpDefInitCheck(FwPrDesc_t prDesc) {
+	CrFwCmpData_t* prData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+	prData->outcome = 1;
+	return;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwBaseCmpDefInitAction(FwPrDesc_t prDesc) {
+	CrFwCmpData_t* prData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+	prData->outcome = 1;
+	return;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+FwPrDesc_t CrFwCmpGetInitProc() {
+	const FwPrCounterS1_t nOfANodes = 2;	/* Number of action nodes */
+	const FwPrCounterS1_t nOfDNodes = 1;	/* Number of decision nodes */
+	const FwPrCounterS1_t nOfFlows = 5;		/* Number of control flows */
+	const FwPrCounterS1_t nOfActions = 2;	/* Number of actions */
+	const FwPrCounterS1_t nOfGuards = 1;	/* Number of guards */
+	const FwPrCounterS1_t N1 = 1;			/* Identifier of first action node */
+	const FwPrCounterS1_t N2 = 2;			/* Identifier of second action node */
+	const FwPrCounterS1_t D1 = 1;			/* Identifier of first decision node */
+
+	if (initPrDesc != NULL)
+		return initPrDesc;
+
+	/* Create the initialization procedure */
+	initPrDesc = FwPrCreate(nOfANodes, nOfDNodes, nOfFlows, nOfActions, nOfGuards);
+
+	/* Configure the initialization procedure */
+	FwPrAddActionNode(initPrDesc, N1, &CrFwBaseCmpDefInitCheck);
+	FwPrAddActionNode(initPrDesc, N2, &CrFwBaseCmpDefInitAction);
+	FwPrAddDecisionNode(initPrDesc, D1, 2);
+	FwPrAddFlowIniToAct(initPrDesc, N1, NULL);
+	FwPrAddFlowActToDec(initPrDesc, N1, D1, NULL);
+	FwPrAddFlowDecToAct(initPrDesc, D1, N2, &CrFwIsPrOutcomeOne);
+	FwPrAddFlowDecToFin(initPrDesc, D1, NULL);	/* Else branch */
+	FwPrAddFlowActToFin(initPrDesc, N2, NULL);
+
+	return initPrDesc;
+}
+
+
+
+
+
diff --git a/CrFramework/src/BaseCmp/CrFwInitProc.h b/CrFramework/src/BaseCmp/CrFwInitProc.h
new file mode 100644
index 0000000..06fe20d
--- /dev/null
+++ b/CrFramework/src/BaseCmp/CrFwInitProc.h
@@ -0,0 +1,125 @@
+/**
+ * @file
+ * @ingroup baseCmpGroup
+ * Component Initialization Procedure (CIP) for the Base Component.
+ * The CIP is one of the procedures which implement the behaviour of the
+ * Base Component (see <code>CrFwBaseCmp.h</code>).
+ * The CIP is shown as an activity diagram in the left-hand side of the
+ * figure below.
+ *
+ * The CIP (like the Base Component) is a singleton.
+ * This header file gives access to the singleton instance of the CIP.
+ * This header file also gives access to the functions which implement the
+ * two actions of the CIP.
+ * These actions represent adaptation points of the framework and they are
+ * therefore made externally accessible so that derived component may override
+ * them.
+ *
+ * All components derived from the Base Component need an own version of
+ * the CIP.
+ * They obtain it by extending the CIP instance defined in this file.
+ * @image html InitializationAndReset.png
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_INIT_PROC_H_
+#define CRFW_INIT_PROC_H_
+
+#include "FwSmConstants.h"
+#include "FwPrConstants.h"
+#include "CrFwConstants.h"
+
+/**
+ * Retrieve the singleton instance of the CIP.
+ * This function returns the descriptor of the CIP.
+ * Note that no data are attached to the descriptor as it is returned by this
+ * function.
+ * The CIP descriptor returned by this function is therefore not ready to be
+ * executed.
+ * It can only be executed after the procedure data have been loaded into it.
+ * @return the descriptor of the CIP or NULL if the procedure could not be created.
+ */
+FwPrDesc_t CrFwCmpGetInitProc();
+
+/**
+ * Function which performs the default Initialization Check of the CIP.
+ * This function implements one of the actions of the CIP.
+ * In general, the Initialization Check for a component checks that all
+ * parameters required for the component initialization have legal values.
+ *
+ * The Initialization Check has an outcome.
+ * This function assumes the procedure data to be of type <code>::CrFwCmpData_t</code>.
+ * It uses the <code>outcome</code> field of this data structure to store the
+ * outcome of the initialization check.
+ * If the outcome of the Initialization Check is "check successful", then the
+ * outcome field is set equal to 1.
+ * If the outcome of the Initialization Check is "check failed", then the
+ * outcome field is set equal to 0.
+ *
+ * This function implements the Initialization Check for the Base Component which
+ * always returns an outcome of "check successful" (i.e. always sets the outcome field to 1).
+ *
+ * This action is an adaptation point for the framework.
+ * Components which extend the Base Component (and which therefore must also extend
+ * the CIP) may want to override this function to implement their own initialization
+ * behaviour).
+ * @param prDesc the CIP descriptor
+ */
+void CrFwBaseCmpDefInitCheck(FwPrDesc_t prDesc);
+
+/**
+ * Function which performs the default Initialization Action of the CIP.
+ * This function implements one of the actions of the CIP.
+ * In general, the Initialization Action for a component creates all data structures
+ * required by the component and performs other initialization actions as required.
+ *
+ * The Initialization Action has an outcome.
+ * This function assumes the procedure data to be of type <code>::CrFwCmpData_t</code>.
+ * It uses the <code>outcome</code> field of this data structure to store the
+ * outcome of the initialization action.
+ * If the outcome of the Initialization Action is "action successful", then the
+ * outcome field is set equal to 1.
+ * If the outcome of the Initialization Action is "action failed", then the
+ * outcome field is set equal to 0.
+ *
+ * This function assumes the procedure data to be of type <code>::CrFwCmpData_t</code>.
+ * It uses the <code>outcome</code> field of this data structure to store the
+ * outcome of the initialization action (a value of "true" means that the
+ * initialization action was successful).
+ *
+ * This function implements the Initialization Action for the Base Component
+ * which does nothing and always returns an outcome of "action successful" (i.e.
+ * always sets the outcome field to 1).
+ *
+ * This action is an adaptation point of the framework.
+ * Components which extend the Base Component (and which therefore must also extend
+ * the CIP) may want to override this function to implement their own initialization
+ * behaviour).
+ *
+ * Traceability information (this information is intended to be processed automatically):
+ * - CrFwBaseCmpDefInitCheck, AP, A4.1-2
+ * .
+ * @param prDesc the CIP descriptor
+ */
+void CrFwBaseCmpDefInitAction(FwPrDesc_t prDesc);
+
+#endif /* CRFW_INIT_PROC_H_ */
diff --git a/CrFramework/src/BaseCmp/CrFwResetProc.c b/CrFramework/src/BaseCmp/CrFwResetProc.c
new file mode 100644
index 0000000..d269488
--- /dev/null
+++ b/CrFramework/src/BaseCmp/CrFwResetProc.c
@@ -0,0 +1,88 @@
+/**
+ * @file
+ *
+ * Implementation of Component Reset Procedure.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include <stdlib.h>
+#include "CrFwResetProc.h"
+#include "CrFwBaseCmp.h"
+#include "UtilityFunctions/CrFwUtilityFunctions.h"
+#include "FwPrConstants.h"
+#include "FwPrDCreate.h"
+#include "FwPrConfig.h"
+#include "FwPrCore.h"
+#include "CrFwCmpData.h"
+
+/** The singleton instance of the CRP. */
+static FwPrDesc_t resetPrDesc = NULL;
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwBaseCmpDefConfigCheck(FwPrDesc_t prDesc) {
+	CrFwCmpData_t* prData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+	prData->outcome = 1;
+	return;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwBaseCmpDefConfigAction(FwPrDesc_t prDesc) {
+	CrFwCmpData_t* prData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+	prData->outcome = 1;
+	return;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+FwPrDesc_t CrFwCmpGetResetProc() {
+	FwPrCounterS1_t nOfANodes = 2;	/* Number of action nodes */
+	FwPrCounterS1_t nOfDNodes = 1;	/* Number of decision nodes */
+	FwPrCounterS1_t nOfFlows = 5;		/* Number of control flows */
+	FwPrCounterS1_t nOfActions = 2;	/* Number of actions */
+	FwPrCounterS1_t nOfGuards = 1;	/* Number of guards */
+	FwPrCounterS1_t N1 = 1;			/* Identifier of first action node */
+	FwPrCounterS1_t N2 = 2;			/* Identifier of second action node */
+	FwPrCounterS1_t D1 = 1;			/* Identifier of first decision node */
+
+	if (resetPrDesc != NULL)
+		return resetPrDesc;
+
+	/* Create the initialization procedure */
+	resetPrDesc = FwPrCreate(nOfANodes, nOfDNodes, nOfFlows, nOfActions, nOfGuards);
+
+	/* Configure the initialization procedure */
+	FwPrAddActionNode(resetPrDesc, N1, &CrFwBaseCmpDefConfigCheck);
+	FwPrAddActionNode(resetPrDesc, N2, &CrFwBaseCmpDefConfigAction);
+	FwPrAddDecisionNode(resetPrDesc, D1, 2);
+	FwPrAddFlowIniToAct(resetPrDesc, N1, NULL);
+	FwPrAddFlowActToDec(resetPrDesc, N1, D1, NULL);
+	FwPrAddFlowDecToAct(resetPrDesc, D1, N2, &CrFwIsPrOutcomeOne);
+	FwPrAddFlowDecToFin(resetPrDesc, D1, NULL);	/* Else branch */
+	FwPrAddFlowActToFin(resetPrDesc, N2, NULL);
+
+	return resetPrDesc;
+}
+
+
+
+
+
diff --git a/CrFramework/src/BaseCmp/CrFwResetProc.h b/CrFramework/src/BaseCmp/CrFwResetProc.h
new file mode 100644
index 0000000..314ab9f
--- /dev/null
+++ b/CrFramework/src/BaseCmp/CrFwResetProc.h
@@ -0,0 +1,109 @@
+/**
+ * @file
+ * @ingroup baseCmpGroup
+ * Component Reset Procedure (CRP) for the Base Component.
+ * The CRP is one of the procedures which implement the behaviour of the
+ * Base Component (see <code>CrFwBaseCmp.h</code>).
+ * The CRP is shown as an activity diagram in the right-hand side of the
+ * figure below.
+ *
+ * The CRP (like the Base Component) is a singleton.
+ * This header file gives access to the singleton instance of the CRP.
+ * This header file also gives access to the functions which implement the
+ * two actions of the CRP.
+ * These actions represent adaptation points of the framework and they are
+ * therefore made externally accessible so that derived component may override
+ * them.
+ *
+ * All components derived from the Base Component need an own version of
+ * the CRP.
+ * They obtain it by extending the CRP instance defined in this file.
+ * @image html InitializationAndReset.png
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_RESET_PROC_H_
+#define CRFW_RESET_PROC_H_
+
+#include "FwSmConstants.h"
+#include "FwPrConstants.h"
+#include "CrFwConstants.h"
+
+/**
+ * Retrieve the singleton instance of the CRP.
+ * This function returns the descriptor of the CRP.
+ * Note that no data are attached to the descriptor as it is returned by this
+ * function.
+ * The CRP descriptor returned by this function is therefore not ready to be
+ * executed.
+ * It can only be executed after the procedure data have been loaded into it.
+ * @return the descriptor of the CRP or NULL if the procedure could not be created.
+ */
+FwPrDesc_t CrFwCmpGetResetProc();
+
+/**
+ * Function which performs the default Configuration Check of the CRP.
+ * This function implements one of the actions of the CRP.
+ * In general, the Configuration Check for a component checks that all
+ * parameters required for the component configuration have legal values.
+ *
+ * This function assumes the procedure data to be of type <code>::CrFwCmpData_t</code>.
+ * It uses the <code>outcome</code> field of this data structure to store the
+ * outcome of the configuration check.
+ *
+ * This function implements the Configuration Check for the Base Component
+ * which always returns an outcome of "check successful" (i.e. always sets the
+ * outcome check to TRUE).
+ *
+ * This action is an adaptation point for the framework.
+ * Components which extend the Base Component (and which therefore must also extend
+ * the CRP) may want to override this function to implement their own configuration
+ * behaviour).
+ * @param prDesc the CIP descriptor
+ */
+void CrFwBaseCmpDefConfigCheck(FwPrDesc_t prDesc);
+
+/**
+ * Function which performs the default Configuration Action of the CRP.
+ * This function implements one of the actions of the CRP.
+ * In general, the Configuration Action for a component initializes all data structures
+ * required by the component and performs other configuration actions as required.
+ * The configuration action has an outcome: it can either succeed or it can fail.
+ *
+ * This function assumes the procedure data to be of type <code>::CrFwCmpData_t</code>.
+ * It uses the <code>outcome</code> field of this data structure to store the
+ * outcome of the configuration action (a value of "true" means that the configuration
+ * action was successful).
+ *
+ * This function implements the Configuration Action for the Base Component
+ * which does nothing and always returns an outcome of "action successful" (i.e.
+ * always sets the outcome check to TRUE).
+ *
+ * This action is an adaptation point of the framework.
+ * Components which extend the Base Component (and which therefore must also extend
+ * the CRP) may want to override this function to implement their own configuration
+ * behaviour).
+ * @param prDesc the CRP descriptor
+ */
+void CrFwBaseCmpDefConfigAction(FwPrDesc_t prDesc);
+
+#endif /* CRFW_RESET_PROC_H_ */
diff --git a/CrFramework/src/CrFwConstants.h b/CrFramework/src/CrFwConstants.h
new file mode 100644
index 0000000..6f219ce
--- /dev/null
+++ b/CrFramework/src/CrFwConstants.h
@@ -0,0 +1,628 @@
+/**
+ * @file
+ * Header file to define all invariant publicly available constants and types for the CORDET Framework.
+ * The invariant constants and types are those which are not intended to be
+ * modified by the user during the framework instantiation process.
+ * User-configurable constant and types are defined in <code>CrFwUserConstants.h</code>.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_CONSTANTS_H_
+#define CRFW_CONSTANTS_H_
+
+#include "FwPrConstants.h"
+#include "FwSmConstants.h"
+#include "CrFwUserConstants.h"
+
+/** A macro that can be used to specify that a function parameter is not used */
+#define CRFW_UNUSED(x) (void)(x);
+
+/** Type used for boolean values (1 represent "true" and 0 represents "false"). */
+typedef int CrFwBool_t;
+
+/** Type for the index of a command or report in the InRegistry or OutRegistry. */
+typedef unsigned short CrFwCmdRepIndex_t;
+
+/** Type for packets (see <code>CrFwPckt.h</code>). Packets are treated as arrays of bytes. */
+typedef char* CrFwPckt_t;
+
+/** Enumerated type for command and reports */
+typedef enum {
+	/** Command type */
+	crCmdType = 1,
+	/** Report type */
+	crRepType = 2
+} CrFwCmdRepType_t;
+
+/**
+ * Type for a pointer to a function implementing the Update Action Operation for
+ * an InReport.
+ * The Update Action Operation is one of the adaptation points of the framework.
+ * A function which implements this operation takes the InReport descriptor
+ * as an argument and returns <code>void</code>.
+ */
+typedef void (*CrFwInRepUpdateAction_t)(FwPrDesc_t);
+
+/**
+ * Type for a pointer to a function implementing the Validity Check Operation for
+ * an InReport.
+ * The Validity Check Operation is one of the adaptation points of the framework.
+ * A function which implements this operation takes the InReport descriptor
+ * as an argument and returns true if the data in the InReport packet are valid
+ * and returns false otherwise.
+ */
+typedef CrFwBool_t (*CrFwInRepValidityCheck_t)(FwPrDesc_t);
+
+/**
+ * Type for a pointer to a function implementing the Validity Check Operation for
+ * an InReport.
+ * The Validity Check Operation is one of the adaptation points of the framework.
+ * A function which implements this operation takes the InReport procedure descriptor
+ * as an argument and returns true if the data in the InReport packet are valid
+ * and returns false otherwise.
+ */
+typedef CrFwBool_t (*CrFwInCmdValidityCheck_t)(FwPrDesc_t);
+
+/**
+ * Type for a pointer to a function implementing the Ready Check Operation for an
+ * InCommand.
+ * The Ready Check Operation is one of the adaptation points of the framework.
+ * A function which implements this operation takes the InCommand descriptor
+ * as an argument and returns true if the command is ready to start execution and
+ * false otherwise.
+ */
+typedef CrFwBool_t (*CrFwInCmdReadyCheck_t)(FwSmDesc_t);
+
+/**
+ * Type for a pointer to a function implementing the Start Action Operation for
+ * an InCommand.
+ * The Start Action Operation is one of the adaptation points of the framework.
+ * A function which implements this operation takes the InCommand descriptor
+ * as an argument and returns <code>void</code>.
+ * The Start Action has an outcome which it records in field <code>outcome</code>
+ * of <code>::CrFwCmpData_t</code>.
+ * The outcome is either '1' (to signify that the action was successful) or
+ * an integer different from '1' (to signify that the action failed --
+ * in this case the outcome is a code which identifies the reason for the failure).
+ */
+typedef void (*CrFwInCmdStartAction_t)(FwSmDesc_t);
+
+/**
+ * Type for a pointer to a function implementing the Progress Action Operation for
+ * an InCommand.
+ * The Progress Action Operation is one of the adaptation points of the framework.
+ * A function which implements this operation takes the InCommand descriptor
+ * as an argument and returns <code>void</code>.
+ * The Progress Action has an outcome which it records in field <code>outcome</code>
+ * of <code>::CrFwCmpData_t</code>.
+ * The outcome is either '2' (to signify that command execution can continue), or
+ * '1' (to signify that command execution has been completed), or an integer different from
+ * '1' and '2' (to signify that the action failed -- in this case the outcome is
+ * a code which identifies the reason for the failure).
+ */
+typedef void (*CrFwInCmdProgressAction_t)(FwSmDesc_t);
+
+/**
+ * Type for a pointer to a function implementing the Termination Action Operation for
+ * an InCommand.
+ * The Termination Action Operation is one of the adaptation points of the framework.
+ * A function which implements this operation takes the InCommand descriptor
+ * as an argument and returns <code>void</code>.
+ * The Termination Action has an outcome which it records in field <code>outcome</code>
+ * of <code>::CrFwCmpData_t</code>.
+ * The outcome is either '1' (to signify that the action was successful) or
+ * an integer different from '1' (to signify that the action failed --
+ * in this case the outcome is a code which identifies the reason for the failure).
+ */
+typedef void (*CrFwInCmdTerminationAction_t)(FwSmDesc_t);
+
+/**
+ * Type for a pointer to a function implementing the Abort Action Operation for
+ * an InCommand.
+ * The Abort Action Operation is one of the adaptation points of the framework.
+ * A function which implements this operation takes the InCommand descriptor
+ * as an argument and returns <code>void</code>.
+ */
+typedef void (*CrFwInCmdAbortAction_t)(FwSmDesc_t);
+
+/**
+ * Type for a pointer to a function implementing the Enable Check Operation for an
+ * OutComponent.
+ * The Enable Check Operation is one of the adaptation points of the framework.
+ * A function which implements this operation takes the OutComponent descriptor
+ * as an argument and returns true if the packet encapsulated by the OutComponent
+ * is enabled and false otherwise.
+ */
+typedef CrFwBool_t (*CrFwOutCmpEnableCheck_t)(FwSmDesc_t);
+
+/**
+ * Type for a pointer to a function implementing the Ready Check Operation for an
+ * OutComponent.
+ * The Ready Check Operation is one of the adaptation points of the framework.
+ * A function which implements this operation takes the OutComponent descriptor
+ * as an argument and returns true if the packet encapsulated by the OutComponent
+ * is ready to be sent out and false otherwise.
+ */
+typedef CrFwBool_t (*CrFwOutCmpReadyCheck_t)(FwSmDesc_t);
+
+/**
+ * Type for a pointer to a function implementing the Repeat Check Operation for an
+ * OutComponent.
+ * The Repeat Check Operation is one of the adaptation points of the framework.
+ * A function which implements this operation takes the OutComponent descriptor
+ * as an argument and returns true if the OutComponent must be sent to its destination
+ * again and false otherwise.
+ */
+typedef CrFwBool_t (*CrFwOutCmpRepeatCheck_t)(FwSmDesc_t);
+
+/**
+ * Type for a pointer to a function implementing the Update Operation for an
+ * OutComponent.
+ * This operation is one of the adaptation points of the framework.
+ * The operation updates the data which the OutComponent must carry to its
+ * destination.
+ * A function which implements this operation takes the OutComponent descriptor
+ * as an argument and returns void.
+ */
+typedef void (*CrFwOutCmpUpdate_t)(FwSmDesc_t);
+
+/**
+ * Type for a pointer to a function implementing the Serialize Operation for an
+ * OutComponent.
+ * This operation serializes the OutComponent to the packet associated to the
+ * OutComponent (see <code>::CrFwOutCmpData_t</code>).
+ * A function which implements this operation takes the OutComponent descriptor
+ * as an argument and returns void.
+ */
+typedef void (*CrFwOutCmpSerialize_t)(FwSmDesc_t);
+
+/**
+ * Type for a pointer to a function implementing the Packet Collect Operation of
+ * an InStream.
+ * The Packet Collect Operation is one of the adaptation points of the framework.
+ * A function which implements this operation takes the packet source as its argument and
+ * returns a packet collected from the middleware interface associated to the packet
+ * source or NULL if no packet could be collected.
+ * The packet returned by this function must be created through function
+ * <code>::CrFwPcktMake</code> (release of the packet is the responsibility of the
+ * user of the InStream).
+ *
+ * If there is a need to verify whether a packet is available for collection through
+ * the Packet Collect Operation, this can be done using the Packet Available Check Operation.
+ *
+ */
+typedef CrFwPckt_t (*CrFwPcktCollect_t)(CrFwDestSrc_t);
+
+/**
+ * Type for a pointer to a function implementing the Packet Available Check Operation
+ * of an InStream.
+ * The Packet Available Check Operation is one of the adaptation points of the framework.
+ * A function which implements this operation takes the packet source as its argument and
+ * returns 1 if a new packet is available at the middleware interface associated to the packet
+ * source or 0 if no packet is available.
+ * Hence, a return value of 1 implies that a call to the Packet Collect Operation will return
+ * one packet.
+ */
+typedef CrFwBool_t (*CrFwPcktAvailCheck_t)(CrFwDestSrc_t);
+
+/**
+ * Type for a pointer to a function implementing the Packet Hand-Over Operation of
+ * an OutStream.
+ * The Packet Hand-Over Operation is one of the adaptation points of the framework.
+ * A function which implements this operation takes the packet to be handed over
+ * to the middleware as an argument and returns either 1 if the hand-over was successful
+ * or 0 if the hand-over failed.
+ *
+ * The function must not modify the content of the packet.
+ * The argument of the function is a pointer to the packet.
+ * This pointer is "owned" by the caller and the function should not use after it has
+ * returned.
+ */
+typedef CrFwBool_t (*CrFwPcktHandover_t)(CrFwPckt_t pckt);
+
+/** Descriptor for a Packet Queue (PQ) in an OutStream or InStream. */
+struct CrFwPcktQueue {
+	/** The list of packets in the PQ. */
+	CrFwPckt_t* pckt;
+	/** The size of the PQ (the same as the size of the <code>pckt</code> array) */
+	CrFwCounterU1_t size;
+	/** The index of the oldest item in the PQ */
+	CrFwCounterU1_t oldestItem;
+	/** Index of the next free slot in the PQ. */
+	CrFwCounterU1_t nextFreeItem;
+	/** Flag indicating whether the PQ is empty */
+	CrFwBool_t isEmpty;
+};
+
+/** Type used in the framework to represent a packet queue */
+typedef struct CrFwPcktQueue* CrFwPcktQueue_t;
+
+/**
+ * InReport kind descriptor type.
+ * An application supports a number of InReport kinds.
+ * An instance of this type describes one of the InReport kinds supported by an application.
+ */
+typedef struct {
+	/** The service type */
+	CrFwServType_t servType;
+	/** The service sub-type */
+	CrFwServSubType_t servSubType;
+	/** The discriminant value (or zero if no discriminant for this type/sub-type) */
+	CrFwDiscriminant_t discriminant;
+	/** The pointer to the function implementing the Update Action Operation */
+	CrFwInRepUpdateAction_t updateAction;
+	/** The pointer to the function implementing the Validity Check Operation */
+	CrFwInRepValidityCheck_t isValid;
+	/** Component kind key (the product of: service type, service sub-type, and discriminant) */
+	CrFwCmdRepKindKey_t kindKey;
+} CrFwInRepKindDesc_t;
+
+/**
+ * InCommand kind descriptor type.
+ * An application supports a number of InCommand kinds.
+ * An instance of this type describes one of the InCommand kinds supported by an application.
+ */
+typedef struct {
+	/** The service type */
+	CrFwServType_t servType;
+	/** The service sub-type */
+	CrFwServSubType_t servSubType;
+	/** The discriminant value (or zero if no discriminant for this type/sub-type) */
+	CrFwDiscriminant_t discriminant;
+	/** The pointer to the function implementing the Validity Check Operation */
+	CrFwInCmdValidityCheck_t isValid;
+	/** The pointer to the function implementing the Ready Check Operation */
+	CrFwInCmdReadyCheck_t isReady;
+	/** The pointer to the function implementing the Start Action Operation */
+	CrFwInCmdStartAction_t startAction;
+	/** The pointer to the function implementing the Progress Action Operation */
+	CrFwInCmdProgressAction_t progressAction;
+	/** The pointer to the function implementing the Termination Action Operation */
+	CrFwInCmdTerminationAction_t terminationAction;
+	/** The pointer to the function implementing the Abort Action Operation */
+	CrFwInCmdAbortAction_t abortAction;
+} CrFwInCmdKindDesc_t;
+
+/**
+ * OutComponent kind descriptor type.
+ * An application supports a number of OutComponent kinds.
+ * An instance of this type describes one of the OutComponent kinds supported by an application.
+ */
+typedef struct {
+	/** The service type */
+	CrFwServType_t servType;
+	/** The service sub-type */
+	CrFwServSubType_t servSubType;
+	/** The discriminant value (or zero if no discriminant for this type/sub-type) */
+	CrFwDiscriminant_t discriminant;
+	/** The command/report type of the out-going command or report */
+	CrFwCmdRepType_t cmdRepType;
+	/** The length of the packet attached to the OutComponent */
+	CrFwPcktLength_t pcktLength;
+	/** The pointer to the function implementing the Enable Check Operation */
+	CrFwOutCmpEnableCheck_t isEnabled;
+	/** The pointer to the function implementing the Ready Check Operation */
+	CrFwOutCmpReadyCheck_t isReady;
+	/** The pointer to the function implementing the Ready Check Operation */
+	CrFwOutCmpRepeatCheck_t isRepeat;
+	/** The pointer to the function implementing the Update Operation */
+	CrFwOutCmpUpdate_t update;
+	/** The pointer to the function implementing the Serialize Operation */
+	CrFwOutCmpSerialize_t serialize;
+} CrFwOutCmpKindDesc_t;
+
+/**
+ * Service descriptor type.
+ * An application supports a number of service types and, for each service type, it supports
+ * a number of sub-types.
+ * An instance of this type describes one of the [service type, service sub-type] pairs supported
+ * by an application.
+ */
+typedef struct {
+	/** The service type */
+	CrFwServType_t servType;
+	/** The service sub-type */
+	CrFwServSubType_t servSubType;
+	/** The maximum value of the discriminant (or zero if no discriminant for this type/sub-type) */
+	CrFwDiscriminant_t maxDiscriminant;
+	/** Index of the next service type or zero when this is the last service type */
+	CrFwCmdRepIndex_t nextServType;
+	/** The enable state for the service type (see <code>CrFwOutRegistry.h</code>) */
+	CrFwBool_t isServTypeEnabled;
+	/** The enable state for the service sub-type (see <code>CrFwOutRegistry.h</code>) */
+	CrFwBool_t isServSubTypeEnabled;
+	/**
+	 * The enable state for the discriminant values (see <code>CrFwOutRegistry.h</code>).
+	 * This is intended to be an array of bits such that each bit represents a discriminant
+	 * value for the type/sub-type.
+	 * If the bit is equal to 1, the discriminant value is enabled; otherwise it is disabled.
+	 */
+	unsigned char* isDiscriminantEnabled;
+} CrFwServDesc_t;
+
+/** Type for the data describing an InManager */
+typedef struct InManagerData {
+	/** Pending Command/Report List (PCRL) for the InManager. */
+	FwSmDesc_t* pcrl;
+	/** Number of successfully loaded InReports and InCommands  */
+	CrFwCounterU2_t nOfLoadedInCmp;
+	/** Number of InReports and InCommands currently in PCRL */
+	CrFwCounterU1_t nOfInCmpInPcrl;
+	/**
+	 * Next free position in the PCRL.
+	 * This is the position at which the next InReport/InCommand loaded into the InManager
+	 * will be inserted in the PCRL.
+	 * If the PCRL is full, this field is equal to the PCRL size.
+	 */
+	CrFwCounterU1_t nextFreePcrlPos;
+} CrFwInManagerData_t;
+
+/** Type for the data describing an OutManager */
+typedef struct OutManagerData {
+	/** Pending OutComponent List (POCL) for the OutManager. */
+	FwSmDesc_t* pocl;
+	/** Number of successfully loaded OutComponents */
+	CrFwCounterU2_t nOfLoadedOutCmp;
+	/** Number of OutComponents currently in POCL */
+	CrFwCounterU1_t nOfOutCmpInPocl;
+	/**
+	 * Next free position in the POCL.
+	 * This is the position at which the next OutComponent loaded into the OutManager
+	 * will be inserted in the POCL.
+	 * If the POCL is full, this field is equal to the POCL size.
+	 */
+	CrFwCounterU1_t nextFreePoclPos;
+} CrFwOutManagerData_t;
+
+/** Type for the data describing an InLoader */
+typedef struct InLoaderData {
+	/** InStream from which packets are to be retrieved in the next execution cycle. */
+	FwSmDesc_t inStream;
+} CrFwInLoaderData_t;
+
+/** Type for the data describing an InStream */
+typedef struct InStreamData {
+	/** Source associated to the InStream. */
+	CrFwDestSrc_t src;
+	/** Packet queue associated to the InStream. */
+	struct CrFwPcktQueue pcktQueue;
+	/** Array holding sequence counters for the groups associated to the InStream */
+	CrFwSeqCnt_t* seqCnt;
+	/** Function which implements the Packet Collect Operation. */
+	CrFwPcktCollect_t collectPckt;
+	/** Function which implements the Packet Available Check Operation. */
+	CrFwPcktAvailCheck_t isPcktAvail;
+	/** The last packet to have been collected from the middleware */
+	CrFwPckt_t pckt;
+} CrFwInStreamData_t;
+
+/** Type for the data describing an OutStream */
+typedef struct OutStreamData {
+	/** Destination associated to the OutStream. */
+	CrFwDestSrc_t dest;
+	/** Packet queue associated to the OutStream. */
+	struct CrFwPcktQueue pcktQueue;
+	/** Array holding sequence counters for the groups associated to the OutStream */
+	CrFwSeqCnt_t* seqCnt;
+	/** Function which hands over a packet from the OutStream to the middleware. */
+	CrFwPcktHandover_t handoverPckt;
+	/** The packet to be sent out */
+	CrFwPckt_t pckt;
+} CrFwOutStreamData_t;
+
+/** Type for the data describing an InCommand */
+typedef struct InCmdData {
+	/**
+	 * Index of the position in the pool of pre-allocated InCommands in the InFactory
+	 * to which the InComponent has been allocated
+	 */
+	CrFwInFactoryPoolIndex_t factoryPoolIndex;
+	/**
+	 * Index through which an InCommand is tracked by the InRegistry
+	 * (see <code>CrFwInRegistry.h</code>)
+	 */
+	CrFwTrackingIndex_t trackingIndex;
+	/** Function which implements the Configuration Check for the InCommand */
+	CrFwInCmdValidityCheck_t isValid;
+	/** Function which implements the Ready Check for the InCommand */
+	CrFwInCmdReadyCheck_t isReady;
+	/** Function which implements the Start Action for the InCommand */
+	CrFwInCmdStartAction_t startAction;
+	/** Function which implements the Progress Action for the InCommand */
+	CrFwInCmdProgressAction_t progressAction;
+	/** Function which implements the Termination Action for the InCommand */
+	CrFwInCmdTerminationAction_t terminationAction;
+	/** Function which implements the Abort Action for the InCommand */
+	CrFwInCmdAbortAction_t abortAction;
+	/** Packet holding the InCommand */
+	CrFwPckt_t pckt;
+} CrFwInCmdData_t;
+
+/** Type for the data describing an InReport */
+typedef struct InRepData {
+	/**
+	 * Index of the position in the pool of pre-allocated InReports in the InFactory
+	 * to which the InComponent has been allocated
+	 */
+	CrFwInFactoryPoolIndex_t factoryPoolIndex;
+	/**
+	 * Index through which an InReport is tracked by the InRegistry
+	 * (see <code>CrFwInRegistry.h</code>)
+	 */
+	CrFwTrackingIndex_t trackingIndex;
+	/** Function which implements the Validity Check for the InReport */
+	CrFwInRepValidityCheck_t isValid;
+	/** Function which implements the Update Action for the InReport */
+	CrFwInRepUpdateAction_t updateAction;
+	/** Packet holding the InReport */
+	CrFwPckt_t pckt;
+} CrFwInRepData_t;
+
+/** Type for the data describing an OutComponent */
+typedef struct OutCmpData {
+	/** Index of out-going command or report (see <code>CrFwOutRegistry.h</code>) */
+	CrFwCmdRepIndex_t index;
+	/**
+	 * Index of the position in the pool of pre-allocated OutComponents in the OutFactory
+	 * to which the OutComponent has been allocated
+	 */
+	CrFwOutFactoryPoolIndex_t factoryPoolIndex;
+	/**
+	 * Index through which an out-going command or report is tracked by the OutRegistry
+	 * (see <code>CrFwOutRegistry.h</code>)
+	 */
+	CrFwTrackingIndex_t trackingIndex;
+	/** Function which implements the Enable Check for the out-going command or report */
+	CrFwOutCmpEnableCheck_t isEnabled;
+	/** Function which implements the Ready Check for the out-going command or report */
+	CrFwOutCmpReadyCheck_t isReady;
+	/** Function which implements the Repeat Check for the out-going command or report */
+	CrFwOutCmpRepeatCheck_t isRepeat;
+	/** Function which implements the Update Operation for the out-going command or report */
+	CrFwOutCmpUpdate_t update;
+	/** Function which implements the Serialization Operation for the out-going command or report */
+	CrFwOutCmpSerialize_t serialize;
+	/** Packet to which the out-going command or report is serialized */
+	CrFwPckt_t pckt;
+} CrFwOutCmpData_t;
+
+/** Type identifier for the OutStream components */
+#define CR_FW_OUTSTREAM_TYPE 1
+
+/** Type identifier for the InStream components */
+#define CR_FW_INSTREAM_TYPE 2
+
+/** Type identifier for the OutComponent components */
+#define CR_FW_OUTCMP_TYPE 3
+
+/** Type identifier for the OutRegistry component */
+#define CR_FW_OUTREGISTRY_TYPE 4
+
+/** Type identifier for the OutFactory component */
+#define CR_FW_OUTFACTORY_TYPE 5
+
+/** Type identifier for the OutManager component */
+#define CR_FW_OUTMANAGER_TYPE 6
+
+/** Type identifier for the OutLoader component */
+#define CR_FW_OUTLOADER_TYPE 7
+
+/** Type identifier for the InFactory component */
+#define CR_FW_INFACTORY_TYPE 8
+
+/** Type identifier for the InReport component */
+#define CR_FW_INREPORT_TYPE 9
+
+/** Type identifier for the InCommand component */
+#define CR_FW_INCOMMAND_TYPE 10
+
+/** Type identifier for the OutRegistry component */
+#define CR_FW_INREGISTRY_TYPE 11
+
+/** Type identifier for the InManager component */
+#define CR_FW_INMANAGER_TYPE 12
+
+/** Type identifier for the InLoader component */
+#define CR_FW_INLOADER_TYPE 13
+
+/** Type identifier for the Application State Machine */
+#define CR_FW_APP_TYPE 14
+
+/* -------------------------------------------------------------------------------------------------- */
+
+/** Maximum number of transition commands defined on a framework component or framework state machine */
+#define CR_FW_MAX_NOF_TRANS_CMDS 4
+
+/** State identifier for state CREATED in the Base State Machine. */
+#define CR_FW_BASE_STATE_CREATED 1
+
+/** State identifier for state INITIALIZED in the Base State Machine. */
+#define CR_FW_BASE_STATE_INITIALIZED 2
+
+/** State identifier for state CONFIGURED in the Base State Machine. */
+#define CR_FW_BASE_STATE_CONFIGURED 3
+
+/** Identifier for transition command "Init" in the Base State Machine. */
+#define CR_FW_BASE_TR_INIT 1
+
+/** Identifier for transition command "Reset" in the Base State Machine. */
+#define CR_FW_BASE_TR_RESET 2
+
+/** Identifier for transition command "Shutdown" in the Base State Machine. */
+#define CR_FW_BASE_TR_SHUTDOWN 3
+
+/** State identifier for state ACCEPTED in the InCommand State Machine. */
+#define CR_FW_INCMD_STATE_ACCEPTED 1
+
+/** State identifier for state PROGRESS in the InCommand State Machine. */
+#define CR_FW_INCMD_STATE_PROGRESS 2
+
+/** State identifier for state TERMINATED in the InCommand State Machine. */
+#define CR_FW_INCMD_STATE_TERMINATED 3
+
+/** State identifier for state ABORTED in the InCommand State Machine. */
+#define CR_FW_INCMD_STATE_ABORTED 4
+
+/** Identifier for transition command "Terminate" in the InCommand State Machine. */
+#define CR_FW_INCMD_TR_TERMINATE CR_FW_INCOMMAND_TYPE*CR_FW_MAX_NOF_TRANS_CMDS+0
+
+/** State identifier for state WAITING in the InStream State Machine. */
+#define CR_FW_INSTREAM_STATE_WAITING 1
+
+/** State identifier for state PCKT_AVAIL in the InStream State Machine. */
+#define CR_FW_INSTREAM_STATE_PCKT_AVAIL 2
+
+/** Identifier for transition command "GetPacket" in the InStream State Machine. */
+#define CR_FW_INSTREAM_TR_GET_PCKT CR_FW_INSTREAM_TYPE*CR_FW_MAX_NOF_TRANS_CMDS+0
+
+/** Identifier for transition command "PacketAvailable" in the InStream State Machine. */
+#define CR_FW_INSTREAM_TR_PACKET_AVAILABLE CR_FW_INSTREAM_TYPE*CR_FW_MAX_NOF_TRANS_CMDS+1
+
+/** State identifier for state LOADED in the OutComponent State Machine. */
+#define CR_FW_OUTCMP_STATE_LOADED 1
+
+/** State identifier for state ABORTED in the OutComponent State Machine. */
+#define CR_FW_OUTCMP_STATE_ABORTED 2
+
+/** State identifier for state PENDING in the OutComponent State Machine. */
+#define CR_FW_OUTCMP_STATE_PENDING 3
+
+/** State identifier for state TERMINATED the OutComponent State Machine. */
+#define CR_FW_OUTCMP_STATE_TERMINATED 4
+
+/** Identifier for transition command "Terminate" in the OutComponent State Machine. */
+#define CR_FW_OUTCMP_TR_TERMINATE CR_FW_OUTCMP_TYPE*CR_FW_MAX_NOF_TRANS_CMDS+0
+
+/** State identifier for state READY in the OutStream State Machine. */
+#define CR_FW_OUTSTREAM_STATE_READY 1
+
+/** State identifier for state INITIALIZED in the OutStream State Machine. */
+#define CR_FW_OUTSTREAM_STATE_BUFFERING 2
+
+/** Identifier for transition command "Send" in the OutStream State Machine. */
+#define CR_FW_OUTSTREAM_TR_SEND CR_FW_OUTSTREAM_TYPE*CR_FW_MAX_NOF_TRANS_CMDS+0
+
+/** Identifier for transition command "Reset" in the OutStream State Machine. */
+#define CR_FW_OUTSTREAM_TR_CONNECTION_AVAILABLE CR_FW_OUTSTREAM_TYPE*CR_FW_MAX_NOF_TRANS_CMDS+1
+
+#endif /* CRFW_CONSTANTS_H_ */
diff --git a/CrFramework/src/CrFwRepErr.h b/CrFramework/src/CrFwRepErr.h
new file mode 100644
index 0000000..0c6ce88
--- /dev/null
+++ b/CrFramework/src/CrFwRepErr.h
@@ -0,0 +1,157 @@
+/**
+ * @file
+ * @ingroup crOpenIfGroup
+ * Interface for reporting an error detected by a framework component.
+ * When a framework component encounters an error, it reports it by calling one of
+ * the functions defined by this header file (error report).
+ *
+ * An error report is defined by the following attributes:
+ * - The error code: a positive integer which identifies the type of
+ *   error.
+ * - The source type identifier: the type identifier of the component which
+ *   generated the error report.
+ * - The source instance identifier: the instance identifier of the component
+ *   which generated the error report.
+ * - The error parameters: any additional parameters which are useful to
+ *   characterize the circumstances in which the error arose.
+ * .
+ * The type and number of error parameters depends on the type of error which is being
+ * reported.
+ * This interface defines several error reporting functions, one for each set of
+ * error parameter types.
+ *
+ * In general, the implementation of this interface is entirely application-specific
+ * but a simple default implementation is provided in <code>CrFwRepErr.c</code>.
+ * This default implementation is primarily intended for testing and demonstration
+ * purposes.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_REPERR_H_
+#define CRFW_REPERR_H_
+
+/* Include Framework Files */
+#include "CrFwConstants.h"
+/* Include Configuration Files */
+#include "CrFwUserConstants.h"
+
+/**
+ * Report an error which has no parameters attached to it.
+ * This function generate an error report without error parameters.
+ * @param errCode the error code
+ * @param instanceId the instance identifier of the component which raises the error report
+ * @param typeId the type identifier of the component which raises the error report
+ */
+void CrFwRepErr(CrFwRepErrCode_t errCode, CrFwTypeId_t typeId, CrFwInstanceId_t instanceId);
+
+/**
+ * Report an error which has one single parameter attached to it representing a command
+ * or report destination or source.
+ * This function generate an error report with one parameter.
+ * @param errCode the error code
+ * @param instanceId the instance identifier of the component which raises the error report
+ * @param typeId the type identifier of the component which raises the error report
+ * @param destSrc the invalid destination or source
+ */
+void CrFwRepErrDestSrc(CrFwRepErrCode_t errCode, CrFwTypeId_t typeId, CrFwInstanceId_t instanceId,
+                       CrFwDestSrc_t destSrc);
+
+/**
+ * Report an error which has one single parameter attached to it representing a command
+ * or report group.
+ * This function generate an error report with one parameter.
+ * @param errCode the error code
+ * @param instanceId the instance identifier of the component which raises the error report
+ * @param typeId the type identifier of the component which raises the error report
+ * @param group the invalid group
+ */
+void CrFwRepErrGroup(CrFwRepErrCode_t errCode, CrFwTypeId_t typeId, CrFwInstanceId_t instanceId,
+                     CrFwGroup_t group);
+
+/**
+ * Report an error which has two parameters attached to it representing expected and
+ * actual sequence counter values.
+ * This function generate an error report with two parameters.
+ * @param errCode the error code
+ * @param instanceId the instance identifier of the component which raises the error report
+ * @param typeId the type identifier of the component which raises the error report
+ * @param expSeqCnt the expected sequence counter
+ * @param actSeqCnt the actual sequence counter
+ */
+void CrFwRepErrSeqCnt(CrFwRepErrCode_t errCode, CrFwTypeId_t typeId, CrFwInstanceId_t instanceId,
+                      CrFwSeqCnt_t expSeqCnt, CrFwSeqCnt_t actSeqCnt);
+
+/**
+ * Report an error which has two parameters attached to it representing the instance identifier
+ * of a component other than the originator of the error report (the secondary instance
+ * identifier) and the outcome field of a component's data.
+ * This function generate an error report with two parameters.
+ * @param errCode the error code
+ * @param instanceId the instance identifier of the component which raises the error report
+ * @param typeId the type identifier of the component which raises the error report
+ * @param secondaryInstanceId instance identifier of a component other than the originator of the error
+ * report
+ * @param outcome outcome field of a component's data
+ */
+void CrFwRepErrInstanceIdAndOutcome(CrFwRepErrCode_t errCode, CrFwTypeId_t typeId,
+                                    CrFwInstanceId_t instanceId, CrFwInstanceId_t secondaryInstanceId, CrFwOutcome_t outcome);
+
+/**
+ * Report an error which has two parameters attached to it representing the instance identifier
+ * of a component other than the originator of the error report (the secondary instance
+ * identifier) and a command or report destination.
+ * This function generate an error report with two parameters.
+ * @param errCode the error code
+ * @param instanceId the instance identifier of the component which raises the error report
+ * @param typeId the type identifier of the component which raises the error report
+ * @param secondaryInstanceId instance identifier of a component other than the originator of the error
+ * report
+ * @param dest a command or report destination
+ */
+void CrFwRepErrInstanceIdAndDest(CrFwRepErrCode_t errCode, CrFwTypeId_t typeId,
+                                 CrFwInstanceId_t instanceId, CrFwInstanceId_t secondaryInstanceId, CrFwDestSrc_t dest);
+
+/**
+ * Report an error which has one parameter attached to it representing a command or report packet.
+ * This function generate an error report with one parameter.
+ * @param errCode the error code
+ * @param instanceId the instance identifier of the component which raises the error report
+ * @param typeId the type identifier of the component which raises the error report
+ * @param pckt a packet holding a command or report
+ */
+void CrFwRepErrPckt(CrFwRepErrCode_t errCode, CrFwTypeId_t typeId,
+                                    CrFwInstanceId_t instanceId, CrFwPckt_t pckt);
+
+/**
+ * Report an error which has one parameter attached to it representing an report component.
+ * This function generate an error report with one parameter.
+ * @param errCode the error code
+ * @param instanceId the instance identifier of the component which raises the error report
+ * @param typeId the type identifier of the component which raises the error report
+ * @param rep the component holding the report which triggered the error
+ */
+void CrFwRepErrRep(CrFwRepErrCode_t errCode, CrFwTypeId_t typeId,
+                                    CrFwInstanceId_t instanceId, FwSmDesc_t rep);
+
+
+#endif /* CRFW_REPERR_H_ */
diff --git a/CrFramework/src/CrFwRepInCmdOutcome.h b/CrFramework/src/CrFwRepInCmdOutcome.h
new file mode 100644
index 0000000..c41d93e
--- /dev/null
+++ b/CrFramework/src/CrFwRepInCmdOutcome.h
@@ -0,0 +1,162 @@
+/**
+ * @file
+ * @ingroup crOpenIfGroup
+ * Interface for reporting the outcome of the processing of an InCommand.
+ * The InCommand arrives at the framework interface as a packet.
+ * Its processing can have one of the following outcomes:
+ * - Creation Failure: the InCommand cannot be created because there aren't
+ *   enough memory resources
+ * - Acceptance Failure: the command has failed its Acceptance Check
+ * - Acceptance Success: the command has been accepted
+ * - Start Failure: the Start Action of the command has failed
+ * - Start Success: the Start Action of the command has been successful
+ * - Progress Failure: the Progress Action of the command has failed
+ * - Progress Success: the Progress Action of the command has been successful
+ * - Termination Failure: the Termination Action of the command has failed
+ * - Termination Success: the Termination Action of the command has been successful
+ * .
+ * The command outcome is reported either by the InLoader or by the InCommand itself.
+ * This interface declares functions through which these components can report the
+ * outcome of an InCommand.
+ *
+ * The InCommand outcome report generated by the functions declared in this file
+ * is defined by the following attributes:
+ * - The outcome type: a positive integer which identifies the type of
+ *   outcome.
+ * - The instance identifier: the instance identifier of the InCommand whose
+ *   outcome is being reported.
+ * - The service type: the service type of the InCommand whose
+ *   outcome is being reported.
+ * - The service sub-type: the service sub-type of the InCommand whose
+ *   outcome is being reported.
+ * - The discriminant: the discriminant of the InCommand whose
+ *   outcome is being reported.
+ * - The failure code: an integer parameter which identifies the type of failure
+ *   (only applicable for 'failed' outcomes).
+ * - The InCommand component representing the command whose outcome is being reported
+ * - The packet carrying the InCommand (only for the case that the InCommand could not
+ *   be created).
+ * .
+ * In general, the implementation of this interface is entirely application-specific
+ * but a simple default implementation is provided in <code>CrFwInCmdOutcome.c</code>.
+ * This default implementation is primarily intended for testing and demonstration
+ * purposes.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_REPINCMDOUTCOME_H_
+#define CRFW_REPINCMDOUTCOME_H_
+
+/* Include Framework Files */
+#include "CrFwConstants.h"
+/* Include Configuration Files */
+#include "CrFwUserConstants.h"
+
+/**
+ * Enumerated type for the outcome of the processing of an incoming command.
+ * An incoming command goes through several processing stages.
+ * At the end of each stage, an outcome report is generated by either function
+ * <code>::CrFwRepInCmdOutcome</code> or <code>::CrFwRepInCmdOutcomeCreFail</code>.
+ * The outcome of the processing of the incoming command is determined as follows:
+ * - The InLoader (see <code>CrFwBaseCmp.h</code>) receives the packet encapsulating the
+ *   incoming command and attempts to create an InCommand component to hold the command.
+ *   If the attempt fails (either because there are not enough resources to build the
+ *   InCommand or because its type/sub-type/discriminant are not recognized), the
+ *   processing of the InCommand is terminated with outcome "Creation Failure"
+ * - If the InCommand was successfully created, the InLoader checks whether the InCommand
+ *   was successfully configured. If this is not the case (because its content was invalid),
+ *   its processing is terminated with outcome "Acceptance Failure".
+ * - If the InCommand was successfully configured, the InLoader attempts to load it in an
+ *   InManager (see <code>CrFwInManager.h</code>). If the load operation fails, the
+ *   processing of the InCommand is terminaed with outcome "Load Failure".
+ *   If, instead, the load operation succeeds, the outcome report "Acceptance Success"
+ *   is generated.
+ * - When the execution of the InCommand starts, the InCommand performs a Start Check
+ *   for the InCommand (see <code>CrFwInCmd.h</code>). Depending on the success or failure
+ *   of this Start Check, an outcome of either "Start Success" or "Start Failure" is generated
+ *   by the InCommand component.
+ * - When the execution of a step of the InCommand is completed, an outcome of either
+ *   "Progress Success" or "Progress Failure" is generated by the InCommand component.
+ * - When the execution of a the InCommand has terminated, an outcome of either
+ *   "Termination Success" or "Termination Failure" is generated by the InCommand component.
+ * .
+ */
+typedef enum {
+	/** Acceptance failure */
+	crCmdAckAccFail = 1,
+	/** Acceptance success */
+	crCmdAckAccSucc = 2,
+	/** Start failure */
+	crCmdAckStrFail = 3,
+	/** Start success */
+	crCmdAckStrSucc = 4,
+	/** Progress failure */
+	crCmdAckPrgFail = 5,
+	/** Progress success */
+	crCmdAckPrgSucc = 6,
+	/** Termination failure */
+	crCmdAckTrmFail = 7,
+	/** Termination success */
+	crCmdAckTrmSucc = 8,
+	/** Creation failure */
+	crCmdAckCreFail = 9,
+	/** Load failure */
+	crCmdAckLdFail = 10
+} CrFwRepInCmdOutcome_t;
+
+/**
+ * Report the outcome of the processing of an InCommand.
+ * The last parameter of this function is the InCommand whose outcome is being reported.
+ * This is a pointer variable. The owner of the pointer is the caller of the function.
+ * The function can use it in read-only mode to access the values of the command parameters.
+ *
+ * @param outcome the outcome of the InCommand processing
+ * @param instanceId the instance identifier of the InCommand
+ * @param servType the service type of the InCommand
+ * @param servSubType the service sub-type of the InCommand
+ * @param disc the discriminant of the InCommand
+ * @param failCode the failure code (don't care in case of a "successful" outcome)
+ * @param inCmd the InCommand component whose outcome is being reported
+ */
+void CrFwRepInCmdOutcome(CrFwRepInCmdOutcome_t outcome, CrFwInstanceId_t instanceId, CrFwServType_t servType,
+                         CrFwServSubType_t servSubType, CrFwDiscriminant_t disc, CrFwOutcome_t failCode, FwSmDesc_t inCmd);
+
+/**
+ * Report the a "creation failure" outcome for the processing of a packet carrying an InCommand.
+ * The "creation failure" outcome is declared when a packet carrying an InCommand is received
+ * but it is not possible to create an InCommand component to encapsulate it.
+ * The failure to create the InCommand may be due either to a lack of resources in the application or to
+ * the fact that the command kind as given by its [type, sub-type, discriminant] is illegal.
+ * The last parameter of this function is the packet which carries the incoming command for which no InCommand
+ * component could be created.
+ * This is a pointer variable. The owner of the pointer is the caller of the function.
+ * The function can use it in read-only mode to access the values of the command parameters.
+ *
+ * @param outcome the outcome of the packet processing (always equal to crCmdAckCreFail in
+ *                this version of the framework)
+ * @param failCode the failure code
+ * @param pckt the packet carrying the InCommand
+ */
+void CrFwRepInCmdOutcomeCreFail(CrFwRepInCmdOutcome_t outcome, CrFwOutcome_t failCode, CrFwPckt_t pckt);
+
+#endif /* CRFW_REPINCMDOUTCOME_H_ */
diff --git a/CrFramework/src/CrFwTime.h b/CrFramework/src/CrFwTime.h
new file mode 100644
index 0000000..93812a6
--- /dev/null
+++ b/CrFramework/src/CrFwTime.h
@@ -0,0 +1,50 @@
+/**
+ * @file
+ * @ingroup crOpenIfGroup
+ * Interface through which framework components access the current time.
+ * Framework component need access to the current time to time-stamp out-going
+ * command and report packets.
+ *
+ * The implementation of this interface is entirely application-specific.
+ * A simple default implementation is provided in <code>CrFwTime.c</code>.
+ * This default implementation is primarily intended for testing and demonstration
+ * purposes.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_TIME_H_
+#define CRFW_TIME_H_
+
+/* Include Framework Files */
+#include "CrFwConstants.h"
+/* Include Configuration Files */
+#include "CrFwUserConstants.h"
+
+/**
+ * Return the current time.
+ * This function generate an error report without error parameters.
+ * @return the current time.
+ */
+CrFwTimeStamp_t CrFwGetCurrentTime();
+
+#endif /* CRFW_TIME_H_ */
diff --git a/CrFramework/src/InCmd/CrFwInCmd.c b/CrFramework/src/InCmd/CrFwInCmd.c
new file mode 100644
index 0000000..b6c7941
--- /dev/null
+++ b/CrFramework/src/InCmd/CrFwInCmd.c
@@ -0,0 +1,413 @@
+/**
+ * @file
+ * @ingroup inCmdGroup
+ * Implementation of OutComponent component.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include <stdlib.h>
+/* Include configuration files */
+#include "CrFwCmpData.h"
+/* Include framework files */
+#include "CrFwConstants.h"
+#include "CrFwRepErr.h"
+#include "UtilityFunctions/CrFwUtilityFunctions.h"
+#include "OutStream/CrFwOutStream.h"
+#include "OutCmp/CrFwOutCmp.h"
+#include "BaseCmp/CrFwBaseCmp.h"
+#include "BaseCmp/CrFwInitProc.h"
+#include "BaseCmp/CrFwResetProc.h"
+#include "BaseCmp/CrFwDummyExecProc.h"
+#include "OutFactory/CrFwOutFactory.h"
+#include "Pckt/CrFwPckt.h"
+#include "CrFwRepInCmdOutcome.h"
+/* Include FW Profile files */
+#include "FwPrConfig.h"
+#include "FwPrDCreate.h"
+#include "FwSmConfig.h"
+#include "FwSmDCreate.h"
+#include "FwPrCore.h"
+
+/** Base OutComponent from which all other InCommands are derived. */
+static FwSmDesc_t baseInCmdSmDesc = NULL;
+
+/**
+ * Entry action in state ABORTED.
+ * @param smDesc the descriptor of the InCommand state machine
+ */
+static void DoAbortAction(FwSmDesc_t smDesc);
+
+/**
+ * Entry and do action in state PROGRESS.
+ * @param smDesc the descriptor of the InCommand state machine
+ */
+static void DoProgressAction(FwSmDesc_t smDesc);
+
+/**
+ * Transition action on the transition from ACCEPTED to CPS1.
+ * @param smDesc the descriptor of the InCommand state machine
+ */
+static void DoStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Transition action on the transition from PROGRESS to CPS2.
+ * @param smDesc the descriptor of the InCommand state machine
+ */
+static void DoTerminationAction(FwSmDesc_t smDesc);
+
+/**
+ * Transition action on the transition from CPS1 to ABORTED which
+ * reports the failure of the Start Action.
+ * @param smDesc the descriptor of the InCommand state machine
+ */
+static void ReportStartFailed(FwSmDesc_t smDesc);
+
+/**
+ * Transition action on the transition from CPS2 to ABORTED which
+ * reports the failure of the Termination Action.
+ * @param smDesc the descriptor of the InCommand state machine
+ */
+static void ReportTerminationFailed(FwSmDesc_t smDesc);
+
+/**
+ * Transition action on the transition from CPS3 to ABORTED which
+ * reports the failure of the Progress Action.
+ * @param smDesc the descriptor of the InCommand state machine
+ */
+static void ReportProgressFailed(FwSmDesc_t smDesc);
+
+/**
+ * Transition action on the transition from CPS1 to PROGRESS.
+ * @param smDesc the descriptor of the InCommand state machine
+ */
+static void ReportStartSuccess(FwSmDesc_t smDesc);
+
+/**
+ * Transition action on the transition from CPS2 to TERMINATED.
+ * @param smDesc the descriptor of the InCommand state machine
+ */
+static void ReportTerminationSuccess(FwSmDesc_t smDesc);
+
+/**
+ * Guard on the transition from ACCEPTED to CPS1.
+ * @param smDesc the descriptor of the InCommand state machine
+ * @return the value of the Ready Check Operation of the InCommand
+ */
+static FwSmBool_t IsReady(FwSmDesc_t smDesc);
+
+/**
+ * Guard on transition from PROGRESS to ABORTED.
+ * @param smDesc the descriptor of the InCommand state machine
+ * @return 1 if the <code>outcome</code> field is different from 1 and 2; false otherwise.
+ */
+static FwSmBool_t IsSmOutcomeNotTwo(FwSmDesc_t smDesc);
+
+/* --------------------------------------------------------------------------------- */
+FwSmDesc_t CrFwInCmdMakeBase() {
+	FwSmCounterS1_t nOfStates = 4;				/* Number of states */
+	FwSmCounterS1_t nOfChoicePseudoStates = 2;	/* Number of choice pseudo-states */
+	FwSmCounterS1_t nOfTrans = 8;				/* Number of transitions */
+	FwSmCounterS1_t nOfActions = 9;				/* Number of actions */
+	FwSmCounterS1_t nOfGuards = 4;				/* Number of guards */
+	FwSmCounterS1_t CPS_1 = 1;					/* Identifier of first choice pseudo-state */
+	FwSmCounterS1_t CPS_2 = 2;					/* Identifier of second choice pseudo-state */
+	FwSmDesc_t esm;
+
+	if (baseInCmdSmDesc != NULL)
+		return baseInCmdSmDesc;
+
+	/* Create and configure the base InCommand */
+
+	/* Extend the Base Component */
+	baseInCmdSmDesc = FwSmCreateDer(CrFwBaseCmpMake());
+	/* Create the InCommand SM and then embed it in state CONFIGURED of the Base Component */
+	esm = FwSmCreate(nOfStates, nOfChoicePseudoStates, nOfTrans, nOfActions, nOfGuards);
+	FwSmAddState(esm, CR_FW_INCMD_STATE_ACCEPTED, 1, NULL, NULL, NULL, NULL);
+	FwSmAddState(esm, CR_FW_INCMD_STATE_PROGRESS, 2, &DoProgressAction, NULL, &DoProgressAction, NULL);
+	FwSmAddState(esm, CR_FW_INCMD_STATE_TERMINATED, 0, NULL, NULL, NULL, NULL);
+	FwSmAddState(esm, CR_FW_INCMD_STATE_ABORTED, 0, &DoAbortAction, NULL, NULL, NULL);
+	FwSmAddChoicePseudoState(esm, CPS_1, 2);
+	FwSmAddChoicePseudoState(esm, CPS_2, 2);
+	FwSmAddTransIpsToSta(esm, CR_FW_INCMD_STATE_ACCEPTED, NULL);
+	FwSmAddTransStaToCps(esm, FW_TR_EXECUTE, CR_FW_INCMD_STATE_ACCEPTED, CPS_1,
+	                     &DoStartAction, &IsReady);
+	FwSmAddTransCpsToSta(esm, CPS_1, CR_FW_INCMD_STATE_PROGRESS, &ReportStartSuccess, &CrFwIsSmOutcomeOne);
+	FwSmAddTransCpsToSta(esm, CPS_1, CR_FW_INCMD_STATE_ABORTED, &ReportStartFailed, NULL);	/* Else Guard */
+	FwSmAddTransStaToCps(esm, CR_FW_INCMD_TR_TERMINATE, CR_FW_INCMD_STATE_PROGRESS, CPS_2,
+	                     &DoTerminationAction, &CrFwIsSmOutcomeOne);
+	FwSmAddTransStaToSta(esm, CR_FW_INCMD_TR_TERMINATE, CR_FW_INCMD_STATE_PROGRESS, CR_FW_INCMD_STATE_ABORTED,
+	                     &ReportProgressFailed, &IsSmOutcomeNotTwo);
+	FwSmAddTransCpsToSta(esm, CPS_2, CR_FW_INCMD_STATE_TERMINATED, &ReportTerminationSuccess, &CrFwIsSmOutcomeOne);
+	FwSmAddTransCpsToSta(esm, CPS_2, CR_FW_INCMD_STATE_ABORTED, &ReportTerminationFailed, NULL);	/* Else Guard */
+
+	FwSmEmbed(baseInCmdSmDesc, CR_FW_BASE_STATE_CONFIGURED, esm);
+	return baseInCmdSmDesc;
+}
+
+/* --------------------------------------------------------------------------------- */
+void CrFwInCmdTerminate(FwSmDesc_t smDesc) {
+	FwSmMakeTrans(smDesc, CR_FW_INCMD_TR_TERMINATE);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwBool_t CrFwInCmdIsInAccepted(FwSmDesc_t smDesc) {
+	return (FwSmGetCurStateEmb(smDesc) == CR_FW_INCMD_STATE_ACCEPTED);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwBool_t CrFwInCmdIsInProgress(FwSmDesc_t smDesc) {
+	return (FwSmGetCurStateEmb(smDesc) == CR_FW_INCMD_STATE_PROGRESS);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwBool_t CrFwInCmdIsInTerminated(FwSmDesc_t smDesc) {
+	return (FwSmGetCurStateEmb(smDesc) == CR_FW_INCMD_STATE_TERMINATED);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwBool_t CrFwInCmdIsInAborted(FwSmDesc_t smDesc) {
+	return (FwSmGetCurStateEmb(smDesc) == CR_FW_INCMD_STATE_ABORTED);
+}
+
+/* --------------------------------------------------------------------------------- */
+void CrFwInCmdConfigCheck(FwPrDesc_t prDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+
+	if (cmpSpecificData->isValid(prDesc) == 1)
+		cmpData->outcome = 1;
+	else
+		cmpData->outcome = 0;
+}
+
+/* --------------------------------------------------------------------------------- */
+FwSmCounterU3_t CrFwInCmdGetProgressStep(FwSmDesc_t smDesc) {
+	if (FwSmGetCurStateEmb(smDesc) == CR_FW_INCMD_STATE_PROGRESS)
+		return FwSmGetStateExecCnt(smDesc);
+	else
+		return 0;
+}
+
+
+/* --------------------------------------------------------------------------------- */
+FwSmBool_t IsReady(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+	return cmpSpecificData->isReady(smDesc);
+}
+
+/* --------------------------------------------------------------------------------- */
+void ReportTerminationFailed(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+
+	CrFwRepInCmdOutcome(crCmdAckTrmFail, cmpData->instanceId,
+	                    CrFwPcktGetServType(cmpSpecificData->pckt),
+	                    CrFwPcktGetServSubType(cmpSpecificData->pckt),
+	                    CrFwPcktGetDiscriminant(cmpSpecificData->pckt),
+	                    cmpData->outcome, smDesc);
+}
+
+/* --------------------------------------------------------------------------------- */
+void ReportStartFailed(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+
+	CrFwRepInCmdOutcome(crCmdAckStrFail, cmpData->instanceId,
+	                    CrFwPcktGetServType(cmpSpecificData->pckt),
+	                    CrFwPcktGetServSubType(cmpSpecificData->pckt),
+	                    CrFwPcktGetDiscriminant(cmpSpecificData->pckt),
+	                    cmpData->outcome, smDesc);
+}
+
+/* --------------------------------------------------------------------------------- */
+void ReportProgressFailed(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+
+	CrFwRepInCmdOutcome(crCmdAckPrgFail, cmpData->instanceId,
+	                    CrFwPcktGetServType(cmpSpecificData->pckt),
+	                    CrFwPcktGetServSubType(cmpSpecificData->pckt),
+	                    CrFwPcktGetDiscriminant(cmpSpecificData->pckt),
+	                    cmpData->outcome, smDesc);
+}
+
+/* --------------------------------------------------------------------------------- */
+void ReportStartSuccess(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+
+	if (CrFwPcktIsStartAck(cmpSpecificData->pckt) == 1)
+		CrFwRepInCmdOutcome(crCmdAckStrSucc, cmpData->instanceId,
+		                    CrFwPcktGetServType(cmpSpecificData->pckt),
+		                    CrFwPcktGetServSubType(cmpSpecificData->pckt),
+		                    CrFwPcktGetDiscriminant(cmpSpecificData->pckt),
+		                    cmpData->outcome, smDesc);
+}
+
+/* --------------------------------------------------------------------------------- */
+void ReportTerminationSuccess(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+
+	if (CrFwPcktIsTermAck(cmpSpecificData->pckt) == 1)
+		CrFwRepInCmdOutcome(crCmdAckTrmSucc, cmpData->instanceId,
+		                    CrFwPcktGetServType(cmpSpecificData->pckt),
+		                    CrFwPcktGetServSubType(cmpSpecificData->pckt),
+		                    CrFwPcktGetDiscriminant(cmpSpecificData->pckt),
+		                    cmpData->outcome, smDesc);
+}
+
+/* --------------------------------------------------------------------------------- */
+static void DoAbortAction(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+	cmpSpecificData->abortAction(smDesc);
+}
+
+/* --------------------------------------------------------------------------------- */
+static void DoProgressAction(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+
+	cmpSpecificData->progressAction(smDesc);
+	if (cmpData->outcome != 1)
+		if (cmpData->outcome != 2)
+			return;		/* The Progress Action has failed */
+
+	if (CrFwPcktIsProgressAck(cmpSpecificData->pckt) == 1)
+		CrFwRepInCmdOutcome(crCmdAckPrgSucc, cmpData->instanceId,
+		                    CrFwPcktGetServType(cmpSpecificData->pckt),
+		                    CrFwPcktGetServSubType(cmpSpecificData->pckt),
+		                    CrFwPcktGetDiscriminant(cmpSpecificData->pckt),
+		                    cmpData->outcome, smDesc);
+}
+
+/* --------------------------------------------------------------------------------- */
+static void DoStartAction(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+
+	cmpSpecificData->startAction(smDesc);
+}
+
+/* --------------------------------------------------------------------------------- */
+static void DoTerminationAction(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+
+	cmpSpecificData->terminationAction(smDesc);
+}
+
+/* --------------------------------------------------------------------------------- */
+static FwSmBool_t IsSmOutcomeNotTwo(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	if (cmpData->outcome != 2)
+		return 1;
+
+	return 0;
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwDestSrc_t CrFwInCmdGetSrc(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktGetSrc(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwGroup_t CrFwInCmdGetGroup(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktGetGroup(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwServType_t CrFwInCmdGetServType(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktGetServType(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwServType_t CrFwInCmdGetServSubType(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktGetServSubType(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwDiscriminant_t CrFwInCmdGetDiscriminant(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktGetDiscriminant(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwBool_t CrFwInCmdIsAcceptAck(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktIsAcceptAck(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwBool_t CrFwInCmdIsStartAck(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktIsStartAck(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwBool_t CrFwInCmdIsProgressAck(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktIsProgressAck(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwBool_t CrFwInCmdIsTermAck(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktIsTermAck(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwSeqCnt_t CrFwInCmdGetSeqCnt(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktGetSeqCnt(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+char* CrFwInCmdGetParStart(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktGetParStart(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwPcktLength_t CrFwInCmdGetParLength(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktGetParLength(cmpSpecificData->pckt);
+}
diff --git a/CrFramework/src/InCmd/CrFwInCmd.h b/CrFramework/src/InCmd/CrFwInCmd.h
new file mode 100644
index 0000000..fd8b54f
--- /dev/null
+++ b/CrFramework/src/InCmd/CrFwInCmd.h
@@ -0,0 +1,244 @@
+/**
+ * @file
+ * @ingroup inMngGroup
+ * Definition of the InCommand Component of the framework.
+ *
+ * An InCommand encapsulates an incoming command in a service provider application.
+ * The InCommand is responsible for storing the attributes of an incoming command
+ * and for executing the conditional checks and actions associated to the command.
+ * The behaviour of an InCommand is defined by the InCommand State Machine
+ * (see figure below) embedded within state CONFIGURED of a Base Component State
+ * Machine.
+ *
+ * <b>Mode of Use of an InCommand Component</b>
+ *
+ * InCommands are created dynamically by the InLoader when it processes an incoming
+ * packet which holds a command.
+ * The InCommand component is created through a call to the factory function
+ * <code>::CrFwInFactoryMakeInCmd</code>.
+ * The InLoader loads the InCommand into an InManager who is then responsible for
+ * executing it and, eventually, for returning it to the InFactory.
+ *
+ * An InCommand encapsulates an incoming command of a certain kind.
+ * The "kind" of an incoming command is defined by the triplet:
+ * [service type, service sub-type, discriminant].
+ * InCommands are adapted to a certain incoming command kind by modifying one
+ * or more of the following:
+ * - The Validity Check Operation
+ * - The Ready Check Operation
+ * - The Start Action Operation
+ * - The Progress Action Operation
+ * - The Termination Action Operation
+ * - The Abort Action Operation
+ * .
+ * These operations are statically defined for each kind of InCommand in
+ * <code>CrFwInFactoryUserPar.h</code>.
+ *
+ * This header file defines default values for all configurable operations listed
+ * above with the exception of the Configuration Check Operation for which the
+ * default is the function <code>::CrFwBaseCmpDefConfigCheck</code>.
+ *
+ * @image html InCommand.png
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_INCMD_H_
+#define CRFW_INCMD_H_
+
+/* Include FW Profile files */
+#include "FwSmConstants.h"
+#include "FwPrConstants.h"
+/* Include configuration files */
+#include "Pckt/CrFwPcktQueue.h"
+#include "CrFwUserConstants.h"
+/* Include framework files */
+#include "CrFwConstants.h"
+
+/**
+ * Return the base InCommand from which all other InCommands are derived.
+ * The base InCommand is a singleton.
+ * The first time it is called, this function creates and configures the base InCommand instance.
+ * Subsequent calls return this same instance.
+ * This function is only intended to be used by the InFactory (see <code>CrFwInFactory.h</code>)
+ * and should not be used by applications.
+ * @return the singleton instance of the base InCommand
+ */
+FwSmDesc_t CrFwInCmdMakeBase();
+
+/**
+ * Send command Terminate to the argument InCommand.
+ * @param smDesc the descriptor of the Base State Machine of the InCommand
+ */
+void CrFwInCmdTerminate(FwSmDesc_t smDesc);
+
+/**
+ * Return true if the argument InCommand is in state ACCEPTED.
+ * @param smDesc the descriptor of the Base State Machine of the InCommand
+ * @return 1 if the argument InCommand is in state CONFIGURED, sub-state
+ * ACCEPTED; 0 otherwise
+ */
+CrFwBool_t CrFwInCmdIsInAccepted(FwSmDesc_t smDesc);
+
+/**
+ * Return true if the argument InCommand is in state PROGRESS.
+ * @param smDesc the descriptor of the Base State Machine of the InCommand
+ * @return 1 if the argument InCommand is in state CONFIGURED, sub-state
+ * PROGRESS; 0 otherwise
+ */
+CrFwBool_t CrFwInCmdIsInProgress(FwSmDesc_t smDesc);
+
+/**
+ * Return true if the argument InCommand is in state TERMINATED.
+ * @param smDesc the descriptor of the Base State Machine of the InCommand
+ * @return 1 if the argument InCommand is in state CONFIGURED, sub-state
+ * TERMINATED; 0 otherwise
+ */
+CrFwBool_t CrFwInCmdIsInTerminated(FwSmDesc_t smDesc);
+
+/**
+ * Return true if the argument InCommand is in state ABORTED.
+ * @param smDesc the descriptor of the Base State Machine of the InCommand
+ * @return 1 if the argument InCommand is in state CONFIGURED, sub-state
+ * ABORTED; 0 otherwise
+ */
+CrFwBool_t CrFwInCmdIsInAborted(FwSmDesc_t smDesc);
+
+/**
+ * Configuration check for an InCommand.
+ * This function executes the Validity Check of the InCommand and sets the
+ * action outcome to 1 if the Validity Check returns true and sets it to
+ * zero if it returns false.
+ * This function is only intended to be used by the InFactory (see <code>CrFwInFactory.h</code>)
+ * and should not be used by applications.
+ * @param prDesc the descriptor of the InCommand Configuration Procedure
+ */
+void CrFwInCmdConfigCheck(FwPrDesc_t prDesc);
+
+/**
+ * Return the progress step of the InCommand.
+ * The progress step is equal to zero if the InCommand is in a state other than PROGRESS
+ * and is equal to the number of progress steps executed so far if the InCommand
+ * is in state PROGRESS.
+ * @param smDesc the descriptor of the Base State Machine of the InCommand
+ * @return the progress step
+ */
+FwSmCounterU3_t CrFwInCmdGetProgressStep(FwSmDesc_t smDesc);
+
+/**
+ * Return the source of the InCommand.
+ * @param smDesc the descriptor of the Base State Machine of the InCommand
+ * @return the source of the InCommand
+ */
+CrFwDestSrc_t CrFwInCmdGetSrc(FwSmDesc_t smDesc);
+
+/**
+ * Return the group of the InCommand.
+ * @param smDesc the descriptor of the Base State Machine of the InCommand
+ * @return the group of the InCommand
+ */
+CrFwGroup_t CrFwInCmdGetGroup(FwSmDesc_t smDesc);
+
+/**
+ * Return the type of the InCommand.
+ * @param smDesc the descriptor of the Base State Machine of the InCommand
+ * @return the type of the InCommand
+ */
+CrFwServType_t CrFwInCmdGetServType(FwSmDesc_t smDesc);
+
+/**
+ * Return the sub-type of the InCommand.
+ * @param smDesc the descriptor of the Base State Machine of the InCommand
+ * @return the sub-type of the InCommand
+ */
+CrFwServType_t CrFwInCmdGetServSubType(FwSmDesc_t smDesc);
+
+/**
+ * Return the discriminant of the InCommand.
+ * @param smDesc the descriptor of the Base State Machine of the InCommand
+ * @return the discriminant of the InCommand
+ */
+CrFwDiscriminant_t CrFwInCmdGetDiscriminant(FwSmDesc_t smDesc);
+
+/**
+ * Return the acknowledge level for command acceptance for the command encapsulated in the
+ * InCommand.
+ * @param smDesc the descriptor of the Base State Machine of the InCommand
+ * @return 1 if command acceptance is to be acknowledged, 0 otherwise.
+ */
+CrFwBool_t CrFwInCmdIsAcceptAck(FwSmDesc_t smDesc);
+
+/**
+ * Return the acknowledge level for command start for the command encapsulated in the
+ * InCommand.
+ * @param smDesc the descriptor of the Base State Machine of the InCommand
+ * @return 1 if command start is to be acknowledged, 0 otherwise.
+ */
+CrFwBool_t CrFwInCmdIsStartAck(FwSmDesc_t smDesc);
+
+/**
+ * Return the acknowledge level for command progress for the command encapsulated in the
+ * InCommand.
+ * @param smDesc the descriptor of the Base State Machine of the InCommand
+ * @return 1 if command progress is to be acknowledged, 0 otherwise.
+ */
+CrFwBool_t CrFwInCmdIsProgressAck(FwSmDesc_t smDesc);
+
+/**
+ * Return the acknowledge level for command termination for the command encapsulated in the
+ * InCommand.
+ * @param smDesc the descriptor of the Base State Machine of the InCommand
+ * @return 1 if command termination is to be acknowledged, 0 otherwise.
+ */
+CrFwBool_t CrFwInCmdIsTermAck(FwSmDesc_t smDesc);
+
+/**
+ * Return the sequence counter of the InCommand.
+ * @param smDesc the descriptor of the Base State Machine of the InCommand
+ * @return the sequence counter of the InCommand
+ */
+CrFwSeqCnt_t CrFwInCmdGetSeqCnt(FwSmDesc_t smDesc);
+
+/**
+ * Return the start address of the parameter area of the InCommand.
+ * The InCommand is encapsulated in a packet.
+ * The parameter area of the InCommand is the part of the packet which is reserved to the
+ * storage of the parameters of the InCommand.
+ * The parameter area consists of an uninterrupted sequence of bytes.
+ * The size of the parameter area is returned by function <code>::CrFwInCmdGetParLength</code>.
+ * @param smDesc the descriptor of the Base State Machine of the InCommand
+ * @return the start address of the InCommand parameter area.
+ */
+char* CrFwInCmdGetParStart(FwSmDesc_t smDesc);
+
+/**
+ * Return the length in bytes of the parameter area of the InCommand.
+ * The InCommand is encapsulated in a packet.
+ * The parameter area of the InCommand is the part of the packet which is reserved to the
+ * storage of the parameters of the InCommand.
+ * The parameter area consists of an uninterrupted sequence of bytes.
+ * The start address of the parameter area is returned by function <code>::CrFwInCmdGetParStart</code>.
+ * @param smDesc the descriptor of the Base State Machine of the InCommand
+ * @return the length in bytes of the InCommand parameter area
+ */
+CrFwPcktLength_t CrFwInCmdGetParLength(FwSmDesc_t smDesc);
+
+#endif /* CRFW_INCMD_H_ */
diff --git a/CrFramework/src/InFactory/CrFwInFactory.c b/CrFramework/src/InFactory/CrFwInFactory.c
new file mode 100644
index 0000000..5a9d4d8
--- /dev/null
+++ b/CrFramework/src/InFactory/CrFwInFactory.c
@@ -0,0 +1,547 @@
+/**
+ * @file
+ *
+ * Implementation of InFactory component.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include <stdlib.h>
+/* Include configuration files */
+#include "CrFwInFactoryUserPar.h"
+#include "CrFwCmpData.h"
+/* Include framework files */
+#include "CrFwConstants.h"
+#include "UtilityFunctions/CrFwUtilityFunctions.h"
+#include "OutCmp/CrFwOutCmp.h"
+#include "BaseCmp/CrFwBaseCmp.h"
+#include "BaseCmp/CrFwInitProc.h"
+#include "BaseCmp/CrFwResetProc.h"
+#include "BaseCmp/CrFwDummyExecProc.h"
+#include "Pckt/CrFwPckt.h"
+#include "InCmd/CrFwInCmd.h"
+#include "InRep/CrFwInRep.h"
+#include "InRep/CrFwInRepExecProc.h"
+#include "InRegistry/CrFwInRegistry.h"
+#include "CrFwInFactory.h"
+/* Include FW Profile files */
+#include "FwPrConfig.h"
+#include "FwPrDCreate.h"
+#include "FwSmConfig.h"
+#include "FwSmCore.h"
+#include "FwSmDCreate.h"
+#include "FwPrCore.h"
+
+/** Array holding the keys of the InCommand kinds */
+static CrFwCmdRepKindKey_t inCmdKindKey[CR_FW_INCMD_NKINDS];
+
+/** Array holding the keys of the InReport kinds */
+static CrFwCmdRepKindKey_t inRepKindKey[CR_FW_INREP_NKINDS];
+
+/** Array of InCommand service descriptors (see <code>CrFwServDesc_t</code>). */
+static CrFwInCmdKindDesc_t inCmdKindDesc[CR_FW_INCMD_NKINDS] = CR_FW_INCMD_INIT_KIND_DESC;
+
+/** Array of InReport service descriptors (see <code>CrFwServDesc_t</code>). */
+static CrFwInRepKindDesc_t inRepKindDesc[CR_FW_INREP_NKINDS] = CR_FW_INREP_INIT_KIND_DESC;
+
+/** The pre-allocated InCommand instances */
+static FwSmDesc_t inCmd[CR_FW_INFACTORY_MAX_NOF_INCMD];
+
+/** The pre-allocated InReport instances */
+static FwSmDesc_t inRep[CR_FW_INFACTORY_MAX_NOF_INREP];
+
+/** The base data for the pre-allocated InCommand instances */
+static CrFwCmpData_t inCmdData[CR_FW_INFACTORY_MAX_NOF_INCMD];
+
+/** The component-specific data for the pre-allocated InCommand instances */
+static CrFwInCmdData_t inCmdCmpSpecificData[CR_FW_INFACTORY_MAX_NOF_INCMD];
+
+/** The base data for the pre-allocated InReport instances */
+static CrFwCmpData_t inRepData[CR_FW_INFACTORY_MAX_NOF_INREP];
+
+/** The component-specific data for the pre-allocated InReport instances */
+static CrFwInRepData_t inRepCmpSpecificData[CR_FW_INFACTORY_MAX_NOF_INREP];
+
+/** The in-use status of each pre-allocated InReport instance */
+static CrFwBool_t inRepInUse[CR_FW_INFACTORY_MAX_NOF_INREP];
+
+/** The in-use status of each pre-allocated InCommand instance */
+static CrFwBool_t inCmdInUse[CR_FW_INFACTORY_MAX_NOF_INCMD];
+
+/** The number of currently allocated InCommands */
+static CrFwInFactoryPoolIndex_t nOfAllocatedInCmd;
+
+/** The number of currently allocated InReports */
+static CrFwInFactoryPoolIndex_t nOfAllocatedInRep;
+
+/**
+ * The index of the next free position in the pool of pre-allocated InCommands
+ * instances (a value of <code>#CR_FW_INFACTORY_MAX_NOF_INCMD</code> indicates that all InCommand
+ * instances have been allocated and there are no free positions left) */
+static CrFwInFactoryPoolIndex_t nextInCmdFreePos;
+
+/**
+ * The index of the next free position in the pool of pre-allocated InReports
+ * instances (a value of <code>#CR_FW_INFACTORY_MAX_NOF_INREP</code> indicates that all InReport
+ * instances have been allocated and there are no free positions left) */
+static CrFwInFactoryPoolIndex_t nextInRepFreePos;
+
+/** The total number of InCommands or InCommand allocated since the InFactory was reset */
+static CrFwInstanceId_t nOfAllocatedInCmdSinceReset = 0;
+
+/** The total number of InReports or InCommand allocated since the InFactory was reset */
+static CrFwInstanceId_t nOfAllocatedInRepSinceReset = 0;
+
+/** The singleton instance of the InFactory */
+static FwSmDesc_t inFactory;
+
+/** The data for the InFactory singleton. */
+static CrFwCmpData_t inFactoryData;
+
+/**
+ * Initialization action for InFactory.
+ * This function: (a) allocates the memory for the InFactory data structures;
+ * (b) initializes the arrays of descriptors <code>::inCmdKindDesc</code> and
+ * <code>::inRepKindDesc</code>; and (c) initializes the component-specific
+ * field of the data structures for InCommands and InReports.
+ * The outcome of the initialization action is "success" in all cases except when
+ * a memory allocation operation fails.
+ * @param initPr the Initialization Procedure of the InFactory
+ */
+static void InFactoryInitAction(FwPrDesc_t initPr);
+
+/**
+ * Configuration action for InFactory.
+ * This function releases all the InCommands and InReports which are currently
+ * allocated.
+ * After this function has been called, any InCommand or InReport which is still in
+ * use within the application is no longer valid and should be discarded.
+ *
+ * This function also resets the counter used to initialize the instance
+ * identifiers of the InCommands and InReports created by the InFactory.
+ * After reset, the first InCommand or InReport made by the InFactory will have
+ * instance identifier set to 1.
+ *
+ * The outcome of the initialization action is always: "success"
+ * @param initPr the Initialization Procedure of the InFactory
+ */
+static void InFactoryConfigAction(FwPrDesc_t initPr);
+
+/**
+ * Shutdown action for InFactory.
+ * This function releases the memory which was allocated when the InFactory was
+ * initialized and it sets the number of allocated InCommands and InReports to zero.
+ * After this function has been called, any InCommand or InReport which is still in
+ * use within the application is no longer valid and should be discarded.
+ * @param smDesc the InFactory state machine
+ */
+static void InFactoryShutdownAction(FwSmDesc_t smDesc);
+
+/* ------------------------------------------------------------------------------------ */
+FwSmDesc_t CrFwInFactoryMake() {
+	FwPrDesc_t resetPr, execPr, initPr;
+
+	if (inFactory != NULL) {
+		return inFactory;
+	}
+
+	/* Extend the Base Component */
+	inFactory = FwSmCreateDer(CrFwBaseCmpMake());
+
+	/* Create the Reset Procedure for the InFactory Component */
+	resetPr = FwPrCreateDer(CrFwCmpGetResetProc());
+	FwPrOverrideAction(resetPr, &CrFwBaseCmpDefConfigAction, &InFactoryConfigAction);
+
+	/* Create the Initialization Procedure for the InFactory Component */
+	initPr = FwPrCreateDer(CrFwCmpGetInitProc());
+	FwPrOverrideAction(initPr, &CrFwBaseCmpDefInitAction, &InFactoryInitAction);
+
+	/* Override the Shutdown Action for the InFactory Component */
+	FwSmOverrideAction(inFactory, &CrFwBaseCmpDefShutdownAction, &InFactoryShutdownAction);
+
+	/* Get the Dummy Execution Procedure for the InFactory Component */
+	execPr = CrFwBaseCmpGetDummyExecProc();
+
+	/* Initialize the data for the requested SM */
+	inFactoryData.outcome = 1;
+	inFactoryData.initProc = initPr;
+	inFactoryData.resetProc = resetPr;
+	inFactoryData.execProc = execPr;
+	inFactoryData.instanceId = 0;
+	inFactoryData.typeId = CR_FW_INFACTORY_TYPE;
+
+	/* Attach the data to the InFactory state machine and to its procedures. */
+	FwSmSetData(inFactory, &inFactoryData);
+	FwPrSetData(inFactoryData.initProc, &inFactoryData);
+	FwPrSetData(inFactoryData.resetProc, &inFactoryData);
+
+	/* Start the InFactory */
+	FwSmStart(inFactory);
+
+	return inFactory;
+}
+
+/* ------------------------------------------------------------------------------------ */
+FwSmDesc_t CrFwInFactoryMakeInCmd(CrFwPckt_t pckt) {
+	CrFwInFactoryPoolIndex_t j, k, freePos;
+	CrFwCmdRepKindIndex_t kindIndex;
+	CrFwCmdRepKindKey_t targetKey;
+	CrFwServType_t type;
+	CrFwServSubType_t subType;
+	CrFwDiscriminant_t discriminant;
+
+	if (nextInCmdFreePos == CR_FW_INFACTORY_MAX_NOF_INCMD) {	/* All positions are occupied */
+		CrFwSetAppErrCode(crInCmdAllocationFail);
+		return NULL;
+	}
+
+	type = CrFwPcktGetServType(pckt);
+	subType = CrFwPcktGetServSubType(pckt);
+	discriminant = CrFwPcktGetDiscriminant(pckt);
+	targetKey = (CrFwCmdRepKindKey_t)(type*CR_FW_MAX_DISCRIMINANT*CR_FW_MAX_SERV_SUBTYPE+subType*CR_FW_MAX_DISCRIMINANT+discriminant);
+	kindIndex = CrFwFindCmdRepKindIndex(inCmdKindKey, CR_FW_INCMD_NKINDS, targetKey);
+	if (kindIndex == CR_FW_INCMD_NKINDS) {
+		CrFwSetAppErrCode(crIllInCmdKind);
+		return NULL;
+	}
+	freePos = nextInCmdFreePos;
+
+	inCmdData[freePos].instanceId = CrFwPcktGetCmdRepId(pckt);
+
+	inCmdCmpSpecificData[freePos].abortAction = inCmdKindDesc[kindIndex].abortAction;
+	inCmdCmpSpecificData[freePos].startAction = inCmdKindDesc[kindIndex].startAction;
+	inCmdCmpSpecificData[freePos].progressAction = inCmdKindDesc[kindIndex].progressAction;
+	inCmdCmpSpecificData[freePos].terminationAction = inCmdKindDesc[kindIndex].terminationAction;
+	inCmdCmpSpecificData[freePos].isReady = inCmdKindDesc[kindIndex].isReady;
+	inCmdCmpSpecificData[freePos].isValid = inCmdKindDesc[kindIndex].isValid;
+	inCmdCmpSpecificData[freePos].factoryPoolIndex = freePos;
+	inCmdCmpSpecificData[freePos].pckt = pckt;
+
+	/* Reset the InCommand */
+	CrFwCmpReset(inCmd[freePos]);
+
+	nOfAllocatedInCmd++;
+	inCmdInUse[freePos] = 1;
+
+	/* Find the next free position in the pool of pre-allocated InCommand instances */
+	k = (CrFwInFactoryPoolIndex_t)(freePos + 1);
+	for (j=0; j<(CR_FW_INFACTORY_MAX_NOF_INCMD-1); j++) {
+		if (k == CR_FW_INFACTORY_MAX_NOF_INCMD)
+			k = 0;
+		if (inCmdInUse[k] == 0) {
+			nextInCmdFreePos = k;
+			return (inCmd[freePos]);	/* Next free position has been found */
+		}
+		k = (CrFwInFactoryPoolIndex_t)(k + 1);
+	}
+
+	nextInCmdFreePos = CR_FW_INFACTORY_MAX_NOF_INCMD; /* There are no free positions left */
+	return (inCmd[freePos]);
+}
+
+/* ------------------------------------------------------------------------------------ */
+FwSmDesc_t CrFwInFactoryMakeInRep(CrFwPckt_t pckt) {
+	CrFwInFactoryPoolIndex_t j, k, freePos;
+	CrFwCmdRepKindIndex_t kindIndex;
+	CrFwCmdRepKindKey_t targetKey;
+	CrFwServType_t type;
+	CrFwServSubType_t subType;
+	CrFwDiscriminant_t discriminant;
+
+	if (nextInRepFreePos == CR_FW_INFACTORY_MAX_NOF_INREP) {	/* All positions are occupied */
+		CrFwSetAppErrCode(crInRepAllocationFail);
+		return NULL;
+	}
+
+	type = CrFwPcktGetServType(pckt);
+	subType = CrFwPcktGetServSubType(pckt);
+	discriminant = CrFwPcktGetDiscriminant(pckt);
+	targetKey = (CrFwCmdRepKindKey_t)(type*CR_FW_MAX_DISCRIMINANT*CR_FW_MAX_SERV_SUBTYPE+subType*CR_FW_MAX_DISCRIMINANT+discriminant);
+	kindIndex = CrFwFindCmdRepKindIndex(inRepKindKey, CR_FW_INREP_NKINDS, targetKey);
+	if (kindIndex == CR_FW_INREP_NKINDS) {
+		CrFwSetAppErrCode(crIllInRepKind);
+		return NULL;
+	}
+	freePos = nextInRepFreePos;
+
+	inRepCmpSpecificData[freePos].updateAction = inRepKindDesc[kindIndex].updateAction;
+	inRepCmpSpecificData[freePos].isValid = inRepKindDesc[kindIndex].isValid;
+	inRepCmpSpecificData[freePos].factoryPoolIndex = freePos;
+	inRepCmpSpecificData[freePos].pckt = pckt;
+	inRepData[freePos].instanceId = CrFwPcktGetCmdRepId(pckt);
+
+	/* Reset the InReport */
+	CrFwCmpReset(inRep[freePos]);
+
+	nOfAllocatedInRep++;
+	inRepInUse[freePos] = 1;
+
+	/* Find the next free position in the pool of pre-allocated InReport/InCommand instances */
+	k = (CrFwInFactoryPoolIndex_t)(freePos + 1);
+	for (j=0; j<(CR_FW_INFACTORY_MAX_NOF_INREP-1); j++) {
+		if (k == CR_FW_INFACTORY_MAX_NOF_INREP)
+			k = 0;
+		if (inRepInUse[k] == 0) {
+			nextInRepFreePos = k;
+			return (inRep[freePos]);	/* Next free position has been found */
+		}
+		k = (CrFwInFactoryPoolIndex_t)(k + 1);
+	}
+
+	nextInRepFreePos = CR_FW_INFACTORY_MAX_NOF_INREP; /* There are no free positions left */
+	return (inRep[freePos]);
+}
+
+/* ------------------------------------------------------------------------------------ */
+void CrFwInFactoryReleaseInCmd(FwSmDesc_t inCmdInstance) {
+	CrFwCmpData_t* inCmdInstanceData = (CrFwCmpData_t*)FwSmGetData(inCmdInstance);
+	CrFwInCmdData_t* cmpSpecificData = (CrFwInCmdData_t*)(inCmdInstanceData->cmpSpecificData);
+	CrFwInFactoryPoolIndex_t posToBeFreed;
+
+	posToBeFreed = cmpSpecificData->factoryPoolIndex;
+
+	if (inCmdInUse[posToBeFreed] == 1) {
+		inCmdInUse[posToBeFreed] = 0;
+		nOfAllocatedInCmd--;
+		nextInCmdFreePos = posToBeFreed;
+		CrFwPcktRelease(inCmdCmpSpecificData[posToBeFreed].pckt);
+		inCmdCmpSpecificData[posToBeFreed].pckt = NULL;
+		return;
+	}
+	CrFwSetAppErrCode(crInCmdRelErr);
+
+	return;
+}
+
+/* ------------------------------------------------------------------------------------ */
+void CrFwInFactoryReleaseInRep(FwSmDesc_t inRepInstance) {
+	CrFwCmpData_t* inRepInstanceData = (CrFwCmpData_t*)FwSmGetData(inRepInstance);
+	CrFwInRepData_t* cmpSpecificData = (CrFwInRepData_t*)(inRepInstanceData->cmpSpecificData);
+	CrFwInFactoryPoolIndex_t posToBeFreed;
+
+	posToBeFreed = cmpSpecificData->factoryPoolIndex;
+
+	if (inRepInUse[posToBeFreed] == 1) {
+		inRepInUse[posToBeFreed] = 0;
+		nOfAllocatedInRep--;
+		nextInRepFreePos = posToBeFreed;
+		CrFwPcktRelease(inRepCmpSpecificData[posToBeFreed].pckt);
+		inRepCmpSpecificData[posToBeFreed].pckt = NULL;
+		return;
+	}
+	CrFwSetAppErrCode(crInRepRelErr);
+
+	return;
+}
+
+/* ------------------------------------------------------------------------------------ */
+CrFwInFactoryPoolIndex_t CrFwInFactoryGetNOfAllocatedInCmd() {
+	return nOfAllocatedInCmd;
+}
+
+/* ------------------------------------------------------------------------------------ */
+CrFwInFactoryPoolIndex_t CrFwInFactoryGetMaxNOfInCmd() {
+	return CR_FW_INFACTORY_MAX_NOF_INCMD;
+}
+
+/* ------------------------------------------------------------------------------------ */
+CrFwInFactoryPoolIndex_t CrFwInFactoryGetNOfAllocatedInRep() {
+	return nOfAllocatedInRep;
+}
+
+/* ------------------------------------------------------------------------------------ */
+CrFwInFactoryPoolIndex_t CrFwInFactoryGetMaxNOfInRep() {
+	return CR_FW_INFACTORY_MAX_NOF_INREP;
+}
+
+/*------------------------------------------------------------------------------------*/
+static void InFactoryInitAction(FwPrDesc_t initPr) {
+	CrFwCounterU2_t i;
+	CrFwCmdRepKindIndex_t j;
+	FwPrDesc_t inCmdInitPr, inCmdResetPr, inCmdExecPr;
+	FwPrDesc_t inRepInitPr, inRepResetPr, inRepExecPr;
+	CRFW_UNUSED(initPr);
+
+	/* Create the pre-allocated InCommands */
+	for (i=0; i<CR_FW_INFACTORY_MAX_NOF_INCMD; i++) {
+		/* Create the i-th InCommand as an extension of the Base OutComponent */
+		inCmd[i] = FwSmCreateDer(CrFwInCmdMakeBase());
+
+		/* Create the Reset Procedure for the InCommand */
+		inCmdResetPr = FwPrCreateDer(CrFwCmpGetResetProc());
+		FwPrOverrideAction(inCmdResetPr, &CrFwBaseCmpDefConfigCheck, &CrFwInCmdConfigCheck);
+		inCmdData[i].resetProc = inCmdResetPr;
+
+		/* Create the Initialization Procedure for the InCommand */
+		inCmdInitPr = FwPrCreateDer(CrFwCmpGetInitProc());
+		inCmdData[i].initProc = inCmdInitPr;
+
+		/* Get the Execution Procedure for the InCommand */
+		inCmdExecPr = CrFwBaseCmpGetDummyExecProc();
+		inCmdData[i].execProc = inCmdExecPr;
+
+		/* Set the component type */
+		inCmdData[i].typeId = CR_FW_INCOMMAND_TYPE;
+
+		/* Set the pointer to the component-specific data */
+		inCmdData[i].cmpSpecificData = &inCmdCmpSpecificData[i];
+
+		/* Attach the data to the InCommand state machine and to its procedures. */
+		FwSmSetData(inCmd[i], &inCmdData[i]);
+		FwSmSetData(FwSmGetEmbSm(inCmd[i], CR_FW_BASE_STATE_CONFIGURED), &inCmdData[i]);
+		FwPrSetData(inCmdData[i].initProc, &inCmdData[i]);
+		FwPrSetData(inCmdData[i].resetProc, &inCmdData[i]);
+
+		/* Start and initialize the InCommand */
+		FwSmStart(inCmd[i]);
+		CrFwCmpInit(inCmd[i]);
+	}
+
+	/* Initialize the array holding the keys of the InCommand kinds */
+	for (j=0; j<CR_FW_INCMD_NKINDS; j++)
+		inCmdKindKey[j] = (CrFwCmdRepKindKey_t)(inCmdKindDesc[j].servType*CR_FW_MAX_DISCRIMINANT*CR_FW_MAX_SERV_SUBTYPE +
+		                  inCmdKindDesc[j].servSubType*CR_FW_MAX_DISCRIMINANT+inCmdKindDesc[j].discriminant);
+
+	/* Create the pre-allocated InReports */
+	for (i=0; i<CR_FW_INFACTORY_MAX_NOF_INREP; i++) {
+		/* Create the i-th InReport as an extension of the Base OutComponent */
+		inRep[i] = FwSmCreateDer(CrFwBaseCmpMake());
+
+		/* Create the Reset Procedure for the InReport */
+		inRepResetPr = FwPrCreateDer(CrFwCmpGetResetProc());
+		FwPrOverrideAction(inRepResetPr, &CrFwBaseCmpDefConfigCheck, &CrFwInRepConfigCheck);
+		inRepData[i].resetProc = inRepResetPr;
+
+		/* Create the Initialization Procedure for the InReport */
+		inRepInitPr = FwPrCreateDer(CrFwCmpGetInitProc());
+		inRepData[i].initProc = inRepInitPr;
+
+		/* Get the Execution Procedure for the InReport */
+		inRepExecPr = CrFwInRepExecProcMake();
+		inRepData[i].execProc = inRepExecPr;
+
+		/* Set the component type */
+		inRepData[i].typeId = CR_FW_INREPORT_TYPE;
+
+		/* Set the pointer to the component-specific data */
+		inRepData[i].cmpSpecificData = &inRepCmpSpecificData[i];
+
+		/* Attach the data to the InReport  state machine and to its procedures. */
+		FwSmSetData(inRep[i], &inRepData[i]);
+		FwPrSetData(inRepData[i].initProc, &inRepData[i]);
+		FwPrSetData(inRepData[i].resetProc, &inRepData[i]);
+		FwPrSetData(inRepData[i].execProc, &inRepData[i]);
+
+		/* Start and initialize the InReport */
+		FwSmStart(inRep[i]);
+		CrFwCmpInit(inRep[i]);
+	}
+
+	/* Initialize the array holding the keys of the InReport kinds */
+	for (j=0; j<CR_FW_INREP_NKINDS; j++)
+		inRepKindKey[j] = (CrFwCmdRepKindKey_t)(inRepKindDesc[j].servType*CR_FW_MAX_DISCRIMINANT*CR_FW_MAX_SERV_SUBTYPE +
+		                  inRepKindDesc[j].servSubType*CR_FW_MAX_DISCRIMINANT+inRepKindDesc[j].discriminant);
+
+}
+
+/*------------------------------------------------------------------------------------*/
+static void InFactoryConfigAction(FwPrDesc_t initPr) {
+	CrFwCounterU2_t i;
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwPrGetData(initPr);
+
+	for (i=0; i<CR_FW_INFACTORY_MAX_NOF_INCMD; i++)
+		if (inCmdInUse[i] != 0) {
+			inCmdInUse[i] = 0;
+			CrFwPcktRelease(inCmdCmpSpecificData[i].pckt);
+			inCmdCmpSpecificData[i].pckt = NULL;
+		}
+
+	for (i=0; i<CR_FW_INFACTORY_MAX_NOF_INREP; i++)
+		if (inRepInUse[i] == 1) {
+			inRepInUse[i] = 0;
+			CrFwPcktRelease(inRepCmpSpecificData[i].pckt);
+			inRepCmpSpecificData[i].pckt = NULL;
+		}
+
+	nOfAllocatedInRep = 0;
+	nOfAllocatedInRepSinceReset = 0;
+	nextInRepFreePos = 0;
+
+	nOfAllocatedInCmd = 0;
+	nOfAllocatedInCmdSinceReset = 0;
+	nextInCmdFreePos = 0;
+
+	cmpData->outcome = 1;
+}
+
+/*------------------------------------------------------------------------------------*/
+static void InFactoryShutdownAction(FwSmDesc_t smDesc) {
+	CrFwCounterU2_t i;
+	CRFW_UNUSED(smDesc);
+
+	for (i=0; i<CR_FW_INFACTORY_MAX_NOF_INCMD; i++) {
+		/* Release memory allocated to InCommand Initialization Procedure */
+		FwPrReleaseDer(inCmdData[i].initProc);
+		/* Release memory allocated to InCommand Reset Procedure */
+		FwPrReleaseDer(inCmdData[i].resetProc);
+		/* Release memory allocated to InCommand */
+		FwSmReleaseDer(FwSmGetEmbSm(inCmd[i],CR_FW_BASE_STATE_CONFIGURED));
+		FwSmReleaseDer(inCmd[i]);
+		if (inCmdInUse[i] == 1) {
+			/* Mark all InCommand as not-in-use */
+			inCmdInUse[i] = 0;
+			/* Release packet associated to InCommand */
+			CrFwPcktRelease(inCmdCmpSpecificData[i].pckt);
+		}
+	}
+
+	for (i=0; i<CR_FW_INFACTORY_MAX_NOF_INREP; i++) {
+		/* Release memory allocated to InReport Initialization Procedure */
+		FwPrReleaseDer(inRepData[i].initProc);
+		/* Release memory allocated to InReport Reset Procedure */
+		FwPrReleaseDer(inRepData[i].resetProc);
+		/* Release memory allocated to InReport Execution Procedure */
+		FwPrRelease(inRepData[i].execProc);
+		/* Release memory allocated to InReport */
+		FwSmReleaseDer(inRep[i]);
+		/* Mark all InReports as not-in-use */
+		if (inRepInUse[i] == 1) {
+			inRepInUse[i] = 0;
+			/* Release packet associated to InRepor */
+			CrFwPcktRelease(inRepCmpSpecificData[i].pckt);
+		}
+	}
+
+	nOfAllocatedInRep = 0;
+	nOfAllocatedInCmd = 0;
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/CrFramework/src/InFactory/CrFwInFactory.h b/CrFramework/src/InFactory/CrFwInFactory.h
new file mode 100644
index 0000000..d0ad535
--- /dev/null
+++ b/CrFramework/src/InFactory/CrFwInFactory.h
@@ -0,0 +1,231 @@
+/**
+ * @file
+ * @ingroup inMngGroup
+ * Definition of the InFactory component.
+ *
+ * The InFactory component offers an interface through which incoming report components
+ * (InReports, see <code>CrFwInRep.h</code>) or incoming command components
+ * (InCommands, see <code>CrFwInCmd.h</code> be allocated and released.
+ *
+ * The InFactory is implemented as an extension of the Base Component of
+ * <code>CrFwBaseCmp.h</code>.
+ * The InFactory is a singleton component.
+ *
+ * This interface provides a function to create the InFactory, it provides
+ * functions to create an InReport or an InCommand of a specified kind,
+ * and it provides functions to release previously allocated InReports or
+ * InCommands.
+ *
+ * The InFactory maintains a pool of pre-allocated InReports and a pool
+ * of pre-allocated InCommands
+ * (the sizes of the pools are defined in <code>CrFwInFactoryUserPar.h</code>).
+ * Memory for the pools is allocated when the InFactory is initialized and is only
+ * released if the InFactory is shutdown.
+ * Items in the pool are marked as "in use" when they are allocated to an application
+ * and are marked as "not in use" when they are released.
+ * No memory allocation operations (<code>malloc/free</code>) are therefore performed
+ * when InReports or InCommands are allocated or released.
+ * When the InFactory is reset, all the items in the pool are marked as "not in use".
+ *
+ * <b>Mode of Use of an InFactory Component</b>
+ *
+ * The configuration of the InFactory component is defined statically in
+ * <code>CrFwInFactoryUserPar.h</code>.
+ *
+ * The InFactory is created with function <code>::CrFwInFactoryMake</code>.
+ * After being created, the InFactory must be initialized and reset.
+ * This is done with functions <code>::CrFwCmpInit</code> and <code>::CrFwCmpReset</code>.
+ * Nominally, after being initialized and reset the InFactory State Machine should be
+ * in state CONFIGURED (this can be checked by verifying that function <code>FwSmGetCurState</code>
+ * returns CR_FW_BASE_STATE_CONFIGURED).
+ *
+ * After being configured, the InFactory is ready to manage the creation and release
+ * process for InReports and InCommands.
+ * An InReport is created with function <code>::CrFwInFactoryMakeInRep</code> and it
+ * is released with function <code>::CrFwInFactoryReleaseInRep</code>.
+ * Similarly, an InCommand is created with function <code>::CrFwInFactoryMakeInCmd</code> and it
+ * is released with function <code>::CrFwInFactoryReleaseInCmd</code>.
+ *
+ * An InReport wraps a packet holding an incoming report and an InCommand wraps a packet
+ * holding an incoming command.
+ * The packet holding the report or command is passed as an argument to the make function which
+ * creates the InReport or InCommand component.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_INFACTORY_H_
+#define CRFW_INFACTORY_H_
+
+/* Include Framework files */
+#include "CrFwConstants.h"
+/* Include FW Profile files */
+#include "FwSmConstants.h"
+#include "FwSmCore.h"
+
+/**
+ * Factory function for the singleton instance of the InFactory.
+ * The first time it is called, this function creates the InFactory singleton instance.
+ * Subsequent calls return the same instance.
+ * The first time this function is called, it returns the InFactory in state CREATED.
+ * @return the OutFactory singleton instance.
+ */
+FwSmDesc_t CrFwInFactoryMake();
+
+/**
+ * Make function for a component encapsulating an incoming report (InReport).
+ * This function initializes and resets a component before returning it.
+ * Under nominal conditions, the component returned by this function is
+ * therefore in state CONFIGURED (but it could be in state INITIALIZED
+ * if the InReport's configuration check fails).
+ *
+ * An InReport encapsulates an incoming packet holding a report.
+ * The packet is passed as an argument to this function.
+ * The packet holds all the information about the incoming report.
+ * In particular, it holds the information about the report kind (as determined
+ * by the triplet: [service type, service sub-type, discriminant]).
+ * This function checks the report kind and, if it finds that it is illegal,
+ * it returns NULL and sets the application error code to: <code>::crIllInRepKind</code>).
+ * If instead the command is legal, this function uses it to configure the InReport.
+ * The configuration information is retrieved from <code>CrFwInFactoryUserPar</code>.
+ *
+ * If the allocation of the memory for the new InReport fails, the function
+ * returns NULL.
+ * Allocation memory failure results in the application error code being set
+ * to <code>crInRepAllocationFail</code>.
+ *
+ * When an InReport created by this function is no longer needed,
+ * it should be returned to the factory by calling <code>CrFwInRepReleaseInRep</code>.
+ *
+ * The instance identifier of the InReport created by this function is equal to
+ * the number of InReports created by the factory since it was last reset.
+ *
+ * If the InFactory is reset, then all the InReports which had been created
+ * by the factory are released.
+ *
+ * @param pckt the packet holding the InReport
+ * @return a new InReport or NULL if it was not possible to allocate the memory
+ * for the InReport.
+ */
+FwSmDesc_t CrFwInFactoryMakeInRep(CrFwPckt_t pckt);
+
+/**
+ * Make function for a component encapsulating an incoming command (InCommand).
+ * This function initializes and resets a component before returning it.
+ * Under nominal conditions, the component returned by this function is
+ * therefore in state CONFIGURED (but it could be in state INITIALIZED
+ * if the InCommand's configuration check fails).
+ *
+ * An InCommand encapsulates an incoming packet holding a command.
+ * The packet is passed as an argument to this function.
+ * The packet holds all the information about the incoming command.
+ * In particular, it holds the information about the command kind (as determined
+ * by the triplet: [service type, service sub-type, discriminant]).
+ * This function checks the command kind and, if it finds that it is illegal,
+ * it returns NULL and sets the application error code to: <code>::crIllInCmdKind</code>).
+ * If instead the command is legal, this function uses it to configure the InCommand.
+ * The configuration information is retrieved from <code>CrFwInFactoryUserPar</code>.
+ *
+ * If the allocation of the memory for the new InCommand fails, the function
+ * returns NULL.
+ * Allocation memory failure results in the application error code being set
+ * to <code>::crInCmdAllocationFail</code>.
+ *
+ * When an InCommand created by this function is no longer needed,
+ * it should be returned to the factory by calling <code>::CrFwInFactoryReleaseInCmd</code>.
+ *
+ * If the InFactory is reset, then all the InCommands which had been created
+ * by the factory are released.
+ *
+ * @param pckt the packet holding the InCommand
+ * @return a new InCommand or NULL if it was not possible to allocate the memory
+ * for the InCommand or if the packet type is not recognized.
+ */
+FwSmDesc_t CrFwInFactoryMakeInCmd(CrFwPckt_t pckt);
+
+/**
+ * Release function for an InReport.
+ * The argument of this function must be an InReport which was created using function
+ * <code>::CrFwInFactoryMakeInRep</code>.
+ * This function releases the memory which was allocated to the InReport.
+ * After this function is called, the InReport cannot be used.
+ * The function does not perform any checks on the existence or status of the
+ * InReport.
+ * An attempt to use an InReport which has been released will result in undefined behaviour.
+ *
+ * An attempt to release an InReport which had already been released, or to release a
+ * non-existent InReport will result in undefined behaviour and in the application
+ * error code being set to: <code>::crInRepRelErr</code>.
+ *
+ * @param inRepInstance the InReport to be released
+ */
+void CrFwInFactoryReleaseInRep(FwSmDesc_t inRepInstance);
+
+/**
+ * Release function for an InCommand.
+ * The argument of this function must be an InCommand which was created using function
+ * <code>::CrFwInFactoryMakeInCmd</code>.
+ * This function releases the memory which was allocated to the InCommand.
+ * After this function is called, the InCommand cannot be used.
+ * The function does not perform any checks on the existence or status of the
+ * InCommand.
+ * An attempt to use an InCommand which has been released will result in undefined behaviour.
+ *
+ * An attempt to release an InCommand which had already been released, or to release a
+ * non-existent InCommand will result in undefined behaviour and in the application
+ * error code being set to: <code>::crInCmdRelErr</code>.
+ *
+ * @param inCmdInstance the InCommand to be released
+ */
+void CrFwInFactoryReleaseInCmd(FwSmDesc_t inCmdInstance);
+
+/**
+ * Return the number of InReports which are currently allocated.
+ * This function returns the number of InReports which have been successfully
+ * allocated through calls to <code>::CrFwInFactoryMakeInRep</code> and have not yet been
+ * released through calls to <code>::CrFwInFactoryReleaseInRep</code>.
+ * @return the number of InReports  which are currently allocated.
+ */
+CrFwInFactoryPoolIndex_t CrFwInFactoryGetNOfAllocatedInRep();
+
+/**
+ * Return the maximum number of InReports which may be allocated at any one time.
+ * @return the maximum number of InReports which may be allocated at any one time
+ */
+CrFwInFactoryPoolIndex_t CrFwInFactoryGetMaxNOfInRep();
+
+/**
+ * Return the number of InCommands which are currently allocated.
+ * This function returns the number of InCommands which have been successfully
+ * allocated through calls to <code>::CrFwInFactoryMakeInCmd</code> and have not yet been
+ * released through calls to <code>::CrFwInFactoryReleaseInCmd</code>.
+ * @return the number of InCommands which are currently allocated.
+ */
+CrFwInFactoryPoolIndex_t CrFwInFactoryGetNOfAllocatedInCmd();
+
+/**
+ * Return the maximum number of InCommands which may be allocated at any one time.
+ * @return the maximum number of InCommands which may be allocated at any one time
+ */
+CrFwInFactoryPoolIndex_t CrFwInFactoryGetMaxNOfInCmd();
+
+#endif /* CRFW_INFACTORY_H_ */
diff --git a/CrFramework/src/InLoader/CrFwInLoader.c b/CrFramework/src/InLoader/CrFwInLoader.c
new file mode 100644
index 0000000..7b60d45
--- /dev/null
+++ b/CrFramework/src/InLoader/CrFwInLoader.c
@@ -0,0 +1,259 @@
+/**
+ * @file
+ *
+ * Implementation of InManager State Machine.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include <stdlib.h>
+/* Include configuration files */
+#include "CrFwInLoaderUserPar.h"
+#include "CrFwCmpData.h"
+/* Include framework files */
+#include "CrFwConstants.h"
+#include "CrFwRepErr.h"
+#include "CrFwTime.h"
+#include "CrFwInLoader.h"
+#include "CrFwRepInCmdOutcome.h"
+#include "BaseCmp/CrFwBaseCmp.h"
+#include "BaseCmp/CrFwInitProc.h"
+#include "BaseCmp/CrFwResetProc.h"
+#include "BaseCmp/CrFwDummyExecProc.h"
+#include "Pckt/CrFwPckt.h"
+#include "Pckt/CrFwPcktQueue.h"
+#include "InRegistry/CrFwInRegistry.h"
+#include "InFactory/CrFwInFactory.h"
+#include "InStream/CrFwInStream.h"
+#include "InManager/CrFwInManager.h"
+#include "InCmd/CrFwInCmd.h"
+#include "OutStream/CrFwOutStream.h"
+#include "UtilityFunctions/CrFwUtilityFunctions.h"
+/* Include FW Profile files */
+#include "FwSmConstants.h"
+#include "FwSmDCreate.h"
+#include "FwSmConfig.h"
+#include "FwSmCore.h"
+#include "FwPrConstants.h"
+#include "FwPrDCreate.h"
+#include "FwPrConfig.h"
+#include "FwPrCore.h"
+
+/** The InLoader singleton */
+static FwSmDesc_t inLoader = NULL;
+
+/** The data structure for the InLoader */
+static CrFwCmpData_t inLoaderData;
+
+/** The component-specific data for the InLoader */
+static CrFwInLoaderData_t inLoaderCmpSpecificData;
+
+/** Pointer to function which checks the legality of the packet destination. */
+static CrFwInLoaderGetReroutingDest_t getReroutingDest = CR_FW_INLOADER_DET_REROUTING_DEST;
+
+/** Pointer to function which selects the InManager. */
+static CrFwInLoaderGetInManager_t getInManager = CR_FW_INLOADER_SEL_INMANAGER;
+
+/**
+ * Implement the logic of the InLoader Execution Procedure (see figure below).
+ * This function is executed every time the Execution Procedure of the InLoader
+ * is executed.
+ * @image html InLoaderExecution.png
+ * @param execPr the Execution Procedure of the InManager
+ */
+static void InLoaderExecAction(FwPrDesc_t execPr);
+
+/**
+ * Load the command or report encapsulated in the argument packet into an
+ * InManager.
+ * This function implements the logic shown in the figure.
+ * @image html InLoaderLoadCommandReport.png
+ * @param pckt the packet to be loaded in the InManager
+ */
+static void InLoaderLoadCmdRep(CrFwPckt_t pckt);
+
+/*-----------------------------------------------------------------------------------------*/
+FwSmDesc_t CrFwInLoaderMake() {
+	FwPrDesc_t resetPr, execPr, initPr;
+
+	if (inLoader != NULL) {
+		return inLoader;	/* The requested SM has already been created */
+	}
+
+	/* Create the requested SM as an extension of the base component SM */
+	inLoader = FwSmCreateDer(CrFwBaseCmpMake());
+
+	/* Create the Reset Procedure for the InLoader Component */
+	resetPr = FwPrCreateDer(CrFwCmpGetResetProc());
+
+	/* Create the Initialization Procedure for the InLoader Component */
+	initPr = FwPrCreateDer(CrFwCmpGetInitProc());
+
+	/* Create the Execution Procedure for the InLoader Component */
+	execPr = FwPrCreateDer(CrFwBaseCmpGetDummyExecProc());
+	FwPrOverrideAction(execPr, &CwFwBaseCmpDummyExecAction, &InLoaderExecAction);
+
+	/* Initialize the data for the requested SM */
+	inLoaderData.outcome = 1;
+	inLoaderData.initProc = initPr;
+	inLoaderData.resetProc = resetPr;
+	inLoaderData.execProc = execPr;
+	inLoaderData.instanceId = 0;
+	inLoaderData.typeId = CR_FW_INLOADER_TYPE;
+	inLoaderData.cmpSpecificData = &inLoaderCmpSpecificData;
+
+	/* Attach the data to the InLoader state machine and to its procedures. */
+	FwSmSetData(inLoader, &inLoaderData);
+	FwPrSetData(inLoaderData.initProc, &inLoaderData);
+	FwPrSetData(inLoaderData.resetProc, &inLoaderData);
+	FwPrSetData(inLoaderData.execProc, &inLoaderData);
+
+	/* Start the InLoader */
+	FwSmStart(inLoader);
+
+	return inLoader;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwInLoaderSetInStream(FwSmDesc_t inStream) {
+	inLoaderCmpSpecificData.inStream = inStream;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void InLoaderExecAction(FwPrDesc_t prDesc) {
+	CrFwPckt_t pckt;
+	CrFwDestSrc_t pcktDest, reroutingDest;
+	FwSmDesc_t outStream;
+	CRFW_UNUSED(prDesc);
+
+	/* Retrieve packet from InStream */
+	pckt = CrFwInStreamGetPckt(inLoaderCmpSpecificData.inStream);
+	if (pckt == NULL)
+		return;
+
+	/* Get packet destination and check whether it is the host application */
+	pcktDest = CrFwPcktGetDest(pckt);
+	if (pcktDest == CR_FW_HOST_APP_ID) {
+		InLoaderLoadCmdRep(pckt);
+		return;
+	}
+
+	/* Check whether packet should be re-routed to another destination */
+	reroutingDest = getReroutingDest(pcktDest);
+	if (reroutingDest == 0) {	/* destination is invalid */
+		CrFwRepErrInstanceIdAndDest(crInLoaderInvDest, inLoaderData.typeId, inLoaderData.instanceId,
+		                            CrFwPcktGetCmdRepId(pckt), pcktDest);
+		CrFwPcktRelease(pckt);
+		return;
+	}
+
+	/* Re-route packet and then release it */
+	outStream = CrFwOutStreamGet(reroutingDest);
+	CrFwOutStreamSend(outStream, pckt);
+	CrFwPcktRelease(pckt);
+	return;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void InLoaderLoadCmdRep(CrFwPckt_t pckt) {
+	FwSmDesc_t inCmp;
+	CrFwInstanceId_t instanceId = CrFwPcktGetCmdRepId(pckt);
+	CrFwServType_t servType = CrFwPcktGetServType(pckt);
+	CrFwServSubType_t servSubType = CrFwPcktGetServSubType(pckt);
+	CrFwDiscriminant_t disc = CrFwPcktGetDiscriminant(pckt);
+	CrFwCmdRepType_t cmdRepFlag = CrFwPcktGetCmdRepType(pckt);
+	CrFwCmpData_t* inCmpData;
+	CrFwInstanceId_t inManagerInstanceId;
+	CrFwBool_t inManagerLoadOutcome;
+
+	if (CrFwPcktGetCmdRepType(pckt) == crCmdType) {
+		inCmp = CrFwInFactoryMakeInCmd(pckt);
+		if (inCmp == NULL) {	/* InCmd had invalid type or no more resources are available */
+			CrFwRepInCmdOutcomeCreFail(crCmdAckCreFail, 0, pckt);
+			CrFwPcktRelease(pckt);
+			return;
+		}
+	} else {
+		inCmp = CrFwInFactoryMakeInRep(pckt);
+		if (inCmp == NULL) {	/* InRep had invalid type or no more resources are available */
+			CrFwRepErrPckt(crInLoaderCreFail, inLoaderData.typeId, inLoaderData.instanceId, pckt);
+			CrFwPcktRelease(pckt);
+			return;
+		}
+	}
+
+	if (FwSmGetCurState(inCmp) != CR_FW_BASE_STATE_CONFIGURED) {	/* InRep/InCmd has failed its validity check */
+		inCmpData = FwSmGetData(inCmp);
+		if (cmdRepFlag == crRepType) {
+			CrFwRepErrRep(crInLoaderAccFail, inLoaderData.typeId, inLoaderData.instanceId, inCmp);
+			CrFwInFactoryReleaseInRep(inCmp);
+			return;
+		} else {
+			CrFwRepInCmdOutcome(crCmdAckAccFail, instanceId, servType, servSubType, disc, inCmpData->outcome, inCmp);
+			CrFwInFactoryReleaseInCmd(inCmp);
+			return;
+		}
+	}
+
+	/* Select InManager */
+	inManagerInstanceId = getInManager(servType, servSubType, disc, cmdRepFlag);
+
+	/* Load InReport/InCommand in selected InManager */
+	inManagerLoadOutcome = CrFwInManagerLoad(CrFwInManagerMake(inManagerInstanceId), inCmp);
+	if (inManagerLoadOutcome == 0) {	/* Load operation has failed */
+		if (cmdRepFlag == crRepType) {
+			CrFwRepErrRep(crInLoaderLdFail, inLoaderData.typeId, inLoaderData.instanceId,inCmp);
+			CrFwInFactoryReleaseInRep(inCmp);
+			return;
+		} else {
+			CrFwRepInCmdOutcome(crCmdAckLdFail, instanceId, servType, servSubType, disc, 0, inCmp);
+			CrFwInFactoryReleaseInCmd(inCmp);
+			return;
+		}
+	} else 	/* Load operation was successful */
+		if (cmdRepFlag == crCmdType)
+			if (CrFwInCmdIsAcceptAck(inCmp) == 1)
+				CrFwRepInCmdOutcome(crCmdAckAccSucc, instanceId, servType, servSubType, disc, 0, inCmp);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwDestSrc_t CrFwInLoaderDefGetReroutingDestination(CrFwDestSrc_t pcktDest) {
+	return pcktDest;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwDestSrc_t CrFwInLoaderDefNoRerouting(CrFwDestSrc_t pcktDest) {
+	CRFW_UNUSED(pcktDest);
+	return 0;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwInstanceId_t CrFwInLoaderDefGetInManager(CrFwServType_t servType, CrFwServSubType_t servSubType,
+        CrFwDiscriminant_t discriminant, CrFwCmdRepType_t cmdRepFlag) {
+	CRFW_UNUSED(servType);
+	CRFW_UNUSED(servSubType);
+	CRFW_UNUSED(discriminant);
+	if (cmdRepFlag == crCmdType)
+		return 0;
+	else
+		return 1;
+}
diff --git a/CrFramework/src/InLoader/CrFwInLoader.h b/CrFramework/src/InLoader/CrFwInLoader.h
new file mode 100644
index 0000000..5327b22
--- /dev/null
+++ b/CrFramework/src/InLoader/CrFwInLoader.h
@@ -0,0 +1,212 @@
+/**
+ * @file
+ * @ingroup inMngGroup
+ * Definition of the InLoader component.
+ *
+ * The InLoader component is responsible for retrieving incoming packets which become available
+ * at an InStream (see <code>CrFwInStream.h</code>).
+ *
+ * The InLoader component is a singleton component.
+ * It is defined as an extension of the Base Component (see <code>CrFwBaseCmp.h</code>).
+ * It overrides its execution procedure with the InLoader Execution Procedure shown in the figure:
+ * @image html InLoaderExecution.png
+ * The Load/Command Report Procedure is shown in the next figure:
+ * @image html InLoaderLoadCommandReport.png
+ *
+ * Execution of the InLoader causes a query to be made on InStream to check whether a packet is
+ * available at that InStream. If a packet is available, it is collected and if it passes
+ * its acceptance check, it is loaded in an InManager. The selection of the InManager is an
+ * adaptation point implemented through a function pointer defined in
+ * <code>CrFwInLoaderUserPar.h</code>.
+ *
+ * The acceptance check is split into four sub-checks:
+ * -# The type/sub-type/discriminant of the incoming command or report is valid (i.e. it is
+ *    defined in <code>CrFwInFactoryUserPar.h</code> and is therefore known to the application);
+ * -# The InFactory has sufficient resources to provide an InCommand or InReport component
+ *    to hold the command or report encapsulated in the packet;
+ * -# The InCommand or InReport is successfully configured (i.e. it enters state CONFIGURED);
+ * -# The InCommand or InReport is successfully loaded in the InManager.
+ * .
+ * Sub-checks 1, 2 and 4 are fully implemented at framework level.
+ * Sub-check 3 is application-specific.
+ * It is called the <i>Validity Check</i> because it verifies the validity of the parameters of the
+ * incoming report or command and is implemented by a user-provided function which must conform
+ * to the prototype of function pointers <code>::CrFwInRepValidityCheck_t</code> for incoming
+ * reports or <code>::CrFwInCmdValidityCheck_t</code> for incoming commands.
+ * The functions implementing the validity checks are defined in <code>CrFwInFactoryUserPar.h</code>.
+ *
+ * Function <code>::InLoaderLoadCmdRep</code> in the InLoader is responsible for checking whether the
+ * sub-checks are passed.
+ * For incoming commands, failure to pass a sub-check is handled as follows:
+ * - Failure of sub-checks 1 and 2 is handled by calling function <code>::CrFwRepInCmdOutcomeCreFail</code>
+ *   with outcome #crCmdAckCreFail.
+ * - Failure of sub-check 3 is handled by calling function <code>::CrFwRepInCmdOutcome</code> with
+ *   outcome #crCmdAckAccFail.
+ * - Failure of sub-check 4 is handled by calling function <code>::CrFwRepInCmdOutcome</code> with
+ *   outcome #crCmdAckLdFail.
+ * .
+ * If all sub-checks is passed, the incoming command is declared "accepted" and, if acknowledgement of
+ * successful acceptance for the command was required, function
+ * <code>::CrFwRepInCmdOutcome</code> is called with the outcome set to #crCmdAckAccSucc.
+ *
+ * For incoming reports, failure to pass a sub-check is treated as an error and is handled as follows:
+ * - Failure of sub-checks 1 and 2 is handled by calling function <code>::CrFwRepInCmdOutcomeCreFail</code>
+ *   with failure code #crCmdAckCreFail.
+ * - Failure of sub-check 3 is handled by calling function <code>::CrFwRepErrRep</code>
+ *   with failure code #crInLoaderAccFail.
+ * - Failure of sub-check 4 is handled by calling function <code>::CrFwRepErrRep</code>
+ *   with failure code #crInLoaderLdFail.
+ * .
+ *
+ * <b>Mode of Use of an InLoader Component</b>
+ *
+ * The configuration of the InLoader components is defined statically in
+ * <code>CrFwInLoaderUserPar.h</code>.
+ *
+ * The InLoader singleton component is created with function <code>::CrFwInLoaderMake</code>.
+ * After being created, the InLoader must be initialized and reset.
+ * This is done with functions <code>::CrFwCmpInit</code> and <code>::CrFwCmpReset</code>.
+ * Nominally, after being initialized and reset the InManager State Machine should be
+ * in state CONFIGURED (this can be checked by verifying that function <code>FwSmGetCurState</code>
+ * returns CR_FW_BASE_STATE_CONFIGURED).
+ *
+ * After an InLoader has been configured, it can be executed by means of function
+ * <code>FwSmExecute</code>.
+ * Execution of an InLoader causes its Execution Procedure (see figure above) to be
+ * executed.
+ *
+ * The InLoader should be executed either when it is known that a packet has arrived at an InStream
+ * or periodically to check whether a packet is available and, if it is, to process it.
+ * During one execution cycle, the InLoader processes one single packet from one single InStream.
+ * The target InStream is conceptually an argument of the execution command; in practice, the target
+ * InStream is passed to the InLoader through function <code>::CrFwInLoaderSetInStream</code>.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_INLOADER_H_
+#define CRFW_INLOADER_H_
+
+/* Include FW Profile Files */
+#include "FwSmConstants.h"
+#include "FwPrConstants.h"
+/* Include Framework Files */
+#include "CrFwConstants.h"
+/* Include Configuration Files */
+#include "CrFwUserConstants.h"
+#include "Pckt/CrFwPcktQueue.h"
+
+/**
+ * Type for a pointer to the function which determines the re-routing destination of
+ * a packet.
+ * The function to determine the re-routing destination of a packet is one of the
+ * adaptation points of the framework.
+ * A function which implements this operation takes the packet destination as an
+ * argument and returns either zero (if the argument destination is invalid) or
+ * else it returns the destination to which the packet should be re-routed
+ * (if the argument destination is valid).
+ */
+typedef CrFwDestSrc_t (*CrFwInLoaderGetReroutingDest_t)(CrFwDestSrc_t);
+
+/**
+ * Type for a pointer to the function which selects the InManager where the InCommand
+ * or InReport must be loaded.
+ * The function to determine the re-routing destination of a packet is one of the
+ * adaptation points of the framework.
+ * A function which implements this operation takes as input the service type, service sub-type,
+ * and discriminant of the InReport/InCommand and a flag which indicates whether the
+ * item to be loaded in the InManaher encapsulates an InCommand or an InReport.
+ * The function returns the identifier of the selected InManager (see <code>::CrFwInManagerMake</code>).
+ */
+typedef CrFwInstanceId_t (*CrFwInLoaderGetInManager_t)(CrFwServType_t, CrFwServSubType_t,
+        CrFwDiscriminant_t, CrFwCmdRepType_t);
+
+/**
+ * Factory function to retrieve the state machine implementing the InLoader singleton
+ * component.
+ * The first time this function is called, it creates the InLoader State Machine singleton
+ * instance.
+ * Subsequent calls returns the same instance.
+ *
+ * The first time this function is called, it returns the InLoader State Machine
+ * after it has been started but before it has been initialized and
+ * configured.
+ * @return the descriptor of the InLoader State Machine or NULL
+ * if the state machine could not be created.
+ */
+FwSmDesc_t CrFwInLoaderMake();
+
+/**
+ * Default implementation of the function which checks the legality of a destination and
+ * returns the re-routing destination.
+ * This default implementation always assumes that the argument destination is valid and
+ * it returns it unchanged.
+ * This default implementation is suitable for applications which are acting as gateways
+ * with one level of indirection (i.e. a situation where a packet is generated by application
+ * A for application B as its final destination, but the packet is sent to application C
+ * as a re-routing destination so that the packet travels from A to B and then from B to C).
+ * This function must conform to the prototype defined by <code>::CrFwInLoaderGetReroutingDest_t</code>.
+ * @param pcktDest the packet destination.
+ * @return the value of pcktDest.
+ */
+CrFwDestSrc_t CrFwInLoaderDefGetReroutingDestination(CrFwDestSrc_t pcktDest);
+
+/**
+ * Default implementation of the function which checks the legality of a destination and
+ * returns the re-routing destination.
+ * This default implementation always assumes that the argument destination is invalid and
+ * therefore it always returns zero.
+ * This default implementation is suitable for applications which do not perform
+ * any packet re-routing (i.e. applications where a packet is always sent to its final
+ * destination).
+ * This function must conform to the prototype defined by <code>::CrFwInLoaderGetReroutingDest_t</code>.
+ * @param pcktDest the packet destination.
+ * @return the value of pcktDest.
+ */
+CrFwDestSrc_t CrFwInLoaderDefNoRerouting(CrFwDestSrc_t pcktDest);
+
+/**
+ * Default implementation of the function which selects the InManager to which an
+ * incoming InReport or InCommand must be loaded.
+ * This default implementation returns 0 if the component to be loaded is an InCommand
+ * (namely if argument <code>cmdRepFlag</code> is equal to <code>::crCmdType</code>) and
+ * it returns 1 if the component to be loaded is an InReport (namely if argument
+ * <code>cmdRepFlag</code> is equal to <code>::crRepType</code>).
+ * This function must conform to the prototype defined by <code>::CrFwInLoaderGetInManager_t</code>.
+ * @param servType the service type of the incoming InCommand or InReport.
+ * @param servSubType the service sub-type of the incoming InCommand or InReport.
+ * @param discriminant the discriminant of the incoming InCommand or InReport.
+ * @param cmdRepFlag a flag indicating whether the item to be loaded is an InCommand or an InReport.
+ * @return the identifier of the InManager into which the incoming InCommand or InReport must be loaded.
+ */
+CrFwInstanceId_t CrFwInLoaderDefGetInManager(CrFwServType_t servType, CrFwServSubType_t servSubType,
+        CrFwDiscriminant_t discriminant, CrFwCmdRepType_t cmdRepFlag);
+
+/**
+ * Set the InStream from which the packets will be retrieved the next time the InLoader
+ * is executed.
+ * @param inStream the InStream from which the packets will be retrieved the next time
+ * the InLoader is executed.
+ */
+void CrFwInLoaderSetInStream(FwSmDesc_t inStream);
+
+#endif /* CRFW_INLOADER_H_ */
diff --git a/CrFramework/src/InManager/CrFwInManager.c b/CrFramework/src/InManager/CrFwInManager.c
new file mode 100644
index 0000000..0a02226
--- /dev/null
+++ b/CrFramework/src/InManager/CrFwInManager.c
@@ -0,0 +1,322 @@
+/**
+ * @file
+ *
+ * Implementation of InManager State Machine.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include <stdlib.h>
+/* Include configuration files */
+#include "CrFwInManagerUserPar.h"
+#include "CrFwCmpData.h"
+/* Include framework files */
+#include "CrFwInManager.h"
+#include "CrFwConstants.h"
+#include "CrFwRepErr.h"
+#include "CrFwTime.h"
+#include "BaseCmp/CrFwBaseCmp.h"
+#include "BaseCmp/CrFwInitProc.h"
+#include "BaseCmp/CrFwResetProc.h"
+#include "BaseCmp/CrFwDummyExecProc.h"
+#include "Pckt/CrFwPckt.h"
+#include "Pckt/CrFwPcktQueue.h"
+#include "InRegistry/CrFwInRegistry.h"
+#include "InFactory/CrFwInFactory.h"
+#include "InCmd/CrFwInCmd.h"
+#include "UtilityFunctions/CrFwUtilityFunctions.h"
+/* Include FW Profile files */
+#include "FwSmConstants.h"
+#include "FwSmDCreate.h"
+#include "FwSmConfig.h"
+#include "FwSmCore.h"
+#include "FwPrConstants.h"
+#include "FwPrDCreate.h"
+#include "FwPrConfig.h"
+#include "FwPrCore.h"
+
+/** The sizes of the PCRL in the InManager components. */
+static CrFwCounterU2_t inManagerPcrlSize[CR_FW_NOF_INMANAGER] = CR_FW_INMANAGER_PCRLSIZE;
+
+/** The descriptors of the InManager State Machines. */
+static FwSmDesc_t inManagerDesc[CR_FW_NOF_INMANAGER];
+
+/** The data structures for the InManager State Machines and their Procedures. */
+static CrFwCmpData_t inManagerData[CR_FW_NOF_INMANAGER];
+
+/** The component-specific data for the InManager instances */
+static CrFwInManagerData_t inManagerCmpSpecificData[CR_FW_NOF_INMANAGER];
+
+/**
+ * Initialization action for InManagers.
+ * This function allocates the memory for the InManager data structures and
+ * initializes them.
+ * The outcome of the initialization action is always "success" (the situation
+ * where the memory allocation fails is not handled).
+ * @param initPr the Initialization Procedure of the InManager
+ */
+static void InManagerInitAction(FwPrDesc_t initPr);
+
+/**
+ * Configuration action for InManagers.
+ * This function resets the PCRL, releases all InCommands and InReports in the PCRL
+ * and resets the counter of successfully loaded InReports or InCommands.
+ * The outcome of the initialization action is always: "success"
+ * @param initPr the Initialization Procedure of the InManager
+ */
+static void InManagerConfigAction(FwPrDesc_t initPr);
+
+/**
+ * Shutdown action for InManager.
+ * This function resets the PCRL and releases all InCommands and InReports in the PCRL.
+ * @param smDesc the InManager state machine
+ */
+static void InManagerShutdownAction(FwSmDesc_t smDesc);
+
+/**
+ * Implement the logic of the Execution Procedure (see figure below).
+ * This function is executed every time the Execution Procedure of the InManager
+ * is executed.
+ * @image html InManagerExecution.png
+ * @param execPr the Execution Procedure of the InManager
+ */
+static void InManagerExecAction(FwPrDesc_t execPr);
+
+/*-----------------------------------------------------------------------------------------*/
+FwSmDesc_t CrFwInManagerMake(CrFwInstanceId_t i) {
+	FwPrDesc_t resetPr, execPr, initPr;
+
+	if (i >= CR_FW_NOF_INMANAGER) {
+		CrFwSetAppErrCode(crInManagerIllId);
+		return NULL;
+	}
+
+	if (inManagerDesc[i] != NULL) {
+		return inManagerDesc[i];	/* The requested SM has already been created */
+	}
+
+	/* Create the requested SM as an extension of the base component SM */
+	inManagerDesc[i] = FwSmCreateDer(CrFwBaseCmpMake());
+
+	/* Create the Reset Procedure for the InManager Component */
+	resetPr = FwPrCreateDer(CrFwCmpGetResetProc());
+	FwPrOverrideAction(resetPr, &CrFwBaseCmpDefConfigAction, &InManagerConfigAction);
+
+	/* Create the Initialization Procedure for the InManager Component */
+	initPr = FwPrCreateDer(CrFwCmpGetInitProc());
+	FwPrOverrideAction(initPr, &CrFwBaseCmpDefInitAction, &InManagerInitAction);
+
+	/* Create the Execution Procedure for the InManager Component */
+	execPr = FwPrCreateDer(CrFwBaseCmpGetDummyExecProc());
+	FwPrOverrideAction(execPr, &CwFwBaseCmpDummyExecAction, &InManagerExecAction);
+
+	/* Override the Shutdown Action for the InManager Component */
+	FwSmOverrideAction(inManagerDesc[i], &CrFwBaseCmpDefShutdownAction, &InManagerShutdownAction);
+
+	/* Initialize the data for the requested SM */
+	inManagerData[i].outcome = 1;
+	inManagerData[i].initProc = initPr;
+	inManagerData[i].resetProc = resetPr;
+	inManagerData[i].execProc = execPr;
+	inManagerData[i].instanceId = i;
+	inManagerData[i].typeId = CR_FW_INMANAGER_TYPE;
+	inManagerData[i].cmpSpecificData = &inManagerCmpSpecificData[i];
+
+	/* Attach the data to the InLoader state machine and to its procedures. */
+	FwSmSetData(inManagerDesc[i], &inManagerData[i]);
+	FwPrSetData(inManagerData[i].initProc, &inManagerData[i]);
+	FwPrSetData(inManagerData[i].resetProc, &inManagerData[i]);
+	FwPrSetData(inManagerData[i].execProc, &inManagerData[i]);
+
+	/* Start the InManager */
+	FwSmStart(inManagerDesc[i]);
+
+	return inManagerDesc[i];
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void InManagerExecAction(FwPrDesc_t prDesc) {
+	CrFwCmpData_t* inManagerDataLocal = (CrFwCmpData_t*)FwPrGetData(prDesc);
+	CrFwInManagerData_t* inManagerCSData = (CrFwInManagerData_t*)inManagerDataLocal->cmpSpecificData;
+	CrFwInstanceId_t id = inManagerDataLocal->instanceId;
+	FwSmDesc_t inCmp;
+	CrFwCmpData_t* inCmpData;
+	CrFwCounterU2_t i;
+	CrFwInRegistryCmdRepState_t inCmpState;
+
+	inManagerCSData->nextFreePcrlPos = 0;
+	for (i=0; i<inManagerPcrlSize[id]; i++) {
+		inCmp = inManagerCSData->pcrl[i];
+		if (inCmp != NULL) {
+			FwSmExecute(inCmp);
+			inCmpData = (CrFwCmpData_t*)FwSmGetData(inCmp);
+			if (inCmpData->typeId == CR_FW_INREPORT_TYPE) {
+				inCmpState = crInRegistryTerminated;
+			} else {
+				CrFwInCmdTerminate(inCmp);
+				if (CrFwInCmdIsInAborted(inCmp))
+					inCmpState = crInRegistryAborted;
+				else if (CrFwInCmdIsInTerminated(inCmp))
+					inCmpState = crInRegistryTerminated;
+				else
+					inCmpState = crInRegistryPending;
+			}
+			if (inCmpState != crInRegistryPending) {
+				CrFwInRegistryUpdateState(inCmp, inCmpState);
+				/* Remove inCmp from PCRL */
+				inManagerCSData->pcrl[i] = NULL;
+				inManagerCSData->nOfInCmpInPcrl--;
+				if (inCmpData->typeId == CR_FW_INREPORT_TYPE)
+					CrFwInFactoryReleaseInRep(inCmp);
+				else
+					CrFwInFactoryReleaseInCmd(inCmp);
+			}
+		}
+	}
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwBool_t CrFwInManagerLoad(FwSmDesc_t smDesc, FwSmDesc_t inCmp) {
+	CrFwCmpData_t* inManagerDataLocal = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInManagerData_t* inManagerCSData = (CrFwInManagerData_t*)inManagerDataLocal->cmpSpecificData;
+	CrFwInstanceId_t id = inManagerDataLocal->instanceId;
+	CrFwCounterU2_t i, freePos, size;
+
+	freePos = inManagerCSData->nextFreePcrlPos;
+	size = inManagerPcrlSize[id];
+
+	/* Check if PCRL is already full */
+	if (inManagerCSData->nOfInCmpInPcrl == size) {
+		CrFwRepErr(crInManagerPcrlFull, inManagerDataLocal->typeId, inManagerDataLocal->instanceId);
+		return 0;
+	}
+
+	/* Check if this is the first load request after the OutManager was reset or after it was executed.
+	 * If this is the case, find the first free position in the PCRL.
+	 * NB: Since the for-loop is only entered if the PCRL is not full, it will always terminate
+	 *     through the break. This means that, when measuring branch coverage, the fall-through case
+	 *     at the for-loop will never occur. */
+	if (freePos == 0)
+		for (i=0; i<size; i++)
+			if (inManagerCSData->pcrl[i] == NULL) {
+				freePos = i;
+				break;
+			}
+
+	/* PCRL is not full --> load inCmp */
+	inManagerCSData->pcrl[freePos] = inCmp;
+	inManagerCSData->nOfInCmpInPcrl++;
+	inManagerCSData->nOfLoadedInCmp++;
+
+	/* Start tracking inCmp */
+	CrFwInRegistryStartTracking(inCmp);
+
+	/* Identify next free position in PCRL */
+	for (i=freePos+1; i<size; i++)
+		if (inManagerCSData->pcrl[i] == NULL) {
+			inManagerCSData->nextFreePcrlPos = (CrFwCounterU1_t)i;
+			return 1; /* a free position has been found */
+		}
+
+	return 1;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void InManagerInitAction(FwPrDesc_t initPr) {
+	CrFwCounterU1_t i;
+	CrFwCmpData_t* inManagerDataLocal = (CrFwCmpData_t*)FwPrGetData(initPr);
+	CrFwInManagerData_t* inManagerCSData = (CrFwInManagerData_t*)inManagerDataLocal->cmpSpecificData;
+	CrFwInstanceId_t id = inManagerDataLocal->instanceId;
+	inManagerCSData->pcrl = malloc(sizeof(FwSmDesc_t)*inManagerPcrlSize[id]);
+	for (i=0; i<inManagerPcrlSize[id]; i++)
+		inManagerCSData->pcrl[i] = NULL;
+	inManagerCSData->nOfInCmpInPcrl = 0;
+	inManagerDataLocal->outcome = 1;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void InManagerConfigAction(FwPrDesc_t initPr) {
+	CrFwCmpData_t* inManagerDataLocal = (CrFwCmpData_t*)FwPrGetData(initPr);
+	CrFwInManagerData_t* inManagerCSData = (CrFwInManagerData_t*)inManagerDataLocal->cmpSpecificData;
+	CrFwInstanceId_t id = inManagerDataLocal->instanceId;
+	CrFwCmpData_t* inCmpData;
+	CrFwCounterU1_t i;
+
+	for (i=0; i<inManagerPcrlSize[id]; i++) {
+		if (inManagerCSData->pcrl[i] != NULL) {
+			inCmpData = (CrFwCmpData_t*)FwSmGetData(inManagerCSData->pcrl[i]);
+			if (inCmpData->typeId == CR_FW_INREPORT_TYPE)	/* pending component is an InReport */
+				CrFwInFactoryReleaseInRep(inManagerCSData->pcrl[i]);
+			else
+				CrFwInFactoryReleaseInCmd(inManagerCSData->pcrl[i]);
+			inManagerCSData->pcrl[i] = NULL;
+		}
+	}
+	inManagerCSData->nOfInCmpInPcrl = 0;
+	inManagerCSData->nOfLoadedInCmp = 0;
+	inManagerCSData->nextFreePcrlPos = 0;
+	inManagerDataLocal->outcome = 1;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void InManagerShutdownAction(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* inManagerDataLocal = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInManagerData_t* inManagerCSData = (CrFwInManagerData_t*)inManagerDataLocal->cmpSpecificData;
+	CrFwInstanceId_t id = inManagerDataLocal->instanceId;
+	CrFwCmpData_t* inCmpData;
+	CrFwCounterU1_t i;
+
+	for (i=0; i<inManagerPcrlSize[id]; i++) {
+		if (inManagerCSData->pcrl[i] != NULL) {
+			inCmpData = (CrFwCmpData_t*)FwSmGetData(inManagerCSData->pcrl[i]);
+			if (inCmpData->typeId == CR_FW_INREPORT_TYPE)	/* pending component is an InReport */
+				CrFwInFactoryReleaseInRep(inManagerCSData->pcrl[i]);
+			else
+				CrFwInFactoryReleaseInCmd(inManagerCSData->pcrl[i]);
+			inManagerCSData->pcrl[i] = NULL;
+		}
+	}
+	free(inManagerCSData->pcrl);
+	inManagerCSData->nOfInCmpInPcrl = 0;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwCounterU1_t CrFwInManagerGetNOfPendingInCmp(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* inManagerDataLocal = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInManagerData_t* inManagerCSData = (CrFwInManagerData_t*)inManagerDataLocal->cmpSpecificData;
+	return inManagerCSData->nOfInCmpInPcrl;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwCounterU2_t CrFwInManagerGetNOfLoadedInCmp(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* inManagerDataLocal = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInManagerData_t* inManagerCSData = (CrFwInManagerData_t*)inManagerDataLocal->cmpSpecificData;
+	return inManagerCSData->nOfLoadedInCmp;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwCounterU1_t CrFwInManagerGetPCRLSize(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* inManagerDataLocal = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInstanceId_t id = inManagerDataLocal->instanceId;
+	return (CrFwCounterU1_t)inManagerPcrlSize[id];
+}
+
diff --git a/CrFramework/src/InManager/CrFwInManager.h b/CrFramework/src/InManager/CrFwInManager.h
new file mode 100644
index 0000000..e914942
--- /dev/null
+++ b/CrFramework/src/InManager/CrFwInManager.h
@@ -0,0 +1,170 @@
+/**
+ * @file
+ * @ingroup inMngGroup
+ * Definition of the InManager component.
+ *
+ * The InManager component is responsible for maintaining a list of
+ * pending InReports (see <code>CrFwInRep.h</code>) and InCommands (see <code>CrFwInCmd.h</code>)
+ * and for repeatedly executing them until they are either aborted or terminated.
+ *
+ * The list of pending InReports or InCommands is called the Pending Command/Report List or PCRL.
+ * The PCRL has a fixed size which is defined statically in <code>CrFwInManagerUserPar.h</code>.
+ *
+ * The InManager is defined as an extension of the Base Component (see <code>CrFwBaseCmp.h</code>).
+ * It uses the Execution Procedure of the Base Component to process the pending InReport and InCommands.
+ * The InManager component processes the pending InReports or InCommands by sending them an Execute
+ * command.
+ * After each Execute command, the state of the pending item is reported to the InRegistry
+ * (see <code>CrFwInRegistry.h</code>).
+ * InReports or InCommands which have been aborted or have terminated are removed
+ * from the PCRL and are returned to the InFactory.
+ * The Execution Procedure of the InManager is shown in the figure below.
+ *
+ * <b>Mode of Use of an InManager Component</b>
+ *
+ * The configuration of the InManager components is defined statically in
+ * <code>CrFwInManagerUserPar.h</code>.
+ *
+ * An InManager component is created with function <code>::CrFwInManagerMake</code>.
+ * After being created, the InManager must be initialized and reset.
+ * This is done with functions <code>::CrFwCmpInit</code> and <code>::CrFwCmpReset</code>.
+ * Nominally, after being initialized and reset the InManager State Machine should be
+ * in state CONFIGURED (this can be checked by verifying that function <code>FwSmGetCurState</code>
+ * returns CR_FW_BASE_STATE_CONFIGURED).
+ *
+ * Note that an application can have any number of InManagers.
+ *
+ * An InManager offers a Load operation (<code>::CrFwInManagerLoad</code>) through which
+ * an InReport or InCommand can be added to the PCRL.
+ * This operation is normally called by the InLoader (see <code>CrFwInLoader.h</code>).
+ *
+ * Note that there is no mechanism to “unload” a pending InReport or InCommand.
+ * The InManager autonomously returns an InReport or InCommand to its factory when the
+ * component has terminated or has been aborted.
+ * InReports are considered to have been terminated after they are executed once.
+ * InCommands are terminated if they are in state TERMINATED and they are aborted if
+ * they are in state ABORTED.
+ *
+ * After an InManager has been configured, it can be executed by means of function
+ * <code>FwSmExecute</code>.
+ * Execution of an InManager causes its Execution Procedure (see figure below) to be
+ * executed.
+ *
+ * When an InManager is reset or shutdown, its PCRL is reset (all pending InCommands and
+ * InReports are cleared and returned to theirs factories).
+ *
+ * @image html InManagerExecution.png
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_INMANAGER_H_
+#define CRFW_INMANAGER_H_
+
+/* Include FW Profile Files */
+#include "FwSmConstants.h"
+#include "FwPrConstants.h"
+/* Include Framework Files */
+#include "CrFwConstants.h"
+/* Include Configuration Files */
+#include "CrFwUserConstants.h"
+#include "Pckt/CrFwPcktQueue.h"
+
+/**
+ * Factory function to retrieve the i-th InManager State Machine instance.
+ * The first time this function is called with a certain value of the argument i, it
+ * creates the i-th InManager State Machine instance.
+ * Subsequent calls returns the same instance.
+ *
+ * The InManager identifier i must be in the range: [0, <code>#CR_FW_NOF_INMANAGER</code>-1].
+ * If the identifier is out of range, the function returns NULL and sets the application
+ * error code to: <code>::crInManagerIllId</code>.
+ *
+ * The first time this function is called with a certain value of i, it returns an
+ * InManager State Machine which has been started but which still needs to be initialized and
+ * configured.
+ * @param inManagerId the identifier of the InManager
+ * @return the descriptor of the InManager State Machine or NULL
+ * if the state machine could not be created or if the identifier i is out of range.
+ */
+FwSmDesc_t CrFwInManagerMake(CrFwInstanceId_t inManagerId);
+
+/**
+ * Load a new InReport or InCommand into the InManager.
+ * The behaviour implemented by this function is shown in the activity diagram below.
+ * If the PCRL is not full, the function identifies a free position in the PCRL where
+ * to store the InReport/InCommand.
+ * This function adds InReport/InCommand to the PCRL. The PCRL is flushed when the InManager
+ * is executed (i.e. it is flushed by function <code>::InManagerExecAction</code>).
+ * The algorithms to identify a free position in the PCRL and to process the PCRL
+ * entries when the InManager is executed are optimized for a situation where multiple
+ * load operations are performed before the InManager is executed.
+ *
+ * Additionally, these algorithms guarantee the following ordering constraint.
+ * Let InReports/InCommands C1 to Cn be successfully loaded into an InManager through a sequence
+ * of calls to function <code>::CrFwInManagerLoad</code> and assume that this sequence
+ * of load operations is not interrupted by an execution of the InManager.
+ * Under these conditions, when the InManager is executed next, the InReport/InCommand C1 to
+ * Cn will be processed in the order in which they have been loaded.
+ *
+ * The implementation of function <code>::CrFwInManagerLoad</code> is based on the
+ * internal variable <code>freePos</code>. This variable has the following
+ * characteristics:
+ * - it is initialized to point to the first entry in the PCRL;
+ * - after the execution of the load function, <code>freePos</code> either points to the next
+ * free position in the PCRL or is equal to the PCRL size if the PCRL is full;
+ * - after execution of the InManager, it is re-initialized to point to the first position
+ * in the PCRL.
+ * .
+ * @image html InManagerLoad.png
+ * @param smDesc the descriptor of the InManager State Machine.
+ * @param inCmp the descriptor of the InCommand or InReport to be loaded in the InManager
+ * @return 1 if the load operation was successful (the PCRL was not full and the
+ * InReport/InCommand was successfully loaded in the InManager) or 0 if
+ * the load operation has failed (the PCRL was full and the InReport/InCommand
+ * could not be loaded in the InManager).
+ */
+CrFwBool_t CrFwInManagerLoad(FwSmDesc_t smDesc, FwSmDesc_t inCmp);
+
+/**
+ * Return the number of InReport or InCommands currently in the PCRL of an InManager.
+ * @param smDesc the descriptor of the InManager State Machine.
+ * @return the number of OutComponents currently in the PCRL of an InManager.
+ */
+CrFwCounterU1_t CrFwInManagerGetNOfPendingInCmp(FwSmDesc_t smDesc);
+
+
+/**
+ * Return the number of InReport or InCommands successfully loaded since the InManager
+ * was last reset.
+ * @param smDesc the descriptor of the InManager State Machine.
+ * @return the number of InReport or InCommands currently in the PCRL of an InManager.
+ */
+CrFwCounterU2_t CrFwInManagerGetNOfLoadedInCmp(FwSmDesc_t smDesc);
+
+/**
+ * Return the size of the PCRL of an InManager.
+ * @param smDesc the descriptor of the InManager State Machine.
+ * @return the size of the PCRL of an InManager.
+ */
+CrFwCounterU1_t CrFwInManagerGetPCRLSize(FwSmDesc_t smDesc);
+
+#endif /* CRFW_INMANAGER_H_ */
diff --git a/CrFramework/src/InRegistry/CrFwInRegistry.c b/CrFramework/src/InRegistry/CrFwInRegistry.c
new file mode 100644
index 0000000..582811a
--- /dev/null
+++ b/CrFramework/src/InRegistry/CrFwInRegistry.c
@@ -0,0 +1,216 @@
+/**
+ * @file
+ *
+ * Implementation of InRegistry component.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include <stdlib.h>
+/* Include configuration files */
+#include "CrFwInRegistryUserPar.h"
+#include "CrFwCmpData.h"
+/* Include framework files */
+#include "CrFwConstants.h"
+#include "UtilityFunctions/CrFwUtilityFunctions.h"
+#include "OutCmp/CrFwOutCmp.h"
+#include "BaseCmp/CrFwBaseCmp.h"
+#include "BaseCmp/CrFwInitProc.h"
+#include "BaseCmp/CrFwResetProc.h"
+#include "BaseCmp/CrFwDummyExecProc.h"
+#include "CrFwInRegistry.h"
+/* Include FW Profile files */
+#include "FwPrConfig.h"
+#include "FwPrDCreate.h"
+#include "FwSmConfig.h"
+#include "FwSmDCreate.h"
+#include "FwPrCore.h"
+
+/**
+ * An instance of this type holds the information about an incoming command or report
+ * which is being tracked by the OuRegistry.
+ */
+typedef struct {
+	/** The identifier of the incoming command or report */
+	CrFwInstanceId_t instanceId;
+	/** The state of the incoming command or report */
+	CrFwInRegistryCmdRepState_t state;
+} CrFwTrackedState_t;
+
+/** Array to track the state of incoming commands or reports */
+static CrFwTrackedState_t cmdRepState[CR_FW_OUTREGISTRY_N];
+
+/** The index of the most recent entry in <code>cmdRepState</code>. */
+static CrFwTrackingIndex_t cmdRepStateIndex = 0;
+
+/** The InRegistry singleton. */
+static FwSmDesc_t inRegistry = NULL;
+
+/** The data for the InRegistry singleton. */
+static CrFwCmpData_t inRegistryData;
+
+/**
+ * Configuration action for InRegistry.
+ * This function resets the queue of tracked commands and reports.
+ * The outcome of the configuration action is always: "successful"
+ * @param resetPr the Configuration Procedure of the InRegistry
+ */
+static void InRegistryConfigAction(FwPrDesc_t resetPr);
+
+/**
+ * Shutdown action for InRegistry.
+ * This function resets the queue of tracked commands and reports.
+ * @param smDesc the InRegistry state machine
+ */
+static void InRegistryShutdownAction(FwSmDesc_t smDesc);
+
+/*------------------------------------------------------------------------------------*/
+FwSmDesc_t CrFwInRegistryMake() {
+	FwPrDesc_t resetPr, execPr, initPr;
+
+	if (inRegistry != NULL) {
+		return inRegistry;
+	}
+
+	/* Extend the Base Component */
+	inRegistry = FwSmCreateDer(CrFwBaseCmpMake());
+
+	/* Create the Reset Procedure for the OuRegistry Component */
+	resetPr = FwPrCreateDer(CrFwCmpGetResetProc());
+	FwPrOverrideAction(resetPr, &CrFwBaseCmpDefConfigAction, &InRegistryConfigAction);
+
+	/* Create the Initialization Procedure for the OuRegistry Component */
+	initPr = FwPrCreateDer(CrFwCmpGetInitProc());
+
+	/* Override the Shutdown Action for the InStream Component */
+	FwSmOverrideAction(inRegistry, &CrFwBaseCmpDefShutdownAction, &InRegistryShutdownAction);
+
+	/* Get the Dummy Execution Procedure for the InRegistry Component */
+	execPr = CrFwBaseCmpGetDummyExecProc();
+
+	/* Initialize the data for the requested SM */
+	inRegistryData.outcome = 1;
+	inRegistryData.initProc = initPr;
+	inRegistryData.resetProc = resetPr;
+	inRegistryData.execProc = execPr;
+	inRegistryData.instanceId = 0;
+	inRegistryData.typeId = CR_FW_INREGISTRY_TYPE;
+
+	/* Attach the data to the InRegistry state machine and to its procedures. */
+	FwSmSetData(inRegistry, &inRegistryData);
+	FwPrSetData(inRegistryData.initProc, &inRegistryData);
+	FwPrSetData(inRegistryData.resetProc, &inRegistryData);
+
+	/* Start the InRegistry */
+	FwSmStart(inRegistry);
+
+	return inRegistry;
+}
+
+/*------------------------------------------------------------------------------------*/
+void CrFwInRegistryStartTracking(FwSmDesc_t inCmp) {
+	CrFwCmpData_t* inCmpData = (CrFwCmpData_t*)FwSmGetData(inCmp);
+	CrFwInCmdData_t* inCmdCmpSpecificData;
+	CrFwInRepData_t* inRepCmpSpecificData;
+
+	cmdRepState[cmdRepStateIndex].instanceId = inCmpData->instanceId;
+	cmdRepState[cmdRepStateIndex].state = crInRegistryPending;
+	if (inCmpData->typeId == CR_FW_INREPORT_TYPE) {
+		inRepCmpSpecificData = (CrFwInRepData_t*)(inCmpData->cmpSpecificData);
+		inRepCmpSpecificData->trackingIndex = cmdRepStateIndex;
+	} else {
+		inCmdCmpSpecificData = (CrFwInCmdData_t*)(inCmpData->cmpSpecificData);
+		inCmdCmpSpecificData->trackingIndex = cmdRepStateIndex;
+	}
+
+	if (cmdRepStateIndex == (CR_FW_OUTREGISTRY_N-1))
+		cmdRepStateIndex = 0;
+	else
+		cmdRepStateIndex++;
+}
+
+/*------------------------------------------------------------------------------------*/
+void CrFwInRegistryUpdateState(FwSmDesc_t inCmp, CrFwInRegistryCmdRepState_t newState) {
+	CrFwCmpData_t* inCmpData = (CrFwCmpData_t*)FwSmGetData(inCmp);
+	CrFwInCmdData_t* inCmdCmpSpecificData;
+	CrFwInRepData_t* inRepCmpSpecificData;
+	CrFwTrackingIndex_t i;
+
+	if (inCmpData->typeId == CR_FW_INREPORT_TYPE) {
+		inRepCmpSpecificData = (CrFwInRepData_t*)(inCmpData->cmpSpecificData);
+		i = inRepCmpSpecificData->trackingIndex;
+	} else {
+		inCmdCmpSpecificData = (CrFwInCmdData_t*)(inCmpData->cmpSpecificData);
+		i = inCmdCmpSpecificData->trackingIndex;
+	}
+	if (cmdRepState[i].instanceId == inCmpData->instanceId) {
+		cmdRepState[i].state = newState;
+	}
+}
+
+/*------------------------------------------------------------------------------------*/
+CrFwInRegistryCmdRepState_t CrFwInRegistryGetState(CrFwInstanceId_t cmdRepId) {
+	CrFwTrackingIndex_t i;
+	CrFwTrackingIndex_t j;
+
+	if (cmdRepStateIndex > 0)
+		i = (CrFwTrackingIndex_t)(cmdRepStateIndex-1);
+	else
+		i = (CR_FW_OUTREGISTRY_N-1);
+
+	for (j=0; j<CR_FW_OUTREGISTRY_N; j++) {
+		if (cmdRepState[i].state == crInRegistryNoEntry)
+			break;
+		if (cmdRepState[i].instanceId == cmdRepId) {
+			return cmdRepState[i].state;
+		} else if (i == 0)
+			i = (CR_FW_OUTREGISTRY_N-1);
+		else
+			i--;
+	}
+
+	return crInRegistryNotTracked;
+}
+
+/*------------------------------------------------------------------------------------*/
+static void InRegistryConfigAction(FwPrDesc_t initPr) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwPrGetData(initPr);
+	CrFwCounterU2_t k;
+
+	for (k=0; k<CR_FW_OUTREGISTRY_N; k++)
+		cmdRepState[k].state = crInRegistryNoEntry;
+
+	cmdRepStateIndex = 0;
+
+	cmpData->outcome = 1;
+}
+
+/*------------------------------------------------------------------------------------*/
+static void InRegistryShutdownAction(FwSmDesc_t smDesc) {
+	CrFwCounterU2_t k;
+	CRFW_UNUSED(smDesc);
+
+	for (k=0; k<CR_FW_OUTREGISTRY_N; k++)
+		cmdRepState[k].state = crInRegistryNoEntry;
+
+	cmdRepStateIndex = 0;
+}
diff --git a/CrFramework/src/InRegistry/CrFwInRegistry.h b/CrFramework/src/InRegistry/CrFwInRegistry.h
new file mode 100644
index 0000000..0e4c493
--- /dev/null
+++ b/CrFramework/src/InRegistry/CrFwInRegistry.h
@@ -0,0 +1,151 @@
+/**
+ * @file
+ * @ingroup inMngGroup
+ * Definition of the InRegistry Component.
+ *
+ * An InRegistry acts as a registry for incoming commands or reports (namely for
+ * commands or reports which have been loaded into an InManager).
+ * The InRegistry is responsible for keeping track of the state of an incoming
+ * command or report.
+ *
+ * The InRegistry is a singleton component which is implemented as an extension
+ * of the Base Component of <code>CrFwBaseCmp.h</code>.
+ *
+ * The InRegistry maintains a list of the last N commands or reports to have been
+ * loaded in an InManager.
+ * The InRegistry maintains the state of each such command or report.
+ * The command's or report's state in the InRegistry can have one of the following values:
+ * - PENDING: the command or report is waiting to be executed
+ * - EXECUTING: the command has already been executed but has not yet completed
+ *   execution
+ * - ABORTED: the command was aborted during execution
+ * - TERMINATED: the command or report has completed execution
+ * .
+ * Note that the states EXECUTING and ABORTED only apply to incoming commands (incoming
+ * reports are only executed once and then are terminated).
+ *
+ * The value of N (the maximum number of items which can be tracked by the InRegistry)
+ * is fixed and is an initialization parameter.
+ *
+ * The InRegistry uses the instance identifier of the incoming command or report
+ * as the key through which the command or report state is tracked.
+ *
+ * <b>Mode of Use of an InRegistry Component</b>
+ *
+ * The configuration of the InRegistry component is defined statically in
+ * <code>CrFwInRegistryUserPar.h</code>.
+ *
+ * The InRegistry component is a "final" component that does not normally need
+ * to be extended.
+ *
+ * An InRegistry component is created with function <code>::CrFwInRegistryMake</code>.
+ * After being created, the InRegistry must be initialized and reset.
+ * This is done with functions <code>::CrFwCmpInit</code> and <code>::CrFwCmpReset</code>.
+ * Nominally, after being initialized and reset the InRegistry State Machine should be
+ * in state CONFIGURED (this can be checked by verifying that function <code>FwSmGetCurState</code>
+ * returns CR_FW_BASE_STATE_CONFIGURED).
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_INREGISTRY_H_
+#define CRFW_INREGISTRY_H_
+
+/* Include configuration files */
+#include "CrFwInRegistryUserPar.h"
+#include "CrFwUserConstants.h"
+/* Include FW Profile files */
+#include "FwSmConstants.h"
+#include "FwPrConstants.h"
+/* Include framework files */
+#include "CrFwConstants.h"
+
+/** Enumerated type for the state of a command or report tracked by the InRegistry */
+typedef enum {
+	/** No entry yet in InRegistry */
+	crInRegistryNoEntry = 0,
+	/** Incoming command or report is pending (waiting to be sent) */
+	crInRegistryPending = 1,
+	/** Incoming command has been executed but has not yet completed execution */
+	crInRegistryExecuting = 2,
+	/** Incoming command has been aborted */
+	crInRegistryAborted = 3,
+	/** Incoming command or report has completed execution */
+	crInRegistryTerminated = 4,
+	/** Incoming command or report is not tracked */
+	crInRegistryNotTracked = 5
+} CrFwInRegistryCmdRepState_t;
+
+/**
+ * Factory function for the singleton instance of the InRegistry.
+ * The first time this function is called, it creates and configures the InRegistry.
+ * Subsequent calls returns the same singleton instance.
+ * The first time this function is called, it returns the InRegistry in state CREATED.
+ *
+ * If the creation or the configuration of the InRegistry fails, the function
+ * returns NULL.
+ * @return singleton instance of the InRegistry or NULL if the creation or configuration
+ * of the InRegistry failed.
+ */
+FwSmDesc_t CrFwInRegistryMake();
+
+/**
+ * Ask the InRegistry to start tracking an incoming command or report.
+ * The InRegistry tracks the state of the last N incoming command or reports
+ * to have been loaded with this function.
+ * Initially, when this function is called, the incoming command or report is
+ * placed in state PENDING.
+ *
+ * This function runs the procedure in the left-hand
+ * side of the activity diagram shown in the figure.
+ * @image html RegistryStartTrackingAndUpdate.png
+ * @param inCmp the incoming command or report to be tracked
+ */
+void CrFwInRegistryStartTracking(FwSmDesc_t inCmp);
+
+/**
+ * Ask the InRegistry to update the state of an incoming command or report.
+ * If the argument component is not tracked by the InRegistry (perhaps because
+ * too many commands and reports have been added to the list of tracked components),
+ * nothing is done.
+ * This function runs the procedure in the right-hand
+ * side of the activity diagram shown in the figure.
+ * @image html RegistryStartTrackingAndUpdate.png
+ * @param inCmp the incoming command or report to be tracked
+ * @param newState the new state of the incoming command or report
+ */
+void CrFwInRegistryUpdateState(FwSmDesc_t inCmp, CrFwInRegistryCmdRepState_t newState);
+
+/**
+ * Query the InRegistry for the state of an incoming command or report.
+ * If the specified index does not correspond to any command or report being
+ * tracked by the InRegistry, a value of <code>::crInRegistryNotTracked</code>
+ * is returned.
+ * This function searches all locations in the InRegistry in sequence until it
+ * finds the incoming command or report.
+ * @param cmdRepId the instance identifier of the incoming command or report.
+ * @return the state of the incoming command or report (or <code>::crInRegistryNotTracked</code>
+ * if the command or report is not tracked)
+ */
+CrFwInRegistryCmdRepState_t CrFwInRegistryGetState(CrFwInstanceId_t cmdRepId);
+
+#endif /* CRFW_INREGISTRY_H_ */
diff --git a/CrFramework/src/InRep/CrFwInRep.c b/CrFramework/src/InRep/CrFwInRep.c
new file mode 100644
index 0000000..c7c5434
--- /dev/null
+++ b/CrFramework/src/InRep/CrFwInRep.c
@@ -0,0 +1,121 @@
+/**
+ * @file
+ *
+ * Implementation of InReport component.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include <stdlib.h>
+/* Include configuration files */
+#include "CrFwCmpData.h"
+/* Include framework files */
+#include "CrFwConstants.h"
+#include "CrFwRepErr.h"
+#include "UtilityFunctions/CrFwUtilityFunctions.h"
+#include "InRep/CrFwInRep.h"
+#include "BaseCmp/CrFwBaseCmp.h"
+#include "BaseCmp/CrFwInitProc.h"
+#include "BaseCmp/CrFwResetProc.h"
+#include "BaseCmp/CrFwDummyExecProc.h"
+#include "OutFactory/CrFwOutFactory.h"
+#include "Pckt/CrFwPckt.h"
+/* Include FW Profile files */
+#include "FwPrConfig.h"
+#include "FwPrDCreate.h"
+#include "FwSmConfig.h"
+#include "FwSmDCreate.h"
+#include "FwPrCore.h"
+
+/* --------------------------------------------------------------------------------- */
+CrFwDestSrc_t CrFwInRepGetSrc(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInRepData_t* cmpSpecificData = (CrFwInRepData_t*)(cmpData->cmpSpecificData);
+
+	return CrFwPcktGetSrc(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwGroup_t CrFwInRepGetGroup(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInRepData_t* cmpSpecificData = (CrFwInRepData_t*)(cmpData->cmpSpecificData);
+
+	return CrFwPcktGetGroup(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwServType_t CrFwInRepGetServType(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInRepData_t* cmpSpecificData = (CrFwInRepData_t*)(cmpData->cmpSpecificData);
+
+	return CrFwPcktGetServType(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwServType_t CrFwInRepGetServSubType(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInRepData_t* cmpSpecificData = (CrFwInRepData_t*)(cmpData->cmpSpecificData);
+
+	return CrFwPcktGetServSubType(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwDiscriminant_t CrFwInRepGetDiscriminant(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInRepData_t* cmpSpecificData = (CrFwInRepData_t*)(cmpData->cmpSpecificData);
+
+	return CrFwPcktGetDiscriminant(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwSeqCnt_t CrFwInRepGetSeqCnt(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInRepData_t* cmpSpecificData = (CrFwInRepData_t*)(cmpData->cmpSpecificData);
+
+	return CrFwPcktGetSeqCnt(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+char* CrFwInRepGetParStart(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInRepData_t* cmpSpecificData = (CrFwInRepData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktGetParStart(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwPcktLength_t CrFwInRepGetParLength(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInRepData_t* cmpSpecificData = (CrFwInRepData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktGetParLength(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+void CrFwInRepConfigCheck(FwPrDesc_t prDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+	CrFwInRepData_t* cmpSpecificData = (CrFwInRepData_t*)(cmpData->cmpSpecificData);
+
+	if (cmpSpecificData->isValid(prDesc) == 1)
+		cmpData->outcome = 1;
+	else
+		cmpData->outcome = 0;
+}
+
diff --git a/CrFramework/src/InRep/CrFwInRep.h b/CrFramework/src/InRep/CrFwInRep.h
new file mode 100644
index 0000000..07dadfd
--- /dev/null
+++ b/CrFramework/src/InRep/CrFwInRep.h
@@ -0,0 +1,148 @@
+/**
+ * @file
+ * @ingroup inMngGroup
+ * Definition of the InReport Component of the framework.
+ *
+ * An InReport encapsulates an incoming report in a service user application.
+ * The InReport is responsible for storing the attributes of an incoming report
+ * and for executing the conditional checks and actions associated to the report.
+ * The behaviour of an InReport is defined by the InReport State Machine
+ * (see figure below).
+ *
+ * <b>Mode of Use of an InReport Component</b>
+ *
+ * InReports are created dynamically by the InLoader when it processes an incoming
+ * packet which holds a report.
+ * The InReport component is created through a call to the factory function
+ * <code>::CrFwInFactoryMakeInRep</code>.
+ * The InLoader loads the InReport into an InManager who is then responsible for
+ * executing it and, eventually, for returning it to the InFactory.
+ *
+ * An InReport encapsulates an incoming report of a certain kind.
+ * The "kind" of an incoming command is defined by the triplet:
+ * [service type, service sub-type, discriminant].
+ * InReports are adapted to a certain incoming report kind by modifying the
+ * implementation of the following operations:
+ * - Validity Check Operation
+ * - Update Action Operation
+ * .
+ * This operation is statically defined for each kind of InReport in
+ * <code>CrFwInFactoryUserPar.h</code>.
+ * This header file defines default values for the Update Action Operation.
+ * The default for the Configuration Check Operation is the function
+ * <code>::CrFwBaseCmpDefConfigCheck</code>.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_INREP_H_
+#define CRFW_INREP_H_
+
+/* Include FW Profile files */
+#include "FwSmConstants.h"
+#include "FwPrConstants.h"
+/* Include configuration files */
+#include "Pckt/CrFwPcktQueue.h"
+#include "CrFwUserConstants.h"
+/* Include framework files */
+#include "CrFwConstants.h"
+
+/**
+ * Return the source of the InReport.
+ * @param smDesc the descriptor of the InRep State MachineStream
+ * @return the source of the InReport
+ */
+CrFwDestSrc_t CrFwInRepGetSrc(FwSmDesc_t smDesc);
+
+/**
+ * Return the group of the InReport.
+ * @param smDesc the descriptor of the InRep State MachineStream
+ * @return the group of the InReport
+ */
+CrFwGroup_t CrFwInRepGetGroup(FwSmDesc_t smDesc);
+
+/**
+ * Return the type of the InReport.
+ * @param smDesc the descriptor of the InRep State MachineStream
+ * @return the type of the InReport
+ */
+CrFwServType_t CrFwInRepGetServType(FwSmDesc_t smDesc);
+
+/**
+ * Return the sub-type of the InReport.
+ * @param smDesc the descriptor of the InRep State MachineStream
+ * @return the sub-type of the InReport
+ */
+CrFwServType_t CrFwInRepGetServSubType(FwSmDesc_t smDesc);
+
+/**
+ * Return the discriminant of the InReport.
+ * @param smDesc the descriptor of the InRep State MachineStream
+ * @return the discriminant of the InReport
+ */
+CrFwDiscriminant_t CrFwInRepGetDiscriminant(FwSmDesc_t smDesc);
+
+/**
+ * Return the sequence counter of the InReport.
+ * @param smDesc the descriptor of the InRep State MachineStream
+ * @return the sequence counter of the InReport
+ */
+CrFwSeqCnt_t CrFwInRepGetSeqCnt(FwSmDesc_t smDesc);
+
+/**
+ * Return the start address of the parameter area of the InReport.
+ * The InReport is encapsulated in a packet.
+ * The parameter area of the InReport is the part of the packet which is reserved to the
+ * storage of the parameters of the InReport.
+ * The parameter area consists of an uninterrupted sequence of bytes.
+ * The size of the parameter area is returned by function <code>::CrFwInRepGetParLength</code>.
+ * @param smDesc the descriptor of the Base State Machine of the InReport
+ * @return the start address of the InReport parameter area.
+ */
+char* CrFwInRepGetParStart(FwSmDesc_t smDesc);
+
+/**
+ * Return the length in bytes of the parameter area of the InReport.
+ * The InReport is encapsulated in a packet.
+ * The parameter area of the InReport is the part of the packet which is reserved to the
+ * storage of the parameters of the InReport.
+ * The parameter area consists of an uninterrupted sequence of bytes.
+ * The start address of the parameter area is returned by function <code>::CrFwInRepGetParStart</code>.
+ * @param smDesc the descriptor of the Base State Machine of the InReport
+ * @return the length in bytes of the InReport parameter area
+ */
+CrFwPcktLength_t CrFwInRepGetParLength(FwSmDesc_t smDesc);
+
+/**
+ * Configuration check for an InReport.
+ * This function executes the Validity Check of the InReport and sets the
+ * action outcome to 1 if the Validity Check returns true and sets it to
+ * zero if it returns false.
+ *
+ * This function is not intended to be called by applications.
+ * It is declared as a public function because it is needed by the
+ * InFactory (see <code>CrFwInFactory.h</code>).
+ * @param prDesc the descriptor of the InReport Configuration Procedure.
+ */
+void CrFwInRepConfigCheck(FwPrDesc_t prDesc);
+
+#endif /* CRFW_INREP_H_ */
diff --git a/CrFramework/src/InRep/CrFwInRepExecProc.c b/CrFramework/src/InRep/CrFwInRepExecProc.c
new file mode 100644
index 0000000..c6ce6f4
--- /dev/null
+++ b/CrFramework/src/InRep/CrFwInRepExecProc.c
@@ -0,0 +1,79 @@
+/**
+ * @file
+ *
+ * Implementation of InReport Execution Procedure.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include <stdlib.h>
+/* Configuration Files */
+#include "CrFwCmpData.h"
+/* Framework Files */
+#include "CrFwInRepExecProc.h"
+#include "CrFwInRep.h"
+#include "UtilityFunctions/CrFwUtilityFunctions.h"
+/* FW Profile Files */
+#include "FwPrConstants.h"
+#include "FwPrDCreate.h"
+#include "FwPrConfig.h"
+#include "FwPrCore.h"
+
+/**
+ * Function implementing the action of the single node in the Report Execution Procedure.
+ * @param prDesc the procedure descriptor
+ */
+static void CwFwInRepExecAction(FwPrDesc_t prDesc);
+
+/*-----------------------------------------------------------------------------------------*/
+FwPrDesc_t CrFwInRepExecProcMake() {
+	const FwPrCounterS1_t nOfANodes = 1;	/* Number of action nodes */
+	const FwPrCounterS1_t nOfDNodes = 0;	/* Number of decision nodes */
+	const FwPrCounterS1_t nOfFlows = 2;		/* Number of control flows */
+	const FwPrCounterS1_t nOfActions = 1;	/* Number of actions */
+	const FwPrCounterS1_t nOfGuards = 0;	/* Number of guards */
+	const FwPrCounterS1_t N1 = 1;			/* Identifier of first action node */
+	FwPrDesc_t execProc;
+
+	/* Create the execution procedure */
+	execProc = FwPrCreate(nOfANodes, nOfDNodes, nOfFlows, nOfActions, nOfGuards);
+
+	/* Configure the initialization procedure */
+	FwPrAddActionNode(execProc, N1, &CwFwInRepExecAction);
+	FwPrAddFlowIniToAct(execProc, N1, NULL);
+	FwPrAddFlowActToFin(execProc, N1, NULL);
+
+	return execProc;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+static void CwFwInRepExecAction(FwPrDesc_t prDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+	CrFwInRepData_t* cmpSpecificData = (CrFwInRepData_t*)(cmpData->cmpSpecificData);
+
+	cmpSpecificData->updateAction(prDesc);
+	return;
+}
+
+
+
+
diff --git a/CrFramework/src/InRep/CrFwInRepExecProc.h b/CrFramework/src/InRep/CrFwInRepExecProc.h
new file mode 100644
index 0000000..1473922
--- /dev/null
+++ b/CrFramework/src/InRep/CrFwInRepExecProc.h
@@ -0,0 +1,52 @@
+/**
+ * @file
+ * @ingroup inMngGroup
+ * Execution Procedure for the InReport Component.
+ * This procedure has single node which executes the Update Action of the
+ * InReport (see figure below).
+ * This header file gives access to a make function which creates a new
+ * instance of the procedure.
+ *
+ * @image html InReportExecution.png
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_INREP_EXEC_PROC_H_
+#define CRFW_INREP_EXEC_PROC_H_
+
+/* Include FW Profile files */
+#include "FwSmConstants.h"
+#include "FwPrConstants.h"
+/* Include framework files */
+#include "CrFwConstants.h"
+
+/**
+ * Create a new instance of the InReport Execution Procedure.
+ * This function returns the descriptor of newly created InReport Execution Procedure.
+ * Note that no data are attached to the descriptor as it is returned by this
+ * function.
+ * @return the descriptor of the InReport Execution Procedure or NULL if the
+ * procedure could not be created.
+ */
+FwPrDesc_t CrFwInRepExecProcMake();
+
+#endif /* CRFW_INREP_EXEC_PROC_H_ */
diff --git a/CrFramework/src/InStream/CrFwInStream.c b/CrFramework/src/InStream/CrFwInStream.c
new file mode 100644
index 0000000..0691cd1
--- /dev/null
+++ b/CrFramework/src/InStream/CrFwInStream.c
@@ -0,0 +1,386 @@
+/**
+ * @file
+ *
+ * Implementation of InStream State Machine.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include <stdlib.h>
+/* Include configuration files */
+#include "CrFwInStreamUserPar.h"
+#include "CrFwCmpData.h"
+/* Include framework files */
+#include "CrFwConstants.h"
+#include "UtilityFunctions/CrFwUtilityFunctions.h"
+#include "CrFwRepErr.h"
+#include "CrFwTime.h"
+#include "BaseCmp/CrFwBaseCmp.h"
+#include "CrFwInStream.h"
+#include "BaseCmp/CrFwInitProc.h"
+#include "BaseCmp/CrFwResetProc.h"
+#include "BaseCmp/CrFwDummyExecProc.h"
+#include "Pckt/CrFwPckt.h"
+#include "Pckt/CrFwPcktQueue.h"
+/* Include FW Profile files */
+#include "FwSmConstants.h"
+#include "FwSmDCreate.h"
+#include "FwSmConfig.h"
+#include "FwSmCore.h"
+#include "FwPrConstants.h"
+#include "FwPrDCreate.h"
+#include "FwPrConfig.h"
+#include "FwPrCore.h"
+
+/** Base InStream from which all other InStreams are derived. */
+static FwSmDesc_t baseInStreamSmDesc = NULL;
+
+/** The sizes of the packet queues in the InStream components. */
+static CrFwCounterU1_t inStreamPcktQueueSize[CR_FW_NOF_INSTREAM] = CR_FW_INSTREAM_PQSIZE;
+
+/** The number of groups associated to the InStream components. */
+static CrFwGroup_t inStreamNOfGroups[CR_FW_NOF_INSTREAM] = CR_FW_INSTREAM_NOF_GROUPS;
+
+/** The functions implementing the packet hand-over operations for the InStream components. */
+static CrFwPcktCollect_t inStreamPcktCollect[CR_FW_NOF_INSTREAM] = CR_FW_INSTREAM_PCKTCOLLECT;
+
+/** The functions implementing the packet available check operations for the InStream components. */
+static CrFwPcktAvailCheck_t inStreamPcktAvailCheck[CR_FW_NOF_INSTREAM] = CR_FW_INSTREAM_PCKTAVAILCHECK;
+
+/** The functions implementing the initialization checks for the InStream components. */
+static FwPrAction_t inStreamInitCheck[CR_FW_NOF_INSTREAM] = CR_FW_INSTREAM_INITCHECK;
+
+/** The functions implementing the initialization actions for the InStream components. */
+static FwPrAction_t inStreamInitAction[CR_FW_NOF_INSTREAM] = CR_FW_INSTREAM_INITACTION;
+
+/** The functions implementing the configuration checks for the InStream components. */
+static FwPrAction_t inStreamConfigCheck[CR_FW_NOF_INSTREAM] = CR_FW_INSTREAM_CONFIGCHECK;
+
+/** The functions implementing the configuration actions for the InStream components. */
+static FwPrAction_t inStreamConfigAction[CR_FW_NOF_INSTREAM] = CR_FW_INSTREAM_CONFIGACTION;
+
+/** The functions implementing the shutdown actions for the InStream components. */
+static FwSmAction_t inStreamShutdownAction[CR_FW_NOF_INSTREAM] = CR_FW_INSTREAM_SHUTDOWNACTION;
+
+/** The sources associated to the InStream components. */
+static CrFwDestSrc_t inStreamSrc[CR_FW_NOF_INSTREAM] = CR_FW_INSTREAM_SRC;
+
+/** The descriptors of the InStream State Machines. */
+static FwSmDesc_t inStreamDesc[CR_FW_NOF_INSTREAM];
+
+/** The data structures for the InStream State Machines and their Procedures. */
+static CrFwCmpData_t inStreamData[CR_FW_NOF_INSTREAM];
+
+/** The component-specific data for the InStream State Machines and their Procedures. */
+static CrFwInStreamData_t inStreamCmpSpecificData[CR_FW_NOF_INSTREAM];
+
+/**
+ * Function which checks if the packet queue is empty.
+ * This function is used as guard for the transition into state WAITING.
+ * @param smDesc the state machine descriptor
+ * @return 1 if the packet queue is empty; zero otherwise.
+ */
+static int IsPcktQueueEmpty(FwSmDesc_t smDesc);
+
+/**
+ * Function which checks if a packet is available.
+ * This function is used as guard for the transition into state WAITING.
+ * @param smDesc the state machine descriptor
+ * @return 1 if the packet queue is empty; zero otherwise.
+ */
+static int IsPcktAvail(FwSmDesc_t smDesc);
+
+/**
+ * Function which performs Action A in the InStream State Machine.
+ * This function is used as a transition action in the InStream State Machine.
+ * @param smDesc the state machine descriptor
+ * @return 1 if the packet queue is empty; zero otherwise.
+ */
+static void DoActionA(FwSmDesc_t smDesc);
+
+/**
+ * Function which performs Action b in the InStream State Machine.
+ * This function is used as a transition action in the InStream State Machine.
+ * @param smDesc the state machine descriptor
+ * @return 1 if the packet queue is empty; zero otherwise.
+ */
+static void DoActionB(FwSmDesc_t smDesc);
+
+
+/*-----------------------------------------------------------------------------------------*/
+FwSmDesc_t CrFwInStreamMake(CrFwInstanceId_t i) {
+	const FwSmCounterS1_t nOfStates = 2;	/* Number of states */
+	const FwSmCounterS1_t nOfChoicePseudoStates = 2;	/* Number of choice pseudo-states */
+	const FwSmCounterS1_t nOfTrans = 8;		/* Number of transitions */
+	const FwSmCounterS1_t nOfActions = 2;	/* Number of actions */
+	const FwSmCounterS1_t nOfGuards = 2;	/* Number of guards */
+	const FwSmCounterS1_t CPS_1 = 1;		/* Identifier of first choice pseudo-state */
+	const FwSmCounterS1_t CPS_2 = 2;		/* Identifier of second choice pseudo-state */
+	FwSmDesc_t esm;
+	FwPrDesc_t resetPr, execPr, initPr;
+
+	if (i >= CR_FW_NOF_INSTREAM) {
+		CrFwSetAppErrCode(crInStreamIllId);
+		return NULL;
+	}
+
+	/* If not yet done, create the base InStream SM */
+	if (baseInStreamSmDesc == NULL) {
+		/* Extend the Base Component */
+		baseInStreamSmDesc = FwSmCreateDer(CrFwBaseCmpMake());
+		/* Create the InStream SM and then embed it in state CONFIGURED of the Base Component */
+		esm = FwSmCreate(nOfStates, nOfChoicePseudoStates, nOfTrans, nOfActions, nOfGuards);
+		FwSmAddState(esm, CR_FW_INSTREAM_STATE_WAITING, 1, NULL, NULL, NULL, NULL);
+		FwSmAddState(esm, CR_FW_INSTREAM_STATE_PCKT_AVAIL, 2, NULL, NULL, NULL, NULL);
+		FwSmAddChoicePseudoState(esm, CPS_1, 2);
+		FwSmAddChoicePseudoState(esm, CPS_2, 2);
+		FwSmAddTransIpsToCps(esm, CPS_1, NULL);
+		FwSmAddTransCpsToSta(esm, CPS_1, CR_FW_INSTREAM_STATE_PCKT_AVAIL, &DoActionB, &IsPcktAvail);
+		FwSmAddTransCpsToSta(esm, CPS_1, CR_FW_INSTREAM_STATE_WAITING, NULL, NULL);	/* Else Transition */
+		FwSmAddTransStaToSta(esm, CR_FW_INSTREAM_TR_PACKET_AVAILABLE, CR_FW_INSTREAM_STATE_PCKT_AVAIL,
+		                     CR_FW_INSTREAM_STATE_PCKT_AVAIL, &DoActionB, NULL);
+		FwSmAddTransStaToCps(esm, CR_FW_INSTREAM_TR_PACKET_AVAILABLE, CR_FW_INSTREAM_STATE_WAITING,
+							 CPS_2, &DoActionB, NULL);
+		FwSmAddTransStaToCps(esm, CR_FW_INSTREAM_TR_GET_PCKT, CR_FW_INSTREAM_STATE_PCKT_AVAIL,
+		                     CPS_2, &DoActionA, NULL);
+		FwSmAddTransCpsToSta(esm, CPS_2, CR_FW_INSTREAM_STATE_WAITING, NULL, &IsPcktQueueEmpty);
+		FwSmAddTransCpsToSta(esm, CPS_2, CR_FW_INSTREAM_STATE_PCKT_AVAIL, NULL, NULL); /* Else Transition */
+		FwSmEmbed(baseInStreamSmDesc, CR_FW_BASE_STATE_CONFIGURED, esm);
+	}
+
+	if (inStreamDesc[i] != NULL) {
+		return inStreamDesc[i];	/* The requested SM has already been created */
+	}
+
+	/* Create the requested SM as an extension of the base InStream SM */
+	inStreamDesc[i] = FwSmCreateDer(baseInStreamSmDesc);
+
+	/* Create the Reset Procedure for the InStream Component */
+	resetPr = FwPrCreateDer(CrFwCmpGetResetProc());
+	FwPrOverrideAction(resetPr, &CrFwBaseCmpDefConfigCheck, inStreamConfigCheck[i]);
+	FwPrOverrideAction(resetPr, &CrFwBaseCmpDefConfigAction, inStreamConfigAction[i]);
+
+	/* Create the Initialization Procedure for the InStream Component */
+	initPr = FwPrCreateDer(CrFwCmpGetInitProc());
+	FwPrOverrideAction(initPr, &CrFwBaseCmpDefInitCheck, inStreamInitCheck[i]);
+	FwPrOverrideAction(initPr, &CrFwBaseCmpDefInitAction, inStreamInitAction[i]);
+
+	/* Override the Shutdown Action for the InStream Component */
+	FwSmOverrideAction(inStreamDesc[i], &CrFwBaseCmpDefShutdownAction, inStreamShutdownAction[i]);
+
+	/* Get the Dummy Execution Procedure for the InStream Component */
+	execPr = CrFwBaseCmpGetDummyExecProc();
+
+	/* Initialize the data for the requested InStream Component */
+	inStreamData[i].outcome = 1;
+	inStreamData[i].initProc = initPr;
+	inStreamData[i].resetProc = resetPr;
+	inStreamData[i].execProc = execPr;
+	inStreamData[i].instanceId = i;
+	inStreamData[i].typeId = CR_FW_INSTREAM_TYPE;
+	inStreamCmpSpecificData[i].collectPckt = inStreamPcktCollect[i];
+	inStreamCmpSpecificData[i].isPcktAvail = inStreamPcktAvailCheck[i];
+	inStreamCmpSpecificData[i].src = inStreamSrc[i];
+	inStreamData[i].cmpSpecificData = &inStreamCmpSpecificData[i];
+
+	/* Attach the data to the InStream state machine and to its procedures.
+	 * The data is attached to the outer SM and to the SM embedded in state CONFIGURED
+	 * and to the Initialization and Reset Procedures. */
+	FwSmSetData(inStreamDesc[i], &inStreamData[i]);
+	FwSmSetData(FwSmGetEmbSm(inStreamDesc[i], CR_FW_BASE_STATE_CONFIGURED), &inStreamData[i]);
+	FwPrSetData(inStreamData[i].initProc, &inStreamData[i]);
+	FwPrSetData(inStreamData[i].resetProc, &inStreamData[i]);
+
+	/* Start the InStream */
+	FwSmStart(inStreamDesc[i]);
+
+	return inStreamDesc[i];
+}
+
+/*-----------------------------------------------------------------------------------------*/
+FwSmDesc_t CrFwInStreamGet(CrFwDestSrc_t src) {
+	CrFwInstanceId_t i;
+	for (i=0; i<CR_FW_NOF_INSTREAM; i++)
+		if (inStreamCmpSpecificData[i].src == src)
+			return inStreamDesc[i];
+
+	CrFwSetAppErrCode(crInStreamUndefDest);
+	return NULL;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwBool_t CrFwInStreamIsInWaiting(FwSmDesc_t smDesc) {
+	return (FwSmGetCurStateEmb(smDesc) == CR_FW_INSTREAM_STATE_WAITING);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwBool_t CrFwInStreamIsInPcktAvail(FwSmDesc_t smDesc) {
+	return (FwSmGetCurStateEmb(smDesc) == CR_FW_INSTREAM_STATE_PCKT_AVAIL);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwPckt_t CrFwInStreamGetPckt(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* inStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInStreamData_t* cmpSpecificData = (CrFwInStreamData_t*)inStreamBaseData->cmpSpecificData;
+	cmpSpecificData->pckt = NULL;
+	FwSmMakeTrans(smDesc, CR_FW_INSTREAM_TR_GET_PCKT);
+	return cmpSpecificData->pckt;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwInStreamPcktAvail(FwSmDesc_t smDesc) {
+	FwSmMakeTrans(smDesc, CR_FW_INSTREAM_TR_PACKET_AVAILABLE);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwDestSrc_t CrFwInStreamGetSrc(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* inStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInStreamData_t* cmpSpecificData = (CrFwInStreamData_t*)inStreamBaseData->cmpSpecificData;
+	return cmpSpecificData->src;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwSeqCnt_t CrFwInStreamGetSeqCnt(FwSmDesc_t smDesc, CrFwGroup_t group) {
+	CrFwCmpData_t* inStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInStreamData_t* cmpSpecificData = (CrFwInStreamData_t*)inStreamBaseData->cmpSpecificData;
+	return cmpSpecificData->seqCnt[group];
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwInStreamSetSeqCnt(FwSmDesc_t smDesc, CrFwGroup_t group, CrFwSeqCnt_t seqCnt)
+{
+	CrFwCmpData_t* inStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInStreamData_t* cmpSpecificData = (CrFwInStreamData_t*)inStreamBaseData->cmpSpecificData;
+	cmpSpecificData->seqCnt[group] = seqCnt;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwCounterU1_t CrFwInStreamGetNOfPendingPckts(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* inStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInStreamData_t* cmpSpecificData = (CrFwInStreamData_t*)inStreamBaseData->cmpSpecificData;
+	return CrFwPcktQueueGetNOfPckts(&(cmpSpecificData->pcktQueue));
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwGroup_t CrFwInStreamGetNOfGroups(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* inStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	return inStreamNOfGroups[inStreamBaseData->instanceId];
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwCounterU1_t CrFwInStreamGetPcktQueueSize(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* inStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInStreamData_t* cmpSpecificData = (CrFwInStreamData_t*)inStreamBaseData->cmpSpecificData;
+	return CrFwPcktQueueGetSize(&(cmpSpecificData->pcktQueue));
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwInStreamDefConfigAction(FwPrDesc_t prDesc) {
+	CrFwCmpData_t* inStreamBaseData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+	CrFwInStreamData_t* cmpSpecificData = (CrFwInStreamData_t*)inStreamBaseData->cmpSpecificData;
+	CrFwGroup_t i;
+
+	CrFwPcktQueueReset(&(cmpSpecificData->pcktQueue));
+	cmpSpecificData->pckt = NULL;
+	for (i=0; i<inStreamNOfGroups[inStreamBaseData->instanceId]; i++)
+		cmpSpecificData->seqCnt[i] = 0;
+	inStreamData->outcome = 1;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwInStreamDefShutdownAction(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* inStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInStreamData_t* cmpSpecificData = (CrFwInStreamData_t*)inStreamBaseData->cmpSpecificData;
+
+	CrFwPcktQueueShutdown(&(cmpSpecificData->pcktQueue));
+	free(cmpSpecificData->seqCnt);
+	cmpSpecificData->seqCnt = NULL;
+	cmpSpecificData->pckt = NULL;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwInStreamDefInitAction(FwPrDesc_t prDesc) {
+	CrFwCmpData_t* inStreamBaseData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+	CrFwInStreamData_t* cmpSpecificData = (CrFwInStreamData_t*)inStreamBaseData->cmpSpecificData;
+	CrFwInstanceId_t i = inStreamBaseData->instanceId;
+
+	cmpSpecificData->seqCnt = malloc(sizeof(CrFwSeqCnt_t)*inStreamNOfGroups[i]);
+	CrFwPcktQueueInit(&(cmpSpecificData->pcktQueue), inStreamPcktQueueSize[i]);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void DoActionA(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* inStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInStreamData_t* cmpSpecificData = (CrFwInStreamData_t*)inStreamBaseData->cmpSpecificData;
+	cmpSpecificData->pckt = CrFwPcktQueuePop(&(cmpSpecificData->pcktQueue));
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void DoActionB(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* inStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInStreamData_t* cmpSpecificData = (CrFwInStreamData_t*)inStreamBaseData->cmpSpecificData;
+	CrFwDestSrc_t src = cmpSpecificData->src;
+	CrFwPckt_t pckt;
+	CrFwSeqCnt_t seqCnt;
+	CrFwGroup_t group;
+
+	while (cmpSpecificData->isPcktAvail(src)) {
+		pckt = cmpSpecificData->collectPckt(src);
+		if (!pckt) /* added by UVIE */
+		  return;
+		if (CrFwPcktGetDest(pckt) == CR_FW_HOST_APP_ID) {
+			seqCnt = CrFwPcktGetSeqCnt(pckt);
+			group = CrFwPcktGetGroup(pckt);
+			if (group < inStreamNOfGroups[inStreamBaseData->instanceId]) {
+				if (cmpSpecificData->seqCnt[group] != 0)
+					if ((cmpSpecificData->seqCnt[group]+1) != seqCnt)
+						CrFwRepErrSeqCnt(crInStreamSCErr, inStreamData->typeId, inStreamData->instanceId,
+						                 (cmpSpecificData->seqCnt[group]+1), seqCnt);
+
+				cmpSpecificData->seqCnt[group] = seqCnt;
+			} else
+				CrFwRepErrGroup(crInStreamIllGroup, inStreamBaseData->typeId,
+				                inStreamBaseData->instanceId, group);
+		}
+
+		if (CrFwPcktQueuePush(&(cmpSpecificData->pcktQueue), pckt) == 0) {
+			CrFwRepErr(crInStreamPQFull, inStreamData->typeId, inStreamData->instanceId);
+			CrFwPcktRelease(pckt);
+		}
+	}
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static int IsPcktAvail(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* inStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInStreamData_t* cmpSpecificData = (CrFwInStreamData_t*)inStreamBaseData->cmpSpecificData;
+	CrFwDestSrc_t src = cmpSpecificData->src;
+	return cmpSpecificData->isPcktAvail(src);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static int IsPcktQueueEmpty(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* inStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInStreamData_t* cmpSpecificData = (CrFwInStreamData_t*)inStreamBaseData->cmpSpecificData;
+	return CrFwPcktQueueIsEmpty(&(cmpSpecificData->pcktQueue));
+}
+
diff --git a/CrFramework/src/InStream/CrFwInStream.h b/CrFramework/src/InStream/CrFwInStream.h
new file mode 100644
index 0000000..8d328f0
--- /dev/null
+++ b/CrFramework/src/InStream/CrFwInStream.h
@@ -0,0 +1,255 @@
+/**
+ * @file
+ * @ingroup inMngGroup
+ * Definition of the InStream component.
+ *
+ * An InStream is responsible for managing the collection of packets (representing
+ * incoming reports or incoming commands) from a certain packet source.
+ * An InStream is implemented by the InStream State Machine (see figures below)
+ * embedded within state CONFIGURED of a Base State Machine.
+ *
+ * The InStream State Machine has two states. State PCKT_AVAIL represents a situation
+ * where one or more packets have been collected from the middleware and are waiting
+ * to be processed by the application.
+ * State WAITING represents a situation where no packets are pending in the InStream.
+ * The packets in the InStream are stored in a <i>Packet Queue</i>.
+ *
+ * An application can instantiate several InStream Components.
+ * Each InStream instance has an identifier which uniquely identifies it
+ * within the set of InStream Components.
+ * This identifier is an integer in the range 0 to: <code>#CR_FW_NOF_INSTREAM</code>-1.
+ * An application should instantiated one InStream for each source of incoming commands
+ * or reports.
+ *
+ * <b>Mode of Use of an InStream Component</b>
+ *
+ * The configuration of the InStream components is defined statically in
+ * <code>CrFwInStreamUserPar.h</code>.
+ *
+ * An InStream component is created with function <code>::CrFwInStreamMake</code>.
+ * After being created, the InStream must be initialized and reset.
+ * This is done with functions <code>::CrFwCmpInit</code> and <code>::CrFwCmpReset</code>.
+ * Nominally, after being initialized and reset the InStream State Machine should be
+ * in state CONFIGURED (this can be checked by verifying that function <code>FwSmGetCurState</code>
+ * returns CR_FW_BASE_STATE_CONFIGURED).
+ *
+ * After it has been configured, an InStream can process two transition commands:
+ * - A GetPacket command to retrieve one packet (representing either a command or a report)
+ *   from the InStream's Packet Queue. The GetPacket command returns packets in the order in
+ *   which they were collected from the middleware.
+ *   This command is sent through function <code>::CrFwInStreamGetPckt</code>.
+ * - A PacketAvailable command to check whether any packets are available at the middleware
+ *   interface and, if they are available, to collect them and store them in the InStream's Packet
+ *   Queue. This command is sent with the <code>::CrFwInStreamPcktAvail</code> function.
+ * .
+ * @image html InStream.png
+ * The InStream State Machine runs the Packet Collect Procedure shown in the following figure:
+ * @image html PacketCollect.png
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_INSTREAM_H_
+#define CRFW_INSTREAM_H_
+
+/* Include FW Profile Files */
+#include "FwSmConstants.h"
+#include "FwPrConstants.h"
+/* Include Configuration Files */
+#include "Pckt/CrFwPcktQueue.h"
+#include "CrFwUserConstants.h"
+/* Include Framework Files */
+#include "CrFwConstants.h"
+
+/**
+ * Factory function to retrieve the i-th InStream State Machine instance.
+ * The first time this function is called with a certain value of the argument i, it
+ * creates the i-th InStream State Machine instance.
+ * Subsequent calls returns the same instance.
+ *
+ * The InStream identifier i must be in the range: [0, <code>#CR_FW_NOF_INSTREAM</code>-1].
+ * If the identifier is out of range, the function returns NULL and sets the application
+ * error code to: <code>::crInStreamIllId</code>.
+ *
+ * The first time this function is called with a certain value of i, it returns an
+ * InStream State Machine which has been started but which must still be initialized
+ * and configured.
+ * @param inStreamId the identifier of the InStream
+ * @return the descriptor of the Base State Machine of the InStream or NULL
+ * if the state machine could not be created or if the identifier i is out of range.
+ */
+FwSmDesc_t CrFwInStreamMake(CrFwInstanceId_t inStreamId);
+
+/**
+ * Getter function for the InStream corresponding to the argument source.
+ * Nominally, each InStream is associated to a certain packet source.
+ * The binding between an InStream and its source is done statically in the
+ * configuration file <code>CrFwInStreamUserPar.h</code>.
+ *
+ * If the value of the source argument is illegal (i.e. if no
+ * InStream has been bound to it), this function returns NULL and sets the
+ * application error code to: <code>::crInStreamUndefDest</code>.
+ *
+ * This function should only be called after all InStreams have been built through
+ * calls to function <code>::CrFwInStreamMake</code>.
+ * If this pre-condition is not satisfied, execution of this function could result
+ * in an access to a NULL pointer.
+ * @param src the packet source associated to the InStream
+ * @return the descriptor of the InStream State Machine or NULL
+ * if the argument source was illegal or no InStream had been bound to it.
+ */
+FwSmDesc_t CrFwInStreamGet(CrFwDestSrc_t src);
+
+/**
+ * Retrieve a packet from the InStream.
+ * This function sends the GetPacket command to the InStream State Machine.
+ * If, at the time the function is called, the InStream is in state PCKT_AVAIL (i.e. if
+ * the InStream is configured and its packet queue is not empty), the function
+ * returns the oldest packet currently in the Packet Queue of the InStream; otherwise, the
+ * function return NULL.
+ * @param smDesc the descriptor of the Base State Machine of the InStream.
+ * @return pckt the oldest packet in the packet queue or NULL if there is no packet in
+ * the packet queue.
+ */
+CrFwPckt_t CrFwInStreamGetPckt(FwSmDesc_t smDesc);
+
+/**
+ * Query the middleware for available packets and collect them if they are available.
+ * This function sends the PacketAvailable command to the InStream State Machine.
+ * This command may be sent to the InStream by the middleware to signal
+ * the arrival of a new packet at the connection controlled by the InStream or
+ * it may be sent to poll the middleware and check whether any packets are
+ * available. If packets are available at the middleware, they are collected
+ * and stored in the InStream's Packet Queue.
+ * @param smDesc the descriptor of the Base State Machine of the InStream.
+ */
+void CrFwInStreamPcktAvail(FwSmDesc_t smDesc);
+
+/**
+ * Return true if the argument InStream is in state WAITING.
+ * @param smDesc the descriptor of the Base State Machine of the InStream.
+ * @return 1 if the argument InStream is in state CONFIGURED, sub-state WAITING;
+ * 0 otherwise.
+ */
+CrFwBool_t CrFwInStreamIsInWaiting(FwSmDesc_t smDesc);
+
+/**
+ * Return true if the argument InStream is in state PCKT_AVAIL.
+ * @param smDesc the descriptor of the Base State Machine of the InStream.
+ * @return 1 if the argument InStream is in state CONFIGURED, sub-state PCKT_AVAIL;
+ * 0 otherwise.
+ */
+CrFwBool_t CrFwInStreamIsInPcktAvail(FwSmDesc_t smDesc);
+
+/**
+ * Default configuration action for an InStream.
+ * This function resets the packet queue of the InStream.
+ * Configuration actions have an outcome (see <code>CrFwResetProc.h</code>).
+ * The outcome of this configuration action is always: "success".
+ *
+ * This function should never be directly called by the end-application.
+ * It is declared as a public function so that it may be used in application-specific
+ * Configuration Actions.
+ * @param prDesc the descriptor of the Reset Procedure of the InStream
+ */
+void CrFwInStreamDefConfigAction(FwPrDesc_t prDesc);
+
+/**
+ * Default initialization action for an InStream.
+ * This function: (a) allocates the memory for the packet queue of the InStream;
+ * (b) allocates the memory for the array holding the sequence counters for the destination/source
+ * groups associated to the Instream; and (c) initializes all data structures implementing
+ * the InStream.
+ * Initialization actions have an outcome (see <code>CrFwResetProc.h</code>).
+ * The situation of where the memory allocation fails is not handled and
+ * therefore the outcome of this configuration action is always "success".
+ *
+ * This function should never be directly called by the end-application.
+ * It is declared as a public function so that it may be used in application-specific
+ * Initialization Actions.
+ * @param prDesc the descriptor of the Initialization Procedure of the InStream
+ */
+void CrFwInStreamDefInitAction(FwPrDesc_t prDesc);
+
+/**
+ * Default shutdown action for an InStream.
+ * This function releases the memory allocated to the packet queue of the InStream
+ * and releases the memory allocated to the array holding the sequence counters.
+ *
+ * This function should never be directly called by the end-application.
+ * It is declared as a public function so that it may be used in application-specific
+ * Shutdown Actions.
+ * @param smDesc the descriptor of the InStream State Machine
+ */
+void CrFwInStreamDefShutdownAction(FwSmDesc_t smDesc);
+
+/**
+ * Return the value of the sequence counter of the last packet successfully
+ * collected by the InStream for a group.
+ * If no packet has yet been collected for that group after the InStream was reset, the
+ * sequence counter is equal to zero.
+ * @param smDesc the descriptor of the InStream State Machine
+ * @param group the identifier of the group
+ * @return the InStream sequence counter
+ */
+CrFwSeqCnt_t CrFwInStreamGetSeqCnt(FwSmDesc_t smDesc, CrFwGroup_t group);
+
+/**
+ * Overwrites the sequence counter value of the last packet for a group.
+ * Can be used to update the expected sequence counter value for the next
+ * packet.
+ * @param smDesc the descriptor of the InStream State Machine
+ * @param group the identifier of the group
+ * @param seqCnt the InStream sequence counter
+ */
+void CrFwInStreamSetSeqCnt(FwSmDesc_t smDesc, CrFwGroup_t group, CrFwSeqCnt_t seqCnt);
+
+/**
+ * Return the number of packets currently in the packet queue of an InStream.
+ * @param smDesc the descriptor of the InStream State Machine
+ * @return the number of packets currently in the packet queue of the InStream.
+ */
+CrFwCounterU1_t CrFwInStreamGetNOfPendingPckts(FwSmDesc_t smDesc);
+
+/**
+ * Return the number of groups associated to the InStream.
+ * @param smDesc the descriptor of the Base State Machine of the InStream.
+ * @return the number of groups associated to the InStream.
+ */
+CrFwGroup_t CrFwInStreamGetNOfGroups(FwSmDesc_t smDesc);
+
+/**
+ * Return the size of the packet queue of the InStream.
+ * @param smDesc the descriptor of the InStream State Machine
+ * @return the size of the packet queue of the InStream.
+ */
+CrFwCounterU1_t CrFwInStreamGetPcktQueueSize(FwSmDesc_t smDesc);
+
+/**
+ * Get the currently defined packet source of an InStream.
+ * An InStream can receive packets from one (and only one) source.
+ * A source has an identifier of type <code>::CrFwDestSrc_t</code>.
+ * @param smDesc the descriptor of the Base State Machine of the InStream.
+ * @return src the source associated to the OutStream
+ */
+CrFwDestSrc_t CrFwInStreamGetSrc(FwSmDesc_t smDesc);
+
+#endif /* CRFW_INSTREAM_H_ */
diff --git a/CrFramework/src/OutCmp/CrFwOutCmp.c b/CrFramework/src/OutCmp/CrFwOutCmp.c
new file mode 100644
index 0000000..de9c003
--- /dev/null
+++ b/CrFramework/src/OutCmp/CrFwOutCmp.c
@@ -0,0 +1,408 @@
+/**
+ * @file
+ *
+ * Implementation of OutComponent component.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include <stdlib.h>
+/* Include configuration files */
+#include "CrFwCmpData.h"
+/* Include framework files */
+#include "CrFwConstants.h"
+#include "CrFwRepErr.h"
+#include "UtilityFunctions/CrFwUtilityFunctions.h"
+#include "OutStream/CrFwOutStream.h"
+#include "OutCmp/CrFwOutCmp.h"
+#include "BaseCmp/CrFwBaseCmp.h"
+#include "BaseCmp/CrFwInitProc.h"
+#include "BaseCmp/CrFwResetProc.h"
+#include "BaseCmp/CrFwDummyExecProc.h"
+#include "OutFactory/CrFwOutFactory.h"
+#include "Pckt/CrFwPckt.h"
+#include "CrFwTime.h"
+/* Include FW Profile files */
+#include "FwPrConfig.h"
+#include "FwPrDCreate.h"
+#include "FwSmConfig.h"
+#include "FwSmDCreate.h"
+#include "FwPrCore.h"
+
+/** Base OutComponent from which all other OutComponents are derived. */
+static FwSmDesc_t baseOutCmpSmDesc = NULL;
+
+/**
+ * Transition action on the transition out of the LOADED state.
+ * This transition action executes the enable check and then
+ * sets the outcome as follows:
+ * - if the enable check returns "not enabled", the outcome is set to 0
+ * - if the enable check returns "enabled" the outcome is set to 1
+ * .
+ * The setting of the <code>isRepeat</code> flag is not done in this function.
+ * This flag will only be evaluated after the Repeat Check is performed and
+ * there is therefore no need to set it here.
+ * @param smDesc the descriptor of the OutComponent state machine
+ */
+void LoadedToCpsTransAction(FwSmDesc_t smDesc);
+
+/**
+ * Do action of the PENDING state (including behaviour of Send Packet Procedure).
+ * The outcome of the Repeat Check and of the Enable Check are stored in the outcome
+ * field of the component data as follows:
+ * - If the Enable Check reports 'Not Enabled', the outcome is set to zero
+ * - If the Enable Check reports 'Enabled' and the Repeat Check reports 'No Repeat',
+ *   the outcome is set to 2
+ * - In all other cases, the outcome is set to 1.
+ * .
+ * In order to understand why the logic in this function is equivalent to that of the
+ * specification, consider the outcome of executing and terminating the OutComponent
+ * for all possible values of the Ready Check, Repeat Check, Enable Check and validity
+ * statuses of the OutComponent's destination:
+ * - isReady==true, isRepeat==true, isEnabled==true, dest. is valid --> PENDING, outcome=1
+ * - isReady=='any', isRepeat=='any', isEnabled==false, dest. is 'any' --> ABORTED, outcome=0
+ * - isReady==true, isRepeat==false, isEnabled==true, dest. is valid --> TERMINATED, outcome=2
+ * - isReady==true, isRepeat=='any', isEnabled==true, dest. is false --> TERMINATED, outcome=2
+ * - isReady==false, isRepeat=='any', isEnabled==true, dest. is 'any' --> PENDING, outcome=1
+ * .
+ * @image html SendPacket.png
+ * @param smDesc the descriptor of the OutComponent state machine
+ */
+void PendingDoAction(FwSmDesc_t smDesc);
+
+/**
+ * Entry action of the SENDING state (including behaviour of Send Packet Procedure).
+ * The outcome of the Repeat Check is stored in the outcome field of the component
+ * data (a value of '1' corresponds to: 'Repeat' and a value of '2' corresponds to:
+ * 'No Repeat').
+ *
+ * In order to understand why the logic in this function is equivalent to that of the
+ * specification, consider the outcome of executing and terminating the OutComponent
+ * for all possible for all possible values of the Ready Check, Repeat Check, and
+ * validity statuses of the OutComponent's destination (recall that isRepeat and
+ * isEnabled are guaranteed to be true at entry):
+ * - isReady==true, isRepeat==true, dest. is valid --> PENDING, outcome=1
+ * - isReady==true, isRepeat==false, dest. is valid --> TERMINATED, outcome=2
+ * - isReady==false, isRepeat=='any', dest. is 'any' --> PENDING, outcome=1
+ * - isReady==true, isRepeat=='any', dest. is not valid --> TERMINATED, outcome=2
+ * .
+ * @image html SendPacket.png
+ * @param smDesc the descriptor of the OutComponent state machine
+ */
+void PendingEntryAction(FwSmDesc_t smDesc);
+
+/* --------------------------------------------------------------------------------- */
+FwSmDesc_t CrFwOutCmpMakeBase() {
+	FwSmCounterS1_t nOfStates = 4;		/* Number of states */
+	FwSmCounterS1_t nOfChoicePseudoStates = 1;	/* Number of choice pseudo-states */
+	FwSmCounterS1_t nOfTrans = 6;		/* Number of transitions */
+	FwSmCounterS1_t nOfActions = 3;		/* Number of actions */
+	FwSmCounterS1_t nOfGuards = 3;		/* Number of guards */
+	FwSmCounterS1_t CPS_1 = 1;			/* Identifier of first choice pseudo-state */
+	FwSmDesc_t esm;
+
+	if (baseOutCmpSmDesc != NULL)
+		return baseOutCmpSmDesc;
+
+	/* Create and configure the base OutComponent */
+
+	/* Extend the Base Component */
+	baseOutCmpSmDesc = FwSmCreateDer(CrFwBaseCmpMake());
+	/* Create the OutComponent SM and then embed it in state CONFIGURED of the Base Component */
+	esm = FwSmCreate(nOfStates, nOfChoicePseudoStates, nOfTrans, nOfActions, nOfGuards);
+	FwSmAddState(esm, CR_FW_OUTCMP_STATE_LOADED, 1, NULL, NULL, NULL, NULL);
+	FwSmAddState(esm, CR_FW_OUTCMP_STATE_ABORTED, 0, NULL, NULL, NULL, NULL);
+	FwSmAddState(esm, CR_FW_OUTCMP_STATE_PENDING, 2, &PendingEntryAction, NULL, &PendingDoAction, NULL);
+	FwSmAddState(esm, CR_FW_OUTCMP_STATE_TERMINATED, 0, NULL, NULL, NULL, NULL);
+	FwSmAddChoicePseudoState(esm, CPS_1, 2);
+	FwSmAddTransIpsToSta(esm, CR_FW_OUTCMP_STATE_LOADED, NULL);
+	FwSmAddTransStaToCps(esm, FW_TR_EXECUTE, CR_FW_OUTCMP_STATE_LOADED, CPS_1,
+	                     &LoadedToCpsTransAction, NULL);
+	FwSmAddTransCpsToSta(esm, CPS_1, CR_FW_OUTCMP_STATE_ABORTED, NULL, &CrFwIsSmOutcomeZero);
+	FwSmAddTransCpsToSta(esm, CPS_1, CR_FW_OUTCMP_STATE_PENDING, NULL, &CrFwIsSmOutcomeOne);
+	FwSmAddTransStaToSta(esm, CR_FW_OUTCMP_TR_TERMINATE, CR_FW_OUTCMP_STATE_PENDING,
+	                     CR_FW_OUTCMP_STATE_TERMINATED, NULL, &CrFwIsSmOutcomeTwo);
+	FwSmAddTransStaToSta(esm, CR_FW_OUTCMP_TR_TERMINATE, CR_FW_OUTCMP_STATE_PENDING,
+	                     CR_FW_OUTCMP_STATE_ABORTED, NULL, &CrFwIsSmOutcomeZero);
+	FwSmEmbed(baseOutCmpSmDesc, CR_FW_BASE_STATE_CONFIGURED, esm);
+
+	return baseOutCmpSmDesc;
+}
+
+/* --------------------------------------------------------------------------------- */
+void CrFwOutCmpTerminate(FwSmDesc_t smDesc) {
+	FwSmMakeTrans(smDesc, CR_FW_OUTCMP_TR_TERMINATE);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwBool_t CrFwOutCmpIsInLoaded(FwSmDesc_t smDesc) {
+	return (FwSmGetCurStateEmb(smDesc) == CR_FW_OUTCMP_STATE_LOADED);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwBool_t CrFwOutCmpIsInAborted(FwSmDesc_t smDesc) {
+	return (FwSmGetCurStateEmb(smDesc) == CR_FW_OUTCMP_STATE_ABORTED);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwBool_t CrFwOutCmpIsInPending(FwSmDesc_t smDesc) {
+	return (FwSmGetCurStateEmb(smDesc) == CR_FW_OUTCMP_STATE_PENDING);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwBool_t CrFwOutCmpIsInTerminated(FwSmDesc_t smDesc) {
+	return (FwSmGetCurStateEmb(smDesc) == CR_FW_OUTCMP_STATE_TERMINATED);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwBool_t CrFwOutCmpDefEnableCheck(FwSmDesc_t smDesc) {
+	return CrFwOutRegistryIsEnabled(smDesc);
+}
+
+/* --------------------------------------------------------------------------------- */
+void CrFwOutCmpDefSerialize(FwSmDesc_t smDesc) {
+	CrFwPckt_t pckt;
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+	pckt = cmpSpecificData->pckt;
+	CrFwPcktSetCmdRepId(pckt,cmpData->instanceId);
+
+	return;
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwDestSrc_t CrFwOutCmpGetDest(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktGetDest(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+void CrFwOutCmpSetDest(FwSmDesc_t smDesc, CrFwDestSrc_t dest) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+	CrFwPcktSetDest(cmpSpecificData->pckt, dest);
+	return;
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwGroup_t CrFwOutCmpGetGroup(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktGetGroup(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+void CrFwOutCmpSetGroup(FwSmDesc_t smDesc, CrFwGroup_t group) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+	CrFwPcktSetGroup(cmpSpecificData->pckt, group);
+	return;
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwTimeStamp_t CrFwOutCmpGetTimeStamp(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktGetTimeStamp(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+void CrFwOutCmpSetTimeStamp(FwSmDesc_t smDesc, CrFwTimeStamp_t timeStamp) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+	CrFwPcktSetTimeStamp(cmpSpecificData->pckt, timeStamp);
+	return;
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwServType_t CrFwOutCmpGetServType(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktGetServType(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwDestSrc_t CrFwOutCmpGetSrc(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktGetSrc(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwServType_t CrFwOutCmpGetServSubType(FwSmDesc_t smDesc)  {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktGetServSubType(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwDiscriminant_t CrFwOutCmpGetDiscriminant(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktGetDiscriminant(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+void CrFwOutCmpSetDiscriminant(FwSmDesc_t smDesc, CrFwDiscriminant_t discriminant) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+	CrFwPcktSetDiscriminant(cmpSpecificData->pckt, discriminant);
+}
+
+/* --------------------------------------------------------------------------------- */
+void CrFwOutCmpSetAckLevel(FwSmDesc_t smDesc, CrFwBool_t accept, CrFwBool_t start,
+                           CrFwBool_t progress, CrFwBool_t term) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+	CrFwPcktSetAckLevel(cmpSpecificData->pckt,accept,start,progress,term);
+	return;
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwBool_t CrFwOutCmpIsAcceptAck(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktIsAcceptAck(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwBool_t CrFwOutCmpIsStartAck(FwSmDesc_t smDesc)  {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktIsStartAck(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwBool_t CrFwOutCmpIsProgressAck(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktIsProgressAck(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwBool_t CrFwOutCmpIsTermAck(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktIsTermAck(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+void LoadedToCpsTransAction(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+	cmpData->outcome = (CrFwOutcome_t)cmpSpecificData->isEnabled(smDesc);
+	return;
+}
+
+/* --------------------------------------------------------------------------------- */
+void PendingEntryAction(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+	CrFwBool_t isReady;
+	CrFwBool_t isRepeat;
+	CrFwDestSrc_t dest;
+	FwSmDesc_t outStream;
+
+	isReady = cmpSpecificData->isReady(smDesc);
+	if (isReady) {
+		cmpSpecificData->update(smDesc);
+		dest = CrFwPcktGetDest(cmpSpecificData->pckt);
+		outStream = CrFwOutStreamGet(dest);
+		if (outStream == NULL) {
+			CrFwRepErrDestSrc(crOutCmpSendPcktInvDest, cmpData->typeId, cmpData->instanceId, dest);
+			isRepeat = 0;
+		} else {
+			CrFwOutCmpSetTimeStamp(smDesc,CrFwGetCurrentTime());
+			cmpSpecificData->serialize(smDesc);
+			CrFwOutStreamSend(outStream, cmpSpecificData->pckt);
+			isRepeat = cmpSpecificData->isRepeat(smDesc);
+		}
+		if (isRepeat == 1)
+			cmpData->outcome = 1;
+		else
+			cmpData->outcome = 2;
+	}
+}
+
+/* --------------------------------------------------------------------------------- */
+void PendingDoAction(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+	CrFwDestSrc_t dest;
+	FwSmDesc_t outStream;
+	CrFwBool_t isReady;
+	CrFwBool_t isRepeat;
+	CrFwBool_t isEnabled;
+
+	isReady = cmpSpecificData->isReady(smDesc);
+	isEnabled = cmpSpecificData->isEnabled(smDesc);
+
+	if (isReady == 1)
+		if (isEnabled ==1) {
+			cmpSpecificData->update(smDesc);
+			dest = CrFwPcktGetDest(cmpSpecificData->pckt);
+			outStream = CrFwOutStreamGet(dest);
+			if (outStream == NULL) {
+				CrFwRepErrDestSrc(crOutCmpSendPcktInvDest, cmpData->typeId, cmpData->instanceId, dest);
+				isRepeat = 0;
+			} else {
+				CrFwOutCmpSetTimeStamp(smDesc,CrFwGetCurrentTime());
+				cmpSpecificData->serialize(smDesc);
+				CrFwOutStreamSend(outStream, cmpSpecificData->pckt);
+				isRepeat = cmpSpecificData->isRepeat(smDesc);
+			}
+			if (isRepeat == 0) {
+				cmpData->outcome = 2;
+				return;
+			}
+		}
+
+	if (isEnabled == 0) {
+		cmpData->outcome = 0;
+		return;
+	}
+
+	cmpData->outcome = 1;
+}
+
+/* --------------------------------------------------------------------------------- */
+char* CrFwOutCmpGetParStart(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktGetParStart(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwPcktLength_t CrFwOutCmpGetParLength(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktGetParLength(cmpSpecificData->pckt);
+}
+
+/* --------------------------------------------------------------------------------- */
+CrFwPcktLength_t CrFwOutCmpGetLength(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+	return CrFwPcktGetLength(cmpSpecificData->pckt);
+}
diff --git a/CrFramework/src/OutCmp/CrFwOutCmp.h b/CrFramework/src/OutCmp/CrFwOutCmp.h
new file mode 100644
index 0000000..fa29189
--- /dev/null
+++ b/CrFramework/src/OutCmp/CrFwOutCmp.h
@@ -0,0 +1,348 @@
+/**
+ * @file
+ * @ingroup outMngGroup
+ * Definition of the OutComponent Component of the framework.
+ *
+ * An OutComponent encapsulates an out-going command or an out-going report.
+ * The OutComponent is responsible for serializing the out-going command or report
+ * to a packet and sending the packet to an OutStream for dispatching to its
+ * destination.
+ * The behaviour of an OutComponent is defined by the OutComponent State Machine
+ * embedded in the CONFIGURED state of the Base State Machine and
+ * by the Send Packet Procedure (see figures below).
+ *
+ * <b>Mode of Use of an OutComponent Component</b>
+ *
+ * Applications create OutComponents dynamically through calls to the factory
+ * function <code>::CrFwOutFactoryMakeOutCmp</code>.
+ * OutComponents thus returned are expected to be in state CREATED (if this
+ * is not the case - perhaps because the OutComponent's configuration action
+ * has failed to complete successfully - the OutComponent will remain permanently
+ * pending and will never be sent to its destination).
+ *
+ * An OutComponent is used to encapsulate an out-going command or report of
+ * a certain kind.
+ * The "kind" of an out-going command or report is defined by the triplet:
+ * [service type, service sub-type, discriminant].
+ * OutComponents are adapted to a certain kind of out-going report or command
+ * by modifying one or more of the following:
+ * - The Enable Check Operation
+ * - The Ready Check Operation
+ * - The Repeat Check Operation
+ * - The Update Action Operation
+ * - The Serialize Operation
+ * .
+ * These operations are statically defined for each kind of OutComponent in
+ * <code>CrFwOutFactoryUserPar.h</code>.
+ *
+ * This header file defines default values for all configurable operations listed
+ * above.
+ * The default implementations for the Enable Check, Ready Check and Repeat Check will
+ * often be suitable for many kinds of out-going reports or commands but
+ * dedicated implementations of the Serialize and Update Action will probably have to
+ * be provided for application-specific out-going reports or commands.
+ *
+ * @image html OutComponent.png
+ * <center>-</center>
+ * @image html SendPacket.png
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_OUTCMP_H_
+#define CRFW_OUTCMP_H_
+
+/* Include FW Profile files */
+#include "FwSmConstants.h"
+#include "FwPrConstants.h"
+/* Include configuration files */
+#include "Pckt/CrFwPcktQueue.h"
+#include "CrFwUserConstants.h"
+/* Include framework files */
+#include "OutRegistry/CrFwOutRegistry.h"
+#include "CrFwConstants.h"
+
+/**
+ * Return the base OutComponent from which all other OutComponents are derived.
+ * The base OutComponent is a singleton.
+ * The first time it is called, this function creates and configures the base OutComponent instance.
+ * Subsequent calls return this same instance.
+ * This function is only intended to be used by the OutFactory (see <code>CrFwOutFactory.h</code>)
+ * and should not be used by applications.
+ * @return the singleton instance of the base OutComponent
+ */
+FwSmDesc_t CrFwOutCmpMakeBase();
+
+/**
+ * Send command Terminate to the argument OutComponent.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent
+ */
+void CrFwOutCmpTerminate(FwSmDesc_t smDesc);
+
+/**
+ * Return true if the argument OutComponent is in state LOADED.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent
+ * @return 1 if the argument OutComponent is in state CONFIGURED, sub-state
+ * LOADED; 0 otherwise
+ */
+CrFwBool_t CrFwOutCmpIsInLoaded(FwSmDesc_t smDesc);
+
+/**
+ * Return true if the argument OutComponent is in state ABORTED.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent
+ * @return 1 if the argument OutComponent is in state CONFIGURED, sub-state
+ * ABORTED; 0 otherwise
+ */
+CrFwBool_t CrFwOutCmpIsInAborted(FwSmDesc_t smDesc);
+
+/**
+ * Return true if the argument OutComponent is in state PENDING.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent
+ * @return 1 if the argument OutComponent is in state CONFIGURED, sub-state
+ * PENDING; 0 otherwise
+ */
+CrFwBool_t CrFwOutCmpIsInPending(FwSmDesc_t smDesc);
+
+/**
+ * Return true if the argument OutComponent is in state TERMINATED.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent
+ * @return 1 if the argument OutComponent is in state CONFIGURED, sub-state
+ * TERMINATED; 0 otherwise
+ */
+CrFwBool_t CrFwOutCmpIsInTerminated(FwSmDesc_t smDesc);
+
+/**
+ * Default implementation of the Enable Check Operation for an OutComponent.
+ * This function retrieves the enable status of the OutComponent from the OutRegistry
+ * (see <code>::CrFwOutRegistryIsEnabled</code>).
+ *
+ * This function should never be directly called by the end-application.
+ * It is declared as a public function so that it may be used in application-specific
+ * Enable Check Operations.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent.
+ * @return 1 if the OutComponent is enabled, 0 if it is not enabled.
+ */
+CrFwBool_t CrFwOutCmpDefEnableCheck(FwSmDesc_t smDesc);
+
+/**
+ * Default implementation of the Serialize Operation for an OutComponent.
+ * This implementation writes to the packet encapsulated in the OutComponent all the
+ * following attributes of the out-going report or command:
+ * - The command or report identifier (this is set equal to the instance identifier
+ *   of the OutComponent)
+ * .
+ * This function should never be directly called by the end-application.
+ * It is declared as a public function so that it may be used in application-specific
+ * Serialize Operations.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent.
+ */
+void CrFwOutCmpDefSerialize(FwSmDesc_t smDesc);
+
+/**
+ * Return the destination of the OutComponent.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent
+ * @return the destination of the OutComponent
+ */
+CrFwDestSrc_t CrFwOutCmpGetDest(FwSmDesc_t smDesc);
+
+/**
+ * Set the destination of the OutComponent.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent
+ * @param dest the destination of the OutComponent
+ */
+void CrFwOutCmpSetDest(FwSmDesc_t smDesc, CrFwDestSrc_t dest);
+
+/**
+ * Return the group of the OutComponent.
+ * By default, the group of an OutComponent is set when the OutComponent is created
+ * by function <code>::CrFwOutFactoryMakeOutCmp</code> but its value can be overridden
+ * with function <code>::CrFwOutCmpSetGroup</code>.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent
+ * @return the group of the OutComponent
+ */
+CrFwGroup_t CrFwOutCmpGetGroup(FwSmDesc_t smDesc);
+
+/**
+ * Set the group of the OutComponent.
+ * By default, the group of an OutComponent is set when the OutComponent is created
+ * by function <code>::CrFwOutFactoryMakeOutCmp</code> but its value can be overridden
+ * with this function.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent
+ * @param group the group
+ * @return the group of the OutComponent
+ */
+void CrFwOutCmpSetGroup(FwSmDesc_t smDesc, CrFwGroup_t group);
+
+/**
+ * Return the time stamp attribute of the OutComponent.
+ * By default, the time stamp is set when the OutComponent is loaded into the OutLoader
+ * (see <code>::CrFwOutLoaderLoad</code>) but its value can be overridden with
+ * function <code>::CrFwOutCmpSetTimeStamp</code>.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent
+ * @return the time stamp attribute of the OutComponent
+ */
+CrFwTimeStamp_t CrFwOutCmpGetTimeStamp(FwSmDesc_t smDesc);
+
+/**
+ * Set the time stamp attribute of the OutComponent.
+ * By default, the time stamp is set when the OutComponent is loaded into the OutLoader
+ * (see <code>::CrFwOutLoaderLoad</code>).
+ * This function can be used to override this default setting.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent
+ * @param timeStamp the time stamp of the OutComponent
+ */
+void CrFwOutCmpSetTimeStamp(FwSmDesc_t smDesc, CrFwTimeStamp_t timeStamp);
+
+/**
+ * Return the source of the OutComponent.
+ * The source of the OutComponent is set when the OutComponent is
+ * created by function <code>::CrFwOutFactoryMakeOutCmp</code> and cannot be changed
+ * afterwards.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent
+ * @return the source of the OutComponent
+ */
+CrFwDestSrc_t CrFwOutCmpGetSrc(FwSmDesc_t smDesc);
+
+/**
+ * Return the type of the OutComponent.
+ * The type of the OutComponent is set when the OutComponent is
+ * created by function <code>::CrFwOutFactoryMakeOutCmp</code> and cannot be changed
+ * afterwards.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent
+ * @return the type of the OutComponent
+ */
+CrFwServType_t CrFwOutCmpGetServType(FwSmDesc_t smDesc);
+
+/**
+ * Return the sub-type of the OutComponent.
+ * The sub-type of the OutComponent is set when the OutComponent is
+ * created by function <code>::CrFwOutFactoryMakeOutCmp</code> and cannot be changed
+ * afterwards.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent
+ * @return the sub-type of the OutComponent
+ */
+CrFwServType_t CrFwOutCmpGetServSubType(FwSmDesc_t smDesc);
+
+/**
+ * Return the discriminant of the OutComponent.
+ * The discriminant of the OutComponent is set when the OutComponent is
+ * created by function <code>::CrFwOutFactoryMakeOutCmp</code> but
+ * can subsequently be changed through function
+ * <code>::CrFwOutCmpSetDiscriminant</code>.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent
+ * @return the discriminant of the OutComponent
+ */
+CrFwDiscriminant_t CrFwOutCmpGetDiscriminant(FwSmDesc_t smDesc);
+
+/**
+ * Set the discriminant of the OutComponent.
+ * The default value of the discriminant of the OutComponent is set when the OutComponent
+ * is created by function <code>::CrFwOutFactoryMakeOutCmp</code>.
+ * This function allows this default value to be changed.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent
+ * @param discriminant the discriminant of the OutComponent
+ */
+void CrFwOutCmpSetDiscriminant(FwSmDesc_t smDesc, CrFwDiscriminant_t discriminant);
+
+/**
+ * Set the acknowledge level for the command encapsulated in the OutComponent.
+ * This function should only be called on OutComponents which encapsulate an
+ * out-going command (but no check is performed that this is actually the
+ * case).
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent.
+ * @param accept 1 if acknowledge of command acceptance is desired, 0 otherwise.
+ * @param start 1 if acknowledge of command start is desired, 0 otherwise.
+ * @param progress 1 if acknowledge of command progress is desired, 0 otherwise.
+ * @param term 1 if acknowledge of command acceptance termination is desired, 0 otherwise.
+ */
+void CrFwOutCmpSetAckLevel(FwSmDesc_t smDesc, CrFwBool_t accept, CrFwBool_t start,
+                           CrFwBool_t progress, CrFwBool_t term);
+
+/**
+ * Return the acknowledge level for command acceptance for the command encapsulated in the
+ * OutComponent.
+ * If the OutComponent does not hold a command, the behaviour of the function is undefined.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent.
+ * @return 1 if command acceptance is to be acknowledged, 0 otherwise.
+ */
+CrFwBool_t CrFwOutCmpIsAcceptAck(FwSmDesc_t smDesc);
+
+/**
+ * Return the acknowledge level for command start for the command encapsulated in the
+ * OutComponent.
+ * If the OutComponent does not hold a command, the behaviour of the function is undefined.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent.
+ * @return 1 if command start is to be acknowledged, 0 otherwise.
+ */
+CrFwBool_t CrFwOutCmpIsStartAck(FwSmDesc_t smDesc);
+
+/**
+ * Return the acknowledge level for command progress for the command encapsulated in the
+ * OutComponent.
+ * If the OutComponent does not hold a command, the behaviour of the function is undefined.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent.
+ * @return 1 if command progress is to be acknowledged, 0 otherwise.
+ */
+CrFwBool_t CrFwOutCmpIsProgressAck(FwSmDesc_t smDesc);
+
+/**
+ * Return the acknowledge level for command termination for the command encapsulated in the
+ * OutComponent.
+ * If the OutComponent does not hold a command, the behaviour of the function is undefined.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent.
+ * @return 1 if command termination is to be acknowledged, 0 otherwise.
+ */
+CrFwBool_t CrFwOutCmpIsTermAck(FwSmDesc_t smDesc);
+
+/**
+ * Return the start address of the parameter area of the OutComponent.
+ * The OutComponent is encapsulated in a packet.
+ * The parameter area of the OutComponent is the part of the packet which is reserved to the
+ * storage of the parameters of the OutComponent.
+ * The parameter area consists of an uninterrupted sequence of bytes.
+ * The size of the parameter area is returned by function <code>::CrFwOutCmpGetParLength</code>.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent
+ * @return the start address of the OutComponent parameter area.
+ */
+char* CrFwOutCmpGetParStart(FwSmDesc_t smDesc);
+
+/**
+ * Return the length in bytes of the parameter area of the OutComponent.
+ * The OutComponent is encapsulated in a packet.
+ * The parameter area of the OutComponent is the part of the packet which is reserved to the
+ * storage of the parameters of the OutComponent.
+ * The parameter area consists of an uninterrupted sequence of bytes.
+ * The start address of the parameter area is returned by function <code>::CrFwOutCmpGetParStart</code>.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent
+ * @return the length in bytes of the OutComponent parameter area
+ */
+CrFwPcktLength_t CrFwOutCmpGetParLength(FwSmDesc_t smDesc);
+
+/**
+ * Return the length in bytes of the packet to which the OutComponent is serialized.
+ * The length returned by this function covers both the packet header and the packet parameter area.
+ * The length of the packet parameter area is returned by function <code>::CrFwOutCmpGetParLength</code>.
+ * @param smDesc the descriptor of the Base State Machine of the OutComponent
+ * @return the length in bytes of the OutComponent packet
+ */
+CrFwPcktLength_t CrFwOutCmpGetLength(FwSmDesc_t smDesc);
+
+#endif /* CRFW_OUTCMP_H_ */
diff --git a/CrFramework/src/OutFactory/CrFwOutFactory.c b/CrFramework/src/OutFactory/CrFwOutFactory.c
new file mode 100644
index 0000000..b8cfdd2
--- /dev/null
+++ b/CrFramework/src/OutFactory/CrFwOutFactory.c
@@ -0,0 +1,376 @@
+/**
+ * @file
+ *
+ * Implementation of OutFactory component.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include <stdlib.h>
+/* Include configuration files */
+#include "CrFwOutFactoryUserPar.h"
+#include "CrFwCmpData.h"
+/* Include framework files */
+#include "CrFwConstants.h"
+#include "UtilityFunctions/CrFwUtilityFunctions.h"
+#include "OutCmp/CrFwOutCmp.h"
+#include "BaseCmp/CrFwBaseCmp.h"
+#include "BaseCmp/CrFwInitProc.h"
+#include "BaseCmp/CrFwResetProc.h"
+#include "BaseCmp/CrFwDummyExecProc.h"
+#include "Pckt/CrFwPckt.h"
+#include "OutRegistry/CrFwOutRegistry.h"
+#include "CrFwOutFactory.h"
+#include "CrFwTime.h"
+/* Include FW Profile files */
+#include "FwPrConfig.h"
+#include "FwPrDCreate.h"
+#include "FwSmConfig.h"
+#include "FwSmCore.h"
+#include "FwSmDCreate.h"
+#include "FwPrCore.h"
+
+/** Array holding the keys of the OutComponents kinds */
+static CrFwCmdRepKindKey_t outCmpKindKey[CR_FW_OUTCMP_NKINDS];
+
+/** Array of service descriptors (see <code>CrFwServDesc_t</code>). */
+static CrFwOutCmpKindDesc_t outCmpKindDesc[CR_FW_OUTCMP_NKINDS] = CR_FW_OUTCMP_INIT_KIND_DESC;
+
+/** The pre-allocated OutComponent instances */
+static FwSmDesc_t outCmp[CR_FW_OUTFACTORY_MAX_NOF_OUTCMP];
+
+/** The data for the pre-allocated OutComponent instances */
+static CrFwCmpData_t outCmpData[CR_FW_OUTFACTORY_MAX_NOF_OUTCMP];
+
+/** The component-specific data for the pre-allocated OutReport instances */
+static CrFwOutCmpData_t outCmpSpecificData[CR_FW_OUTFACTORY_MAX_NOF_OUTCMP];
+
+/** The in-use status of each pre-allocated OutComponent instance */
+static CrFwBool_t outCmpInUse[CR_FW_OUTFACTORY_MAX_NOF_OUTCMP];
+
+/** The number of currently allocated OutComponents */
+static CrFwOutFactoryPoolIndex_t nOfAllocatedOutCmp;
+
+/**
+ * The index of the next free position in the pool of pre-allocated OutComponent instances
+ * (a value of CR_FW_OUTFACTORY_MAX_NOF_OUTCMP indicates that all OutComponent instances
+ * have been allocated and there are no free positions left) */
+static CrFwOutFactoryPoolIndex_t nextFreePos;
+
+/** The total number of OutComponents allocated since the OutFactory was reset */
+static CrFwInstanceId_t nOfAllocatedOutCmpSinceReset = 0;
+
+/** The singleton instance of the OutFactory */
+static FwSmDesc_t outFactory;
+
+/** The data for the OutFactory singleton. */
+static CrFwCmpData_t outFactoryData;
+
+/** The part of the command or report identifier which depends on the application identifier */
+static CrFwInstanceId_t apidInstanceId = CR_FW_HOST_APP_ID << (sizeof(CrFwInstanceId_t)*8-CR_FW_NBITS_APP_ID);
+
+/** The highest value of cmd/rep identifier (before overflowing into the application identifier bits) */
+static CrFwInstanceId_t maxInstanceId = (1 << (sizeof(CrFwInstanceId_t)*8-CR_FW_NBITS_APP_ID));
+
+/**
+ * Initialization action for OutFactory.
+ * This function allocates the memory for the OutFactory data structures and
+ * initializes the array of descriptors <code>::outCmpKindDesc</code>.
+ * The outcome of the initialization action is "successful" in all cases except when
+ * the memory allocation operation fails.
+ * @param initPr the Initialization Procedure of the OutFactory
+ */
+static void OutFactoryInitAction(FwPrDesc_t initPr);
+
+/**
+ * Configuration action for OutFactory.
+ * This function releases all the OutComponents which are currently allocated.
+ * After this function has been called, any OutComponent which is still in
+ * use within the application is no longer valid and should be discarded.
+ *
+ * This function also resets the counter used to initialize the instance
+ * identifier of the OutComponents created by the OutFactory.
+ * After reset, the first OutComponent made by the OutFactory will have its
+ * instance identifier set to 1.
+ *
+ * The outcome of the initialization action is always: "successful"
+ * @param initPr the Initialization Procedure of the OutFactory
+ */
+static void OutFactoryConfigAction(FwPrDesc_t initPr);
+
+/**
+ * Shutdown action for OutFactory.
+ * This function releases the memory which was allocated when the OutFactory was
+ * initialized and it sets the number of allocated OutComponents to zero.
+ * After this function has been called, any OutComponent which is still in
+ * use within the application is no longer valid and should be discarded.
+ * @param smDesc the OutFactory state machine
+ */
+static void OutFactoryShutdownAction(FwSmDesc_t smDesc);
+
+/* ------------------------------------------------------------------------------------ */
+FwSmDesc_t CrFwOutFactoryMake() {
+	FwPrDesc_t resetPr, execPr, initPr;
+
+	if (outFactory != NULL) {
+		return outFactory;
+	}
+
+	/* Extend the Base Component */
+	outFactory = FwSmCreateDer(CrFwBaseCmpMake());
+
+	/* Create the Reset Procedure for the OutFactory Component */
+	resetPr = FwPrCreateDer(CrFwCmpGetResetProc());
+	FwPrOverrideAction(resetPr, &CrFwBaseCmpDefConfigAction, &OutFactoryConfigAction);
+
+	/* Create the Initialization Procedure for the OuFactory Component */
+	initPr = FwPrCreateDer(CrFwCmpGetInitProc());
+	FwPrOverrideAction(initPr, &CrFwBaseCmpDefInitAction, &OutFactoryInitAction);
+
+	/* Override the Shutdown Action for the OuFactory Component */
+	FwSmOverrideAction(outFactory, &CrFwBaseCmpDefShutdownAction, &OutFactoryShutdownAction);
+
+	/* Get the Dummy Execution Procedure for the OuFactory Component */
+	execPr = CrFwBaseCmpGetDummyExecProc();
+
+	/* Initialize the data for the requested SM */
+	outFactoryData.outcome = 1;
+	outFactoryData.initProc = initPr;
+	outFactoryData.resetProc = resetPr;
+	outFactoryData.execProc = execPr;
+	outFactoryData.instanceId = 0;
+	outFactoryData.typeId = CR_FW_OUTFACTORY_TYPE;
+
+	/* Attach the data to the OutFactory state machine and to its procedures. */
+	FwSmSetData(outFactory, &outFactoryData);
+	FwPrSetData(outFactoryData.initProc, &outFactoryData);
+	FwPrSetData(outFactoryData.resetProc, &outFactoryData);
+
+	/* Start the OuFactory */
+	FwSmStart(outFactory);
+
+	return outFactory;
+}
+
+/* ------------------------------------------------------------------------------------ */
+FwSmDesc_t CrFwOutFactoryMakeOutCmp(CrFwServType_t type, CrFwServSubType_t subType,
+                                    CrFwDiscriminant_t discriminant, CrFwPcktLength_t length) {
+	CrFwOutFactoryPoolIndex_t j, k, freePos;
+	CrFwCmdRepKindIndex_t kindIndex;
+	CrFwCmdRepKindKey_t targetKey;
+	CrFwPckt_t pckt;
+	CrFwPcktLength_t len;
+
+	if (nextFreePos == CR_FW_OUTFACTORY_MAX_NOF_OUTCMP) {	/* All positions are occupied */
+		CrFwSetAppErrCode(crOutCmpAllocationFail);
+		return NULL;
+	}
+
+	targetKey = (CrFwCmdRepKindKey_t)(type*CR_FW_MAX_DISCRIMINANT*CR_FW_MAX_SERV_SUBTYPE+subType*CR_FW_MAX_DISCRIMINANT+discriminant);
+	kindIndex = CrFwFindCmdRepKindIndex(outCmpKindKey, CR_FW_OUTCMP_NKINDS, targetKey);
+	if (kindIndex == CR_FW_OUTCMP_NKINDS) {
+		CrFwSetAppErrCode(crIllOutCmpKind);
+		return NULL;
+	}
+
+	if (length == 0)
+	    len = outCmpKindDesc[kindIndex].pcktLength;
+	else
+	    len = length;
+
+	pckt = CrFwPcktMake(len);	/* The packet length is assumed to be non-negative */
+	if (pckt == NULL) {
+		CrFwSetAppErrCode(crOutCmpAllocationFail);
+		return NULL;
+	}
+
+	freePos = nextFreePos;
+	outCmpSpecificData[freePos].index = CrFwOutRegistryGetCmdRepIndex(type,subType);
+	outCmpSpecificData[freePos].isEnabled = outCmpKindDesc[kindIndex].isEnabled;
+	outCmpSpecificData[freePos].isReady = outCmpKindDesc[kindIndex].isReady;
+	outCmpSpecificData[freePos].isRepeat = outCmpKindDesc[kindIndex].isRepeat;
+	outCmpSpecificData[freePos].serialize = outCmpKindDesc[kindIndex].serialize;
+	outCmpSpecificData[freePos].update= outCmpKindDesc[kindIndex].update;
+	outCmpSpecificData[freePos].factoryPoolIndex = freePos;
+
+	CrFwPcktSetCmdRepType(pckt,outCmpKindDesc[kindIndex].cmdRepType);
+	CrFwPcktSetSrc(pckt,CR_FW_HOST_APP_ID);
+	CrFwPcktSetGroup(pckt,0);
+	CrFwPcktSetServType(pckt,type);
+	CrFwPcktSetServSubType(pckt,subType);
+	CrFwPcktSetDiscriminant(pckt,discriminant);
+	CrFwPcktSetSeqCnt(pckt,0);
+
+	outCmpSpecificData[freePos].pckt = pckt;
+
+	nOfAllocatedOutCmpSinceReset++;
+	if (nOfAllocatedOutCmpSinceReset == maxInstanceId)
+		nOfAllocatedOutCmpSinceReset = 0;
+	outCmpData[freePos].instanceId = (CrFwInstanceId_t)(apidInstanceId + nOfAllocatedOutCmpSinceReset);
+
+	/* Reset the OutComponent */
+	CrFwCmpReset(outCmp[freePos]);
+
+	nOfAllocatedOutCmp++;
+	outCmpInUse[freePos] = 1;
+
+	/* Find the next free position in the pool of pre-allocated OutComponent instances */
+	k = (CrFwOutFactoryPoolIndex_t)(freePos + 1);
+	for (j=0; j<(CR_FW_OUTFACTORY_MAX_NOF_OUTCMP-1); j++) {
+		if (k == CR_FW_OUTFACTORY_MAX_NOF_OUTCMP)
+			k = 0;
+		if (outCmpInUse[k] == 0) {
+			nextFreePos = k;
+			return (outCmp[freePos]);	/* Next free position has been found */
+		}
+		k = (CrFwOutFactoryPoolIndex_t)(k + 1);
+	}
+
+	nextFreePos = CR_FW_OUTFACTORY_MAX_NOF_OUTCMP; /* There are no free positions left */
+	return (outCmp[freePos]);
+}
+
+/* ------------------------------------------------------------------------------------ */
+void CrFwOutFactoryReleaseOutCmp(FwSmDesc_t outCmpInstance) {
+	CrFwCmpData_t* outCmpInstanceData = (CrFwCmpData_t*)FwSmGetData(outCmpInstance);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(outCmpInstanceData->cmpSpecificData);
+	CrFwOutFactoryPoolIndex_t posToBeFreed;
+
+	posToBeFreed = cmpSpecificData->factoryPoolIndex;
+	if (outCmpInUse[posToBeFreed] == 1) {
+		outCmpInUse[posToBeFreed] = 0;
+		nOfAllocatedOutCmp--;
+		nextFreePos = posToBeFreed;
+		CrFwPcktRelease(outCmpSpecificData[posToBeFreed].pckt);
+		outCmpSpecificData[posToBeFreed].pckt = NULL;
+		return;
+	}
+	CrFwSetAppErrCode(crOutCmpRelErr);
+
+	return;
+}
+
+/* ------------------------------------------------------------------------------------ */
+CrFwOutFactoryPoolIndex_t CrFwOutFactoryGetNOfAllocatedOutCmp() {
+	return nOfAllocatedOutCmp;
+}
+
+/* ------------------------------------------------------------------------------------ */
+CrFwOutFactoryPoolIndex_t CrFwOutFactoryGetMaxNOfOutCmp() {
+	return CR_FW_OUTFACTORY_MAX_NOF_OUTCMP;
+}
+
+/* ------------------------------------------------------------------------------------ */
+CrFwInstanceId_t CrFwOutFactoryGetNOfInstanceId() {
+	return maxInstanceId;
+}
+
+/*------------------------------------------------------------------------------------*/
+static void OutFactoryInitAction(FwPrDesc_t initPr) {
+	CrFwCounterU2_t i;
+	CrFwCmdRepKindIndex_t j;
+	FwPrDesc_t outCmpInitPr, outCmpResetPr, outCmpExecPr;
+	CRFW_UNUSED(initPr);
+
+	/* Create the pre-allocated OutComponents */
+	for (i=0; i<CR_FW_OUTFACTORY_MAX_NOF_OUTCMP; i++) {
+		/* Create the i-th OutCmp as an extension of the Base OutComponent */
+		outCmp[i] = FwSmCreateDer(CrFwOutCmpMakeBase());
+
+		/* Create the Reset Procedure for the OutComponent */
+		outCmpResetPr = FwPrCreateDer(CrFwCmpGetResetProc());
+		outCmpData[i].resetProc = outCmpResetPr;
+
+		/* Create the Initialization Procedure for the OutComponent */
+		outCmpInitPr = FwPrCreateDer(CrFwCmpGetInitProc());
+		outCmpData[i].initProc = outCmpInitPr;
+
+		/* Get the Dummy Execution Procedure for the OutComponent */
+		outCmpExecPr = CrFwBaseCmpGetDummyExecProc();
+		outCmpData[i].execProc = outCmpExecPr;
+
+		/* Set the OutComponent type */
+		outCmpData[i].typeId = CR_FW_OUTCMP_TYPE;
+
+		/* Set the pointer to the component-specific data */
+		outCmpData[i].cmpSpecificData = &outCmpSpecificData[i];
+
+		/* Attach the data to the OutComponent state machine and to its procedures. */
+		FwSmSetData(outCmp[i], &outCmpData[i]);
+		FwSmSetData(FwSmGetEmbSm(outCmp[i], CR_FW_BASE_STATE_CONFIGURED), &outCmpData[i]);
+		FwPrSetData(outCmpData[i].initProc, &outCmpData[i]);
+		FwPrSetData(outCmpData[i].resetProc, &outCmpData[i]);
+
+		/* Start and initialize the OutComponent */
+		FwSmStart(outCmp[i]);
+		CrFwCmpInit(outCmp[i]);
+	}
+
+	/* Initialize the array holding the keys of the OutCommand kinds */
+	for (j=0; j<CR_FW_OUTCMP_NKINDS; j++)
+		outCmpKindKey[j] = (CrFwCmdRepKindKey_t)(outCmpKindDesc[j].servType*CR_FW_MAX_DISCRIMINANT*CR_FW_MAX_SERV_SUBTYPE +
+		                   outCmpKindDesc[j].servSubType*CR_FW_MAX_DISCRIMINANT+outCmpKindDesc[j].discriminant);
+}
+
+/*------------------------------------------------------------------------------------*/
+static void OutFactoryConfigAction(FwPrDesc_t initPr) {
+	CrFwCounterU2_t i;
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwPrGetData(initPr);
+
+	for (i=0; i<CR_FW_OUTFACTORY_MAX_NOF_OUTCMP; i++)
+		if (outCmpInUse[i] != 0) {
+			outCmpInUse[i] = 0;
+			CrFwPcktRelease(outCmpSpecificData[i].pckt);
+			outCmpSpecificData[i].pckt = NULL;
+		}
+
+
+	nOfAllocatedOutCmp = 0;
+	nOfAllocatedOutCmpSinceReset = 0;
+	nextFreePos = 0;
+
+	cmpData->outcome = 1;
+}
+
+/*------------------------------------------------------------------------------------*/
+static void OutFactoryShutdownAction(FwSmDesc_t smDesc) {
+	CrFwCounterU2_t i;
+	CRFW_UNUSED(smDesc);
+
+	for (i=0; i<CR_FW_OUTFACTORY_MAX_NOF_OUTCMP; i++) {
+		/* Release memory allocated to OutComponent Initialization Procedure */
+		FwPrReleaseDer(outCmpData[i].initProc);
+		/* Release memory allocated to OutComponent Reset Procedure */
+		FwPrReleaseDer(outCmpData[i].resetProc);
+		/* Release memory allocated to OutComponent */
+		FwSmReleaseDer(FwSmGetEmbSm(outCmp[i],CR_FW_BASE_STATE_CONFIGURED));
+		FwSmReleaseDer(outCmp[i]);
+		/* Mark all OutComponents as not-in-use */
+		outCmpInUse[i] = 0;
+		/* Release packet associated to OutComponent */
+		if (outCmpSpecificData[i].pckt != NULL)
+			CrFwPcktRelease(outCmpSpecificData[i].pckt);
+	}
+
+	nOfAllocatedOutCmp = 0;
+}
+
diff --git a/CrFramework/src/OutFactory/CrFwOutFactory.h b/CrFramework/src/OutFactory/CrFwOutFactory.h
new file mode 100644
index 0000000..723d832
--- /dev/null
+++ b/CrFramework/src/OutFactory/CrFwOutFactory.h
@@ -0,0 +1,218 @@
+/**
+ * @file
+ * @ingroup outMngGroup
+ * Definition of the OutFactory component.
+ *
+ * The OutFactory component offers an interface through which OutComponents
+ * (see <code>CrFwOutCmp.h</code>) can be allocated and released.
+ * Applications need OutComponents to encapsulate out-going commands or reports.
+ * This interface provides the factory functions through which an OutComponent
+ * can be created and released.
+ *
+ * The OutFactory is implemented as an extension of the Base Component of
+ * <code>CrFwBaseCmp.h</code>.
+ * The OutFactory is a singleton component.
+ * This interface provides a function to create the OutFactory and it provides
+ * a function to create an OutComponent of a specified kind.
+ *
+ * The OutFactory maintains a pool of pre-allocated OutComponents (the size of the pool
+ * is defined in <code>CrFwOutFactoryUserPar.h</code>).
+ * Memory for the pool is allocated when the OutFactory is initialized and is never
+ * released afterwards.
+ * Items in the pool are marked as "in use" when they are allocated to an application
+ * and are marked as "not in use" when they are released.
+ * When the OutFactory is reset, all the items in the pool are marked as "not in use".
+ * No memory allocation operations (<code>malloc/free</code>) are therefore performed when
+ * OutComponents are allocated or released.
+ *
+ * <b>Mode of Use of an OutFactory Component</b>
+ *
+ * The configuration of the OutFactory component is defined statically in
+ * <code>CrFwOutFactoryUserPar.h</code>.
+ *
+ * The OutFactory is created with function <code>::CrFwOutFactoryMake</code>.
+ * After being created, the OutFactory must be initialized and reset.
+ * This is done with functions <code>::CrFwCmpInit</code> and <code>::CrFwCmpReset</code>.
+ * Nominally, after being initialized and reset the OutFactory State Machine should be
+ * in state CONFIGURED (this can be checked by verifying that function <code>FwSmGetCurState</code>
+ * returns CR_FW_BASE_STATE_CONFIGURED).
+ *
+ * After being configured, the OutFactory is ready to manage the creation and release
+ * process for OutComponents.
+ * An OutComponent is created with function <code>::CrFwOutFactoryMakeOutCmp</code> and it
+ * is released with function <code>::CrFwOutFactoryReleaseOutCmp</code>.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_OUTFACTORY_H_
+#define CRFW_OUTFACTORY_H_
+
+/* Include Framework files */
+#include "CrFwConstants.h"
+/* Include FW Profile files */
+#include "FwSmConstants.h"
+#include "FwSmCore.h"
+
+/**
+ * Factory function for the singleton instance of the OutFactory.
+ * The first time it is called, this function creates the OutFactory singleton instance.
+ * Subsequent calls return the same instance.
+ * The first time this function is called, it returns the OutFactory in state CREATED.
+ * @return the OutFactory singleton instance.
+ */
+FwSmDesc_t CrFwOutFactoryMake();
+
+/**
+ * Make function for an OutComponent.
+ * This function returns an OutComponent in state CONFIGURED.
+ * The OutComponent is reset before being returned to the caller of this
+ * function (its State Execution Counter is guaranteed to be equal to zero).
+ *
+ * The caller specifies the kind of OutComponent it wishes by specifying its type, sub-type,
+ * discriminant and the packet length.
+ * Of these four parameters, the first three (type, sub-type, and discriminant) are mandatory whereas
+ * for the last one (length) a dummy value of zero is possible.
+ * Given the type, sub-type and discriminant, the function looks for a matching entry in the
+ * <code>::CR_FW_OUTCMP_INIT_KIND_DESC</code> initializer.
+ * If no matching entry is found (i.e. if no entry is found with the same values of type, sub-type
+ * and discriminant), then the function sets the application error code to <code>crOutCmpAllocationFail</code>
+ * and returns a value of NULL.
+ * If instead a matching entry is found, two options are possible:
+ * - If the length parameter is set to zero, then the function creates and returns an OutComponent with the
+ *   characteristics given by the matching entry in the <code>::CR_FW_OUTCMP_INIT_KIND_DESC</code> initializer.
+ * - If instead the length parameter has a non-zero value, then the function creates and returns an OutComponent
+ *   with the characteristics given by the matching entry in the <code>::CR_FW_OUTCMP_INIT_KIND_DESC</code>
+ *   initializer with the exception of the packet length which is set equal to the value specified
+ *   in the function call.
+ * .
+ * Thus, the length value specified in the function call may be used to override the length
+ * value specified in the <code>::CR_FW_OUTCMP_INIT_KIND_DESC</code> initializer).
+ * This override mechanism is useful for reports or commands whose length must be determined
+ * dynamically (as opposed to being statically determined in the
+ * <code>::CR_FW_OUTCMP_INIT_KIND_DESC</code> initializer).
+ *
+ * When an OutComponent is returned by this function, it has the following attributes set:
+ * - The OutComponent packet length
+ * - The OutComponent command/report type flag (which defines whether the OutComponent is a
+ *   report or a command)
+ * - The OutComponent source attribute
+ * - The OutComponent group attribute
+ * - The OutComponent service type
+ * - The OutComponent service sub-type
+ * - The OutComponent discriminant
+ * - The OutComponent sequence counter
+ * - The OutComponent instance identifier
+ * .
+ * The values of type, sub-type, command/report flag and discriminant are derived from the information in the
+ * <code>::CR_FW_OUTCMP_INIT_KIND_DESC</code> initializer. The type and sub-type cannot be changed after
+ * an OutComponent has been created. Applications can instead override the default setting of the
+ * discriminant by using function <code>::CrFwOutCmpSetDiscriminant</code>.
+ *
+ * As explained above, the value of the packet length is either derived from the
+ * <code>::CR_FW_OUTCMP_INIT_KIND_DESC</code> initializer (if the function is called with the
+ * length parameter set to zero) or else it is equal to the length parameter in the function call.
+ *
+ * The value of the instance identifier is built as follows.
+ * Let n be the number of OutComponents made by the factory since it was last reset;
+ * let APP_ID be the application identifier (see <code>#CR_FW_HOST_APP_ID</code>); let
+ * m be the number of bits reserved for the application identifier (see
+ * <code>#CR_FW_NBITS_APP_ID</code>); and let s be the number of bits of the instance
+ * identifier.
+ * The instance identifier is then given by: APP_ID*(2**(s-m))+n.
+ * In this formula, the value of n is incremented by 1 every time a new OutComponent is
+ * created by the OutFactory and it is reset to 0 when it reaches APP_ID*(2**(s-m)).
+ *
+ * The value of the sequence counter is initialized to zero.
+ *
+ * The value of the source attribute is set equal to the identifier of the host application
+ * (namely <code>#CR_FW_HOST_APP_ID</code>).
+ *
+ * The value of the group attribute is set to a default value of zero. Applications can override
+ * this default setting by using function <code>::CrFwOutCmpSetGroup</code>.
+ *
+ * This function allocates the memory for the new OutComponent from a pool of pre-allocated
+ * memory which is created when the OutFactory is initialized (see
+ * <code>::OutFactoryInitAction</code>).
+ * If no free memory is available in the factory pool, this function returns NULL.
+ * Allocation memory failure results in the application error code being set
+ * to <code>crOutCmpAllocationFail</code>.
+ *
+ * When an OutComponent created by this function is no longer needed, it should be
+ * returned to the factory by calling <code>CrFwOutCmpRelease</code>.
+ *
+ * If the OutFactory is reset, then all the OutComponents which had been created
+ * by the factory are released.
+ *
+ * @param type the service type of the OutComponent
+ * @param subType the service sub-type of the OutComponent
+ * @param discriminant the discriminant of the OutComponent
+ * @param length either zero (if the packet length is to be taken from the
+ * <code>::CR_FW_OUTCMP_INIT_KIND_DESC</code> initializer) or the packet length
+ * @return a new OutComponent or NULL if it was not possible to allocate the memory
+ * for the OutComponent.
+ */
+FwSmDesc_t CrFwOutFactoryMakeOutCmp(CrFwServType_t type, CrFwServSubType_t subType,
+                                    CrFwDiscriminant_t discriminant, CrFwPcktLength_t length);
+
+/**
+ * Release function for an OutComponent.
+ * The argument of this function must be an OutComponent which was created using function
+ * <code>::CrFwOutFactoryMakeOutCmp</code>.
+ * This function releases the memory which was allocated to the OutComponent.
+ * After this function is called, the OutComponent cannot be used any longer.
+ * The function does not perform any checks on the existence or status of the
+ * OutComponent.
+ * An attempt to use an OutComponent which has been released will result in undefined behaviour.
+ *
+ * An attempt to release an OutComponent which had already been released, or to release a
+ * non-existent OutComponent will result in undefined behaviour and in the application
+ * error code being set to: <code>::crOutCmpRelErr</code>.
+ *
+ * @param outCmpInstance the OutComponent to be released
+ */
+void CrFwOutFactoryReleaseOutCmp(FwSmDesc_t outCmpInstance);
+
+/**
+ * Return the number of OutComponents which are currently allocated.
+ * This function returns the number of OutComponents which have been successfully
+ * allocated through calls to <code>::CrFwOutFactoryMakeOutCmp</code> and have not yet been
+ * released through calls to <code>::CrFwOutFactoryReleaseOutCmp</code>.
+ * @return the number of OutComponents which are currently allocated.
+ */
+CrFwOutFactoryPoolIndex_t CrFwOutFactoryGetNOfAllocatedOutCmp();
+
+/**
+ * Return the maximum number of OutComponents which may be allocated at any one time.
+ * @return the maximum number of OutComponents which may be allocated at any one time
+ */
+CrFwOutFactoryPoolIndex_t CrFwOutFactoryGetMaxNOfOutCmp();
+
+/**
+ * Return the number of distinct instance identifiers supported by the OutFactory.
+ * The OutFactory allocates the instance identifier of an OutComponent as explained
+ * in the documentation of <code>::CrFwOutFactoryMakeOutCmp</code>.
+ * @return the maximum number of OutComponents which may be allocated at any one time
+ */
+CrFwInstanceId_t CrFwOutFactoryGetNOfInstanceId();
+
+#endif /* CRFW_OUTFACTORY_H_ */
diff --git a/CrFramework/src/OutLoader/CrFwOutLoader.c b/CrFramework/src/OutLoader/CrFwOutLoader.c
new file mode 100644
index 0000000..e33cd7c
--- /dev/null
+++ b/CrFramework/src/OutLoader/CrFwOutLoader.c
@@ -0,0 +1,149 @@
+/**
+ * @file
+ *
+ * Implementation of OutLoader State Machine.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include <stdlib.h>
+/* Include configuration files */
+#include "CrFwOutLoaderUserPar.h"
+#include "CrFwCmpData.h"
+/* Include framework files */
+#include "CrFwConstants.h"
+#include "CrFwRepErr.h"
+#include "CrFwTime.h"
+#include "CrFwOutLoader.h"
+#include "BaseCmp/CrFwBaseCmp.h"
+#include "BaseCmp/CrFwInitProc.h"
+#include "BaseCmp/CrFwResetProc.h"
+#include "BaseCmp/CrFwDummyExecProc.h"
+#include "Pckt/CrFwPckt.h"
+#include "Pckt/CrFwPcktQueue.h"
+#include "OutManager/CrFwOutManager.h"
+#include "UtilityFunctions/CrFwUtilityFunctions.h"
+/* Include FW Profile files */
+#include "FwSmConstants.h"
+#include "FwSmDCreate.h"
+#include "FwSmConfig.h"
+#include "FwSmCore.h"
+#include "FwPrConstants.h"
+#include "FwPrDCreate.h"
+#include "FwPrConfig.h"
+#include "FwPrCore.h"
+
+/** Descriptor of the OutLoader Singleton */
+static FwSmDesc_t outLoader = NULL;
+
+/** The data structure for the OutLoader Singleton */
+static CrFwCmpData_t outLoaderData;
+
+/** The function implementing the OutManager Selection Operation */
+static CrFwOutManagerSelect_t outManagerSelect = CR_FW_OUTLOADER_OUTMANAGER_SELECT;
+
+/** The function implementing the OutManager Activation Operation */
+static CrFwOutManagerActivate_t outManagerActivate = CR_FW_OUTLOADER_OUTMANAGER_ACTIVATE;
+
+/** The function implementing the Initialization Check */
+static FwPrAction_t initCheck = CR_FW_OUTLOADER_INITCHECK;
+
+/** The function implementing the Initialization Action */
+static FwPrAction_t initAction = CR_FW_OUTLOADER_INITACTION;
+
+/** The function implementing the Configuration Check */
+static FwPrAction_t configCheck = CR_FW_OUTLOADER_CONFIGCHECK;
+
+/** The function implementing the Configuration Action */
+static FwPrAction_t configAction = CR_FW_OUTLOADER_CONFIGACTION;
+
+/** The function implementing the Shutdown Action */
+static FwSmAction_t shutdownAction = CR_FW_OUTLOADER_SHUTDOWNACTION;
+
+
+/*-----------------------------------------------------------------------------------------*/
+FwSmDesc_t CrFwOutLoaderMake() {
+	FwPrDesc_t resetPr, execPr, initPr;
+
+	if (outLoader != NULL) {
+		return outLoader;	/* The requested SM has already been created */
+	}
+
+	/* Create the requested SM as an extension of the Base Component SM */
+	outLoader = FwSmCreateDer(CrFwBaseCmpMake());
+
+	/* Create the Reset Procedure for the OutLoader Component */
+	resetPr = FwPrCreateDer(CrFwCmpGetResetProc());
+	FwPrOverrideAction(resetPr, &CrFwBaseCmpDefConfigCheck, configCheck);
+	FwPrOverrideAction(resetPr, &CrFwBaseCmpDefConfigAction, configAction);
+
+	/* Create the Initialization Procedure for the OutLoader Component */
+	initPr = FwPrCreateDer(CrFwCmpGetInitProc());
+	FwPrOverrideAction(resetPr, &CrFwBaseCmpDefInitCheck, initCheck);
+	FwPrOverrideAction(resetPr, &CrFwBaseCmpDefInitAction, initAction);
+
+	/* Get the Dummy Execution Procedure for the OutLoader Component */
+	execPr = CrFwBaseCmpGetDummyExecProc();
+
+	/* Override the Shutdown Action for the OutStream Component */
+	FwSmOverrideAction(outLoader, &CrFwBaseCmpDefShutdownAction, shutdownAction);
+
+	/* Initialize the data for the requested SM */
+	outLoaderData.outcome = 1;
+	outLoaderData.initProc = initPr;
+	outLoaderData.resetProc = resetPr;
+	outLoaderData.execProc = execPr;
+	outLoaderData.instanceId = 0;
+	outLoaderData.typeId = CR_FW_OUTLOADER_TYPE;
+
+	/* Attach the data to the OutLoader state machine and to its procedures. */
+	FwSmSetData(outLoader, &outLoaderData);
+	FwPrSetData(outLoaderData.initProc, &outLoaderData);
+	FwPrSetData(outLoaderData.resetProc, &outLoaderData);
+
+	/* Start the OutLoader */
+	FwSmStart(outLoader);
+
+	return outLoader;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwOutLoaderLoad(FwSmDesc_t outCmp) {
+	FwSmDesc_t selectedOutManager;
+
+	selectedOutManager = outManagerSelect(outCmp);
+	CrFwOutManagerLoad(selectedOutManager, outCmp);
+	outManagerActivate(selectedOutManager);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+FwSmDesc_t CrFwOutLoaderDefOutManagerSelect(FwSmDesc_t outCmp) {
+	CRFW_UNUSED(outCmp);
+	return CrFwOutManagerMake(0);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwOutLoadDefOutManagerActivate(FwSmDesc_t outManager) {
+	CRFW_UNUSED(outManager);
+	return;
+}
+
diff --git a/CrFramework/src/OutLoader/CrFwOutLoader.h b/CrFramework/src/OutLoader/CrFwOutLoader.h
new file mode 100644
index 0000000..6f27414
--- /dev/null
+++ b/CrFramework/src/OutLoader/CrFwOutLoader.h
@@ -0,0 +1,146 @@
+/**
+ * @file
+ * @ingroup outMngGroup
+ * Definition of the OutLoader component.
+ *
+ * After a user application has obtained an OutComponent component from an OutFactory,
+ * it loads it into the OutLoader.
+ * This component is responsible for selecting the appropriate OutManager to process
+ * the out-going command or report.
+ * For this purpose, the OutLoader maintains a list of all OutManagers in an application
+ * (the List of OutManagers or LOM).
+ *
+ * The OutLoader is defined as an extension of the Base Component (see <code>CrFwBaseCmp.h</code>).
+ * The OutLoader component offers one operation – the Load operation – to load an OutComponent
+ * into an OutLoader.
+ * This operation executes the behaviour shown in the figure below.
+ *
+ * When the Load operation is called, the OutLoader decides to which OutManager in the LOM to load
+ * an OutComponent.
+ * The policy for selecting the OutManager in the LOM is an adaptation point.
+ * After the OutComponent is loaded into the selected OutManager, the procedure may activate
+ * the selected OutManager (i.e. it may release the thread which is controlling the execution of
+ * the selected OutManager).
+ * This is useful where there is a need to process the out-going command or report as soon as
+ * it is loaded into the OutManager (since the command or report is only processed when the
+ * OutManager is executed).
+ *
+ * <b>Mode of Use of an OutLoader Component</b>
+ *
+ * The configuration of the OutLoader components is defined statically in
+ * <code>CrFwOutLoaderUserPar.h</code>.
+ *
+ * The OutLoader component is created with function <code>::CrFwOutLoaderMake</code>.
+ * After being created, the OutLoader must be initialized and reset.
+ * This is done with functions <code>::CrFwCmpInit</code> and <code>::CrFwCmpReset</code>.
+ * Nominally, after being initialized and reset the OutLoader State Machine should be
+ * in state CONFIGURED (this can be checked by verifying that function <code>FwSmGetCurState</code>
+ * returns CR_FW_BASE_STATE_CONFIGURED).
+ *
+ * Note that the OutLoader is a singleton and an application can only have one instance of
+ * an OutLoader.
+ *
+ * An OutLoader offers a Load operation (<code>::CrFwOutLoaderLoad</code>) through which
+ * an OutComponent can be loaded into an OutManager.
+ * This operation is normally called by a user component after it has configured an OutComponent
+ * and when it wishes the OutComponent to be sent to its destination.
+ *
+ * The OutLoader autonomously selects the OutManager to which an OutComponent should be loaded.
+ * The selection algorithm is an adaptation point for the OutLoader.
+ *
+ * By default, the initialization, reset and shutdown operations are the same as on the
+ * Base Component but these operations are implemented as adaptation points so that the
+ * user has a chance to use them to initialize or reset the data structures which are used
+ * to control the selection of the OutManager where an out-going command or report is loaded.
+ *
+ * @image html OutLoaderLoad.png
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_OUT_LOADER_H_
+#define CRFW_OUT_LOADER_H_
+
+#include "FwSmConstants.h"
+#include "FwPrConstants.h"
+#include "Pckt/CrFwPcktQueue.h"
+#include "CrFwConstants.h"
+
+/**
+ * Type for a pointer to a function implementing the OutManager Selection Operation.
+ * The OutManager Selection Operation is one of the adaptation points of the framework.
+ * A function which implements this operation takes an OutComponent as argument and returns
+ * the OutManager where the OutComponent should be loaded.
+ */
+typedef FwSmDesc_t (*CrFwOutManagerSelect_t)(FwSmDesc_t outCmp);
+
+/**
+ * Type for a pointer to a function implementing the OutManager Activation Operation.
+ * The OutManager Activation Operation is one of the adaptation points of the framework.
+ * This function can be used to activate an OutManager.
+ * An OutManager is activated by releasing the thread which controls its execution.
+ */
+typedef void (*CrFwOutManagerActivate_t)(FwSmDesc_t outManager);
+
+/**
+ * Factory function to retrieve the OutLoader State Machine instance.
+ * The first time this function is called, it creates the OutLoader instance.
+ * Subsequent calls returns the same instance.
+ *
+ * The first time this function is called, it returns the OutLoader
+ * State Machine which has been started but which still needs to be initialized and
+ * configured.
+ * @return the descriptor of the OutLoader State Machine or NULL
+ * if the state machine could not be created.
+ */
+FwSmDesc_t CrFwOutLoaderMake();
+
+/**
+ * Load an OutComponent into its OutManager.
+ * This function runs the procedure shown in the figure below.
+ * The procedure has two adaptation points which are defined by specifying two functions
+ * in <code>CrFwOutLoaderUserPar.h</code>.
+ *
+ * @image html OutLoaderLoad.png
+ * @param outCmp the descriptor of the OutComponent to be loaded in the OutManager
+ */
+void CrFwOutLoaderLoad(FwSmDesc_t outCmp);
+
+/**
+ * Default implementation of the OutManager Selection Operation.
+ * This implementation always returns the first OutManager (i.e. the OutManager returned
+ * by <code>::CrFwOutManagerMake</code> when it is called with an argument equal
+ * to zero).
+ * @param outCmp the descriptor of the OutComponent loaded into the OutLoader (this
+ * argument is not used in this implementation)
+ * @return the first OutManager
+ */
+FwSmDesc_t CrFwOutLoaderDefOutManagerSelect(FwSmDesc_t outCmp);
+
+/**
+ * Default implementation of the OutManager Activation Operation.
+ * This implementation returns without doing anything.
+ * @param outManager the descriptor of the OutManager to be activated (this
+ * argument is not used in this implementation)
+ */
+void CrFwOutLoadDefOutManagerActivate(FwSmDesc_t outManager);
+
+#endif /* CRFW_OUT_LOADER_H_ */
diff --git a/CrFramework/src/OutManager/CrFwOutManager.c b/CrFramework/src/OutManager/CrFwOutManager.c
new file mode 100644
index 0000000..398e3dc
--- /dev/null
+++ b/CrFramework/src/OutManager/CrFwOutManager.c
@@ -0,0 +1,303 @@
+/**
+ * @file
+ *
+ * Implementation of OutManager State Machine.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include <stdlib.h>
+/* Include configuration files */
+#include "CrFwOutManagerUserPar.h"
+#include "CrFwCmpData.h"
+/* Include framework files */
+#include "CrFwConstants.h"
+#include "CrFwRepErr.h"
+#include "CrFwTime.h"
+#include "CrFwOutManager.h"
+#include "BaseCmp/CrFwBaseCmp.h"
+#include "BaseCmp/CrFwInitProc.h"
+#include "BaseCmp/CrFwResetProc.h"
+#include "BaseCmp/CrFwDummyExecProc.h"
+#include "Pckt/CrFwPckt.h"
+#include "Pckt/CrFwPcktQueue.h"
+#include "OutFactory/CrFwOutFactory.h"
+#include "OutRegistry/CrFwOutRegistry.h"
+#include "OutCmp/CrFwOutCmp.h"
+#include "UtilityFunctions/CrFwUtilityFunctions.h"
+/* Include FW Profile files */
+#include "FwSmConstants.h"
+#include "FwSmDCreate.h"
+#include "FwSmConfig.h"
+#include "FwSmCore.h"
+#include "FwPrConstants.h"
+#include "FwPrDCreate.h"
+#include "FwPrConfig.h"
+#include "FwPrCore.h"
+
+/** The sizes of the POCL in the OutManager components. */
+static CrFwCounterU2_t outManagerPoclSize[CR_FW_NOF_OUTMANAGER] = CR_FW_OUTMANAGER_POCLSIZE;
+
+/** The descriptors of the OutManager State Machines. */
+static FwSmDesc_t outManagerDesc[CR_FW_NOF_OUTMANAGER];
+
+/** The data structures for the OutManager State Machines and their Procedures. */
+static CrFwCmpData_t outManagerData[CR_FW_NOF_OUTMANAGER];
+
+/** The component-specific data for the OutManager instances */
+static CrFwOutManagerData_t outManagerCmpSpecificData[CR_FW_NOF_OUTMANAGER];
+
+/**
+ * Initialization action for OutManagers.
+ * This function allocates the memory for the OutManager data structures and
+ * initializes them.
+ * The outcome of the initialization action is always "success" (the situation
+ * where the memory allocation fails is not handled).
+ * @param initPr the Initialization Procedure of the OutManager
+ */
+static void OutManagerInitAction(FwPrDesc_t initPr);
+
+/**
+ * Configuration action for OutManagers.
+ * This function resets the POCL and releases all OutComponents in the POCL.
+ * The outcome of the initialization action is always: "success"
+ * @param initPr the Initialization Procedure of the OutManager
+ */
+static void OutManagerConfigAction(FwPrDesc_t initPr);
+
+/**
+ * Shutdown action for OutManager.
+ * This function resets the POCL and releases all OutComponents in the POCL.
+ * @param smDesc the OutManager state machine
+ */
+static void OutManagerShutdownAction(FwSmDesc_t smDesc);
+
+/**
+ * Implement the logic of the Execution Procedure (see figure below).
+ * This function is executed every time the Execution Procedure of the OutManager
+ * is executed.
+ * @image html OutManagerExecution.png
+ * @param execPr the Execution Procedure of the OutManager
+ */
+static void OutManagerExecAction(FwPrDesc_t execPr);
+
+/*-----------------------------------------------------------------------------------------*/
+FwSmDesc_t CrFwOutManagerMake(CrFwInstanceId_t i) {
+	FwPrDesc_t resetPr, execPr, initPr;
+
+	if (i >= CR_FW_NOF_OUTMANAGER) {
+		CrFwSetAppErrCode(crOutManagerIllId);
+		return NULL;
+	}
+
+	if (outManagerDesc[i] != NULL) {
+		return outManagerDesc[i];	/* The requested SM has already been created */
+	}
+
+	/* Create the requested SM as an extension of the base component SM */
+	outManagerDesc[i] = FwSmCreateDer(CrFwBaseCmpMake());
+
+	/* Create the Reset Procedure for the OutManager Component */
+	resetPr = FwPrCreateDer(CrFwCmpGetResetProc());
+	FwPrOverrideAction(resetPr, &CrFwBaseCmpDefConfigAction, &OutManagerConfigAction);
+
+	/* Create the Initialization Procedure for the OutManager Component */
+	initPr = FwPrCreateDer(CrFwCmpGetInitProc());
+	FwPrOverrideAction(initPr, &CrFwBaseCmpDefInitAction, &OutManagerInitAction);
+
+	/* Create the Execution Procedure for the OutManager Component */
+	execPr = FwPrCreateDer(CrFwBaseCmpGetDummyExecProc());
+	FwPrOverrideAction(execPr, &CwFwBaseCmpDummyExecAction, &OutManagerExecAction);
+
+	/* Override the Shutdown Action for the OutManager Component */
+	FwSmOverrideAction(outManagerDesc[i], &CrFwBaseCmpDefShutdownAction, &OutManagerShutdownAction);
+
+	/* Initialize the data for the requested SM */
+	outManagerData[i].outcome = 1;
+	outManagerData[i].initProc = initPr;
+	outManagerData[i].resetProc = resetPr;
+	outManagerData[i].execProc = execPr;
+	outManagerData[i].instanceId = i;
+	outManagerData[i].typeId = CR_FW_OUTMANAGER_TYPE;
+	outManagerData[i].cmpSpecificData = &outManagerCmpSpecificData[i];
+
+	/* Attach the data to the OutManager state machine and to its procedures. */
+	FwSmSetData(outManagerDesc[i], &outManagerData[i]);
+	FwPrSetData(outManagerData[i].initProc, &outManagerData[i]);
+	FwPrSetData(outManagerData[i].resetProc, &outManagerData[i]);
+	FwPrSetData(outManagerData[i].execProc, &outManagerData[i]);
+
+	/* Start the OutManager */
+	FwSmStart(outManagerDesc[i]);
+
+	return outManagerDesc[i];
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void OutManagerExecAction(FwPrDesc_t prDesc) {
+	CrFwCmpData_t* outManagerDataLocal = (CrFwCmpData_t*)FwPrGetData(prDesc);
+	CrFwOutManagerData_t* outManagerCSData = (CrFwOutManagerData_t*)outManagerDataLocal->cmpSpecificData;
+	CrFwInstanceId_t id = outManagerDataLocal->instanceId;
+	FwSmDesc_t outCmp;
+	CrFwCounterU2_t i;
+	CrFwOutRegistryCmdRepState_t outCmpState;
+
+	outManagerCSData->nextFreePoclPos = 0;
+	for (i=0; i<outManagerPoclSize[id]; i++) {
+		outCmp = outManagerCSData->pocl[i];
+		if (outCmp != NULL) {
+			FwSmExecute(outCmp);
+			CrFwOutCmpTerminate(outCmp);
+			if (CrFwOutCmpIsInAborted(outCmp))
+				outCmpState = crOutRegistryAborted;
+			else if (CrFwOutCmpIsInPending(outCmp))
+				outCmpState = crOutRegistryPending;
+			else
+				outCmpState = crOutRegistryTerminated;
+
+			if (outCmpState != crOutRegistryPending) {
+				CrFwOutRegistryUpdateState(outCmp,outCmpState);
+				CrFwOutFactoryReleaseOutCmp(outCmp);
+				outManagerCSData->pocl[i] = NULL;
+				outManagerCSData->nOfOutCmpInPocl--;
+			}
+		}
+	}
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwOutManagerLoad(FwSmDesc_t smDesc, FwSmDesc_t outCmp) {
+	CrFwCmpData_t* outManagerDataLocal = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutManagerData_t* outManagerCSData = (CrFwOutManagerData_t*)outManagerDataLocal->cmpSpecificData;
+	CrFwInstanceId_t id = outManagerDataLocal->instanceId;
+	CrFwCounterU2_t i, freePos, size;
+
+	freePos = outManagerCSData->nextFreePoclPos;
+	size = outManagerPoclSize[id];
+
+	/* Check if POCL is already full */
+	if (outManagerCSData->nOfOutCmpInPocl == size) {
+		CrFwRepErr(crOutManagerPoclFull, outManagerDataLocal->typeId, outManagerDataLocal->instanceId);
+		CrFwOutFactoryReleaseOutCmp(outCmp);
+		return;
+	}
+
+	/* Check if this is the first load request after the OutManager was reset or after it was executed.
+	 * If this is the case, find the first free position in the POCL.
+	 * NB: Since the for-loop is only entered if the POCL is not full, it will always terminate
+	 *     through the break. This means that, when measuring branch coverage, the fall-through case
+	 *     at the for-loop will never occur. */
+	if (freePos == 0)
+		for (i=0; i<size; i++)
+			if (outManagerCSData->pocl[i] == NULL) {
+				freePos = i;
+				break;
+			}
+
+	/* POCL is not full --> load outCmp */
+	outManagerCSData->pocl[freePos] = outCmp;
+	outManagerCSData->nOfOutCmpInPocl++;
+	outManagerCSData->nOfLoadedOutCmp++;
+
+	/* Start tracking OutComponent */
+	CrFwOutRegistryStartTracking(outCmp);
+
+	/* Identify next free position in POCL */
+	for (i=freePos+1; i<size; i++)
+		if (outManagerCSData->pocl[i] == NULL) {
+			outManagerCSData->nextFreePoclPos = (CrFwCounterU1_t)i;
+			return; /* a free position has been found */
+		}
+
+	outManagerCSData->nextFreePoclPos = (CrFwCounterU1_t)size;	/* no free position was found */
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void OutManagerInitAction(FwPrDesc_t initPr) {
+	CrFwCounterU1_t i;
+	CrFwCmpData_t* outManagerDataLocal = (CrFwCmpData_t*)FwPrGetData(initPr);
+	CrFwOutManagerData_t* outManagerCSData = (CrFwOutManagerData_t*)outManagerDataLocal->cmpSpecificData;
+	CrFwInstanceId_t id = outManagerDataLocal->instanceId;
+	outManagerCSData->pocl = malloc(sizeof(FwSmDesc_t)*outManagerPoclSize[id]);
+	for (i=0; i<outManagerPoclSize[id]; i++)
+		outManagerCSData->pocl[i] = NULL;
+	outManagerCSData->nOfOutCmpInPocl = 0;
+	outManagerDataLocal->outcome = 1;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void OutManagerConfigAction(FwPrDesc_t initPr) {
+	CrFwCmpData_t* outManagerDataLocal = (CrFwCmpData_t*)FwPrGetData(initPr);
+	CrFwOutManagerData_t* outManagerCSData = (CrFwOutManagerData_t*)outManagerDataLocal->cmpSpecificData;
+	CrFwInstanceId_t id = outManagerDataLocal->instanceId;
+	CrFwCounterU1_t i;
+
+	for (i=0; i<outManagerPoclSize[id]; i++) {
+		if (outManagerCSData->pocl[i] != NULL) {
+			CrFwOutFactoryReleaseOutCmp(outManagerCSData->pocl[i]);
+			outManagerCSData->pocl[i] = NULL;
+		}
+	}
+	outManagerCSData->nOfOutCmpInPocl = 0;
+	outManagerCSData->nOfLoadedOutCmp = 0;
+	outManagerCSData->nextFreePoclPos = 0;
+	outManagerDataLocal->outcome = 1;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void OutManagerShutdownAction(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* outManagerDataLocal = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutManagerData_t* outManagerCSData = (CrFwOutManagerData_t*)outManagerDataLocal->cmpSpecificData;
+	CrFwInstanceId_t id = outManagerDataLocal->instanceId;
+	CrFwCounterU1_t i;
+
+	for (i=0; i<outManagerPoclSize[id]; i++) {
+		if (outManagerCSData->pocl[i] != NULL) {
+			CrFwOutFactoryReleaseOutCmp(outManagerCSData->pocl[i]);
+			outManagerCSData->pocl[i] = NULL;
+		}
+	}
+	free(outManagerCSData->pocl);
+	outManagerCSData->nOfOutCmpInPocl = 0;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwCounterU1_t CrFwOutManagerGetNOfPendingOutCmp(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* outManagerDataLocal = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutManagerData_t* outManagerCSData = (CrFwOutManagerData_t*)outManagerDataLocal->cmpSpecificData;
+	return outManagerCSData->nOfOutCmpInPocl;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwCounterU2_t CrFwOutManagerGetNOfLoadedOutCmp(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* outManagerDataLocal = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutManagerData_t* outManagerCSData = (CrFwOutManagerData_t*)outManagerDataLocal->cmpSpecificData;
+	return outManagerCSData->nOfLoadedOutCmp;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwCounterU1_t CrFwOutManagerGetPOCLSize(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* outManagerDataLocal = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwInstanceId_t id = outManagerDataLocal->instanceId;
+	return (CrFwCounterU1_t)outManagerPoclSize[id];
+}
+
diff --git a/CrFramework/src/OutManager/CrFwOutManager.h b/CrFramework/src/OutManager/CrFwOutManager.h
new file mode 100644
index 0000000..9635e3b
--- /dev/null
+++ b/CrFramework/src/OutManager/CrFwOutManager.h
@@ -0,0 +1,164 @@
+/**
+ * @file
+ * @ingroup outMngGroup
+ * Definition of the OutManager component.
+ *
+ * The OutManager component is responsible for maintaining a list of
+ * pending OutComponents (see <code>CrFwOutCmp.h</code>) and for repeatedly
+ * executing them until they are either aborted or else they are serialized
+ * and sent to their destination.
+ *
+ * The list of pending commands is called the Pending OutComponent List or POCL.
+ * The POCL has a fixed size which is defined statically in <code>CrFwOutManagerUserPar.h</code>.
+ *
+ * The OutManager is defined as an extension of the Base Component (see <code>CrFwBaseCmp.h</code>).
+ * It uses the Execution Procedure of the Base Component to process the pending OutComponents.
+ * The OutManager component processes the pending OutComponents by sending them an Execute command.
+ * After each Execute command, the state of the OutComponent is reported to the OutRegistry
+ * (see <code>CrFwOutRegistry.h</code>).
+ * Commands which have been aborted or have been sent to their destination are removed
+ * from the POCL and are returned to the OutFactory (see <code>CrFwOutFactory.h</code>).
+ * The Execution Procedure of the OutManager is shown in the figure below.
+ *
+ * <b>Mode of Use of an OutManager Component</b>
+ *
+ * The configuration of the OutManager components is defined statically in
+ * <code>CrFwOutManagerUserPar.h</code>.
+ *
+ * An OutManager component is created with function <code>::CrFwOutManagerMake</code>.
+ * After being created, the OutManager must be initialized and reset.
+ * This is done with functions <code>::CrFwCmpInit</code> and <code>::CrFwCmpReset</code>.
+ * Nominally, after being initialized and reset the OutManager State Machine should be
+ * in state CONFIGURED (this can be checked by verifying that function <code>FwSmGetCurState</code>
+ * returns CR_FW_BASE_STATE_CONFIGURED).
+ *
+ * An application can have any number of OutManagers.
+ *
+ * An OutManager offers a Load operation (<code>::CrFwOutManagerLoad</code>) through which
+ * an OutComponent can be added to the POCL.
+ * This operation is normally called by the OutLoader (see <code>CrFwOutLoader.h</code>).
+ *
+ * There is no mechanism to “unload” a pending OutComponent.
+ * The OutManager autonomously returns an OutComponent to the OutFactory when the
+ * OutComponent has been sent to its destination (i.e. when the OutComponent is in
+ * state TERMINATED) or when it has been aborted (i.e. when the OutComponent is in
+ * state ABORTED).
+ *
+ * After an OutManager has been configured, it can be executed by means of function
+ * <code>FwSmExecute</code>.
+ * Execution of an OutManager causes its Execution Procedure (see figure below) to be
+ * executed.
+ *
+ * When an OutManager is reset or shutdown, its POCL is reset (all pending OutComponents
+ * are cleared and returned to the OutFactory).
+ *
+ * @image html OutManagerExecution.png
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_OUT_MANAGER_H_
+#define CRFW_OUT_MANAGER_H_
+
+/* Include FW Profile Files */
+#include "FwSmConstants.h"
+#include "FwPrConstants.h"
+/* Include Framework Files */
+#include "CrFwConstants.h"
+/* Include Configuration Files */
+#include "CrFwUserConstants.h"
+#include "Pckt/CrFwPcktQueue.h"
+
+/**
+ * Factory function to retrieve the i-th OutManager State Machine instance.
+ * The first time this function is called with a certain value of the argument i, it
+ * creates the i-th OutManager State Machine instance.
+ * Subsequent calls returns the same instance.
+ *
+ * The OutManager identifier i must be in the range: [0, <code>#CR_FW_NOF_OUTMANAGER</code>-1].
+ * If the identifier is out of range, the function returns NULL and sets the application
+ * error code to: <code>::crOutManagerIllId</code>.
+ *
+ * The first time this function is called with a certain value of i, it returns an
+ * OutManager State Machine which has been started but which still needs to be initialized and
+ * configured.
+ * @param outManagerId the identifier of the OutManager
+ * @return the descriptor of the OutManager State Machine or NULL
+ * if the state machine could not be created or if the identifier i is out of range.
+ */
+FwSmDesc_t CrFwOutManagerMake(CrFwInstanceId_t outManagerId);
+
+/**
+ * Load a new OutComponent into the OutManager.
+ * The behaviour implemented by this function is shown in the activity diagram below.
+ * If the POCL is not full, the function identifies a free position in the POCL where
+ * to store the OutComponent.
+ * This function adds OutComponents to the POCL. The POCL is flushed when the OutManager
+ * is executed (i.e. it is flushed by function <code>::OutManagerExecAction</code>).
+ * The algorithms to identify a free position in the POCL and to process the POCL
+ * entries when the OutManager is executed are optimized for a situation where multiple
+ * load operations are performed before the OutManager is executed.
+ *
+ * Additionally, these algorithms guarantee the following ordering constraint.
+ * Let OutComponents C1 to Cn be successfully loaded into an OutManager through a sequence
+ * of calls to function <code>::CrFwOutManagerLoad</code> and assume that this sequence
+ * of load operations is not interrupted by an execution of the OutManager.
+ * Under these conditions, when the OutManager is executed next, the OutComponents C1 to
+ * Cn will be processed in the order in which they have been loaded.
+ *
+ * The implementation of function <code>::CrFwOutManagerLoad</code> is based on the
+ * internal variable <code>freePos</code>. This variable has the following
+ * characteristics:
+ * - it is initialized to point to the first entry in the POCL;
+ * - after the execution of the load function, <code>freePos</code> either points to the next
+ * free position in the POCL or is equal to the POCL size if the POCL is full;
+ * - after execution of the OutManager, it is re-initialized to point to the first position
+ * in the POCL.
+ * .
+ * @image html OutManagerLoad.png
+ * @param smDesc the descriptor of the OutManager State Machine.
+ * @param outCmp the descriptor of the OutComponent to be loaded in the OutManager
+ */
+void CrFwOutManagerLoad(FwSmDesc_t smDesc, FwSmDesc_t outCmp);
+
+/**
+ * Return the number of OutComponents currently in the POCL of an OutManager.
+ * @param smDesc the descriptor of the OutManager State Machine.
+ * @return the number of OutComponents currently in the POCL of an OutManager.
+ */
+CrFwCounterU1_t CrFwOutManagerGetNOfPendingOutCmp(FwSmDesc_t smDesc);
+
+/**
+ * Return the number of OutComponents successfully loaded in the POCL of an OutManager
+ * since the OutManager was last reset.
+ * @param smDesc the descriptor of the OutManager State Machine.
+ * @return the number of OutComponents successfully loaded in the POCL of an OutManager.
+ */
+CrFwCounterU2_t CrFwOutManagerGetNOfLoadedOutCmp(FwSmDesc_t smDesc);
+
+/**
+ * Return the size of the POCL of an OutManager.
+ * @param smDesc the descriptor of the OutManager State Machine.
+ * @return the size of the POCL of an OutManager.
+ */
+CrFwCounterU1_t CrFwOutManagerGetPOCLSize(FwSmDesc_t smDesc);
+
+#endif /* CRFW_OUT_MANAGER_H_ */
diff --git a/CrFramework/src/OutRegistry/CrFwOutRegistry.c b/CrFramework/src/OutRegistry/CrFwOutRegistry.c
new file mode 100644
index 0000000..64507c4
--- /dev/null
+++ b/CrFramework/src/OutRegistry/CrFwOutRegistry.c
@@ -0,0 +1,397 @@
+/**
+ * @file
+ *
+ * Implementation of OutRegistry component.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include <stdlib.h>
+/* Include configuration files */
+#include "CrFwOutRegistryUserPar.h"
+#include "CrFwCmpData.h"
+/* Include framework files */
+#include "CrFwConstants.h"
+#include "UtilityFunctions/CrFwUtilityFunctions.h"
+#include "OutCmp/CrFwOutCmp.h"
+#include "BaseCmp/CrFwBaseCmp.h"
+#include "BaseCmp/CrFwInitProc.h"
+#include "BaseCmp/CrFwResetProc.h"
+#include "BaseCmp/CrFwDummyExecProc.h"
+#include "CrFwOutRegistry.h"
+/* Include FW Profile files */
+#include "FwPrConfig.h"
+#include "FwPrDCreate.h"
+#include "FwSmConfig.h"
+#include "FwSmDCreate.h"
+#include "FwPrCore.h"
+
+/** Array of service descriptors (see <code>CrFwServDesc_t</code>). */
+static CrFwServDesc_t servDesc[CR_FW_OUTREGISTRY_NSERV] = CR_FW_OUTREGISTRY_INIT_SERV_DESC;
+
+/**
+ * An instance of this type holds the information about an out-going command or report
+ * which is being tracked by the OuRegistry.
+ */
+typedef struct {
+	/** The identifier of the out-going command or report */
+	CrFwInstanceId_t instanceId;
+	/** The state of the out-going command or report */
+	CrFwOutRegistryCmdRepState_t state;
+} CrFwTrackedState_t;
+
+/** Array to track the state of out-going commands or reports */
+static CrFwTrackedState_t cmdRepState[CR_FW_OUTREGISTRY_N];
+
+/** The index of the most recent entry in <code>cmdRepState</code>. */
+static CrFwTrackingIndex_t cmdRepStateIndex = 0;
+
+/** The OutRegistry singleton. */
+static FwSmDesc_t outRegistry = NULL;
+
+/** The data for the OutRegistry singleton. */
+static CrFwCmpData_t outRegistryData;
+
+/**
+ * Initialization action for OutRegistry.
+ * This function allocates the memory for the OutRegistry data structures and
+ * initializes all data structures which depend on the set of services supported
+ * by the application.
+ * The outcome of the initialization action is always "success".
+ * The situation where the memory allocation for the OutRegistry data structures
+ * fails is not handled and will result in undefined behaviour (probably a run-time
+ * exception).
+ * @param initPr the Initialization Procedure of the OutRegistry
+ */
+static void OutRegistryInitAction(FwPrDesc_t initPr);
+
+/**
+ * Configuration action for OutRegistry.
+ * This function sets the enable state of all service types, sub-types and discriminant
+ * to "enabled" and resets the queue of tracked commands and reports.
+ * The outcome of the configuration action is always: "successful"
+ * @param resetPr the Configuration Procedure of the OutRegistry
+ */
+static void OutRegistryConfigAction(FwPrDesc_t resetPr);
+
+/**
+ * Shutdown action for OutRegistry.
+ * This function sets the enable state of all service types, sub-types and discriminant
+ * to "enabled" and resets the queue of tracked commands and reports.
+ * This function also releases the memory allocated when the OutRegistry was initialized.
+ * @param smDesc the OutRegistry state machine
+ */
+static void OutRegistryShutdownAction(FwSmDesc_t smDesc);
+
+/*------------------------------------------------------------------------------------*/
+FwSmDesc_t CrFwOutRegistryMake() {
+	FwPrDesc_t resetPr, execPr, initPr;
+
+	if (outRegistry != NULL) {
+		return outRegistry;
+	}
+
+	/* Extend the Base Component */
+	outRegistry = FwSmCreateDer(CrFwBaseCmpMake());
+
+	/* Create the Reset Procedure for the OuRegistry Component */
+	resetPr = FwPrCreateDer(CrFwCmpGetResetProc());
+	FwPrOverrideAction(resetPr, &CrFwBaseCmpDefConfigAction, &OutRegistryConfigAction);
+
+	/* Create the Initialization Procedure for the OuRegistry Component */
+	initPr = FwPrCreateDer(CrFwCmpGetInitProc());
+	FwPrOverrideAction(initPr, &CrFwBaseCmpDefInitAction, &OutRegistryInitAction);
+
+	/* Override the Shutdown Action for the InStream Component */
+	FwSmOverrideAction(outRegistry, &CrFwBaseCmpDefShutdownAction, &OutRegistryShutdownAction);
+
+	/* Get the Dummy Execution Procedure for the OutRegistry Component */
+	execPr = CrFwBaseCmpGetDummyExecProc();
+
+	/* Initialize the data for the requested SM */
+	outRegistryData.outcome = 1;
+	outRegistryData.initProc = initPr;
+	outRegistryData.resetProc = resetPr;
+	outRegistryData.execProc = execPr;
+	outRegistryData.instanceId = 0;
+	outRegistryData.typeId = CR_FW_OUTREGISTRY_TYPE;
+
+	/* Attach the data to the OutRegistry state machine and to its procedures. */
+	FwSmSetData(outRegistry, &outRegistryData);
+	FwPrSetData(outRegistryData.initProc, &outRegistryData);
+	FwPrSetData(outRegistryData.resetProc, &outRegistryData);
+
+	/* Start the OutRegistry */
+	FwSmStart(outRegistry);
+
+	return outRegistry;
+}
+
+/*------------------------------------------------------------------------------------*/
+CrFwServType_t CrFwOutRegistryGetServType(CrFwCmdRepIndex_t cmdRepIndex) {
+	return servDesc[cmdRepIndex].servType;
+}
+
+/*------------------------------------------------------------------------------------*/
+CrFwServSubType_t CrFwOutRegistryGetServSubType(CrFwCmdRepIndex_t cmdRepIndex) {
+	return servDesc[cmdRepIndex].servSubType;
+}
+
+/*------------------------------------------------------------------------------------*/
+CrFwCmdRepIndex_t CrFwOutRegistryGetCmdRepIndex(CrFwServType_t servType, CrFwServSubType_t servSubType) {
+	CrFwCmdRepIndex_t i = 0;
+
+	while (servDesc[i].nextServType != 0)
+		if (servDesc[i].servType < servType)
+			i = servDesc[i].nextServType;
+		else if (servDesc[i].servType > servType)
+			return CR_FW_OUTREGISTRY_NSERV;	/* The specified type does not exist */
+		else
+			break;
+
+	if (servDesc[i].servType != servType)
+		return CR_FW_OUTREGISTRY_NSERV;	/* The specified type does not exist */
+
+	while (servDesc[i].servSubType <= servSubType) {
+		if (servDesc[i].servSubType == servSubType)
+			return i;	/* Cmd-Rep index found! */
+		i++;
+		if (servDesc[i].servType != servType)
+			return CR_FW_OUTREGISTRY_NSERV; /* The specified sub-type does not exist in the specified type */
+	}
+
+	return CR_FW_OUTREGISTRY_NSERV; /* The specified sub-type does not exist in the specified type */
+}
+
+/*------------------------------------------------------------------------------------*/
+void CrFwOutRegistrySetEnable(CrFwServType_t servType, CrFwServSubType_t servSubType,
+                              CrFwDiscriminant_t discriminant, CrFwBool_t isEnabled) {
+	CrFwCmdRepIndex_t i = 0;
+	CrFwDiscriminant_t byteIndex, bitPos;
+	unsigned char temp;
+
+	while (servDesc[i].nextServType != 0)
+		if (servDesc[i].servType < servType)
+			i = servDesc[i].nextServType;
+		else if (servDesc[i].servType > servType) {
+			CrFwSetAppErrCode(crIllServType);
+			return;
+		} else
+			break;
+
+	if (servDesc[i].servType != servType) {
+		CrFwSetAppErrCode(crIllServType);
+		return;
+	}
+
+	if (servSubType == 0) {
+		while (servDesc[i].servType == servType) {
+			servDesc[i].isServTypeEnabled = isEnabled;
+			i++;
+			if (i == CR_FW_OUTREGISTRY_NSERV)
+				return;
+		}
+		return;
+	}
+
+	while (servDesc[i].servType == servType) {
+		if (servDesc[i].servSubType < servSubType)
+			i++;
+		else if (servDesc[i].servSubType > servSubType) {
+			CrFwSetAppErrCode(crIllServSubType);
+			return;
+		} else
+			break;
+	}
+
+	if (servDesc[i].servSubType < servSubType) {
+		CrFwSetAppErrCode(crIllServSubType);
+		return;
+	}
+
+	if (discriminant == 0) {
+		servDesc[i].isServSubTypeEnabled = isEnabled;
+		return;
+	}
+
+	if (discriminant > servDesc[i].maxDiscriminant)
+		CrFwSetAppErrCode(crIllDiscriminant);
+	else {
+		byteIndex = discriminant/(8*sizeof(char));
+		bitPos = (CrFwDiscriminant_t)(discriminant - byteIndex*8*(CrFwDiscriminant_t)sizeof(char));
+		if (isEnabled == 1)
+			servDesc[i].isDiscriminantEnabled[byteIndex] = servDesc[i].isDiscriminantEnabled[byteIndex] | (unsigned char)(1 << (bitPos-1));
+		else {
+			temp = (unsigned char)(~(1 << (bitPos-1)));
+			servDesc[i].isDiscriminantEnabled[byteIndex] = servDesc[i].isDiscriminantEnabled[byteIndex] & temp;
+		}
+	}
+}
+
+/*------------------------------------------------------------------------------------*/
+CrFwBool_t CrFwOutRegistryIsEnabled(FwSmDesc_t outCmp) {
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(outCmp);
+	CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)cmpData->cmpSpecificData;
+	CrFwCmdRepIndex_t cmdRepIndex;
+	CrFwDiscriminant_t byteIndex, bitPos, discriminant;
+	unsigned char enableByte;
+	/*CrFwOutCmpData_t* outCmpData = &(((CrFwCmpData_t*)FwSmGetData(outCmp))->cmpSpecificData.outCmpData);*/
+
+	cmdRepIndex = cmpSpecificData->index;
+	if (servDesc[cmdRepIndex].isServTypeEnabled == 0)
+		return 0;
+
+	if (servDesc[cmdRepIndex].isServSubTypeEnabled == 0)
+		return 0;
+
+	discriminant = CrFwOutCmpGetDiscriminant(outCmp);
+	if (discriminant == 0)
+		return 1;
+	byteIndex = discriminant/(8*sizeof(char));
+	bitPos = (CrFwDiscriminant_t)(discriminant - byteIndex*8*(CrFwDiscriminant_t)sizeof(char));
+	enableByte = servDesc[cmdRepIndex].isDiscriminantEnabled[byteIndex];
+	if ((enableByte & (1 << (bitPos-1))) == 0)
+		return 0;
+	else
+		return 1;
+}
+
+/*------------------------------------------------------------------------------------*/
+void CrFwOutRegistryStartTracking(FwSmDesc_t outCmp) {
+	CrFwCmpData_t* outCmpData = (CrFwCmpData_t*)FwSmGetData(outCmp);
+	CrFwOutCmpData_t* outCmpSpecificData = (CrFwOutCmpData_t*)outCmpData->cmpSpecificData;
+
+	cmdRepState[cmdRepStateIndex].instanceId = outCmpData->instanceId;
+	cmdRepState[cmdRepStateIndex].state = crOutRegistryPending;
+	outCmpSpecificData->trackingIndex = cmdRepStateIndex;
+	/*outCmpData->cmpSpecificData.outCmpData.trackingIndex = cmdRepStateIndex;*/
+
+	if (cmdRepStateIndex == (CR_FW_OUTREGISTRY_N-1))
+		cmdRepStateIndex = 0;
+	else
+		cmdRepStateIndex++;
+}
+
+/*------------------------------------------------------------------------------------*/
+void CrFwOutRegistryUpdateState(FwSmDesc_t outCmp, CrFwOutRegistryCmdRepState_t newState) {
+	CrFwCmpData_t* outCmpData = (CrFwCmpData_t*)FwSmGetData(outCmp);
+	CrFwOutCmpData_t* outCmpSpecificData = (CrFwOutCmpData_t*)outCmpData->cmpSpecificData;
+	CrFwTrackingIndex_t i;
+
+	i = outCmpSpecificData->trackingIndex;
+	/*i = outCmpData->cmpSpecificData.outCmpData.trackingIndex;*/
+	if (cmdRepState[i].instanceId == outCmpData->instanceId) {
+		cmdRepState[i].state = newState;
+	}
+}
+
+/*------------------------------------------------------------------------------------*/
+CrFwOutRegistryCmdRepState_t CrFwOutRegistryGetState(CrFwInstanceId_t cmdRepId) {
+	CrFwTrackingIndex_t i;
+	CrFwTrackingIndex_t j;
+
+	if (cmdRepStateIndex > 0)
+		i = (CrFwTrackingIndex_t)(cmdRepStateIndex-1);
+	else
+		i = (CR_FW_OUTREGISTRY_N-1);
+
+	for (j=0; j<CR_FW_OUTREGISTRY_N; j++) {
+		if (cmdRepState[i].state == crOutRegistryNoEntry)
+			break;
+		if (cmdRepState[i].instanceId == cmdRepId) {
+			return cmdRepState[i].state;
+		} else if (i == 0)
+			i = (CR_FW_OUTREGISTRY_N-1);
+		else
+			i--;
+	}
+
+	return crOutRegistryNotTracked;
+}
+
+/*------------------------------------------------------------------------------------*/
+static void OutRegistryInitAction(FwPrDesc_t initPr) {
+	CrFwCmdRepIndex_t i, nextServType;
+	CrFwDiscriminant_t nOfBytes;
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwPrGetData(initPr);
+
+	for (i=0; i<CR_FW_OUTREGISTRY_NSERV; i++) {
+		if (servDesc[i].maxDiscriminant == 0)
+			servDesc[i].isDiscriminantEnabled = NULL;
+		else {
+			nOfBytes = (CrFwDiscriminant_t)(servDesc[i].maxDiscriminant/sizeof(char)+1);
+			servDesc[i].isDiscriminantEnabled = malloc(sizeof(unsigned char)*nOfBytes);
+		}
+	}
+
+	nextServType = 0;
+	for (i=CR_FW_OUTREGISTRY_NSERV-1; i>0; i--) {
+		servDesc[i].nextServType = nextServType;
+		if (servDesc[i-1].servType != servDesc[i].servType)
+			nextServType = i;
+	}
+	servDesc[0].nextServType = nextServType;
+
+	cmpData->outcome = 1;
+}
+
+/*------------------------------------------------------------------------------------*/
+static void OutRegistryConfigAction(FwPrDesc_t initPr) {
+	CrFwCmdRepIndex_t i;
+	CrFwDiscriminant_t j;
+	CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwPrGetData(initPr);
+	CrFwCounterU2_t k;
+
+	for (i=0; i<CR_FW_OUTREGISTRY_NSERV; i++) {
+		servDesc[i].isServTypeEnabled = 1;
+		servDesc[i].isServSubTypeEnabled = 1;
+		if (servDesc[i].maxDiscriminant != 0)
+			for (j=0; j<(servDesc[i].maxDiscriminant/(8*sizeof(char))+1); j++)
+				servDesc[i].isDiscriminantEnabled[j] = (unsigned char)(~0);
+	}
+
+	for (k=0; k<CR_FW_OUTREGISTRY_N; k++)
+		cmdRepState[k].state = crOutRegistryNoEntry;
+
+	cmdRepStateIndex = 0;
+
+	cmpData->outcome = 1;
+}
+
+/*------------------------------------------------------------------------------------*/
+static void OutRegistryShutdownAction(FwSmDesc_t smDesc) {
+	CrFwCmdRepIndex_t i;
+	CrFwCounterU2_t k;
+	CRFW_UNUSED(smDesc);
+
+	for (i=0; i<CR_FW_OUTREGISTRY_NSERV; i++) {
+		servDesc[i].isServTypeEnabled = 1;
+		servDesc[i].isServSubTypeEnabled = 1;
+		if (servDesc[i].maxDiscriminant != 0)
+			free(servDesc[i].isDiscriminantEnabled);
+	}
+
+	for (k=0; k<CR_FW_OUTREGISTRY_N; k++)
+		cmdRepState[k].state = crOutRegistryNoEntry;
+
+	cmdRepStateIndex = 0;
+}
diff --git a/CrFramework/src/OutRegistry/CrFwOutRegistry.h b/CrFramework/src/OutRegistry/CrFwOutRegistry.h
new file mode 100644
index 0000000..00ee6a2
--- /dev/null
+++ b/CrFramework/src/OutRegistry/CrFwOutRegistry.h
@@ -0,0 +1,263 @@
+/**
+ * @file
+ * @ingroup outMngGroup
+ * Definition of the OutRegistry Component.
+ *
+ * An OutRegistry acts as a registry for out-going commands or reports (namely for
+ * commands or reports which have been loaded into an OutManager).
+ * The OutRegistry is responsible for:
+ * - keeping track of an out-going command's or report's state
+ * - storing the enable state of out-going commands or reports
+ * - storing the link between the index of an out-going command or report and its
+ *   service type and sub-type
+ * .
+ * The index of an out-going command or report is a positive integer in the range
+ * from 0 to <code>::CR_FW_OUTREGISTRY_NSERV</code>-1.
+ * <code>::CR_FW_OUTREGISTRY_NSERV</code> is the total number of out-going service
+ * types and sub-types in an application.
+ * The index of an out-going command or report uniquely identifies the command's
+ * or report's type and sub-type.
+ *
+ * The set of out-going service types and sub-types supported by an application
+ * is specified in <code>CrFwOutRegistryUserPar.h</code>.
+ *
+ * The framework internally uses the index as a more efficient way of identifying
+ * a pair [service type, service sub-type] for an out-going command or report.
+ * The OutRegistry offers a function which allows the service type and service sub-type
+ * associated to a certain index to be retrieved.
+ *
+ * The OutRegistry is a singleton component which is implemented as an extension
+ * of the Base Component of <code>CrFwBaseCmp.h</code>.
+ *
+ * The OutRegistry maintains a list of the last N commands or reports to have been
+ * loaded in an OutManager.
+ * The OutRegistry maintains the state of each such command or report.
+ * The command's or report's state in the OutRegistry can have one of the following values:
+ * - PENDING: the command or report is waiting to be sent
+ * - ABORTED: the command or report was aborted because it was disabled when it was loaded
+ * - TERMINATED: the command or report has been passed to the OutStream
+ * .
+ * The value of N (the maximum number of items which can be tracked by the OutRegistry)
+ * is fixed and is an initialization parameter.
+ *
+ * The OutRegistry uses the instance identifier of the OutComponent encapsulating
+ * the out-going report or command as the key through which the out-going command or report
+ * state is tracked.
+ *
+ * The OutRegistry stores the enable state of out-going commands and reports.
+ * The enable state of out-going command and reports can be controlled at three levels:
+ * - At the level of the service type (all commands or reports of a certain type are disabled)
+ * - At the level of the service sub-type (all commands or reports matching a certain
+ *   [type, sub-type] pair are disabled)
+ * - At the level of the discriminant (all commands or reports matching a certain
+ *   [type, sub-type, discriminant] triplet are enabled or disabled)
+ * .
+ * The enable state of a particular out-going command or report is derived from these three
+ * enable levels by running the Enable State Determination Procedure shown in the
+ * figure below.
+ * The OutRegistry offers functions through which all three levels of enable state
+ * can be controlled and through which the enable state of a specific out-going
+ * command or report can be determined.
+ * By default, the enable state for all kinds of reports or commands is set to:
+ * "enabled".
+ *
+ * <b>Mode of Use of an OutRegistry Component</b>
+ *
+ * The configuration of the OutRegistry component is defined statically in
+ * <code>CrFwOutRegistryUserPar.h</code>.
+ *
+ * The OutRegistry component is a "final" component that does not normally need
+ * to be extended.
+ *
+ * An OutRegistry component is created with function <code>::CrFwOutRegistryMake</code>.
+ * After being created, the OutRegistry must be initialized and reset.
+ * This is done with functions <code>::CrFwCmpInit</code> and <code>::CrFwCmpReset</code>.
+ * Nominally, after being initialized and reset the OutRegistry State Machine should be
+ * in state CONFIGURED (this can be checked by verifying that function <code>FwSmGetCurState</code>
+ * returns CR_FW_BASE_STATE_CONFIGURED).
+ *
+ * @image html EnableStateDetermination.png
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_OUTREGISTRY_H_
+#define CRFW_OUTREGISTRY_H_
+
+/* Include configuration files */
+#include "CrFwOutRegistryUserPar.h"
+#include "CrFwUserConstants.h"
+/* Include FW Profile files */
+#include "FwSmConstants.h"
+#include "FwPrConstants.h"
+/* Include framework files */
+#include "CrFwConstants.h"
+
+/** Enumerated type for the state of an out-going command or report tracked by the OutRegistry */
+typedef enum {
+	/** No entry yet in OutRegistry */
+	crOutRegistryNoEntry = 0,
+	/** Out-going command or report is pending (waiting to be sent) */
+	crOutRegistryPending = 1,
+	/** Out-going command or report has been aborted */
+	crOutRegistryAborted = 2,
+	/** Out-going command or report has been passed to the OutStream */
+	crOutRegistryTerminated = 3,
+	/** Out-going command or report is not tracked */
+	crOutRegistryNotTracked = 4
+} CrFwOutRegistryCmdRepState_t;
+
+/**
+ * Factory function for the singleton instance of the OutRegistry.
+ * The first time this function is called, it creates and configures the OutRegistry.
+ * Subsequent calls returns the same singleton instance.
+ * The first time this function is called, it returns the OutRegistry in state CREATED.
+ *
+ * If the creation or the configuration of the OutRegistry fails, the function
+ * returns NULL.
+ * @return singleton instance of the OutRegistry or NULL if the creation or configuration
+ * of the OutRegistry failed.
+ */
+FwSmDesc_t CrFwOutRegistryMake();
+
+/**
+ * Get the service type of the argument command or report index.
+ * For out-going commands or reports the index uniquely identifies a pair:
+ * [service type, service sub-type].
+ * This function returns the service type corresponding to a certain index value.
+ * If the index value is out of range (i.e. if it is greater than
+ * <code>::CR_FW_OUTREGISTRY_NSERV</code>-1), the behaviour of this function is
+ * undefined.
+ * @param cmdRepIndex the command or report index
+ * @return the service type corresponding to the command or report index
+ */
+CrFwServType_t CrFwOutRegistryGetServType(CrFwCmdRepIndex_t cmdRepIndex);
+
+/**
+ * Get the service sub-type of the argument command or report index.
+ * For out-going commands or reports the index uniquely identifies a pair:
+ * [service type, service sub-type].
+ * This function returns the service sub-type corresponding to a certain index value.
+ * If the index value is out of range (i.e. if it is greater than
+ * <code>::CR_FW_OUTREGISTRY_NSERV</code>-1), the behaviour of this function is
+ * undefined.
+ * @param cmdRepIndex the command or report index
+ * @return the service type corresponding to the command or report index
+ */
+CrFwServSubType_t CrFwOutRegistryGetServSubType(CrFwCmdRepIndex_t cmdRepIndex);
+
+/**
+ * Get the index corresponding to the argument [service type, service sub-type] of an out-going
+ * command or report.
+ * For out-going commands or reports the index uniquely identifies a pair:
+ * [service type, service sub-type].
+ * This function returns the index corresponding to a specific [service type, service sub-type]
+ * pair.
+ * If either of the two arguments has an illegal value (i.e. if it has a value which does
+ * not correspond to any [service type, service sub-type] declared in the initializer
+ * of the service descriptor <code>::CR_FW_OUTREGISTRY_INIT_SERV_DESC</code>.),
+ * the function returns CR_FW_OUTREGISTRY_NSERV.
+ * @param servType the service type
+ * @param servSubType the service sub-type
+ * @return cmdRepIndex the command or report index or CR_FW_OUTREGISTRY_NSERV if the
+ * specified [type, sub-type] does not exist
+ */
+CrFwCmdRepIndex_t CrFwOutRegistryGetCmdRepIndex(CrFwServType_t servType, CrFwServSubType_t servSubType);
+
+/**
+ * Set the enable state of a set of out-going commands or reports.
+ * The enable state of out-going command and reports can be controlled at three levels:
+ * - At the level of the service type (all commands or reports of a certain type are disabled)
+ * - At the level of the service sub-type (all commands or reports matching a certain
+ *   [type, sub-type] pair are disabled)
+ * - At the level of the discriminant (all commands or reports matching a certain
+ *   [type, sub-type, discriminant] triplet are enabled or disabled)
+ * .
+ * This function allows all three enable levels to be set according to the logic
+ * in the activity diagram shown below.
+ * Use of illegal values for the function parameters results in the application error code
+ * being set to: <code>#crIllServType</code> (if the service type is illegal), or to
+ * <code>#crIllServSubType</code> (if the service sub-type is illegal), or to
+ * <code>#crIllDiscriminant</code> (if the discriminant value is illegal).
+ * A service type or sub-type or a discriminant value are illegal if they are not covered
+ * in the list of [type, sub-types, discriminant] in the <code>CrFwOutRegistryUserPar.h</code>
+ * (see <code>::CR_FW_OUTREGISTRY_INIT_SERV_DESC</code>).
+ * @image html EnableCmdRep.png
+ * @param servType the service type
+ * @param servSubType the service type
+ * @param discriminant the discriminant
+ * @param isEnabled the enable state
+ */
+void CrFwOutRegistrySetEnable(CrFwServType_t servType, CrFwServSubType_t servSubType,
+                              CrFwDiscriminant_t discriminant, CrFwBool_t isEnabled);
+
+/**
+ * Query the enable status of an out-going command or report.
+ * If the argument does not represent an out-going command or report (i.e. if it is not
+ * a component of type OutComponent), the behaviour of the function is undefined.
+ * The enable state of an out-going command or report is determined by running the
+ * Enable State Determination Procedure shown in the figure.
+ * @image html EnableStateDetermination.png
+ * @param outCmp the out-going command or report as an OutComponent
+ * @return the enable state of the specified command or report
+ */
+CrFwBool_t CrFwOutRegistryIsEnabled(FwSmDesc_t outCmp);
+
+/**
+ * Ask the OutRegistry to start tracking an out-going command or report.
+ * The OutRegistry tracks the state of the last N out-going command or reports
+ * to have been loaded with this function.
+ * Initially, when this function is called, the out-going command or report is
+ * placed in state PENDING.
+ * This function runs the procedure in the left-hand
+ * side of the activity diagram shown in the figure.
+ * @image html RegistryStartTrackingAndUpdate.png
+ * @param outCmp the out-going command or report to be tracked
+ */
+void CrFwOutRegistryStartTracking(FwSmDesc_t outCmp);
+
+/**
+ * Ask the OutRegistry to update the state of an out-going command or report.
+ * If the argument component is not tracked by the OutRegistry (perhaps because
+ * too many OutComponents have been added to the list of tracked components),
+ * nothing is done.
+ * This function runs the procedure in the right-hand
+ * side of the activity diagram shown in the figure.
+ * @image html RegistryStartTrackingAndUpdate.png
+ * @param outCmp the out-going command or report to be tracked
+ * @param newState the new state of the out-going command or report
+ */
+void CrFwOutRegistryUpdateState(FwSmDesc_t outCmp, CrFwOutRegistryCmdRepState_t newState);
+
+/**
+ * Query the OutRegistry for the state of an out-going command or report.
+ * If the specified index does not correspond to any command or report being
+ * tracked by the OutRegistry, a value of <code>::crOutRegistryNotTracked</code>
+ * is returned.
+ * This function searches all locations in the InRegistry in sequence until it
+ * finds the out-going command or report.
+ * @param cmdRepId the instance identifier of the out-going command or report.
+ * @return the state of the out-going command or report (or <code>::crOutRegistryNotTracked</code>
+ * if the command or report is not tracked)
+ */
+CrFwOutRegistryCmdRepState_t CrFwOutRegistryGetState(CrFwInstanceId_t cmdRepId);
+
+#endif /* CRFW_OUTREGISTRY_H_ */
diff --git a/CrFramework/src/OutStream/CrFwOutStream.c b/CrFramework/src/OutStream/CrFwOutStream.c
new file mode 100644
index 0000000..1f85c57
--- /dev/null
+++ b/CrFramework/src/OutStream/CrFwOutStream.c
@@ -0,0 +1,433 @@
+/**
+ * @file
+ *
+ * Implementation of OutStream State Machine.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include <stdlib.h>
+#include<string.h>
+/* Include configuration files */
+#include "CrFwOutStreamUserPar.h"
+#include "CrFwCmpData.h"
+/* Include framework files */
+#include "CrFwConstants.h"
+#include "CrFwRepErr.h"
+#include "CrFwTime.h"
+#include "BaseCmp/CrFwBaseCmp.h"
+#include "CrFwOutStream.h"
+#include "BaseCmp/CrFwInitProc.h"
+#include "BaseCmp/CrFwResetProc.h"
+#include "BaseCmp/CrFwDummyExecProc.h"
+#include "Pckt/CrFwPckt.h"
+#include "Pckt/CrFwPcktQueue.h"
+#include "UtilityFunctions/CrFwUtilityFunctions.h"
+/* Include FW Profile files */
+#include "FwSmConstants.h"
+#include "FwSmDCreate.h"
+#include "FwSmConfig.h"
+#include "FwSmCore.h"
+#include "FwPrConstants.h"
+#include "FwPrDCreate.h"
+#include "FwPrConfig.h"
+#include "FwPrCore.h"
+
+/** Base OutStream from which all other OutStreams are derived. */
+static FwSmDesc_t baseOutStreamSmDesc = NULL;
+
+/** The sizes of the packet queues in the OutStream components. */
+static CrFwCounterU1_t outStreamPcktQueueSize[CR_FW_NOF_OUTSTREAM] = CR_FW_OUTSTREAM_PQSIZE;
+
+/** The destinations associated to the OutStream components. */
+static CrFwDestSrc_t outStreamDest[CR_FW_NOF_OUTSTREAM] = CR_FW_OUTSTREAM_DEST;
+
+/** The number of groups associated to the OutStream components. */
+static CrFwGroup_t outStreamNOfGroups[CR_FW_NOF_OUTSTREAM] = CR_FW_OUTSTREAM_NOF_GROUPS;
+
+/** The functions implementing the packet hand-over operations for the OutStream components */
+static CrFwPcktHandover_t outStreamHandoverPckt[CR_FW_NOF_OUTSTREAM] = CR_FW_OUTSTREAM_PCKTHANDOVER;
+
+/** The functions implementing the initialization checks for the InStream components. */
+static FwPrAction_t outStreamInitCheck[CR_FW_NOF_OUTSTREAM] = CR_FW_OUTSTREAM_INITCHECK;
+
+/** The functions implementing the initialization actions for the InStream components. */
+static FwPrAction_t outStreamInitAction[CR_FW_NOF_OUTSTREAM] = CR_FW_OUTSTREAM_INITACTION;
+
+/** The functions implementing the configuration checks for the InStream components. */
+static FwPrAction_t outStreamConfigCheck[CR_FW_NOF_OUTSTREAM] = CR_FW_OUTSTREAM_CONFIGCHECK;
+
+/** The functions implementing the configuration actions for the InStream components. */
+static FwPrAction_t outStreamConfigAction[CR_FW_NOF_OUTSTREAM] = CR_FW_OUTSTREAM_CONFIGACTION;
+
+/** The functions implementing the shutdown actions for the InStream components. */
+static FwSmAction_t outStreamShutdownAction[CR_FW_NOF_OUTSTREAM] = CR_FW_OUTSTREAM_SHUTDOWNACTION;
+
+/** The descriptors of the OutStream State Machines. */
+static FwSmDesc_t outStreamDesc[CR_FW_NOF_OUTSTREAM];
+
+/** The base data structures for the OutStream State Machines and their Procedures. */
+static CrFwCmpData_t outStreamData[CR_FW_NOF_OUTSTREAM];
+
+/** The component-specific data for the OutStream State Machines and their Procedures. */
+static CrFwOutStreamData_t outStreamCmpSpecificData[CR_FW_NOF_OUTSTREAM];
+
+/**
+ * Function which enqueues a packet on the packet queue.
+ * The packet to be enqueued is taken from the data associated to OutStream State
+ * Machine.
+ * This function is used as the transition action for the self-transition on the
+ * BUFFERING state and as a transition action on the transition out of the
+ * READY state.
+ * If the packet cannot be enqueued because the packet queue is full, an error
+ * is generated and the packet is released.
+ * @param smDesc the state machine descriptor
+ */
+static void EnqueuePckt(FwSmDesc_t smDesc);
+
+/**
+ * Function which flushes the packet queue.
+ * This function is used as the transition action on the transition out of state
+ * BUFFERING.
+ * @param smDesc the state machine descriptor
+ */
+static void FlushPcktQueue(FwSmDesc_t smDesc);
+
+/**
+ * Function which resets to 1 the sequence counter of an out-going packet.
+ * This function is used as transition action on the transition out of the initial
+ * state.
+ * @param smDesc the state machine descriptor
+ */
+static void ResetSeqCounter(FwSmDesc_t smDesc);
+
+/**
+ * Function which first attempts to hand over a packet to the middleware and,
+ * if this fails, it pushes it on the packet queue.
+ * This function is used as the transition action out of state READY.
+ * @param smDesc the state machine descriptor
+ */
+static void SendOrEnqueue(FwSmDesc_t smDesc);
+
+/**
+ * Function which checks if the packet queue is empty.
+ * This function is used as guard for the transition into state READY.
+ * @param smDesc the state machine descriptor
+ * @return 1 if the packet queue is empty; zero otherwise.
+ */
+static int IsPacketQueueEmpty(FwSmDesc_t smDesc);
+
+/*-----------------------------------------------------------------------------------------*/
+FwSmDesc_t CrFwOutStreamMake(CrFwInstanceId_t i) {
+	const FwSmCounterS1_t nOfStates = 2;	/* Number of states */
+	const FwSmCounterS1_t nOfChoicePseudoStates = 1;	/* Number of choice pseudo-states */
+	const FwSmCounterS1_t nOfTrans = 6;		/* Number of transitions */
+	const FwSmCounterS1_t nOfActions = 4;	/* Number of actions */
+	const FwSmCounterS1_t nOfGuards = 1;	/* Number of guards */
+	const FwSmCounterS1_t CPS_1 = 1;		/* Identifier of first choice pseudo-state */
+	FwSmDesc_t esm;
+	FwPrDesc_t resetPr, execPr, initPr;
+
+	if (i >= CR_FW_NOF_OUTSTREAM) {
+		CrFwSetAppErrCode(crOutStreamIllId);
+		return NULL;
+	}
+
+	/* If not yet done, create the base OutStream SM */
+	if (baseOutStreamSmDesc == NULL) {
+		/* Extend the Base Component */
+		baseOutStreamSmDesc = FwSmCreateDer(CrFwBaseCmpMake());
+		/* Create the OutStream SM and then embed it in state CONFIGURED of the Base Component */
+		esm = FwSmCreate(nOfStates, nOfChoicePseudoStates, nOfTrans, nOfActions, nOfGuards);
+		FwSmAddState(esm, CR_FW_OUTSTREAM_STATE_READY, 1, NULL, NULL, NULL, NULL);
+		FwSmAddState(esm, CR_FW_OUTSTREAM_STATE_BUFFERING, 2, NULL, NULL, NULL, NULL);
+		FwSmAddChoicePseudoState(esm, CPS_1, 2);
+		FwSmAddTransIpsToSta(esm, CR_FW_OUTSTREAM_STATE_READY, &ResetSeqCounter);
+		FwSmAddTransStaToCps(esm, CR_FW_OUTSTREAM_TR_SEND, CR_FW_OUTSTREAM_STATE_READY, CPS_1,
+		                     &SendOrEnqueue, NULL);
+		FwSmAddTransCpsToSta(esm, CPS_1, CR_FW_OUTSTREAM_STATE_READY, NULL, &IsPacketQueueEmpty);
+		FwSmAddTransCpsToSta(esm, CPS_1, CR_FW_OUTSTREAM_STATE_BUFFERING, NULL, NULL);	/* Else Transition */
+		FwSmAddTransStaToCps(esm, CR_FW_OUTSTREAM_TR_CONNECTION_AVAILABLE, CR_FW_OUTSTREAM_STATE_BUFFERING,
+		                     CPS_1, &FlushPcktQueue, NULL);
+		FwSmAddTransStaToSta(esm, CR_FW_OUTSTREAM_TR_SEND, CR_FW_OUTSTREAM_STATE_BUFFERING,
+		                     CR_FW_OUTSTREAM_STATE_BUFFERING, &EnqueuePckt, NULL);
+		FwSmEmbed(baseOutStreamSmDesc, CR_FW_BASE_STATE_CONFIGURED, esm);
+	}
+
+	if (outStreamDesc[i] != NULL) {
+		return outStreamDesc[i];	/* The requested SM has already been created */
+	}
+
+	/* Create the requested SM as an extension of the base OutStream SM */
+	outStreamDesc[i] = FwSmCreateDer(baseOutStreamSmDesc);
+
+	/* Create the Reset Procedure for the OutStream Component */
+	resetPr = FwPrCreateDer(CrFwCmpGetResetProc());
+	FwPrOverrideAction(resetPr, &CrFwBaseCmpDefConfigCheck, outStreamConfigCheck[i]);
+	FwPrOverrideAction(resetPr, &CrFwBaseCmpDefConfigAction, outStreamConfigAction[i]);
+
+	/* Create the Initialization Procedure for the OutStream Component */
+	initPr = FwPrCreateDer(CrFwCmpGetInitProc());
+	FwPrOverrideAction(initPr, &CrFwBaseCmpDefInitCheck, outStreamInitCheck[i]);
+	FwPrOverrideAction(initPr, &CrFwBaseCmpDefInitAction, outStreamInitAction[i]);
+
+	/* Override the Shutdown Action for the OutStream Component */
+	FwSmOverrideAction(outStreamDesc[i], &CrFwBaseCmpDefShutdownAction, outStreamShutdownAction[i]);
+
+	/* Get the Dummy Execution Procedure for the OutStream Component */
+	execPr = CrFwBaseCmpGetDummyExecProc();
+
+	/* Initialize the data for the requested SM */
+	outStreamData[i].outcome = 1;
+	outStreamData[i].initProc = initPr;
+	outStreamData[i].resetProc = resetPr;
+	outStreamData[i].execProc = execPr;
+	outStreamData[i].instanceId = i;
+	outStreamData[i].typeId = CR_FW_OUTSTREAM_TYPE;
+	outStreamCmpSpecificData[i].dest = outStreamDest[i];
+	outStreamCmpSpecificData[i].handoverPckt = outStreamHandoverPckt[i];
+	outStreamData[i].cmpSpecificData = &outStreamCmpSpecificData[i];
+
+	/* Attach the data to the OutStream state machine and to its procedures.
+	 * The data is attached to the outer SM and to the SM embedded in state CONFIGURED
+	 * and to the Initialization and Reset Procedures. */
+	FwSmSetData(outStreamDesc[i], &outStreamData[i]);
+	FwSmSetData(FwSmGetEmbSm(outStreamDesc[i], CR_FW_BASE_STATE_CONFIGURED), &outStreamData[i]);
+	FwPrSetData(outStreamData[i].initProc, &outStreamData[i]);
+	FwPrSetData(outStreamData[i].resetProc, &outStreamData[i]);
+
+	/* Start the OutStream */
+	FwSmStart(outStreamDesc[i]);
+
+	return outStreamDesc[i];
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwBool_t CrFwOutStreamIsInReady(FwSmDesc_t smDesc) {
+	return (FwSmGetCurStateEmb(smDesc) == CR_FW_OUTSTREAM_STATE_READY);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwBool_t CrFwOutStreamIsInBuffering(FwSmDesc_t smDesc) {
+	return (FwSmGetCurStateEmb(smDesc) == CR_FW_OUTSTREAM_STATE_BUFFERING);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+FwSmDesc_t CrFwOutStreamGet(CrFwDestSrc_t dest) {
+	CrFwInstanceId_t i;
+	for (i=0; i<CR_FW_NOF_OUTSTREAM; i++)
+		if (outStreamCmpSpecificData[i].dest == dest)
+			return outStreamDesc[i];
+
+	CrFwSetAppErrCode(crOutStreamUndefDest);
+	return NULL;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwOutStreamSend(FwSmDesc_t smDesc, CrFwPckt_t pckt) {
+	CrFwCmpData_t* outStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutStreamData_t* cmpSpecificData = (CrFwOutStreamData_t*)outStreamBaseData->cmpSpecificData;
+	cmpSpecificData->pckt = pckt;
+	FwSmMakeTrans(smDesc, CR_FW_OUTSTREAM_TR_SEND);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwOutStreamConnectionAvail(FwSmDesc_t smDesc) {
+	FwSmMakeTrans(smDesc, CR_FW_OUTSTREAM_TR_CONNECTION_AVAILABLE);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwDestSrc_t CrFwOutStreamGetDest(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* outStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutStreamData_t* cmpSpecificData = (CrFwOutStreamData_t*)outStreamBaseData->cmpSpecificData;
+	return cmpSpecificData->dest;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwSeqCnt_t CrFwOutStreamGetSeqCnt(FwSmDesc_t smDesc, CrFwGroup_t group) {
+	CrFwCmpData_t* outStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutStreamData_t* cmpSpecificData = (CrFwOutStreamData_t*)outStreamBaseData->cmpSpecificData;
+	return cmpSpecificData->seqCnt[group];
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwOutStreamSetSeqCnt(FwSmDesc_t smDesc, CrFwGroup_t group, CrFwSeqCnt_t seqCnt)
+{
+	CrFwCmpData_t* outStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutStreamData_t* cmpSpecificData = (CrFwOutStreamData_t*)outStreamBaseData->cmpSpecificData;
+	cmpSpecificData->seqCnt[group] = seqCnt;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwCounterU1_t CrFwOutStreamGetNOfPendingPckts(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* outStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutStreamData_t* cmpSpecificData = (CrFwOutStreamData_t*)outStreamBaseData->cmpSpecificData;
+	return CrFwPcktQueueGetNOfPckts(&(cmpSpecificData->pcktQueue));
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwGroup_t CrFwOutStreamGetNOfGroups(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* outStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	return outStreamNOfGroups[outStreamBaseData->instanceId];
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwCounterU1_t CrFwOutStreamGetPcktQueueSize(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* outStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutStreamData_t* cmpSpecificData = (CrFwOutStreamData_t*)outStreamBaseData->cmpSpecificData;
+	return CrFwPcktQueueGetSize(&(cmpSpecificData->pcktQueue));
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwOutStreamDefConfigAction(FwPrDesc_t prDesc) {
+	CrFwCmpData_t* outStreamBaseData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+	CrFwOutStreamData_t* cmpSpecificData = (CrFwOutStreamData_t*)outStreamBaseData->cmpSpecificData;
+
+	CrFwPcktQueueReset(&(cmpSpecificData->pcktQueue));
+	cmpSpecificData->dest = outStreamDest[outStreamBaseData->instanceId];
+	cmpSpecificData->handoverPckt = outStreamHandoverPckt[outStreamBaseData->instanceId];
+	outStreamBaseData->outcome = 1;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwOutStreamDefShutdownAction(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* outStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutStreamData_t* cmpSpecificData = (CrFwOutStreamData_t*)outStreamBaseData->cmpSpecificData;
+	CrFwPcktQueueShutdown(&(cmpSpecificData->pcktQueue));
+	free(cmpSpecificData->seqCnt);
+	cmpSpecificData->seqCnt = NULL;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwOutStreamDefInitAction(FwPrDesc_t prDesc) {
+	CrFwCmpData_t* outStreamBaseData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+	CrFwInstanceId_t i = outStreamBaseData->instanceId;
+	CrFwOutStreamData_t* cmpSpecificData = (CrFwOutStreamData_t*)outStreamBaseData->cmpSpecificData;
+
+	cmpSpecificData->seqCnt = malloc(sizeof(CrFwSeqCnt_t)*outStreamNOfGroups[i]);
+	CrFwPcktQueueInit(&(outStreamCmpSpecificData[i].pcktQueue),outStreamPcktQueueSize[i]);
+	outStreamBaseData->outcome = 1;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void EnqueuePckt(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* outStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutStreamData_t* cmpSpecificData = (CrFwOutStreamData_t*)outStreamBaseData->cmpSpecificData;
+	CrFwPckt_t pckt = cmpSpecificData->pckt;
+	CrFwPckt_t pcktCopy;
+	CrFwPcktQueue_t pcktQueue = &(cmpSpecificData->pcktQueue);
+	CrFwPcktLength_t len = CrFwPcktGetLength(pckt);
+
+	pcktCopy = CrFwPcktMake(CrFwPcktGetLength(pckt));
+	if (pcktCopy == NULL) {
+		CrFwRepErr(crOutStreamNoMorePckt, outStreamBaseData->typeId, outStreamBaseData->instanceId);
+		return;
+	}
+	memcpy(pcktCopy,pckt,len);
+	if (!CrFwPcktQueuePush(pcktQueue, pcktCopy)) {
+		CrFwRepErr(crOutStreamPQFull, outStreamBaseData->typeId, outStreamBaseData->instanceId);
+		CrFwPcktRelease(pcktCopy);
+	}
+
+	return;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void FlushPcktQueue(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* outStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutStreamData_t* cmpSpecificData = (CrFwOutStreamData_t*)outStreamBaseData->cmpSpecificData;
+	CrFwPckt_t oldestPckt;
+	CrFwPcktQueue_t pcktQueue = &(cmpSpecificData->pcktQueue);
+	CrFwGroup_t oldestPcktGroup = 0;
+
+	while (CrFwPcktQueueIsEmpty(pcktQueue)==0) {
+		oldestPckt = CrFwPcktQueueGetOldest(pcktQueue);
+		if (CrFwPcktGetSrc(oldestPckt) == CR_FW_HOST_APP_ID) { /* pckt originates from host application */
+			oldestPcktGroup = CrFwPcktGetGroup(oldestPckt);
+			if (oldestPcktGroup < outStreamNOfGroups[outStreamBaseData->instanceId])
+				CrFwPcktSetSeqCnt(oldestPckt, cmpSpecificData->seqCnt[oldestPcktGroup]);
+			else	/* pckt belongs to a non-existent group */
+				CrFwRepErrGroup(crOutStreamIllGroup, outStreamBaseData->typeId,
+				                outStreamBaseData->instanceId, oldestPcktGroup);
+		}
+		if (cmpSpecificData->handoverPckt(oldestPckt) != 1)
+			return;
+		if (CrFwPcktGetSrc(oldestPckt) == CR_FW_HOST_APP_ID)
+			if (oldestPcktGroup < outStreamNOfGroups[outStreamBaseData->instanceId])
+				cmpSpecificData->seqCnt[oldestPcktGroup]++;
+		CrFwPcktQueuePop(pcktQueue);	/* remove packet from PQ */
+		CrFwPcktRelease(oldestPckt);
+	}
+	return;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void ResetSeqCounter(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* outStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutStreamData_t* cmpSpecificData = (CrFwOutStreamData_t*)outStreamBaseData->cmpSpecificData;
+	CrFwGroup_t i;
+	for (i=0; i<outStreamNOfGroups[outStreamBaseData->instanceId]; i++)
+		cmpSpecificData->seqCnt[i] = 1;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static void SendOrEnqueue(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* outStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutStreamData_t* cmpSpecificData = (CrFwOutStreamData_t*)outStreamBaseData->cmpSpecificData;
+	CrFwPckt_t pckt = cmpSpecificData->pckt;
+	CrFwPckt_t pcktCopy;
+	CrFwPcktLength_t len;
+	CrFwPcktQueue_t pcktQueue;
+	CrFwGroup_t pcktGroup = 0; /* added by UVIE */
+
+	if (CrFwPcktGetSrc(pckt) == CR_FW_HOST_APP_ID) { /* pckt originates from host application */
+		pcktGroup = CrFwPcktGetGroup(pckt);
+		if (pcktGroup < outStreamNOfGroups[outStreamBaseData->instanceId])
+			CrFwPcktSetSeqCnt(pckt, cmpSpecificData->seqCnt[pcktGroup]);
+		else	/* pckt belongs to a non-existent group */
+			CrFwRepErrGroup(crOutStreamIllGroup, outStreamBaseData->typeId,
+			                outStreamBaseData->instanceId, pcktGroup);
+	}
+	if (cmpSpecificData->handoverPckt(pckt) != 1) {
+		pcktQueue = &(cmpSpecificData->pcktQueue);
+		len = CrFwPcktGetLength(pckt);
+		pcktCopy = CrFwPcktMake(len);
+		if (pcktCopy == NULL) {
+			CrFwRepErr(crOutStreamNoMorePckt, outStreamBaseData->typeId, outStreamBaseData->instanceId);
+			return;
+		}
+		memcpy(pcktCopy,pckt,len);
+		CrFwPcktQueuePush(pcktQueue,pcktCopy);	/* Enqueue packet, queue is empty at entry in READY */
+	} else {
+		if (CrFwPcktGetSrc(pckt) == CR_FW_HOST_APP_ID)
+			if (pcktGroup < outStreamNOfGroups[outStreamBaseData->instanceId])
+				cmpSpecificData->seqCnt[pcktGroup]++;
+	}
+}
+
+/*-----------------------------------------------------------------------------------------*/
+static int IsPacketQueueEmpty(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* outStreamBaseData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	CrFwOutStreamData_t* cmpSpecificData = (CrFwOutStreamData_t*)outStreamBaseData->cmpSpecificData;
+	return CrFwPcktQueueIsEmpty(&(cmpSpecificData->pcktQueue));
+}
+
diff --git a/CrFramework/src/OutStream/CrFwOutStream.h b/CrFramework/src/OutStream/CrFwOutStream.h
new file mode 100644
index 0000000..1a3068a
--- /dev/null
+++ b/CrFramework/src/OutStream/CrFwOutStream.h
@@ -0,0 +1,261 @@
+/**
+ * @file
+ * @ingroup outMngGroup
+ * Definition of the OutStream component.
+ *
+ * An application will normally instantiate one OutStream Component for
+ * each report or command destination.
+ * An OutStream is implemented by the OutStream State Machine (see figures below)
+ * embedded within state CONFIGURED of a Base State Machine.
+ *
+ * This header file defines a function to create and access the OutStream attached to a
+ * certain command or report destination.
+ * This header file therefore also defines the interface to the OutStreamRegistry
+ * component of the CORDET Framework.
+ *
+ * An application can instantiate several OutStream Components.
+ * Each OutStream instance has an identifier which uniquely identifies it
+ * within the set of OutStream Components.
+ * This identifier is an integer in the range 0 to: <code>#CR_FW_NOF_OUTSTREAM</code>-1.
+ *
+ * <b>Mode of Use of an OutStream Component</b>
+ *
+ * The configuration of the OutStream components is defined statically in
+ * <code>CrFwOutStreamUserPar.h</code>.
+ *
+ * An OutStream component is created with function <code>::CrFwOutStreamMake</code>.
+ * After being created, the OutStream must be initialized and reset.
+ * This is done with functions <code>::CrFwCmpInit</code> and <code>::CrFwCmpReset</code>.
+ * Nominally, after being initialized and reset the OutStream State Machine should be
+ * in state CONFIGURED (this can be checked by verifying that function <code>FwSmGetCurState</code>
+ * returns CR_FW_BASE_STATE_CONFIGURED).
+ *
+ * After it has been configured, an OutStream can process two transition commands:
+ * - A Send command to send a packet (representing either a command or a report)
+ *   to the middleware connection attached to the OutStream.
+ *   This command is sent through function <code>::CrFwOutStreamSend</code>.
+ * - A ConnectionAvailable command to signal the ability of the middleware to send
+ *   a new packet to its destination. This command is sent with the
+ *   the <code>::CrFwOutStreamConnectionAvail</code> function.
+ * .
+ * If at the time the Send command is received, the middleware is not ready to receive
+ * the packet, the packet is stored in Packet Queue.
+ * The next attempt to send it out will be made when command ConnectionAvailable is sent.
+ *
+ * @image html OutStream.png
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_OUT_STREAM_H_
+#define CRFW_OUT_STREAM_H_
+
+/* Include FW Profile Files */
+#include "FwSmConstants.h"
+#include "FwPrConstants.h"
+/* Include Configuration Files */
+#include "Pckt/CrFwPcktQueue.h"
+#include "CrFwUserConstants.h"
+/* Include Framework Files */
+#include "CrFwConstants.h"
+
+/**
+ * Factory function to retrieve the i-th OutStream State Machine instance.
+ * The first time this function is called with a certain value of the argument i, it
+ * creates the i-th OutStream State Machine instance.
+ * Subsequent calls returns the same instance.
+ *
+ * The OutStream identifier i must be in the range: [0, <code>#CR_FW_NOF_OUTSTREAM</code>-1].
+ * If the identifier is out of range, the function returns NULL and sets the application
+ * error code to: <code>::crOutStreamIllId</code>.
+ *
+ * The first time this function is called with a certain value of i, it returns an
+ * OutStream State Machine which has been started but which still needs to be initialized and
+ * configured.
+ * @param outStreamId the identifier of the Base State Machine of the OutStream
+ * @return the descriptor of the OutStream State Machine or NULL
+ * if the state machine could not be created or if the identifier i is out of range.
+ */
+FwSmDesc_t CrFwOutStreamMake(CrFwInstanceId_t outStreamId);
+
+/**
+ * Return true if the argument OutStream is in state READY.
+ * @param smDesc the descriptor of the Base State Machine of the OutStream
+ * @return 1 if the argument InCommand is in state CONFIGURED, sub-state
+ * READY; 0 otherwise
+ */
+CrFwBool_t CrFwOutStreamIsInReady(FwSmDesc_t smDesc);
+
+/**
+ * Return true if the argument OutStream is in state BUFFERING.
+ * @param smDesc the descriptor of the Base State Machine of the OutStream
+ * @return 1 if the argument InCommand is in state CONFIGURED, sub-state
+ * BUFFERING; 0 otherwise
+ */
+CrFwBool_t CrFwOutStreamIsInBuffering(FwSmDesc_t smDesc);
+
+/**
+ * Getter function for the OutStream corresponding to the argument destination.
+ * Nominally, each OutStream is associated to a certain destination.
+ * The binding between an OutStream and its destination is done statically in the
+ * configuration file <code>CrFwOutStreamUserPar.h</code>.
+ *
+ * If the value of the destination argument is illegal (i.e. if no
+ * OutStream has been bound to it), this function returns NULL and sets the
+ * application error code to: <code>::crOutStreamUndefDest</code>.
+ *
+ * This function should only be called after all OutStreams have been built through
+ * calls to function <code>::CrFwOutStreamMake</code>.
+ * If this pre-condition is not satisfied, execution of this function could result
+ * in an access to a NULL pointer.
+ * @param dest the destination associated to the OutStream
+ * @return the descriptor of the OutStream State Machine or NULL
+ * if the argument destination was illegal or no OutStream had been bound to it.
+ */
+FwSmDesc_t CrFwOutStreamGet(CrFwDestSrc_t dest);
+
+/**
+ * Send a packet to the OutStream.
+ * This function hands over the argument packet to the OutStream and then it sends
+ * command "Send" to its state machine.
+ * This causes the OutStream to try to send the packet to the destination associated
+ * to the OutStream.
+ * If the middleware is not ready to accept the packet, then a copy of the packet
+ * is made and is stored in the OutStream's Packet Queue from where it will be sent to
+ * the middleware at a later time.
+ * If the packet copy cannot be done because no more free packets
+ * are available, error <code>::crOutStreamNoMorePckt</code> is generated.
+ * If the Packet Queue is full, the packet is released and error
+ * <code>::crOutStreamPQFull</code> is generated.
+ *
+ * If packet cannot be sent to the middleware  (or to make a copy of the packet and buffer the copy internally
+ * if the middleware is currently not available).
+ *
+ * The argument <code>pckt</code> is a pointer to the out-going packet.
+ * This pointer is "owned" by the caller of function <code>CrFwOutStreamSend</code>
+ * who remains responsible for releasing it when it is no longer needed.
+ * The function only uses the pointer during its execution.
+ * @param smDesc the descriptor of the OutStream State Machine.
+ * @param pckt the packet to be sent by the OutStream
+ */
+void CrFwOutStreamSend(FwSmDesc_t smDesc, CrFwPckt_t pckt);
+
+/**
+ * Signal that the out-going middleware connection has become available.
+ * This function sends the ConnectionAvailable command to the OutStream State Machine.
+ * @param smDesc the descriptor of the OutStream State Machine.
+ */
+void CrFwOutStreamConnectionAvail(FwSmDesc_t smDesc);
+
+/**
+ * Default configuration action for an OutStream.
+ * This function resets the packet queue of the OutStream.
+ *
+ * Configuration actions have an outcome (see <code>CrFwResetProc.h</code>).
+ * The outcome of this configuration action is always "success".
+ *
+ * This function should never be directly called by the end-application.
+ * It is declared as a public function so that it may be used in application-specific
+ * Configuration Actions.
+ * @param prDesc the descriptor of the Reset Procedure of the OutStream
+ */
+void CrFwOutStreamDefConfigAction(FwPrDesc_t prDesc);
+
+/**
+ * Default initialization action for an OutStream.
+ * This function: (a) allocates the memory for the packet queue of the OutStream;
+ * (b) allocates the memory for the array holding the sequence counters for the
+ * groups attached to the OutStream; and
+ * (c) initializes all data structures implementing the OutStream.
+ * Initialization actions have an outcome (see <code>CrFwResetProc.h</code>).
+ * The situation of where the memory allocation fails is not handled and
+ * therefore the outcome of this configuration action is always "success".
+ *
+ * This function should never be directly called by the end-application.
+ * It is declared as a public function so that it may be used in application-specific
+ * Initialization Actions.
+ * @param prDesc the descriptor of the Initialization Procedure of the OutStream
+ */
+void CrFwOutStreamDefInitAction(FwPrDesc_t prDesc);
+
+/**
+ * Default shutdown action for an OutStream.
+ * This function releases the memory allocated to the packet queue of the OutStream
+ * and releases the memory allocated to the array holding the sequence counters.
+ *
+ * This function should never be directly called by the end-application.
+ * It is declared as a public function so that it may be used in application-specific
+ * Shutdown Actions.
+ * @param smDesc the descriptor of the OutStream State Machine
+ */
+void CrFwOutStreamDefShutdownAction(FwSmDesc_t smDesc);
+
+/**
+ * Get the destination for an OutStream.
+ * @param smDesc the descriptor of the OutStream State Machine.
+ * @return dest the destination associated to the OutStream
+ */
+CrFwDestSrc_t CrFwOutStreamGetDest(FwSmDesc_t smDesc);
+
+/**
+ * Return the value of the sequence counter for one of the groups
+ * maintained by an OutStream.
+ * The group identifier is passed as an argument to the function call.
+ * No check is performed on the validity of the group identifier.
+ * @param smDesc the descriptor of the OutStream State Machine.
+ * @param group the identifier of the group
+ * @return the OutStream sequence counter
+ */
+CrFwSeqCnt_t CrFwOutStreamGetSeqCnt(FwSmDesc_t smDesc, CrFwGroup_t group);
+
+/**
+ * Sets the value of the sequence counter for one of the groups
+ * maintained by an OutStream.
+ * The group identifier is passed as an argument to the function call.
+ * No check is performed on the validity of the group identifier.
+ * @param smDesc the descriptor of the OutStream State Machine.
+ * @param group the identifier of the group
+ * @param seqCnt the OutStream sequence counter
+ */
+void CrFwOutStreamSetSeqCnt(FwSmDesc_t smDesc, CrFwGroup_t group, CrFwSeqCnt_t seqCnt);
+
+/**
+ * Return the number of packets currently in the packet queue of an OutStream.
+ * @param smDesc the descriptor of the OutStream State Machine.
+ * @return the number of packets currently in the packet queue of the OutStream.
+ */
+CrFwCounterU1_t CrFwOutStreamGetNOfPendingPckts(FwSmDesc_t smDesc);
+
+/**
+ * Return the number of groups associated to the OutStream.
+ * @param smDesc the descriptor of the OutStream State Machine.
+ * @return the number of groups associated to the OutStream.
+ */
+CrFwGroup_t CrFwOutStreamGetNOfGroups(FwSmDesc_t smDesc);
+
+/**
+ * Return the size of the packet queue of the OutStream.
+ * @param smDesc the descriptor of the OutStream State Machine.
+ * @return the size of the packet queue of the OutStream.
+ */
+CrFwCounterU1_t CrFwOutStreamGetPcktQueueSize(FwSmDesc_t smDesc);
+
+#endif /* CRFW_OUT_STREAM_H_ */
diff --git a/CrFramework/src/Pckt/CrFwPckt.h b/CrFramework/src/Pckt/CrFwPckt.h
new file mode 100644
index 0000000..04eacc5
--- /dev/null
+++ b/CrFramework/src/Pckt/CrFwPckt.h
@@ -0,0 +1,368 @@
+/**
+ * @file
+ * @ingroup crOpenIfGroup
+ * Interface for creating and accessing a report or command packet.
+ * An application instantiated from the CORDET Framework interacts with other
+ * framework applications by exchanging with them commands and reports.
+ * When commands and reports travel from one application to another, they
+ * take the form of packets.
+ *
+ * A packet is an ordered sequence of bytes which contain all the information
+ * required to reconstruct a report or a command.
+ * Although the exact layout of packets is not defined at framework level,
+ * the framework defines, through this header file, an interface for creating and
+ * accessing the data in a packet.
+ *
+ * This interface defines a packet factory, namely a function which allows
+ * a new packet to be created and an existing packet to be released.
+ *
+ * A packet encapsulates either a command or a report.
+ * This interface defines functions through which the attributes of the encapsulated
+ * command or report can be retrieved from a packet or can be set in a packet.
+ * For attributes other than the command or report parameters, getter and setter
+ * functions are defined.
+ * For the command or report parameters, getter functions are provided which return:
+ * the start address of the parameter area of the packet and its size.
+ * The parameter area is the part of a packet which is reserved to the storage
+ * of the parameters of the command or report encapsulated by the packet.
+ *
+ * In general, the implementation of this interface is entirely application-specific
+ * but a simple default implementation is provided in <code>CrFwPckt.c</code>.
+ * This default implementation is primarily intended for testing and demonstration
+ * purposes.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+ 
+#ifndef CRFW_PACKET_H_
+#define CRFW_PACKET_H_
+
+/* Include Framework Files */
+#include "CrFwConstants.h"
+/* Include Configuration Files */
+#include "CrFwUserConstants.h"
+
+/**
+ * Make function for command or report packets.
+ * This function returns an unconfigured packet of the specified length.
+ * An unconfigured packet of length L consists of a sequence of L bytes.
+ * The function allocates the memory for the packet and returns a pointer to the
+ * allocated memory.
+ *
+ * The memory allocated to the packet remains reserved to the packet until the
+ * packet is released through a call to function <code>::CrFwPcktRelease</code>.
+ * The content of the packet returned by this function is undefined.
+ * The way the memory is allocated and released is implementation-specific.
+ *
+ * If the allocation of the memory for the new packet failed, the function returns
+ * NULL.
+ * Depending on the implementation, allocation memory failure may result in
+ * the application error code being set to <code>crPcktAllocationFail</code>.
+ *
+ * The packet length must be a positive integer.
+ * If a negative or a zero value is used, the function returns NULL.
+ * Depending on the implementation, this may also result in
+ * the application error code being set to <code>crPcktAllocationFail</code>.
+ * @param pcktLength the length of the packet in bytes (a positive integer)
+ * @return a new packet or NULL if it was not possible to allocate the memory
+ * for the packet or if the packet length was not a positive integer
+ */
+CrFwPckt_t CrFwPcktMake(CrFwPcktLength_t pcktLength);
+
+/**
+ * Release function for command or report packets.
+ * The argument of this function must be a packet which was created using function
+ * <code>CrFwPcktMake</code>.
+ * This function releases the memory which was allocated to the argument packet.
+ * After this function is called, the argument packet cannot be used.
+ * The function does not perform any checks on the existence or status of the
+ * argument packet.
+ * An attempt to use a packet which had already been released will
+ * result in undefined behaviour.
+ *
+ * An attempt to release a packet which had already been released, or to release a
+ * non-existent packet will result in undefined behaviour.
+ * Depending on the implementation, such attempts may result in the application
+ * error code being set to: <code>::crPcktRelErr</code>.
+ * @param pckt the packet to be released
+ */
+void CrFwPcktRelease(CrFwPckt_t pckt);
+
+/**
+ * Check whether a packet of a specified length is available.
+ * A packet of length L is available if a call to function <code>::CrFwPcktMake</code>
+ * with argument L would return a non-NULL value.
+ * Applications typically implement the <code>CrFwPckt.h</code> interface to manage a pool of
+ * pre-allocated memory from which packets are allocated using function
+ * <code>::CrFwPcktMake</code> and are released using function <code>::CrFwPcktRelease</code>.
+ * This function does not change the state of the pool from which the packets
+ * are allocated. It only verifies whether the allocation of a packet of a given
+ * length would be possible at the time the function is called.
+ *
+ * The packet length must be a positive integer.
+ * If a negative or a zero value is used, the function returns false.
+ * @param pcktLength the length of the packet in bytes (a positive integer)
+ * @return true if a packet of the specified length is available, false otherwise
+ * of if the length is not a positive integer
+ */
+CrFwBool_t CrFwPcktIsAvail(CrFwPcktLength_t pcktLength);
+
+/**
+ * Return the number of packets which are currently allocated.
+ * This function returns the number of packets which have been successfully
+ * allocated through calls to <code>::CrFwPcktMake</code> and have not yet been
+ * released through calls to <code>::CrFwPcktRelease</code>.
+ * @return the number of packets which are currently allocated.
+ */
+CrFwCounterU2_t CrFwPcktGetNOfAllocated();
+
+/**
+ * Return the maximum length of a packet in number of bytes.
+ * Some implementation may restrict the maximum length of a packet.
+ * This function allows this maximum length to be retrieved.
+ * If the function returns a value of zero, then no restriction on the length of
+ * a packet is defined by the implementation.
+ * @return the maximum length of a packet in number of bytes or zero if no restriction
+ * on the packet length exists.
+ */
+CrFwPcktLength_t CrFwPcktGetMaxLength();
+
+/**
+ * Return the type of a packet (either a command packet or a report packet).
+ * @param pckt the packet
+ * @return the type of the entity (a command or a report) encapsulated by the packet.
+ */
+CrFwCmdRepType_t CrFwPcktGetCmdRepType(CrFwPckt_t pckt);
+
+/**
+ * Set the type of a packet (either a command packet or a report packet).
+ * @param pckt the packet
+ * @param type the type of the entity (a command or a report) encapsulated by the packet.
+ */
+void CrFwPcktSetCmdRepType(CrFwPckt_t pckt, CrFwCmdRepType_t type);
+
+/**
+ * Return the length (in number of bytes) of a packet.
+ * @param pckt the packet.
+ * @return the length (in number of bytes) of the packet.
+ */
+CrFwPcktLength_t CrFwPcktGetLength(CrFwPckt_t pckt);
+
+/**
+ * Return the sequence counter of the command or report encapsulated in a packet.
+ * @param pckt the packet.
+ * @return the sequence counter.
+ */
+CrFwSeqCnt_t CrFwPcktGetSeqCnt(CrFwPckt_t pckt);
+
+/**
+ * Set the sequence counter of the command or report encapsulated in a packet.
+ * @param pckt the packet.
+ * @param seqCnt the sequence counter.
+ */
+void CrFwPcktSetSeqCnt(CrFwPckt_t pckt, CrFwSeqCnt_t seqCnt);
+
+/**
+ * Return the time stamp of the command or report encapsulated in a packet.
+ * @param pckt the packet.
+ * @return the time stamp.
+ */
+CrFwTimeStamp_t CrFwPcktGetTimeStamp(CrFwPckt_t pckt);
+
+/**
+ * Set the time stamp of the command or report encapsulated in a packet.
+ * @param pckt the packet.
+ * @param timeStamp the time stamp.
+ */
+void CrFwPcktSetTimeStamp(CrFwPckt_t pckt, CrFwTimeStamp_t timeStamp);
+
+/**
+ * Return the discriminant of the command or report encapsulated in a packet.
+ * @param pckt the packet.
+ * @return the discriminant.
+ */
+CrFwDiscriminant_t CrFwPcktGetDiscriminant(CrFwPckt_t pckt);
+
+/**
+ * Set the discriminant of the command or report encapsulated in a packet.
+ * @param pckt the packet.
+ * @param discriminant the discriminant.
+ */
+void CrFwPcktSetDiscriminant(CrFwPckt_t pckt, CrFwDiscriminant_t discriminant);
+
+/**
+ * Set the service type of the command or report encapsulated in a packet.
+ * @param pckt the packet.
+ * @param servType the service type.
+ */
+void CrFwPcktSetServType(CrFwPckt_t pckt, CrFwServType_t servType);
+
+/**
+ * Return the service type of the command or report encapsulated in a packet.
+ * @param pckt the packet.
+ * @return the service type.
+ */
+CrFwServType_t CrFwPcktGetServType(CrFwPckt_t pckt);
+
+/**
+ * Set the service sub-type of the command or report encapsulated in a packet.
+ * @param pckt the packet.
+ * @param servSubType the service sub-type.
+ */
+void CrFwPcktSetServSubType(CrFwPckt_t pckt, CrFwServSubType_t servSubType);
+
+/**
+ * Return the service sub-type of the command or report encapsulated in a packet.
+ * @param pckt the packet.
+ * @return the service sub-type.
+ */
+CrFwServSubType_t CrFwPcktGetServSubType(CrFwPckt_t pckt);
+
+/**
+ * Set the group of the command/report encapsulated in a packet.
+ * @param pckt the packet.
+ * @param group the destination or source group of the packet.
+ */
+void CrFwPcktSetGroup(CrFwPckt_t pckt, CrFwGroup_t group);
+
+/**
+ * Return the group of the command/report encapsulated in a packet.
+ * @param pckt the packet.
+ * @return the destination or source group of the packet.
+ */
+CrFwGroup_t CrFwPcktGetGroup(CrFwPckt_t pckt);
+
+/**
+ * Set the destination of the command or report encapsulated in a packet.
+ * @param pckt the packet.
+ * @param dest the destination of the packet.
+ */
+void CrFwPcktSetDest(CrFwPckt_t pckt, CrFwDestSrc_t dest);
+
+/**
+ * Return the destination of the command or report encapsulated in a packet.
+ * @param pckt the packet.
+ * @return the destination of the packet.
+ */
+CrFwDestSrc_t CrFwPcktGetDest(CrFwPckt_t pckt);
+
+/**
+ * Set the source of the command or report encapsulated in a packet.
+ * @param pckt the packet.
+ * @param src the source of the packet.
+ */
+void CrFwPcktSetSrc(CrFwPckt_t pckt, CrFwDestSrc_t src);
+
+/**
+ * Return the source of the command or report encapsulated in a packet.
+ * @param pckt the packet.
+ * @return the source of the packet.
+ */
+CrFwDestSrc_t CrFwPcktGetSrc(CrFwPckt_t pckt);
+
+/**
+ * Set the command or report identifier in the command or report encapsulated in a packet.
+ * @param pckt the packet.
+ * @param id the command or report identifier.
+ */
+void CrFwPcktSetCmdRepId(CrFwPckt_t pckt, CrFwInstanceId_t id);
+
+/**
+ * Return the command or report identifier of the command or report encapsulated in a packet.
+ * @param pckt the packet.
+ * @return the command or report identifier.
+ */
+CrFwInstanceId_t CrFwPcktGetCmdRepId(CrFwPckt_t pckt);
+
+/**
+ * Set the acknowledge level for the command encapsulated in a packet.
+ * If the packet on which this function is called does not encapsulate a command, nothing
+ * is done.
+ * @param pckt the packet.
+ * @param accept 1 if acknowledge of command acceptance is desired, 0 otherwise.
+ * @param start 1 if acknowledge of command start is desired, 0 otherwise.
+ * @param progress 1 if acknowledge of command progress is desired, 0 otherwise.
+ * @param term 1 if acknowledge of command acceptance termination is desired, 0 otherwise.
+ */
+void CrFwPcktSetAckLevel(CrFwPckt_t pckt, CrFwBool_t accept, CrFwBool_t start,
+                         CrFwBool_t progress, CrFwBool_t term);
+
+/**
+ * Return the acknowledge level for command acceptance for the command encapsulated in the
+ * packet.
+ * If the packet does not hold a command, the behaviour of the function is undefined.
+ * @param pckt a packet encapsulating a command.
+ * @return 1 if command acceptance is to be acknowledged, 0 otherwise.
+ */
+CrFwBool_t CrFwPcktIsAcceptAck(CrFwPckt_t pckt);
+
+/**
+ * Return the acknowledge level for command start for the command encapsulated in the
+ * packet.
+ * If the packet does not hold a command, the behaviour of the function is undefined.
+ * @param pckt a packet encapsulating a command.
+ * @return 1 if command start is to be acknowledged, 0 otherwise.
+ */
+CrFwBool_t CrFwPcktIsStartAck(CrFwPckt_t pckt);
+
+/**
+ * Return the acknowledge level for command progress for the command encapsulated in the
+ * packet.
+ * If the packet does not hold a command, the behaviour of the function is undefined.
+ * @param pckt a packet encapsulating a command.
+ * @return 1 if command progress is to be acknowledged, 0 otherwise.
+ */
+CrFwBool_t CrFwPcktIsProgressAck(CrFwPckt_t pckt);
+
+/**
+ * Return the acknowledge level for command termination for the command encapsulated in the
+ * packet.
+ * If the packet does not hold a command, the behaviour of the function is undefined.
+ * @param pckt a packet encapsulating a command.
+ * @return 1 if command termination is to be acknowledged, 0 otherwise.
+ */
+CrFwBool_t CrFwPcktIsTermAck(CrFwPckt_t pckt);
+
+/**
+ * Return the start address of the packet's parameter area.
+ * The parameter area is the part of a packet which is reserved to the storage
+ * of the parameters of the command or report encapsulated by the packet.
+ * The parameter area consists of an uninterrupted sequence of bytes.
+ * The size of the parameter area is returned by function <code>::CrFwPcktGetParLength</code>.
+ * @param pckt a packet encapsulating a command or a report.
+ * @return the start address of the packet's parameter area.
+ */
+char* CrFwPcktGetParStart(CrFwPckt_t pckt);
+
+/**
+ * Return the length in bytes of the packet's parameter area.
+ * The parameter area is the part of a packet which is reserved to the storage
+ * of the parameters of the command or report encapsulated by the packet.
+ * The parameter area consists of an uninterrupted sequence of bytes.
+ * The start address of the parameter area is returned by function <code>::CrFwPcktGetParStart</code>.
+ * @param pckt a packet encapsulating a command or a report.
+ * @return the length in bytes of the packet's parameter area.
+ */
+CrFwPcktLength_t CrFwPcktGetParLength(CrFwPckt_t pckt);
+
+
+#endif /* CRFW_PACKET_H_ */
diff --git a/CrFramework/src/Pckt/CrFwPcktQueue.c b/CrFramework/src/Pckt/CrFwPcktQueue.c
new file mode 100644
index 0000000..cede481
--- /dev/null
+++ b/CrFramework/src/Pckt/CrFwPcktQueue.c
@@ -0,0 +1,146 @@
+/**
+ * @file
+ * @ingroup pcktGroup
+ * Implementation of Packet Queue Management.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include <stdlib.h>
+#include "../CrFwConstants.h"
+#include "CrFwPckt.h"
+#include "CrFwPcktQueue.h"
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwPckt_t CrFwPcktQueuePop(CrFwPcktQueue_t pcktQueue) {
+	CrFwCounterU1_t posOldest;
+	CrFwPckt_t oldestPckt;
+
+	if (!pcktQueue->isEmpty) {
+		posOldest = pcktQueue->oldestItem;
+		oldestPckt = pcktQueue->pckt[posOldest];
+		if (posOldest < (pcktQueue->size-1))
+			pcktQueue->oldestItem++;
+		else
+			pcktQueue->oldestItem = 0;
+		if (pcktQueue->oldestItem == pcktQueue->nextFreeItem)
+			pcktQueue->isEmpty = 1;
+		return oldestPckt;
+	} else
+		return NULL;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwPckt_t CrFwPcktQueueGetOldest(CrFwPcktQueue_t pcktQueue) {
+	if (!pcktQueue->isEmpty)
+		return pcktQueue->pckt[pcktQueue->oldestItem];
+	else
+		return NULL;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwBool_t CrFwPcktQueuePush(CrFwPcktQueue_t pcktQueue, CrFwPckt_t pckt) {
+	if (pcktQueue->isEmpty == 1) {
+		pcktQueue->pckt[0] = pckt;
+		pcktQueue->nextFreeItem = 1;
+		pcktQueue->oldestItem =0;
+		pcktQueue->isEmpty = 0;
+		return 1;
+	}
+
+	if (pcktQueue->nextFreeItem == pcktQueue->oldestItem)
+		return 0;
+
+	pcktQueue->pckt[pcktQueue->nextFreeItem] = pckt;
+	if (pcktQueue->nextFreeItem < (pcktQueue->size-1))
+		pcktQueue->nextFreeItem++;
+	else
+		pcktQueue->nextFreeItem = 0;
+	return 1;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwPcktQueueReset(CrFwPcktQueue_t pcktQueue) {
+	CrFwCounterU1_t i;
+
+	if (pcktQueue->isEmpty == 1)
+		return;
+
+	if (pcktQueue->oldestItem < pcktQueue->nextFreeItem) {
+		for (i=pcktQueue->oldestItem; i<pcktQueue->nextFreeItem; i++)
+			CrFwPcktRelease(pcktQueue->pckt[i]);
+		pcktQueue->isEmpty = 1;
+		return;
+	}
+
+	for (i=pcktQueue->oldestItem; i<pcktQueue->size; i++)
+		CrFwPcktRelease(pcktQueue->pckt[i]);
+	for (i=0; i<pcktQueue->nextFreeItem; i++)
+		CrFwPcktRelease(pcktQueue->pckt[i]);
+	pcktQueue->isEmpty = 1;
+	return;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwPcktQueueInit(CrFwPcktQueue_t pcktQueue, CrFwCounterU1_t size) {
+	CrFwCounterU1_t i;
+
+	if (pcktQueue->pckt != NULL)
+		return;
+
+	pcktQueue->pckt = malloc(size*sizeof(CrFwPckt_t));
+	for (i=0; i<size; i++)
+		pcktQueue->pckt[i] = NULL;
+	pcktQueue->isEmpty = 1;
+	pcktQueue->nextFreeItem = 0;
+	pcktQueue->oldestItem = 0;
+	pcktQueue->size = size;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwPcktQueueShutdown(CrFwPcktQueue_t pcktQueue) {
+	CrFwPcktQueueReset(pcktQueue);
+	free(pcktQueue->pckt);
+	pcktQueue->pckt = NULL;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwBool_t CrFwPcktQueueIsEmpty(CrFwPcktQueue_t pcktQueue) {
+	return pcktQueue->isEmpty;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwCounterU1_t CrFwPcktQueueGetNOfPckts(CrFwPcktQueue_t pcktQueue) {
+
+	if (pcktQueue->isEmpty == 1)
+		return 0;
+
+	if (pcktQueue->oldestItem < pcktQueue->nextFreeItem)
+		return (CrFwCounterU1_t)(pcktQueue->nextFreeItem - pcktQueue->oldestItem);
+
+	return (CrFwCounterU1_t)(pcktQueue->size - (pcktQueue->oldestItem - pcktQueue->nextFreeItem));
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwCounterU1_t CrFwPcktQueueGetSize(CrFwPcktQueue_t pcktQueue) {
+	return pcktQueue->size;
+}
diff --git a/CrFramework/src/Pckt/CrFwPcktQueue.h b/CrFramework/src/Pckt/CrFwPcktQueue.h
new file mode 100644
index 0000000..1720d4e
--- /dev/null
+++ b/CrFramework/src/Pckt/CrFwPcktQueue.h
@@ -0,0 +1,136 @@
+/**
+ * @file
+ * @ingroup pcktGroup
+ * Definition and management of packet queues.
+ * An application instantiated from the CORDET Framework interacts with other
+ * framework applications by exchanging with them commands and reports.
+ * When commands and reports travel from one application to another, they
+ * take the form of packets.
+ *
+ * A packet is an ordered sequence of bytes which contain all the information
+ * required to reconstruct a report or a command.
+ * Although the exact layout of packets is not defined at framework level,
+ * the framework defines in <code>CrFwPckt.h</code> an interface for creating and
+ * accessing a packet.
+ *
+ * Components which send or receive packets need to manage packet queues.
+ * A packet queue is a data structure which holds a set of packets and manages
+ * them in FIFO order.
+ * This file defines a type for packet queues and defines the operations
+ * for managing a packet queue.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_PACKETQUEUE_H_
+#define CRFW_PACKETQUEUE_H_
+
+/* Include Framework Files */
+#include "CrFwConstants.h"
+/* Include Configuration Files */
+#include "CrFwUserConstants.h"
+
+/**
+ * Pop a packet from the packet queue.
+ * If the packet queue is not empty, this function returns the oldest packet
+ * in the queue.
+ * If the packet queue is empty, this function returns NULL.
+ * @param pcktQueue the packet queue.
+ * @return the oldest packet on the packet or NULL if the packet queue was empty.
+ */
+CrFwPckt_t CrFwPcktQueuePop(CrFwPcktQueue_t pcktQueue);
+
+/**
+ * Return the oldest packet from the queue without removing it from the queue.
+ * If the packet queue is not empty, this function returns the oldest packet
+ * in the queue but does not remove the packet from queue.
+ * If the packet queue is empty, this function returns NULL.
+ * @param pcktQueue the packet queue.
+ * @return the oldest packet on the packet or NULL if the packet queue was empty.
+ */
+CrFwPckt_t CrFwPcktQueueGetOldest(CrFwPcktQueue_t pcktQueue);
+
+/**
+ * Push a packet onto the packet queue.
+ * If the packet queue is not full, this function adds the packet to the packet
+ * queue and return 1.
+ * If the packet queue is full, this function does nothing and returns 0.
+ * @param pcktQueue the packet queue
+ * @param pckt the packet to be pushed onto the packet queue.
+ * @return 1 if the push operation was successful, or 0 if the push operation failed
+ * because the packet queue was full.
+ */
+CrFwBool_t CrFwPcktQueuePush(CrFwPcktQueue_t pcktQueue, CrFwPckt_t pckt);
+
+/**
+ * Initializes the packet queue.
+ * This function allocates the memory for the packet queue and then initializes
+ * it to represent an empty packet queue.
+ * The initialization of a packet queue can only be done once.
+ * If the packet queue has already been initialized, this function returns without
+ * doing anything.
+ * The situation where the memory allocation operation for the packet queue fails
+ * is not handled and will result in undefined behaviour (probably, a run-time exception).
+ * @param pcktQueue the packet queue.
+ * @param size the size of the packet queue
+ */
+void CrFwPcktQueueInit(CrFwPcktQueue_t pcktQueue, CrFwCounterU1_t size);
+
+/**
+ * Reset the packet queue.
+ * This function clears all entries in the packet queue and releases all packets
+ * which are in the packet queue.
+ * @param pcktQueue the packet queue.
+ */
+void CrFwPcktQueueReset(CrFwPcktQueue_t pcktQueue);
+
+/**
+ * Shutdown the packet queue.
+ * This function resets the packet queue (using function <code>::CrFwPcktQueueReset</code>)
+ * and then releases the memory which allocated for the packet queue through function
+ * <code>::CrFwPcktQueueInit</code>.
+ * @param pcktQueue the packet queue.
+ */
+void CrFwPcktQueueShutdown(CrFwPcktQueue_t pcktQueue);
+
+/**
+ * Return 1 if the packet queue is empty and 0 otherwise.
+ * @param pcktQueue the packet queue.
+ * @return 1 if the packet queue is empty and 0 otherwise.
+ */
+CrFwBool_t CrFwPcktQueueIsEmpty(CrFwPcktQueue_t pcktQueue);
+
+/**
+ * Return the number of packets currently in the packet queue.
+ * @param pcktQueue the packet queue
+ * @return the number of packets currently in the packet queue.
+ */
+CrFwCounterU1_t CrFwPcktQueueGetNOfPckts(CrFwPcktQueue_t pcktQueue);
+
+/**
+ * Return the size of the packet queue.
+ * @param pcktQueue the packet queue
+ * @return the packet queue size.
+ */
+CrFwCounterU1_t CrFwPcktQueueGetSize(CrFwPcktQueue_t pcktQueue);
+
+#endif /* CRFW_PACKETQUEUE_H_ */
diff --git a/CrFramework/src/UtilityFunctions/CrFwUtilityFunctions.c b/CrFramework/src/UtilityFunctions/CrFwUtilityFunctions.c
new file mode 100644
index 0000000..27486c0
--- /dev/null
+++ b/CrFramework/src/UtilityFunctions/CrFwUtilityFunctions.c
@@ -0,0 +1,148 @@
+/**
+ * @file
+ * Implementation of utility functions.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include <stdlib.h>
+/* Include framework files */
+#include "CrFwConstants.h"
+#include "BaseCmp/CrFwBaseCmp.h"
+#include "BaseCmp/CrFwInitProc.h"
+#include "BaseCmp/CrFwResetProc.h"
+/* Include FW Profile files */
+#include "FwSmConstants.h"
+#include "FwSmDCreate.h"
+#include "FwSmConfig.h"
+#include "FwSmCore.h"
+#include "FwPrConstants.h"
+#include "FwPrDCreate.h"
+#include "FwPrConfig.h"
+#include "FwPrCore.h"
+/* Include configuration files */
+#include "CrFwCmpData.h"
+
+/** The application error code. */
+static CrFwAppErrCode_t appErrCode = crNoAppErr;
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwAppErrCode_t CrFwGetAppErrCode() {
+	return appErrCode;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwSetAppErrCode(CrFwAppErrCode_t errCode) {
+	appErrCode = errCode;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+FwPrBool_t CrFwIsPrOutcomeOne(FwPrDesc_t prDesc) {
+	CrFwCmpData_t* prData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+	return (prData->outcome);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+FwSmBool_t CrFwIsSmOutcomeZero(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* smData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	return (smData->outcome == 0);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+FwSmBool_t CrFwIsSmOutcomeOne(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* smData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	return (smData->outcome == 1);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+FwSmBool_t CrFwIsSmOutcomeTwo(FwSmDesc_t smDesc) {
+	CrFwCmpData_t* smData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+	return (smData->outcome == 2);
+}
+
+/*-----------------------------------------------------------------------------------------*/
+FwPrBool_t CrFwWaitOnePrCycle(FwPrDesc_t prDesc) {
+	if (FwPrGetNodeExecCnt(prDesc) > 0)
+		return 1;
+	else
+		return 0;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwBool_t CrFwPrCheckAlwaysTrue(FwPrDesc_t prDesc) {
+	CRFW_UNUSED(prDesc);
+	return 1;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwBool_t CrFwSmCheckAlwaysTrue(FwSmDesc_t smDesc) {
+	CRFW_UNUSED(smDesc);
+	return 1;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwBool_t CrFwSmCheckAlwaysFalse(FwSmDesc_t smDesc) {
+	CRFW_UNUSED(smDesc);
+	return 0;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwPrEmptyAction(FwPrDesc_t prDesc) {
+	CRFW_UNUSED(prDesc);
+	return;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwSmEmptyAction(FwSmDesc_t smDesc) {
+	CRFW_UNUSED(smDesc);
+	return;
+}
+
+/*-----------------------------------------------------------------------------------------*/
+CrFwCmdRepKindIndex_t CrFwFindCmdRepKindIndex(CrFwCmdRepKindKey_t* cmdRepKindArray,
+        CrFwCmdRepKindIndex_t length, CrFwCmdRepKindKey_t targetKey) {
+
+	CrFwCmdRepKindIndex_t pos_lower, pos_upper, pos_half;
+
+	pos_lower = 0;
+	pos_upper = (CrFwCmdRepKindIndex_t)(length-1);
+
+	while (pos_lower < pos_upper) {
+		pos_half = (CrFwCmdRepKindIndex_t)(pos_lower+(pos_upper-pos_lower)/2);
+		if (pos_half == pos_lower)
+			break;
+		if (targetKey > cmdRepKindArray[pos_half]) {
+			pos_lower = pos_half;
+		} else if (targetKey < cmdRepKindArray[pos_half]) {
+			pos_upper = pos_half;
+		} else
+			return pos_half;
+	}
+
+	if (targetKey == cmdRepKindArray[pos_lower])
+		return pos_lower;
+
+	if (targetKey == cmdRepKindArray[pos_upper])
+		return pos_upper;
+
+	return length;
+}
diff --git a/CrFramework/src/UtilityFunctions/CrFwUtilityFunctions.h b/CrFramework/src/UtilityFunctions/CrFwUtilityFunctions.h
new file mode 100644
index 0000000..4695008
--- /dev/null
+++ b/CrFramework/src/UtilityFunctions/CrFwUtilityFunctions.h
@@ -0,0 +1,176 @@
+/**
+ * @file
+ * @ingroup utilityFunctionsGroup
+ * Definition of the utility functions for the CORDET Framework.
+ *
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2013, All Rights Reserved
+ *
+ * This file is part of CORDET Framework.
+ *
+ * CORDET Framework is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CORDET Framework 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with CORDET Framework.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef CRFW_UTILITY_FUNCTIONS_H_
+#define CRFW_UTILITY_FUNCTIONS_H_
+
+/* Include FW Profile Files */
+#include "FwSmConstants.h"
+#include "FwPrConstants.h"
+/* Include Framework Files */
+#include "CrFwConstants.h"
+/* Include Configuration Files */
+#include "CrFwUserConstants.h"
+
+/**
+ * Return the value of the application error code.
+ * The application error code is set by a framework function when when either
+ * of the following situations arises:
+ * - a framework function has been called by the application code with an illegal
+ *   parameter values or in an illegal context and execution of the function with the illegal
+ *   values would cause an internal framework data structure to be corrupted.
+ * - a framework function which releases dynamically allocated framework components has been
+ *   asked to either release a non-allocated component or to release a component which had
+ *   already been released.
+ * .
+ * Nominally, the application error code should be equal to: <code>::crNoAppErr</code>.
+ * If the application error code has a different value, then it is likely that the
+ * framework is not configured as the user intended.
+ * @return the application error code
+ */
+CrFwAppErrCode_t CrFwGetAppErrCode();
+
+/**
+ * Set the value of the application error code (see <code>::CrFwGetAppErrCode</code>).
+ * @param errCode the application error code
+ */
+void CrFwSetAppErrCode(CrFwAppErrCode_t errCode);
+
+/**
+ * Convenience function to check whether the outcome of the last check or action
+ * is equal to 1 ("true").
+ * This function returns "true" if and only if the outcome field of the component data (see
+ * <code>::CrFwCmpData</code>) is equal to 1.
+ * This function is intended to be used as a guard in a procedure.
+ * @param prDesc the procedure descriptor
+ * @return return 1 if the outcome is 1 and return 0 otherwise
+ */
+FwPrBool_t CrFwIsPrOutcomeOne(FwPrDesc_t prDesc);
+
+/**
+ * Convenience function to check whether the outcome of the last check or action
+ * is equal to 0 ("false").
+ * This function returns "true" if and only if the outcome field of the component data (see
+ * <code>::CrFwCmpData</code>) is equal to 0.
+ * This function is intended to be used as a guard in a state machine.
+ * @param smDesc the state machine descriptor
+ * @return return 1 if the outcome is 0 and return 0 otherwise
+ */
+FwSmBool_t CrFwIsSmOutcomeZero(FwSmDesc_t smDesc);
+
+/**
+ * Convenience function to check whether the outcome of the last check or action
+ * is equal to 1 ("true").
+ * This function returns "true" if and only if the outcome field of the component data (see
+ * <code>::CrFwCmpData</code>) is equal to 1.
+ * This function is intended to be used as a guard in a state machine.
+ * @param smDesc the state machine descriptor
+ * @return return 1 if the outcome is 1 and return 0 otherwise
+ */
+FwSmBool_t CrFwIsSmOutcomeOne(FwSmDesc_t smDesc);
+
+/**
+ * Convenience function to check whether the outcome of the last check or action
+ * is equal to 2.
+ * This function returns "true" if and only if the outcome field of the component data (see
+ * <code>::CrFwCmpData</code>) is equal to 2.
+ * This function is intended to be used as a guard in a state machine.
+ * @param smDesc the state machine descriptor
+ * @return return 1 if the outcome is 2 and return 0 otherwise
+ */
+FwSmBool_t CrFwIsSmOutcomeTwo(FwSmDesc_t smDesc);
+
+/**
+ * Convenience function which returns true when a procedure has spent more than one cycle
+ * in the current action node.
+ * This function can be used as a guard in a procedure where there is a need to express
+ * the fact that the procedure should remain only one cycle in a node: the guard is false
+ * after the action node has been executed the first time and becomes true after it has been
+ * executed the second time.
+ * @param prDesc the procedure descriptor
+ * @return return 1 if the action of the current node has been executed two or more times;
+ * return 0 otherwise.
+ */
+FwPrBool_t CrFwWaitOnePrCycle(FwPrDesc_t prDesc);
+
+/**
+ * Convenience function to be used in a procedure as default implementation for a check
+ * which always returns true.
+ * @param prDesc the procedure descriptor
+ * @return always returns true
+ */
+CrFwBool_t CrFwPrCheckAlwaysTrue(FwPrDesc_t prDesc);
+
+/**
+ * Convenience function to be used in a state machine as default implementation for a check
+ * which always returns true.
+ * @param smDesc the state machine descriptor
+ * @return always returns true
+ */
+CrFwBool_t CrFwSmCheckAlwaysTrue(FwSmDesc_t smDesc);
+
+/**
+ * Convenience function to be used in a state machine as default implementation for a check
+ * which always returns false.
+ * @param smDesc the state machine descriptor
+ * @return always returns false
+ */
+CrFwBool_t CrFwSmCheckAlwaysFalse(FwSmDesc_t smDesc);
+
+/**
+ * Convenience function to be used in a procedure as default implementation for an action
+ * which returns without doing anything.
+ * @param prDesc the procedure descriptor
+ */
+void CrFwPrEmptyAction(FwPrDesc_t prDesc);
+
+/**
+ * Convenience function to be used in a state machine as default implementation for an action
+ * which returns without doing anything.
+ * @param smDesc the state machine descriptor
+ */
+void CrFwSmEmptyAction(FwSmDesc_t smDesc);
+
+/**
+ * Convenience function to retrieve the index of an array where a certain target value is
+ * located.
+ * This function is used by the InFactory (see <code>CrFwInFactory.h</code>) and OutFactory
+ * (see <code>CrFwOutFactory.h</code>).
+ * The InFactory and OutFactory maintain arrays which store sets of command and report kinds
+ * in increasing order.
+ * A command or report kind is encoded through a key.
+ * This function finds the index corresponding to a given target key value.
+ * @param cmdRepKindArray array of key values (the key values must be stored in increasing order)
+ * @param length length of the array of key values
+ * @param targetKey the key value that is searched
+ * @return the index in the array where the target key value is located or the length of the
+ * array if the target key value is not in the array
+ */
+CrFwCmdRepKindIndex_t CrFwFindCmdRepKindIndex(CrFwCmdRepKindKey_t* cmdRepKindArray,
+        CrFwCmdRepKindIndex_t length, CrFwCmdRepKindKey_t targetKey);
+
+#endif /* CRFW_BASE_CMP_H_ */
diff --git a/CrIa/Makefile b/CrIa/Makefile
new file mode 100644
index 0000000..0c4d353
--- /dev/null
+++ b/CrIa/Makefile
@@ -0,0 +1,150 @@
+.PHONY: all
+all:	ifsw-dpu ifsw-pc
+	@echo "finished building all targets"
+
+ifsw-dpu:
+	@echo "+--------------------------+"
+	@echo "| building CrIa DPU target |"
+	@echo "+--------------------------+"
+	make -f ./Makefile-dpu.mk
+	@echo "+-----------------------+"
+	@echo "| built CrIa DPU target |"
+	@echo "+-----------------------+"
+	@echo
+
+perf-dpu:
+	@echo "+----------------------------------------------------+"
+	@echo "| building CrIa DPU target with performance wrappers |"
+	@echo "+----------------------------------------------------+"
+	make -f ./Makefile-dpu.mk perf
+	@echo "+-------------------------------------------------+"
+	@echo "| built CrIa DPU target with performance wrappers |"
+	@echo "+-------------------------------------------------+"
+	@echo
+
+ifsw-eval:
+	@echo "+---------------------------+"
+	@echo "| building CrIa LEON target |"
+	@echo "+---------------------------+"
+	make -f ./Makefile-eval.mk
+	@echo "+------------------------+"
+	@echo "| built CrIa LEON target |"
+	@echo "+------------------------+"
+	@echo
+
+ifsw-pc:
+	@echo "+-------------------------+"
+	@echo "| building CrIa PC target |"
+	@echo "+-------------------------+"
+	make -f ./Makefile-pc.mk ifsw
+	@echo "+----------------------+"
+	@echo "| built CrIa PC target |"
+	@echo "+----------------------+"
+	@echo
+
+scan:
+	@echo "+-----------------------+"
+	@echo "| running static checks |"
+	@echo "+-----------------------+"
+	@echo
+
+	@echo "1. CLANG"
+	scan-build -V make -f ./Makefile-pc.mk ifsw
+
+	@echo "+--------------------------------+"
+	@echo "| finished running static checks |"
+	@echo "+--------------------------------+"
+	@echo
+
+checks:
+	@echo "+--------------------+"
+	@echo "| running TCL checks |"
+	@echo "+--------------------+"
+	@echo
+
+	@echo "1. scan for LEON3 cache bug"
+	-sparc-elf-objdump -d build/dpu/ifsw-dpu | /home/space/BCC-1.0.50/TN/leon3ft-b2bst-scan.tcl
+
+	@echo "2. scan for TN-0010 bug"
+	-sparc-elf-objdump -d build/dpu/ifsw-dpu | /home/space/BCC-1.0.50/TN/tn-0010.tcl
+
+	@echo "3. scan for TN-0011 bug"
+	-sparc-elf-objdump -d build/dpu/ifsw-dpu | /home/space/BCC-1.0.50/TN/tn-0011.tcl
+	-sparc-elf-objdump -d build/dpu/ifsw-dpu | /home/space/BCC-1.0.50/TN/tn-0011-obj.tcl
+
+	@echo "4. scan for TN-0012 bug"
+	-sparc-elf-objdump -d build/dpu/ifsw-dpu | /home/space/BCC-1.0.50/TN/tn-0012.tcl
+
+	@echo "5. scan for TN-0013 bug"
+	-sparc-elf-objdump -d build/dpu/ifsw-dpu | /home/space/BCC-1.0.50/TN/tn-0013.tcl
+
+	@echo "+-----------------------------+"
+	@echo "| finished running TCL checks |"
+	@echo "+-----------------------------+"
+	@echo
+
+printf:
+	@echo "+----------------------------------+"
+	@echo "| checking for printf in flight SW |"
+	@echo "+----------------------------------+"
+	@echo
+	@grep -R printf src | grep -v sprintf | grep -v src/CrIaMain.c | grep -v src/IfswDebug | grep -v '.txt' | cut -d ":" -f 1,1 | sort | uniq -c
+	@grep -R printf ../IBSW/lib | grep -v sprintf | cut -d ":" -f 1,1 | sort | uniq -c
+	@grep -R printf ../IBSW/include | grep -v sprintf | cut -d ":" -f 1,1 | sort | uniq -c
+	@echo	
+	@echo "+--------------------------------+"
+	@echo "| now go and check these printfs |"
+	@echo "+--------------------------------+"
+	@echo
+
+todos:
+	@echo "+------------------------------------------+"
+	@echo "| checking for TODO and FIXME in flight SW |"
+	@echo "+------------------------------------------+"
+	@echo
+	@echo "TODOs:"
+	@grep -Ri 'TODO' src | grep -v src/CrIaMain.c | grep -v src/IfswDebug | grep -v '.txt' | cut -d ":" -f 1,1 | sort | uniq -c
+	@grep -Ri 'TODO' ../IBSW/lib | cut -d ":" -f 1,1 | sort | uniq -c
+	@grep -Ri 'TODO' ../IBSW/include | cut -d ":" -f 1,1 | sort | uniq -c
+	@echo
+	@echo "FIXMEs:"
+	@grep -Ri 'FIXME' src | grep -v src/CrIaMain.c | grep -v src/IfswDebug | grep -v '.txt' | cut -d ":" -f 1,1 | sort | uniq -c
+	@grep -Ri 'FIXME' ../IBSW/lib | cut -d ":" -f 1,1 | sort | uniq -c
+	@grep -Ri 'FIXME' ../IBSW/include | cut -d ":" -f 1,1 | sort | uniq -c
+	@echo "+--------------------------------+"
+	@echo "| now go and check these TODOs   |"
+	@echo "+--------------------------------+"
+	@echo
+
+checkidb:
+	@echo "+-----------------------------+"
+	@echo "| checking for orphans in IDB |"
+	@echo "+-----------------------------+"
+	@echo
+	./checkidb.sh
+	@echo	
+	@echo "+----------------------------+"
+	@echo "| IDB orphan check completed |"
+	@echo "+----------------------------+"
+	@echo
+
+showdef:
+	@echo "+-----------------------------+"
+	@echo "| checking for #if constructs |"
+	@echo "+-----------------------------+"
+	@echo
+	grep -R '#if' src ifsw.* ../IBSW/ | grep -v 'PC_TARGET' | grep -v 'sparc' | grep -v SPW_ROUTING | grep -v IBSW/test | grep -v IBSW/unused | grep -v '_H$$' | grep -v "IBSW/exports" | grep -v "IBSW/reports" | grep -v 'IBSW/example' | grep -v '_H_$$' 
+	@echo	
+	@echo "+-------------------------------+"
+	@echo "| these were all #if constructs |"
+	@echo "+-------------------------------+"
+	@echo
+
+
+
+.PHONY: clean
+.IGNORE: clean
+clean:
+	make -f ./Makefile-dpu.mk clean
+	make -f ./Makefile-eval.mk clean	
+	make -f ./Makefile-pc.mk clean
diff --git a/CrIa/Makefile-dpu.mk b/CrIa/Makefile-dpu.mk
new file mode 100644
index 0000000..6f4b105
--- /dev/null
+++ b/CrIa/Makefile-dpu.mk
@@ -0,0 +1,147 @@
+.PHONY: all
+CC               = sparc-elf-gcc
+BUILDDIR	 = $(shell realpath build/dpu)
+INCLUDEDIR       = $(shell realpath ../IBSW/include)
+IBSW_DIR	 = $(shell realpath ../IBSW/lib)
+IASW_DIR	 = $(shell realpath src)
+CORDET_DIR	 = $(shell realpath ../CrFramework/src)
+CPPFLAGS	:= -D__SPW_ROUTING__
+
+#  -DLIBERATE_XIB disables the XIB checks for their incrementation
+
+GIT_ID		:= $(shell git log -n 1 --format="%h" | sed -e "s/\(....\).*/\1/")
+IFSW_VERSION	:= "6E"
+CE_VERSION	:= "0B"
+BUILD_ID	:= "0x"$(GIT_ID)$(IFSW_VERSION)$(CE_VERSION)
+
+#
+# In BCC 4.4.2 1.0.50 -mfix-gr712rc replaces -mfix-b2bst
+#
+CFLAGS          := -mv8 -mhard-float -mfix-gr712rc -O2 -std=gnu89 -W -Wall -Wextra -Werror -pedantic -Wshadow -Wuninitialized -fdiagnostics-show-option -Wcast-qual -Wformat=2 
+INCLUDES        := -I$(INCLUDEDIR) -I$(INCLUDEDIR)/leon \
+		   -I$(shell realpath src) \
+		   -I$(shell realpath src/Sdp) \
+		   -I$(shell realpath src/Ta) \
+		   -I$(shell realpath src/CrConfigIa) \
+		   -I$(shell realpath src/Services/General) \
+		   -I$(shell realpath ../include/CrFramework) \
+		   -I$(shell realpath ../include/FwProfile) \
+		   -I$(shell realpath ../include) \
+		   -I$(shell realpath ../CrFramework/src)
+
+# 512 kiB for .text, 128 kiB for initialised values, rest for .bss
+LDFLAGS         := -Ttext=0x40480000 -Tdata=0x40500000 -Tbss=0x40520000 -Xlinker --defsym -Xlinker __BUILD_ID=$(BUILD_ID) -Xlinker -Map=dpu.map
+SOURCES         :=  $(IASW_DIR)/../ifsw.c \
+		    $(IBSW_DIR)/core1553brm_as250.c\
+		    $(IBSW_DIR)/circular_buffer16.c\
+		    $(IBSW_DIR)/circular_buffer8.c \
+		    $(IBSW_DIR)/irq_dispatch.c     \
+		    $(IBSW_DIR)/grspw2.c           \
+		    $(IBSW_DIR)/cpus_buffer.c      \
+		    $(IBSW_DIR)/packet_tracker.c   \
+		    $(IBSW_DIR)/timing/leon3_gptimer.c \
+		    $(IBSW_DIR)/timing/leon3_grtimer.c \
+		    $(IBSW_DIR)/timing/leon3_grtimer_longcount.c \
+		    $(IBSW_DIR)/timing/timing.c \
+		    $(IBSW_DIR)/timing/watchdog.c \
+		    $(IBSW_DIR)/timing/syncpulse.c \
+		    $(IBSW_DIR)/error_log.c        \
+		    $(IBSW_DIR)/ibsw_init/init_cpus.c \
+		    $(IBSW_DIR)/ibsw_init/init_ptrack.c \
+		    $(IBSW_DIR)/ibsw_init/init_spw.c \
+		    $(IBSW_DIR)/ibsw_init/init_1553.c \
+		    $(IBSW_DIR)/ibsw_init/init_sync_timing.c \
+		    $(IBSW_DIR)/ibsw_init/init_error_log.c \
+		    $(IBSW_DIR)/ibsw_init/init_edac.c \
+		    $(IBSW_DIR)/ibsw_init/init_cpu_0_idle_timing.c \
+		    $(IBSW_DIR)/ibsw_init/ibsw_mainloop.c \
+		    $(IBSW_DIR)/ibsw_init/ibsw_init.c \
+		    $(IBSW_DIR)/ibsw_interface/ibsw_interface.c \
+		    $(IBSW_DIR)/ibsw_interface/ibsw_spw.c \
+		    $(IBSW_DIR)/ibsw_interface/ibsw_datapool_update.c \
+		    $(IBSW_DIR)/ibsw_interface/ibsw_watchdog.c \
+		    $(IBSW_DIR)/ibsw_interface/ibsw_1553.c \
+		    $(IBSW_DIR)/ibsw_interface/ibsw_utility.c \
+		    $(IBSW_DIR)/ibsw_interface/ibsw_memscrub.c \
+		    $(IBSW_DIR)/ibsw_interface/ibsw_fbf.c \
+		    $(IBSW_DIR)/ibsw_interface/ibsw_time.c \
+		    $(IBSW_DIR)/ibsw_interface/ibsw_execute_op.c \
+		    $(IBSW_DIR)/ibsw_interface/ibsw_error_log.c \
+		    $(IBSW_DIR)/event_report.c	   \
+		    $(IBSW_DIR)/iwf_fpga.c         \
+		    $(IBSW_DIR)/iwf_flash.c        \
+		    $(IBSW_DIR)/sysctl.c           \
+		    $(IBSW_DIR)/wrap_malloc.c      \
+		    $(IBSW_DIR)/leon3_dsu.c        \
+		    $(IBSW_DIR)/traps.c 	   \
+		    $(IBSW_DIR)/fpe.c 	   	   \
+		    $(IBSW_DIR)/reset.c   	   \
+		    $(IBSW_DIR)/ahb.c              \
+		    $(IBSW_DIR)/edac.c             \
+		    $(IBSW_DIR)/memscrub.c         \
+		    $(IBSW_DIR)/memcfg.c	   \
+		    $(IBSW_DIR)/stacktrace.c	   \
+		    $(shell find $(CORDET_DIR) -type f -name *.\[c\] | sed /AppStartUp/d) \
+		    $(shell find -L $(IASW_DIR) -type f -name *.\[c\]| sed /CrIaMain/d | sed /AppStartUp/d | sed -e "/Performance\/performance.c/d" )
+
+ASMSOURCES	:=  $(IBSW_DIR)/asm/data_access_exception_trap.S \
+		    $(IBSW_DIR)/asm/floating_point_exception_trap.S \
+		    $(IBSW_DIR)/asm/reset_trap.S
+
+ALLSOURCES	:= $(SOURCES) $(ASMSOURCES)
+
+OBJECTS         := $(patsubst %.c, $(BUILDDIR)/%.o, $(subst $(SOURCEDIR)/,, $(ALLSOURCES)))
+TARGET          := $(BUILDDIR)/ifsw-dpu 
+
+DEBUG?=1
+ifeq  "$(shell expr $(DEBUG) \> 1)" "1"
+	    CFLAGS += -DDEBUGLEVEL=$(DEBUG)
+else
+	    CFLAGS += -DDEBUGLEVEL=1
+endif
+
+
+#all: builddir $(OBJECTS) $(BUILDDIR)/$(TARGET)
+#	$(CC) $(CPPFLAGS) $(CFLAGS)  $< -o $@
+#
+#builddir:
+#	mkdir -p $(BUILDDIR)
+#
+#clean:
+#	 rm -f $(BUILDDIR)/{$(TARGET), $(OBJECTS)}
+#	 rm -rf $(BUILDDIR)
+#
+#
+#$(BUILDDIR)/$(TARGET): $(OBJECTS)
+#	$(CC) $^ -o $@
+#
+#$(OBJECTS): $(SOURCES)
+#	$(CC) $(CPPFLAGS) $(CFLAGS) -c $^ -o $@
+
+all: $(ALLSOURCES)
+	echo "BUILD number is:" $(BUILD_ID)
+	mkdir -p $(BUILDDIR)
+	$(CC) $(CPPFLAGS) $(INCLUDES) $(LDFLAGS)  $(CFLAGS) $^ -o $(TARGET) ../FwProfile/build/dpu/libfwprofile.a -Wl,--wrap=malloc -Wl,--wrap=free
+	sparc-elf-objcopy -O srec build/dpu/ifsw-dpu build/dpu/ifsw.srec
+
+.ONESHELL:
+perf: $(SOURCES) $(shell realpath src/Performance/performance.c)
+	echo "BUILD number is:" $(BUILD_ID)
+	mkdir -p $(BUILDDIR)
+        # generate wrappers
+	$(eval WRAPS=$(shell bash -c 'source src/Performance/generate_wrappers.sh > /dev/null && echo $${WRAPPERS}'))
+	cd $(BUILDDIR)
+        # compile to .s files
+	$(CC) $(CPPFLAGS) $(INCLUDES) $(LDFLAGS) $(CFLAGS) -S $^
+        # patch wrappers in
+	$(IASW_DIR)/Performance/patch_asms.sh
+        # compile .s files to executable
+	$(CC) $(CPPFLAGS) $(INCLUDES) $(LDFLAGS) $(CFLAGS) -o ifsw-dpu *.s $(ASMSOURCES) ../../../FwProfile/build/dpu/libfwprofile.a -Wl,--wrap=malloc -Wl,--wrap=free
+	cd ..
+	sparc-elf-objcopy -O srec $(BUILDDIR)/ifsw-dpu $(BUILDDIR)/ifsw.srec
+	cat $(BUILDDIR)/dpu.map | grep perf | awk '($$2=="perf"){printf "\nNote: The perf structure starts at %s\n\n", $$1}'
+
+
+
+#	$(CC) $(CPPFLAGS) $(INCLUDES) $(LDFLAGS)  $(CFLAGS) $^ -o $(TARGET) ../../FwProfile/build/dpu/libfwprofile.a -Wl,--wrap=malloc -Wl,--wrap=free $(shell bash -c 'source src/Performance/generate_wrappers.sh > /dev/null && echo $${WRAPPERS}' )
+
diff --git a/CrIa/Makefile-eval.mk b/CrIa/Makefile-eval.mk
new file mode 100644
index 0000000..3693692
--- /dev/null
+++ b/CrIa/Makefile-eval.mk
@@ -0,0 +1,68 @@
+CC               = sparc-elf-gcc
+BUILDDIR	 = $(shell realpath build/eval)
+INCLUDEDIR       = $(shell realpath ../IBSW/include)
+IBSW_DIR	 = $(shell realpath ../IBSW/lib)
+IASW_DIR	 = $(shell realpath src)
+CORDET_DIR	 = $(shell realpath ../CrFramework/src)
+CPPFLAGS	:= -D__SPW_ROUTING__ 
+CFLAGS          := -mv8 -O2 -std=gnu89 -ggdb -W -Wall -Wextra -Werror -pedantic 
+INCLUDES        := -I$(INCLUDEDIR) -I$(INCLUDEDIR)/leon \
+		   -Isrc \
+		   -Isrc/CrConfigIa\
+		   -Isrc/Services/General\
+		   -I../include/CrFramework\
+		   -I../include/FwProfile\
+		   -I../include \
+		   -I../CrFramework/src \
+		   -I../include/CordetFW/CrFramework/OutCmp
+
+LDFLAGS         := -Ttext=0x40480000
+SOURCES         :=  ifsw.c \
+		    $(IBSW_DIR)/core1553brm_as250.c\
+		    $(IBSW_DIR)/circular_buffer16.c\
+		    $(IBSW_DIR)/circular_buffer8.c \
+		    $(IBSW_DIR)/irq_dispatch.c     \
+		    $(IBSW_DIR)/grspw2.c           \
+		    $(IBSW_DIR)/cpus_buffer.c      \
+		    $(IBSW_DIR)/packet_tracker.c   \
+		    $(IBSW_DIR)/timing.c           \
+		    $(IBSW_DIR)/error_log.c        \
+		    $(IBSW_DIR)/xen_printf.c       \
+		    $(IBSW_DIR)/IbswInterface.c    \
+		    $(IBSW_DIR)/ibsw.c             \
+		    $(IBSW_DIR)/sysctl.c           \
+		    $(IBSW_DIR)/wrap_malloc.c      \
+		    $(shell find $(CORDET_DIR) -type f -name *.\[c\] | sed /AppStartUp/d) \
+		    $(shell find $(IASW_DIR) -type f -name *.\[c\]| sed /CrIaMain/d | sed /AppStartUp/d)
+
+OBJECTS         := $(patsubst %.c, $(BUILDDIR)/%.o, $(subst $(SOURCEDIR)/,, $(SOURCES)))
+TARGET          := $(BUILDDIR)/ifsw-eval 
+
+DEBUG?=1
+ifeq  "$(shell expr $(DEBUG) \> 1)" "1"
+	    CFLAGS += -DDEBUGLEVEL=$(DEBUG)
+else
+	    CFLAGS += -DDEBUGLEVEL=1
+endif
+
+
+#all: builddir $(OBJECTS) $(BUILDDIR)/$(TARGET)
+#	$(CC) $(CPPFLAGS) $(CFLAGS)  $< -o $@
+#
+#builddir:
+#	mkdir -p $(BUILDDIR)
+#
+#clean:
+#	 rm -f $(BUILDDIR)/{$(TARGET), $(OBJECTS)}
+#	 rm -rf $(BUILDDIR)
+#
+#
+#$(BUILDDIR)/$(TARGET): $(OBJECTS)
+#	$(CC) $^ -o $@
+#
+#$(OBJECTS): $(SOURCES)
+#	$(CC) $(CPPFLAGS) $(CFLAGS) -c $^ -o $@
+
+all: $(SOURCES)
+	mkdir -p $(BUILDDIR)
+	$(CC) $(CPPFLAGS) $(INCLUDES) $(LDFLAGS)  $(CFLAGS) $^ -o $(TARGET) ../FwProfile/build/dpu/libfwprofile.a -lpthread -Wl,--wrap=malloc -Wl,--wrap=free
diff --git a/CrIa/Makefile-pc.mk b/CrIa/Makefile-pc.mk
new file mode 100644
index 0000000..5edeb98
--- /dev/null
+++ b/CrIa/Makefile-pc.mk
@@ -0,0 +1,70 @@
+CC		= gcc
+CFLAGS		= -O2 -W -Wall -Wextra -Wno-variadic-macros -Werror -std=gnu89 -m32 -pedantic -ggdb
+IFSW_VERSION	:= "6E"
+CE_VERSION	:= "0B"
+BUILD_ID	:= "0x"$(IFSW_VERSION)$(CE_VERSION)
+DEFS		= -DPC_TARGET -DBUILD_ID=$(BUILD_ID)
+LD		= gcc
+LDFLAGS		= -m32 
+
+# use pc or dpu
+TARGET		= pc
+
+ROOTDIR		= $(shell pwd)
+SOURCEDIR	= $(ROOTDIR)/src
+
+
+# generic user include directory
+INC_DIR = $(shell realpath ../include)
+
+# FwProfile include and library path
+FWP_DIR	= $(shell realpath ../FwProfile)
+FWP_INC	= $(FWP_DIR)/src
+FWP_LIB	= $(FWP_DIR)/build
+
+# CrFramework sources and include path
+CRFW_DIR	= $(shell realpath ../CrFramework)
+CRFW_SRC	= $(shell find $(CRFW_DIR)/src | grep -e "\.c" | sort | sed /AppStartUp/d) # all c files but the AppStartUp
+CRFW_INC 	= $(CRFW_DIR)/src
+
+# CrIaConfig includes
+CRIA_DIR	= $(shell realpath .)
+CRIA_CONF_INC	= $(CRIA_DIR)/src/CrConfigIa
+CRIA_INC	= $(CRIA_DIR)/src
+SDP_INC		= $(CRIA_DIR)/src/Sdp
+TA_INC		= $(CRIA_DIR)/src/Ta
+
+# CrIa Sources
+CRIA_SRC	= $(shell find $(CRIA_DIR)/src -name *.\[c\] | sed -e "/Performance\/performance.c/d" -e "/IfswMath.c/d")
+
+INCLUDES 	= -I$(FWP_INC) -I$(CRFW_INC) -I$(CRIA_INC) -I$(CRIA_CONF_INC) -I$(INC_DIR) -I$(SDP_INC) -I$(TA_INC)
+#LIBS		= -L$(FWP_LIB)/$(TARGET) -lfwprofile
+LIBS		= 
+LOPTIONS	= -lpthread
+FWPLIB		= $(FWP_LIB)/$(TARGET)/libfwprofile.a
+
+BUILDDIR 	= $(ROOTDIR)/build/$(TARGET)
+
+#SOURCES		= $(shell ls $(SOURCEDIR)/*.c)
+#OBJECTS		= $(patsubst %.c,$(BUILDDIR)/%.o,$(notdir $(SOURCES)))
+
+
+ifsw: $(CRIA_SRC) $(CRFW_SRC) 
+	@echo "Building" $(TARGET) "target."
+	@mkdir -p $(BUILDDIR)
+	# compile
+	@echo "******** Compiling object files ********"
+	cd $(BUILDDIR) && $(CC) $(CFLAGS) $(INCLUDES) $(DEFS) -c $(CRIA_SRC) $(CRFW_SRC)  
+	# link
+	@echo "******** Linking components ********"
+	cd $(BUILDDIR) && $(LD) $(LDFLAGS) $(LIBS) -o CrIa *.o $(FWPLIB) $(LOPTIONS) -lm
+	@echo "CrIa is ready!"
+
+.PHONY: all
+all:	ifsw
+	@echo "Finished building" $(TARGET) "target."
+
+.PHONY: clean
+clean:
+	rm -f $(BUILDDIR)/*.[ao] $(BUILDDIR)/CrIa
+
diff --git a/CrIa/doc/Doxyfile b/CrIa/doc/Doxyfile
new file mode 100644
index 0000000..2bd62ea
--- /dev/null
+++ b/CrIa/doc/Doxyfile
@@ -0,0 +1,2482 @@
+# Doxyfile 1.8.14
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See
+# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME           = "CHEOPS IASW"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER         = 1.0
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          = "CHEOPS Instrument Application Software"
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO           = "images/cheops-logo-with-additional3.png"
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       =
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS         = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES    = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES        = NO
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH        = ../
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH    = ../
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES  = YES
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines (in the resulting output). You can put ^^ in the value part of an
+# alias to insert a newline as if a physical newline was in the original file.
+
+ALIASES                =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST              =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C  = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
+# to that level are automatically included in the table of contents, even if
+# they do not have an id attribute.
+# Note: This feature currently applies only to Markdown headings.
+# Minimum value: 0, maximum value: 99, default value: 0.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+TOC_INCLUDE_HEADINGS   = 0
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE        = YES
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = YES
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC         = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    = "/bin/sh -c 'git log --pretty=\"format:%ci, author:%aN <%aE>, commit:%h\" -1 \"${1}\" || echo no git'"
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES         =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS               = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC       = YES
+
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered.
+# The default value is: NO.
+
+WARN_AS_ERROR          = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+INPUT                  = ../src ./extradoc ../ifsw.h ../ifsw.c
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: https://www.gnu.org/software/libiconv/) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
+# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf.
+
+FILE_PATTERNS          = *.c \
+                         *.cc \
+                         *.cxx \
+                         *.cpp \
+                         *.c++ \
+                         *.java \
+                         *.ii \
+                         *.ixx \
+                         *.ipp \
+                         *.i++ \
+                         *.inl \
+                         *.idl \
+                         *.ddl \
+                         *.odl \
+                         *.h \
+                         *.hh \
+                         *.hxx \
+                         *.hpp \
+                         *.h++ \
+                         *.cs \
+                         *.d \
+                         *.php \
+                         *.php4 \
+                         *.php5 \
+                         *.phtml \
+                         *.inc \
+                         *.m \
+                         *.markdown \
+                         *.md \
+                         *.mm \
+                         *.dox \
+                         *.py \
+                         *.pyw \
+                         *.f90 \
+                         *.f95 \
+                         *.f03 \
+                         *.f08 \
+                         *.f \
+                         *.for \
+                         *.tcl \
+                         *.vhd \
+                         *.vhdl \
+                         *.ucf \
+                         *.qsf
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH           = ../example
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH             = images 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER         = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES         = YES
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS    = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION    = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see https://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX     = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            = header.html
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            = footer.html
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  = customdoxygen.css
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = YES
+
+# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
+# documentation will contain a main index with vertical navigation menus that
+# are dynamically created via Javascript. If disabled, the navigation index will
+# consists of multiple levels of tabs that are statically embedded in every HTML
+# page. Disable this option to support browsers that do not have Javascript,
+# like the Qt help browser.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_MENUS     = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: https://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See https://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP      = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE               =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION           =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI           = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING     =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://doc.qt.io/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://doc.qt.io/qt-4.8/qthelpproject.html#virtual-folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://doc.qt.io/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX          = YES
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW      = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH         = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# https://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from https://www.mathjax.org before deployment.
+# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        = https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE           = NO
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: https://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: https://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER           =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES      =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE        = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES     = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP        = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE    =
+
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE        = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION          = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT             = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK       = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
+# the structure of the code including all documentation. Note that this feature
+# is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION        = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF     =  NO
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH           = ../include
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED             = __attribute__(x)=1 __SPW_ROUTING__=1 __sparc__=1
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS        = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH               =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT               = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK               = YES
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH          = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH             = YES
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH           = YES
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT       = svg
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = YES
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS           =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH      = /opt/plantuml
+
+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
+# configuration file for plantuml.
+
+PLANTUML_CFG_FILE      =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH  =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT        = YES
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS      = YES
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP            = YES
diff --git a/CrIa/doc/DoxygenLayout.xml b/CrIa/doc/DoxygenLayout.xml
new file mode 100644
index 0000000..7479687
--- /dev/null
+++ b/CrIa/doc/DoxygenLayout.xml
@@ -0,0 +1,194 @@
+<doxygenlayout version="1.0">
+  <!-- Generated by doxygen 1.8.11 -->
+  <!-- Navigation index tabs for HTML output -->
+  <navindex>
+    <tab type="mainpage" visible="yes" title=""/>
+    <tab type="pages" visible="yes" title="" intro=""/>
+    <tab type="modules" visible="yes" title="" intro=""/>
+    <tab type="namespaces" visible="yes" title="">
+      <tab type="namespacelist" visible="yes" title="" intro=""/>
+      <tab type="namespacemembers" visible="yes" title="" intro=""/>
+    </tab>
+    <tab type="classes" visible="yes" title="">
+      <tab type="classlist" visible="yes" title="" intro=""/>
+      <tab type="classindex" visible="$ALPHABETICAL_INDEX" title=""/> 
+      <tab type="hierarchy" visible="yes" title="" intro=""/>
+      <tab type="classmembers" visible="yes" title="" intro=""/>
+    </tab>
+    <tab type="files" visible="yes" title="">
+      <tab type="filelist" visible="yes" title="" intro=""/>
+      <tab type="globals" visible="yes" title="" intro=""/>
+    </tab>
+    <tab type="examples" visible="yes" title="" intro=""/>  
+  </navindex>
+
+  <!-- Layout definition for a class page -->
+  <class>
+    <briefdescription visible="yes"/>
+    <includes visible="$SHOW_INCLUDE_FILES"/>
+    <inheritancegraph visible="$CLASS_GRAPH"/>
+    <collaborationgraph visible="$COLLABORATION_GRAPH"/>
+    <detaileddescription title=""/>
+    <memberdecl>
+      <nestedclasses visible="yes" title=""/>
+      <publictypes title=""/>
+      <services title=""/>
+      <interfaces title=""/>
+      <publicslots title=""/>
+      <signals title=""/>
+      <publicmethods title=""/>
+      <publicstaticmethods title=""/>
+      <publicattributes title=""/>
+      <publicstaticattributes title=""/>
+      <protectedtypes title=""/>
+      <protectedslots title=""/>
+      <protectedmethods title=""/>
+      <protectedstaticmethods title=""/>
+      <protectedattributes title=""/>
+      <protectedstaticattributes title=""/>
+      <packagetypes title=""/>
+      <packagemethods title=""/>
+      <packagestaticmethods title=""/>
+      <packageattributes title=""/>
+      <packagestaticattributes title=""/>
+      <properties title=""/>
+      <events title=""/>
+      <privatetypes title=""/>
+      <privateslots title=""/>
+      <privatemethods title=""/>
+      <privatestaticmethods title=""/>
+      <privateattributes title=""/>
+      <privatestaticattributes title=""/>
+      <friends title=""/>
+      <related title="" subtitle=""/>
+      <membergroups visible="yes"/>
+    </memberdecl>
+    <memberdef>
+      <inlineclasses title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <services title=""/>
+      <interfaces title=""/>
+      <constructors title=""/>
+      <functions title=""/>
+      <related title=""/>
+      <variables title=""/>
+      <properties title=""/>
+      <events title=""/>
+    </memberdef>
+    <allmemberslink visible="yes"/>
+    <usedfiles visible="$SHOW_USED_FILES"/>
+    <authorsection visible="yes"/>
+  </class>
+
+  <!-- Layout definition for a namespace page -->
+  <namespace>
+    <briefdescription visible="yes"/>
+    <detaileddescription title=""/>
+    <memberdecl>
+      <nestednamespaces visible="yes" title=""/>
+      <constantgroups visible="yes" title=""/>
+      <classes visible="yes" title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <functions title=""/>
+      <variables title=""/>
+      <membergroups visible="yes"/>
+    </memberdecl>
+    <memberdef>
+      <inlineclasses title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <functions title=""/>
+      <variables title=""/>
+    </memberdef>
+    <authorsection visible="yes"/>
+  </namespace>
+
+  <!-- Layout definition for a file page -->
+  <file>
+    <briefdescription visible="yes"/>
+    <includes visible="$SHOW_INCLUDE_FILES"/>
+    <includegraph visible="$INCLUDE_GRAPH"/>
+    <includedbygraph visible="$INCLUDED_BY_GRAPH"/>
+    <sourcelink visible="yes"/>
+    <detaileddescription title=""/>
+    <memberdecl>
+      <classes visible="yes" title=""/>
+      <namespaces visible="yes" title=""/>
+      <constantgroups visible="yes" title=""/>
+      <defines title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <functions title=""/>
+      <variables title=""/>
+      <membergroups visible="yes"/>
+    </memberdecl>
+    <memberdef>
+      <inlineclasses title=""/>
+      <defines title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <functions title=""/>
+      <variables title=""/>
+    </memberdef>
+    <authorsection/>
+  </file>
+
+  <!-- Layout definition for a group page -->
+  <group>
+    <briefdescription visible="yes"/>
+    <groupgraph visible="$GROUP_GRAPHS"/>
+    <detaileddescription title=""/>
+    <memberdecl>
+      <nestedgroups visible="yes" title=""/>
+      <dirs visible="yes" title=""/>
+      <files visible="yes" title=""/>
+      <namespaces visible="yes" title=""/>
+      <classes visible="yes" title=""/>
+      <defines title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <enumvalues title=""/>
+      <functions title=""/>
+      <variables title=""/>
+      <signals title=""/>
+      <publicslots title=""/>
+      <protectedslots title=""/>
+      <privateslots title=""/>
+      <events title=""/>
+      <properties title=""/>
+      <friends title=""/>
+      <membergroups visible="yes"/>
+    </memberdecl>
+    <memberdef>
+      <pagedocs/>
+      <inlineclasses title=""/>
+      <defines title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <enumvalues title=""/>
+      <functions title=""/>
+      <variables title=""/>
+      <signals title=""/>
+      <publicslots title=""/>
+      <protectedslots title=""/>
+      <privateslots title=""/>
+      <events title=""/>
+      <properties title=""/>
+      <friends title=""/>
+    </memberdef>
+    <authorsection visible="yes"/>
+  </group>
+
+  <!-- Layout definition for a directory page -->
+  <directory>
+    <briefdescription visible="yes"/>
+    <directorygraph visible="yes"/>
+    <memberdecl>
+      <dirs visible="yes"/>
+      <files visible="yes"/>
+    </memberdecl>
+    <detaileddescription title=""/>
+  </directory>
+</doxygenlayout>
diff --git a/CrIa/doc/Makefile b/CrIa/doc/Makefile
new file mode 100644
index 0000000..533632b
--- /dev/null
+++ b/CrIa/doc/Makefile
@@ -0,0 +1,16 @@
+CSSFILES = $(shell ls *.css)
+JSFILES = $(shell ls *.js)
+HTFILES = header.html footer.html
+
+.PHONY: all
+
+all:
+	@which plantuml
+	@test -d html || mkdir html
+	doxygen
+	cp $(CSSFILES) $(JSFILES) $(HTFILES) html/
+
+.PHONY: clean
+clean:
+	rm -rf html
+
diff --git a/CrIa/doc/bootstrap.min.css b/CrIa/doc/bootstrap.min.css
new file mode 100644
index 0000000..4cf729e
--- /dev/null
+++ b/CrIa/doc/bootstrap.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
+/*# sourceMappingURL=bootstrap.min.css.map */
\ No newline at end of file
diff --git a/CrIa/doc/bootstrap.min.js b/CrIa/doc/bootstrap.min.js
new file mode 100644
index 0000000..e79c065
--- /dev/null
+++ b/CrIa/doc/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under the MIT license
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.6",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.6",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in"),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+e).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",a,b)};c.VERSION="3.3.6",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-m<o.top?"bottom":"right"==h&&k.right+l>o.width?"left":"left"==h&&k.left-l<o.left?"right":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");
+d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.6",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
\ No newline at end of file
diff --git a/CrIa/doc/customdoxygen.css b/CrIa/doc/customdoxygen.css
new file mode 100644
index 0000000..6a32ca7
--- /dev/null
+++ b/CrIa/doc/customdoxygen.css
@@ -0,0 +1,306 @@
+/*
+h1, .h1, h2, .h2, h3, .h3{
+    font-weight: 200 !important;
+}
+*/
+
+h1,.h1 {
+  font-size: 24px;
+}
+
+h2,.h2 {
+  font-size: 20px;
+}
+
+h3,.h3 {
+  font-size: 16px;
+}
+
+h4,.h4 {
+  font-size: 14px;
+}
+
+h5,.h5 {
+  font-size: 12px;
+}
+
+h6,.h6 {
+  font-size: 10px;
+}
+
+
+
+#navrow1, #navrow2, #navrow3, #navrow4, #navrow5{
+    border-bottom: 1px solid #706d6e;
+}
+
+.adjust-right {
+margin-left: 30px !important;
+font-size: 1.15em !important;
+}
+.navbar{
+ border: 0px solid #222 !important;
+}
+
+
+/* Sticky footer styles
+-------------------------------------------------- */
+html,
+body {
+    height: 100%;
+    /* The html and body elements cannot have any padding or margin. */
+}
+
+img {
+max-width:100%;
+max-height:100%;
+}
+
+/* Wrapper for page content to push down footer */
+#wrap {
+    min-height: 100%;
+    height: auto;
+    /* Negative indent footer by its height */
+    margin: 0 auto -60px;
+    /* Pad bottom by footer height */
+    padding: 0 0 60px;
+}
+
+/* Set the fixed height of the footer here */
+#footer {
+    font-size: 0.9em;
+    padding: 8px 0px;
+    background-color: #f5f5f5;
+}
+
+.footer-row {
+    line-height: 44px;
+}
+
+#footer > .container {
+    padding-left: 15px;
+    padding-right: 15px;
+}
+
+.footer-follow-icon {
+    margin-left: 3px;
+    text-decoration: none !important;
+}
+
+.footer-follow-icon img {
+    width: 20px;
+}
+
+.footer-link {
+    padding-top: 5px;
+    display: inline-block;
+    color: #999999;
+    text-decoration: none;
+}
+
+.footer-copyright {
+    text-align: center;
+}
+
+
+@media (min-width: 992px) {
+    .footer-row {
+        text-align: left;
+    }
+
+    .footer-icons {
+        text-align: right;
+    }
+}
+@media (max-width: 991px) {
+    .footer-row {
+        text-align: center;
+    }
+
+    .footer-icons {
+        text-align: center;
+    }
+}
+
+/* DOXYGEN Code Styles
+----------------------------------- */
+
+	
+div.ingroups {
+    font-size: 16pt;
+    width: 50%;
+    text-align: left;
+    padding-top: 10px;
+}
+
+a.qindex {
+    font-size:  8pt;
+}
+
+a.qindexHL {
+    font-size:  9pt;
+    font-weight: bold;
+    background-color: #9CAFD4;
+    color: #ffffff;
+    border: 1px double #869DCA;
+}
+
+.contents a.qindexHL:visited {
+    color: #ffffff;
+}
+
+a.code, a.code:visited, a.line, a.line:visited {
+    color: #4665A2;
+}
+
+a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {
+    color: #4665A2;
+}
+
+/* @end */
+
+dl.el {
+    margin-left: -1cm;
+}
+
+pre.fragment {
+    border: 1px solid #C4CFE5;
+    background-color: #FBFCFD;
+    padding: 4px 6px;
+    margin: 4px 8px 4px 2px;
+    overflow: auto;
+    word-wrap: break-word;
+    font-size:  8pt;
+    line-height: 125%;
+    font-family: monospace, fixed;
+}
+
+div.navtab {
+    text-align: left;
+    padding-left: 5px;
+    margin-right: 5px;
+}
+
+div.fragment {
+    padding: 4px 6px;
+    margin: 4px 8px 4px 2px;
+    border: 1px solid #C4CFE5;
+}
+
+div.line {
+    font-family: monospace, fixed;
+    font-size: 13px;
+    min-height: 13px;
+    line-height: 1.0;
+    text-wrap: unrestricted;
+    white-space: -moz-pre-wrap; /* Moz */
+    white-space: -pre-wrap;     /* Opera 4-6 */
+    white-space: -o-pre-wrap;   /* Opera 7 */
+    white-space: pre-wrap;      /* CSS3  */
+    word-wrap: break-word;      /* IE 5.5+ */
+    text-indent: -53px;
+    padding-left: 53px;
+    padding-bottom: 0px;
+    margin: 0px;
+    -webkit-transition-property: background-color, box-shadow;
+    -webkit-transition-duration: 0.5s;
+    -moz-transition-property: background-color, box-shadow;
+    -moz-transition-duration: 0.5s;
+    -ms-transition-property: background-color, box-shadow;
+    -ms-transition-duration: 0.5s;
+    -o-transition-property: background-color, box-shadow;
+    -o-transition-duration: 0.5s;
+    transition-property: background-color, box-shadow;
+    transition-duration: 0.5s;
+}
+
+div.line.glow {
+    background-color: cyan;
+    box-shadow: 0 0 10px cyan;
+}
+
+
+span.lineno {
+    padding-right: 4px;
+    text-align: right;
+    border-right: 2px solid #0F0;
+    background-color: #E8E8E8;
+    white-space: pre;
+}
+span.lineno a {
+    background-color: #D8D8D8;
+}
+
+span.lineno a:hover {
+    background-color: #C8C8C8;
+}
+
+div.groupHeader {
+    margin-left: 16px;
+    margin-top: 12px;
+    font-weight: bold;
+}
+
+div.groupText {
+    margin-left: 16px;
+    font-style: italic;
+}
+
+.caption {
+	font-weight: bold;
+	padding-top: 10px;
+	padding-bottom: 20px;
+}
+/* @group Code Colorization */
+
+span.keyword {
+    color: #008000
+}
+
+span.keywordtype {
+    color: #604020
+}
+
+span.keywordflow {
+    color: #e08000
+}
+
+span.comment {
+    color: #800000
+}
+
+span.preprocessor {
+    color: #806020
+}
+
+span.stringliteral {
+    color: #002080
+}
+
+span.charliteral {
+    color: #008080
+}
+
+span.vhdldigit {
+    color: #ff00ff
+}
+
+span.vhdlchar {
+    color: #000000
+}
+
+span.vhdlkeyword {
+    color: #700070
+}
+
+span.vhdllogic {
+    color: #ff0000
+}
+
+blockquote {
+    background-color: #F7F8FB;
+    border-left: 2px solid #9CAFD4;
+    margin: 0 24px 0 4px;
+    padding: 0 12px 0 16px;
+}
+
diff --git a/CrIa/doc/doxy-boot.js b/CrIa/doc/doxy-boot.js
new file mode 100644
index 0000000..7bcfc1d
--- /dev/null
+++ b/CrIa/doc/doxy-boot.js
@@ -0,0 +1,121 @@
+$( document ).ready(function() {
+
+    $("div.headertitle").addClass("page-header");
+    $("div.title").addClass("h1");
+
+    $('li > a[href="index.html"] > span').before("<i class='fa fa-cog'></i> ");
+    $('li > a[href="index.html"] > span').text("CHEOPS IASW");
+    $('li > a[href="modules.html"] > span').before("<i class='fa fa-square'></i> ");
+    $('li > a[href="namespaces.html"] > span').before("<i class='fa fa-bars'></i> ");
+    $('li > a[href="annotated.html"] > span').before("<i class='fa fa-list-ul'></i> ");
+    $('li > a[href="classes.html"] > span').before("<i class='fa fa-book'></i> ");
+    $('li > a[href="inherits.html"] > span').before("<i class='fa fa-sitemap'></i> ");
+    $('li > a[href="functions.html"] > span').before("<i class='fa fa-list'></i> ");
+    $('li > a[href="functions_func.html"] > span').before("<i class='fa fa-list'></i> ");
+    $('li > a[href="functions_vars.html"] > span').before("<i class='fa fa-list'></i> ");
+    $('li > a[href="functions_enum.html"] > span').before("<i class='fa fa-list'></i> ");
+    $('li > a[href="functions_eval.html"] > span').before("<i class='fa fa-list'></i> ");
+    $('img[src="ftv2ns.png"]').replaceWith('<span class="label label-danger">N</span> ');
+    $('img[src="ftv2cl.png"]').replaceWith('<span class="label label-danger">C</span> ');
+
+    $("ul.tablist").addClass("nav nav-pills nav-justified");
+    $("ul.tablist").css("margin-top", "0.5em");
+    $("ul.tablist").css("margin-bottom", "0.5em");
+    $("li.current").addClass("active");
+    $("iframe").attr("scrolling", "yes");
+
+    $("#nav-path > ul").addClass("breadcrumb");
+
+    $("table.params").addClass("table");
+    $("div.ingroups").wrapInner("<small></small>");
+    $("div.levels").css("margin", "0.5em");
+    $("div.levels > span").addClass("btn btn-default btn-xs");
+    $("div.levels > span").css("margin-right", "0.25em");
+
+    $("table.directory").addClass("table table-striped");
+    $("div.summary > a").addClass("btn btn-default btn-xs");
+    $("table.fieldtable").addClass("table");
+    $(".fragment").addClass("well");
+    $(".memitem").addClass("panel panel-default");
+    $(".memproto").addClass("panel-heading");
+    $(".memdoc").addClass("panel-body");
+    $("span.mlabel").addClass("label label-info");
+
+    $("table.memberdecls").addClass("table");
+    $("[class^=memitem]").addClass("active");
+
+    $("div.ah").addClass("btn btn-default");
+    $("span.mlabels").addClass("pull-right");
+    $("table.mlabels").css("width", "100%")
+    $("td.mlabels-right").addClass("pull-right");
+
+    $("div.ttc").addClass("panel panel-primary");
+    $("div.ttname").addClass("panel-heading");
+    $("div.ttname a").css("color", 'white');
+    $("div.ttdef,div.ttdoc,div.ttdeci").addClass("panel-body");
+
+    $('#MSearchBox').parent().remove();
+
+    $('div.fragment.well div.line:first').css('margin-top', '15px');
+    $('div.fragment.well div.line:last').css('margin-bottom', '15px');
+	
+	$('table.doxtable').removeClass('doxtable').addClass('table table-striped table-bordered').each(function(){
+		$(this).prepend('<thead></thead>');
+		$(this).find('tbody > tr:first').prependTo($(this).find('thead'));
+		
+		$(this).find('td > span.success').parent().addClass('success');
+		$(this).find('td > span.warning').parent().addClass('warning');
+		$(this).find('td > span.danger').parent().addClass('danger');
+	});
+	
+	
+
+    if($('div.fragment.well div.ttc').length > 0)
+    {
+        $('div.fragment.well div.line:first').parent().removeClass('fragment well');
+    }
+
+    $('table.memberdecls').find('.memItemRight').each(function(){
+        $(this).contents().appendTo($(this).siblings('.memItemLeft'));
+        $(this).siblings('.memItemLeft').attr('align', 'left');
+    });
+	
+	function getOriginalWidthOfImg(img_element) {
+		var t = new Image();
+		t.src = (img_element.getAttribute ? img_element.getAttribute("src") : false) || img_element.src;
+		return t.width;
+	}
+	
+	$('div.dyncontent').find('img').each(function(){
+		if(getOriginalWidthOfImg($(this)[0]) > $('#content>div.container').width())
+			$(this).css('width', '100%');
+	});
+	
+	$(".memitem").removeClass('memitem');
+    $(".memproto").removeClass('memproto');
+    $(".memdoc").removeClass('memdoc');
+	$("span.mlabel").removeClass('mlabel');
+	$("table.memberdecls").removeClass('memberdecls');
+    $("[class^=memitem]").removeClass('memitem');
+    $("span.mlabels").removeClass('mlabels');
+    $("table.mlabels").removeClass('mlabels');
+    $("td.mlabels-right").removeClass('mlabels-right');
+	$(".navpath").removeClass('navpath');
+	$("li.navelem").removeClass('navelem');
+	$("a.el").removeClass('el');
+	$("div.ah").removeClass('ah');
+	$("div.header").removeClass("header");
+	
+	$('.mdescLeft').each(function(){
+		if($(this).html()=="&nbsp;") {
+			$(this).siblings('.mdescRight').attr('colspan', 2);
+			$(this).remove();
+		}
+	});
+	$('td.memItemLeft').each(function(){
+		if($(this).siblings('.memItemRight').html()=="") {
+			$(this).attr('colspan', 2);
+			$(this).siblings('.memItemRight').remove();
+		}
+	});
+});
diff --git a/CrIa/doc/extradoc/mainpage.dox b/CrIa/doc/extradoc/mainpage.dox
new file mode 100644
index 0000000..9b001da
--- /dev/null
+++ b/CrIa/doc/extradoc/mainpage.dox
@@ -0,0 +1,66 @@
+/**
+
+@mainpage
+
+@section iaswdoc IASW Documentation
+
+The documentation of the IASW is provided in part externally and in part (especially the detailed design of the science data processing)
+through this Doxygen. If this is what you are interested in, <b>go to the <a href="modules.html">Modules</a> section</b>.
+
+@section sec_sources Source Code
+
+The source code may be found in the subdirectories _src_ and in the
+topmost level of the source tree. The src/Sdp subdirectory contains
+the data processing chain, which is linked in from the CompressionEntity,
+the stand-alone compression and de-compression application.
+
+@section sec_files Files
+
+The files and data structures can be browsed following these links: <a href="files.html">Files</a>, <a href="annotated.html">Data Structures</a>.
+
+@section sec_executable Compiling the Executable
+
+@subsection sec_build_prerequisites Prerequisites
+
+To build and run the executable, you need the following prerequisities:
+
+ - gnu make, gcc toolchain, sparc bcc toolchain (BCC 4.4.2 release 1.0.45)   
+
+ - CrFramework and FwProfile, included in the IFSW source tree
+
+@subsection sec_build Build
+
+The build process is simple:
+
+ - cd into the CrIa directory and "make".
+   If it's the first time, it is necessary to cd to FwProfile and "make" this one first.
+
+This creates an executable for the DPU, a SREC file for upload and it also builds the CrIa executable for the PC. -- Have fun.
+
+@section iaswcopyright Copyright
+
+This application has been developed for the ESA mission CHEOPS. It was enabled by funding through the ESA-PRODEX contract C4000112123.
+
+@subsection iaswlic License
+This program is free software; you can redistribute it and/or modify it
+under the terms and conditions of the GNU General Public License,
+version 2, as published by the Free Software Foundation.
+
+This program is distributed in the hope 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.
+
+@subsection iaswauthors Credits
+
+\par University of Vienna
+Franz Kerschbaum (management), Roland Ottensamer (technical lead), Roman Ferstl,
+Philipp Löschl, Armin Luntzer, Christian Reimers
+
+\par PnP Software GmbH
+Alessandro Pasetti, Vaclav Cechticky, Marcel Opprecht
+
+
+Thanks to University of Bern and ESA for all the support.
+
+*/
diff --git a/CrIa/doc/footer.html b/CrIa/doc/footer.html
new file mode 100644
index 0000000..f2fa204
--- /dev/null
+++ b/CrIa/doc/footer.html
@@ -0,0 +1,26 @@
+<!-- HTML footer for doxygen 1.8.8-->
+<!-- start footer part -->
+<!--BEGIN GENERATE_TREEVIEW-->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    $navpath
+    <li class="footer">$generatedby
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="$relpath^doxygen.png" alt="doxygen"/></a> $doxygenversion </li>
+  </ul>
+</div>
+<!--END GENERATE_TREEVIEW-->
+</div>
+</div>
+</div>
+</div>
+</div>
+<!--BEGIN !GENERATE_TREEVIEW-->
+<hr class="footer"/><address class="footer"><small>
+$generatedby &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="$relpath^doxygen.png" alt="doxygen"/>
+</a> $doxygenversion
+</small></address>
+<!--END !GENERATE_TREEVIEW-->
+</body>
+</html>
diff --git a/CrIa/doc/header.html b/CrIa/doc/header.html
new file mode 100644
index 0000000..d4b85eb
--- /dev/null
+++ b/CrIa/doc/header.html
@@ -0,0 +1,47 @@
+<!-- HTML header for doxygen 1.8.8-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <meta http-equiv="X-UA-Compatible" content="IE=edge">
+        <!-- For Mobile Devices -->
+        <meta name="viewport" content="width=device-width, initial-scale=1">
+
+        <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+        <meta name="generator" content="Doxygen $doxygenversion"/>
+
+        <script type="text/javascript" src="jquery.js"></script>
+
+        <!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
+        <!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
+        <!--<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>-->
+        <script type="text/javascript" src="$relpath^dynsections.js"></script>
+        $treeview
+        $search
+        $mathjax
+        <link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
+
+	<link rel="stylesheet" href="$relpath^bootstrap.min.css">
+
+	$extrastylesheet
+
+        <script src="$relpath^bootstrap.min.js"></script>
+        <script type="text/javascript" src="$relpath^doxy-boot.js"></script>
+    </head>
+    <body>
+
+        <nav class="navbar navbar-default" role="navigation">
+            <div class="container">
+                <div class="navbar-header">
+			<a class="navbar-brand">
+				<img alt="Logo" align="left" style="margin-right: 1em;" src=$projectlogo/>
+				$projectname $projectnumber</a>
+                </div>
+            </div>
+        </nav>
+        <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+            <div class="content" id="content">
+                <div class="container">
+                    <div class="row">
+                        <div class="col-sm-12 panel panel-default" style="padding-bottom: 15px;">
+                            <div style="margin-bottom: 15px;">
+<!-- end header part -->
diff --git a/CrIa/doc/images/Interlopers_1.png b/CrIa/doc/images/Interlopers_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..0a1c70a8d85c8300d9a12a8c4d9372087c292090
GIT binary patch
literal 80000
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
N6y;Q8i=~Zy{|~_zJ0$=B

literal 0
HcmV?d00001

diff --git a/CrIa/doc/images/Interlopers_2.png b/CrIa/doc/images/Interlopers_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..21ebfc7c4046818882fe9e129da4257e1b15d389
GIT binary patch
literal 80633
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
Hv!MS2rysLG

literal 0
HcmV?d00001

diff --git a/CrIa/doc/images/cheops-logo-with-additional3.png b/CrIa/doc/images/cheops-logo-with-additional3.png
new file mode 100644
index 0000000000000000000000000000000000000000..20e1b7978b60d6a269645f9fc35a4abb07c6107a
GIT binary patch
literal 11478
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

literal 0
HcmV?d00001

diff --git a/CrIa/doc/images/fingerprint.png b/CrIa/doc/images/fingerprint.png
new file mode 100644
index 0000000000000000000000000000000000000000..7c88d4f89fd3f254c8dfb3dcae95f91dced5c6c3
GIT binary patch
literal 78579
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
LceCz1e*M1ygKfo5

literal 0
HcmV?d00001

diff --git a/CrIa/doc/images/obsDB_fingerprint.png b/CrIa/doc/images/obsDB_fingerprint.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ea66a6ebdeddc4e949292354928943e3225b669
GIT binary patch
literal 97604
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

literal 0
HcmV?d00001

diff --git a/CrIa/doc/images/radius_photometry_real_psf_shape.png b/CrIa/doc/images/radius_photometry_real_psf_shape.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f9c66728ab7a45492a3fb3d28e70620ffc24139
GIT binary patch
literal 68634
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
JY4gd>e*zcE{yYEx

literal 0
HcmV?d00001

diff --git a/CrIa/doc/images/radius_photometry_real_psf_signal.png b/CrIa/doc/images/radius_photometry_real_psf_signal.png
new file mode 100644
index 0000000000000000000000000000000000000000..ee594a8c868bc265e3fcef27328715952d24ca6f
GIT binary patch
literal 55784
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
CnAlkW

literal 0
HcmV?d00001

diff --git a/CrIa/doc/images/radius_photometry_sim_psf.png b/CrIa/doc/images/radius_photometry_sim_psf.png
new file mode 100644
index 0000000000000000000000000000000000000000..0efc701cbe91ebd083ce92a59559730949e996d7
GIT binary patch
literal 56983
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
IefG-#18)G0y#N3J

literal 0
HcmV?d00001

diff --git a/CrIa/doc/images/star_extraction_process.png b/CrIa/doc/images/star_extraction_process.png
new file mode 100644
index 0000000000000000000000000000000000000000..4ad19c971d36138ae3425e2885c0120b3262a811
GIT binary patch
literal 108144
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
StH_%Spth#|=EUzTkN+PLZ`FYS

literal 0
HcmV?d00001

diff --git a/CrIa/ifsw.c b/CrIa/ifsw.c
new file mode 100644
index 0000000..c45d02b
--- /dev/null
+++ b/CrIa/ifsw.c
@@ -0,0 +1,334 @@
+/**
+ * @file    ifsw.c
+ * @ingroup IASW
+ * @author  Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @date    August, 2016
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ *
+ * @defgroup IASW Instrument Application Software
+ * 
+ * @brief various functions to initialize and manage buffers related with the
+ *        science data processing
+ *
+ * ## IASW
+ *
+ * The application is made of several (more or less) independent software components. 
+ * Each of them have their own design, some of which is provided as external documents.
+ * - The IASW design specification is given by the "CHEOPS IASW Specification", CHEOPS-PNP-INST-RS-001.
+ *
+ * - An overview of the Science Data Processing (@ref Sdp) architectural design is given by "CHEOPS SDP Architectural Design", CHEOPS-UVIE-DD-001
+ *   and the details are found here in the Doxygen.
+ *
+ * - The IBSW design specification is given by "CHEOPS IBSW Architectural Design", CHEOPS-UVIE-DD-001.
+ *   At present, the IBSW has its own Doxygen tree with the detailed design.
+ *   Its inclusion in here is TBC.
+ *
+ * - The design of the TargetAcquisition function is contained in "CHEOPS IFSW Engineering Algorithms", CHEOPS-UVIE-INST-TN-008.
+ *   The detailed design is also to be included here in the Doxygen (TBD).
+ *
+ * - The design of the Centroiding Algorithm is given in "Optimized Centroiding of Stars for Space Applications", R. Ferstl, 
+ *   Master Thesis, UVIE 2016, http://othes.univie.ac.at/41269/.
+ *   The detailed design is also to be included in this Doxygen (TBD).
+ *
+ */
+
+
+#include <stdio.h>
+
+#include <io.h>
+#include <asm/leon.h>
+#include <leon/leon_reg.h>
+
+#include <ibsw.h>
+#include <event_report.h>
+#include <wrap_malloc.h>
+#include <errno.h>
+#include <stdint.h>
+#include <event_report.h>
+#include <iwf_fpga.h>
+#include <memcfg.h>
+#include <leon3_dsu.h>
+#include <traps.h>
+
+#include <ScienceDataProcessing.h>
+#include <EngineeringAlgorithms.h>
+#include <TargetAcquisition.h>
+#include "Services/General/CrIaConstants.h"
+#include "ifsw.h"
+#include "IfswDebug.h"
+
+#include <CrIaIasw.h>
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#ifndef PC_TARGET
+#include <FwSmCore.h>
+#include "../IBSW/include/ibsw_interface.h"
+#endif
+
+extern struct ibsw_config ibsw_cfg;
+
+extern unsigned char __BUILD_ID;
+
+static uint32_t notifCounter[N_RT_CONT];
+
+
+#define CPU_0_STACK_BASE SRAM1_CPU_0_STACK_BASE
+#define CPU_1_STACK_BASE SRAM1_CPU_1_STACK_BASE
+
+
+/* configure cpu1 entry to trap table */
+
+void cpu1_setup_entry()
+{
+	uint32_t tmp;
+
+
+	dsu_set_noforce_debug_mode(1);
+	dsu_set_cpu_break_on_iu_watchpoint(1);
+
+	dsu_set_force_debug_on_watchpoint(1);
+
+	/* set trap base register to be the same as on CPU0 and point
+	 * %pc and %npc there
+	 */
+	tmp = dsu_get_reg_tbr(0) & ~0xfff;
+
+	dsu_set_reg_tbr(1, tmp);
+	dsu_set_reg_pc(1, tmp);
+	dsu_set_reg_npc(1, tmp + 0x4);
+
+	dsu_clear_iu_reg_file(1);
+
+	/* self-referrring stackframe */
+	dsu_set_reg_sp(1, 1, SRAM1_CPU_1_STACK_BASE);
+	dsu_set_reg_fp(1, 1, SRAM1_CPU_1_STACK_BASE);
+
+	/* default invalid mask */
+	dsu_set_reg_wim(1, 0x2);
+
+	/* set CWP to 7 */
+	dsu_set_reg_psr(1, 0xf34010e1);
+
+	dsu_clear_cpu_break_on_iu_watchpoint(1);
+	/* resume cpu 1 */
+	dsu_clear_force_debug_on_watchpoint(1);
+	
+	/* 
+	   NOTE: the NS bit of FSR is set in the main for core 0
+	   as well as for core 1 
+	*/
+}
+
+
+/* wake a cpu by writing to the multiprocessor status register */
+void cpu_wake(uint32_t cpu_id)
+{
+	iowrite32be(cpu_id, (uint32_t *) 0x80000210);
+}
+
+
+unsigned short cpu1_notification(unsigned short action)
+{  
+  unsigned int rt_idx;
+  unsigned short event_data[2];
+  unsigned short status;
+  
+  CrIaCopy(CPU2PROCSTATUS_ID, &status);  
+
+  MPDEBUGP("NOTIF: status is %d and action is %d\n", status, action);
+
+  rt_idx = RTCONT_CMPR - 1;
+  if (action == SDP_STATUS_ACQUISITION)
+    {
+      rt_idx = RTCONT_ACQ - 1;
+    }
+
+  /* Mantis 1603 */
+  
+  /* Second CPU is idle, notification can be processed */
+  if (status == SDP_STATUS_IDLE)
+    {
+      notifCounter[rt_idx] = 0;
+      status = action;
+      CrIaPaste(CPU2PROCSTATUS_ID, &status); 
+      cpu_wake(0x2);
+      return 0;
+    }
+  
+  /* Second CPU is locked by the one operation and notification
+     is for the same container --> overrun situation! */
+  if (status == action)
+    {      
+      notifCounter[rt_idx]++;
+      event_data[0] = rt_idx + 1;
+      event_data[1] = (unsigned short) notifCounter[rt_idx];
+      CrIaEvtRaise(CRIA_SERV5_EVT_ERR_HIGH_SEV, CRIA_SERV5_EVT_NOTIF_ERR, event_data, 4);
+      return status;
+    }
+ 
+  /* if we get here, then status != action, but CPU2 is busy. This means, that
+     the notification does not need to be processed, e.g. we are doing compression and get a later-phased 
+     acquisition notification */
+
+  return 0;
+}
+
+
+void run_acquisition(void)
+{  
+  TargetAcquisition(&outgoingSibInStruct);
+  
+  return;
+}
+
+
+void run_compression(void)
+{ 
+  ScienceProcessing();
+ 
+  return;
+}
+
+
+/* cpu 1 main loop */
+void dataproc_mainloop(void)
+{
+  unsigned char core1load;
+  unsigned short action;
+  __attribute__((unused)) register int sp asm ("%sp");
+  __attribute__((unused)) uint32_t cnt = 0;
+
+ 
+  while (1)
+    {    
+      leon3_powerdown_safe(0x40000000);
+      
+      CrIaCopy(CPU2PROCSTATUS_ID, &action);
+      
+      /* report 100% CPU 1 */
+      core1load = 100;
+      CrIaPaste(CORE1LOAD_ID, &core1load); 
+      
+      MPDEBUGP("CPU1: poked %d %x op: %d\n", cnt++, sp, action);
+
+      if (action == SDP_STATUS_ACQUISITION)
+	{	  	  
+	  MPDEBUGP("carrying out acquisition...\n");
+#ifdef PC_TARGET
+	  TargetAcquisition(&outgoingSibInStruct);
+#else
+	  FwSmExecute(smDescAlgoAcq1);
+	  /* run_rt(RTCONT_ACQ, DEADLINE_ACQ, run_acquisition); */
+#endif	  
+	}     
+     
+      if (action == SDP_STATUS_SCIENCE)
+	{	  
+	  MPDEBUGP("carrying out science...\n");
+#ifdef PC_TARGET
+	  ScienceProcessing();
+#else
+	  FwSmExecute(smDescAlgoCmpr);
+#endif
+	}
+
+      action = SDP_STATUS_IDLE; 
+      CrIaPaste(CPU2PROCSTATUS_ID, &action);
+
+      /* report 0% CPU 1 load */
+      core1load = 0;
+      CrIaPaste(CORE1LOAD_ID, &core1load); 
+    }
+
+  /* never reached */
+}
+
+
+int main()
+{
+  static uint32_t cpu1_ready;
+  
+  leon3_flush();
+  leon3_enable_icache();
+  leon3_enable_dcache();
+  leon3_enable_fault_tolerant();
+  leon3_enable_snooping();
+  
+  if(leon3_cpuid() == 0)
+    {    
+      /* self-referring stackframe */
+      leon_set_fp(CPU_0_STACK_BASE);
+      leon_set_sp(CPU_0_STACK_BASE);
+
+      memcfg_configure_sram_flash_access();
+
+      fpga_mem_ctrl_sram_flash_set_enabled();
+
+      cpu1_setup_entry();
+
+      /* NOTE: We do not set the NS bit of the FPU for the first core,
+	 because we want to handle the trap. */
+      
+      /* write to MP status register and wait for CPU 1 to start */
+      cpu_wake(0x2);
+      while (!ioread32be(&cpu1_ready));
+
+      if(ibsw_init(&ibsw_cfg))
+	{
+	  event_report(INIT, HIGH, (uint32_t) errno);
+	  CrIbResetDPU(DBS_EXCHANGE_RESET_TYPE_UN);
+	}
+
+      event_report(INIT, NORMAL, 0);
+
+      ibsw_mainloop(&ibsw_cfg);
+    }
+  else
+    {        
+      /* ignore access exception traps (usually edac doublefaults) on cpu 1 */
+      /* NOTE: on cpu 0 the trap handler is set up in ibsw_init by ibsw_configure_edac. */
+      trap_handler_install(0x9, data_access_exception_trap_ignore); /* EDAC */
+
+      /* we also install the handler for the FPE, even if we disable them hereafter */
+      trap_handler_install(0x8, floating_point_exception_trap);
+
+      /* Upon startup, the FPU of the second core has random initial values,
+	 including the FSR. Here we set the CPU 1 FSR such as to disable 
+	 all FPU traps. 
+	 
+	 0x0F800000 ... enable all FP exceptions (except NS)
+	 0x08000000 ... operand error (NV)
+	 0x06000000 ... rounding errors (OF + UF)
+	 0x01000000 ... division by zero and invalid * sqrt(0) (DZ)
+	 0x00800000 ... inexact result (NX)
+	 
+	 0x00400000 ... NS bit
+      */
+      {
+	volatile uint32_t initval = 0x00400000; 
+
+	/* NOTE: load fsr means write to it */
+	__asm__ __volatile__("ld [%0], %%fsr \n\t"
+			     ::"r"(&initval));
+      }
+
+      /* signal ready */
+      iowrite32be(0x1, &cpu1_ready);
+
+      dataproc_mainloop();
+    }
+   
+  return 0;
+}
+    
diff --git a/CrIa/ifsw.h b/CrIa/ifsw.h
new file mode 100644
index 0000000..0e39482
--- /dev/null
+++ b/CrIa/ifsw.h
@@ -0,0 +1,27 @@
+#ifndef IFSW_H
+#define IFSW_H
+
+#include <stdint.h>
+
+#define CUSTOM_STACK 1
+
+#define CPU_0_STACK_BASE SRAM1_CPU_0_STACK_BASE
+#define CPU_1_STACK_BASE SRAM1_CPU_1_STACK_BASE
+
+
+
+/* configure cpu1 entry to trap table from SRAM addr 0x0 */
+void cpu1_setup_entry();
+
+void cpu_wake(uint32_t cpu_id);
+
+unsigned short cpu1_notification(unsigned short action);
+
+void run_acquisition(void);
+
+void run_compression(void);
+
+/* cpu 1 main loop */
+void dataproc_mainloop(void);
+
+#endif
diff --git a/CrIa/src/CrConfigIa/CrFwAppSmUserPar.h b/CrIa/src/CrConfigIa/CrFwAppSmUserPar.h
new file mode 100644
index 0000000..742b76c
--- /dev/null
+++ b/CrIa/src/CrConfigIa/CrFwAppSmUserPar.h
@@ -0,0 +1,54 @@
+/**
+ * @file CrFwAppSmUserPar.h
+ * @ingroup CrIaDemo
+ *
+ * Parameters for the Application State Machine for the IASW Application.
+ *
+ * \see CrFwAppSm.h
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH, 2014
+ */
+
+#ifndef CRFW_APPSM_USERPAR_H_
+#define CRFW_APPSM_USERPAR_H_
+
+#include "CrIaAppSm.h"
+
+/**
+ * The pointer to the state machine embedded in state START-UP.  The value of
+ * this constant must be either NULL (if no state machine is embedded in
+ * START-UP) or a pointer of type FwSmDesc_t.
+ *
+ * The default value for this adaptation point is NULL.
+ */
+#define CR_FW_APPSM_STARTUP_ESM NULL
+
+/**
+ * The pointer to the state machine embedded in state NORMAL.  The value of
+ * this constant must be either NULL (if no state machine is embedded in
+ * NORMAL) or a pointer of type FwSmDesc_t.
+ *
+ * The default value for this adaptation point is NULL.
+ */
+#define CR_FW_APPSM_NORMAL_ESM CrIaAppSmGetModesEsm()
+
+/**
+ * The pointer to the state machine embedded in state RESET.  The value of this
+ * constant must be either NULL (if no state machine is embedded in RESET) or a
+ * pointer of type FwSmDesc_t.
+ *
+ * The default value for this adaptation point is NULL.
+ */
+#define CR_FW_APPSM_RESET_ESM NULL
+
+/**
+ * The pointer to the state machine embedded in state SHUTDOWN.  The value of
+ * this constant must be either NULL (if no state machine is embedded in
+ * SHUTDOWN) or a pointer of type FwSmDesc_t.
+ *
+ * The default value for this adaptation point is NULL.
+ */
+#define CR_FW_APPSM_SHUTDOWN_ESM NULL
+
+#endif /* CRFW_APPSM_USERPAR_H_ */
diff --git a/CrIa/src/CrConfigIa/CrFwCmpData.h b/CrIa/src/CrConfigIa/CrFwCmpData.h
new file mode 100644
index 0000000..4cfdd37
--- /dev/null
+++ b/CrIa/src/CrConfigIa/CrFwCmpData.h
@@ -0,0 +1,110 @@
+/**
+ * @file CrFwCmpData.h
+ * @ingroup CrIaDemo
+ *
+ * Definition of the Framework Component Data (FCD) Type.
+ *
+ * Each Framework Component has one instance of a FCD.  This data structure is
+ * used to exchange input and output data with the actions and guards of the
+ * framework components.
+ *
+ * An instance of this data structure is attached to each state machine
+ * descriptor (using function FwSmSetData) and to each procedure descriptor
+ * (using function FwPrsetData) used in the framework.
+ *
+ * The state machines and procedures which belong to the same Framework
+ * Component share the same FCD instance.
+ *
+ * All the framework components are derived from the Base Component of
+ * CrFwBaseCmp.h.  Hence, a framework component needs two sets of data: the
+ * base data which are the data needed by the functions defined on the Base
+ * Component and the derived data which are the data needed by the functions
+ * defined on the derived component.
+ *
+ * The FCD Type is accordingly split into two parts: one part defining the base
+ * data and another part defining the derived data.
+ *
+ * Framework users may have to modify the definition of the FCD Type if they
+ * wish to introduce new components which are derived from the Base Component
+ * (see detailed description of ::CrFwCmpData_t type).
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH
+ */
+
+#ifndef CRFW_COMPDATA_H_
+#define CRFW_COMPDATA_H_
+
+#include "CrFwUserConstants.h"
+#include <FwPrConstants.h>
+
+/**
+ * Type for the Framework Component Data (FCD).
+ *
+ * The FCD Type is defined as a structure with a number of fixed fields and one
+ * open "component-specific" field (a pointer to void).
+ *
+ * The fixed fields define the base data of the FCD (i.e. the data which are
+ * used by the Base Component part of a Framework Component).
+ *
+ * The component-specific field can be used for additional data which are
+ * specific to each type of component derived from the Base Component.
+ *
+ * As an example, consider the case of an OutStream framework component (see
+ * CrFwOutStream.h).  The fixed fields in the FCD type cover the part of the
+ * OutStream data which is inherited from the Base Component.  The
+ * cmpSpecificData field covers the data which are specific to the OutStream
+ * type.
+ *
+ * The content of the cmpSpecificData must be cast to the appropriate type
+ * depending on the type of component which is being manipulated.  Thus, for
+ * instance, in the case of OutStream component, the cmpSpecificData field must
+ * be cast to a pointer of type: ::CrFwOutStreamData_t.  The component-specific
+ * data types are defined in CrFwConstants.h.
+ *
+ * This type is user-configurable to cover the case where an application
+ * developer needs additional data to be attached to the component instances.
+ */
+typedef struct CrFwCmpData {
+	/**
+	 * The instance identifier of the framework component.
+	 */
+	CrFwInstanceId_t instanceId;
+	/**
+	 * The type identifier of the framework component.
+	 */
+	CrFwTypeId_t typeId;
+	/**
+	 * The outcome of an action or check executed by a state machine or by one of
+	 * its procedures.
+	 *
+	 * In many cases, an action or a check have an outcome.  This is a generic
+	 * field where that outcome can be stored.
+	 *
+	 * Module CrFwUtilityFunctions.h defines convenience functions which check
+	 * whether the outcome is equal to a certain value.
+	 *
+	 * Where the logical outcome is either "success" or "failure", the value of
+	 * '1' is used to represent "success" and the value of '0' is used to
+	 * represent "failure".
+	 */
+	CrFwOutcome_t outcome;
+	/**
+	 * The Component Initialization Procedure (CIP) (see CrFwInitProc.h).
+	 */
+	FwPrDesc_t initProc;
+	/**
+	 * The Component Reset Procedure (CRP) (see CrFwResetProc.h).
+	 */
+	FwPrDesc_t resetProc;
+	/**
+	 * The Component Execution Procedure (CEP) (see CrFwBaseCmp.h).
+	 */
+	FwPrDesc_t execProc;
+	/**
+	 * Derived data which are specific to each type of framework component.
+	 */
+	void* cmpSpecificData;
+} CrFwCmpData_t;
+
+#endif /* CRFW_COMPDATA_H_ */
diff --git a/CrIa/src/CrConfigIa/CrFwInFactoryUserPar.h b/CrIa/src/CrConfigIa/CrFwInFactoryUserPar.h
new file mode 100644
index 0000000..8b41fe1
--- /dev/null
+++ b/CrIa/src/CrConfigIa/CrFwInFactoryUserPar.h
@@ -0,0 +1,237 @@
+/**
+ * @file CrFwInFactoryUserPar.h
+ * @ingroup CrIaConfig
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief User-modifiable parameters for the InFactory component of the IASW application.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#ifndef CRFW_IN_FACTORY_USER_PAR_H
+#define CRFW_IN_FACTORY_USER_PAR_H
+
+#include <Services/General/CrIaConstants.h>
+#include <Services/General/CrSemConstants.h>
+#include <CrFwConstants.h>
+#include <UtilityFunctions/CrFwUtilityFunctions.h>
+#include <CrIaInCmp.h>
+
+#include <Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3DefineHkDr.h>
+#include <Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3ClrHkDr.h>
+#include <Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3EnbHkDrGen.h>
+#include <Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3DisHkDrGen.h>
+#include <Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3SetHkRepFreq.h>
+
+#include <Services/CrIaServ5EventReportingService/InCmd/CrIaServ5EnbEvtRepGen.h>
+#include <Services/CrIaServ5EventReportingService/InCmd/CrIaServ5DisEvtRepGen.h>
+
+#include <Services/CrIaServ6MemoryManagementService/InCmd/CrIaServ6LoadMem.h>
+#include <Services/CrIaServ6MemoryManagementService/InCmd/CrIaServ6DumpMem.h>
+
+#include <Services/CrIaServ13LargeDataTransferService/InCmd/CrIaServ13AbrtDwlk.h>
+#include <Services/CrIaServ13LargeDataTransferService/InCmd/CrIaServ13TrgLrgDataTsfr.h>
+
+#include <Services/CrIaServ17TestService/InCmd/CrIaServ17PerfConnTest.h>
+
+#include <Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobEnbFdChk.h>
+#include <Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobDisFdChk.h>
+#include <Services/CrIaServ191FDIRService/InCmd/CrIaServ191EnbFdChk.h>
+#include <Services/CrIaServ191FDIRService/InCmd/CrIaServ191DisFdChk.h>
+#include <Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobEnbRecovProc.h>
+#include <Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobDisRecovProc.h>
+#include <Services/CrIaServ191FDIRService/InCmd/CrIaServ191EnbRecovProc.h>
+#include <Services/CrIaServ191FDIRService/InCmd/CrIaServ191DisRecovProc.h>
+
+#include <Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192SwchOnSem.h>
+#include <Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192SwchOffSem.h>
+#include <Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoStab.h>
+#include <Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoStby.h>
+#include <Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoCcdWin.h>
+#include <Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoCcdFull.h>
+#include <Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoDiag.h>
+#include <Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192AbortDiag.h>
+#include <Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoSafe.h>
+
+#include <Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193PrepareSci.h>
+#include <Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StartSci.h>
+#include <Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StopScience.h>
+#include <Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StopSem.h>
+#include <Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StartOfflineOper.h>
+#include <Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193SwitchOffIasw.h>
+
+#include <Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194StartAlgo.h>
+#include <Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194StopAlgo.h>
+#include <Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194SusAlgo.h>
+#include <Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194ResAlgo.h>
+
+#include <Services/CrIaServ196AOCSService/InCmd/CrIaServ196StarMapCmd.h>
+
+#include <Services/CrIaServ197BootReportService/InCmd/CrIaServ197RepBoot.h>
+
+#include <Services/CrIaServ198ProcedureControlService/InCmd/CrIaServ198ProcStart.h>
+#include <Services/CrIaServ198ProcedureControlService/InCmd/CrIaServ198ProcStop.h>
+
+#include <Services/CrIaServ210BootManagementService/InCmd/CrIaServ210EnbWdog.h>
+#include <Services/CrIaServ210BootManagementService/InCmd/CrIaServ210DisWdog.h>
+#include <Services/CrIaServ210BootManagementService/InCmd/CrIaServ210ResetDpu.h>
+
+#include <Services/CrIaServ211ParameterUpdateService/InCmd/CrIaServ211UpdatePar.h>
+
+/* SEM InRep Services */
+
+#include <Services/CrSemServ1CommandVerificationService/InRep/CrSemServ1ComVerif.h>
+#include <Services/CrSemServ3HousekeepingDataReportingService/InRep/CrSemServ3DatHk.h>
+#include <Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtNorm.h>
+#include <Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrLowSev.h>
+#include <Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrMedSev.h>
+/*#include <Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrHighSev.h>*/ /* NOT USED by SEM */
+#include <Services/CrSemServ21ScienceDataService/InRep/CrSemServ21DatCcdWindow.h>
+#include <Services/CrSemServ220PrivateService220/InRep/CrSemServ220DatFunctParam.h>
+#include <Services/CrSemServ220PrivateService220/InRep/CrSemServ220DatOperParam.h>
+#include <Services/CrSemServ222PrivateService222/InRep/CrSemServ222DatTestLog.h>
+
+/**
+ * The maximum number of components representing an in-coming command packet which may be allocated at any one time.
+ * This constant must be a positive integer smaller than the range of CrFwInFactoryPoolIndex_t.
+ */
+#define CR_FW_INFACTORY_MAX_NOF_INCMD 6 /* same as in PCRL size */
+
+/**
+ * Definition of the in-coming command packet kinds supported by the application.
+ */
+#define CR_FW_INCMD_INIT_KIND_DESC\
+	{\
+{CRIA_SERV3,   CRIA_SERV3_DEFINE_HK_DR,           0, &CrIaServ3DefineHkDrValidityCheck,   &CrFwSmCheckAlwaysTrue, &CrIaServ3DefineHkDrStartAction,         &CrIaServ3DefineHkDrProgressAction,         &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV3,   CRIA_SERV3_CLR_HK_DR,              0, &CrIaServ3ClrHkDrValidityCheck,      &CrFwSmCheckAlwaysTrue, &CrIaServ3ClrHkDrStartAction,            &CrIaServ3ClrHkDrProgressAction,            &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV3,   CRIA_SERV3_ENB_HK_DR_GEN,          0, &CrIaServ3EnbHkDrGenValidityCheck,   &CrFwSmCheckAlwaysTrue, &CrIaServ3EnbHkDrGenStartAction,         &CrIaServ3EnbHkDrGenProgressAction,         &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV3,   CRIA_SERV3_DIS_HK_DR_GEN,          0, &CrIaServ3DisHkDrGenValidityCheck,   &CrFwSmCheckAlwaysTrue, &CrIaServ3DisHkDrGenStartAction,         &CrIaServ3DisHkDrGenProgressAction,         &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV3,   CRIA_SERV3_SET_HK_REP_FREQ,        0, &CrIaServ3SetHkRepFreqValidityCheck, &CrFwSmCheckAlwaysTrue, &CrIaServ3SetHkRepFreqStartAction,       &CrIaServ3SetHkRepFreqProgressAction,       &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV5,   CRIA_SERV5_ENB_EVT_REP_GEN,        0, &CrIaServ5EnbEvtRepGenValidityCheck, &CrFwSmCheckAlwaysTrue, &CrIaServ5EnbEvtRepGenStartAction,       &CrIaServ5EnbEvtRepGenProgressAction,       &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV5,   CRIA_SERV5_DIS_EVT_REP_GEN,        0, &CrIaServ5DisEvtRepGenValidityCheck, &CrFwSmCheckAlwaysTrue, &CrIaServ5DisEvtRepGenStartAction,       &CrIaServ5DisEvtRepGenProgressAction,       &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV6,   CRIA_SERV6_LOAD_MEM,               0, &CrIaServ6LoadMemValidityCheck,      &CrFwSmCheckAlwaysTrue, &CrIaServ6LoadMemStartAction,            &CrIaServ6LoadMemProgressAction,            &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV6,   CRIA_SERV6_DUMP_MEM,               0, &CrIaServ6DumpMemValidityCheck,      &CrFwSmCheckAlwaysTrue, &CrIaServ6DumpMemStartAction,            &CrIaServ6DumpMemProgressAction,            &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV13,  CRIA_SERV13_ABRT_DWLK,             0, &CrIaServ13AbrtDwlkValidityCheck,    &CrFwSmCheckAlwaysTrue, &CrIaServ13AbrtDwlkStartAction,          &CrIaServ13AbrtDwlkProgressAction,          &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV13,  CRIA_SERV13_TRG_LRG_DATA_TSFR,     0, &CrIaServ13TrgLrgDataTsfrValidityCheck, &CrFwSmCheckAlwaysTrue, &CrIaServ13TrgLrgDataTsfrStartAction, &CrIaServ13TrgLrgDataTsfrProgressAction,    &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV17,  CRIA_SERV17_PERF_CONN_TEST,        0, &CrIaInCmdValidityCheck,             &CrFwSmCheckAlwaysTrue, &CrIaServ17PerfConnTestStartAction,      &CrIaServ17PerfConnTestProgressAction,      &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV191, CRIA_SERV191_GLOB_ENB_FD_CHK,      0, &CrIaInCmdValidityCheck,             &CrFwSmCheckAlwaysTrue, &CrIaServ191GlobEnbFdChkStartAction,     &CrIaServ191GlobEnbFdChkProgressAction,     &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV191, CRIA_SERV191_GLOB_DIS_FD_CHK,      0, &CrIaInCmdValidityCheck,             &CrFwSmCheckAlwaysTrue, &CrIaServ191GlobDisFdChkStartAction,     &CrIaServ191GlobDisFdChkProgressAction,     &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV191, CRIA_SERV191_ENB_FD_CHK,           0, &CrIaServ191EnbFdChkValidityCheck,   &CrFwSmCheckAlwaysTrue, &CrIaServ191EnbFdChkStartAction,         &CrIaServ191EnbFdChkProgressAction,         &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV191, CRIA_SERV191_DIS_FD_CHK,           0, &CrIaServ191DisFdChkValidityCheck,   &CrFwSmCheckAlwaysTrue, &CrIaServ191DisFdChkStartAction,         &CrIaServ191DisFdChkProgressAction,         &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV191, CRIA_SERV191_GLOB_ENB_RECOV_PROC,  0, &CrIaInCmdValidityCheck,             &CrFwSmCheckAlwaysTrue, &CrIaServ191GlobEnbRecovProcStartAction, &CrIaServ191GlobEnbRecovProcProgressAction, &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV191, CRIA_SERV191_GLOB_DIS_RECOV_PROC,  0, &CrIaInCmdValidityCheck,             &CrFwSmCheckAlwaysTrue, &CrIaServ191GlobDisRecovProcStartAction, &CrIaServ191GlobDisRecovProcProgressAction, &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV191, CRIA_SERV191_ENB_RECOV_PROC,       0, &CrIaServ191EnbRecovProcValidityCheck, &CrFwSmCheckAlwaysTrue, &CrIaServ191EnbRecovProcStartAction,    &CrIaServ191EnbRecovProcProgressAction,     &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV191, CRIA_SERV191_DIS_RECOV_PROC,       0, &CrIaServ191DisRecovProcValidityCheck, &CrFwSmCheckAlwaysTrue, &CrIaServ191DisRecovProcStartAction,    &CrIaServ191DisRecovProcProgressAction,     &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV192, CRIA_SERV192_SWCH_ON_SEM,          0, &CrIaInCmdValidityCheck,              &CrFwSmCheckAlwaysTrue, &CrIaServ192SwchOnSemStartAction,        &CrIaServ192SwchOnSemProgressAction,        &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV192, CRIA_SERV192_SWCH_OFF_SEM,         0, &CrIaInCmdValidityCheck,              &CrFwSmCheckAlwaysTrue, &CrIaServ192SwchOffSemStartAction,       &CrIaServ192SwchOffSemProgressAction,       &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV192, CRIA_SERV192_GO_STAB,              0, &CrIaInCmdValidityCheck,              &CrFwSmCheckAlwaysTrue, &CrIaServ192GoStabStartAction,           &CrIaServ192GoStabProgressAction,           &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV192, CRIA_SERV192_GO_STBY,              0, &CrIaInCmdValidityCheck,              &CrFwSmCheckAlwaysTrue, &CrIaServ192GoStbyStartAction,           &CrIaServ192GoStbyProgressAction,           &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV192, CRIA_SERV192_GO_CCD_WIN,           0, &CrIaInCmdValidityCheck,              &CrFwSmCheckAlwaysTrue, &CrIaServ192GoCcdWinStartAction,         &CrIaServ192GoCcdWinProgressAction,         &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV192, CRIA_SERV192_GO_CCD_FULL,          0, &CrIaInCmdValidityCheck,              &CrFwSmCheckAlwaysTrue, &CrIaServ192GoCcdFullStartAction,        &CrIaServ192GoCcdFullProgressAction,        &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV192, CRIA_SERV192_GO_DIAG,              0, &CrIaInCmdValidityCheck,              &CrFwSmCheckAlwaysTrue, &CrIaServ192GoDiagStartAction,           &CrIaServ192GoDiagProgressAction,           &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV192, CRIA_SERV192_ABORT_DIAG,           0, &CrIaInCmdValidityCheck,              &CrFwSmCheckAlwaysTrue, &CrIaServ192AbortDiagStartAction,        &CrIaServ192AbortDiagProgressAction,        &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV192, CRIA_SERV192_GO_SAFE,              0, &CrIaInCmdValidityCheck,              &CrFwSmCheckAlwaysTrue, &CrIaServ192GoSafeStartAction, &CrIaServ192GoSafeProgressAction, &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV193, CRIA_SERV193_PREPARE_SCI,          0, &CrIaInCmdValidityCheck,              &CrFwSmCheckAlwaysTrue, &CrIaServ193PrepareSciStartAction,       &CrIaServ193PrepareSciProgressAction,       &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV193, CRIA_SERV193_START_SCI,            0, &CrIaInCmdValidityCheck,              &CrFwSmCheckAlwaysTrue, &CrIaServ193StartSciStartAction,         &CrIaServ193StartSciProgressAction,         &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV193, CRIA_SERV193_STOP_SCIENCE,         0, &CrIaInCmdValidityCheck,              &CrFwSmCheckAlwaysTrue, &CrIaServ193StopScienceStartAction,      &CrIaServ193StopScienceProgressAction,      &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV193, CRIA_SERV193_STOP_SEM,             0, &CrIaInCmdValidityCheck,              &CrFwSmCheckAlwaysTrue, &CrIaServ193StopSemStartAction,          &CrIaServ193StopSemProgressAction,          &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV193, CRIA_SERV193_START_OFFLINE_OPER,   0, &CrIaInCmdValidityCheck,              &CrFwSmCheckAlwaysTrue, &CrIaServ193StartOfflineOperStartAction, &CrIaServ193StartOfflineOperProgressAction, &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV193, CRIA_SERV193_SWITCH_OFF_IASW,      0, &CrIaInCmdValidityCheck,               &CrFwSmCheckAlwaysTrue, &CrIaServ193SwitchOffIaswStartAction,   &CrIaServ193SwitchOffIaswProgressAction,    &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV194, CRIA_SERV194_START_ALGO,           0, &CrIaServ194StartAlgoValidityCheck,   &CrFwSmCheckAlwaysTrue, &CrIaServ194StartAlgoStartAction, &CrIaServ194StartAlgoProgressAction, &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV194, CRIA_SERV194_STOP_ALGO,            0, &CrIaServ194StopAlgoValidityCheck,    &CrFwSmCheckAlwaysTrue, &CrIaServ194StopAlgoStartAction, &CrIaServ194StopAlgoProgressAction, &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV194, CRIA_SERV194_SUS_ALGO,             0, &CrIaServ194SusAlgoValidityCheck,     &CrFwSmCheckAlwaysTrue, &CrIaServ194SusAlgoStartAction, &CrIaServ194SusAlgoProgressAction, &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV194, CRIA_SERV194_RES_ALGO,             0, &CrIaServ194ResAlgoValidityCheck,     &CrFwSmCheckAlwaysTrue, &CrIaServ194ResAlgoStartAction, &CrIaServ194ResAlgoProgressAction, &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV196, CRIA_SERV196_STAR_MAP_CMD,         0, &CrIaServ196StarMapCmdValidityCheck, &CrFwSmCheckAlwaysTrue, &CrIaServ196StarMapCmdStartAction,       &CrIaServ196StarMapCmdProgressAction,       &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV197, CRIA_SERV197_REP_BOOT,             0, &CrIaServ197RepBootValidityCheck,    &CrFwSmCheckAlwaysTrue, &CrIaServ197RepBootStartAction,          &CrIaServ197RepBootProgressAction,          &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV198, CRIA_SERV198_PROC_START,           0, &CrIaServ198ProcStartValidityCheck,  &CrFwSmCheckAlwaysTrue, &CrIaServ198ProcStartStartAction,        &CrIaServ198ProcStartProgressAction,        &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV198, CRIA_SERV198_PROC_STOP,            0, &CrIaServ198ProcStopValidityCheck,   &CrFwSmCheckAlwaysTrue, &CrIaServ198ProcStopStartAction,         &CrIaServ198ProcStopProgressAction,         &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV210, CRIA_SERV210_ENB_WDOG,             0, &CrIaInCmdValidityCheck,             &CrFwSmCheckAlwaysTrue, &CrIaServ210EnbWdogStartAction,          &CrIaServ210EnbWdogProgressAction,          &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV210, CRIA_SERV210_DIS_WDOG,             0, &CrIaInCmdValidityCheck,             &CrFwSmCheckAlwaysTrue, &CrIaServ210DisWdogStartAction,          &CrIaServ210DisWdogProgressAction,          &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV210, CRIA_SERV210_RESET_DPU,            0, &CrIaInCmdValidityCheck,             &CrFwSmCheckAlwaysTrue, &CrIaServ210ResetDpuStartAction,         &CrIaServ210ResetDpuProgressAction,         &CrFwSmEmptyAction, &CrFwSmEmptyAction},\
+{CRIA_SERV211, CRIA_SERV211_UPDATE_PAR,           0, &CrIaServ211UpdateParValidityCheck,  &CrFwSmCheckAlwaysTrue, &CrIaServ211UpdateParStartAction,        &CrIaServ211UpdateParProgressAction,        &CrFwSmEmptyAction, &CrFwSmEmptyAction}\
+}
+
+
+/**
+ * The total number of kinds of in-coming command packets supported by the application.
+ */
+#define CR_FW_INCMD_NKINDS 47
+
+/**
+ * The maximum number of components representing an in-coming report packet which may be allocated at any one time.
+ * This constant must be a positive integer smaller than the range of CrFwInFactoryPoolIndex_t.
+ */
+#define CR_FW_INFACTORY_MAX_NOF_INREP 255 /* has to be the same as in the PCRL size */
+
+/**
+ * Definition of the in-coming report packet kinds supported by the application.
+ */
+#define CR_FW_INREP_INIT_KIND_DESC\
+	{\
+{CRSEM_SERV1,  CRSEM_SERV1_ACC_SUCC,        0,                                               &CrSemServ1ComVerifUpdateAction,      &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV1,  CRSEM_SERV1_ACC_FAIL,        0,                                               &CrSemServ1ComVerifUpdateAction,      &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV1,  CRSEM_SERV1_TERM_SUCC,       0,                                               &CrSemServ1ComVerifUpdateAction,      &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV1,  CRSEM_SERV1_TERM_FAIL,       0,                                               &CrSemServ1ComVerifUpdateAction,      &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV3,  CRSEM_SERV3_DAT_HK,          1,                                               &CrSemServ3DatHkUpdateAction,         &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV3,  CRSEM_SERV3_DAT_HK,          2,                                               &CrSemServ3DatHkUpdateAction,         &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_NORM,        CRSEM_SERV5_EVENT_PRG_PBS_BOOT_READY,            &CrSemServ5EvtNormUpdateAction,       &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_NORM,        CRSEM_SERV5_EVENT_PRG_APS_BOOT_READY,            &CrSemServ5EvtNormUpdateAction,       &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_NORM,        CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION,           &CrSemServ5EvtNormUpdateAction,       &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_NORM,        CRSEM_SERV5_EVENT_PRG_DIAGNOSE_STEP_FINISHED,    &CrSemServ5EvtNormUpdateAction,       &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_NORM,        CRSEM_SERV5_EVENT_PRG_THERMAL_STABILITY,         &CrSemServ5EvtNormUpdateAction,       &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_NORM,        CRSEM_SERV5_EVENT_PRG_CFG_LOAD_READY,            &CrSemServ5EvtNormUpdateAction,       &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_NORM,        CRSEM_SERV5_EVENT_PRG_FPA_TEMP_NOMINAL,          &CrSemServ5EvtNormUpdateAction,       &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_LOW_SEV, CRSEM_SERV5_EVENT_WAR_EEPROM_NO_SEGMENT,         &CrSemServ5EvtErrLowSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_LOW_SEV, CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_EXE,         &CrSemServ5EvtErrLowSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_LOW_SEV, CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_CFG,         &CrSemServ5EvtErrLowSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_LOW_SEV, CRSEM_SERV5_EVENT_WAR_EEPROM_NO_PBS_CFG,         &CrSemServ5EvtErrLowSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_LOW_SEV, CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_EXE_FLAG,    &CrSemServ5EvtErrLowSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_LOW_SEV, CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_CFG_FLAG,    &CrSemServ5EvtErrLowSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_LOW_SEV, CRSEM_SERV5_EVENT_WAR_NO_THERMAL_STABILITY,      &CrSemServ5EvtErrLowSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_LOW_SEV, CRSEM_SERV5_EVENT_WAR_FPA_TEMP_TOO_HIGH,         &CrSemServ5EvtErrLowSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_LOW_SEV, CRSEM_SERV5_EVENT_WAR_WRONG_EXPOSURE_TIME,       &CrSemServ5EvtErrLowSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_LOW_SEV, CRSEM_SERV5_EVENT_WAR_WRONG_REPETITION_PERIOD,   &CrSemServ5EvtErrLowSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_MED_SEV, CRSEM_SERV5_EVT_WAR_PATTER,                      &CrSemServ5EvtErrMedSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_MED_SEV, CRSEM_SERV5_EVT_WAR_PACKWR,                      &CrSemServ5EvtErrMedSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_MED_SEV, CRSEM_SERV5_EVENT_ERR_EEPROM_WRITE_ERROR,        &CrSemServ5EvtErrMedSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_MED_SEV, CRSEM_SERV5_EVENT_ERR_APS_BOOT_FAILURE,          &CrSemServ5EvtErrMedSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_MED_SEV, CRSEM_SERV5_EVENT_ERR_UNEXPECTED_REBOOT,         &CrSemServ5EvtErrMedSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_MED_SEV, CRSEM_SERV5_EVENT_ERR_WATCHDOG_FAILURE,          &CrSemServ5EvtErrMedSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_MED_SEV, CRSEM_SERV5_EVENT_ERR_CMD_SPW_RX_ERROR,          &CrSemServ5EvtErrMedSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_MED_SEV, CRSEM_SERV5_EVENT_ERR_EEPROM_EXE_SEG_COPY_ABORT, &CrSemServ5EvtErrMedSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_MED_SEV, CRSEM_SERV5_EVENT_ERR_EEPROM_EXE_SEG_CRC_WRONG,  &CrSemServ5EvtErrMedSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_MED_SEV, CRSEM_SERV5_EVENT_ERR_EEPROM_PBS_CFG_SIZE_WRONG, &CrSemServ5EvtErrMedSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_MED_SEV, CRSEM_SERV5_EVENT_ERR_WRITING_REGISTER_FAILED,   &CrSemServ5EvtErrMedSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_MED_SEV, CRSEM_SERV5_EVENT_ERR_CMD_BUFFER_1_FULL,         &CrSemServ5EvtErrMedSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_MED_SEV, CRSEM_SERV5_EVENT_ERR_CMD_BUFFER_2_FULL,         &CrSemServ5EvtErrMedSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_MED_SEV, CRSEM_SERV5_EVT_ERR_DAT_DMA,                     &CrSemServ5EvtErrMedSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_MED_SEV, CRSEM_SERV5_EVT_ERR_BIAS_SET,                    &CrSemServ5EvtErrMedSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_MED_SEV, CRSEM_SERV5_EVT_ERR_SYNC,                        &CrSemServ5EvtErrMedSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_MED_SEV, CRSEM_SERV5_EVT_ERR_SCRIPT,                      &CrSemServ5EvtErrMedSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_MED_SEV, CRSEM_SERV5_EVT_ERR_PWR,                         &CrSemServ5EvtErrMedSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_MED_SEV, CRSEM_SERV5_EVT_ERR_SPW_TC,                      &CrSemServ5EvtErrMedSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV21, CRSEM_SERV21_DAT_CCD_WINDOW, 0,                                               &CrSemServ21DatCcdWindowUpdateAction, &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV220,CRSEM_SERV220_DAT_OPER_PARAM,  0,                                             &CrSemServ220DatOperParamUpdateAction,  &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV220,CRSEM_SERV220_DAT_FUNCT_PARAM, 0,                                             &CrSemServ220DatFunctParamUpdateAction, &CrIaInRepValidityCheck, 0},\
+{CRSEM_SERV222,CRSEM_SERV222_DAT_TEST_LOG, 0,                                                &CrSemServ222DatTestLogUpdateAction,  &CrIaInRepValidityCheck, 0}\
+	}
+
+/**
+ * The total number of kinds of in-coming report packets supported by the application.
+ */
+#define CR_FW_INREP_NKINDS 46
+
+/* NOT USED by SEM - Dummy TM(5,4) Event Report
+{CRSEM_SERV5,  CRSEM_SERV5_EVT_ERR_HIGH_SEV, 44000,          &CrSemServ5EvtErrHighSevUpdateAction,  &CrIaInRepValidityCheck, 0},\
+*/
+
+#endif /* CRFW_IN_FACTORY_USER_PAR_H */
+
diff --git a/CrIa/src/CrConfigIa/CrFwInLoaderUserPar.h b/CrIa/src/CrConfigIa/CrFwInLoaderUserPar.h
new file mode 100644
index 0000000..7e28fb0
--- /dev/null
+++ b/CrIa/src/CrConfigIa/CrFwInLoaderUserPar.h
@@ -0,0 +1,50 @@
+/**
+ * @file CrFwInLoaderUserPar.h
+ * @ingroup CrIaDemo
+ *
+ * User-modifiable parameters for the InLoader components for the IASW
+ * Application.
+ *
+ * \see CrFwInLoader.h
+ *
+ * The parameters defined in this file determine the configuration of the
+ * InLoader singleton component.
+ *
+ * The value of these parameters cannot be changed dynamically.
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH, 2014
+ */
+
+#ifndef CRFW_INLOADER_USERPAR_H_
+#define CRFW_INLOADER_USERPAR_H_
+
+#include "InLoader/CrFwInLoader.h"
+#include "CrIaInLoader.h"
+
+/**
+ * The function which determines the re-routing destination of a packet.
+ *
+ * This function must conform to the prototype defined by
+ * ::CrFwInLoaderGetReroutingDest_t.  The function specified here is the
+ * default re-routing destination function defined in CrFwInLoader.h.
+ *
+ * Use of this re-routing function implies that the IASW Application has no
+ * re-routing capabilities.
+ */
+#define CR_FW_INLOADER_DET_REROUTING_DEST &CrIaInLoaderGetReroutingDestination
+
+/**
+ * The function which determines the InManager into which an InReport or
+ * InCommand must be loaded.
+ *
+ * This function must conform to the prototype defined by
+ * ::CrFwInLoaderGetInManager_t.
+ *
+ * For the IASW application, the selection is as follows.
+ * - Incoming reports from the SEM go into the InManagerSem
+ * - Incoming commands from the OBC go into the InManagerGrdObc
+ */
+#define CR_FW_INLOADER_SEL_INMANAGER &CrIaInLoaderGetInManager
+
+#endif /* CRFW_INLOADER_USERPAR_H_ */
diff --git a/CrIa/src/CrConfigIa/CrFwInManagerUserPar.h b/CrIa/src/CrConfigIa/CrFwInManagerUserPar.h
new file mode 100644
index 0000000..7fbfc13
--- /dev/null
+++ b/CrIa/src/CrConfigIa/CrFwInManagerUserPar.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrFwInManagerUserPar.h
+ * @ingroup CrIaDemo
+ *
+ * User-modifiable parameters for the InManager components of the IASW
+ * Application.
+ *
+ * \see CrFwInManager.h
+ *
+ * The parameters defined in this file determine the configuration of the
+ * InManager Components.
+ *
+ * The value of these parameters cannot be changed dynamically.
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH, 2014
+ */
+
+#ifndef CRFW_INMANAGER_USERPAR_H_
+#define CRFW_INMANAGER_USERPAR_H_
+
+/**
+ * The number of InManager components in the application.
+ * The value of this constant must be smaller than the range of the ::CrFwCounterU1_t
+ * integer type.
+ */
+#define CR_FW_NOF_INMANAGER 2
+
+/**
+ * The sizes of the Pending Command/Report List (PCRL) of the InManager
+ * components. Each InManager has one PCRL.
+ *
+ * This constant defines the size of the PCRL of the i-th InManager.  The size
+ * of a PCRL must be a positive integer (i.e. it is not legal to define a
+ * zero-size PCRL) in the range of the ::CrFwCounterU2_t type.
+ */
+#define CR_FW_INMANAGER_PCRLSIZE {255, 6} /* Email from PnP on Sat, 19 Nov 2016 09:08:56 +0100 */ 
+
+#endif /* CRFW_INMANAGER_USERPAR_H_ */
diff --git a/CrIa/src/CrConfigIa/CrFwInRegistryUserPar.h b/CrIa/src/CrConfigIa/CrFwInRegistryUserPar.h
new file mode 100644
index 0000000..94f0133
--- /dev/null
+++ b/CrIa/src/CrConfigIa/CrFwInRegistryUserPar.h
@@ -0,0 +1,24 @@
+/**
+ * @file CrFwInRegistryUserPar.h
+ * @ingroup CrIaDemo
+ *
+ * User-modifiable parameters for the InRegistry component.
+ *
+ * \see CrFwInRegistry.h
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH, 2014
+ */
+
+#ifndef CRFW_INREGISTRY_USERPAR_H_
+#define CRFW_INREGISTRY_USERPAR_H_
+
+/**
+ * The maximum number of commands or reports which can be tracked by the
+ * InRegistry.
+ *
+ * This constant must be smaller than the range of ::CrFwTrackingIndex_t.
+ */
+#define CR_FW_INREGISTRY_N 10 /* value taken from DD-001, issue 2.2 p 30 */
+
+#endif /* CRFW_INREGISTRY_USERPAR_H_ */
diff --git a/CrIa/src/CrConfigIa/CrFwInStreamUserPar.h b/CrIa/src/CrConfigIa/CrFwInStreamUserPar.h
new file mode 100644
index 0000000..d38eeaa
--- /dev/null
+++ b/CrIa/src/CrConfigIa/CrFwInStreamUserPar.h
@@ -0,0 +1,208 @@
+/**
+ * @file CrFwInStreamUserPar.h
+ * @ingroup CrIaDemo
+ *
+ * User-modifiable parameters for the InStream components of the IASW
+ * Application.
+ *
+ * \see CrFwInStream.h
+ *
+ * The parameters defined in this file determine the configuration of the
+ * InStream Components.
+ *
+ * The value of these parameters cannot be changed dynamically.
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH, 2014
+ */
+
+#ifndef CRFW_INSTREAM_USERPAR_H_
+#define CRFW_INSTREAM_USERPAR_H_
+
+/* Includes */
+#include "CrFwConstants.h"
+#include "BaseCmp/CrFwResetProc.h"
+#include "InStream/CrFwInStream.h"
+#include "CrIaIasw.h"
+
+/**
+ * The number of InStream components in the application.
+ *
+ * The value of this constant must be smaller than the range of the
+ * ::CrFwCounterU1_t integer type.
+ */
+#define CR_FW_NOF_INSTREAM 3
+
+/**
+ * The sizes of the packet queues in the InStream components.
+ * Each InStream has one packet queue.
+ * This constant defines the size of the packet queue of the i-th InStream.
+ * The size of the packet queue represents the maximum number of packets which
+ * may remain pending in the packet queue.
+ * The size of a packet queue must be a positive integer (i.e. it is not legal
+ * to define a zero-size packet queue).
+ */
+#define CR_FW_INSTREAM_PQSIZE {255,2,6} /* Email from PnP on Sat, 19 Nov 2016 09:08:56 +0100 */ 
+
+/**
+ * The packet sources which are managed by the InStream components.
+ *
+ * Each InStream is responsible for collecting packets from one packet source.
+ * This constant is the initializer for the array which defines the packet
+ * source associated to the i-th InStream.
+ */
+#define CR_FW_INSTREAM_SRC {CR_FW_CLIENT_SEM, \
+                            CR_FW_CLIENT_OBC, \
+                            CR_FW_CLIENT_GRD}
+
+/**
+ * The number of groups of the InStream components. This is positive number and
+ * defines the number of groups of the i-th InStream.
+ *
+ * The number of groups defined in this file are those used for the IASW
+ * Application.
+ */
+#define CR_FW_INSTREAM_NOF_GROUPS {12,12,1}
+
+/**
+ * The functions implementing  the Packet Collect Operations of the InStream components.
+ * Each InStream component needs to be able to collect a packet from the middleware.
+ * The function implementing this packet collect operation is one of the
+ * adaptation points of the framework.
+ * This array defines the packet collect operations for the InStreams.
+ * The items in the arrays must be function pointers of type:
+ * ::CrFwPcktCollect_t.
+ */
+#define CR_FW_INSTREAM_PCKTCOLLECT {&CrIbSemPcktCollect, \
+                                    &CrIbObcPcktCollect, \
+                                    &CrIbGrdPcktCollect}
+
+/**
+ * The functions implementing the Packet Available Check Operations of the InStream
+ * components.
+ * Each InStream component needs to be able to check whether the middleware is in
+ * state WAITING (no packet is available for collection) or PCKT_AVAIL (a packet is
+ * available for collection).
+ * The functions which query the middleware to check whether a packet is available or not
+ * is one of the adaptation points of the framework.
+ * This array defines the Packet Available Check Operations for the InStream.
+ * The items in the array must be function pointers of type:
+ * ::CrFwPcktAvailCheck_t.
+ */
+#define CR_FW_INSTREAM_PCKTAVAILCHECK {&CrIbIsSemPcktAvail, \
+                                       &CrIbIsObcPcktAvail, \
+                                       &CrIbIsGrdPcktAvail}
+
+/**
+ * The functions implementing the Initialization Check of the InStream
+ * components.
+ *
+ * The InStream components are derived from the Base Component and they
+ * therefore inherit its Initialization Procedure.
+ *
+ * \see CrFwInitProc.h
+ *
+ * The initialization procedure must be configured with two actions.
+ *  - The Initiation Check
+ *  - The Initialization Action
+ *
+ * The items in the array must be function pointers of type FwPrAction_t.
+ *
+ * For the IASW application, no Initialization Check is required for the
+ * InStream components. Therefore, the default base implementation is used.
+ */
+#define CR_FW_INSTREAM_INITCHECK {&CrFwBaseCmpDefInitCheck, \
+                                  &CrFwBaseCmpDefInitCheck, \
+                                  &CrFwBaseCmpDefInitCheck}
+
+/**
+ * The functions implementing the Initialization Action of the InStream
+ * components.
+ *
+ * The InStream components are derived from the Base Component and they
+ * therefore inherit its Initialization Procedure.
+ *
+ * \see CrFwInitProc.h
+ *
+ * The initialization procedure must be configured with two actions.
+ *  - The Initiation Check
+ *  - The Initialization Action
+ *
+ * The items in the array must be function pointers of type FwPrAction_t
+ *
+ * For the IASW application, no Initialization Action is required for the
+ * InStream components. Therefore, the default base implementation is used.
+ */
+#define CR_FW_INSTREAM_INITACTION {&CrFwInStreamDefInitAction, \
+                                   &CrFwInStreamDefInitAction, \
+                                   &CrFwInStreamDefInitAction}
+
+/**
+ * The functions implementing the Configuration Check of the InStream
+ * components.
+ *
+ * The InStream components are derived from the Base Component and they
+ * therefore inherit its Reset Procedure.
+ *
+ * \see CrSwResetProc.h
+ *
+ * The reset procedure must be configured with two actions
+ *  - The Configuration Action
+ *  - The Configuration Check
+ *
+ * The items in the array must be function pointers of type FwPrAction_t.
+ *
+ * Function ::CrFwBaseCmpDefConfigCheck can be used as a default
+ * implementation for this function.
+ *
+ * For the IASW application, no Configuration Check is required for the
+ * InStream components. Therefore, the default base implementation is used.
+ */
+#define CR_FW_INSTREAM_CONFIGCHECK {&CrFwBaseCmpDefConfigCheck, \
+                                    &CrFwBaseCmpDefConfigCheck, \
+                                    &CrFwBaseCmpDefConfigCheck}
+
+/**
+ * The functions implementing the Configuration Action of the InStream
+ * components.
+ *
+ * The InStream components are derived from the Base Component and they
+ * therefore inherit its Reset Procedure.
+ *
+ * \see CrSwResetProc.h
+ *
+ * The reset procedure must be configured with two actions
+ *  - The Configuration Action
+ *  - The Configuration Check
+ *
+ * The items in the array must be function pointers of type FwPrAction_t.
+ *
+ * For the IASW application, no Configuration Action is required for the
+ * InStream components. Therefore, the default base implementation is used.
+ */
+#define CR_FW_INSTREAM_CONFIGACTION {&CrFwInStreamDefConfigAction, \
+                                     &CrFwInStreamDefConfigAction, \
+                                     &CrFwInStreamDefConfigAction}
+
+/**
+ * The functions implementing the Shutdown Action of the InStream components.
+ *
+ * The InStream components are derived from the Base Component and they
+ * therefore inherit its Reset Procedure.
+ *
+ * \see CrFwBaseCmp.h
+ *
+ * The reset procedure must be configured with two actions
+ *  - The Configuration Action
+ *  - The Configuration Check
+ *
+ * The items in the array must be function pointers of type FwSmAction_t.
+ *
+ * For the IASW application, no Shutdown Action is required for the InStream
+ * components. Therefore, the default base implementation is used.
+ */
+#define CR_FW_INSTREAM_SHUTDOWNACTION {&CrFwInStreamDefShutdownAction, \
+                                       &CrFwInStreamDefShutdownAction, \
+                                       &CrFwInStreamDefShutdownAction}
+
+#endif /* CRFW_INSTREAM_USERPAR_H_ */
diff --git a/CrIa/src/CrConfigIa/CrFwOutFactoryUserPar.h b/CrIa/src/CrConfigIa/CrFwOutFactoryUserPar.h
new file mode 100644
index 0000000..28dd640
--- /dev/null
+++ b/CrIa/src/CrConfigIa/CrFwOutFactoryUserPar.h
@@ -0,0 +1,207 @@
+/**
+ * @file CrFwOutFactoryUserPar.h
+ * @ingroup CrIaConfig
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief User-modifiable parameters for the OutFactory component of the IASW application.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#ifndef CRFW_OUT_FACTORY_USER_PAR_H
+#define CRFW_OUT_FACTORY_USER_PAR_H
+
+#include <Services/General/CrIaConstants.h>
+#include <Services/General/CrSemConstants.h>
+#include <CrFwConstants.h>
+#include <UtilityFunctions/CrFwUtilityFunctions.h>
+#include <CrIaOutCmp.h>
+
+#include <Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1AccSucc.h>
+#include <Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1AccFail.h>
+#include <Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1StartSucc.h>
+#include <Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1StartFail.h>
+#include <Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1TermSucc.h>
+#include <Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1TermFail.h>
+#include <Services/CrIaServ3HousekeepingDataReportingService/OutRep/CrIaServ3HkDr.h>
+#include <Services/CrIaServ5EventReportingService/OutRep/CrIaServ5Event.h>
+#include <Services/CrIaServ6MemoryManagementService/OutRep/CrIaServ6MemDump.h>
+#include <Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13FstDwlk.h>
+#include <Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13IntmDwlk.h>
+#include <Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13LastDwlk.h>
+#include <Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13DwlkAbrt.h>
+#include <Services/CrIaServ195HeartbeatService/OutRep/CrIaServ195HbRep.h>
+#include <Services/CrIaServ196AOCSService/OutRep/CrIaServ196AocsRep.h>
+#include <Services/CrIaServ197BootReportService/OutRep/CrIaServ197BootRep.h>
+
+#include <Services/CrSemServ9HousekeepingDataReportingService/OutCmd/CrSemServ9CmdTimeUpdate.h>
+#include <Services/CrSemServ21ScienceDataService/OutCmd/CrSemServ21CmdCcdDataEnable.h>
+#include <Services/CrSemServ21ScienceDataService/OutCmd/CrSemServ21CmdCcdDataDisable.h>
+#include <Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdOperParam.h>
+#include <Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdTempCtrlEnable.h>
+#include <Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdFunctParam.h>
+#include <Services/CrSemServ221PrivateService221/OutCmd/CrSemServ221FpmPowerEnb.h>
+#include <Services/CrSemServ221PrivateService221/OutCmd/CrSemServ221FpmPowerDis.h>
+#include <Services/CrSemServ222PrivateService222/OutCmd/CrSemServ222DiagEnable.h>
+
+/**
+ * The maximum number of OutComponents which may be allocated at any one time.
+ * This constant must be smaller than the range of CrFwOutFactoryPoolIndex_t.
+ */
+
+#define CR_FW_OUTFACTORY_MAX_NOF_OUTCMP 74 /* has to be the same as POCL size */
+
+
+/**
+ * Definition of the OutComponent kinds supported by an application.
+ */
+
+
+#define CR_FW_OUTCMP_INIT_KIND_DESC\
+	{\
+{CRIA_SERV1,     CRIA_SERV1_ACC_SUCC,                 0,                             crRepType,  CRIA_SERV1_ACC_SUCC_LENGTH,                 &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrIaServ1AccSuccUpdateAction,               &CrIaOutCmpDefSerialize},\
+{CRIA_SERV1,     CRIA_SERV1_ACC_FAIL,                 0,                             crRepType,  CRIA_SERV1_ACC_FAIL_LENGTH,                 &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrIaServ1AccFailUpdateAction,               &CrIaOutCmpDefSerialize},\
+{CRIA_SERV1,     CRIA_SERV1_START_SUCC,               0,                             crRepType,  CRIA_SERV1_START_SUCC_LENGTH,               &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrIaServ1StartSuccUpdateAction,             &CrIaOutCmpDefSerialize},\
+{CRIA_SERV1,     CRIA_SERV1_START_FAIL,               0,                             crRepType,  CRIA_SERV1_START_FAIL_LENGTH,               &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrIaServ1StartFailUpdateAction,             &CrIaOutCmpDefSerialize},\
+{CRIA_SERV1,     CRIA_SERV1_TERM_SUCC,                0,                             crRepType,  CRIA_SERV1_TERM_SUCC_LENGTH,                &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrIaServ1TermSuccUpdateAction,              &CrIaOutCmpDefSerialize},\
+{CRIA_SERV1,     CRIA_SERV1_TERM_FAIL,                0,                             crRepType,  CRIA_SERV1_TERM_FAIL_LENGTH,                &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrIaServ1TermFailUpdateAction,              &CrIaOutCmpDefSerialize},\
+{CRSEM_SERV3,    CRSEM_SERV3_CMD_HK_ENABLE,           0,                             crCmdType,  CRSEM_SERV3_CMD_HK_ENABLE_LENGTH,           &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrFwSmEmptyAction,                          &CrIaOutCmpDefSerialize},\
+{CRSEM_SERV3,    CRSEM_SERV3_CMD_HK_DISABLE,          0,                             crCmdType,  CRSEM_SERV3_CMD_HK_DISABLE_LENGTH,          &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrFwSmEmptyAction,                          &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    1,                             crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    2,                             crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    3,                             crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    4,                             crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    5,                             crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    6,                             crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    7,                             crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    8,                             crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    9,                             crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    10,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    11,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    12,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    13,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    14,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    15,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    16,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    17,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    18,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    19,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    20,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    21,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    22,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    23,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    24,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    25,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    26,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    27,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    28,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    29,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    30,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    31,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    32,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    33,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    34,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    35,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    36,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    37,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    38,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    39,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    40,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    41,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    42,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    43,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    44,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    45,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    46,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    47,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    48,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    49,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRIA_SERV3,     CRIA_SERV3_HK_DR,                    50,                            crRepType,  CRIA_SERV3_HK_DR_LENGTH,                    &CrIaServ3HkDrEnableCheck,            &CrIaServ3HkDrReadyCheck,       &CrFwSmCheckAlwaysTrue,      &CrIaServ3HkDrUpdateAction,                  &CrIaOutCmpDefSerialize},\
+{CRSEM_SERV3,    CRSEM_SERV3_CMD_HK_PERIOD,           0,                             crCmdType,  CRSEM_SERV3_CMD_HK_PERIOD_LENGTH,           &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrFwSmEmptyAction,                          &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_NORM,                 CRIA_SERV5_EVT_SEM_TR,         crRepType,  CRIA_SERV5_EVT_SEM_TR_LENGTH,               &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_NORM,                 CRIA_SERV5_EVT_IASW_TR,        crRepType,  CRIA_SERV5_EVT_IASW_TR_LENGTH,              &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_NORM,                 CRIA_SERV5_EVT_SEMOP_TR,       crRepType,  CRIA_SERV5_EVT_SEMOP_TR_LENGTH,             &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_NORM,                 CRIA_SERV5_EVT_SC_PR_STRT,     crRepType,  CRIA_SERV5_EVT_SC_PR_STRT_LENGTH,           &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_NORM,                 CRIA_SERV5_EVT_SC_PR_END,      crRepType,  CRIA_SERV5_EVT_SC_PR_END_LENGTH,            &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_NORM,                 CRIA_SERV5_EVT_INIT_SUCC,      crRepType,  CRIA_SERV5_EVT_INIT_SUCC_LENGTH,            &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_LOW_SEV,          CRIA_SERV5_EVT_SEQ_CNT_ERR,    crRepType,  CRIA_SERV5_EVT_SEQ_CNT_ERR_LENGTH,          &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_LOW_SEV,          CRIA_SERV5_EVT_1553_ERR_L,     crRepType,  CRIA_SERV5_EVT_1553_ERR_L_LENGTH,           &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_LOW_SEV,          CRIA_SERV5_EVT_SPW_ERR_L,      crRepType,  CRIA_SERV5_EVT_SPW_ERR_L_LENGTH,            &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_LOW_SEV,          CRIA_SERV5_EVT_SBIT_ERR,       crRepType,  CRIA_SERV5_EVT_SBIT_ERR_LENGTH,             &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_INV_DEST,       crRepType,  CRIA_SERV5_EVT_INV_DEST_LENGTH,             &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_INREP_CR_FAIL,  crRepType,  CRIA_SERV5_EVT_INREP_CR_FAIL_LENGTH,        &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_PCRL2_FULL,     crRepType,  CRIA_SERV5_EVT_PCRL2_FULL_LENGTH,           &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_FD_FAILED,      crRepType,  CRIA_SERV5_EVT_FD_FAILED_LENGTH,            &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_SDSC_ILL,       crRepType,  CRIA_SERV5_EVT_SDSC_ILL_LENGTH,             &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_SDSC_OOS,       crRepType,  CRIA_SERV5_EVT_SDSC_OOS_LENGTH,             &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_CLCT_SIZE,      crRepType,  CRIA_SERV5_EVT_CLCT_SIZE_LENGTH,            &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_SIB_SIZE,       crRepType,  CRIA_SERV5_EVT_SIB_SIZE_LENGTH,             &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_FBF_LOAD_RISK,  crRepType,  CRIA_SERV5_EVT_FBF_LOAD_RISK_LENGTH,        &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_FBF_SAVE_DENIED, crRepType, CRIA_SERV5_EVT_FBF_SAVE_DENIED_LENGTH,      &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_FBF_SAVE_ABRT,  crRepType,  CRIA_SERV5_EVT_FBF_SAVE_ABRT_LENGTH,        &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_SDB_CNF_FAIL,   crRepType,  CRIA_SERV5_EVT_SDB_CNF_FAIL_LENGTH,         &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_CMPR_SIZE,      crRepType,  CRIA_SERV5_EVT_CMPR_SIZE_LENGTH,            &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_INSTRM_PQF,     crRepType,  CRIA_SERV5_EVT_INSTRM_PQF_LENGTH,           &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_OCMP_INVD,      crRepType,  CRIA_SERV5_EVT_OCMP_INVD_LENGTH,            &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_OCMP_ILLGR,     crRepType,  CRIA_SERV5_EVT_OCMP_ILLGR_LENGTH,           &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_IN_ILLGR,       crRepType,  CRIA_SERV5_EVT_IN_ILLGR_LENGTH,             &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_INV_CENT,       crRepType,  CRIA_SERV5_EVT_INV_CENT_LENGTH,             &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_OOL_PARAM,      crRepType,  CRIA_SERV5_EVT_OOL_PARAM_LENGTH,            &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_1553_ERR_M,     crRepType,  CRIA_SERV5_EVT_1553_ERR_M_LENGTH,           &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_SPW_ERR_M,      crRepType,  CRIA_SERV5_EVT_SPW_ERR_M_LENGTH,            &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_FL_FBF_BB,      crRepType,  CRIA_SERV5_EVT_FL_FBF_BB_LENGTH,            &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_DBIT_ERR,       crRepType,  CRIA_SERV5_EVT_DBIT_ERR_LENGTH,             &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_SYNC_LOSS,      crRepType,  CRIA_SERV5_EVT_SYNC_LOSS_LENGTH,            &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_SDP_NOMEM,      crRepType,  CRIA_SERV5_EVT_SDP_NOMEM_LENGTH,            &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_SEM_ILL_ST,     crRepType,  CRIA_SERV5_EVT_SEM_ILL_ST_LENGTH,           &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_ACQ_FAIL,       crRepType,  CRIA_SERV5_EVT_ACQ_FAIL_LENGTH,             &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_PROCBUF_INSUF,  crRepType,  CRIA_SERV5_EVT_PROCBUF_INSUF_LENGTH,        &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_XIB_FULL,       crRepType,  CRIA_SERV5_EVT_XIB_FULL_LENGTH,             &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_MED_SEV,          CRIA_SERV5_EVT_IMG_INSUF,      crRepType,  CRIA_SERV5_EVT_IMG_INSUF_LENGTH,            &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,       CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_HIGH_SEV,         CRIA_SERV5_EVT_RP_STARTED,     crRepType,  CRIA_SERV5_EVT_RP_STARTED_LENGTH,           &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_HIGH_SEV,         CRIA_SERV5_EVT_INIT_FAIL,      crRepType,  CRIA_SERV5_EVT_INIT_FAIL_LENGTH,            &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_HIGH_SEV,         CRIA_SERV5_EVT_THRD_OR,        crRepType,  CRIA_SERV5_EVT_THRD_OR_LENGTH,              &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_HIGH_SEV,         CRIA_SERV5_EVT_NOTIF_ERR,      crRepType,  CRIA_SERV5_EVT_NOTIF_ERR_LENGTH,            &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_HIGH_SEV,         CRIA_SERV5_EVT_1553_ERR_H,     crRepType,  CRIA_SERV5_EVT_1553_ERR_H_LENGTH,           &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_HIGH_SEV,         CRIA_SERV5_EVT_SPW_ERR_H,      crRepType,  CRIA_SERV5_EVT_SPW_ERR_H_LENGTH,            &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_HIGH_SEV,         CRIA_SERV5_EVT_FL_EL_ERR,      crRepType,  CRIA_SERV5_EVT_FL_EL_ERR_LENGTH,            &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV5,     CRIA_SERV5_EVT_ERR_HIGH_SEV,         CRIA_SERV5_EVT_FL_FBF_ERR,     crRepType,  CRIA_SERV5_EVT_FL_FBF_ERR_LENGTH,           &CrIaServ5EventEnableCheck,           &CrIaServ5EventReadyCheck,      &CrIaServ5EventRepeatCheck,  &CrIaServ5EventUpdateAction,                 &CrIaOutCmpDefSerialize},\
+{CRIA_SERV6,     CRIA_SERV6_MEM_DUMP,                 0,                             crRepType,  CRIA_SERV6_MEM_DUMP_LENGTH,                 &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrIaServ6MemDumpUpdateAction,               &CrIaOutCmpDefSerialize},\
+{CRSEM_SERV9,    CRSEM_SERV9_CMD_TIME_UPDATE,         0,                             crCmdType,  CRSEM_SERV9_CMD_TIME_UPDATE_LENGTH,         &CrSemServ9CmdTimeUpdateEnableCheck,  &CrSemServ9CmdTimeUpdateReadyCheck, &CrSemServ9CmdTimeUpdateRepeatCheck, &CrSemServ9CmdTimeUpdateUpdateAction, &CrIaOutCmpDefSerialize},\
+{CRIA_SERV13,    CRIA_SERV13_FST_DWLK,                0,                             crRepType,  CRIA_SERV13_FST_DWLK_LENGTH,                &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrIaServ13FstDwlkUpdateAction,              &CrIaOutCmpDefSerialize},\
+{CRIA_SERV13,    CRIA_SERV13_INTM_DWLK,               0,                             crRepType,  CRIA_SERV13_INTM_DWLK_LENGTH,               &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrIaServ13IntmDwlkUpdateAction,             &CrIaOutCmpDefSerialize},\
+{CRIA_SERV13,    CRIA_SERV13_LAST_DWLK,               0,                             crRepType,  CRIA_SERV13_LAST_DWLK_LENGTH,               &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrIaServ13LastDwlkUpdateAction,             &CrIaOutCmpDefSerialize},\
+{CRIA_SERV13,    CRIA_SERV13_DWLK_ABRT,               0,                             crRepType,  CRIA_SERV13_DWLK_ABRT_LENGTH,               &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrIaServ13DwlkAbrtUpdateAction,             &CrIaOutCmpDefSerialize},\
+{CRIA_SERV17,    CRIA_SERV17_LINK_CONN_REP,           0,                             crRepType,  CRIA_SERV17_LINK_CONN_REP_LENGTH,           &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrFwSmEmptyAction,                          &CrIaOutCmpDefSerialize},\
+{CRSEM_SERV21,   CRSEM_SERV21_CMD_CCD_DATA_ENABLE,    0,                             crCmdType,  CRSEM_SERV21_CMD_CCD_DATA_ENABLE_LENGTH,    &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrSemServ21CmdCcdDataEnableUpdateAction,    &CrIaOutCmpDefSerialize},\
+{CRSEM_SERV21,   CRSEM_SERV21_CMD_CCD_DATA_DISABLE,   0,                             crCmdType,  CRSEM_SERV21_CMD_CCD_DATA_DISABLE_LENGTH,   &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrSemServ21CmdCcdDataDisableUpdateAction,   &CrIaOutCmpDefSerialize},\
+{CRIA_SERV195,   CRIA_SERV195_HB_REP,                 0,                             crRepType,  CRIA_SERV195_HB_REP_LENGTH,                 &CrFwSmCheckAlwaysTrue,               &CrIaServ195HbRepReadyCheck,    &CrFwSmCheckAlwaysTrue,      &CrIaServ195HbRepUpdateAction,               &CrIaOutCmpDefSerialize},\
+{CRIA_SERV196,   CRIA_SERV196_AOCS_REP,               0,                             crRepType,  CRIA_SERV196_AOCS_REP_LENGTH,               &CrIaServ196AocsRepEnableCheck,       &CrIaServ196AocsRepReadyCheck,  &CrFwSmCheckAlwaysTrue,      &CrIaServ196AocsRepUpdateAction,             &CrIaOutCmpDefSerialize},\
+{CRIA_SERV197,   CRIA_SERV197_BOOT_REP,               0,                             crRepType,  CRIA_SERV197_BOOT_REP_LENGTH,               &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrIaServ197BootRepUpdateAction,             &CrIaOutCmpDefSerialize},\
+{CRSEM_SERV220,  CRSEM_SERV220_CMD_OPER_PARAM,        0,                             crCmdType,  CRSEM_SERV220_CMD_OPER_PARAM_LENGTH,        &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrSemServ220CmdOperParamUpdateAction,       &CrIaOutCmpDefSerialize},\
+{CRSEM_SERV220,  CRSEM_SERV220_CMD_TEMP_CTRL_ENABLE,  0,                             crCmdType,  CRSEM_SERV220_CMD_TEMP_CTRL_ENABLE_LENGTH,  &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrSemServ220CmdTempCtrlEnableUpdateAction,  &CrIaOutCmpDefSerialize},\
+{CRSEM_SERV220,  CRSEM_SERV220_CMD_FUNCT_PARAM,       0,                             crCmdType,  CRSEM_SERV220_CMD_FUNCT_PARAM_LENGTH,       &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrSemServ220CmdFunctParamUpdateAction,      &CrIaOutCmpDefSerialize},\
+{CRSEM_SERV221,  CRSEM_SERV221_CMD_SAFE_ENTER,        0,                             crCmdType,  CRSEM_SERV221_CMD_SAFE_ENTER_LENGTH,        &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrFwSmEmptyAction,                          &CrIaOutCmpDefSerialize},\
+{CRSEM_SERV221,  CRSEM_SERV221_CMD_STANDBY_ENTER,     0,                             crCmdType,  CRSEM_SERV221_CMD_STANDBY_ENTER_LENGTH,     &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrFwSmEmptyAction,                          &CrIaOutCmpDefSerialize},\
+{CRSEM_SERV221,  CRSEM_SERV221_CMD_FPM_POWER_ENABLE,  0,                             crCmdType,  CRSEM_SERV221_CMD_FPM_POWER_ENABLE_LENGTH,  &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrSemServ221CmdFpmPowerEnableUpdateAction,  &CrIaOutCmpDefSerialize},\
+{CRSEM_SERV221,  CRSEM_SERV221_CMD_FPM_POWER_DISABLE, 0,                             crCmdType,  CRSEM_SERV221_CMD_FPM_POWER_DISABLE_LENGTH, &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrSemServ221CmdFpmPowerDisableUpdateAction, &CrIaOutCmpDefSerialize},\
+{CRSEM_SERV222,  CRSEM_SERV222_CMD_DIAG_ENABLE,       0,                             crCmdType,  CRSEM_SERV222_CMD_DIAG_ENABLE_LENGTH,       &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrSemServ222CmdDiagEnableUpdateAction,      &CrIaOutCmpDefSerialize},\
+{CRSEM_SERV222,  CRSEM_SERV222_CMD_DIAG_DISABLE,      0,                             crCmdType,  CRSEM_SERV222_CMD_DIAG_DISABLE_LENGTH,      &CrFwSmCheckAlwaysTrue,               &CrFwSmCheckAlwaysTrue,         &CrFwSmCheckAlwaysFalse,     &CrFwSmEmptyAction,                          &CrIaOutCmpDefSerialize}\
+}
+
+/**
+ * The total number of kinds of OutComponents supported by the application.
+ */
+#define CR_FW_OUTCMP_NKINDS 128
+
+#endif /* CRFW_OUT_FACTORY_USER_PAR_H */
+
+
diff --git a/CrIa/src/CrConfigIa/CrFwOutLoaderUserPar.h b/CrIa/src/CrConfigIa/CrFwOutLoaderUserPar.h
new file mode 100644
index 0000000..401485a
--- /dev/null
+++ b/CrIa/src/CrConfigIa/CrFwOutLoaderUserPar.h
@@ -0,0 +1,131 @@
+/**
+ * @file CrFwOutLoaderUserPar.h
+ * @ingroup CrIaDemo
+ *
+ * User-modifiable parameters for the OutLoader component.
+ *
+ * \see CrFwOutLoader.h
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH, 2014
+ */
+
+#ifndef CRFW_OUTLOADER_USERPAR_H_
+#define CRFW_OUTLOADER_USERPAR_H_
+
+#include "BaseCmp/CrFwInitProc.h"
+#include "OutLoader/CrFwOutLoader.h"
+#include "CrIaOutLoader.h"
+
+/**
+ * The function implementing the OutManager Selection Operation for the OutLoader.
+ * The value of this constant must be a function pointer of type:
+ * ::CrFwOutManagerSelect_t.
+ * As default value for this adaptation point, the OutLoader defines function
+ * ::CrFwOutLoaderDefOutManagerSelect.
+ *
+ * The OutManager Selection Operation defined in this file is the one used for the test cases
+ * of CrFwOutLoaderTestCases.h.
+ */
+#define CR_FW_OUTLOADER_OUTMANAGER_SELECT &CrIaOutLoaderGetOutManager
+
+/**
+ * The function implementing the OutManager Activation Operation for the OutLoader.
+ * The value of this constant must be a function pointer of type:
+ * ::CrFwOutManagerActivate_t.
+ * As default value for this adaptation point, the OutLoader defines function
+ * ::CrFwOutLoadDefOutManagerActivate.
+ *
+ * The OutManager Activation Operation defined in this file is the one used for the test cases
+ * of CrFwOutLoaderTestCases.h.
+ */
+#define CR_FW_OUTLOADER_OUTMANAGER_ACTIVATE &CrFwOutLoadDefOutManagerActivate
+
+/**
+ * The function implementing the Initialization Check of the OutLoader component.
+ * The OutLoader component is derived from the Base Component and it therefore
+ * inherits its Initialization Procedure (see CrFwInitProc.h).
+ * The initialization procedure must be configured with two actions:
+ * the Initialization Action and the Initiation Check.
+ * This constant defines the function implementing the Initialization Check
+ * for the the OutLoader component.
+ * This value of this constant must be a function pointer of type:
+ * FwPrAction_t.
+ * As default value for this adaptation point, function ::CrFwBaseCmpDefInitCheck
+ * defined on the Base Component may be used.
+ *
+ * The value of the constant in this file is the one used for the test cases
+ * of CrFwOutLoaderTestCases.h.
+ */
+#define CR_FW_OUTLOADER_INITCHECK &CrFwBaseCmpDefInitCheck
+
+/**
+ * The function implementing the Initialization Action of the OutLoader component.
+ * The OutLoader component is derived from the Base Component and it therefore
+ * inherits its Initialization Procedure (see CrFwInitProc.h).
+ * The initialization procedure must be configured with two actions:
+ * the Initialization Action and the Initiation Check.
+ * This constant defines the function implementing the Initialization Action
+ * for the the OutLoader component.
+ * This value of this constant must be a function pointer of type:
+ * FwPrAction_t.
+ * As default value for this adaptation point, function ::CrFwBaseCmpDefInitAction
+ * defined on the Base Component may be used.
+ *
+ * The value of the constant in this file is the one used for the test cases
+ * of CrFwOutLoaderTestCases.h.
+ */
+#define CR_FW_OUTLOADER_INITACTION &CrFwBaseCmpDefInitAction
+
+/**
+ * The function implementing the Configuration Check of the OutLoader component.
+ * The OutLoader component is derived from the Base Component and it therefore
+ * inherits its Configuration Procedure (see CrFwResetProc.h).
+ * The configuration procedure must be configured with two actions:
+ * the Configuration Action and the Configuration Check.
+ * This constant defines the function implementing the Configuration Check
+ * for the the OutLoader component.
+ * This value of this constant must be a function pointer of type:
+ * FwPrAction_t.
+ * As default value for this adaptation point, function ::CrFwBaseCmpDefConfigCheck
+ * defined on the Base Component may be used.
+ *
+ * The value of the constant in this file is the one used for the test cases
+ * of CrFwOutLoaderTestCases.h.
+ */
+#define CR_FW_OUTLOADER_CONFIGCHECK &CrFwBaseCmpDefConfigCheck
+
+/**
+ * The function implementing the Configuration Action of the OutLoader component.
+ * The OutLoader component is derived from the Base Component and it therefore
+ * inherits its Configuration Procedure (see CrFwResetProc.h).
+ * The configuration procedure must be configured with two actions:
+ * the Configuration Action and the Configuration Check.
+ * This constant defines the function implementing the Configuration Action
+ * for the the OutLoader component.
+ * This value of this constant must be a function pointer of type:
+ * FwPrAction_t.
+ * As default value for this adaptation point, function ::CrFwBaseCmpDefConfigAction
+ * defined on the Base Component may be used.
+ *
+ * The value of the constant in this file is the one used for the test cases
+ * of CrFwOutLoaderTestCases.h.
+ */
+#define CR_FW_OUTLOADER_CONFIGACTION &CrFwBaseCmpDefConfigAction
+
+/**
+ * The function implementing the Shutdown Action of the OutLoader component.
+ * The OutLoader component is derived from the Base Component and it therefore
+ * inherits its Shutdown Action (see CrFwBaseCmp.h).
+ * This constant defines the shutdown function for the the OutLoader component.
+ * The value of this constant must be a function pointer of type:
+ * FwSmAction_t.
+ * As default value for this adaptation point, function ::CrFwBaseCmpDefShutdownAction
+ * defined on the Base Component may be used.
+ *
+ * The value of the constant in this file is the one used for the test cases
+ * of CrFwOutLoaderTestCases.h.
+ */
+#define CR_FW_OUTLOADER_SHUTDOWNACTION &CrFwBaseCmpDefShutdownAction
+
+#endif /* CRFW_OUTLOADER_USERPAR_H_ */
diff --git a/CrIa/src/CrConfigIa/CrFwOutManagerUserPar.h b/CrIa/src/CrConfigIa/CrFwOutManagerUserPar.h
new file mode 100644
index 0000000..cdb5137
--- /dev/null
+++ b/CrIa/src/CrConfigIa/CrFwOutManagerUserPar.h
@@ -0,0 +1,40 @@
+/**
+ * @file CrFwOutManagerUserPar.h
+ * @ingroup CrIaDemo
+ *
+ * User-modifiable parameters for the OutManager components of the IASW
+ * Application.
+ *
+ * \see CrFwOutManager.h
+ *
+ * The parameters defined in this file determine the configuration of the
+ * OutManager Components.
+ *
+ * The value of these parameters cannot be changed dynamically.
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH, 2014
+ */
+
+#ifndef CRFW_OUTMANAGER_USERPAR_H_
+#define CRFW_OUTMANAGER_USERPAR_H_
+
+/**
+ * The number of OutManager components in the application.
+ * The value of this constant must be smaller than the range of the ::CrFwCounterU1_t
+ * integer type.
+ */
+#define CR_FW_NOF_OUTMANAGER 3
+
+/**
+ * The sizes of the Pending OutComponent List (POCL) of the OutManager
+ * components. Each OutManager has one POCL.
+ *
+ * This constant defines the size of the POCL of the i-th OutManager.  The size
+ * of a POCL must be a positive integer (i.e. it is not legal to define a
+ * zero-size POCL) in the range of the ::CrFwCounterU2_t type.
+ */
+
+#define CR_FW_OUTMANAGER_POCLSIZE {74, 10, 10} /* SEM/HK/OTHER, 13:OBC/GRND: values from DD-001 issue 2.2 p31 */
+
+#endif /* CRFW_OUTMANAGER_USERPAR_H_ */
diff --git a/CrIa/src/CrConfigIa/CrFwOutRegistryUserPar.h b/CrIa/src/CrConfigIa/CrFwOutRegistryUserPar.h
new file mode 100644
index 0000000..17e95cb
--- /dev/null
+++ b/CrIa/src/CrConfigIa/CrFwOutRegistryUserPar.h
@@ -0,0 +1,115 @@
+/**
+ * @file CrFwOutRegistryUserPar.h
+ * @ingroup CrIaConfig
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief User-modifiable parameters for the OutRegistry component.
+ *
+ * \see CrFwOutRegistry.h
+ *
+ * This header file defines the set of services to be provided by the IASW
+ * Application.
+ *
+ * A service is defined in terms of the following characteristics:
+ *  - The service type identifier
+ *  - The service sub-type identifier
+ *  - The range of discriminant values for that service type and sub-type
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#ifndef CRFW_OUTREGISTRY_USERPAR_H_
+#define CRFW_OUTREGISTRY_USERPAR_H_
+
+/**
+ * The maximum number of commands or reports which can be tracked by the
+ * OutRegistry.
+ *
+ * This constant must be smaller than the range of CrFwTrackingIndex_t.
+ */
+#define CR_FW_OUTREGISTRY_N 10 /* value taken from DD-001, issue 2.2, p31 */ 
+
+/**
+ * The total number of out-going service types/sub-types offered by the
+ * application.
+ *
+ * An application supports a number of service types and, for each service
+ * type, it supports a number of sub-types.
+ *
+ * This constant defines the total number of [service type, service sub-type]
+ * pairs supported by the application.
+ *
+ * This constant must be smaller than the range of CrFwCmdRepIndex_t.
+ */
+#define CR_FW_OUTREGISTRY_NSERV 35
+
+/**
+ * Definition of the range of out-going services supported by the application.
+ *
+ * An application supports a number of service types and, for each service
+ * type, it supports a number of sub-types.  Each sub-type may support a range
+ * of discriminant values.
+ *
+ * Each line must conform to the type CrFwServDesc_t.
+ *
+ * \see CrFwServDesc_t 
+ *
+ * The list of service descriptors must satisfy the following constraints:
+ *  - The number of lines must be the same as CR_FW_OUTREGISTRY_NSERV.
+ *  - The service types must be listed in increasing order.
+ *  - The service sub-types within a service type must be listed in increasing order.
+ *  - The set of service type and sub-types must be consistent with the service
+ *    types and sub-types declared in the CR_FW_OUTCMP_INIT_KIND_DESC
+ *    initializer.
+ *
+ * Compliance with the last three constraints is checked by
+ * CrFwAuxOutRegistryConfigCheck.
+ */
+#define CR_FW_OUTREGISTRY_INIT_SERV_DESC \
+	{\
+            { 1, 1, 0, 0, 1, 1, NULL},\
+            { 1, 2, 0, 0, 1, 1, NULL},\
+            { 1, 3, 0, 0, 1, 1, NULL},\
+            { 1, 4, 0, 0, 1, 1, NULL},\
+            { 1, 7, 0, 0, 1, 1, NULL},\
+            { 1, 8, 0, 0, 1, 1, NULL},\
+            { 3, 5, 0, 0, 1, 1, NULL},\
+            { 3, 6, 0, 0, 1, 1, NULL},\
+            { 3, 25, 50, 0, 1, 1, NULL},\
+            { 3, 129, 0, 0, 1, 1, NULL},\
+            { 5, 1, 310, 0, 1, 1, NULL},\
+            { 5, 2, 330, 0, 1, 1, NULL},\
+            { 5, 3, 1504, 0, 1, 1, NULL},\
+            { 5, 4, 325, 0, 1, 1, NULL},\
+            { 6, 6, 0, 0, 1, 1, NULL},\
+            { 9, 129, 0, 0, 1, 1, NULL},\
+            { 13, 1, 0, 0, 1, 1, NULL},\
+            { 13, 2, 0, 0, 1, 1, NULL},\
+            { 13, 3, 0, 0, 1, 1, NULL},\
+            { 13, 4, 0, 0, 1, 1, NULL},\
+            { 17, 2, 0, 0, 1, 1, NULL},\
+            { 21, 1, 0, 0, 1, 1, NULL},\
+            { 21, 2, 0, 0, 1, 1, NULL},\
+            { 195, 1, 0, 0, 1, 1, NULL},\
+            { 196, 1, 0, 0, 1, 1, NULL},\
+            { 197, 1, 0, 0, 1, 1, NULL},\
+            { 220, 3, 0, 0, 1, 1, NULL},\
+            { 220, 4, 0, 0, 1, 1, NULL},\
+            { 220, 11, 0, 0, 1, 1, NULL},\
+            { 221, 1, 0, 0, 1, 1, NULL},\
+            { 221, 2, 0, 0, 1, 1, NULL},\
+            { 221, 3, 0, 0, 1, 1, NULL},\
+            { 221, 4, 0, 0, 1, 1, NULL},\
+            { 222, 3, 0, 0, 1, 1, NULL},\
+            { 222, 4, 0, 0, 1, 1, NULL}\
+	}
+
+#endif /* CRFW_OUTREGISTRY_USERPAR_H_ */
diff --git a/CrIa/src/CrConfigIa/CrFwOutStreamUserPar.h b/CrIa/src/CrConfigIa/CrFwOutStreamUserPar.h
new file mode 100644
index 0000000..94267fd
--- /dev/null
+++ b/CrIa/src/CrConfigIa/CrFwOutStreamUserPar.h
@@ -0,0 +1,204 @@
+/**
+ * @file CrFwOutStreamUserPar.h
+ * @ingroup CrIaDemo
+ *
+ * User-modifiable parameters for the OutStream components of the IASW
+ * Application.
+ *
+ * \see CrFwOutStream.h
+ *
+ * The parameters defined in this file determine the configuration of the
+ * OutStream Components.
+ *
+ * The value of these parameters cannot be changed dynamically.
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH, 2014
+ */
+
+#ifndef CRFW_OUTSTREAM_USERPAR_H_
+#define CRFW_OUTSTREAM_USERPAR_H_
+
+/* Incudes */
+#include <CrIaIasw.h>
+
+#include <CrFwConstants.h>
+#include <BaseCmp/CrFwResetProc.h>
+#include <OutStream/CrFwOutStream.h>
+
+/**
+ * The number of OutStream components in the application.
+ *
+ * Normally, an application should instantiate one OutStream component for each
+ * destination to which a report or a command may be sent.
+ *
+ * The value of this constant must be smaller than the range of the
+ * <code>::CrFwCounterU1_t</code> integer type.
+ */
+#define CR_FW_NOF_OUTSTREAM 3
+
+/**
+ * The sizes of the packet queues in the OutStream component.
+ * Each OutStream has one packet queue.
+ * This constant defines the size of the packet queue of the i-th OutStream.
+ * The size of the packet queue represents the maximum number of packets which
+ * may remain pending in the packet queue.
+ * The size of a packet queue must be a positive integer (i.e. it is not legal
+ * to define a zero-size packet queue).
+ *
+ * The packet sizes defined in this file are those used for the IASW
+ * Application.
+ */
+#define CR_FW_OUTSTREAM_PQSIZE {6,15,150} /* values from DD-001 issue 2.2 p31 */  
+
+/**
+ * The destinations of the OutStream components.
+ *
+ * The destination of an OutStream is the middleware node to which the
+ * OutStream sends its packet.
+ *
+ * Each OutStream has one (and only one) destination associated to it.  A
+ * destination is defined by a non-negative integer.  This array defines the
+ * destination of the i-th OutStream.
+ *
+ * The destinations defined in this file are those used for the IASW
+ * Application.
+ */
+#define CR_FW_OUTSTREAM_DEST {CR_FW_CLIENT_SEM, \
+                              CR_FW_CLIENT_OBC, \
+                              CR_FW_CLIENT_GRD}
+
+/**
+ * The number of groups of the OutStream components. This is positive number and
+ * defines the number of groups of the i-th OutStream.
+ *
+ * The number of groups defined in this file are those used for the IASW
+ * Application.
+ */
+#define CR_FW_OUTSTREAM_NOF_GROUPS {4,4,4}
+/*#define CR_FW_OUTSTREAM_NOF_GROUPS {12,12,12,12}*/
+
+/**
+ * The functions implementing the packet hand-over operations of the OutStream components.
+ * Each OutStream component needs to be able to hand-over a packet to the middleware.
+ * The function implementing this packet hand-over operation is one of the
+ * adaptation points of the framework.
+ * This array defines the packet hand-over operations for the OutStream.
+ * The items in the arrays must be function pointers of type:
+ * <code>::CrFwPcktHandover_t</code>.
+ * No default is defined at framework level for this function.
+ */
+#define CR_FW_OUTSTREAM_PCKTHANDOVER {&CrIbSemPcktHandoverPrepare, \
+                                      &CrIbMilBusPcktHandoverPrepare, \
+                                      &CrIbMilBusPcktHandoverPrepare}
+
+/**
+ * The functions implementing the Initialization Check of the OutStream
+ * components.
+ *
+ * The OutStream components are derived from the Base Component and they
+ * therefore inherit its Initialization Procedure.
+ *
+ * \see CrFwInitProc.h
+ *
+ * The initialization procedure must be configured with two actions.
+ *  - The Initiation Check
+ *  - The Initialization Action
+ *
+ * The items in the array must be function pointers of type FwPrAction_t.
+ *
+ * For the IASW application, no Initialization Check is required for the
+ * OutStream components. Therefore, the default base implementation is used.
+ */
+#define CR_FW_OUTSTREAM_INITCHECK {&CrFwBaseCmpDefInitCheck, \
+                                   &CrFwBaseCmpDefInitCheck, \
+                                   &CrFwBaseCmpDefInitCheck}
+
+/**
+ * The functions implementing the Initialization Action of the OutStream
+ * components.
+ *
+ * The OutStream components are derived from the Base Component and they
+ * therefore inherit its Initialization Procedure.
+ *
+ * \see CrFwInitProc.h
+ *
+ * The initialization procedure must be configured with two actions.
+ *  - The Initiation Check
+ *  - The Initialization Action
+ *
+ * The items in the array must be function pointers of type FwPrAction_t
+ *
+ * For the IASW application, no Initialization Action is required for the
+ * OutStream components. Therefore, the default base implementation is used.
+ */
+#define CR_FW_OUTSTREAM_INITACTION {&CrFwOutStreamDefInitAction, \
+                                    &CrFwOutStreamDefInitAction, \
+                                    &CrFwOutStreamDefInitAction}
+
+/**
+ * The functions implementing the Configuration Check of the OutStream
+ * components.
+ *
+ * The OutStream components are derived from the Base Component and they
+ * therefore inherit its Reset Procedure.
+ *
+ * \see CrFwResetProc.h
+ *
+ * The reset procedure must be configured with two actions
+ *  - The Configuration Action
+ *  - The Configuration Check
+ *
+ * The items in the array must be function pointers of type FwPrAction_t.
+ *
+ * For the IASW application, no Configuration Check is required for the
+ * OutStream components. Therefore, the default base implementation is used.
+ */
+#define CR_FW_OUTSTREAM_CONFIGCHECK {&CrFwBaseCmpDefConfigCheck, \
+                                     &CrFwBaseCmpDefConfigCheck, \
+                                     &CrFwBaseCmpDefConfigCheck}
+
+/**
+ * The functions implementing the Configuration Action of the OutStream
+ * components.
+ *
+ * The OutStream components are derived from the Base Component and they
+ * therefore inherit its Reset Procedure.
+ *
+ * \see CrFwResetProc.h
+ *
+ * The reset procedure must be configured with two actions
+ *  - The Configuration Action
+ *  - The Configuration Check
+ *
+ * The items in the array must be function pointers of type FwPrAction_t.
+ *
+ * For the IASW application, no Configuration Action is required for the
+ * OutStream components. Therefore, the default base implementation is used.
+ */
+#define CR_FW_OUTSTREAM_CONFIGACTION {&CrFwOutStreamDefConfigAction, \
+                                      &CrFwOutStreamDefConfigAction, \
+                                      &CrFwOutStreamDefConfigAction}
+
+/**
+ * The functions implementing the Shutdown Action of the OutStream components.
+ *
+ * The OutStream components are derived from the Base Component and they
+ * therefore inherit its Reset Procedure.
+ *
+ * \see CrFwBaseCmp.h
+ *
+ * The reset procedure must be configured with two actions
+ *  - The Configuration Action
+ *  - The Configuration Check
+ *
+ * The items in the array must be function pointers of type FwSmAction_t.
+ *
+ * For the IASW application, no Shutdown Action is required for the OutStream
+ * components. Therefore, the default base implementation is used.
+ */
+#define CR_FW_OUTSTREAM_SHUTDOWNACTION {&CrFwOutStreamDefShutdownAction, \
+                                        &CrFwOutStreamDefShutdownAction, \
+                                        &CrFwOutStreamDefShutdownAction}
+
+#endif /* CRFW_OUTSTREAM_USERPAR_H_ */
diff --git a/CrIa/src/CrConfigIa/CrFwUserConstants.h b/CrIa/src/CrConfigIa/CrFwUserConstants.h
new file mode 100644
index 0000000..2d5f74c
--- /dev/null
+++ b/CrIa/src/CrConfigIa/CrFwUserConstants.h
@@ -0,0 +1,279 @@
+/**
+ * @file CrFwUserConstants.h
+ * @ingroup CrIaConfig
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Header file to define all user-configurable constants and types for the IASW
+ * Application.
+ *
+ * The content of this file is taken over unchanged from the framework-provided
+ * default with the exception of the following items:
+ *
+ *  - The value of the application identifier (20 for the IASW).
+ *  - The maximum value of the service type, sub-type and discriminant
+ *    attributes
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH, 2014
+ */
+
+#ifndef CRFW_USERCONSTANTS_H_
+#define CRFW_USERCONSTANTS_H_
+
+/** Macro to suppress warnings about unused parameters */
+#define CRIA_UNUSED(x) (void)(x);
+
+/* in/out report values */
+#define CRIA_SUCCESS 1
+#define CRIA_FAILURE 0
+
+/* PCAT values */
+#define CR_FW_PCAT_SEM_TC            0x0C
+#define CR_FW_PCAT_SEM_TM            0x01 
+
+#define CR_FW_PCAT_DPU_TC            0x0C
+#define CR_FW_PCAT_DPU_TM_OTHER      0x02
+#define CR_FW_PCAT_DPU_TM_SERV1_5_6  0x01
+#define CR_FW_PCAT_DPU_TM_SERV13     0x04
+#define CR_FW_PCAT_DPU_TM_SERV196    0x03
+
+
+/** Type used for instance identifiers. */
+typedef unsigned int CrFwInstanceId_t;
+
+/** Type used for the identifier of a component type. */
+typedef unsigned short int CrFwTypeId_t;
+
+/** Type used for the outcome of a check (see <code>::CrFwCmpData</code>). */
+typedef unsigned char CrFwOutcome_t;
+
+/** Type used for the sequence counter of commands or reports. */
+typedef unsigned short int CrFwSeqCnt_t;
+
+/** Type used for the time stamp of a command or report. */
+typedef struct CrFwTimeStamp { unsigned char t[6]; } CrFwTimeStamp_t;
+
+/** Type used for the service type of a command or report. */
+typedef unsigned char CrFwServType_t;
+
+/** Type used for the command or report sub-type. */
+typedef unsigned char CrFwServSubType_t;
+
+/** Type used for the destination or source group of a packet. */
+typedef unsigned char CrFwGroup_t;
+
+/** Type used for the command or report destination and source. */
+typedef unsigned char CrFwDestSrc_t;
+
+/** Type used for the discriminant of a command or report. */
+typedef unsigned short CrFwDiscriminant_t;
+
+/** Type for the index used to track the state of a component. */
+typedef unsigned short CrFwTrackingIndex_t;
+
+/** Type for the index of a command or report kind. */
+typedef unsigned short CrFwCmdRepKindIndex_t;
+
+/** Type for the component kind key in <code>CrFwInFactory.c</code> and <code>CrFwOutFactory.c</code>. */
+typedef unsigned int CrFwCmdRepKindKey_t;
+
+/**
+ * Type for the index in the pool of pre-allocated OutComponents in
+ * the OutFactory (see <code>CrFwOutFactory.h</code>).
+ */
+typedef unsigned char CrFwOutFactoryPoolIndex_t;
+
+/**
+ * Type for the index in the pool of pre-allocated incoming components in
+ * the InFactory (see <code>CrFwInFactory.h</code>).
+ */
+typedef unsigned char CrFwInFactoryPoolIndex_t;
+
+/** Type used for unsigned integers with a "short" range. */
+typedef unsigned char CrFwCounterU1_t;
+
+/** Type used for signed integers with a "short" range. */
+typedef signed char CrFwCounterS1_t;
+
+/** Type used for unsigned integers with a "medium" range. */
+typedef unsigned short CrFwCounterU2_t;
+
+/** Type for the packet length. */
+typedef unsigned short int CrFwPcktLength_t;
+
+/** Type for the TM/TC version number. The length of the version is 3 bits. */
+typedef unsigned char CrIaPcktVersion_t;
+
+/**
+ * Type for the TC sequence flags and TM segmentation flags. The length of the
+ * flags is 2 bits.
+ */
+typedef unsigned char CrIaPcktSeqFlags_t;
+
+/** Type for the TM/TC crc. The length of the crc is 16bits. */
+typedef unsigned short CrIaPcktCrc_t;
+
+/**
+ * Identifier for the errors reported through the error reporting interface of <code>CrFwRepErr.h</code>.
+ * When a framework component encounters a non-nominal situation during its normal operation,
+ * it reports it as an error using the services defined by the <code>CrFwRepErr.h</code>
+ * interface.
+ * Each error situation is characterized by an error code.
+ * This enumerated type defines all the error codes.
+ */
+typedef enum {
+	/** The packet queue of an OutStream is full (see <code>CrFwOutStream.h</code>) */
+	crOutStreamPQFull =2,
+	/** The packet queue of an InStream is full (see <code>CrFwInStream.h</code>) */
+	crInStreamPQFull =3,
+	/** An InStream has encountered a sequence counter error (see <code>CrFwInStream.h</code>) */
+	crInStreamSCErr =4,
+	/** An OutComponent has an invalid destination (see <code>CrFwOutCmp.h</code>) */
+	crOutCmpSendPcktInvDest =5,
+	/** The Pending OutComponent List (POCL) of an OutManager is full (see <code>CrFwOutManager.h</code>) */
+	crOutManagerPoclFull =6,
+	/** The Pending Command/Report List (PCRL) of an InManager is full (see <code>CrFwInManager.h</code>) */
+	crInManagerPcrlFull =7,
+	/** The InLoader has retrieved a packet with an invalid destination (see <code>CrFwInLoader.h</code>) */
+	crInLoaderInvDest = 8,
+	/** An InReport or InCommand has failed its acceptance check */
+	crInLoaderAccFail = 9,
+	/** An OutComponent has an illegal group */
+	crOutStreamIllGroup = 10,
+	/** An incoming command or report has an illegal group */
+	crInStreamIllGroup = 11,
+	/** An outgoing packet cannot be created **/
+	crOutStreamNoMorePckt = 12,
+	/** An InReport cannot be created **/
+	crInLoaderCreFail = 13,
+	/** An InReport cannot be loaded **/
+	crInLoaderLdFail = 14
+} CrFwRepErrCode_t;
+
+/**
+ * Application error code for the framework components.
+ * An application error is declared when a framework function has been called by the
+ * application code with an illegal parameter values or in an illegal context and execution
+ * of the function with the illegal values would cause an internal framework data structure
+ * to be corrupted.
+ *
+ * Nominally, the application error code should be equal to: <code>::crNoAppErr</code>.
+ * If the application error code has a different value, then an application error has been
+ * encountered.
+ * If multiple errors have been encountered, the application error code reflects the
+ * most recent error.
+ */
+typedef enum {
+	/** No application errors have been detected. */
+	crNoAppErr = 0,
+	/** An OutStream function was called on an object which is not an OutStream. */
+	crNotOutStream = 1,
+	/** A framework function has been called with an illegal OutStream identifier. */
+	crOutStreamIllId = 2,
+	/**
+	 * A framework function has been called with a destination attribute which is
+	 * not associated to any OutStream.
+	 */
+	crOutStreamUndefDest = 3,
+	/**
+	 * A framework function has been called with a source attribute which is not
+	 * associated to any InStream.
+	 */
+	crInStreamUndefDest = 4,
+	/** A packet allocation request has failed (see <code>::CrFwPcktMake</code>). */
+	crPcktAllocationFail = 5,
+	/** A packet release request has encountered an error (see <code>::CrFwPcktRelease</code>). */
+	crPcktRelErr = 6,
+	/** An InStream function was called on an object which is not an InStream. */
+	crNotInStream = 7,
+	/** A framework function has been called with an illegal InStream identifier. */
+	crInStreamIllId = 8,
+	/** An OutComponent function was called on an object which is not an OutComponent. */
+	crNotOutCmp = 9,
+	/** An OutComponent allocation request has failed (see <code>::CrFwOutFactoryMakeOutCmp</code>). */
+	crOutCmpAllocationFail = 10,
+	/** An OutComponent release request has encountered an error (see <code>::CrFwOutFactoryReleaseOutCmp</code>). */
+	crOutCmpRelErr = 11,
+	/** A framework function was called with an illegal service type */
+	crIllServType = 12,
+	/** A framework function was called with an illegal service sub-type */
+	crIllServSubType = 13,
+	/** A framework function was called with an illegal discriminant */
+	crIllDiscriminant = 14,
+	/** A framework function was called with an illegal type/sub-type pair for an OutComponent */
+	crIllOutCmpType = 15,
+	/** A framework function was called with an illegal type/sub-type/discriminant triplet for an OutComponent */
+	crIllOutCmpKind = 16,
+	/** A framework function has been called with an illegal OutManager identifier. */
+	crOutManagerIllId = 17,
+	/** A framework function was called with an illegal type/sub-type/discriminant triplet for an InCommand */
+	crIllInCmdKind = 18,
+	/** Allocation request for a packet for an InCommand has failed (see <code>::CrFwInFactoryMakeInCmd</code>). */
+	crInCmdAllocationFail = 19,
+	/** A framework function was called with an illegal type/sub-type/discriminant triplet for an InReport */
+	crIllInRepKind = 20,
+	/** Allocation request for an InReport has failed (see <code>::CrFwInFactoryMakeInRep</code>). */
+	crInRepAllocationFail = 21,
+	/** An InReport release request has encountered an error (see <code>::CrFwInFactoryReleaseInRep</code>). */
+	crInRepRelErr = 22,
+	/** An InCommand release request has encountered an error (see <code>::CrFwInFactoryReleaseInCmd</code>). */
+	crInCmdRelErr = 23,
+	/** A framework function has been called with an illegal InManager identifier. */
+	crInManagerIllId = 24
+} CrFwAppErrCode_t;
+
+/** The identifier of the IASW Application. */
+#define CR_FW_HOST_APP_ID 20
+
+/**
+ * The identifier of the On-Board Computer (OBC) software. This is a service
+ * client to the IASW.
+ */
+#define CR_FW_CLIENT_OBC 12
+
+/**
+ * The identifier for the Ground software. This is the value that is written
+ * into the PUS packet and is mapped to CR_FW_CLIENT_GRD in the IASW
+ * application.
+ */
+#define CR_FW_CLIENT_GRD_PUS 0
+
+/**
+ * The identifier of the Ground (Grd) software. This is a service client to the
+ * IASW.
+ *
+ * Note that the specified Id in the PUS packet for Ground is 0. However, the
+ * Cordet framework does not recognize 0 as a valid number. For this
+ * application, 1 is used instead, and it is mapped correctly in
+ * CrFwPcktGetDest and CrFwPcktSetDest.
+ */
+#define CR_FW_CLIENT_GRD 1
+
+/**
+ * The identifier of the HK Storage. This is a dummy packet destination. It has
+ * a dedicated OutStream allocated it.
+ */
+#define CR_FW_CLIENT_HK_STRG 21
+
+/**
+ * The identifier of the Sensor Module (SEM) software. This is a service
+ * provider to the IASW.
+ */
+#define CR_FW_CLIENT_SEM 60
+
+/** The number of bits reserved for the application identifier in a command or report identifier */
+#define CR_FW_NBITS_APP_ID 4
+
+/** Maximum value of the service type attribute of InReports and InCommands for the IASW Application */
+#define CR_FW_MAX_SERV_TYPE 250 /* given the data type used, this is the maximum allowed value */
+
+/** Maximum value of the service sub-type attribute of InReports and InCommands for the IASW Application */
+#define CR_FW_MAX_SERV_SUBTYPE 250 /* given the data type used, this is the maximum allowed value */
+
+/** Maximum value of the discriminant attribute of InReports and InCommands for the IASW Application */
+#define CR_FW_MAX_DISCRIMINANT 65534 /* given the data type used, this is the maximum allowed value */
+
+/** The number of framework components */
+#define CR_IA_NOF_FW_CMP 11
+
+#endif /* CRFW_USERCONSTANTS_H_ */
diff --git a/CrIa/src/CrConfigIa/genOutReg.sh b/CrIa/src/CrConfigIa/genOutReg.sh
new file mode 100755
index 0000000..b0e26ba
--- /dev/null
+++ b/CrIa/src/CrConfigIa/genOutReg.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+
+FACTORY=`cat CrFwOutFactoryUserPar.h | sed -n "/CR_FW_OUTCMP_INIT_KIND_DESC/,/define/p" | awk -F "," '/{/{print $1, $2, $3}' | sed 1d | tr -d "{"`
+
+
+function ersetze ()
+{
+    tt=$1
+    if [[ ${tt:0:2} == "CR" ]]
+    then
+	grep -R $tt ../ 2>/dev/null | awk -F "define" '/define/{print $2}' | awk -v m=$tt '{if ($1 == m) {print $2}}' 
+    else
+	echo $tt
+    fi
+}
+
+for i in $FACTORY; do ersetze $i; done | awk '{a=$0; getline b; getline c; print "\t\t\t{ " a ",\t" b ",\t" c ",\t 0, 1, 1, NULL},\\"}'
+
+
diff --git a/CrIa/src/CrFwRepErr.c b/CrIa/src/CrFwRepErr.c
new file mode 100644
index 0000000..6c370b0
--- /dev/null
+++ b/CrIa/src/CrFwRepErr.c
@@ -0,0 +1,234 @@
+/**
+ * @file CrFwRepErr.c
+ * @ingroup CrIaDemo
+ *
+ * Implementation of the error reporting interface  for the IASW Demo
+ * Application.
+ *
+ * \see CrFwRepErr.h
+ *
+ * This implementation writes the error reports to standard output.
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH, 2014
+ */
+
+#include <CrFramework/CrFwConstants.h>
+#include <CrFramework/CrFwRepErr.h>
+
+#include <InRep/CrFwInRep.h> /* for CrFwInRepGetSeqCnt() */
+#include <InManager/CrFwInManager.h> /* for CrFwInManagerMake() */
+
+#include <Services/General/CrIaConstants.h>
+#include <CrIaIasw.h>
+#include <CrIaPckt.h>
+#include <CrFwUserConstants.h>
+
+#include <IfswUtilities.h> /* for SendTcAccRepFail() */
+#include <IfswDebug.h>
+
+unsigned short evt_data[2] = {0, 0};
+
+/* high/low is arbitrary, med is because of definitions in OutFactoryUserPar */
+
+static void do_report(CrFwRepErrCode_t errCode, CrFwTypeId_t typeId, CrFwInstanceId_t instanceId)
+{
+  unsigned short tcFailureCode;
+
+  CRFW_UNUSED(tcFailureCode);
+
+  DEBUGP("CrFwRepErr: do_report: errCode = %d\n", errCode);
+
+  /* see IASW ADD section 6.10 */
+  switch (errCode)
+    {
+    /* --- LOW_SEV ERRORs ----------------------------------------------------------------------- */
+    case crInStreamSCErr:
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_LOW_SEV,  CRIA_SERV5_EVT_SEQ_CNT_ERR, evt_data, 4);
+      break;
+
+
+    /* --- MED_SEV ERRORs ----------------------------------------------------------------------- */
+    case crInLoaderAccFail:
+      /* NOTE: if acceptance check fails for TC in-coming packets */
+      DEBUGP("CrFwRepErr: crInLoaderAccFail - CMD: outcome = %d, typeId = %d, instanceId = %d\n", evt_data[1], typeId, instanceId);
+      tcFailureCode = ACK_CREATE_FAIL;
+      SendTcAccRepFail(NULL, tcFailureCode);
+      break;
+
+    case crInLoaderCreFail:
+      break;
+
+    case crInLoaderLdFail:
+      /* NOTE: for InRep this is handled by CrFwRepErrRep */
+      break;
+
+    case crInManagerPcrlFull:
+      /* NOTE: for InRep this is handled by CrFwRepErrRep */
+      break;
+
+    case crInLoaderInvDest:
+      /* NOTE: An event TM(5,3) will be generated also in case of wrong APID which deviates from the definition 
+         in ECSS-E-70-41A: TM(1,2) with error code 0 = illegal APID (PAC error) */
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV, CRIA_SERV5_EVT_INV_DEST, evt_data, 4);
+      break;
+
+    case crInStreamPQFull:
+      evt_data[1] = instanceId; /* set InStream ID as data */
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_INSTRM_PQF, evt_data, 4);
+      break;
+
+    case crOutCmpSendPcktInvDest:
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OCMP_INVD, evt_data, 4);
+      break;
+
+    case crOutStreamIllGroup:
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OCMP_ILLGR, evt_data, 4);
+      break;
+      
+    case crInStreamIllGroup:
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_IN_ILLGR, evt_data, 4);
+      break;
+
+
+    /* --- HIGH_SEV ERRORs ----------------------------------------------------------------------- */
+
+
+
+    /* --- ENTRY in ERROR LOG -------------------------------------------------------------------- */
+    case crOutStreamPQFull:
+      /* Entry in Error Log with ID ERR_OUTSTREAM_PQ_FULL and OutStream ID as data */
+      evt_data[0] = instanceId; /* set OutStream ID as data */
+      CrIaErrRep(CRIA_SERV5_EVT_ERR_HIGH_SEV, ERR_OUTSTREAM_PQ_FULL, evt_data, 4);
+      break;
+
+    case crOutManagerPoclFull:
+      /* Entry in Error Log with ID ERR_POCL_FULL and POCL ID as data */
+      evt_data[0] = instanceId; /* set OutStream ID as data */
+      CrIaErrRep(CRIA_SERV5_EVT_ERR_HIGH_SEV, ERR_POCL_FULL, evt_data, 4);
+      break;
+
+    case crOutStreamNoMorePckt:
+      /* Entry in Error Log with ID ERR_OUTSTREAM_NO_PCKT and OutStream ID as data */
+      evt_data[0] = instanceId; /* set OutStream ID as data */
+      CrIaErrRep(CRIA_SERV5_EVT_ERR_HIGH_SEV, ERR_OUTCMP_NO_MORE_PCKT, evt_data, 4);
+      break;
+    }
+  
+  return;
+}
+
+void CrFwRepErr(CrFwRepErrCode_t errCode, CrFwTypeId_t typeId, CrFwInstanceId_t instanceId)
+{
+  do_report(errCode, typeId, instanceId);
+  
+  DEBUGP("CrFwRepErr: CrFwRepErr\n");
+
+  return;
+}
+
+void CrFwRepErrDestSrc(CrFwRepErrCode_t errCode, CrFwTypeId_t typeId, CrFwInstanceId_t instanceId, CrFwDestSrc_t destSrc)
+{
+  evt_data[0] = (unsigned short)(instanceId & 0xFFFF); /* NOTE: instanceId is truncated to 16 bit */
+  evt_data[1] = destSrc;
+
+  DEBUGP("CrFwRepErr: CrFwRepErrDestSrc\n");
+
+  do_report(errCode, typeId, instanceId);
+
+  return;
+}
+
+void CrFwRepErrGroup(CrFwRepErrCode_t errCode, CrFwTypeId_t typeId, CrFwInstanceId_t instanceId, CrFwGroup_t group)
+{
+  evt_data[0] = (unsigned short)(instanceId & 0xFFFF); /* NOTE: instanceId is truncated to 16 bit */
+  evt_data[1] = group;
+
+  DEBUGP("CrFwRepErr: CrFwRepErrGroup\n");
+
+  do_report(errCode, typeId, instanceId);
+
+  return;
+}
+
+void CrFwRepErrSeqCnt(CrFwRepErrCode_t errCode, CrFwTypeId_t typeId, CrFwInstanceId_t instanceId, CrFwSeqCnt_t expSeqCnt, CrFwSeqCnt_t actSeqCnt)
+{
+  evt_data[0] = expSeqCnt;
+  evt_data[1] = actSeqCnt;
+
+  DEBUGP("CrFwRepErr: CrFwRepErrSeqCnt\n");
+
+  if (expSeqCnt != 16384) /* exclude report, when SSC from SEM wraps around, because the counter only uses 14 bits */
+    do_report(errCode, typeId, instanceId);
+
+  return;
+}
+
+void CrFwRepErrInstanceIdAndOutcome(CrFwRepErrCode_t errCode, CrFwTypeId_t typeId, CrFwInstanceId_t instanceId, CrFwInstanceId_t secondaryInstanceId, CrFwOutcome_t outcome)
+{
+  evt_data[0] = (unsigned short)(secondaryInstanceId & 0xFFFF); /* NOTE: secondaryInstanceId is truncated to 16 bit */
+  evt_data[1] = outcome;
+
+  DEBUGP("CrFwRepErr: CrFwRepErrInstanceIdAndOutcome\n");
+
+  do_report(errCode, typeId, instanceId);
+
+  return;
+}
+
+void CrFwRepErrInstanceIdAndDest(CrFwRepErrCode_t errCode, CrFwTypeId_t typeId,	CrFwInstanceId_t instanceId, CrFwInstanceId_t secondaryInstanceId, CrFwDestSrc_t dest)
+{
+  evt_data[0] = (unsigned short)(secondaryInstanceId & 0xFFFF); /* NOTE: secondaryInstanceId is truncated to 16 bit */
+  evt_data[1] = dest;
+
+  DEBUGP("CrFwRepErr: CrFwRepErrInstanceIdAndDest\n");
+
+  do_report(errCode, typeId, instanceId);
+
+  return;
+}
+
+void CrFwRepErrPckt(CrFwRepErrCode_t errCode, CrFwTypeId_t typeId,
+                                    CrFwInstanceId_t instanceId, CrFwPckt_t pckt) 
+{
+  CrFwSeqCnt_t ssc;
+
+  CRFW_UNUSED(errCode);
+  CRFW_UNUSED(typeId);
+  CRFW_UNUSED(instanceId);
+
+  DEBUGP("CrFwRepErr: CrFwRepErrPckt\n");
+
+  ssc = CrFwPcktGetSeqCnt(pckt);
+  /* load source sequence counter ssc into evt_data */
+  evt_data[0] = ssc;
+  CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_INREP_CR_FAIL, evt_data, 4);
+
+  return;
+}
+
+void CrFwRepErrRep(CrFwRepErrCode_t errCode, CrFwTypeId_t typeId,
+                                    CrFwInstanceId_t instanceId, FwSmDesc_t rep)
+{
+  CrFwSeqCnt_t ssc;
+
+  CRFW_UNUSED(typeId);
+  CRFW_UNUSED(instanceId);
+
+  DEBUGP("CrFwRepErr: CrFwRepErrRep\n");
+
+  ssc = CrFwInRepGetSeqCnt(rep);
+  /* load source sequence counter ssc into evt_data */
+  evt_data[0] = ssc;
+  if (errCode == crInLoaderLdFail)
+    {
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_PCRL2_FULL, evt_data, 4);
+    }
+  else
+    {
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_INREP_CR_FAIL, evt_data, 4);
+    }
+
+  return;
+}
+
diff --git a/CrIa/src/CrFwRepInCmdOutcome.c b/CrIa/src/CrFwRepInCmdOutcome.c
new file mode 100644
index 0000000..a5f42de
--- /dev/null
+++ b/CrIa/src/CrFwRepInCmdOutcome.c
@@ -0,0 +1,115 @@
+#include "IfswDebug.h"
+/**
+ * @file CrFwRepInCmdOutcome.c
+ * @ingroup CrIaDemo
+ *
+ * Implementation of the error reporting interface of the IASW Application.
+ *
+ * \see CrFwRepErr.h
+ *
+ * This implementation writes the InCommand Outcome Reports to standard output.
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH, 2014
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+/* Include Framework Files */
+#include "CrFwConstants.h"
+#include "CrFwRepInCmdOutcome.h"
+#include <CrConfigIa/CrFwUserConstants.h>
+#include <FwProfile/FwSmConfig.h>
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+
+#include <IfswUtilities.h>
+#include <Services/General/CrIaConstants.h>
+
+
+/*-----------------------------------------------------------------------------------------*/
+void CrFwRepInCmdOutcomeCreFail(CrFwRepInCmdOutcome_t outcome, CrFwOutcome_t failCode, CrFwPckt_t pckt)
+{
+  CRFW_UNUSED(failCode);
+
+  switch (outcome)
+    {
+      case crCmdAckCreFail:
+        DEBUGP("CrFwRepInCmdOutcomeCreFail: InCmd had invalid type or no more resources are available\n");
+        SendTcAccRepFail(pckt, ACK_CREATE_FAIL);
+        break;
+
+      default:
+        break;
+    }
+
+  return;
+}
+
+void CrFwRepInCmdOutcome(CrFwRepInCmdOutcome_t outcome, CrFwInstanceId_t instanceId, CrFwServType_t servType,
+			 CrFwServSubType_t servSubType, CrFwDiscriminant_t disc, CrFwOutcome_t failCode, FwSmDesc_t inCmd)
+{
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(inCmd);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  CRFW_UNUSED(pckt);
+
+  if (failCode != 0)
+    {
+
+      DEBUGP("CrFwRepInCmdOutcome: unexpected outcome report for InCommand %d, service type %d,\n",instanceId,servType);
+      DEBUGP("                     service sub-type %d, and discriminant %d\n",servSubType,disc);
+      DEBUGP("                     FAILURE CODE: %d\n", failCode);
+
+      switch (outcome)
+        {
+
+        case crCmdAckAccFail:
+          DEBUGP("crCmdAckAccFail: Failure Code: %d, Outcome: %d, Instance ID: %d, inCmd: %d\n", failCode, outcome, instanceId, (unsigned int)inCmd);
+          break;
+
+        case crCmdAckStrFail:
+          DEBUGP("crCmdAckStrFail: Failure Code: %d, Outcome: %d, Instance ID: %d, inCmd: %d\n", failCode, outcome, instanceId, (unsigned int)inCmd);
+          break;
+
+        case crCmdAckPrgFail:
+          DEBUGP("crCmdAckPrgFail: Failure Code: %d, Outcome: %d, Instance ID: %d, inCmd: %d\n", failCode, outcome, instanceId, (unsigned int)inCmd);
+          break;
+
+        case crCmdAckTrmFail:
+          DEBUGP("crCmdAckTrmFail: Failure Code: %d, Outcome: %d, Instance ID: %d, inCmd: %d\n", failCode, outcome, instanceId, (unsigned int)inCmd);
+          break;
+
+        default:
+          DEBUGP("crCmdAck: else (outcome = %d)\n", outcome);
+          break;
+
+        }
+    }
+
+  else /* failCode == 0 */
+    {
+
+      switch (outcome)
+        {
+    
+        case crCmdAckLdFail:
+          DEBUGP("crCmdAckLdFail: Serv(%d, %d), Failure Code: %d, Outcome: %d, Instance ID: %d, inCmd: %d\n", servType, servSubType, failCode, outcome, instanceId, (unsigned int)inCmd);
+          SendTcAccRepFail(pckt, ACK_PCRL1_FULL);
+          break;
+
+        default:
+          /* no error */
+          break;      
+       }      
+     
+    }
+  
+  return;
+}
diff --git a/CrIa/src/CrIaDataPool.c b/CrIa/src/CrIaDataPool.c
new file mode 100644
index 0000000..e662c02
--- /dev/null
+++ b/CrIa/src/CrIaDataPool.c
@@ -0,0 +1,7988 @@
+#include "CrIaDataPool.h"
+#include "CrIaDataPoolId.h"
+#include <string.h>
+
+#ifndef ISOLATED
+#include <InFactory/CrFwInFactory.h>
+#include <OutFactory/CrFwOutFactory.h>
+#include <InManager/CrFwInManager.h>
+#include <OutManager/CrFwOutManager.h>
+#include <InStream/CrFwInStream.h>
+#include <OutStream/CrFwOutStream.h>
+#include <InCmd/CrFwInCmd.h>
+#include <InRep/CrFwInRep.h>
+#include <FwProfile/FwPrCore.h> /* for FwPrGetCurNode() */
+
+#include <CrIaIasw.h>
+#include "IfswDebug.h"
+#else
+#include <stdio.h>
+#define x_printf printf
+#endif
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+unsigned int useMaxAcquisitionNum = 1; /* Mantis 2168 */
+
+/** Initialization of the structure holding of data pool variables and parameter items for CORDET. */
+#ifdef PC_TARGET
+struct DataPoolCordet dpCordet;
+struct DataPoolCordet dpCordetInit = { 
+#else
+struct DataPoolCordet dpCordet = { 
+#endif /* PC_TARGET */
+  /* ID: 2, value: 0, name: AppErrCode, multiplicity: 1 */
+                   0,
+  /* ID: 3, value: 0, name: NofAllocatedInRep, multiplicity: 1 */
+                   0,
+  /* ID: 4, value: 0, name: MaxNOfInRep, multiplicity: 1 */
+                   0,
+  /* ID: 5, value: 0, name: NofAllocatedInCmd, multiplicity: 1 */
+                   0,
+  /* ID: 6, value: 0, name: MaxNOfInCmd, multiplicity: 1 */
+                   0,
+  /* ID: 7, value: 0, name: Sem_NOfPendingInCmp, multiplicity: 1 */
+                   0,
+  /* ID: 8, value: 0, name: Sem_PCRLSize, multiplicity: 1 */
+                   0,
+  /* ID: 9, value: 0, name: Sem_NOfLoadedInCmp, multiplicity: 1 */
+                   0,
+  /* ID: 10, value: 0, name: GrdObc_NOfPendingInCmp, multiplicity: 1 */
+                    0,
+  /* ID: 11, value: 0, name: GrdObc_PCRLSize, multiplicity: 1 */
+                    0,
+  /* ID: 12, value: 0, name: NOfAllocatedOutCmp, multiplicity: 1 */
+                    0,
+  /* ID: 13, value: 0, name: MaxNOfOutCmp, multiplicity: 1 */
+                    0,
+  /* ID: 14, value: 0, name: NOfInstanceId, multiplicity: 1 */
+                    0,
+  /* ID: 15, value: 0, name: OutMg1_NOfPendingOutCmp, multiplicity: 1 */
+                    0,
+  /* ID: 16, value: 0, name: OutMg1_POCLSize, multiplicity: 1 */
+                    0,
+  /* ID: 17, value: 0, name: OutMg1_NOfLoadedOutCmp, multiplicity: 1 */
+                    0,
+  /* ID: 18, value: 0, name: OutMg2_NOfPendingOutCmp, multiplicity: 1 */
+                    0,
+  /* ID: 19, value: 0, name: OutMg2_POCLSize, multiplicity: 1 */
+                    0,
+  /* ID: 20, value: 0, name: OutMg2_NOfLoadedOutCmp, multiplicity: 1 */
+                    0,
+  /* ID: 21, value: 0, name: OutMg3_NOfPendingOutCmp, multiplicity: 1 */
+                    0,
+  /* ID: 22, value: 0, name: OutMg3_POCLSize, multiplicity: 1 */
+                    0,
+  /* ID: 23, value: 0, name: OutMg3_NOfLoadedOutCmp, multiplicity: 1 */
+                    0,
+  /* ID: 24, value: 0, name: InSem_SeqCnt, multiplicity: 1 */
+                    0,
+  /* ID: 25, value: 0, name: InSem_NOfPendingPckts, multiplicity: 1 */
+                    0,
+  /* ID: 26, value: 0, name: InSem_NOfGroups, multiplicity: 1 */
+                    0,
+  /* ID: 27, value: 0, name: InSem_PcktQueueSize, multiplicity: 1 */
+                    0,
+  /* ID: 28, value: 0, name: InSem_Src, multiplicity: 1 */
+                    0,
+  /* ID: 29, value: 0, name: InObc_NOfPendingPckts, multiplicity: 1 */
+                    0,
+  /* ID: 30, value: 0, name: InObc_NOfGroups, multiplicity: 1 */
+                    0,
+  /* ID: 31, value: 0, name: InObc_PcktQueueSize, multiplicity: 1 */
+                    0,
+  /* ID: 32, value: 0, name: InObc_Src, multiplicity: 1 */
+                    0,
+  /* ID: 33, value: 0, name: InGrd_NOfPendingPckts, multiplicity: 1 */
+                    0,
+  /* ID: 34, value: 0, name: InGrd_NOfGroups, multiplicity: 1 */
+                    0,
+  /* ID: 35, value: 0, name: InGrd_PcktQueueSize, multiplicity: 1 */
+                    0,
+  /* ID: 36, value: 0, name: InGrd_Src, multiplicity: 1 */
+                    0,
+  /* ID: 37, value: 0, name: OutSem_Dest, multiplicity: 1 */
+                    0,
+  /* ID: 38, value: 0, name: OutSem_SeqCnt, multiplicity: 1 */
+                    0,
+  /* ID: 39, value: 0, name: OutSem_NOfPendingPckts, multiplicity: 1 */
+                    0,
+  /* ID: 40, value: 0, name: OutSem_NOfGroups, multiplicity: 1 */
+                    0,
+  /* ID: 41, value: 0, name: OutSem_PcktQueueSize, multiplicity: 1 */
+                    0,
+  /* ID: 42, value: 0, name: OutObc_Dest, multiplicity: 1 */
+                    0,
+  /* ID: 43, value: 0, name: OutObc_SeqCnt_Group0, multiplicity: 1 */
+                    0,
+  /* ID: 44, value: 0, name: OutObc_SeqCnt_Group1, multiplicity: 1 */
+                    0,
+  /* ID: 45, value: 0, name: OutObc_NOfPendingPckts, multiplicity: 1 */
+                    0,
+  /* ID: 46, value: 0, name: OutObc_NOfGroups, multiplicity: 1 */
+                    0,
+  /* ID: 47, value: 0, name: OutObc_PcktQueueSize, multiplicity: 1 */
+                    0,
+  /* ID: 48, value: 0, name: OutGrd_Dest, multiplicity: 1 */
+                    0,
+  /* ID: 49, value: 0, name: OutGrd_SeqCnt_Group0, multiplicity: 1 */
+                    0,
+  /* ID: 50, value: 0, name: OutGrd_SeqCnt_Group1, multiplicity: 1 */
+                    0,
+  /* ID: 51, value: 0, name: OutGrd_SeqCnt_Group2, multiplicity: 1 */
+                    0,
+  /* ID: 52, value: 0, name: OutGrd_NOfPendingPckts, multiplicity: 1 */
+                    0,
+  /* ID: 53, value: 0, name: OutGrd_NOfGroups, multiplicity: 1 */
+                    0,
+  /* ID: 54, value: 0, name: OutGrd_PcktQueueSize, multiplicity: 1 */
+                    0
+};
+
+/** Initialization of the structure holding of data pool variables and parameter items for IASW. */
+#ifdef PC_TARGET
+struct DataPoolIasw dpIasw;
+struct DataPoolIasw dpIaswInit = { 
+#else
+struct DataPoolIasw dpIasw = { 
+#endif /* PC_TARGET */
+  /* ID: 1, value: 0, name: buildNumber, multiplicity: 1 */
+                   0,
+  /* ID: 55, value: 1, name: sibNFull, multiplicity: 1 */
+                    1,
+  /* ID: 56, value: 1, name: cibNFull, multiplicity: 1 */
+                    1,
+  /* ID: 57, value: 1, name: gibNFull, multiplicity: 1 */
+                    1,
+  /* ID: 58, value: 1, name: sibNWin, multiplicity: 1 */
+                    1,
+  /* ID: 59, value: 1, name: cibNWin, multiplicity: 1 */
+                    1,
+  /* ID: 60, value: 1, name: gibNWin, multiplicity: 1 */
+                    1,
+  /* ID: 61, value: 1024, name: sibSizeFull, multiplicity: 1 */
+                    1024,
+  /* ID: 62, value: 1024, name: cibSizeFull, multiplicity: 1 */
+                    1024,
+  /* ID: 63, value: 1024, name: gibSizeFull, multiplicity: 1 */
+                    1024,
+  /* ID: 64, value: 1024, name: sibSizeWin, multiplicity: 1 */
+                    1024,
+  /* ID: 65, value: 1024, name: cibSizeWin, multiplicity: 1 */
+                    1024,
+  /* ID: 66, value: 1024, name: gibSizeWin, multiplicity: 1 */
+                    1024,
+  /* ID: 67, value: 0, name: sibIn, multiplicity: 1 */
+                    0,
+  /* ID: 68, value: 0, name: sibOut, multiplicity: 1 */
+                    0,
+  /* ID: 69, value: 0, name: cibIn, multiplicity: 1 */
+                    0,
+  /* ID: 70, value: 0, name: gibIn, multiplicity: 1 */
+                    0,
+  /* ID: 71, value: 0, name: gibOut, multiplicity: 1 */
+                    0,
+  /* ID: 72, value: STOPPED, name: sdbState, multiplicity: 1 */
+                    0,
+  /* ID: 73, value: 0, name: sdbStateCnt, multiplicity: 1 */
+                    0,
+  /* ID: 74, value: 0, name: OffsetX, multiplicity: 1 */
+                    0,
+  /* ID: 75, value: 0, name: OffsetY, multiplicity: 1 */
+                    0,
+  /* ID: 76, value: 51200, name: TargetLocationX, multiplicity: 1 */
+                    51200,
+  /* ID: 77, value: 51200, name: TargetLocationY, multiplicity: 1 */
+                    51200,
+  /* ID: 78, value: 0, name: IntegStartTimeCrs, multiplicity: 1 */
+                    0,
+  /* ID: 79, value: 0, name: IntegStartTimeFine, multiplicity: 1 */
+                    0,
+  /* ID: 80, value: 0, name: IntegEndTimeCrs, multiplicity: 1 */
+                    0,
+  /* ID: 81, value: 0, name: IntegEndTimeFine, multiplicity: 1 */
+                    0,
+  /* ID: 82, value: 0, name: DataCadence, multiplicity: 1 */
+                    0,
+  /* ID: 83, value: 0, name: ValidityStatus, multiplicity: 1 */
+                    0,
+  /* ID: 84, value: 0, name: NOfTcAcc, multiplicity: 1 */
+                    0,
+  /* ID: 85, value: 0, name: NOfAccFailedTc, multiplicity: 1 */
+                    0,
+  /* ID: 86, value: 0, name: SeqCntLastAccTcFromObc, multiplicity: 1 */
+                    0,
+  /* ID: 87, value: 0, name: SeqCntLastAccTcFromGrd, multiplicity: 1 */
+                    0,
+  /* ID: 88, value: 0, name: SeqCntLastAccFailTc, multiplicity: 1 */
+                    0,
+  /* ID: 89, value: 0, name: NOfStartFailedTc, multiplicity: 1 */
+                    0,
+  /* ID: 90, value: 0, name: SeqCntLastStartFailTc, multiplicity: 1 */
+                    0,
+  /* ID: 91, value: 0, name: NOfTcTerm, multiplicity: 1 */
+                    0,
+  /* ID: 92, value: 0, name: NOfTermFailedTc, multiplicity: 1 */
+                    0,
+  /* ID: 93, value: 0, name: SeqCntLastTermFailTc, multiplicity: 1 */
+                    0,
+  /* ID: 94, value: Auto, name: RdlSidList, multiplicity: 10 */
+                    {1,2,3,4,5,6,0,0,0,0},
+  /* ID: 95, value: Auto, name: isRdlFree, multiplicity: 10 */
+                    {0,0,0,0,0,0,1,1,1,1},
+  /* ID: 96, value: 0, name: RdlCycCntList, multiplicity: 10 */
+                    {0,0,0,0,0,0,0,0,0,0},
+  /* ID: 97, value: Auto, name: RdlPeriodList, multiplicity: 10 */
+                    {160,0,32,8,0,160,0,0,0,0},
+  /* ID: 98, value: Auto, name: RdlEnabledList, multiplicity: 10 */
+                    {1,0,0,0,0,0,0,0,0,0},
+  /* ID: 99, value: 0, name: RdlDestList, multiplicity: 10 */
+                    {0,0,0,0,0,0,0,0,0,0},
+  /* ID: 100, value: Auto, name: RdlDataItemList_0, multiplicity: 250 */
+{BUILDNUMBER_ID,APPERRCODE_ID,SIBNFULL_ID,CIBNFULL_ID,GIBNFULL_ID,SIBNWIN_ID,CIBNWIN_ID,GIBNWIN_ID,SIBSIZEFULL_ID,CIBSIZEFULL_ID,GIBSIZEFULL_ID,SIBSIZEWIN_ID,CIBSIZEWIN_ID,GIBSIZEWIN_ID,SIBIN_ID,SIBOUT_ID,CIBIN_ID,GIBIN_ID,GIBOUT_ID,SDBSTATE_ID,NOFTCACC_ID,NOFACCFAILEDTC_ID,SEQCNTLASTACCTCFROMOBC_ID,SEQCNTLASTACCTCFROMGRD_ID,SEQCNTLASTACCFAILTC_ID,NOFSTARTFAILEDTC_ID,SEQCNTLASTSTARTFAILTC_ID,NOFTCTERM_ID,NOFTERMFAILEDTC_ID,SEQCNTLASTTERMFAILTC_ID,SDU2STATE_ID,SDU4STATE_ID,SDSCOUNTER_ID,FDCHECKTTMSTATE_ID,FDCHECKSDSCSTATE_ID,FDCHECKCOMERRSTATE_ID,FDCHECKTIMEOUTSTATE_ID,FDCHECKSAFEMODESTATE_ID,FDCHECKALIVESTATE_ID,FDCHECKSEMANOEVTSTATE_ID,FDCHECKSEMLIMITSTATE_ID,FDCHECKDPUHKSTATE_ID,FDCHECKCENTCONSSTATE_ID,FDCHECKRESSTATE_ID,FDCHECKSEMCONS_ID,SEMSTATE_ID,SEMOPERSTATE_ID,SCISUBMODE_ID,IASWSTATE_ID,IASWCYCLECNT_ID,PREPSCIENCENODE_ID,CONTROLLEDSWITCHOFFNODE_ID,ALGOCENT0STATE_ID,ALGOCENT1STATE_ID,ALGOACQ1STATE_ID,ALGOCCSTATE_ID,ALGOTTC1STATE_ID,ALGOTTC2STATE_ID,ALGOSAAEVALSTATE_ID,ISSAAACTIVE_ID,SAACOUNTER_ID,ALGOSDSEVALSTATE_ID,ISSDSACTIVE_ID,OBSERVATIONID_ID,CENTVALPROCOUTPUT_ID,SAVEIMAGESNODE_ID,ACQFULLDROPNODE_ID,CALFULLSNAPNODE_ID,SCIWINNODE_ID,FBFLOADNODE_ID,FBFSAVENODE_ID,TRANSFBFTOGRNDNODE_ID,NOMSCINODE_ID,ADC_P3V3_ID,ADC_P5V_ID,ADC_P1V8_ID,ADC_P2V5_ID,ADC_N5V_ID,ADC_PGND_ID,ADC_TEMPOH1A_ID,ADC_TEMP1_ID,ADC_TEMPOH2A_ID,ADC_TEMPOH1B_ID,ADC_TEMPOH3A_ID,ADC_TEMPOH2B_ID,ADC_TEMPOH4A_ID,ADC_TEMPOH3B_ID,ADC_TEMPOH4B_ID,SEM_P15V_ID,SEM_P30V_ID,SEM_P5V0_ID,SEM_P7V0_ID,SEM_N5V0_ID,ISWATCHDOGENABLED_ID,ISSYNCHRONIZED_ID,NOFERRLOGENTRIES_ID,CORE0LOAD_ID,CORE1LOAD_ID,INTERRUPTRATE_ID,UPTIME_ID,IRL1_ID,IRL2_ID,SEMROUTE_ID,SPW1BYTESIN_ID,SPW1BYTESOUT_ID,EDACSINGLEFAULTS_ID,EDACLASTSINGLEFAIL_ID,CPU2PROCSTATUS_ID,CE_COUNTER_ID,CE_VERSION_ID,CE_INTEGRITY_ID,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+  /* ID: 101, value: Auto, name: RdlDataItemList_1, multiplicity: 250 */
+{RDLENABLEDLIST_ID,EVTFILTERDEF_ID,EVTENABLEDLIST_ID,FDGLBENABLE_ID,RPGLBENABLE_ID,FDCHECKTTMEXTEN_ID,RPTTMEXTEN_ID,FDCHECKTTMCNTTHR_ID,TTC_LL_ID,TTC_UL_ID,TTM_LIM_ID,FDCHECKSDSCEXTEN_ID,RPSDSCEXTEN_ID,FDCHECKSDSCCNTTHR_ID,FDCHECKCOMERREXTEN_ID,RPCOMERREXTEN_ID,FDCHECKCOMERRCNTTHR_ID,FDCHECKTIMEOUTEXTEN_ID,RPTIMEOUTEXTEN_ID,FDCHECKTIMEOUTCNTTHR_ID,SEM_TO_POWERON_ID,SEM_TO_SAFE_ID,SEM_TO_STAB_ID,SEM_TO_TEMP_ID,SEM_TO_CCD_ID,SEM_TO_DIAG_ID,SEM_TO_STANDBY_ID,FDCHECKSAFEMODEEXTEN_ID,RPSAFEMODEEXTEN_ID,FDCHECKSAFEMODECNTTHR_ID,FDCHECKALIVEEXTEN_ID,RPALIVEEXTEN_ID,FDCHECKALIVECNTTHR_ID,SEM_HK_DEF_PER_ID,FDCHECKSEMANOEVTEXTEN_ID,RPSEMANOEVTEXTEN_ID,FDCHECKSEMANOEVTCNTTHR_ID,SEMANOEVTRESP_1_ID,SEMANOEVTRESP_2_ID,SEMANOEVTRESP_3_ID,SEMANOEVTRESP_4_ID,SEMANOEVTRESP_5_ID,SEMANOEVTRESP_6_ID,SEMANOEVTRESP_7_ID,SEMANOEVTRESP_8_ID,SEMANOEVTRESP_9_ID,SEMANOEVTRESP_10_ID,SEMANOEVTRESP_11_ID,SEMANOEVTRESP_12_ID,SEMANOEVTRESP_13_ID,SEMANOEVTRESP_14_ID,SEMANOEVTRESP_15_ID,SEMANOEVTRESP_16_ID,SEMANOEVTRESP_17_ID,SEMANOEVTRESP_18_ID,SEMANOEVTRESP_19_ID,SEMANOEVTRESP_20_ID,SEMANOEVTRESP_21_ID,SEMANOEVTRESP_22_ID,SEMANOEVTRESP_23_ID,SEMANOEVTRESP_24_ID,SEMANOEVTRESP_25_ID,SEMANOEVTRESP_26_ID,SEMANOEVTRESP_27_ID,SEMANOEVTRESP_28_ID,SEMANOEVTRESP_29_ID,FDCHECKSEMLIMITEXTEN_ID,RPSEMLIMITEXTEN_ID,FDCHECKSEMLIMITCNTTHR_ID,SEM_LIM_DEL_T_ID,FDCHECKDPUHKEXTEN_ID,RPDPUHKEXTEN_ID,FDCHECKDPUHKCNTTHR_ID,FDCHECKCENTCONSEXTEN_ID,RPCENTCONSEXTEN_ID,FDCHECKCENTCONSCNTTHR_ID,FDCHECKRESEXTEN_ID,RPRESEXTEN_ID,FDCHECKRESCNTTHR_ID,CPU1_USAGE_MAX_ID,MEM_USAGE_MAX_ID,FDCHECKSEMCONSEXTEN_ID,RPSEMCONSEXTEN_ID,FDCHECKSEMCONSCNTTHR_ID,SEM_INIT_T1_ID,SEM_INIT_T2_ID,SEM_OPER_T1_ID,SEM_SHUTDOWN_T1_ID,SEM_SHUTDOWN_T11_ID,SEM_SHUTDOWN_T12_ID,SEM_SHUTDOWN_T2_ID,CTRLD_SWITCH_OFF_T1_ID,ALGOCENT0ENABLED_ID,ALGOCENT1ENABLED_ID,CENT_EXEC_PHASE_ID,ALGOACQ1ENABLED_ID,ALGOCCENABLED_ID,STCK_ORDER_ID,ALGOTTC1ENABLED_ID,TTC1_EXEC_PER_ID,TTC1_LL_FRT_ID,TTC1_LL_AFT_ID,TTC1_UL_FRT_ID,TTC1_UL_AFT_ID,ALGOTTC2ENABLED_ID,TTC2_EXEC_PER_ID,TTC2_REF_TEMP_ID,TTC2_OFFSETA_ID,TTC2_OFFSETF_ID,TTC2_PA_ID,TTC2_DA_ID,TTC2_IA_ID,TTC2_PF_ID,TTC2_DF_ID,TTC2_IF_ID,SAA_EXEC_PHASE_ID,SAA_EXEC_PER_ID,SDS_EXEC_PHASE_ID,SDS_EXEC_PER_ID,SDS_FORCED_ID,SDS_INHIBITED_ID,EARTH_OCCULT_ACTIVE_ID,CENT_OFFSET_LIM_ID,CENT_FROZEN_LIM_ID,SEM_SERV1_1_FORWARD_ID,SEM_SERV1_2_FORWARD_ID,SEM_SERV1_7_FORWARD_ID,SEM_SERV1_8_FORWARD_ID,SEM_SERV3_1_FORWARD_ID,SEM_SERV3_2_FORWARD_ID,TEMP_SEM_SCU_LW_ID,TEMP_SEM_PCU_LW_ID,VOLT_SCU_P3_4_LW_ID,VOLT_SCU_P5_LW_ID,TEMP_FEE_CCD_LW_ID,TEMP_FEE_STRAP_LW_ID,TEMP_FEE_ADC_LW_ID,TEMP_FEE_BIAS_LW_ID,TEMP_FEE_DEB_LW_ID,VOLT_FEE_VOD_LW_ID,VOLT_FEE_VRD_LW_ID,VOLT_FEE_VOG_LW_ID,VOLT_FEE_VSS_LW_ID,VOLT_FEE_CCD_LW_ID,VOLT_FEE_CLK_LW_ID,VOLT_FEE_ANA_P5_LW_ID,VOLT_FEE_ANA_N5_LW_ID,VOLT_FEE_ANA_P3_3_LW_ID,CURR_FEE_CLK_BUF_LW_ID,VOLT_SCU_FPGA_P1_5_LW_ID,CURR_SCU_P3_4_LW_ID,TEMP_SEM_SCU_UW_ID,TEMP_SEM_PCU_UW_ID,VOLT_SCU_P3_4_UW_ID,VOLT_SCU_P5_UW_ID,TEMP_FEE_CCD_UW_ID,TEMP_FEE_STRAP_UW_ID,TEMP_FEE_ADC_UW_ID,TEMP_FEE_BIAS_UW_ID,TEMP_FEE_DEB_UW_ID,VOLT_FEE_VOD_UW_ID,VOLT_FEE_VRD_UW_ID,VOLT_FEE_VOG_UW_ID,VOLT_FEE_VSS_UW_ID,VOLT_FEE_CCD_UW_ID,VOLT_FEE_CLK_UW_ID,VOLT_FEE_ANA_P5_UW_ID,VOLT_FEE_ANA_N5_UW_ID,VOLT_FEE_ANA_P3_3_UW_ID,CURR_FEE_CLK_BUF_UW_ID,VOLT_SCU_FPGA_P1_5_UW_ID,CURR_SCU_P3_4_UW_ID,TEMP_SEM_SCU_LA_ID,TEMP_SEM_PCU_LA_ID,VOLT_SCU_P3_4_LA_ID,VOLT_SCU_P5_LA_ID,TEMP_FEE_CCD_LA_ID,TEMP_FEE_STRAP_LA_ID,TEMP_FEE_ADC_LA_ID,TEMP_FEE_BIAS_LA_ID,TEMP_FEE_DEB_LA_ID,VOLT_FEE_VOD_LA_ID,VOLT_FEE_VRD_LA_ID,VOLT_FEE_VOG_LA_ID,VOLT_FEE_VSS_LA_ID,VOLT_FEE_CCD_LA_ID,VOLT_FEE_CLK_LA_ID,VOLT_FEE_ANA_P5_LA_ID,VOLT_FEE_ANA_N5_LA_ID,VOLT_FEE_ANA_P3_3_LA_ID,CURR_FEE_CLK_BUF_LA_ID,VOLT_SCU_FPGA_P1_5_LA_ID,CURR_SCU_P3_4_LA_ID,TEMP_SEM_SCU_UA_ID,TEMP_SEM_PCU_UA_ID,VOLT_SCU_P3_4_UA_ID,VOLT_SCU_P5_UA_ID,TEMP_FEE_CCD_UA_ID,TEMP_FEE_STRAP_UA_ID,TEMP_FEE_ADC_UA_ID,TEMP_FEE_BIAS_UA_ID,TEMP_FEE_DEB_UA_ID,VOLT_FEE_VOD_UA_ID,VOLT_FEE_VRD_UA_ID,VOLT_FEE_VOG_UA_ID,VOLT_FEE_VSS_UA_ID,VOLT_FEE_CCD_UA_ID,VOLT_FEE_CLK_UA_ID,VOLT_FEE_ANA_P5_UA_ID,VOLT_FEE_ANA_N5_UA_ID,VOLT_FEE_ANA_P3_3_UA_ID,CURR_FEE_CLK_BUF_UA_ID,VOLT_SCU_FPGA_P1_5_UA_ID,CURR_SCU_P3_4_UA_ID,SEM_SERV5_1_FORWARD_ID,SEM_SERV5_2_FORWARD_ID,SEM_SERV5_3_FORWARD_ID,SEM_SERV5_4_FORWARD_ID,ACQFULLDROPT1_ID,ACQFULLDROPT2_ID,CALFULLSNAPT1_ID,CALFULLSNAPT2_ID,SCIWINT1_ID,SCIWINT2_ID,ADC_P3V3_U_ID,ADC_P5V_U_ID,ADC_P1V8_U_ID,ADC_P2V5_U_ID,ADC_N5V_L_ID,ADC_PGND_U_ID,ADC_PGND_L_ID,ADC_TEMPOH1A_U_ID,ADC_TEMP1_U_ID,ADC_TEMPOH2A_U_ID,ADC_TEMPOH1B_U_ID,ADC_TEMPOH3A_U_ID,ADC_TEMPOH2B_U_ID,ADC_TEMPOH4A_U_ID,ADC_TEMPOH3B_U_ID,ADC_TEMPOH4B_U_ID,SEM_P15V_U_ID,SEM_P30V_U_ID,SEM_P5V0_U_ID,SEM_P7V0_U_ID,SEM_N5V0_L_ID,HBSEMPASSWORD_ID,0,0,0,0},
+  /* ID: 102, value: Auto, name: RdlDataItemList_2, multiplicity: 250 */
+{NOFALLOCATEDINREP_ID,NOFALLOCATEDINCMD_ID,SEM_NOFPENDINGINCMP_ID,SEM_NOFLOADEDINCMP_ID,GRDOBC_NOFPENDINGINCMP_ID,NOFALLOCATEDOUTCMP_ID,NOFINSTANCEID_ID,OUTMG1_NOFPENDINGOUTCMP_ID,OUTMG1_NOFLOADEDOUTCMP_ID,OUTMG2_NOFPENDINGOUTCMP_ID,OUTMG2_NOFLOADEDOUTCMP_ID,OUTMG3_NOFPENDINGOUTCMP_ID,OUTMG3_NOFLOADEDOUTCMP_ID,INSEM_NOFPENDINGPCKTS_ID,INOBC_NOFPENDINGPCKTS_ID,INGRD_NOFPENDINGPCKTS_ID,OUTSEM_NOFPENDINGPCKTS_ID,OUTOBC_NOFPENDINGPCKTS_ID,OUTGRD_NOFPENDINGPCKTS_ID,SDBSTATECNT_ID,LASTPATCHEDADDR_ID,LASTDUMPADDR_ID,SDU2BLOCKCNT_ID,SDU4BLOCKCNT_ID,FDCHECKTTMINTEN_ID,RPTTMINTEN_ID,FDCHECKTTMCNT_ID,FDCHECKTTMSPCNT_ID,FDCHECKSDSCINTEN_ID,RPSDSCINTEN_ID,FDCHECKSDSCCNT_ID,FDCHECKSDSCSPCNT_ID,FDCHECKCOMERRINTEN_ID,RPCOMERRINTEN_ID,FDCHECKCOMERRCNT_ID,FDCHECKCOMERRSPCNT_ID,FDCHECKTIMEOUTINTEN_ID,RPTIMEOUTINTEN_ID,FDCHECKTIMEOUTCNT_ID,FDCHECKTIMEOUTSPCNT_ID,FDCHECKSAFEMODEINTEN_ID,RPSAFEMODEINTEN_ID,FDCHECKSAFEMODECNT_ID,FDCHECKSAFEMODESPCNT_ID,FDCHECKALIVEINTEN_ID,RPALIVEINTEN_ID,FDCHECKALIVECNT_ID,FDCHECKALIVESPCNT_ID,FDCHECKSEMANOEVTINTEN_ID,RPSEMANOEVTINTEN_ID,FDCHECKSEMANOEVTCNT_ID,FDCHECKSEMANOEVTSPCNT_ID,FDCHECKSEMLIMITINTEN_ID,RPSEMLIMITINTEN_ID,FDCHECKSEMLIMITCNT_ID,FDCHECKSEMLIMITSPCNT_ID,FDCHECKDPUHKINTEN_ID,RPDPUHKINTEN_ID,FDCHECKDPUHKCNT_ID,FDCHECKDPUHKSPCNT_ID,FDCHECKCENTCONSINTEN_ID,RPCENTCONSINTEN_ID,FDCHECKCENTCONSCNT_ID,FDCHECKCENTCONSSPCNT_ID,FDCHECKRESINTEN_ID,RPRESINTEN_ID,FDCHECKRESCNT_ID,FDCHECKRESSPCNT_ID,FDCHECKSEMCONSINTEN_ID,RPSEMCONSINTEN_ID,FDCHECKSEMCONSCNT_ID,FDCHECKSEMCONSSPCNT_ID,SEMSTATECNT_ID,SEMOPERSTATECNT_ID,IMAGECYCLECNT_ID,ACQIMAGECNT_ID,LASTSEMPCKT_ID,IASWSTATECNT_ID,PREPSCIENCECNT_ID,CONTROLLEDSWITCHOFFCNT_ID,ALGOCENT0CNT_ID,ALGOCENT1CNT_ID,ALGOACQ1CNT_ID,ALGOCCCNT_ID,ALGOTTC1CNT_ID,TTC1AVTEMPAFT_ID,TTC1AVTEMPFRT_ID,ALGOTTC2CNT_ID,INTTIMEAFT_ID,ONTIMEAFT_ID,INTTIMEFRONT_ID,ONTIMEFRONT_ID,HBSEM_ID,SEMEVTCOUNTER_ID,PEXPTIME_ID,PIMAGEREP_ID,PACQNUM_ID,PDATAOS_ID,PCCDRDMODE_ID,PWINPOSX_ID,PWINPOSY_ID,PWINSIZEX_ID,PWINSIZEY_ID,PDTACQSRC_ID,PTEMPCTRLTARGET_ID,PVOLTFEEVOD_ID,PVOLTFEEVRD_ID,PVOLTFEEVSS_ID,PHEATTEMPFPACCD_ID,PHEATTEMPFEESTRAP_ID,PHEATTEMPFEEANACH_ID,PHEATTEMPSPARE_ID,PSTEPENDIAGCCD_ID,PSTEPENDIAGFEE_ID,PSTEPENDIAGTEMP_ID,PSTEPENDIAGANA_ID,PSTEPENDIAGEXPOS_ID,PSTEPDEBDIAGCCD_ID,PSTEPDEBDIAGFEE_ID,PSTEPDEBDIAGTEMP_ID,PSTEPDEBDIAGANA_ID,PSTEPDEBDIAGEXPOS_ID,SAVEIMAGESCNT_ID,SAVEIMAGES_PSAVETARGET_ID,SAVEIMAGES_PFBFINIT_ID,SAVEIMAGES_PFBFEND_ID,ACQFULLDROPCNT_ID,ACQFULLDROP_PEXPTIME_ID,ACQFULLDROP_PIMAGEREP_ID,CALFULLSNAPCNT_ID,CALFULLSNAP_PEXPTIME_ID,CALFULLSNAP_PIMAGEREP_ID,CALFULLSNAP_PNMBIMAGES_ID,CALFULLSNAP_PCENTSEL_ID,SCIWINCNT_ID,SCIWIN_PNMBIMAGES_ID,SCIWIN_PCCDRDMODE_ID,SCIWIN_PEXPTIME_ID,SCIWIN_PIMAGEREP_ID,SCIWIN_PWINPOSX_ID,SCIWIN_PWINPOSY_ID,SCIWIN_PWINSIZEX_ID,SCIWIN_PWINSIZEY_ID,SCIWIN_PCENTSEL_ID,FBFLOADCNT_ID,FBFSAVECNT_ID,FBFLOAD_PFBFID_ID,FBFLOAD_PFBFNBLOCKS_ID,FBFLOAD_PFBFRAMAREAID_ID,FBFLOAD_PFBFRAMADDR_ID,FBFSAVE_PFBFID_ID,FBFSAVE_PFBFNBLOCKS_ID,FBFSAVE_PFBFRAMAREAID_ID,FBFSAVE_PFBFRAMADDR_ID,FBFLOADBLOCKCOUNTER_ID,FBFSAVEBLOCKCOUNTER_ID,TRANSFBFTOGRNDCNT_ID,TRANSFBFTOGRND_PNMBFBF_ID,TRANSFBFTOGRND_PFBFINIT_ID,TRANSFBFTOGRND_PFBFSIZE_ID,NOMSCICNT_ID,NOMSCI_PACQFLAG_ID,NOMSCI_PCAL1FLAG_ID,NOMSCI_PSCIFLAG_ID,NOMSCI_PCAL2FLAG_ID,NOMSCI_PCIBNFULL_ID,NOMSCI_PCIBSIZEFULL_ID,NOMSCI_PSIBNFULL_ID,NOMSCI_PSIBSIZEFULL_ID,NOMSCI_PGIBNFULL_ID,NOMSCI_PGIBSIZEFULL_ID,NOMSCI_PSIBNWIN_ID,NOMSCI_PSIBSIZEWIN_ID,NOMSCI_PCIBNWIN_ID,NOMSCI_PCIBSIZEWIN_ID,NOMSCI_PGIBNWIN_ID,NOMSCI_PGIBSIZEWIN_ID,NOMSCI_PEXPTIMEACQ_ID,NOMSCI_PIMAGEREPACQ_ID,NOMSCI_PEXPTIMECAL1_ID,NOMSCI_PIMAGEREPCAL1_ID,NOMSCI_PNMBIMAGESCAL1_ID,NOMSCI_PCENTSELCAL1_ID,NOMSCI_PNMBIMAGESSCI_ID,NOMSCI_PCCDRDMODESCI_ID,NOMSCI_PEXPTIMESCI_ID,NOMSCI_PIMAGEREPSCI_ID,NOMSCI_PWINPOSXSCI_ID,NOMSCI_PWINPOSYSCI_ID,NOMSCI_PWINSIZEXSCI_ID,NOMSCI_PWINSIZEYSCI_ID,NOMSCI_PCENTSELSCI_ID,NOMSCI_PEXPTIMECAL2_ID,NOMSCI_PIMAGEREPCAL2_ID,NOMSCI_PNMBIMAGESCAL2_ID,NOMSCI_PCENTSELCAL2_ID,NOMSCI_PSAVETARGET_ID,NOMSCI_PFBFINIT_ID,NOMSCI_PFBFEND_ID,NOMSCI_PSTCKORDERCAL1_ID,NOMSCI_PSTCKORDERSCI_ID,NOMSCI_PSTCKORDERCAL2_ID,CONFIGSDB_PSDBCMD_ID,CONFIGSDB_PCIBNFULL_ID,CONFIGSDB_PCIBSIZEFULL_ID,CONFIGSDB_PSIBNFULL_ID,CONFIGSDB_PSIBSIZEFULL_ID,CONFIGSDB_PGIBNFULL_ID,CONFIGSDB_PGIBSIZEFULL_ID,CONFIGSDB_PSIBNWIN_ID,CONFIGSDB_PSIBSIZEWIN_ID,CONFIGSDB_PCIBNWIN_ID,CONFIGSDB_PCIBSIZEWIN_ID,CONFIGSDB_PGIBNWIN_ID,CONFIGSDB_PGIBSIZEWIN_ID,HBSEMCOUNTER_ID,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+  /* ID: 103, value: Auto, name: RdlDataItemList_3, multiplicity: 250 */
+{ADC_P3V3_RAW_ID,ADC_P5V_RAW_ID,ADC_P1V8_RAW_ID,ADC_P2V5_RAW_ID,ADC_N5V_RAW_ID,ADC_PGND_RAW_ID,ADC_TEMPOH1A_RAW_ID,ADC_TEMP1_RAW_ID,ADC_TEMPOH2A_RAW_ID,ADC_TEMPOH1B_RAW_ID,ADC_TEMPOH3A_RAW_ID,ADC_TEMPOH2B_RAW_ID,ADC_TEMPOH4A_RAW_ID,ADC_TEMPOH3B_RAW_ID,ADC_TEMPOH4B_RAW_ID,SEM_P15V_RAW_ID,SEM_P30V_RAW_ID,SEM_P5V0_RAW_ID,SEM_P7V0_RAW_ID,SEM_N5V0_RAW_ID,MISSEDMSGCNT_ID,MISSEDPULSECNT_ID,ISERRLOGVALID_ID,WCET_1_ID,WCET_2_ID,WCET_3_ID,WCET_4_ID,WCET_5_ID,WCETAVER_1_ID,WCETAVER_2_ID,WCETAVER_3_ID,WCETAVER_4_ID,WCETAVER_5_ID,WCETMAX_1_ID,WCETMAX_2_ID,WCETMAX_3_ID,WCETMAX_4_ID,WCETMAX_5_ID,NOFNOTIF_1_ID,NOFNOTIF_2_ID,NOFNOTIF_3_ID,NOFNOTIF_4_ID,NOFNOTIF_5_ID,NOFFUNCEXEC_1_ID,NOFFUNCEXEC_2_ID,NOFFUNCEXEC_3_ID,NOFFUNCEXEC_4_ID,NOFFUNCEXEC_5_ID,WCETTIMESTAMPFINE_1_ID,WCETTIMESTAMPFINE_2_ID,WCETTIMESTAMPFINE_3_ID,WCETTIMESTAMPFINE_4_ID,WCETTIMESTAMPFINE_5_ID,WCETTIMESTAMPCOARSE_1_ID,WCETTIMESTAMPCOARSE_2_ID,WCETTIMESTAMPCOARSE_3_ID,WCETTIMESTAMPCOARSE_4_ID,WCETTIMESTAMPCOARSE_5_ID,FLASHCONTSTEPCNT_ID,CYCLICALACTIVITIESCTR_ID,OBCINPUTBUFFERPACKETS_ID,GRNDINPUTBUFFERPACKETS_ID,MILBUSBYTESIN_ID,MILBUSBYTESOUT_ID,MILBUSDROPPEDBYTES_ID,IRL1_AHBSTAT_ID,IRL1_GRGPIO_6_ID,IRL1_GRTIMER_ID,IRL1_GPTIMER_0_ID,IRL1_GPTIMER_1_ID,IRL1_GPTIMER_2_ID,IRL1_GPTIMER_3_ID,IRL1_IRQMP_ID,IRL1_B1553BRM_ID,IRL2_GRSPW2_0_ID,IRL2_GRSPW2_1_ID,SPW1TXDESCAVAIL_ID,SPW1RXPCKTAVAIL_ID,MILCUCCOARSETIME_ID,MILCUCFINETIME_ID,CUCCOARSETIME_ID,CUCFINETIME_ID,SRAM1SCRCURRADDR_ID,SRAM2SCRCURRADDR_ID,SRAM1SCRLENGTH_ID,SRAM2SCRLENGTH_ID,EDACSINGLEREPAIRED_ID,EDACDOUBLEFAULTS_ID,EDACDOUBLEFADDR_ID,HEARTBEAT_ENABLED_ID,S1ALLOCDBS_ID,S1ALLOCSW_ID,S1ALLOCHEAP_ID,S1ALLOCFLASH_ID,S1ALLOCAUX_ID,S1ALLOCRES_ID,S1ALLOCSWAP_ID,S2ALLOCSCIHEAP_ID,FPGA_VERSION_ID,FPGA_DPU_STATUS_ID,FPGA_DPU_ADDRESS_ID,FPGA_RESET_STATUS_ID,FPGA_SEM_STATUS_ID,FPGA_OPER_HEATER_STATUS_ID,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+  /* ID: 104, value: Auto, name: RdlDataItemList_4, multiplicity: 250 */
+{SEM_ON_CODE_ID,SEM_OFF_CODE_ID,ACQ_PH_ID,MILFRAMEDELAY_ID,EL1_CHIP_ID,EL2_CHIP_ID,EL1_ADDR_ID,EL2_ADDR_ID,ERR_LOG_ENB_ID,FBF_BLCK_WR_DUR_ID,FBF_BLCK_RD_DUR_ID,THR_MA_A_1_ID,THR_MA_A_2_ID,THR_MA_A_3_ID,THR_MA_A_4_ID,THR_MA_A_5_ID,OTA_TM1A_NOM_ID,OTA_TM1A_RED_ID,OTA_TM1B_NOM_ID,OTA_TM1B_RED_ID,OTA_TM2A_NOM_ID,OTA_TM2A_RED_ID,OTA_TM2B_NOM_ID,OTA_TM2B_RED_ID,OTA_TM3A_NOM_ID,OTA_TM3A_RED_ID,OTA_TM3B_NOM_ID,OTA_TM3B_RED_ID,OTA_TM4A_NOM_ID,OTA_TM4A_RED_ID,OTA_TM4B_NOM_ID,OTA_TM4B_RED_ID,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+  /* ID: 105, value: Auto, name: RdlDataItemList_5, multiplicity: 250 */
+{SEM_HK_TS_DEF_CRS_ID,SEM_HK_TS_DEF_FINE_ID,SEM_HK_TS_EXT_CRS_ID,SEM_HK_TS_EXT_FINE_ID,STAT_MODE_ID,STAT_FLAGS_ID,STAT_LAST_SPW_ERR_ID,STAT_LAST_ERR_ID_ID,STAT_LAST_ERR_FREQ_ID,STAT_NUM_CMD_RECEIVED_ID,STAT_NUM_CMD_EXECUTED_ID,STAT_NUM_DATA_SENT_ID,STAT_SCU_PROC_DUTY_CL_ID,STAT_SCU_NUM_AHB_ERR_ID,STAT_SCU_NUM_AHB_CERR_ID,STAT_SCU_NUM_LUP_ERR_ID,TEMP_SEM_SCU_ID,TEMP_SEM_PCU_ID,VOLT_SCU_P3_4_ID,VOLT_SCU_P5_ID,TEMP_FEE_CCD_ID,TEMP_FEE_STRAP_ID,TEMP_FEE_ADC_ID,TEMP_FEE_BIAS_ID,TEMP_FEE_DEB_ID,VOLT_FEE_VOD_ID,VOLT_FEE_VRD_ID,VOLT_FEE_VOG_ID,VOLT_FEE_VSS_ID,VOLT_FEE_CCD_ID,VOLT_FEE_CLK_ID,VOLT_FEE_ANA_P5_ID,VOLT_FEE_ANA_N5_ID,VOLT_FEE_ANA_P3_3_ID,CURR_FEE_CLK_BUF_ID,VOLT_SCU_FPGA_P1_5_ID,CURR_SCU_P3_4_ID,STAT_NUM_SPW_ERR_CRE_ID,STAT_NUM_SPW_ERR_ESC_ID,STAT_NUM_SPW_ERR_DISC_ID,STAT_NUM_SPW_ERR_PAR_ID,STAT_NUM_SPW_ERR_WRSY_ID,STAT_NUM_SPW_ERR_INVA_ID,STAT_NUM_SPW_ERR_EOP_ID,STAT_NUM_SPW_ERR_RXAH_ID,STAT_NUM_SPW_ERR_TXAH_ID,STAT_NUM_SPW_ERR_TXBL_ID,STAT_NUM_SPW_ERR_TXLE_ID,STAT_NUM_SP_ERR_RX_ID,STAT_NUM_SP_ERR_TX_ID,STAT_HEAT_PWM_FPA_CCD_ID,STAT_HEAT_PWM_FEE_STR_ID,STAT_HEAT_PWM_FEE_ANA_ID,STAT_HEAT_PWM_SPARE_ID,STAT_HEAT_PWM_FLAGS_ID,STAT_OBTIME_SYNC_DELTA_ID,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+  /* ID: 106, value: Auto, name: RdlDataItemList_6, multiplicity: 250 */
+                     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+  /* ID: 107, value: 0, name: RdlDataItemList_7, multiplicity: 250 */
+                     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+  /* ID: 108, value: 0, name: RdlDataItemList_8, multiplicity: 250 */
+                     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+  /* ID: 109, value: 0, name: RdlDataItemList_9, multiplicity: 250 */
+                     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+  /* ID: 110, value: 0, name: DEBUG_VAR, multiplicity: 20 */
+                     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+  /* ID: 111, value: 1073741824, name: DEBUG_VAR_ADDR, multiplicity: 20 */
+                     {1073741824,1073741824,1073741824,1073741824,1073741824,1073741824,1073741824,1073741824,1073741824,1073741824,1073741824,1073741824,1073741824,1073741824,1073741824,1073741824,1073741824,1073741824,1073741824,1073741824},
+  /* ID: 112, value: 5, name: EVTFILTERDEF, multiplicity: 1 */
+                     5,
+  /* ID: 113, value: 5, name: evtEnabledList, multiplicity: 60 */
+                     {5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5},
+  /* ID: 114, value: 0, name: lastPatchedAddr, multiplicity: 1 */
+                     0,
+  /* ID: 115, value: 0, name: lastDumpAddr, multiplicity: 1 */
+                     0,
+  /* ID: 116, value: STOPPED, name: sdu2State, multiplicity: 1 */
+                     0,
+  /* ID: 117, value: STOPPED, name: sdu4State, multiplicity: 1 */
+                     0,
+  /* ID: 118, value: 0, name: sdu2StateCnt, multiplicity: 1 */
+                     0,
+  /* ID: 119, value: 0, name: sdu4StateCnt, multiplicity: 1 */
+                     0,
+  /* ID: 120, value: 0, name: sdu2BlockCnt, multiplicity: 1 */
+                     0,
+  /* ID: 121, value: 0, name: sdu4BlockCnt, multiplicity: 1 */
+                     0,
+  /* ID: 122, value: 0, name: sdu2RemSize, multiplicity: 1 */
+                     0,
+  /* ID: 123, value: 0, name: sdu4RemSize, multiplicity: 1 */
+                     0,
+  /* ID: 124, value: 4294967295, name: sdu2DownTransferSize, multiplicity: 1 */
+                     0xffffffff,
+  /* ID: 125, value: 4294967295, name: sdu4DownTransferSize, multiplicity: 1 */
+                     0xffffffff,
+  /* ID: 126, value: 0, name: sdsCounter, multiplicity: 1 */
+                     0,
+  /* ID: 127, value: 1, name: FdGlbEnable, multiplicity: 1 */
+                     1,
+  /* ID: 128, value: 1, name: RpGlbEnable, multiplicity: 1 */
+                     1,
+  /* ID: 129, value: STOPPED, name: FdCheckTTMState, multiplicity: 1 */
+                     0,
+  /* ID: 130, value: 0, name: FdCheckTTMIntEn, multiplicity: 1 */
+                     0,
+  /* ID: 131, value: 1, name: FdCheckTTMExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 132, value: 1, name: RpTTMIntEn, multiplicity: 1 */
+                     1,
+  /* ID: 133, value: 1, name: RpTTMExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 134, value: 0, name: FdCheckTTMCnt, multiplicity: 1 */
+                     0,
+  /* ID: 135, value: 0, name: FdCheckTTMSpCnt, multiplicity: 1 */
+                     0,
+  /* ID: 136, value: 3, name: FdCheckTTMCntThr, multiplicity: 1 */
+                     3,
+  /* ID: 137, value: -24, name: TTC_LL, multiplicity: 1 */
+                     -24,
+  /* ID: 138, value: -5, name: TTC_UL, multiplicity: 1 */
+                     -5,
+  /* ID: 139, value: 0.5, name: TTM_LIM, multiplicity: 1 */
+                     0.5,
+  /* ID: 140, value: STOPPED, name: FdCheckSDSCState, multiplicity: 1 */
+                     0,
+  /* ID: 141, value: 1, name: FdCheckSDSCIntEn, multiplicity: 1 */
+                     1,
+  /* ID: 142, value: 0, name: FdCheckSDSCExtEn, multiplicity: 1 */
+                     0,
+  /* ID: 143, value: 1, name: RpSDSCIntEn, multiplicity: 1 */
+                     1,
+  /* ID: 144, value: 1, name: RpSDSCExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 145, value: 0, name: FdCheckSDSCCnt, multiplicity: 1 */
+                     0,
+  /* ID: 146, value: 0, name: FdCheckSDSCSpCnt, multiplicity: 1 */
+                     0,
+  /* ID: 147, value: 3, name: FdCheckSDSCCntThr, multiplicity: 1 */
+                     3,
+  /* ID: 148, value: STOPPED, name: FdCheckComErrState, multiplicity: 1 */
+                     0,
+  /* ID: 149, value: 0, name: FdCheckComErrIntEn, multiplicity: 1 */
+                     0,
+  /* ID: 150, value: 1, name: FdCheckComErrExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 151, value: 1, name: RpComErrIntEn, multiplicity: 1 */
+                     1,
+  /* ID: 152, value: 1, name: RpComErrExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 153, value: 0, name: FdCheckComErrCnt, multiplicity: 1 */
+                     0,
+  /* ID: 154, value: 0, name: FdCheckComErrSpCnt, multiplicity: 1 */
+                     0,
+  /* ID: 155, value: 3, name: FdCheckComErrCntThr, multiplicity: 1 */
+                     3,
+  /* ID: 156, value: STOPPED, name: FdCheckTimeOutState, multiplicity: 1 */
+                     0,
+  /* ID: 157, value: 0, name: FdCheckTimeOutIntEn, multiplicity: 1 */
+                     0,
+  /* ID: 158, value: 1, name: FdCheckTimeOutExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 159, value: 1, name: RpTimeOutIntEn, multiplicity: 1 */
+                     1,
+  /* ID: 160, value: 1, name: RpTimeOutExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 161, value: 0, name: FdCheckTimeOutCnt, multiplicity: 1 */
+                     0,
+  /* ID: 162, value: 0, name: FdCheckTimeOutSpCnt, multiplicity: 1 */
+                     0,
+  /* ID: 163, value: 1, name: FdCheckTimeOutCntThr, multiplicity: 1 */
+                     1,
+  /* ID: 164, value: 512, name: SEM_TO_POWERON, multiplicity: 1 */
+                     512,
+  /* ID: 165, value: 264, name: SEM_TO_SAFE, multiplicity: 1 */
+                     264,
+  /* ID: 166, value: 264, name: SEM_TO_STAB, multiplicity: 1 */
+                     264,
+  /* ID: 167, value: 99999999, name: SEM_TO_TEMP, multiplicity: 1 */
+                     99999999,
+  /* ID: 168, value: 88, name: SEM_TO_CCD, multiplicity: 1 */
+                     88,
+  /* ID: 169, value: 88, name: SEM_TO_DIAG, multiplicity: 1 */
+                     88,
+  /* ID: 170, value: 176, name: SEM_TO_STANDBY, multiplicity: 1 */
+                     176,
+  /* ID: 171, value: STOPPED, name: FdCheckSafeModeState, multiplicity: 1 */
+                     0,
+  /* ID: 172, value: 0, name: FdCheckSafeModeIntEn, multiplicity: 1 */
+                     0,
+  /* ID: 173, value: 1, name: FdCheckSafeModeExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 174, value: 1, name: RpSafeModeIntEn, multiplicity: 1 */
+                     1,
+  /* ID: 175, value: 1, name: RpSafeModeExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 176, value: 0, name: FdCheckSafeModeCnt, multiplicity: 1 */
+                     0,
+  /* ID: 177, value: 0, name: FdCheckSafeModeSpCnt, multiplicity: 1 */
+                     0,
+  /* ID: 178, value: 1, name: FdCheckSafeModeCntThr, multiplicity: 1 */
+                     1,
+  /* ID: 179, value: STOPPED, name: FdCheckAliveState, multiplicity: 1 */
+                     0,
+  /* ID: 180, value: 0, name: FdCheckAliveIntEn, multiplicity: 1 */
+                     0,
+  /* ID: 181, value: 1, name: FdCheckAliveExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 182, value: 1, name: RpAliveIntEn, multiplicity: 1 */
+                     1,
+  /* ID: 183, value: 1, name: RpAliveExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 184, value: 0, name: FdCheckAliveCnt, multiplicity: 1 */
+                     0,
+  /* ID: 185, value: 0, name: FdCheckAliveSpCnt, multiplicity: 1 */
+                     0,
+  /* ID: 186, value: 1, name: FdCheckAliveCntThr, multiplicity: 1 */
+                     1,
+  /* ID: 187, value: 504, name: SEM_HK_DEF_PER, multiplicity: 1 */
+                     504,
+  /* ID: 188, value: 1, name: SEMALIVE_DELAYEDSEMHK, multiplicity: 1 */
+                     1,
+  /* ID: 189, value: STOPPED, name: FdCheckSemAnoEvtState, multiplicity: 1 */
+                     0,
+  /* ID: 190, value: 0, name: FdCheckSemAnoEvtIntEn, multiplicity: 1 */
+                     0,
+  /* ID: 191, value: 1, name: FdCheckSemAnoEvtExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 192, value: 1, name: RpSemAnoEvtIntEn, multiplicity: 1 */
+                     1,
+  /* ID: 193, value: 1, name: RpSemAnoEvtExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 194, value: 0, name: FdCheckSemAnoEvtCnt, multiplicity: 1 */
+                     0,
+  /* ID: 195, value: 0, name: FdCheckSemAnoEvtSpCnt, multiplicity: 1 */
+                     0,
+  /* ID: 196, value: 1, name: FdCheckSemAnoEvtCntThr, multiplicity: 1 */
+                     1,
+  /* ID: 197, value: NO_ACT, name: semAnoEvtResp_1, multiplicity: 1 */
+                     1,
+  /* ID: 198, value: NO_ACT, name: semAnoEvtResp_2, multiplicity: 1 */
+                     1,
+  /* ID: 199, value: NO_ACT, name: semAnoEvtResp_3, multiplicity: 1 */
+                     1,
+  /* ID: 200, value: NO_ACT, name: semAnoEvtResp_4, multiplicity: 1 */
+                     1,
+  /* ID: 201, value: NO_ACT, name: semAnoEvtResp_5, multiplicity: 1 */
+                     1,
+  /* ID: 202, value: NO_ACT, name: semAnoEvtResp_6, multiplicity: 1 */
+                     1,
+  /* ID: 203, value: NO_ACT, name: semAnoEvtResp_7, multiplicity: 1 */
+                     1,
+  /* ID: 204, value: NO_ACT, name: semAnoEvtResp_8, multiplicity: 1 */
+                     1,
+  /* ID: 205, value: NO_ACT, name: semAnoEvtResp_9, multiplicity: 1 */
+                     1,
+  /* ID: 206, value: NO_ACT, name: semAnoEvtResp_10, multiplicity: 1 */
+                     1,
+  /* ID: 207, value: NO_ACT, name: semAnoEvtResp_11, multiplicity: 1 */
+                     1,
+  /* ID: 208, value: NO_ACT, name: semAnoEvtResp_12, multiplicity: 1 */
+                     1,
+  /* ID: 209, value: NO_ACT, name: semAnoEvtResp_13, multiplicity: 1 */
+                     1,
+  /* ID: 210, value: NO_ACT, name: semAnoEvtResp_14, multiplicity: 1 */
+                     1,
+  /* ID: 211, value: NO_ACT, name: semAnoEvtResp_15, multiplicity: 1 */
+                     1,
+  /* ID: 212, value: NO_ACT, name: semAnoEvtResp_16, multiplicity: 1 */
+                     1,
+  /* ID: 213, value: NO_ACT, name: semAnoEvtResp_17, multiplicity: 1 */
+                     1,
+  /* ID: 214, value: NO_ACT, name: semAnoEvtResp_18, multiplicity: 1 */
+                     1,
+  /* ID: 215, value: NO_ACT, name: semAnoEvtResp_19, multiplicity: 1 */
+                     1,
+  /* ID: 216, value: NO_ACT, name: semAnoEvtResp_20, multiplicity: 1 */
+                     1,
+  /* ID: 217, value: NO_ACT, name: semAnoEvtResp_21, multiplicity: 1 */
+                     1,
+  /* ID: 218, value: NO_ACT, name: semAnoEvtResp_22, multiplicity: 1 */
+                     1,
+  /* ID: 219, value: NO_ACT, name: semAnoEvtResp_23, multiplicity: 1 */
+                     1,
+  /* ID: 220, value: NO_ACT, name: semAnoEvtResp_24, multiplicity: 1 */
+                     1,
+  /* ID: 221, value: NO_ACT, name: semAnoEvtResp_25, multiplicity: 1 */
+                     1,
+  /* ID: 222, value: NO_ACT, name: semAnoEvtResp_26, multiplicity: 1 */
+                     1,
+  /* ID: 223, value: NO_ACT, name: semAnoEvtResp_27, multiplicity: 1 */
+                     1,
+  /* ID: 224, value: NO_ACT, name: semAnoEvtResp_28, multiplicity: 1 */
+                     1,
+  /* ID: 225, value: NO_ACT, name: semAnoEvtResp_29, multiplicity: 1 */
+                     1,
+  /* ID: 226, value: STOPPED, name: FdCheckSemLimitState, multiplicity: 1 */
+                     0,
+  /* ID: 227, value: 0, name: FdCheckSemLimitIntEn, multiplicity: 1 */
+                     0,
+  /* ID: 228, value: 1, name: FdCheckSemLimitExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 229, value: 1, name: RpSemLimitIntEn, multiplicity: 1 */
+                     1,
+  /* ID: 230, value: 1, name: RpSemLimitExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 231, value: 0, name: FdCheckSemLimitCnt, multiplicity: 1 */
+                     0,
+  /* ID: 232, value: 0, name: FdCheckSemLimitSpCnt, multiplicity: 1 */
+                     0,
+  /* ID: 233, value: 1, name: FdCheckSemLimitCntThr, multiplicity: 1 */
+                     1,
+  /* ID: 234, value: 336, name: SEM_LIM_DEL_T, multiplicity: 1 */
+                     336,
+  /* ID: 235, value: STOPPED, name: FdCheckDpuHkState, multiplicity: 1 */
+                     0,
+  /* ID: 236, value: 0, name: FdCheckDpuHkIntEn, multiplicity: 1 */
+                     0,
+  /* ID: 237, value: 1, name: FdCheckDpuHkExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 238, value: 1, name: RpDpuHkIntEn, multiplicity: 1 */
+                     1,
+  /* ID: 239, value: 1, name: RpDpuHkExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 240, value: 0, name: FdCheckDpuHkCnt, multiplicity: 1 */
+                     0,
+  /* ID: 241, value: 0, name: FdCheckDpuHkSpCnt, multiplicity: 1 */
+                     0,
+  /* ID: 242, value: 3, name: FdCheckDpuHkCntThr, multiplicity: 1 */
+                     3,
+  /* ID: 243, value: STOPPED, name: FdCheckCentConsState, multiplicity: 1 */
+                     0,
+  /* ID: 244, value: 0, name: FdCheckCentConsIntEn, multiplicity: 1 */
+                     0,
+  /* ID: 245, value: 1, name: FdCheckCentConsExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 246, value: 1, name: RpCentConsIntEn, multiplicity: 1 */
+                     1,
+  /* ID: 247, value: 1, name: RpCentConsExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 248, value: 0, name: FdCheckCentConsCnt, multiplicity: 1 */
+                     0,
+  /* ID: 249, value: 0, name: FdCheckCentConsSpCnt, multiplicity: 1 */
+                     0,
+  /* ID: 250, value: 1200, name: FdCheckCentConsCntThr, multiplicity: 1 */
+                     1200,
+  /* ID: 251, value: STOPPED, name: FdCheckResState, multiplicity: 1 */
+                     0,
+  /* ID: 252, value: 0, name: FdCheckResIntEn, multiplicity: 1 */
+                     0,
+  /* ID: 253, value: 1, name: FdCheckResExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 254, value: 1, name: RpResIntEn, multiplicity: 1 */
+                     1,
+  /* ID: 255, value: 1, name: RpResExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 256, value: 0, name: FdCheckResCnt, multiplicity: 1 */
+                     0,
+  /* ID: 257, value: 0, name: FdCheckResSpCnt, multiplicity: 1 */
+                     0,
+  /* ID: 258, value: 3, name: FdCheckResCntThr, multiplicity: 1 */
+                     3,
+  /* ID: 259, value: 0.99, name: CPU1_USAGE_MAX, multiplicity: 1 */
+                     0.99,
+  /* ID: 260, value: 0.95, name: MEM_USAGE_MAX, multiplicity: 1 */
+                     0.95,
+  /* ID: 261, value: STOPPED, name: FdCheckSemCons, multiplicity: 1 */
+                     0,
+  /* ID: 262, value: 0, name: FdCheckSemConsIntEn, multiplicity: 1 */
+                     0,
+  /* ID: 263, value: 1, name: FdCheckSemConsExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 264, value: 1, name: RpSemConsIntEn, multiplicity: 1 */
+                     1,
+  /* ID: 265, value: 1, name: RpSemConsExtEn, multiplicity: 1 */
+                     1,
+  /* ID: 266, value: 0, name: FdCheckSemConsCnt, multiplicity: 1 */
+                     0,
+  /* ID: 267, value: 0, name: FdCheckSemConsSpCnt, multiplicity: 1 */
+                     0,
+  /* ID: 268, value: 640, name: FdCheckSemConsCntThr, multiplicity: 1 */
+                     640,
+  /* ID: 269, value: STOPPED, name: semState, multiplicity: 1 */
+                     0,
+  /* ID: 270, value: STOPPED, name: semOperState, multiplicity: 1 */
+                     0,
+  /* ID: 271, value: 0, name: semStateCnt, multiplicity: 1 */
+                     0,
+  /* ID: 272, value: 0, name: semOperStateCnt, multiplicity: 1 */
+                     0,
+  /* ID: 273, value: 0, name: imageCycleCnt, multiplicity: 1 */
+                     0,
+  /* ID: 274, value: 0, name: acqImageCnt, multiplicity: 1 */
+                     0,
+  /* ID: 275, value: FAINT, name: sciSubMode, multiplicity: 1 */
+                     0,
+  /* ID: 276, value: 0, name: LastSemPckt, multiplicity: 1 */
+                     0,
+  /* ID: 277, value: 37, name: SEM_ON_CODE, multiplicity: 1 */
+                     37,
+  /* ID: 278, value: 154, name: SEM_OFF_CODE, multiplicity: 1 */
+                     154,
+  /* ID: 279, value: 4, name: SEM_INIT_T1, multiplicity: 1 */
+                     4,
+  /* ID: 280, value: 320, name: SEM_INIT_T2, multiplicity: 1 */
+                     320,
+  /* ID: 281, value: 480, name: SEM_OPER_T1, multiplicity: 1 */
+                     480,
+  /* ID: 282, value: 54, name: SEM_SHUTDOWN_T1, multiplicity: 1 */
+                     54,
+  /* ID: 283, value: 54, name: SEM_SHUTDOWN_T11, multiplicity: 1 */
+                     54,
+  /* ID: 284, value: 582, name: SEM_SHUTDOWN_T12, multiplicity: 1 */
+                     582,
+  /* ID: 285, value: 4, name: SEM_SHUTDOWN_T2, multiplicity: 1 */
+                     4,
+  /* ID: 286, value: STOPPED, name: iaswState, multiplicity: 1 */
+                     0,
+  /* ID: 287, value: 0, name: iaswStateCnt, multiplicity: 1 */
+                     0,
+  /* ID: 288, value: 0, name: iaswCycleCnt, multiplicity: 1 */
+                     0,
+  /* ID: 289, value: STOPPED, name: prepScienceNode, multiplicity: 1 */
+                     0,
+  /* ID: 290, value: 0, name: prepScienceCnt, multiplicity: 1 */
+                     0,
+  /* ID: 291, value: STOPPED, name: controlledSwitchOffNode, multiplicity: 1 */
+                     0,
+  /* ID: 292, value: 0, name: controlledSwitchOffCnt, multiplicity: 1 */
+                     0,
+  /* ID: 293, value: 60, name: CTRLD_SWITCH_OFF_T1, multiplicity: 1 */
+                     60,
+  /* ID: 294, value: STOPPED, name: algoCent0State, multiplicity: 1 */
+                     0,
+  /* ID: 295, value: 0, name: algoCent0Cnt, multiplicity: 1 */
+                     0,
+  /* ID: 296, value: 0, name: algoCent0Enabled, multiplicity: 1 */
+                     0,
+  /* ID: 297, value: STOPPED, name: algoCent1State, multiplicity: 1 */
+                     0,
+  /* ID: 298, value: 0, name: algoCent1Cnt, multiplicity: 1 */
+                     0,
+  /* ID: 299, value: 0, name: algoCent1Enabled, multiplicity: 1 */
+                     0,
+  /* ID: 300, value: 4, name: CENT_EXEC_PHASE, multiplicity: 1 */
+                     4,
+  /* ID: 301, value: STOPPED, name: algoAcq1State, multiplicity: 1 */
+                     0,
+  /* ID: 302, value: 0, name: algoAcq1Cnt, multiplicity: 1 */
+                     0,
+  /* ID: 303, value: 0, name: algoAcq1Enabled, multiplicity: 1 */
+                     0,
+  /* ID: 304, value: 32, name: ACQ_PH, multiplicity: 1 */
+                     32,
+  /* ID: 305, value: STOPPED, name: algoCcState, multiplicity: 1 */
+                     0,
+  /* ID: 306, value: 0, name: algoCcCnt, multiplicity: 1 */
+                     0,
+  /* ID: 307, value: 1, name: algoCcEnabled, multiplicity: 1 */
+                     1,
+  /* ID: 308, value: 1, name: STCK_ORDER, multiplicity: 1 */
+                     1,
+  /* ID: 309, value: STOPPED, name: algoTTC1State, multiplicity: 1 */
+                     0,
+  /* ID: 310, value: 0, name: algoTTC1Cnt, multiplicity: 1 */
+                     0,
+  /* ID: 311, value: 0, name: algoTTC1Enabled, multiplicity: 1 */
+                     0,
+  /* ID: 312, value: 1, name: TTC1_EXEC_PHASE, multiplicity: 1 */
+                     1,
+  /* ID: 313, value: 40, name: TTC1_EXEC_PER, multiplicity: 1 */
+                     40,
+  /* ID: 314, value: -24, name: TTC1_LL_FRT, multiplicity: 1 */
+                     -24,
+  /* ID: 315, value: -24, name: TTC1_LL_AFT, multiplicity: 1 */
+                     -24,
+  /* ID: 316, value: -5, name: TTC1_UL_FRT, multiplicity: 1 */
+                     -5,
+  /* ID: 317, value: -5, name: TTC1_UL_AFT, multiplicity: 1 */
+                     -5,
+  /* ID: 318, value: 0, name: ttc1AvTempAft, multiplicity: 1 */
+                     0,
+  /* ID: 319, value: 0, name: ttc1AvTempFrt, multiplicity: 1 */
+                     0,
+  /* ID: 320, value: STOPPED, name: algoTTC2State, multiplicity: 1 */
+                     0,
+  /* ID: 321, value: 0, name: algoTTC2Cnt, multiplicity: 1 */
+                     0,
+  /* ID: 322, value: 1, name: algoTTC2Enabled, multiplicity: 1 */
+                     1,
+  /* ID: 323, value: 80, name: TTC2_EXEC_PER, multiplicity: 1 */
+                     80,
+  /* ID: 324, value: -10, name: TTC2_REF_TEMP, multiplicity: 1 */
+                     -10,
+  /* ID: 325, value: 2.5, name: TTC2_OFFSETA, multiplicity: 1 */
+                     2.5,
+  /* ID: 326, value: 3.7, name: TTC2_OFFSETF, multiplicity: 1 */
+                     3.7,
+  /* ID: 327, value: 0, name: intTimeAft, multiplicity: 1 */
+                     0,
+  /* ID: 328, value: 0, name: onTimeAft, multiplicity: 1 */
+                     0,
+  /* ID: 329, value: 0, name: intTimeFront, multiplicity: 1 */
+                     0,
+  /* ID: 330, value: 0, name: onTimeFront, multiplicity: 1 */
+                     0,
+  /* ID: 331, value: 10, name: TTC2_PA, multiplicity: 1 */
+                     10,
+  /* ID: 332, value: 0, name: TTC2_DA, multiplicity: 1 */
+                     0,
+  /* ID: 333, value: 0.003, name: TTC2_IA, multiplicity: 1 */
+                     0.003,
+  /* ID: 334, value: 10, name: TTC2_PF, multiplicity: 1 */
+                     10,
+  /* ID: 335, value: 0, name: TTC2_DF, multiplicity: 1 */
+                     0,
+  /* ID: 336, value: 0.003, name: TTC2_IF, multiplicity: 1 */
+                     0.003,
+  /* ID: 337, value: STOPPED, name: algoSaaEvalState, multiplicity: 1 */
+                     0,
+  /* ID: 338, value: 0, name: algoSaaEvalCnt, multiplicity: 1 */
+                     0,
+  /* ID: 339, value: 0, name: algoSaaEvalEnabled, multiplicity: 1 */
+                     0,
+  /* ID: 340, value: 1, name: SAA_EXEC_PHASE, multiplicity: 1 */
+                     1,
+  /* ID: 341, value: 40, name: SAA_EXEC_PER, multiplicity: 1 */
+                     40,
+  /* ID: 342, value: 0, name: isSaaActive, multiplicity: 1 */
+                     0,
+  /* ID: 343, value: 0, name: saaCounter, multiplicity: 1 */
+                     0,
+  /* ID: 344, value: 0, name: pInitSaaCounter, multiplicity: 1 */
+                     0,
+  /* ID: 345, value: STOPPED, name: algoSdsEvalState, multiplicity: 1 */
+                     0,
+  /* ID: 346, value: 0, name: algoSdsEvalCnt, multiplicity: 1 */
+                     0,
+  /* ID: 347, value: 1, name: algoSdsEvalEnabled, multiplicity: 1 */
+                     1,
+  /* ID: 348, value: 1, name: SDS_EXEC_PHASE, multiplicity: 1 */
+                     1,
+  /* ID: 349, value: 40, name: SDS_EXEC_PER, multiplicity: 1 */
+                     40,
+  /* ID: 350, value: 0, name: isSdsActive, multiplicity: 1 */
+                     0,
+  /* ID: 351, value: 0, name: SDS_FORCED, multiplicity: 1 */
+                     0,
+  /* ID: 352, value: 0, name: SDS_INHIBITED, multiplicity: 1 */
+                     0,
+  /* ID: 353, value: 0, name: EARTH_OCCULT_ACTIVE, multiplicity: 1 */
+                     0,
+  /* ID: 354, value: 21845, name: HEARTBEAT_D1, multiplicity: 1 */
+                     21845,
+  /* ID: 355, value: 43690, name: HEARTBEAT_D2, multiplicity: 1 */
+                     43690,
+  /* ID: 356, value: 1, name: HbSem, multiplicity: 1 */
+                     1,
+  /* ID: 357, value: 0, name: starMap, multiplicity: 276 */
+                     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+  /* ID: 358, value: 0, name: observationId, multiplicity: 1 */
+                     0,
+  /* ID: 359, value: 0, name: centValProcOutput, multiplicity: 1 */
+                     0,
+  /* ID: 360, value: 0.5, name: CENT_OFFSET_LIM, multiplicity: 1 */
+                     0.5,
+  /* ID: 361, value: 3, name: CENT_FROZEN_LIM, multiplicity: 1 */
+                     3,
+  /* ID: 362, value: 0, name: SEM_SERV1_1_FORWARD, multiplicity: 1 */
+                     0,
+  /* ID: 363, value: 1, name: SEM_SERV1_2_FORWARD, multiplicity: 1 */
+                     1,
+  /* ID: 364, value: 0, name: SEM_SERV1_7_FORWARD, multiplicity: 1 */
+                     0,
+  /* ID: 365, value: 1, name: SEM_SERV1_8_FORWARD, multiplicity: 1 */
+                     1,
+  /* ID: 366, value: 0, name: SEM_SERV3_1_FORWARD, multiplicity: 1 */
+                     0,
+  /* ID: 367, value: 0, name: SEM_SERV3_2_FORWARD, multiplicity: 1 */
+                     0,
+  /* ID: 368, value: 0, name: SEM_HK_TS_DEF_CRS, multiplicity: 1 */
+                     0,
+  /* ID: 369, value: 0, name: SEM_HK_TS_DEF_FINE, multiplicity: 1 */
+                     0,
+  /* ID: 370, value: 0, name: SEM_HK_TS_EXT_CRS, multiplicity: 1 */
+                     0,
+  /* ID: 371, value: 0, name: SEM_HK_TS_EXT_FINE, multiplicity: 1 */
+                     0,
+  /* ID: 372, value: SAFE, name: STAT_MODE, multiplicity: 1 */
+                     1,
+  /* ID: 373, value: 0, name: STAT_FLAGS, multiplicity: 1 */
+                     0,
+  /* ID: 374, value: NO_ERR, name: STAT_LAST_SPW_ERR, multiplicity: 1 */
+                     0,
+  /* ID: 375, value: 0, name: STAT_LAST_ERR_ID, multiplicity: 1 */
+                     0,
+  /* ID: 376, value: 0, name: STAT_LAST_ERR_FREQ, multiplicity: 1 */
+                     0,
+  /* ID: 377, value: 0, name: STAT_NUM_CMD_RECEIVED, multiplicity: 1 */
+                     0,
+  /* ID: 378, value: 0, name: STAT_NUM_CMD_EXECUTED, multiplicity: 1 */
+                     0,
+  /* ID: 379, value: 0, name: STAT_NUM_DATA_SENT, multiplicity: 1 */
+                     0,
+  /* ID: 380, value: 0, name: STAT_SCU_PROC_DUTY_CL, multiplicity: 1 */
+                     0,
+  /* ID: 381, value: 0, name: STAT_SCU_NUM_AHB_ERR, multiplicity: 1 */
+                     0,
+  /* ID: 382, value: 0, name: STAT_SCU_NUM_AHB_CERR, multiplicity: 1 */
+                     0,
+  /* ID: 383, value: 0, name: STAT_SCU_NUM_LUP_ERR, multiplicity: 1 */
+                     0,
+  /* ID: 384, value: 0, name: TEMP_SEM_SCU, multiplicity: 1 */
+                     0,
+  /* ID: 385, value: 0, name: TEMP_SEM_PCU, multiplicity: 1 */
+                     0,
+  /* ID: 386, value: 0, name: VOLT_SCU_P3_4, multiplicity: 1 */
+                     0,
+  /* ID: 387, value: 0, name: VOLT_SCU_P5, multiplicity: 1 */
+                     0,
+  /* ID: 388, value: 0, name: TEMP_FEE_CCD, multiplicity: 1 */
+                     0,
+  /* ID: 389, value: 0, name: TEMP_FEE_STRAP, multiplicity: 1 */
+                     0,
+  /* ID: 390, value: 0, name: TEMP_FEE_ADC, multiplicity: 1 */
+                     0,
+  /* ID: 391, value: 0, name: TEMP_FEE_BIAS, multiplicity: 1 */
+                     0,
+  /* ID: 392, value: 0, name: TEMP_FEE_DEB, multiplicity: 1 */
+                     0,
+  /* ID: 393, value: 0, name: VOLT_FEE_VOD, multiplicity: 1 */
+                     0,
+  /* ID: 394, value: 0, name: VOLT_FEE_VRD, multiplicity: 1 */
+                     0,
+  /* ID: 395, value: 0, name: VOLT_FEE_VOG, multiplicity: 1 */
+                     0,
+  /* ID: 396, value: 0, name: VOLT_FEE_VSS, multiplicity: 1 */
+                     0,
+  /* ID: 397, value: 0, name: VOLT_FEE_CCD, multiplicity: 1 */
+                     0,
+  /* ID: 398, value: 0, name: VOLT_FEE_CLK, multiplicity: 1 */
+                     0,
+  /* ID: 399, value: 0, name: VOLT_FEE_ANA_P5, multiplicity: 1 */
+                     0,
+  /* ID: 400, value: 0, name: VOLT_FEE_ANA_N5, multiplicity: 1 */
+                     0,
+  /* ID: 401, value: 0, name: VOLT_FEE_ANA_P3_3, multiplicity: 1 */
+                     0,
+  /* ID: 402, value: 0, name: CURR_FEE_CLK_BUF, multiplicity: 1 */
+                     0,
+  /* ID: 403, value: 0, name: VOLT_SCU_FPGA_P1_5, multiplicity: 1 */
+                     0,
+  /* ID: 404, value: 0, name: CURR_SCU_P3_4, multiplicity: 1 */
+                     0,
+  /* ID: 405, value: 0, name: STAT_NUM_SPW_ERR_CRE, multiplicity: 1 */
+                     0,
+  /* ID: 406, value: 0, name: STAT_NUM_SPW_ERR_ESC, multiplicity: 1 */
+                     0,
+  /* ID: 407, value: 0, name: STAT_NUM_SPW_ERR_DISC, multiplicity: 1 */
+                     0,
+  /* ID: 408, value: 0, name: STAT_NUM_SPW_ERR_PAR, multiplicity: 1 */
+                     0,
+  /* ID: 409, value: 0, name: STAT_NUM_SPW_ERR_WRSY, multiplicity: 1 */
+                     0,
+  /* ID: 410, value: 0, name: STAT_NUM_SPW_ERR_INVA, multiplicity: 1 */
+                     0,
+  /* ID: 411, value: 0, name: STAT_NUM_SPW_ERR_EOP, multiplicity: 1 */
+                     0,
+  /* ID: 412, value: 0, name: STAT_NUM_SPW_ERR_RXAH, multiplicity: 1 */
+                     0,
+  /* ID: 413, value: 0, name: STAT_NUM_SPW_ERR_TXAH, multiplicity: 1 */
+                     0,
+  /* ID: 414, value: 0, name: STAT_NUM_SPW_ERR_TXBL, multiplicity: 1 */
+                     0,
+  /* ID: 415, value: 0, name: STAT_NUM_SPW_ERR_TXLE, multiplicity: 1 */
+                     0,
+  /* ID: 416, value: 0, name: STAT_NUM_SP_ERR_RX, multiplicity: 1 */
+                     0,
+  /* ID: 417, value: 0, name: STAT_NUM_SP_ERR_TX, multiplicity: 1 */
+                     0,
+  /* ID: 418, value: 0, name: STAT_HEAT_PWM_FPA_CCD, multiplicity: 1 */
+                     0,
+  /* ID: 419, value: 0, name: STAT_HEAT_PWM_FEE_STR, multiplicity: 1 */
+                     0,
+  /* ID: 420, value: 0, name: STAT_HEAT_PWM_FEE_ANA, multiplicity: 1 */
+                     0,
+  /* ID: 421, value: 0, name: STAT_HEAT_PWM_SPARE, multiplicity: 1 */
+                     0,
+  /* ID: 422, value: 0, name: STAT_HEAT_PWM_FLAGS, multiplicity: 1 */
+                     0,
+  /* ID: 423, value: 0, name: STAT_OBTIME_SYNC_DELTA, multiplicity: 1 */
+                     0,
+  /* ID: 424, value: -20, name: TEMP_SEM_SCU_LW, multiplicity: 1 */
+                     -20,
+  /* ID: 425, value: -20, name: TEMP_SEM_PCU_LW, multiplicity: 1 */
+                     -20,
+  /* ID: 426, value: 3.2, name: VOLT_SCU_P3_4_LW, multiplicity: 1 */
+                     3.2,
+  /* ID: 427, value: 4.8, name: VOLT_SCU_P5_LW, multiplicity: 1 */
+                     4.8,
+  /* ID: 428, value: -60, name: TEMP_FEE_CCD_LW, multiplicity: 1 */
+                     -60,
+  /* ID: 429, value: -20, name: TEMP_FEE_STRAP_LW, multiplicity: 1 */
+                     -20,
+  /* ID: 430, value: -20, name: TEMP_FEE_ADC_LW, multiplicity: 1 */
+                     -20,
+  /* ID: 431, value: -20, name: TEMP_FEE_BIAS_LW, multiplicity: 1 */
+                     -20,
+  /* ID: 432, value: -20, name: TEMP_FEE_DEB_LW, multiplicity: 1 */
+                     -20,
+  /* ID: 433, value: 0, name: VOLT_FEE_VOD_LW, multiplicity: 1 */
+                     0,
+  /* ID: 434, value: 0, name: VOLT_FEE_VRD_LW, multiplicity: 1 */
+                     0,
+  /* ID: 435, value: 0, name: VOLT_FEE_VOG_LW, multiplicity: 1 */
+                     0,
+  /* ID: 436, value: 0, name: VOLT_FEE_VSS_LW, multiplicity: 1 */
+                     0,
+  /* ID: 437, value: 0, name: VOLT_FEE_CCD_LW, multiplicity: 1 */
+                     0,
+  /* ID: 438, value: 0, name: VOLT_FEE_CLK_LW, multiplicity: 1 */
+                     0,
+  /* ID: 439, value: 0, name: VOLT_FEE_ANA_P5_LW, multiplicity: 1 */
+                     0,
+  /* ID: 440, value: -6, name: VOLT_FEE_ANA_N5_LW, multiplicity: 1 */
+                     -6,
+  /* ID: 441, value: 0, name: VOLT_FEE_ANA_P3_3_LW, multiplicity: 1 */
+                     0,
+  /* ID: 442, value: 0, name: CURR_FEE_CLK_BUF_LW, multiplicity: 1 */
+                     0,
+  /* ID: 443, value: 1.3, name: VOLT_SCU_FPGA_P1_5_LW, multiplicity: 1 */
+                     1.3,
+  /* ID: 444, value: 50, name: CURR_SCU_P3_4_LW, multiplicity: 1 */
+                     50,
+  /* ID: 445, value: 80, name: TEMP_SEM_SCU_UW, multiplicity: 1 */
+                     80,
+  /* ID: 446, value: 80, name: TEMP_SEM_PCU_UW, multiplicity: 1 */
+                     80,
+  /* ID: 447, value: 3.8, name: VOLT_SCU_P3_4_UW, multiplicity: 1 */
+                     3.8,
+  /* ID: 448, value: 5.6, name: VOLT_SCU_P5_UW, multiplicity: 1 */
+                     5.6,
+  /* ID: 449, value: 40, name: TEMP_FEE_CCD_UW, multiplicity: 1 */
+                     40,
+  /* ID: 450, value: 60, name: TEMP_FEE_STRAP_UW, multiplicity: 1 */
+                     60,
+  /* ID: 451, value: 60, name: TEMP_FEE_ADC_UW, multiplicity: 1 */
+                     60,
+  /* ID: 452, value: 60, name: TEMP_FEE_BIAS_UW, multiplicity: 1 */
+                     60,
+  /* ID: 453, value: 60, name: TEMP_FEE_DEB_UW, multiplicity: 1 */
+                     60,
+  /* ID: 454, value: 32, name: VOLT_FEE_VOD_UW, multiplicity: 1 */
+                     32,
+  /* ID: 455, value: 19, name: VOLT_FEE_VRD_UW, multiplicity: 1 */
+                     19,
+  /* ID: 456, value: 3.5, name: VOLT_FEE_VOG_UW, multiplicity: 1 */
+                     3.5,
+  /* ID: 457, value: 10, name: VOLT_FEE_VSS_UW, multiplicity: 1 */
+                     10,
+  /* ID: 458, value: 37, name: VOLT_FEE_CCD_UW, multiplicity: 1 */
+                     37,
+  /* ID: 459, value: 17, name: VOLT_FEE_CLK_UW, multiplicity: 1 */
+                     17,
+  /* ID: 460, value: 7, name: VOLT_FEE_ANA_P5_UW, multiplicity: 1 */
+                     7,
+  /* ID: 461, value: 0, name: VOLT_FEE_ANA_N5_UW, multiplicity: 1 */
+                     0,
+  /* ID: 462, value: 4, name: VOLT_FEE_ANA_P3_3_UW, multiplicity: 1 */
+                     4,
+  /* ID: 463, value: 100, name: CURR_FEE_CLK_BUF_UW, multiplicity: 1 */
+                     100,
+  /* ID: 464, value: 1.7, name: VOLT_SCU_FPGA_P1_5_UW, multiplicity: 1 */
+                     1.7,
+  /* ID: 465, value: 700, name: CURR_SCU_P3_4_UW, multiplicity: 1 */
+                     700,
+  /* ID: 466, value: -30, name: TEMP_SEM_SCU_LA, multiplicity: 1 */
+                     -30,
+  /* ID: 467, value: -30, name: TEMP_SEM_PCU_LA, multiplicity: 1 */
+                     -30,
+  /* ID: 468, value: 3, name: VOLT_SCU_P3_4_LA, multiplicity: 1 */
+                     3,
+  /* ID: 469, value: 4.5, name: VOLT_SCU_P5_LA, multiplicity: 1 */
+                     4.5,
+  /* ID: 470, value: -60, name: TEMP_FEE_CCD_LA, multiplicity: 1 */
+                     -60,
+  /* ID: 471, value: -30, name: TEMP_FEE_STRAP_LA, multiplicity: 1 */
+                     -30,
+  /* ID: 472, value: -30, name: TEMP_FEE_ADC_LA, multiplicity: 1 */
+                     -30,
+  /* ID: 473, value: -30, name: TEMP_FEE_BIAS_LA, multiplicity: 1 */
+                     -30,
+  /* ID: 474, value: -30, name: TEMP_FEE_DEB_LA, multiplicity: 1 */
+                     -30,
+  /* ID: 475, value: 0, name: VOLT_FEE_VOD_LA, multiplicity: 1 */
+                     0,
+  /* ID: 476, value: 0, name: VOLT_FEE_VRD_LA, multiplicity: 1 */
+                     0,
+  /* ID: 477, value: 0, name: VOLT_FEE_VOG_LA, multiplicity: 1 */
+                     0,
+  /* ID: 478, value: 0, name: VOLT_FEE_VSS_LA, multiplicity: 1 */
+                     0,
+  /* ID: 479, value: 0, name: VOLT_FEE_CCD_LA, multiplicity: 1 */
+                     0,
+  /* ID: 480, value: 0, name: VOLT_FEE_CLK_LA, multiplicity: 1 */
+                     0,
+  /* ID: 481, value: 0, name: VOLT_FEE_ANA_P5_LA, multiplicity: 1 */
+                     0,
+  /* ID: 482, value: -7, name: VOLT_FEE_ANA_N5_LA, multiplicity: 1 */
+                     -7,
+  /* ID: 483, value: 0, name: VOLT_FEE_ANA_P3_3_LA, multiplicity: 1 */
+                     0,
+  /* ID: 484, value: 0, name: CURR_FEE_CLK_BUF_LA, multiplicity: 1 */
+                     0,
+  /* ID: 485, value: 1, name: VOLT_SCU_FPGA_P1_5_LA, multiplicity: 1 */
+                     1,
+  /* ID: 486, value: 0, name: CURR_SCU_P3_4_LA, multiplicity: 1 */
+                     0,
+  /* ID: 487, value: 90, name: TEMP_SEM_SCU_UA, multiplicity: 1 */
+                     90,
+  /* ID: 488, value: 90, name: TEMP_SEM_PCU_UA, multiplicity: 1 */
+                     90,
+  /* ID: 489, value: 4, name: VOLT_SCU_P3_4_UA, multiplicity: 1 */
+                     4,
+  /* ID: 490, value: 5.8, name: VOLT_SCU_P5_UA, multiplicity: 1 */
+                     5.8,
+  /* ID: 491, value: 40, name: TEMP_FEE_CCD_UA, multiplicity: 1 */
+                     40,
+  /* ID: 492, value: 70, name: TEMP_FEE_STRAP_UA, multiplicity: 1 */
+                     70,
+  /* ID: 493, value: 70, name: TEMP_FEE_ADC_UA, multiplicity: 1 */
+                     70,
+  /* ID: 494, value: 70, name: TEMP_FEE_BIAS_UA, multiplicity: 1 */
+                     70,
+  /* ID: 495, value: 70, name: TEMP_FEE_DEB_UA, multiplicity: 1 */
+                     70,
+  /* ID: 496, value: 33, name: VOLT_FEE_VOD_UA, multiplicity: 1 */
+                     33,
+  /* ID: 497, value: 20, name: VOLT_FEE_VRD_UA, multiplicity: 1 */
+                     20,
+  /* ID: 498, value: 4, name: VOLT_FEE_VOG_UA, multiplicity: 1 */
+                     4,
+  /* ID: 499, value: 11, name: VOLT_FEE_VSS_UA, multiplicity: 1 */
+                     11,
+  /* ID: 500, value: 38, name: VOLT_FEE_CCD_UA, multiplicity: 1 */
+                     38,
+  /* ID: 501, value: 20, name: VOLT_FEE_CLK_UA, multiplicity: 1 */
+                     20,
+  /* ID: 502, value: 8, name: VOLT_FEE_ANA_P5_UA, multiplicity: 1 */
+                     8,
+  /* ID: 503, value: 0, name: VOLT_FEE_ANA_N5_UA, multiplicity: 1 */
+                     0,
+  /* ID: 504, value: 5, name: VOLT_FEE_ANA_P3_3_UA, multiplicity: 1 */
+                     5,
+  /* ID: 505, value: 200, name: CURR_FEE_CLK_BUF_UA, multiplicity: 1 */
+                     200,
+  /* ID: 506, value: 3, name: VOLT_SCU_FPGA_P1_5_UA, multiplicity: 1 */
+                     3,
+  /* ID: 507, value: 900, name: CURR_SCU_P3_4_UA, multiplicity: 1 */
+                     900,
+  /* ID: 508, value: 0, name: semEvtCounter, multiplicity: 1 */
+                     0,
+  /* ID: 509, value: 0, name: SEM_SERV5_1_FORWARD, multiplicity: 1 */
+                     0,
+  /* ID: 510, value: 1, name: SEM_SERV5_2_FORWARD, multiplicity: 1 */
+                     1,
+  /* ID: 511, value: 1, name: SEM_SERV5_3_FORWARD, multiplicity: 1 */
+                     1,
+  /* ID: 512, value: 1, name: SEM_SERV5_4_FORWARD, multiplicity: 1 */
+                     1,
+  /* ID: 513, value: 0, name: pExpTime, multiplicity: 1 */
+                     0,
+  /* ID: 514, value: 0, name: pImageRep, multiplicity: 1 */
+                     0,
+  /* ID: 515, value: 604800, name: pAcqNum, multiplicity: 1 */
+                     604800,
+  /* ID: 516, value: NO, name: pDataOs, multiplicity: 1 */
+                     0,
+  /* ID: 517, value: FAINT, name: pCcdRdMode, multiplicity: 1 */
+                     0,
+  /* ID: 518, value: 0, name: pWinPosX, multiplicity: 1 */
+                     0,
+  /* ID: 519, value: 1, name: pWinPosY, multiplicity: 1 */
+                     1,
+  /* ID: 520, value: 200, name: pWinSizeX, multiplicity: 1 */
+                     200,
+  /* ID: 521, value: 200, name: pWinSizeY, multiplicity: 1 */
+                     200,
+  /* ID: 522, value: CCD, name: pDtAcqSrc, multiplicity: 1 */
+                     0,
+  /* ID: 523, value: CCD_FEE, name: pTempCtrlTarget, multiplicity: 1 */
+                     3,
+  /* ID: 524, value: 30.8, name: pVoltFeeVod, multiplicity: 1 */
+                     30.8,
+  /* ID: 525, value: 17.8, name: pVoltFeeVrd, multiplicity: 1 */
+                     17.8,
+  /* ID: 526, value: 8.8, name: pVoltFeeVss, multiplicity: 1 */
+                     8.8,
+  /* ID: 527, value: -40, name: pHeatTempFpaCCd, multiplicity: 1 */
+                     -40,
+  /* ID: 528, value: -10, name: pHeatTempFeeStrap, multiplicity: 1 */
+                     -10,
+  /* ID: 529, value: -10, name: pHeatTempFeeAnach, multiplicity: 1 */
+                     -10,
+  /* ID: 530, value: -10, name: pHeatTempSpare, multiplicity: 1 */
+                     -10,
+  /* ID: 531, value: YES, name: pStepEnDiagCcd, multiplicity: 1 */
+                     1,
+  /* ID: 532, value: YES, name: pStepEnDiagFee, multiplicity: 1 */
+                     1,
+  /* ID: 533, value: YES, name: pStepEnDiagTemp, multiplicity: 1 */
+                     1,
+  /* ID: 534, value: YES, name: pStepEnDiagAna, multiplicity: 1 */
+                     1,
+  /* ID: 535, value: NO, name: pStepEnDiagExpos, multiplicity: 1 */
+                     0,
+  /* ID: 536, value: OFF, name: pStepDebDiagCcd, multiplicity: 1 */
+                     0,
+  /* ID: 537, value: OFF, name: pStepDebDiagFee, multiplicity: 1 */
+                     0,
+  /* ID: 538, value: OFF, name: pStepDebDiagTemp, multiplicity: 1 */
+                     0,
+  /* ID: 539, value: OFF, name: pStepDebDiagAna, multiplicity: 1 */
+                     0,
+  /* ID: 540, value: OFF, name: pStepDebDiagExpos, multiplicity: 1 */
+                     0,
+  /* ID: 541, value: 1, name: SEM_SERV220_6_FORWARD, multiplicity: 1 */
+                     1,
+  /* ID: 542, value: 1, name: SEM_SERV220_12_FORWARD, multiplicity: 1 */
+                     1,
+  /* ID: 543, value: 1, name: SEM_SERV222_6_FORWARD, multiplicity: 1 */
+                     1,
+  /* ID: 544, value: STOPPED, name: saveImagesNode, multiplicity: 1 */
+                     0,
+  /* ID: 545, value: 0, name: saveImagesCnt, multiplicity: 1 */
+                     0,
+  /* ID: 546, value: GROUND, name: SaveImages_pSaveTarget, multiplicity: 1 */
+                     0,
+  /* ID: 547, value: 1, name: SaveImages_pFbfInit, multiplicity: 1 */
+                     1,
+  /* ID: 548, value: 1, name: SaveImages_pFbfEnd, multiplicity: 1 */
+                     1,
+  /* ID: 549, value: STOPPED, name: acqFullDropNode, multiplicity: 1 */
+                     0,
+  /* ID: 550, value: 0, name: acqFullDropCnt, multiplicity: 1 */
+                     0,
+  /* ID: 551, value: 0, name: AcqFullDrop_pExpTime, multiplicity: 1 */
+                     0,
+  /* ID: 552, value: 0, name: AcqFullDrop_pImageRep, multiplicity: 1 */
+                     0,
+  /* ID: 553, value: 8, name: acqFullDropT1, multiplicity: 1 */
+                     8,
+  /* ID: 554, value: 8, name: acqFullDropT2, multiplicity: 1 */
+                     8,
+  /* ID: 555, value: STOPPED, name: calFullSnapNode, multiplicity: 1 */
+                     0,
+  /* ID: 556, value: 0, name: calFullSnapCnt, multiplicity: 1 */
+                     0,
+  /* ID: 557, value: 0, name: CalFullSnap_pExpTime, multiplicity: 1 */
+                     0,
+  /* ID: 558, value: 0, name: CalFullSnap_pImageRep, multiplicity: 1 */
+                     0,
+  /* ID: 559, value: 0, name: CalFullSnap_pNmbImages, multiplicity: 1 */
+                     0,
+  /* ID: 560, value: DEF_CENT, name: CalFullSnap_pCentSel, multiplicity: 1 */
+                     2,
+  /* ID: 561, value: 8, name: calFullSnapT1, multiplicity: 1 */
+                     8,
+  /* ID: 562, value: 8, name: calFullSnapT2, multiplicity: 1 */
+                     8,
+  /* ID: 563, value: STOPPED, name: SciWinNode, multiplicity: 1 */
+                     0,
+  /* ID: 564, value: 0, name: SciWinCnt, multiplicity: 1 */
+                     0,
+  /* ID: 565, value: 0, name: SciWin_pNmbImages, multiplicity: 1 */
+                     0,
+  /* ID: 566, value: FAINT, name: SciWin_pCcdRdMode, multiplicity: 1 */
+                     0,
+  /* ID: 567, value: 0, name: SciWin_pExpTime, multiplicity: 1 */
+                     0,
+  /* ID: 568, value: 0, name: SciWin_pImageRep, multiplicity: 1 */
+                     0,
+  /* ID: 569, value: 0, name: SciWin_pWinPosX, multiplicity: 1 */
+                     0,
+  /* ID: 570, value: 1, name: SciWin_pWinPosY, multiplicity: 1 */
+                     1,
+  /* ID: 571, value: 200, name: SciWin_pWinSizeX, multiplicity: 1 */
+                     200,
+  /* ID: 572, value: 200, name: SciWin_pWinSizeY, multiplicity: 1 */
+                     200,
+  /* ID: 573, value: NO_CENT, name: SciWin_pCentSel, multiplicity: 1 */
+                     1,
+  /* ID: 574, value: 8, name: sciWinT1, multiplicity: 1 */
+                     8,
+  /* ID: 575, value: 8, name: sciWinT2, multiplicity: 1 */
+                     8,
+  /* ID: 576, value: STOPPED, name: fbfLoadNode, multiplicity: 1 */
+                     0,
+  /* ID: 577, value: 0, name: fbfLoadCnt, multiplicity: 1 */
+                     0,
+  /* ID: 578, value: STOPPED, name: fbfSaveNode, multiplicity: 1 */
+                     0,
+  /* ID: 579, value: 0, name: fbfSaveCnt, multiplicity: 1 */
+                     0,
+  /* ID: 580, value: 0, name: FbfLoad_pFbfId, multiplicity: 1 */
+                     0,
+  /* ID: 581, value: 0, name: FbfLoad_pFbfNBlocks, multiplicity: 1 */
+                     0,
+  /* ID: 582, value: 0, name: FbfLoad_pFbfRamAreaId, multiplicity: 1 */
+                     0,
+  /* ID: 583, value: 0, name: FbfLoad_pFbfRamAddr, multiplicity: 1 */
+                     0,
+  /* ID: 584, value: 0, name: FbfSave_pFbfId, multiplicity: 1 */
+                     0,
+  /* ID: 585, value: 3, name: FbfSave_pFbfNBlocks, multiplicity: 1 */
+                     3,
+  /* ID: 586, value: 0, name: FbfSave_pFbfRamAreaId, multiplicity: 1 */
+                     0,
+  /* ID: 587, value: 0, name: FbfSave_pFbfRamAddr, multiplicity: 1 */
+                     0,
+  /* ID: 588, value: 0, name: fbfLoadBlockCounter, multiplicity: 1 */
+                     0,
+  /* ID: 589, value: 0, name: fbfSaveBlockCounter, multiplicity: 1 */
+                     0,
+  /* ID: 590, value: STOPPED, name: transFbfToGrndNode, multiplicity: 1 */
+                     0,
+  /* ID: 591, value: 0, name: transFbfToGrndCnt, multiplicity: 1 */
+                     0,
+  /* ID: 592, value: 0, name: TransFbfToGrnd_pNmbFbf, multiplicity: 1 */
+                     0,
+  /* ID: 593, value: 0, name: TransFbfToGrnd_pFbfInit, multiplicity: 1 */
+                     0,
+  /* ID: 594, value: 0, name: TransFbfToGrnd_pFbfSize, multiplicity: 1 */
+                     0,
+  /* ID: 595, value: STOPPED, name: nomSciNode, multiplicity: 1 */
+                     0,
+  /* ID: 596, value: 0, name: nomSciCnt, multiplicity: 1 */
+                     0,
+  /* ID: 597, value: 0, name: NomSci_pAcqFlag, multiplicity: 1 */
+                     0,
+  /* ID: 598, value: 0, name: NomSci_pCal1Flag, multiplicity: 1 */
+                     0,
+  /* ID: 599, value: 0, name: NomSci_pSciFlag, multiplicity: 1 */
+                     0,
+  /* ID: 600, value: 0, name: NomSci_pCal2Flag, multiplicity: 1 */
+                     0,
+  /* ID: 601, value: 0, name: NomSci_pCibNFull, multiplicity: 1 */
+                     0,
+  /* ID: 602, value: 0, name: NomSci_pCibSizeFull, multiplicity: 1 */
+                     0,
+  /* ID: 603, value: 0, name: NomSci_pSibNFull, multiplicity: 1 */
+                     0,
+  /* ID: 604, value: 0, name: NomSci_pSibSizeFull, multiplicity: 1 */
+                     0,
+  /* ID: 605, value: 0, name: NomSci_pGibNFull, multiplicity: 1 */
+                     0,
+  /* ID: 606, value: 0, name: NomSci_pGibSizeFull, multiplicity: 1 */
+                     0,
+  /* ID: 607, value: 0, name: NomSci_pSibNWin, multiplicity: 1 */
+                     0,
+  /* ID: 608, value: 0, name: NomSci_pSibSizeWin, multiplicity: 1 */
+                     0,
+  /* ID: 609, value: 0, name: NomSci_pCibNWin, multiplicity: 1 */
+                     0,
+  /* ID: 610, value: 0, name: NomSci_pCibSizeWin, multiplicity: 1 */
+                     0,
+  /* ID: 611, value: 0, name: NomSci_pGibNWin, multiplicity: 1 */
+                     0,
+  /* ID: 612, value: 0, name: NomSci_pGibSizeWin, multiplicity: 1 */
+                     0,
+  /* ID: 613, value: 0, name: NomSci_pExpTimeAcq, multiplicity: 1 */
+                     0,
+  /* ID: 614, value: 0, name: NomSci_pImageRepAcq, multiplicity: 1 */
+                     0,
+  /* ID: 615, value: 0, name: NomSci_pExpTimeCal1, multiplicity: 1 */
+                     0,
+  /* ID: 616, value: 0, name: NomSci_pImageRepCal1, multiplicity: 1 */
+                     0,
+  /* ID: 617, value: 0, name: NomSci_pNmbImagesCal1, multiplicity: 1 */
+                     0,
+  /* ID: 618, value: NO_CENT, name: NomSci_pCentSelCal1, multiplicity: 1 */
+                     1,
+  /* ID: 619, value: 0, name: NomSci_pNmbImagesSci, multiplicity: 1 */
+                     0,
+  /* ID: 620, value: FAINT, name: NomSci_pCcdRdModeSci, multiplicity: 1 */
+                     0,
+  /* ID: 621, value: 0, name: NomSci_pExpTimeSci, multiplicity: 1 */
+                     0,
+  /* ID: 622, value: 0, name: NomSci_pImageRepSci, multiplicity: 1 */
+                     0,
+  /* ID: 623, value: 0, name: NomSci_pWinPosXSci, multiplicity: 1 */
+                     0,
+  /* ID: 624, value: 1, name: NomSci_pWinPosYSci, multiplicity: 1 */
+                     1,
+  /* ID: 625, value: 200, name: NomSci_pWinSizeXSci, multiplicity: 1 */
+                     200,
+  /* ID: 626, value: 200, name: NomSci_pWinSizeYSci, multiplicity: 1 */
+                     200,
+  /* ID: 627, value: NO_CENT, name: NomSci_pCentSelSci, multiplicity: 1 */
+                     1,
+  /* ID: 628, value: 0, name: NomSci_pExpTimeCal2, multiplicity: 1 */
+                     0,
+  /* ID: 629, value: 0, name: NomSci_pImageRepCal2, multiplicity: 1 */
+                     0,
+  /* ID: 630, value: 0, name: NomSci_pNmbImagesCal2, multiplicity: 1 */
+                     0,
+  /* ID: 631, value: NO_CENT, name: NomSci_pCentSelCal2, multiplicity: 1 */
+                     1,
+  /* ID: 632, value: GROUND, name: NomSci_pSaveTarget, multiplicity: 1 */
+                     0,
+  /* ID: 633, value: 0, name: NomSci_pFbfInit, multiplicity: 1 */
+                     0,
+  /* ID: 634, value: 0, name: NomSci_pFbfEnd, multiplicity: 1 */
+                     0,
+  /* ID: 635, value: 0, name: NomSci_pStckOrderCal1, multiplicity: 1 */
+                     0,
+  /* ID: 636, value: 0, name: NomSci_pStckOrderSci, multiplicity: 1 */
+                     0,
+  /* ID: 637, value: 0, name: NomSci_pStckOrderCal2, multiplicity: 1 */
+                     0,
+  /* ID: 638, value: RESET, name: ConfigSdb_pSdbCmd, multiplicity: 1 */
+                     0,
+  /* ID: 639, value: 0, name: ConfigSdb_pCibNFull, multiplicity: 1 */
+                     0,
+  /* ID: 640, value: 0, name: ConfigSdb_pCibSizeFull, multiplicity: 1 */
+                     0,
+  /* ID: 641, value: 0, name: ConfigSdb_pSibNFull, multiplicity: 1 */
+                     0,
+  /* ID: 642, value: 0, name: ConfigSdb_pSibSizeFull, multiplicity: 1 */
+                     0,
+  /* ID: 643, value: 0, name: ConfigSdb_pGibNFull, multiplicity: 1 */
+                     0,
+  /* ID: 644, value: 0, name: ConfigSdb_pGibSizeFull, multiplicity: 1 */
+                     0,
+  /* ID: 645, value: 0, name: ConfigSdb_pSibNWin, multiplicity: 1 */
+                     0,
+  /* ID: 646, value: 0, name: ConfigSdb_pSibSizeWin, multiplicity: 1 */
+                     0,
+  /* ID: 647, value: 0, name: ConfigSdb_pCibNWin, multiplicity: 1 */
+                     0,
+  /* ID: 648, value: 0, name: ConfigSdb_pCibSizeWin, multiplicity: 1 */
+                     0,
+  /* ID: 649, value: 0, name: ConfigSdb_pGibNWin, multiplicity: 1 */
+                     0,
+  /* ID: 650, value: 0, name: ConfigSdb_pGibSizeWin, multiplicity: 1 */
+                     0,
+  /* ID: 651, value: 0, name: ADC_P3V3, multiplicity: 1 */
+                     0,
+  /* ID: 652, value: 0, name: ADC_P5V, multiplicity: 1 */
+                     0,
+  /* ID: 653, value: 0, name: ADC_P1V8, multiplicity: 1 */
+                     0,
+  /* ID: 654, value: 0, name: ADC_P2V5, multiplicity: 1 */
+                     0,
+  /* ID: 655, value: 0, name: ADC_N5V, multiplicity: 1 */
+                     0,
+  /* ID: 656, value: 0, name: ADC_PGND, multiplicity: 1 */
+                     0,
+  /* ID: 657, value: 0, name: ADC_TEMPOH1A, multiplicity: 1 */
+                     0,
+  /* ID: 658, value: 0, name: ADC_TEMP1, multiplicity: 1 */
+                     0,
+  /* ID: 659, value: 0, name: ADC_TEMPOH2A, multiplicity: 1 */
+                     0,
+  /* ID: 660, value: 0, name: ADC_TEMPOH1B, multiplicity: 1 */
+                     0,
+  /* ID: 661, value: 0, name: ADC_TEMPOH3A, multiplicity: 1 */
+                     0,
+  /* ID: 662, value: 0, name: ADC_TEMPOH2B, multiplicity: 1 */
+                     0,
+  /* ID: 663, value: 0, name: ADC_TEMPOH4A, multiplicity: 1 */
+                     0,
+  /* ID: 664, value: 0, name: ADC_TEMPOH3B, multiplicity: 1 */
+                     0,
+  /* ID: 665, value: 0, name: ADC_TEMPOH4B, multiplicity: 1 */
+                     0,
+  /* ID: 666, value: 0, name: SEM_P15V, multiplicity: 1 */
+                     0,
+  /* ID: 667, value: 0, name: SEM_P30V, multiplicity: 1 */
+                     0,
+  /* ID: 668, value: 0, name: SEM_P5V0, multiplicity: 1 */
+                     0,
+  /* ID: 669, value: 0, name: SEM_P7V0, multiplicity: 1 */
+                     0,
+  /* ID: 670, value: 0, name: SEM_N5V0, multiplicity: 1 */
+                     0,
+  /* ID: 671, value: 0, name: ADC_P3V3_RAW, multiplicity: 1 */
+                     0,
+  /* ID: 672, value: 0, name: ADC_P5V_RAW, multiplicity: 1 */
+                     0,
+  /* ID: 673, value: 0, name: ADC_P1V8_RAW, multiplicity: 1 */
+                     0,
+  /* ID: 674, value: 0, name: ADC_P2V5_RAW, multiplicity: 1 */
+                     0,
+  /* ID: 675, value: 0, name: ADC_N5V_RAW, multiplicity: 1 */
+                     0,
+  /* ID: 676, value: 0, name: ADC_PGND_RAW, multiplicity: 1 */
+                     0,
+  /* ID: 677, value: 0, name: ADC_TEMPOH1A_RAW, multiplicity: 1 */
+                     0,
+  /* ID: 678, value: 0, name: ADC_TEMP1_RAW, multiplicity: 1 */
+                     0,
+  /* ID: 679, value: 0, name: ADC_TEMPOH2A_RAW, multiplicity: 1 */
+                     0,
+  /* ID: 680, value: 0, name: ADC_TEMPOH1B_RAW, multiplicity: 1 */
+                     0,
+  /* ID: 681, value: 0, name: ADC_TEMPOH3A_RAW, multiplicity: 1 */
+                     0,
+  /* ID: 682, value: 0, name: ADC_TEMPOH2B_RAW, multiplicity: 1 */
+                     0,
+  /* ID: 683, value: 0, name: ADC_TEMPOH4A_RAW, multiplicity: 1 */
+                     0,
+  /* ID: 684, value: 0, name: ADC_TEMPOH3B_RAW, multiplicity: 1 */
+                     0,
+  /* ID: 685, value: 0, name: ADC_TEMPOH4B_RAW, multiplicity: 1 */
+                     0,
+  /* ID: 686, value: 0, name: SEM_P15V_RAW, multiplicity: 1 */
+                     0,
+  /* ID: 687, value: 0, name: SEM_P30V_RAW, multiplicity: 1 */
+                     0,
+  /* ID: 688, value: 0, name: SEM_P5V0_RAW, multiplicity: 1 */
+                     0,
+  /* ID: 689, value: 0, name: SEM_P7V0_RAW, multiplicity: 1 */
+                     0,
+  /* ID: 690, value: 0, name: SEM_N5V0_RAW, multiplicity: 1 */
+                     0,
+  /* ID: 691, value: 3.9, name: ADC_P3V3_U, multiplicity: 1 */
+                     3.9,
+  /* ID: 692, value: 6.4, name: ADC_P5V_U, multiplicity: 1 */
+                     6.4,
+  /* ID: 693, value: 2.1, name: ADC_P1V8_U, multiplicity: 1 */
+                     2.1,
+  /* ID: 694, value: 3.4, name: ADC_P2V5_U, multiplicity: 1 */
+                     3.4,
+  /* ID: 695, value: -6.4, name: ADC_N5V_L, multiplicity: 1 */
+                     -6.4,
+  /* ID: 696, value: 1, name: ADC_PGND_U, multiplicity: 1 */
+                     1,
+  /* ID: 697, value: -1, name: ADC_PGND_L, multiplicity: 1 */
+                     -1,
+  /* ID: 698, value: 60, name: ADC_TEMPOH1A_U, multiplicity: 1 */
+                     60,
+  /* ID: 699, value: 60, name: ADC_TEMP1_U, multiplicity: 1 */
+                     60,
+  /* ID: 700, value: 60, name: ADC_TEMPOH2A_U, multiplicity: 1 */
+                     60,
+  /* ID: 701, value: 60, name: ADC_TEMPOH1B_U, multiplicity: 1 */
+                     60,
+  /* ID: 702, value: 60, name: ADC_TEMPOH3A_U, multiplicity: 1 */
+                     60,
+  /* ID: 703, value: 60, name: ADC_TEMPOH2B_U, multiplicity: 1 */
+                     60,
+  /* ID: 704, value: 60, name: ADC_TEMPOH4A_U, multiplicity: 1 */
+                     60,
+  /* ID: 705, value: 60, name: ADC_TEMPOH3B_U, multiplicity: 1 */
+                     60,
+  /* ID: 706, value: 60, name: ADC_TEMPOH4B_U, multiplicity: 1 */
+                     60,
+  /* ID: 707, value: 18.6, name: SEM_P15V_U, multiplicity: 1 */
+                     18.6,
+  /* ID: 708, value: 36.3, name: SEM_P30V_U, multiplicity: 1 */
+                     36.3,
+  /* ID: 709, value: 8.2, name: SEM_P5V0_U, multiplicity: 1 */
+                     8.2,
+  /* ID: 710, value: 9.6, name: SEM_P7V0_U, multiplicity: 1 */
+                     9.6,
+  /* ID: 711, value: -8.1, name: SEM_N5V0_L, multiplicity: 1 */
+                     -8.1,
+  /* ID: 712, value: 0, name: HbSemPassword, multiplicity: 1 */
+                     0,
+  /* ID: 713, value: 0, name: HbSemCounter, multiplicity: 1 */
+                     0,
+  /* ID: 726, value: 115, name: MAX_SEM_PCKT_CYC, multiplicity: 1 */
+                     115,
+  /* ID: 798, value: 0, name: SemPwrOnTimestamp, multiplicity: 1 */
+                     0,
+  /* ID: 799, value: 0, name: SemPwrOffTimestamp, multiplicity: 1 */
+                     0,
+  /* ID: 800, value: 0, name: IASW_EVT_CTR, multiplicity: 1 */
+                     0,
+  /* ID: 834, value: 1073741824, name: Sram1ScrCurrAddr, multiplicity: 1 */
+                     1073741824,
+  /* ID: 835, value: 67108864, name: Sram2ScrCurrAddr, multiplicity: 1 */
+                     67108864,
+  /* ID: 836, value: 1024, name: Sram1ScrLength, multiplicity: 1 */
+                     1024,
+  /* ID: 837, value: 1024, name: Sram2ScrLength, multiplicity: 1 */
+                     1024,
+  /* ID: 838, value: 0, name: EdacSingleRepaired, multiplicity: 1 */
+                     0,
+  /* ID: 839, value: 0, name: EdacSingleFaults, multiplicity: 1 */
+                     0,
+  /* ID: 840, value: 0, name: EdacLastSingleFail, multiplicity: 1 */
+                     0,
+  /* ID: 843, value: IDLE, name: Cpu2ProcStatus, multiplicity: 1 */
+                     0,
+  /* ID: 853, value: AMANMVA, name: TaAlgoId, multiplicity: 1 */
+                     3,
+  /* ID: 854, value: 111, name: TAACQALGOID, multiplicity: 1 */
+                     111,
+  /* ID: 855, value: 0, name: TASPARE32, multiplicity: 1 */
+                     0,
+  /* ID: 856, value: 12000, name: TaTimingPar1, multiplicity: 1 */
+                     12000,
+  /* ID: 857, value: 2000, name: TaTimingPar2, multiplicity: 1 */
+                     2000,
+  /* ID: 858, value: 10, name: TaDistanceThrd, multiplicity: 1 */
+                     10,
+  /* ID: 859, value: 10, name: TaIterations, multiplicity: 1 */
+                     10,
+  /* ID: 860, value: 8, name: TaRebinningFact, multiplicity: 1 */
+                     8,
+  /* ID: 861, value: 35000, name: TaDetectionThrd, multiplicity: 1 */
+                     35000,
+  /* ID: 862, value: 0, name: TaSeReducedExtr, multiplicity: 1 */
+                     0,
+  /* ID: 863, value: 392, name: TaSeReducedRadius, multiplicity: 1 */
+                     392,
+  /* ID: 864, value: 5, name: TaSeTolerance, multiplicity: 1 */
+                     5,
+  /* ID: 865, value: 15, name: TaMvaTolerance, multiplicity: 1 */
+                     15,
+  /* ID: 866, value: 3, name: TaAmaTolerance, multiplicity: 1 */
+                     3,
+  /* ID: 867, value: 200, name: TAPOINTUNCERT, multiplicity: 1 */
+                     200,
+  /* ID: 868, value: 10000, name: TATARGETSIG, multiplicity: 1 */
+                     10000,
+  /* ID: 869, value: 20, name: TANROFSTARS, multiplicity: 1 */
+                     20,
+  /* ID: 870, value: 0.2029259, name: TaMaxSigFract, multiplicity: 1 */
+                     0.2029259,
+  /* ID: 871, value: 1753.5, name: TaBias, multiplicity: 1 */
+                     1753.5,
+  /* ID: 872, value: 0.04, name: TaDark, multiplicity: 1 */
+                     0.04,
+  /* ID: 873, value: 2.9533725, name: TaSkyBg, multiplicity: 1 */
+                     2.9533725,
+  /* ID: 874, value: 16, name: COGBITS, multiplicity: 1 */
+                     16,
+  /* ID: 875, value: -1, name: CENT_MULT_X, multiplicity: 1 */
+                     -1,
+  /* ID: 876, value: -1, name: CENT_MULT_Y, multiplicity: 1 */
+                     -1,
+  /* ID: 877, value: 0, name: CENT_OFFSET_X, multiplicity: 1 */
+                     0,
+  /* ID: 878, value: 0, name: CENT_OFFSET_Y, multiplicity: 1 */
+                     0,
+  /* ID: 879, value: 0, name: CENT_MEDIANFILTER, multiplicity: 1 */
+                     0,
+  /* ID: 880, value: 51, name: CENT_DIM_X, multiplicity: 1 */
+                     51,
+  /* ID: 881, value: 51, name: CENT_DIM_Y, multiplicity: 1 */
+                     51,
+  /* ID: 882, value: 1, name: CENT_CHECKS, multiplicity: 1 */
+                     1,
+  /* ID: 883, value: 400, name: CEN_SIGMALIMIT, multiplicity: 1 */
+                     400,
+  /* ID: 884, value: 400, name: CEN_SIGNALLIMIT, multiplicity: 1 */
+                     400,
+  /* ID: 885, value: 1000, name: CEN_MEDIAN_THRD, multiplicity: 1 */
+                     1000,
+  /* ID: 886, value: 512, name: OPT_AXIS_X, multiplicity: 1 */
+                     512,
+  /* ID: 887, value: 512, name: OPT_AXIS_Y, multiplicity: 1 */
+                     512,
+  /* ID: 888, value: 0, name: DIST_CORR, multiplicity: 1 */
+                     0,
+  /* ID: 889, value: 10, name: pStckOrderSci, multiplicity: 1 */
+                     10,
+  /* ID: 890, value: 200, name: pWinSizeXSci, multiplicity: 1 */
+                     200,
+  /* ID: 891, value: 200, name: pWinSizeYSci, multiplicity: 1 */
+                     200,
+  /* ID: 892, value: CIRCULAR, name: SdpImageAptShape, multiplicity: 1 */
+                     1,
+  /* ID: 893, value: 200, name: SdpImageAptX, multiplicity: 1 */
+                     200,
+  /* ID: 894, value: 200, name: SdpImageAptY, multiplicity: 1 */
+                     200,
+  /* ID: 895, value: CIRCULAR, name: SdpImgttAptShape, multiplicity: 1 */
+                     1,
+  /* ID: 896, value: 31, name: SdpImgttAptX, multiplicity: 1 */
+                     31,
+  /* ID: 897, value: 31, name: SdpImgttAptY, multiplicity: 1 */
+                     31,
+  /* ID: 898, value: 1, name: SdpImgttStckOrder, multiplicity: 1 */
+                     1,
+  /* ID: 899, value: 1, name: SdpLosStckOrder, multiplicity: 1 */
+                     1,
+  /* ID: 900, value: 1, name: SdpLblkStckOrder, multiplicity: 1 */
+                     1,
+  /* ID: 901, value: 1, name: SdpLdkStckOrder, multiplicity: 1 */
+                     1,
+  /* ID: 902, value: 1, name: SdpRdkStckOrder, multiplicity: 1 */
+                     1,
+  /* ID: 903, value: 1, name: SdpRblkStckOrder, multiplicity: 1 */
+                     1,
+  /* ID: 904, value: 1, name: SdpTosStckOrder, multiplicity: 1 */
+                     1,
+  /* ID: 905, value: 1, name: SdpTdkStckOrder, multiplicity: 1 */
+                     1,
+  /* ID: 906, value: STATIC, name: SdpImgttStrat, multiplicity: 1 */
+                     0,
+  /* ID: 907, value: 100, name: Sdp3StatAmpl, multiplicity: 1 */
+                     100,
+  /* ID: 908, value: MEAN, name: SdpPhotStrat, multiplicity: 1 */
+                     0,
+  /* ID: 909, value: 15, name: SdpPhotRcent, multiplicity: 1 */
+                     15,
+  /* ID: 910, value: 30, name: SdpPhotRann1, multiplicity: 1 */
+                     30,
+  /* ID: 911, value: 40, name: SdpPhotRann2, multiplicity: 1 */
+                     40,
+  /* ID: 912, value: 0, name: SdpCrc, multiplicity: 1 */
+                     0,
+  /* ID: 913, value: 0, name: CCPRODUCT, multiplicity: 1 */
+                     0,
+  /* ID: 914, value: 0, name: CCSTEP, multiplicity: 1 */
+                     0,
+  /* ID: 915, value: 0, name: XIB_FAILURES, multiplicity: 1 */
+                     0,
+  /* ID: 916, value: 0, name: FEE_SIDE_A, multiplicity: 12 */
+		     {2,8,4,6,250,31,33,0,0,0,0,0}, /* NOTE: manually set the "assigned" ones from SEM FM UM 1.4 */
+  /* ID: 917, value: 0, name: FEE_SIDE_B, multiplicity: 12 */
+                     {1,7,3,5,251,32,34,0,0,0,0,0},  /* NOTE: manually set the "assigned" ones from SEM FM UM 1.4 */
+  /* ID: 918, value: 0, name: NLCBORDERS, multiplicity: 28 */ /* NOTE: manually set, 230 kHz */
+                     {7103, 13878, 27963, 62360, 80978, 96220, 114403, 120305, 121297, 122622, 128223, 128223, 128223, 128223, 128223, 128223, 128223, 128223, 128223, 128223, 128223, 128223, 128223, 128223, 128223, 128223, 128223, 128223},
+/* old: ADU {3630, 7093, 14292, 31872, 41388, 49178, 58471, 61488, 61995, 62672, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535}, */
+/* old NLC: {1267, 2501, 3732, 4963, 6193, 7423, 8644, 9878, 11098, 12330, 15391, 18443, 21490, 24529, 27560, 30584, 33598, 36606, 39606, 42597, 45582, 48544, 51438, 54056, 55996, 57045, 58000, 65535}, */
+  /* ID: 919, value: 0, name: NLCCOEFF_A, multiplicity: 28 */ /* NOTE: manually set, 230 kHz */
+{-1.9448292e-07, -2.5471461e-10, 6.1955157e-08, 8.1523396e-08, 8.4184145e-08, 5.7885295e-08, 2.3925561e-07, 2.139497e-05, 0.0012188126, -1.2927786e-05, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
+/* old NLC: {1.6542972e+02, 1.3805946e+03, 2.5957595e+03, 3.8109244e+03, 5.0260894e+03, 6.2412543e+03, 7.4564192e+03, 8.6715841e+03, 9.8867490e+03, 1.1101914e+04, 1.2317079e+04, 1.5354991e+04, 1.8392903e+04, 2.1430816e+04, 2.4468728e+04, 2.7506640e+04, 3.0544552e+04, 3.3582465e+04, 3.6620377e+04, 3.9658289e+04, 4.2696202e+04, 4.5734114e+04, 4.8772026e+04, 5.1809938e+04, 5.4847851e+04, 5.7885763e+04, 6.0923675e+04, 6.5535000e+04}, */
+  /* ID: 920, value: 0, name: NLCCOEFF_B, multiplicity: 28 */ /* NOTE: manually set, 230 kHz */
+{0.99773673, 0.99497384, 0.99497039, 0.99671569, 1.002324, 1.0054587, 1.0072233, 1.0159238, 1.2684748, 3.6876537, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0},
+/* old NLC: {9.3751570e-01, 9.7668084e-01, 9.8767829e-01, 9.8701867e-01, 9.8779389e-01, 9.8661244e-01, 9.9342212e-01, 9.8855860e-01, 9.9023516e-01, 9.9295951e-01, 9.8550757e-01, 9.9558868e-01, 9.9574776e-01, 9.9833593e-01, 1.0009162e+00, 1.0034410e+00, 1.0063064e+00, 1.0089037e+00, 1.0111977e+00, 1.0145322e+00, 1.0160308e+00, 1.0217782e+00, 1.0274503e+00, 1.0935509e+00, 1.2344498e+00, 2.1690294e+00, 3.8757727e+00, 5.6159531e+00}, */
+  /* ID: 921, value: 0, name: NLCCOEFF_C, multiplicity: 28 */ /* NOTE: manually set, 230 kHz */
+{0.0, 7077.2753, 13817.994, 27844.636, 62225.153, 80915.779, 96254.514, 114647.32, 121388.7, 123848.02, 128710.0, 134311.0, 134311.0, 134311.0, 134311.0, 134311.0, 134311.0, 134311.0, 134311.0, 134311.0, 134311.0, 134311.0, 134311.0, 134311.0, 134311.0, 134311.0, 134311.0, 134311.0},
+/* old NLC: {2.1035964e-05, 9.8874568e-06, -9.7833909e-07, 4.4254180e-07, 1.8741129e-07, -1.1474842e-06, 6.6864550e-06, -1.0666894e-05, 1.2025528e-05, -9.7924614e-06, 3.7430750e-06, -4.4891247e-07, 5.0102665e-07, 3.4847735e-07, 5.0050828e-07, 3.3247057e-07, 6.1518573e-07, 2.4643065e-07, 5.1617919e-07, 5.9553632e-07, -9.4537719e-08, 2.0202119e-06, -1.0518593e-07, 2.2938227e-05, 3.0887449e-05, 4.5085953e-04, 1.1759395e-03, 6.4678568e-04}, */
+  /* ID: 922, value: 0, name: NLCCOEFF_D, multiplicity: 28 */ /* NOTE: manually set. For the order and meaning, see SdpNlcPhot.h */
+{650.0, 0.5111, 8.8, 22.0, 9.0, -5.75, -2.8951e-02, 3.0388e-02, -8.376e-03, 5.288e-03, -6.852e-03, -1.1206e-02, 0.0, 1.640e-03, 1.3978e-02, 0.0, 6.612e-03, 4.35e-03, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.106e-03, 0.0},		     
+/* old NLC: {-2.9341567e-09, -2.9341567e-09, 3.8471879e-10, -6.9107443e-11, -3.6159111e-10, 2.1240355e-09, -4.7341521e-09, 6.1297314e-09, -5.9611804e-09, 3.6626557e-09, -4.5659957e-10, 1.0372969e-10, -1.6690174e-11, 1.6673993e-11, -1.8479584e-11, 3.1167539e-11, -4.0776664e-11, 2.9891495e-11, 8.8190944e-12, -7.6901145e-11, 2.3618228e-10, -2.3919308e-10, 2.6532860e-09, 1.0122442e-09, 7.2160882e-08, 2.3037234e-07, -1.8475133e-07, -1.8475133e-07}, */
+  /* ID: 923, value: 0, name: SdpGlobalBias, multiplicity: 1 */
+                     0,
+  /* ID: 924, value: LOS, name: BiasOrigin, multiplicity: 1 */
+                     1,
+  /* ID: 925, value: 0, name: SdpGlobalGain, multiplicity: 1 */
+                     0,
+  /* ID: 926, value: 0x30150303, name: SdpWinImageCeKey, multiplicity: 1 */
+                     0x30150303,
+  /* ID: 927, value: 0x20050303, name: SdpWinImgttCeKey, multiplicity: 1 */
+                     0x20050303,
+  /* ID: 928, value: 0x10000000, name: SdpWinHdrCeKey, multiplicity: 1 */
+                     0x10000000,
+  /* ID: 929, value: 0x40190403, name: SdpWinMLOSCeKey, multiplicity: 1 */
+                     0x40190403,
+  /* ID: 930, value: 0xf0000000, name: SdpWinMLBLKCeKey, multiplicity: 1 */
+                     0xf0000000,
+  /* ID: 931, value: 0x60190403, name: SdpWinMLDKCeKey, multiplicity: 1 */
+                     0x60190403,
+  /* ID: 932, value: 0x70190403, name: SdpWinMRDKCeKey, multiplicity: 1 */
+                     0x70190403,
+  /* ID: 933, value: 0xf0000000, name: SdpWinMRBLKCeKey, multiplicity: 1 */
+                     0xf0000000,
+  /* ID: 934, value: 0x90100403, name: SdpWinMTOSCeKey, multiplicity: 1 */
+                     0x90100403,
+  /* ID: 935, value: 0xa0100403, name: SdpWinMTDKCeKey, multiplicity: 1 */
+                     0xa0100403,
+  /* ID: 936, value: 0x30200103, name: SdpFullImgCeKey, multiplicity: 1 */
+                     0x30200103,
+  /* ID: 937, value: 0x10000000, name: SdpFullHdrCeKey, multiplicity: 1 */
+                     0x10000000,
+  /* ID: 938, value: 0, name: CE_Timetag_crs, multiplicity: 1 */
+                     0,
+  /* ID: 939, value: 0, name: CE_Timetag_fine, multiplicity: 1 */
+                     0,
+  /* ID: 940, value: 0, name: CE_Counter, multiplicity: 1 */
+                     0,
+  /* ID: 941, value: 0x6E0B, name: CE_Version, multiplicity: 1 */
+                     0x6E0B,
+  /* ID: 942, value: 0, name: CE_Integrity, multiplicity: 1 */
+                     0,
+  /* ID: 943, value: 412, name: CE_SemWindowPosX, multiplicity: 1 */
+                     412,
+  /* ID: 944, value: 412, name: CE_SemWindowPosY, multiplicity: 1 */
+                     412,
+  /* ID: 945, value: 200, name: CE_SemWindowSizeX, multiplicity: 1 */
+                     200,
+  /* ID: 946, value: 200, name: CE_SemWindowSizeY, multiplicity: 1 */
+                     200,
+  /* ID: 947, value: 0, name: SPILL_CTR, multiplicity: 1 */
+                     0,
+  /* ID: 948, value: 5, name: RZIP_ITER1, multiplicity: 1 */
+                     5,
+  /* ID: 949, value: 3, name: RZIP_ITER2, multiplicity: 1 */
+                     3,
+  /* ID: 950, value: 5, name: RZIP_ITER3, multiplicity: 1 */
+                     5,
+  /* ID: 951, value: 0, name: RZIP_ITER4, multiplicity: 1 */
+                     0,
+  /* ID: 952, value: 0xffff, name: SdpLdkColMask, multiplicity: 1 */
+                     0xffff,
+  /* ID: 953, value: 0xffff, name: SdpRdkColMask, multiplicity: 1 */
+                     0xffff,
+  /* ID: 960, value: 0, name: GIBTOTRANSFER, multiplicity: 1 */
+                     0,
+  /* ID: 961, value: 0, name: TRANSFERMODE, multiplicity: 1 */
+                     0,
+  /* ID: 962, value: 0, name: S2TOTRANSFERSIZE, multiplicity: 1 */
+                     0,
+  /* ID: 963, value: 0, name: S4TOTRANSFERSIZE, multiplicity: 1 */
+                     0,
+  /* ID: 964, value: 0, name: TransferComplete, multiplicity: 1 */
+                     0,
+  /* ID: 965, value: 0, name: NLCBORDERS_2, multiplicity: 28 */
+                     {28267, 62972, 97467, 111205, 117732, 121460, 130000, 130000, 130000, 130000, 130000, 130000, 130000, 130000, 130000, 130000, 130000, 130000, 130000, 130000, 130000, 130000, 130000, 130000, 130000, 130000, 130000, 130000},
+  /* ID: 966, value: 0, name: NLCCOEFF_A_2, multiplicity: 28 */
+                     {6.464197e-08, 1.0288715e-07, 8.8843558e-08, 9.3269555e-08, 7.873576e-06, 0.00020023889, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+  /* ID: 967, value: 0, name: NLCCOEFF_B_2, multiplicity: 28 */
+                     {0.99206587, 0.9957203, 1.0028618, 1.0089911, 1.0115539, 1.1143296, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
+  /* ID: 968, value: 0, name: NLCCOEFF_C_2, multiplicity: 28 */
+                     {0.0, 28094.034, 62775.109, 97474.114, 111353.83, 118291.25, 125230, 125230, 125230, 125230, 125230, 125230, 125230, 125230, 125230, 133769, 133769, 133769, 133769, 133769, 133769, 133769, 133769, 133769, 133769, 133769, 133769, 133769},
+  /* ID: 969, value: 0, name: RF100, multiplicity: 12 */ /* manually set. NOTE: both sides needed! */
+                     {31,32,33,34,0,0,0,0,0,0,0,0},
+  /* ID: 970, value: 0, name: RF230, multiplicity: 12 */ /* manually set. NOTE: both sides needed! */
+                     {2,1,8,7,4,3,6,5,250,251,0,0},
+  /* ID: 971, value: 1.0, name: distc1, multiplicity: 1 */
+                     1.0,
+  /* ID: 972, value: 3.69355E-8, name: distc2, multiplicity: 1 */
+                     3.69355E-8,
+  /* ID: 973, value: 7.03436E-15, name: distc3, multiplicity: 1 */
+                     7.03436E-15,
+  /* ID: 974, value: 0, name: SPARE_UI_0, multiplicity: 1 */
+                     0,
+  /* ID: 975, value: 0, name: SPARE_UI_1, multiplicity: 1 */
+                     0,
+  /* ID: 976, value: 0, name: SPARE_UI_2, multiplicity: 1 */
+                     0,
+  /* ID: 977, value: 0, name: SPARE_UI_3, multiplicity: 1 */
+                     0,
+  /* ID: 978, value: 0, name: SPARE_UI_4, multiplicity: 1 */
+                     0,
+  /* ID: 979, value: 0, name: SPARE_UI_5, multiplicity: 1 */
+                     0,
+  /* ID: 980, value: 0, name: SPARE_UI_6, multiplicity: 1 */
+                     0,
+  /* ID: 981, value: 0, name: SPARE_UI_7, multiplicity: 1 */
+                     0,
+  /* ID: 982, value: 0, name: SPARE_UI_8, multiplicity: 1 */
+                     0,
+  /* ID: 983, value: 0, name: SPARE_UI_9, multiplicity: 1 */
+                     0,
+  /* ID: 984, value: 0, name: SPARE_UI_10, multiplicity: 1 */
+                     0,
+  /* ID: 985, value: 0, name: SPARE_UI_11, multiplicity: 1 */
+                     0,
+  /* ID: 986, value: 0, name: SPARE_UI_12, multiplicity: 1 */
+                     0,
+  /* ID: 987, value: 0, name: SPARE_UI_13, multiplicity: 1 */
+                     0,
+  /* ID: 988, value: 0, name: SPARE_UI_14, multiplicity: 1 */
+                     0,
+  /* ID: 989, value: 0, name: SPARE_UI_15, multiplicity: 1 */
+                     0,
+  /* ID: 990, value: 0, name: SPARE_F_0, multiplicity: 1 */
+                     0,
+  /* ID: 991, value: 0, name: SPARE_F_1, multiplicity: 1 */
+                     0,
+  /* ID: 992, value: 0, name: SPARE_F_2, multiplicity: 1 */
+                     0,
+  /* ID: 993, value: 0, name: SPARE_F_3, multiplicity: 1 */
+                     0,
+  /* ID: 994, value: 0, name: SPARE_F_4, multiplicity: 1 */
+                     0,
+  /* ID: 995, value: 0, name: SPARE_F_5, multiplicity: 1 */
+                     0,
+  /* ID: 996, value: 0, name: SPARE_F_6, multiplicity: 1 */
+                     0,
+  /* ID: 997, value: 0, name: SPARE_F_7, multiplicity: 1 */
+                     0,
+  /* ID: 998, value: 0, name: SPARE_F_8, multiplicity: 1 */
+                     0,
+  /* ID: 999, value: 0, name: SPARE_F_9, multiplicity: 1 */
+                     0,
+  /* ID: 1000, value: 0, name: SPARE_F_10, multiplicity: 1 */
+                      0,
+  /* ID: 1001, value: 0, name: SPARE_F_11, multiplicity: 1 */
+                      0,
+  /* ID: 1002, value: 0, name: SPARE_F_12, multiplicity: 1 */
+                      0,
+  /* ID: 1003, value: 0, name: SPARE_F_13, multiplicity: 1 */
+                      0,
+  /* ID: 1004, value: 0, name: SPARE_F_14, multiplicity: 1 */
+                      0,
+  /* ID: 1005, value: 0, name: SPARE_F_15, multiplicity: 1 */
+                      0
+};
+
+/** Initialization of the structure holding of data pool variables and parameter items for IBSW. */
+#ifdef PC_TARGET
+struct DataPoolIbsw dpIbsw;
+struct DataPoolIbsw dpIbswInit = { 
+#else
+struct DataPoolIbsw dpIbsw = { 
+#endif /* PC_TARGET */
+  /* ID: 714, value: 1, name: isWatchdogEnabled, multiplicity: 1 */
+                     1,
+  /* ID: 715, value: 0, name: isSynchronized, multiplicity: 1 */
+                     0,
+  /* ID: 716, value: 0, name: missedMsgCnt, multiplicity: 1 */
+                     0,
+  /* ID: 717, value: 0, name: missedPulseCnt, multiplicity: 1 */
+                     0,
+  /* ID: 718, value: 20000, name: milFrameDelay, multiplicity: 1 */
+                     20000,
+  /* ID: 719, value: CHIP1, name: EL1_CHIP, multiplicity: 1 */
+                     0,
+  /* ID: 720, value: CHIP2, name: EL2_CHIP, multiplicity: 1 */
+                     1,
+  /* ID: 721, value: 0, name: EL1_ADDR, multiplicity: 1 */
+                     0,
+  /* ID: 722, value: 0, name: EL2_ADDR, multiplicity: 1 */
+                     0,
+  /* ID: 723, value: 0, name: ERR_LOG_ENB, multiplicity: 1 */
+                     0,
+  /* ID: 724, value: 0, name: isErrLogValid, multiplicity: 1 */
+                     0,
+  /* ID: 725, value: 0, name: nOfErrLogEntries, multiplicity: 1 */
+                     0,
+  /* ID: 727, value: 8, name: FBF_BLCK_WR_DUR, multiplicity: 1 */
+                     8,
+  /* ID: 728, value: 8, name: FBF_BLCK_RD_DUR, multiplicity: 1 */
+                     8,
+  /* ID: 729, value: 0, name: isFbfOpen, multiplicity: 250 */
+                     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+  /* ID: 730, value: 1, name: isFbfValid, multiplicity: 250 */
+                     {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
+  /* ID: 731, value: 0, name: FBF_ENB, multiplicity: 250 */
+                     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+  /* ID: 732, value: CHIP2, name: FBF_CHIP, multiplicity: 250 */
+                     {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
+  /* ID: 733, value: Auto, name: FBF_ADDR, multiplicity: 250 */
+		     {0x00400000,0x00800000,0x00c00000,0x01000000,0x01400000,0x01800000,0x01c00000,0x02400000,0x02800000,0x02c00000,0x03000000,0x03700000,0x03b00000,0x04500000,0x04900000,0x04d00000,0x05100000,0x05500000,0x05900000,0x05f00000,0x06300000,0x06700000,0x06b00000,0x06f00000,0x07300000,0x07700000,0x07d00000,0x08100000,0x08500000,0x08d00000,0x09100000,0x09500000,0x09c00000,0x0a000000,0x0a400000,0x0a800000,0x0ac00000,0x0b000000,0x0b400000,0x0ba00000,0x0be00000,0x0c200000,0x0c600000,0x0ca00000,0x0ce00000,0x0d200000,0x0d600000,0x0da00000,0x0e000000,0x0e400000,0x0e800000,0x0ee00000,0x0f400000,0x0f800000,0x0fd00000,0x10500000,0x10a00000,0x10e00000,0x11300000,0x11b00000,0x11f00000,0x12300000,0x12700000,0x12b00000,0x12f00000,0x13300000,0x13700000,0x14200000,0x14a00000,0x14e00000,0x15200000,0x15600000,0x15a00000,0x15e00000,0x16200000,0x16a00000,0x16e00000,0x17200000,0x17600000,0x17a00000,0x17e00000,0x18200000,0x18600000,0x18a00000,0x18e00000,0x19200000,0x19600000,0x19a00000,0x19f00000,0x1a300000,0x1a700000,0x1ac00000,0x1b400000,0x1b800000,0x1bf00000,0x1c300000,0x1c700000,0x1cb00000,0x1d700000,0x1db00000,0x1df00000,0x1e300000,0x1e700000,0x1eb00000,0x1ef00000,0x1f300000,0x1f700000,0x1fb00000,0x1ff00000,0x20300000,0x20700000,0x20b00000,0x20f00000,0x21300000,0x21700000,0x21b00000,0x22000000,0x22800000,0x22c00000,0x23000000,0x23400000,0x23800000,0x23e00000,0x24300000,0x24700000,0x24b00000,0x24f00000,0x25300000,0x25700000,0x25b00000,0x25f00000,0x26300000,0x26700000,0x26e00000,0x27200000,0x27600000,0x27a00000,0x27e00000,0x28200000,0x28600000,0x28a00000,0x28e00000,0x29200000,0x29b00000,0x29f00000,0x2a300000,0x2a700000,0x2ab00000,0x2af00000,0x2b500000,0x2b900000,0x2bd00000,0x2c100000,0x2c500000,0x2c900000,0x2cd00000,0x2d300000,0x2d700000,0x2df00000,0x2e300000,0x2e700000,0x2eb00000,0x2ef00000,0x2f500000,0x2f900000,0x2fd00000,0x30100000,0x30a00000,0x30e00000,0x31200000,0x31600000,0x31a00000,0x31e00000,0x32200000,0x32a00000,0x33200000,0x33600000,0x33a00000,0x33e00000,0x34200000,0x34600000,0x34a00000,0x34e00000,0x35200000,0x35600000,0x35a00000,0x35e00000,0x36200000,0x36800000,0x36c00000,0x37000000,0x37400000,0x37a00000,0x38100000,0x38500000,0x38a00000,0x39000000,0x39400000,0x39800000,0x39c00000,0x3a000000,0x3a400000,0x3a800000,0x3af00000,0x3b400000,0x3b800000,0x3bc00000,0x3c000000,0x3c400000,0x3c800000,0x3cc00000,0x3d000000,0x3d400000,0x3d800000,0x3dc00000,0x3e000000,0x3e400000,0x3e800000,0x3ec00000,0x3f000000,0x3f400000,0x3fa00000,0x3fe00000,0x40200000,0x40600000,0x40a00000,0x40e00000,0x41200000,0x41600000,0x41a00000,0x42100000,0x42500000,0x42900000,0x42d00000,0x43100000,0x43500000,0x43900000,0x43d00000,0x44100000,0x44500000,0x44a00000,0x45100000,0x45500000,0x45900000,0x45d00000,0x46400000,0x46800000,0x46c00000,0x47000000,0x47400000},
+  /* ID: 734, value: 0, name: fbfNBlocks, multiplicity: 250 */
+                     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+  /* ID: 735, value: 0.97, name: THR_MA_A_1, multiplicity: 1 */
+                     0.97,
+  /* ID: 736, value: 0.97, name: THR_MA_A_2, multiplicity: 1 */
+                     0.97,
+  /* ID: 737, value: 0.97, name: THR_MA_A_3, multiplicity: 1 */
+                     0.97,
+  /* ID: 738, value: 0.97, name: THR_MA_A_4, multiplicity: 1 */
+                     0.97,
+  /* ID: 739, value: 0.97, name: THR_MA_A_5, multiplicity: 1 */
+                     0.97,
+  /* ID: 740, value: 0, name: wcet_1, multiplicity: 1 */
+                     0,
+  /* ID: 741, value: 0, name: wcet_2, multiplicity: 1 */
+                     0,
+  /* ID: 742, value: 0, name: wcet_3, multiplicity: 1 */
+                     0,
+  /* ID: 743, value: 0, name: wcet_4, multiplicity: 1 */
+                     0,
+  /* ID: 744, value: 0, name: wcet_5, multiplicity: 1 */
+                     0,
+  /* ID: 745, value: 0, name: wcetAver_1, multiplicity: 1 */
+                     0,
+  /* ID: 746, value: 0, name: wcetAver_2, multiplicity: 1 */
+                     0,
+  /* ID: 747, value: 0, name: wcetAver_3, multiplicity: 1 */
+                     0,
+  /* ID: 748, value: 0, name: wcetAver_4, multiplicity: 1 */
+                     0,
+  /* ID: 749, value: 0, name: wcetAver_5, multiplicity: 1 */
+                     0,
+  /* ID: 750, value: 0, name: wcetMax_1, multiplicity: 1 */
+                     0,
+  /* ID: 751, value: 0, name: wcetMax_2, multiplicity: 1 */
+                     0,
+  /* ID: 752, value: 0, name: wcetMax_3, multiplicity: 1 */
+                     0,
+  /* ID: 753, value: 0, name: wcetMax_4, multiplicity: 1 */
+                     0,
+  /* ID: 754, value: 0, name: wcetMax_5, multiplicity: 1 */
+                     0,
+  /* ID: 755, value: 0, name: nOfNotif_1, multiplicity: 1 */
+                     0,
+  /* ID: 756, value: 0, name: nOfNotif_2, multiplicity: 1 */
+                     0,
+  /* ID: 757, value: 0, name: nOfNotif_3, multiplicity: 1 */
+                     0,
+  /* ID: 758, value: 0, name: nOfNotif_4, multiplicity: 1 */
+                     0,
+  /* ID: 759, value: 0, name: nOfNotif_5, multiplicity: 1 */
+                     0,
+  /* ID: 760, value: 0, name: nofFuncExec_1, multiplicity: 1 */
+                     0,
+  /* ID: 761, value: 0, name: nofFuncExec_2, multiplicity: 1 */
+                     0,
+  /* ID: 762, value: 0, name: nofFuncExec_3, multiplicity: 1 */
+                     0,
+  /* ID: 763, value: 0, name: nofFuncExec_4, multiplicity: 1 */
+                     0,
+  /* ID: 764, value: 0, name: nofFuncExec_5, multiplicity: 1 */
+                     0,
+  /* ID: 765, value: 0, name: wcetTimeStampFine_1, multiplicity: 1 */
+                     0,
+  /* ID: 766, value: 0, name: wcetTimeStampFine_2, multiplicity: 1 */
+                     0,
+  /* ID: 767, value: 0, name: wcetTimeStampFine_3, multiplicity: 1 */
+                     0,
+  /* ID: 768, value: 0, name: wcetTimeStampFine_4, multiplicity: 1 */
+                     0,
+  /* ID: 769, value: 0, name: wcetTimeStampFine_5, multiplicity: 1 */
+                     0,
+  /* ID: 770, value: 0, name: wcetTimeStampCoarse_1, multiplicity: 1 */
+                     0,
+  /* ID: 771, value: 0, name: wcetTimeStampCoarse_2, multiplicity: 1 */
+                     0,
+  /* ID: 772, value: 0, name: wcetTimeStampCoarse_3, multiplicity: 1 */
+                     0,
+  /* ID: 773, value: 0, name: wcetTimeStampCoarse_4, multiplicity: 1 */
+                     0,
+  /* ID: 774, value: 0, name: wcetTimeStampCoarse_5, multiplicity: 1 */
+                     0,
+  /* ID: 775, value: 0, name: flashContStepCnt, multiplicity: 1 */
+                     0,
+  /* ID: 776, value: 99.43, name: OTA_TM1A_NOM, multiplicity: 1 */
+                     99.43,
+  /* ID: 777, value: 98.94, name: OTA_TM1A_RED, multiplicity: 1 */
+                     98.94,
+  /* ID: 778, value: 99.11, name: OTA_TM1B_NOM, multiplicity: 1 */
+                     99.11,
+  /* ID: 779, value: 99.06, name: OTA_TM1B_RED, multiplicity: 1 */
+                     99.06,
+  /* ID: 780, value: 99.02, name: OTA_TM2A_NOM, multiplicity: 1 */
+                     99.02,
+  /* ID: 781, value: 98.93, name: OTA_TM2A_RED, multiplicity: 1 */
+                     98.93,
+  /* ID: 782, value: 99.07, name: OTA_TM2B_NOM, multiplicity: 1 */
+                     99.07,
+  /* ID: 783, value: 98.91, name: OTA_TM2B_RED, multiplicity: 1 */
+                     98.91,
+  /* ID: 784, value: 98.74, name: OTA_TM3A_NOM, multiplicity: 1 */
+                     98.74,
+  /* ID: 785, value: 98.61, name: OTA_TM3A_RED, multiplicity: 1 */
+                     98.61,
+  /* ID: 786, value: 98.63, name: OTA_TM3B_NOM, multiplicity: 1 */
+                     98.63,
+  /* ID: 787, value: 98.58, name: OTA_TM3B_RED, multiplicity: 1 */
+                     98.58,
+  /* ID: 788, value: 98.35, name: OTA_TM4A_NOM, multiplicity: 1 */
+                     98.35,
+  /* ID: 789, value: 98.5, name: OTA_TM4A_RED, multiplicity: 1 */
+                     98.5,
+  /* ID: 790, value: 98.89, name: OTA_TM4B_NOM, multiplicity: 1 */
+                     98.89,
+  /* ID: 791, value: 98.56, name: OTA_TM4B_RED, multiplicity: 1 */
+                     98.56,
+  /* ID: 792, value: 0, name: Core0Load, multiplicity: 1 */
+                     0,
+  /* ID: 793, value: 0, name: Core1Load, multiplicity: 1 */
+                     0,
+  /* ID: 794, value: 0, name: InterruptRate, multiplicity: 1 */
+                     0,
+  /* ID: 795, value: 0, name: CyclicalActivitiesCtr, multiplicity: 1 */
+                     0,
+  /* ID: 796, value: 0, name: Uptime, multiplicity: 1 */
+                     0,
+  /* ID: 797, value: 0, name: SemTick, multiplicity: 1 */
+                     0,
+  /* ID: 801, value: 0, name: BAD_COPY_ID, multiplicity: 1 */
+                     0,
+  /* ID: 802, value: 0, name: BAD_PASTE_ID, multiplicity: 1 */
+                     0,
+  /* ID: 803, value: 0, name: ObcInputBufferPackets, multiplicity: 1 */
+                     0,
+  /* ID: 804, value: 0, name: GrndInputBufferPackets, multiplicity: 1 */
+                     0,
+  /* ID: 805, value: 0, name: MilBusBytesIn, multiplicity: 1 */
+                     0,
+  /* ID: 806, value: 0, name: MilBusBytesOut, multiplicity: 1 */
+                     0,
+  /* ID: 807, value: 0, name: MilBusDroppedBytes, multiplicity: 1 */
+                     0,
+  /* ID: 808, value: 0, name: IRL1, multiplicity: 1 */
+                     0,
+  /* ID: 809, value: 0, name: IRL1_AHBSTAT, multiplicity: 1 */
+                     0,
+  /* ID: 810, value: 0, name: IRL1_GRGPIO_6, multiplicity: 1 */
+                     0,
+  /* ID: 811, value: 0, name: IRL1_GRTIMER, multiplicity: 1 */
+                     0,
+  /* ID: 812, value: 0, name: IRL1_GPTIMER_0, multiplicity: 1 */
+                     0,
+  /* ID: 813, value: 0, name: IRL1_GPTIMER_1, multiplicity: 1 */
+                     0,
+  /* ID: 814, value: 0, name: IRL1_GPTIMER_2, multiplicity: 1 */
+                     0,
+  /* ID: 815, value: 0, name: IRL1_GPTIMER_3, multiplicity: 1 */
+                     0,
+  /* ID: 816, value: 0, name: IRL1_IRQMP, multiplicity: 1 */
+                     0,
+  /* ID: 817, value: 0, name: IRL1_B1553BRM, multiplicity: 1 */
+                     0,
+  /* ID: 818, value: 0, name: IRL2, multiplicity: 1 */
+                     0,
+  /* ID: 819, value: 0, name: IRL2_GRSPW2_0, multiplicity: 1 */
+                     0,
+  /* ID: 820, value: 0, name: IRL2_GRSPW2_1, multiplicity: 1 */
+                     0,
+  /* ID: 821, value: INACTIVE, name: SemRoute, multiplicity: 1 */
+                     0,
+  /* ID: 822, value: 0, name: SpW0BytesIn, multiplicity: 1 */
+                     0,
+  /* ID: 823, value: 0, name: SpW0BytesOut, multiplicity: 1 */
+                     0,
+  /* ID: 824, value: 0, name: SpW1BytesIn, multiplicity: 1 */
+                     0,
+  /* ID: 825, value: 0, name: SpW1BytesOut, multiplicity: 1 */
+                     0,
+  /* ID: 826, value: 0, name: Spw0TxDescAvail, multiplicity: 1 */
+                     0,
+  /* ID: 827, value: 0, name: Spw0RxPcktAvail, multiplicity: 1 */
+                     0,
+  /* ID: 828, value: 0, name: Spw1TxDescAvail, multiplicity: 1 */
+                     0,
+  /* ID: 829, value: 0, name: Spw1RxPcktAvail, multiplicity: 1 */
+                     0,
+  /* ID: 830, value: 0, name: MilCucCoarseTime, multiplicity: 1 */
+                     0,
+  /* ID: 831, value: 0, name: MilCucFineTime, multiplicity: 1 */
+                     0,
+  /* ID: 832, value: 0, name: CucCoarseTime, multiplicity: 1 */
+                     0,
+  /* ID: 833, value: 0, name: CucFineTime, multiplicity: 1 */
+                     0,
+  /* ID: 841, value: 0, name: EdacDoubleFaults, multiplicity: 1 */
+                     0,
+  /* ID: 842, value: 0, name: EdacDoubleFAddr, multiplicity: 1 */
+                     0,
+  /* ID: 844, value: 1, name: HEARTBEAT_ENABLED, multiplicity: 1 */
+                     1,
+  /* ID: 845, value: 0, name: S1AllocDbs, multiplicity: 1 */
+                     0,
+  /* ID: 846, value: 0, name: S1AllocSw, multiplicity: 1 */
+                     0,
+  /* ID: 847, value: 0, name: S1AllocHeap, multiplicity: 1 */
+                     0,
+  /* ID: 848, value: 0, name: S1AllocFlash, multiplicity: 1 */
+                     0,
+  /* ID: 849, value: 0, name: S1AllocAux, multiplicity: 1 */
+                     0,
+  /* ID: 850, value: 0, name: S1AllocRes, multiplicity: 1 */
+                     0,
+  /* ID: 851, value: 0, name: S1AllocSwap, multiplicity: 1 */
+                     0,
+  /* ID: 852, value: 0, name: S2AllocSciHeap, multiplicity: 1 */
+                     0,
+  /* ID: 954, value: 0, name: FPGA_Version, multiplicity: 1 */
+                     0,
+  /* ID: 955, value: 0, name: FPGA_DPU_Status, multiplicity: 1 */
+                     0,
+  /* ID: 956, value: 0, name: FPGA_DPU_Address, multiplicity: 1 */
+                     0,
+  /* ID: 957, value: 0, name: FPGA_RESET_Status, multiplicity: 1 */
+                     0,
+  /* ID: 958, value: 0, name: FPGA_SEM_Status, multiplicity: 1 */
+                     0,
+  /* ID: 959, value: 0, name: FPGA_Oper_Heater_Status, multiplicity: 1 */
+                     0
+};
+
+/**
+ * Initialization of the array holding the size of data pool items.
+ * Mapping rules of type to size:
+ * bool, char, uchar - 1 byte
+ * short, ushort, enum - 2 bytes
+ * int, uint, float - 4 bytes
+ * double - 8 bytes
+ * CUC - 6 bytes
+ */
+static unsigned int dataPoolSize[1006] = { 
+  0,  /* ID: 0, unused */
+  4,  /* ID: 1, type: uint, name: buildNumber */
+  1,  /* ID: 2, type: uchar, name: AppErrCode */
+  1,  /* ID: 3, type: uchar, name: NofAllocatedInRep */
+  1,  /* ID: 4, type: uchar, name: MaxNOfInRep */
+  1,  /* ID: 5, type: uchar, name: NofAllocatedInCmd */
+  1,  /* ID: 6, type: uchar, name: MaxNOfInCmd */
+  1,  /* ID: 7, type: uchar, name: Sem_NOfPendingInCmp */
+  1,  /* ID: 8, type: uchar, name: Sem_PCRLSize */
+  1,  /* ID: 9, type: uchar, name: Sem_NOfLoadedInCmp */
+  1,  /* ID: 10, type: uchar, name: GrdObc_NOfPendingInCmp */
+  1,  /* ID: 11, type: uchar, name: GrdObc_PCRLSize */
+  1,  /* ID: 12, type: uchar, name: NOfAllocatedOutCmp */
+  1,  /* ID: 13, type: uchar, name: MaxNOfOutCmp */
+  2,  /* ID: 14, type: ushort, name: NOfInstanceId */
+  1,  /* ID: 15, type: uchar, name: OutMg1_NOfPendingOutCmp */
+  1,  /* ID: 16, type: uchar, name: OutMg1_POCLSize */
+  2,  /* ID: 17, type: ushort, name: OutMg1_NOfLoadedOutCmp */
+  1,  /* ID: 18, type: uchar, name: OutMg2_NOfPendingOutCmp */
+  1,  /* ID: 19, type: uchar, name: OutMg2_POCLSize */
+  2,  /* ID: 20, type: ushort, name: OutMg2_NOfLoadedOutCmp */
+  1,  /* ID: 21, type: uchar, name: OutMg3_NOfPendingOutCmp */
+  1,  /* ID: 22, type: uchar, name: OutMg3_POCLSize */
+  2,  /* ID: 23, type: ushort, name: OutMg3_NOfLoadedOutCmp */
+  4,  /* ID: 24, type: uint, name: InSem_SeqCnt */
+  2,  /* ID: 25, type: ushort, name: InSem_NOfPendingPckts */
+  1,  /* ID: 26, type: uchar, name: InSem_NOfGroups */
+  1,  /* ID: 27, type: uchar, name: InSem_PcktQueueSize */
+  1,  /* ID: 28, type: uchar, name: InSem_Src */
+  1,  /* ID: 29, type: uchar, name: InObc_NOfPendingPckts */
+  1,  /* ID: 30, type: uchar, name: InObc_NOfGroups */
+  1,  /* ID: 31, type: uchar, name: InObc_PcktQueueSize */
+  1,  /* ID: 32, type: uchar, name: InObc_Src */
+  1,  /* ID: 33, type: uchar, name: InGrd_NOfPendingPckts */
+  1,  /* ID: 34, type: uchar, name: InGrd_NOfGroups */
+  1,  /* ID: 35, type: uchar, name: InGrd_PcktQueueSize */
+  1,  /* ID: 36, type: uchar, name: InGrd_Src */
+  1,  /* ID: 37, type: uchar, name: OutSem_Dest */
+  4,  /* ID: 38, type: uint, name: OutSem_SeqCnt */
+  1,  /* ID: 39, type: uchar, name: OutSem_NOfPendingPckts */
+  1,  /* ID: 40, type: uchar, name: OutSem_NOfGroups */
+  1,  /* ID: 41, type: uchar, name: OutSem_PcktQueueSize */
+  1,  /* ID: 42, type: uchar, name: OutObc_Dest */
+  4,  /* ID: 43, type: uint, name: OutObc_SeqCnt_Group0 */
+  4,  /* ID: 44, type: uint, name: OutObc_SeqCnt_Group1 */
+  1,  /* ID: 45, type: uchar, name: OutObc_NOfPendingPckts */
+  1,  /* ID: 46, type: uchar, name: OutObc_NOfGroups */
+  1,  /* ID: 47, type: uchar, name: OutObc_PcktQueueSize */
+  1,  /* ID: 48, type: uchar, name: OutGrd_Dest */
+  4,  /* ID: 49, type: uint, name: OutGrd_SeqCnt_Group0 */
+  4,  /* ID: 50, type: uint, name: OutGrd_SeqCnt_Group1 */
+  4,  /* ID: 51, type: uint, name: OutGrd_SeqCnt_Group2 */
+  1,  /* ID: 52, type: uchar, name: OutGrd_NOfPendingPckts */
+  1,  /* ID: 53, type: uchar, name: OutGrd_NOfGroups */
+  1,  /* ID: 54, type: uchar, name: OutGrd_PcktQueueSize */
+  2,  /* ID: 55, type: ushort, name: sibNFull */
+  2,  /* ID: 56, type: ushort, name: cibNFull */
+  2,  /* ID: 57, type: ushort, name: gibNFull */
+  2,  /* ID: 58, type: ushort, name: sibNWin */
+  2,  /* ID: 59, type: ushort, name: cibNWin */
+  2,  /* ID: 60, type: ushort, name: gibNWin */
+  2,  /* ID: 61, type: ushort, name: sibSizeFull */
+  2,  /* ID: 62, type: ushort, name: cibSizeFull */
+  2,  /* ID: 63, type: ushort, name: gibSizeFull */
+  2,  /* ID: 64, type: ushort, name: sibSizeWin */
+  2,  /* ID: 65, type: ushort, name: cibSizeWin */
+  2,  /* ID: 66, type: ushort, name: gibSizeWin */
+  2,  /* ID: 67, type: ushort, name: sibIn */
+  2,  /* ID: 68, type: ushort, name: sibOut */
+  2,  /* ID: 69, type: ushort, name: cibIn */
+  2,  /* ID: 70, type: ushort, name: gibIn */
+  2,  /* ID: 71, type: ushort, name: gibOut */
+  2,  /* ID: 72, type: enum, name: sdbState */
+  4,  /* ID: 73, type: uint, name: sdbStateCnt */
+  4,  /* ID: 74, type: int, name: OffsetX */
+  4,  /* ID: 75, type: int, name: OffsetY */
+  4,  /* ID: 76, type: int, name: TargetLocationX */
+  4,  /* ID: 77, type: int, name: TargetLocationY */
+  4,  /* ID: 78, type: uint, name: IntegStartTimeCrs */
+  2,  /* ID: 79, type: ushort, name: IntegStartTimeFine */
+  4,  /* ID: 80, type: uint, name: IntegEndTimeCrs */
+  2,  /* ID: 81, type: ushort, name: IntegEndTimeFine */
+  2,  /* ID: 82, type: ushort, name: DataCadence */
+  1,  /* ID: 83, type: char, name: ValidityStatus */
+  2,  /* ID: 84, type: ushort, name: NOfTcAcc */
+  2,  /* ID: 85, type: ushort, name: NOfAccFailedTc */
+  2,  /* ID: 86, type: ushort, name: SeqCntLastAccTcFromObc */
+  2,  /* ID: 87, type: ushort, name: SeqCntLastAccTcFromGrd */
+  2,  /* ID: 88, type: ushort, name: SeqCntLastAccFailTc */
+  2,  /* ID: 89, type: ushort, name: NOfStartFailedTc */
+  2,  /* ID: 90, type: ushort, name: SeqCntLastStartFailTc */
+  2,  /* ID: 91, type: ushort, name: NOfTcTerm */
+  2,  /* ID: 92, type: ushort, name: NOfTermFailedTc */
+  2,  /* ID: 93, type: ushort, name: SeqCntLastTermFailTc */
+  1,  /* ID: 94, type: uchar, name: RdlSidList */
+  1,  /* ID: 95, type: bool, name: isRdlFree */
+  4,  /* ID: 96, type: uint, name: RdlCycCntList */
+  4,  /* ID: 97, type: uint, name: RdlPeriodList */
+  1,  /* ID: 98, type: bool, name: RdlEnabledList */
+  2,  /* ID: 99, type: ushort, name: RdlDestList */
+  2,  /* ID: 100, type: ushort, name: RdlDataItemList_0 */
+  2,  /* ID: 101, type: ushort, name: RdlDataItemList_1 */
+  2,  /* ID: 102, type: ushort, name: RdlDataItemList_2 */
+  2,  /* ID: 103, type: ushort, name: RdlDataItemList_3 */
+  2,  /* ID: 104, type: ushort, name: RdlDataItemList_4 */
+  2,  /* ID: 105, type: ushort, name: RdlDataItemList_5 */
+  2,  /* ID: 106, type: ushort, name: RdlDataItemList_6 */
+  2,  /* ID: 107, type: ushort, name: RdlDataItemList_7 */
+  2,  /* ID: 108, type: ushort, name: RdlDataItemList_8 */
+  2,  /* ID: 109, type: ushort, name: RdlDataItemList_9 */
+  4,  /* ID: 110, type: uint, name: DEBUG_VAR */
+  4,  /* ID: 111, type: uint, name: DEBUG_VAR_ADDR */
+  1,  /* ID: 112, type: uchar, name: EVTFILTERDEF */
+  1,  /* ID: 113, type: uchar, name: evtEnabledList */
+  4,  /* ID: 114, type: uint, name: lastPatchedAddr */
+  4,  /* ID: 115, type: uint, name: lastDumpAddr */
+  2,  /* ID: 116, type: enum, name: sdu2State */
+  2,  /* ID: 117, type: enum, name: sdu4State */
+  4,  /* ID: 118, type: uint, name: sdu2StateCnt */
+  4,  /* ID: 119, type: uint, name: sdu4StateCnt */
+  2,  /* ID: 120, type: ushort, name: sdu2BlockCnt */
+  2,  /* ID: 121, type: ushort, name: sdu4BlockCnt */
+  4,  /* ID: 122, type: uint, name: sdu2RemSize */
+  4,  /* ID: 123, type: uint, name: sdu4RemSize */
+  4,  /* ID: 124, type: uint, name: sdu2DownTransferSize */
+  4,  /* ID: 125, type: uint, name: sdu4DownTransferSize */
+  4,  /* ID: 126, type: uint, name: sdsCounter */
+  1,  /* ID: 127, type: bool, name: FdGlbEnable */
+  1,  /* ID: 128, type: bool, name: RpGlbEnable */
+  2,  /* ID: 129, type: enum, name: FdCheckTTMState */
+  1,  /* ID: 130, type: bool, name: FdCheckTTMIntEn */
+  1,  /* ID: 131, type: bool, name: FdCheckTTMExtEn */
+  1,  /* ID: 132, type: bool, name: RpTTMIntEn */
+  1,  /* ID: 133, type: bool, name: RpTTMExtEn */
+  2,  /* ID: 134, type: ushort, name: FdCheckTTMCnt */
+  2,  /* ID: 135, type: ushort, name: FdCheckTTMSpCnt */
+  2,  /* ID: 136, type: ushort, name: FdCheckTTMCntThr */
+  4,  /* ID: 137, type: float, name: TTC_LL */
+  4,  /* ID: 138, type: float, name: TTC_UL */
+  4,  /* ID: 139, type: float, name: TTM_LIM */
+  2,  /* ID: 140, type: enum, name: FdCheckSDSCState */
+  1,  /* ID: 141, type: bool, name: FdCheckSDSCIntEn */
+  1,  /* ID: 142, type: bool, name: FdCheckSDSCExtEn */
+  1,  /* ID: 143, type: bool, name: RpSDSCIntEn */
+  1,  /* ID: 144, type: bool, name: RpSDSCExtEn */
+  2,  /* ID: 145, type: ushort, name: FdCheckSDSCCnt */
+  2,  /* ID: 146, type: ushort, name: FdCheckSDSCSpCnt */
+  2,  /* ID: 147, type: ushort, name: FdCheckSDSCCntThr */
+  2,  /* ID: 148, type: enum, name: FdCheckComErrState */
+  1,  /* ID: 149, type: bool, name: FdCheckComErrIntEn */
+  1,  /* ID: 150, type: bool, name: FdCheckComErrExtEn */
+  1,  /* ID: 151, type: bool, name: RpComErrIntEn */
+  1,  /* ID: 152, type: bool, name: RpComErrExtEn */
+  2,  /* ID: 153, type: ushort, name: FdCheckComErrCnt */
+  2,  /* ID: 154, type: ushort, name: FdCheckComErrSpCnt */
+  2,  /* ID: 155, type: ushort, name: FdCheckComErrCntThr */
+  2,  /* ID: 156, type: enum, name: FdCheckTimeOutState */
+  1,  /* ID: 157, type: bool, name: FdCheckTimeOutIntEn */
+  1,  /* ID: 158, type: bool, name: FdCheckTimeOutExtEn */
+  1,  /* ID: 159, type: bool, name: RpTimeOutIntEn */
+  1,  /* ID: 160, type: bool, name: RpTimeOutExtEn */
+  2,  /* ID: 161, type: ushort, name: FdCheckTimeOutCnt */
+  2,  /* ID: 162, type: ushort, name: FdCheckTimeOutSpCnt */
+  2,  /* ID: 163, type: ushort, name: FdCheckTimeOutCntThr */
+  4,  /* ID: 164, type: uint, name: SEM_TO_POWERON */
+  4,  /* ID: 165, type: uint, name: SEM_TO_SAFE */
+  4,  /* ID: 166, type: uint, name: SEM_TO_STAB */
+  4,  /* ID: 167, type: uint, name: SEM_TO_TEMP */
+  4,  /* ID: 168, type: uint, name: SEM_TO_CCD */
+  4,  /* ID: 169, type: uint, name: SEM_TO_DIAG */
+  4,  /* ID: 170, type: uint, name: SEM_TO_STANDBY */
+  2,  /* ID: 171, type: enum, name: FdCheckSafeModeState */
+  1,  /* ID: 172, type: bool, name: FdCheckSafeModeIntEn */
+  1,  /* ID: 173, type: bool, name: FdCheckSafeModeExtEn */
+  1,  /* ID: 174, type: bool, name: RpSafeModeIntEn */
+  1,  /* ID: 175, type: bool, name: RpSafeModeExtEn */
+  2,  /* ID: 176, type: ushort, name: FdCheckSafeModeCnt */
+  2,  /* ID: 177, type: ushort, name: FdCheckSafeModeSpCnt */
+  2,  /* ID: 178, type: ushort, name: FdCheckSafeModeCntThr */
+  2,  /* ID: 179, type: enum, name: FdCheckAliveState */
+  1,  /* ID: 180, type: bool, name: FdCheckAliveIntEn */
+  1,  /* ID: 181, type: bool, name: FdCheckAliveExtEn */
+  1,  /* ID: 182, type: bool, name: RpAliveIntEn */
+  1,  /* ID: 183, type: bool, name: RpAliveExtEn */
+  2,  /* ID: 184, type: ushort, name: FdCheckAliveCnt */
+  2,  /* ID: 185, type: ushort, name: FdCheckAliveSpCnt */
+  2,  /* ID: 186, type: ushort, name: FdCheckAliveCntThr */
+  2,  /* ID: 187, type: ushort, name: SEM_HK_DEF_PER */
+  2,  /* ID: 188, type: ushort, name: SEMALIVE_DELAYEDSEMHK */
+  2,  /* ID: 189, type: enum, name: FdCheckSemAnoEvtState */
+  1,  /* ID: 190, type: bool, name: FdCheckSemAnoEvtIntEn */
+  1,  /* ID: 191, type: bool, name: FdCheckSemAnoEvtExtEn */
+  1,  /* ID: 192, type: bool, name: RpSemAnoEvtIntEn */
+  1,  /* ID: 193, type: bool, name: RpSemAnoEvtExtEn */
+  2,  /* ID: 194, type: ushort, name: FdCheckSemAnoEvtCnt */
+  2,  /* ID: 195, type: ushort, name: FdCheckSemAnoEvtSpCnt */
+  2,  /* ID: 196, type: ushort, name: FdCheckSemAnoEvtCntThr */
+  2,  /* ID: 197, type: enum, name: semAnoEvtResp_1 */
+  2,  /* ID: 198, type: enum, name: semAnoEvtResp_2 */
+  2,  /* ID: 199, type: enum, name: semAnoEvtResp_3 */
+  2,  /* ID: 200, type: enum, name: semAnoEvtResp_4 */
+  2,  /* ID: 201, type: enum, name: semAnoEvtResp_5 */
+  2,  /* ID: 202, type: enum, name: semAnoEvtResp_6 */
+  2,  /* ID: 203, type: enum, name: semAnoEvtResp_7 */
+  2,  /* ID: 204, type: enum, name: semAnoEvtResp_8 */
+  2,  /* ID: 205, type: enum, name: semAnoEvtResp_9 */
+  2,  /* ID: 206, type: enum, name: semAnoEvtResp_10 */
+  2,  /* ID: 207, type: enum, name: semAnoEvtResp_11 */
+  2,  /* ID: 208, type: enum, name: semAnoEvtResp_12 */
+  2,  /* ID: 209, type: enum, name: semAnoEvtResp_13 */
+  2,  /* ID: 210, type: enum, name: semAnoEvtResp_14 */
+  2,  /* ID: 211, type: enum, name: semAnoEvtResp_15 */
+  2,  /* ID: 212, type: enum, name: semAnoEvtResp_16 */
+  2,  /* ID: 213, type: enum, name: semAnoEvtResp_17 */
+  2,  /* ID: 214, type: enum, name: semAnoEvtResp_18 */
+  2,  /* ID: 215, type: enum, name: semAnoEvtResp_19 */
+  2,  /* ID: 216, type: enum, name: semAnoEvtResp_20 */
+  2,  /* ID: 217, type: enum, name: semAnoEvtResp_21 */
+  2,  /* ID: 218, type: enum, name: semAnoEvtResp_22 */
+  2,  /* ID: 219, type: enum, name: semAnoEvtResp_23 */
+  2,  /* ID: 220, type: enum, name: semAnoEvtResp_24 */
+  2,  /* ID: 221, type: enum, name: semAnoEvtResp_25 */
+  2,  /* ID: 222, type: enum, name: semAnoEvtResp_26 */
+  2,  /* ID: 223, type: enum, name: semAnoEvtResp_27 */
+  2,  /* ID: 224, type: enum, name: semAnoEvtResp_28 */
+  2,  /* ID: 225, type: enum, name: semAnoEvtResp_29 */
+  2,  /* ID: 226, type: enum, name: FdCheckSemLimitState */
+  1,  /* ID: 227, type: bool, name: FdCheckSemLimitIntEn */
+  1,  /* ID: 228, type: bool, name: FdCheckSemLimitExtEn */
+  1,  /* ID: 229, type: bool, name: RpSemLimitIntEn */
+  1,  /* ID: 230, type: bool, name: RpSemLimitExtEn */
+  2,  /* ID: 231, type: ushort, name: FdCheckSemLimitCnt */
+  2,  /* ID: 232, type: ushort, name: FdCheckSemLimitSpCnt */
+  2,  /* ID: 233, type: ushort, name: FdCheckSemLimitCntThr */
+  2,  /* ID: 234, type: ushort, name: SEM_LIM_DEL_T */
+  2,  /* ID: 235, type: enum, name: FdCheckDpuHkState */
+  1,  /* ID: 236, type: bool, name: FdCheckDpuHkIntEn */
+  1,  /* ID: 237, type: bool, name: FdCheckDpuHkExtEn */
+  1,  /* ID: 238, type: bool, name: RpDpuHkIntEn */
+  1,  /* ID: 239, type: bool, name: RpDpuHkExtEn */
+  2,  /* ID: 240, type: ushort, name: FdCheckDpuHkCnt */
+  2,  /* ID: 241, type: ushort, name: FdCheckDpuHkSpCnt */
+  2,  /* ID: 242, type: ushort, name: FdCheckDpuHkCntThr */
+  2,  /* ID: 243, type: enum, name: FdCheckCentConsState */
+  1,  /* ID: 244, type: bool, name: FdCheckCentConsIntEn */
+  1,  /* ID: 245, type: bool, name: FdCheckCentConsExtEn */
+  1,  /* ID: 246, type: bool, name: RpCentConsIntEn */
+  1,  /* ID: 247, type: bool, name: RpCentConsExtEn */
+  2,  /* ID: 248, type: ushort, name: FdCheckCentConsCnt */
+  2,  /* ID: 249, type: ushort, name: FdCheckCentConsSpCnt */
+  2,  /* ID: 250, type: ushort, name: FdCheckCentConsCntThr */
+  2,  /* ID: 251, type: enum, name: FdCheckResState */
+  1,  /* ID: 252, type: bool, name: FdCheckResIntEn */
+  1,  /* ID: 253, type: bool, name: FdCheckResExtEn */
+  1,  /* ID: 254, type: bool, name: RpResIntEn */
+  1,  /* ID: 255, type: bool, name: RpResExtEn */
+  2,  /* ID: 256, type: ushort, name: FdCheckResCnt */
+  2,  /* ID: 257, type: ushort, name: FdCheckResSpCnt */
+  2,  /* ID: 258, type: ushort, name: FdCheckResCntThr */
+  4,  /* ID: 259, type: float, name: CPU1_USAGE_MAX */
+  4,  /* ID: 260, type: float, name: MEM_USAGE_MAX */
+  2,  /* ID: 261, type: enum, name: FdCheckSemCons */
+  1,  /* ID: 262, type: bool, name: FdCheckSemConsIntEn */
+  1,  /* ID: 263, type: bool, name: FdCheckSemConsExtEn */
+  1,  /* ID: 264, type: bool, name: RpSemConsIntEn */
+  1,  /* ID: 265, type: bool, name: RpSemConsExtEn */
+  2,  /* ID: 266, type: ushort, name: FdCheckSemConsCnt */
+  2,  /* ID: 267, type: ushort, name: FdCheckSemConsSpCnt */
+  2,  /* ID: 268, type: ushort, name: FdCheckSemConsCntThr */
+  2,  /* ID: 269, type: enum, name: semState */
+  2,  /* ID: 270, type: enum, name: semOperState */
+  4,  /* ID: 271, type: uint, name: semStateCnt */
+  4,  /* ID: 272, type: uint, name: semOperStateCnt */
+  4,  /* ID: 273, type: uint, name: imageCycleCnt */
+  4,  /* ID: 274, type: uint, name: acqImageCnt */
+  2,  /* ID: 275, type: enum, name: sciSubMode */
+  1,  /* ID: 276, type: bool, name: LastSemPckt */
+  1,  /* ID: 277, type: uchar, name: SEM_ON_CODE */
+  1,  /* ID: 278, type: uchar, name: SEM_OFF_CODE */
+  2,  /* ID: 279, type: ushort, name: SEM_INIT_T1 */
+  2,  /* ID: 280, type: ushort, name: SEM_INIT_T2 */
+  2,  /* ID: 281, type: ushort, name: SEM_OPER_T1 */
+  2,  /* ID: 282, type: ushort, name: SEM_SHUTDOWN_T1 */
+  2,  /* ID: 283, type: ushort, name: SEM_SHUTDOWN_T11 */
+  2,  /* ID: 284, type: ushort, name: SEM_SHUTDOWN_T12 */
+  2,  /* ID: 285, type: ushort, name: SEM_SHUTDOWN_T2 */
+  2,  /* ID: 286, type: enum, name: iaswState */
+  4,  /* ID: 287, type: uint, name: iaswStateCnt */
+  4,  /* ID: 288, type: uint, name: iaswCycleCnt */
+  2,  /* ID: 289, type: enum, name: prepScienceNode */
+  4,  /* ID: 290, type: uint, name: prepScienceCnt */
+  2,  /* ID: 291, type: enum, name: controlledSwitchOffNode */
+  4,  /* ID: 292, type: uint, name: controlledSwitchOffCnt */
+  2,  /* ID: 293, type: ushort, name: CTRLD_SWITCH_OFF_T1 */
+  2,  /* ID: 294, type: enum, name: algoCent0State */
+  4,  /* ID: 295, type: uint, name: algoCent0Cnt */
+  1,  /* ID: 296, type: bool, name: algoCent0Enabled */
+  2,  /* ID: 297, type: enum, name: algoCent1State */
+  4,  /* ID: 298, type: uint, name: algoCent1Cnt */
+  1,  /* ID: 299, type: bool, name: algoCent1Enabled */
+  4,  /* ID: 300, type: uint, name: CENT_EXEC_PHASE */
+  2,  /* ID: 301, type: enum, name: algoAcq1State */
+  4,  /* ID: 302, type: uint, name: algoAcq1Cnt */
+  1,  /* ID: 303, type: bool, name: algoAcq1Enabled */
+  2,  /* ID: 304, type: ushort, name: ACQ_PH */
+  2,  /* ID: 305, type: enum, name: algoCcState */
+  4,  /* ID: 306, type: uint, name: algoCcCnt */
+  1,  /* ID: 307, type: bool, name: algoCcEnabled */
+  2,  /* ID: 308, type: ushort, name: STCK_ORDER */
+  2,  /* ID: 309, type: enum, name: algoTTC1State */
+  4,  /* ID: 310, type: uint, name: algoTTC1Cnt */
+  1,  /* ID: 311, type: bool, name: algoTTC1Enabled */
+  4,  /* ID: 312, type: uint, name: TTC1_EXEC_PHASE */
+  4,  /* ID: 313, type: int, name: TTC1_EXEC_PER */
+  4,  /* ID: 314, type: float, name: TTC1_LL_FRT */
+  4,  /* ID: 315, type: float, name: TTC1_LL_AFT */
+  4,  /* ID: 316, type: float, name: TTC1_UL_FRT */
+  4,  /* ID: 317, type: float, name: TTC1_UL_AFT */
+  4,  /* ID: 318, type: float, name: ttc1AvTempAft */
+  4,  /* ID: 319, type: float, name: ttc1AvTempFrt */
+  2,  /* ID: 320, type: enum, name: algoTTC2State */
+  4,  /* ID: 321, type: uint, name: algoTTC2Cnt */
+  1,  /* ID: 322, type: bool, name: algoTTC2Enabled */
+  4,  /* ID: 323, type: int, name: TTC2_EXEC_PER */
+  4,  /* ID: 324, type: float, name: TTC2_REF_TEMP */
+  4,  /* ID: 325, type: float, name: TTC2_OFFSETA */
+  4,  /* ID: 326, type: float, name: TTC2_OFFSETF */
+  4,  /* ID: 327, type: float, name: intTimeAft */
+  4,  /* ID: 328, type: float, name: onTimeAft */
+  4,  /* ID: 329, type: float, name: intTimeFront */
+  4,  /* ID: 330, type: float, name: onTimeFront */
+  4,  /* ID: 331, type: float, name: TTC2_PA */
+  4,  /* ID: 332, type: float, name: TTC2_DA */
+  4,  /* ID: 333, type: float, name: TTC2_IA */
+  4,  /* ID: 334, type: float, name: TTC2_PF */
+  4,  /* ID: 335, type: float, name: TTC2_DF */
+  4,  /* ID: 336, type: float, name: TTC2_IF */
+  2,  /* ID: 337, type: enum, name: algoSaaEvalState */
+  4,  /* ID: 338, type: uint, name: algoSaaEvalCnt */
+  1,  /* ID: 339, type: bool, name: algoSaaEvalEnabled */
+  4,  /* ID: 340, type: uint, name: SAA_EXEC_PHASE */
+  4,  /* ID: 341, type: int, name: SAA_EXEC_PER */
+  1,  /* ID: 342, type: bool, name: isSaaActive */
+  4,  /* ID: 343, type: uint, name: saaCounter */
+  4,  /* ID: 344, type: uint, name: pInitSaaCounter */
+  2,  /* ID: 345, type: enum, name: algoSdsEvalState */
+  4,  /* ID: 346, type: uint, name: algoSdsEvalCnt */
+  1,  /* ID: 347, type: bool, name: algoSdsEvalEnabled */
+  4,  /* ID: 348, type: uint, name: SDS_EXEC_PHASE */
+  4,  /* ID: 349, type: int, name: SDS_EXEC_PER */
+  1,  /* ID: 350, type: bool, name: isSdsActive */
+  1,  /* ID: 351, type: bool, name: SDS_FORCED */
+  1,  /* ID: 352, type: bool, name: SDS_INHIBITED */
+  1,  /* ID: 353, type: bool, name: EARTH_OCCULT_ACTIVE */
+  2,  /* ID: 354, type: ushort, name: HEARTBEAT_D1 */
+  2,  /* ID: 355, type: ushort, name: HEARTBEAT_D2 */
+  1,  /* ID: 356, type: bool, name: HbSem */
+  1,  /* ID: 357, type: uchar, name: starMap */
+  4,  /* ID: 358, type: uint, name: observationId */
+  1,  /* ID: 359, type: char, name: centValProcOutput */
+  4,  /* ID: 360, type: float, name: CENT_OFFSET_LIM */
+  4,  /* ID: 361, type: float, name: CENT_FROZEN_LIM */
+  1,  /* ID: 362, type: bool, name: SEM_SERV1_1_FORWARD */
+  1,  /* ID: 363, type: bool, name: SEM_SERV1_2_FORWARD */
+  1,  /* ID: 364, type: bool, name: SEM_SERV1_7_FORWARD */
+  1,  /* ID: 365, type: bool, name: SEM_SERV1_8_FORWARD */
+  1,  /* ID: 366, type: bool, name: SEM_SERV3_1_FORWARD */
+  1,  /* ID: 367, type: bool, name: SEM_SERV3_2_FORWARD */
+  4,  /* ID: 368, type: uint, name: SEM_HK_TS_DEF_CRS */
+  2,  /* ID: 369, type: ushort, name: SEM_HK_TS_DEF_FINE */
+  4,  /* ID: 370, type: uint, name: SEM_HK_TS_EXT_CRS */
+  2,  /* ID: 371, type: ushort, name: SEM_HK_TS_EXT_FINE */
+  2,  /* ID: 372, type: enum, name: STAT_MODE */
+  2,  /* ID: 373, type: ushort, name: STAT_FLAGS */
+  2,  /* ID: 374, type: enum, name: STAT_LAST_SPW_ERR */
+  2,  /* ID: 375, type: ushort, name: STAT_LAST_ERR_ID */
+  2,  /* ID: 376, type: ushort, name: STAT_LAST_ERR_FREQ */
+  2,  /* ID: 377, type: ushort, name: STAT_NUM_CMD_RECEIVED */
+  2,  /* ID: 378, type: ushort, name: STAT_NUM_CMD_EXECUTED */
+  2,  /* ID: 379, type: ushort, name: STAT_NUM_DATA_SENT */
+  2,  /* ID: 380, type: ushort, name: STAT_SCU_PROC_DUTY_CL */
+  2,  /* ID: 381, type: ushort, name: STAT_SCU_NUM_AHB_ERR */
+  2,  /* ID: 382, type: ushort, name: STAT_SCU_NUM_AHB_CERR */
+  2,  /* ID: 383, type: ushort, name: STAT_SCU_NUM_LUP_ERR */
+  4,  /* ID: 384, type: float, name: TEMP_SEM_SCU */
+  4,  /* ID: 385, type: float, name: TEMP_SEM_PCU */
+  4,  /* ID: 386, type: float, name: VOLT_SCU_P3_4 */
+  4,  /* ID: 387, type: float, name: VOLT_SCU_P5 */
+  4,  /* ID: 388, type: float, name: TEMP_FEE_CCD */
+  4,  /* ID: 389, type: float, name: TEMP_FEE_STRAP */
+  4,  /* ID: 390, type: float, name: TEMP_FEE_ADC */
+  4,  /* ID: 391, type: float, name: TEMP_FEE_BIAS */
+  4,  /* ID: 392, type: float, name: TEMP_FEE_DEB */
+  4,  /* ID: 393, type: float, name: VOLT_FEE_VOD */
+  4,  /* ID: 394, type: float, name: VOLT_FEE_VRD */
+  4,  /* ID: 395, type: float, name: VOLT_FEE_VOG */
+  4,  /* ID: 396, type: float, name: VOLT_FEE_VSS */
+  4,  /* ID: 397, type: float, name: VOLT_FEE_CCD */
+  4,  /* ID: 398, type: float, name: VOLT_FEE_CLK */
+  4,  /* ID: 399, type: float, name: VOLT_FEE_ANA_P5 */
+  4,  /* ID: 400, type: float, name: VOLT_FEE_ANA_N5 */
+  4,  /* ID: 401, type: float, name: VOLT_FEE_ANA_P3_3 */
+  4,  /* ID: 402, type: float, name: CURR_FEE_CLK_BUF */
+  4,  /* ID: 403, type: float, name: VOLT_SCU_FPGA_P1_5 */
+  4,  /* ID: 404, type: float, name: CURR_SCU_P3_4 */
+  1,  /* ID: 405, type: uchar, name: STAT_NUM_SPW_ERR_CRE */
+  1,  /* ID: 406, type: uchar, name: STAT_NUM_SPW_ERR_ESC */
+  1,  /* ID: 407, type: uchar, name: STAT_NUM_SPW_ERR_DISC */
+  1,  /* ID: 408, type: uchar, name: STAT_NUM_SPW_ERR_PAR */
+  1,  /* ID: 409, type: uchar, name: STAT_NUM_SPW_ERR_WRSY */
+  1,  /* ID: 410, type: uchar, name: STAT_NUM_SPW_ERR_INVA */
+  1,  /* ID: 411, type: uchar, name: STAT_NUM_SPW_ERR_EOP */
+  1,  /* ID: 412, type: uchar, name: STAT_NUM_SPW_ERR_RXAH */
+  1,  /* ID: 413, type: uchar, name: STAT_NUM_SPW_ERR_TXAH */
+  1,  /* ID: 414, type: uchar, name: STAT_NUM_SPW_ERR_TXBL */
+  1,  /* ID: 415, type: uchar, name: STAT_NUM_SPW_ERR_TXLE */
+  1,  /* ID: 416, type: uchar, name: STAT_NUM_SP_ERR_RX */
+  1,  /* ID: 417, type: uchar, name: STAT_NUM_SP_ERR_TX */
+  1,  /* ID: 418, type: uchar, name: STAT_HEAT_PWM_FPA_CCD */
+  1,  /* ID: 419, type: uchar, name: STAT_HEAT_PWM_FEE_STR */
+  1,  /* ID: 420, type: uchar, name: STAT_HEAT_PWM_FEE_ANA */
+  1,  /* ID: 421, type: uchar, name: STAT_HEAT_PWM_SPARE */
+  1,  /* ID: 422, type: uchar, name: STAT_HEAT_PWM_FLAGS */
+  2,  /* ID: 423, type: ushort, name: STAT_OBTIME_SYNC_DELTA */
+  4,  /* ID: 424, type: float, name: TEMP_SEM_SCU_LW */
+  4,  /* ID: 425, type: float, name: TEMP_SEM_PCU_LW */
+  4,  /* ID: 426, type: float, name: VOLT_SCU_P3_4_LW */
+  4,  /* ID: 427, type: float, name: VOLT_SCU_P5_LW */
+  4,  /* ID: 428, type: float, name: TEMP_FEE_CCD_LW */
+  4,  /* ID: 429, type: float, name: TEMP_FEE_STRAP_LW */
+  4,  /* ID: 430, type: float, name: TEMP_FEE_ADC_LW */
+  4,  /* ID: 431, type: float, name: TEMP_FEE_BIAS_LW */
+  4,  /* ID: 432, type: float, name: TEMP_FEE_DEB_LW */
+  4,  /* ID: 433, type: float, name: VOLT_FEE_VOD_LW */
+  4,  /* ID: 434, type: float, name: VOLT_FEE_VRD_LW */
+  4,  /* ID: 435, type: float, name: VOLT_FEE_VOG_LW */
+  4,  /* ID: 436, type: float, name: VOLT_FEE_VSS_LW */
+  4,  /* ID: 437, type: float, name: VOLT_FEE_CCD_LW */
+  4,  /* ID: 438, type: float, name: VOLT_FEE_CLK_LW */
+  4,  /* ID: 439, type: float, name: VOLT_FEE_ANA_P5_LW */
+  4,  /* ID: 440, type: float, name: VOLT_FEE_ANA_N5_LW */
+  4,  /* ID: 441, type: float, name: VOLT_FEE_ANA_P3_3_LW */
+  4,  /* ID: 442, type: float, name: CURR_FEE_CLK_BUF_LW */
+  4,  /* ID: 443, type: float, name: VOLT_SCU_FPGA_P1_5_LW */
+  4,  /* ID: 444, type: float, name: CURR_SCU_P3_4_LW */
+  4,  /* ID: 445, type: float, name: TEMP_SEM_SCU_UW */
+  4,  /* ID: 446, type: float, name: TEMP_SEM_PCU_UW */
+  4,  /* ID: 447, type: float, name: VOLT_SCU_P3_4_UW */
+  4,  /* ID: 448, type: float, name: VOLT_SCU_P5_UW */
+  4,  /* ID: 449, type: float, name: TEMP_FEE_CCD_UW */
+  4,  /* ID: 450, type: float, name: TEMP_FEE_STRAP_UW */
+  4,  /* ID: 451, type: float, name: TEMP_FEE_ADC_UW */
+  4,  /* ID: 452, type: float, name: TEMP_FEE_BIAS_UW */
+  4,  /* ID: 453, type: float, name: TEMP_FEE_DEB_UW */
+  4,  /* ID: 454, type: float, name: VOLT_FEE_VOD_UW */
+  4,  /* ID: 455, type: float, name: VOLT_FEE_VRD_UW */
+  4,  /* ID: 456, type: float, name: VOLT_FEE_VOG_UW */
+  4,  /* ID: 457, type: float, name: VOLT_FEE_VSS_UW */
+  4,  /* ID: 458, type: float, name: VOLT_FEE_CCD_UW */
+  4,  /* ID: 459, type: float, name: VOLT_FEE_CLK_UW */
+  4,  /* ID: 460, type: float, name: VOLT_FEE_ANA_P5_UW */
+  4,  /* ID: 461, type: float, name: VOLT_FEE_ANA_N5_UW */
+  4,  /* ID: 462, type: float, name: VOLT_FEE_ANA_P3_3_UW */
+  4,  /* ID: 463, type: float, name: CURR_FEE_CLK_BUF_UW */
+  4,  /* ID: 464, type: float, name: VOLT_SCU_FPGA_P1_5_UW */
+  4,  /* ID: 465, type: float, name: CURR_SCU_P3_4_UW */
+  4,  /* ID: 466, type: float, name: TEMP_SEM_SCU_LA */
+  4,  /* ID: 467, type: float, name: TEMP_SEM_PCU_LA */
+  4,  /* ID: 468, type: float, name: VOLT_SCU_P3_4_LA */
+  4,  /* ID: 469, type: float, name: VOLT_SCU_P5_LA */
+  4,  /* ID: 470, type: float, name: TEMP_FEE_CCD_LA */
+  4,  /* ID: 471, type: float, name: TEMP_FEE_STRAP_LA */
+  4,  /* ID: 472, type: float, name: TEMP_FEE_ADC_LA */
+  4,  /* ID: 473, type: float, name: TEMP_FEE_BIAS_LA */
+  4,  /* ID: 474, type: float, name: TEMP_FEE_DEB_LA */
+  4,  /* ID: 475, type: float, name: VOLT_FEE_VOD_LA */
+  4,  /* ID: 476, type: float, name: VOLT_FEE_VRD_LA */
+  4,  /* ID: 477, type: float, name: VOLT_FEE_VOG_LA */
+  4,  /* ID: 478, type: float, name: VOLT_FEE_VSS_LA */
+  4,  /* ID: 479, type: float, name: VOLT_FEE_CCD_LA */
+  4,  /* ID: 480, type: float, name: VOLT_FEE_CLK_LA */
+  4,  /* ID: 481, type: float, name: VOLT_FEE_ANA_P5_LA */
+  4,  /* ID: 482, type: float, name: VOLT_FEE_ANA_N5_LA */
+  4,  /* ID: 483, type: float, name: VOLT_FEE_ANA_P3_3_LA */
+  4,  /* ID: 484, type: float, name: CURR_FEE_CLK_BUF_LA */
+  4,  /* ID: 485, type: float, name: VOLT_SCU_FPGA_P1_5_LA */
+  4,  /* ID: 486, type: float, name: CURR_SCU_P3_4_LA */
+  4,  /* ID: 487, type: float, name: TEMP_SEM_SCU_UA */
+  4,  /* ID: 488, type: float, name: TEMP_SEM_PCU_UA */
+  4,  /* ID: 489, type: float, name: VOLT_SCU_P3_4_UA */
+  4,  /* ID: 490, type: float, name: VOLT_SCU_P5_UA */
+  4,  /* ID: 491, type: float, name: TEMP_FEE_CCD_UA */
+  4,  /* ID: 492, type: float, name: TEMP_FEE_STRAP_UA */
+  4,  /* ID: 493, type: float, name: TEMP_FEE_ADC_UA */
+  4,  /* ID: 494, type: float, name: TEMP_FEE_BIAS_UA */
+  4,  /* ID: 495, type: float, name: TEMP_FEE_DEB_UA */
+  4,  /* ID: 496, type: float, name: VOLT_FEE_VOD_UA */
+  4,  /* ID: 497, type: float, name: VOLT_FEE_VRD_UA */
+  4,  /* ID: 498, type: float, name: VOLT_FEE_VOG_UA */
+  4,  /* ID: 499, type: float, name: VOLT_FEE_VSS_UA */
+  4,  /* ID: 500, type: float, name: VOLT_FEE_CCD_UA */
+  4,  /* ID: 501, type: float, name: VOLT_FEE_CLK_UA */
+  4,  /* ID: 502, type: float, name: VOLT_FEE_ANA_P5_UA */
+  4,  /* ID: 503, type: float, name: VOLT_FEE_ANA_N5_UA */
+  4,  /* ID: 504, type: float, name: VOLT_FEE_ANA_P3_3_UA */
+  4,  /* ID: 505, type: float, name: CURR_FEE_CLK_BUF_UA */
+  4,  /* ID: 506, type: float, name: VOLT_SCU_FPGA_P1_5_UA */
+  4,  /* ID: 507, type: float, name: CURR_SCU_P3_4_UA */
+  4,  /* ID: 508, type: uint, name: semEvtCounter */
+  1,  /* ID: 509, type: bool, name: SEM_SERV5_1_FORWARD */
+  1,  /* ID: 510, type: bool, name: SEM_SERV5_2_FORWARD */
+  1,  /* ID: 511, type: bool, name: SEM_SERV5_3_FORWARD */
+  1,  /* ID: 512, type: bool, name: SEM_SERV5_4_FORWARD */
+  4,  /* ID: 513, type: uint, name: pExpTime */
+  4,  /* ID: 514, type: uint, name: pImageRep */
+  4,  /* ID: 515, type: uint, name: pAcqNum */
+  2,  /* ID: 516, type: enum, name: pDataOs */
+  2,  /* ID: 517, type: enum, name: pCcdRdMode */
+  2,  /* ID: 518, type: ushort, name: pWinPosX */
+  2,  /* ID: 519, type: ushort, name: pWinPosY */
+  2,  /* ID: 520, type: ushort, name: pWinSizeX */
+  2,  /* ID: 521, type: ushort, name: pWinSizeY */
+  2,  /* ID: 522, type: enum, name: pDtAcqSrc */
+  2,  /* ID: 523, type: enum, name: pTempCtrlTarget */
+  4,  /* ID: 524, type: float, name: pVoltFeeVod */
+  4,  /* ID: 525, type: float, name: pVoltFeeVrd */
+  4,  /* ID: 526, type: float, name: pVoltFeeVss */
+  4,  /* ID: 527, type: float, name: pHeatTempFpaCCd */
+  4,  /* ID: 528, type: float, name: pHeatTempFeeStrap */
+  4,  /* ID: 529, type: float, name: pHeatTempFeeAnach */
+  4,  /* ID: 530, type: float, name: pHeatTempSpare */
+  2,  /* ID: 531, type: enum, name: pStepEnDiagCcd */
+  2,  /* ID: 532, type: enum, name: pStepEnDiagFee */
+  2,  /* ID: 533, type: enum, name: pStepEnDiagTemp */
+  2,  /* ID: 534, type: enum, name: pStepEnDiagAna */
+  2,  /* ID: 535, type: enum, name: pStepEnDiagExpos */
+  2,  /* ID: 536, type: enum, name: pStepDebDiagCcd */
+  2,  /* ID: 537, type: enum, name: pStepDebDiagFee */
+  2,  /* ID: 538, type: enum, name: pStepDebDiagTemp */
+  2,  /* ID: 539, type: enum, name: pStepDebDiagAna */
+  2,  /* ID: 540, type: enum, name: pStepDebDiagExpos */
+  1,  /* ID: 541, type: bool, name: SEM_SERV220_6_FORWARD */
+  1,  /* ID: 542, type: bool, name: SEM_SERV220_12_FORWARD */
+  1,  /* ID: 543, type: bool, name: SEM_SERV222_6_FORWARD */
+  2,  /* ID: 544, type: enum, name: saveImagesNode */
+  4,  /* ID: 545, type: uint, name: saveImagesCnt */
+  2,  /* ID: 546, type: enum, name: SaveImages_pSaveTarget */
+  1,  /* ID: 547, type: uchar, name: SaveImages_pFbfInit */
+  1,  /* ID: 548, type: uchar, name: SaveImages_pFbfEnd */
+  2,  /* ID: 549, type: enum, name: acqFullDropNode */
+  4,  /* ID: 550, type: uint, name: acqFullDropCnt */
+  4,  /* ID: 551, type: uint, name: AcqFullDrop_pExpTime */
+  4,  /* ID: 552, type: uint, name: AcqFullDrop_pImageRep */
+  4,  /* ID: 553, type: uint, name: acqFullDropT1 */
+  4,  /* ID: 554, type: uint, name: acqFullDropT2 */
+  2,  /* ID: 555, type: enum, name: calFullSnapNode */
+  4,  /* ID: 556, type: uint, name: calFullSnapCnt */
+  4,  /* ID: 557, type: uint, name: CalFullSnap_pExpTime */
+  4,  /* ID: 558, type: uint, name: CalFullSnap_pImageRep */
+  4,  /* ID: 559, type: uint, name: CalFullSnap_pNmbImages */
+  2,  /* ID: 560, type: enum, name: CalFullSnap_pCentSel */
+  4,  /* ID: 561, type: uint, name: calFullSnapT1 */
+  4,  /* ID: 562, type: uint, name: calFullSnapT2 */
+  2,  /* ID: 563, type: enum, name: SciWinNode */
+  4,  /* ID: 564, type: uint, name: SciWinCnt */
+  4,  /* ID: 565, type: uint, name: SciWin_pNmbImages */
+  2,  /* ID: 566, type: enum, name: SciWin_pCcdRdMode */
+  4,  /* ID: 567, type: uint, name: SciWin_pExpTime */
+  4,  /* ID: 568, type: uint, name: SciWin_pImageRep */
+  2,  /* ID: 569, type: ushort, name: SciWin_pWinPosX */
+  2,  /* ID: 570, type: ushort, name: SciWin_pWinPosY */
+  2,  /* ID: 571, type: ushort, name: SciWin_pWinSizeX */
+  2,  /* ID: 572, type: ushort, name: SciWin_pWinSizeY */
+  2,  /* ID: 573, type: enum, name: SciWin_pCentSel */
+  4,  /* ID: 574, type: uint, name: sciWinT1 */
+  4,  /* ID: 575, type: uint, name: sciWinT2 */
+  2,  /* ID: 576, type: enum, name: fbfLoadNode */
+  4,  /* ID: 577, type: uint, name: fbfLoadCnt */
+  2,  /* ID: 578, type: enum, name: fbfSaveNode */
+  4,  /* ID: 579, type: uint, name: fbfSaveCnt */
+  1,  /* ID: 580, type: uchar, name: FbfLoad_pFbfId */
+  1,  /* ID: 581, type: uchar, name: FbfLoad_pFbfNBlocks */
+  2,  /* ID: 582, type: ushort, name: FbfLoad_pFbfRamAreaId */
+  4,  /* ID: 583, type: uint, name: FbfLoad_pFbfRamAddr */
+  1,  /* ID: 584, type: uchar, name: FbfSave_pFbfId */
+  1,  /* ID: 585, type: uchar, name: FbfSave_pFbfNBlocks */
+  2,  /* ID: 586, type: ushort, name: FbfSave_pFbfRamAreaId */
+  4,  /* ID: 587, type: uint, name: FbfSave_pFbfRamAddr */
+  1,  /* ID: 588, type: uchar, name: fbfLoadBlockCounter */
+  1,  /* ID: 589, type: uchar, name: fbfSaveBlockCounter */
+  2,  /* ID: 590, type: enum, name: transFbfToGrndNode */
+  4,  /* ID: 591, type: uint, name: transFbfToGrndCnt */
+  1,  /* ID: 592, type: uchar, name: TransFbfToGrnd_pNmbFbf */
+  1,  /* ID: 593, type: uchar, name: TransFbfToGrnd_pFbfInit */
+  1,  /* ID: 594, type: uchar, name: TransFbfToGrnd_pFbfSize */
+  2,  /* ID: 595, type: enum, name: nomSciNode */
+  4,  /* ID: 596, type: uint, name: nomSciCnt */
+  1,  /* ID: 597, type: bool, name: NomSci_pAcqFlag */
+  1,  /* ID: 598, type: bool, name: NomSci_pCal1Flag */
+  1,  /* ID: 599, type: bool, name: NomSci_pSciFlag */
+  1,  /* ID: 600, type: bool, name: NomSci_pCal2Flag */
+  1,  /* ID: 601, type: uchar, name: NomSci_pCibNFull */
+  2,  /* ID: 602, type: ushort, name: NomSci_pCibSizeFull */
+  1,  /* ID: 603, type: uchar, name: NomSci_pSibNFull */
+  2,  /* ID: 604, type: ushort, name: NomSci_pSibSizeFull */
+  1,  /* ID: 605, type: uchar, name: NomSci_pGibNFull */
+  2,  /* ID: 606, type: ushort, name: NomSci_pGibSizeFull */
+  1,  /* ID: 607, type: uchar, name: NomSci_pSibNWin */
+  2,  /* ID: 608, type: ushort, name: NomSci_pSibSizeWin */
+  1,  /* ID: 609, type: uchar, name: NomSci_pCibNWin */
+  2,  /* ID: 610, type: ushort, name: NomSci_pCibSizeWin */
+  1,  /* ID: 611, type: uchar, name: NomSci_pGibNWin */
+  2,  /* ID: 612, type: ushort, name: NomSci_pGibSizeWin */
+  4,  /* ID: 613, type: uint, name: NomSci_pExpTimeAcq */
+  4,  /* ID: 614, type: uint, name: NomSci_pImageRepAcq */
+  4,  /* ID: 615, type: uint, name: NomSci_pExpTimeCal1 */
+  4,  /* ID: 616, type: uint, name: NomSci_pImageRepCal1 */
+  4,  /* ID: 617, type: uint, name: NomSci_pNmbImagesCal1 */
+  2,  /* ID: 618, type: enum, name: NomSci_pCentSelCal1 */
+  4,  /* ID: 619, type: uint, name: NomSci_pNmbImagesSci */
+  2,  /* ID: 620, type: enum, name: NomSci_pCcdRdModeSci */
+  4,  /* ID: 621, type: uint, name: NomSci_pExpTimeSci */
+  4,  /* ID: 622, type: uint, name: NomSci_pImageRepSci */
+  2,  /* ID: 623, type: ushort, name: NomSci_pWinPosXSci */
+  2,  /* ID: 624, type: ushort, name: NomSci_pWinPosYSci */
+  2,  /* ID: 625, type: ushort, name: NomSci_pWinSizeXSci */
+  2,  /* ID: 626, type: ushort, name: NomSci_pWinSizeYSci */
+  2,  /* ID: 627, type: enum, name: NomSci_pCentSelSci */
+  4,  /* ID: 628, type: uint, name: NomSci_pExpTimeCal2 */
+  4,  /* ID: 629, type: uint, name: NomSci_pImageRepCal2 */
+  4,  /* ID: 630, type: uint, name: NomSci_pNmbImagesCal2 */
+  2,  /* ID: 631, type: enum, name: NomSci_pCentSelCal2 */
+  2,  /* ID: 632, type: enum, name: NomSci_pSaveTarget */
+  1,  /* ID: 633, type: uchar, name: NomSci_pFbfInit */
+  1,  /* ID: 634, type: uchar, name: NomSci_pFbfEnd */
+  2,  /* ID: 635, type: ushort, name: NomSci_pStckOrderCal1 */
+  2,  /* ID: 636, type: ushort, name: NomSci_pStckOrderSci */
+  2,  /* ID: 637, type: ushort, name: NomSci_pStckOrderCal2 */
+  2,  /* ID: 638, type: enum, name: ConfigSdb_pSdbCmd */
+  1,  /* ID: 639, type: uchar, name: ConfigSdb_pCibNFull */
+  2,  /* ID: 640, type: ushort, name: ConfigSdb_pCibSizeFull */
+  1,  /* ID: 641, type: uchar, name: ConfigSdb_pSibNFull */
+  2,  /* ID: 642, type: ushort, name: ConfigSdb_pSibSizeFull */
+  1,  /* ID: 643, type: uchar, name: ConfigSdb_pGibNFull */
+  2,  /* ID: 644, type: ushort, name: ConfigSdb_pGibSizeFull */
+  1,  /* ID: 645, type: uchar, name: ConfigSdb_pSibNWin */
+  2,  /* ID: 646, type: ushort, name: ConfigSdb_pSibSizeWin */
+  1,  /* ID: 647, type: uchar, name: ConfigSdb_pCibNWin */
+  2,  /* ID: 648, type: ushort, name: ConfigSdb_pCibSizeWin */
+  1,  /* ID: 649, type: uchar, name: ConfigSdb_pGibNWin */
+  2,  /* ID: 650, type: ushort, name: ConfigSdb_pGibSizeWin */
+  4,  /* ID: 651, type: float, name: ADC_P3V3 */
+  4,  /* ID: 652, type: float, name: ADC_P5V */
+  4,  /* ID: 653, type: float, name: ADC_P1V8 */
+  4,  /* ID: 654, type: float, name: ADC_P2V5 */
+  4,  /* ID: 655, type: float, name: ADC_N5V */
+  4,  /* ID: 656, type: float, name: ADC_PGND */
+  4,  /* ID: 657, type: float, name: ADC_TEMPOH1A */
+  4,  /* ID: 658, type: float, name: ADC_TEMP1 */
+  4,  /* ID: 659, type: float, name: ADC_TEMPOH2A */
+  4,  /* ID: 660, type: float, name: ADC_TEMPOH1B */
+  4,  /* ID: 661, type: float, name: ADC_TEMPOH3A */
+  4,  /* ID: 662, type: float, name: ADC_TEMPOH2B */
+  4,  /* ID: 663, type: float, name: ADC_TEMPOH4A */
+  4,  /* ID: 664, type: float, name: ADC_TEMPOH3B */
+  4,  /* ID: 665, type: float, name: ADC_TEMPOH4B */
+  4,  /* ID: 666, type: float, name: SEM_P15V */
+  4,  /* ID: 667, type: float, name: SEM_P30V */
+  4,  /* ID: 668, type: float, name: SEM_P5V0 */
+  4,  /* ID: 669, type: float, name: SEM_P7V0 */
+  4,  /* ID: 670, type: float, name: SEM_N5V0 */
+  2,  /* ID: 671, type: short, name: ADC_P3V3_RAW */
+  2,  /* ID: 672, type: short, name: ADC_P5V_RAW */
+  2,  /* ID: 673, type: short, name: ADC_P1V8_RAW */
+  2,  /* ID: 674, type: short, name: ADC_P2V5_RAW */
+  2,  /* ID: 675, type: short, name: ADC_N5V_RAW */
+  2,  /* ID: 676, type: short, name: ADC_PGND_RAW */
+  2,  /* ID: 677, type: short, name: ADC_TEMPOH1A_RAW */
+  2,  /* ID: 678, type: short, name: ADC_TEMP1_RAW */
+  2,  /* ID: 679, type: short, name: ADC_TEMPOH2A_RAW */
+  2,  /* ID: 680, type: short, name: ADC_TEMPOH1B_RAW */
+  2,  /* ID: 681, type: short, name: ADC_TEMPOH3A_RAW */
+  2,  /* ID: 682, type: short, name: ADC_TEMPOH2B_RAW */
+  2,  /* ID: 683, type: short, name: ADC_TEMPOH4A_RAW */
+  2,  /* ID: 684, type: short, name: ADC_TEMPOH3B_RAW */
+  2,  /* ID: 685, type: short, name: ADC_TEMPOH4B_RAW */
+  2,  /* ID: 686, type: short, name: SEM_P15V_RAW */
+  2,  /* ID: 687, type: short, name: SEM_P30V_RAW */
+  2,  /* ID: 688, type: short, name: SEM_P5V0_RAW */
+  2,  /* ID: 689, type: short, name: SEM_P7V0_RAW */
+  2,  /* ID: 690, type: short, name: SEM_N5V0_RAW */
+  4,  /* ID: 691, type: float, name: ADC_P3V3_U */
+  4,  /* ID: 692, type: float, name: ADC_P5V_U */
+  4,  /* ID: 693, type: float, name: ADC_P1V8_U */
+  4,  /* ID: 694, type: float, name: ADC_P2V5_U */
+  4,  /* ID: 695, type: float, name: ADC_N5V_L */
+  4,  /* ID: 696, type: float, name: ADC_PGND_U */
+  4,  /* ID: 697, type: float, name: ADC_PGND_L */
+  4,  /* ID: 698, type: float, name: ADC_TEMPOH1A_U */
+  4,  /* ID: 699, type: float, name: ADC_TEMP1_U */
+  4,  /* ID: 700, type: float, name: ADC_TEMPOH2A_U */
+  4,  /* ID: 701, type: float, name: ADC_TEMPOH1B_U */
+  4,  /* ID: 702, type: float, name: ADC_TEMPOH3A_U */
+  4,  /* ID: 703, type: float, name: ADC_TEMPOH2B_U */
+  4,  /* ID: 704, type: float, name: ADC_TEMPOH4A_U */
+  4,  /* ID: 705, type: float, name: ADC_TEMPOH3B_U */
+  4,  /* ID: 706, type: float, name: ADC_TEMPOH4B_U */
+  4,  /* ID: 707, type: float, name: SEM_P15V_U */
+  4,  /* ID: 708, type: float, name: SEM_P30V_U */
+  4,  /* ID: 709, type: float, name: SEM_P5V0_U */
+  4,  /* ID: 710, type: float, name: SEM_P7V0_U */
+  4,  /* ID: 711, type: float, name: SEM_N5V0_L */
+  2,  /* ID: 712, type: ushort, name: HbSemPassword */
+  4,  /* ID: 713, type: uint, name: HbSemCounter */
+  1,  /* ID: 714, type: bool, name: isWatchdogEnabled */
+  1,  /* ID: 715, type: bool, name: isSynchronized */
+  4,  /* ID: 716, type: int, name: missedMsgCnt */
+  4,  /* ID: 717, type: int, name: missedPulseCnt */
+  4,  /* ID: 718, type: uint, name: milFrameDelay */
+  2,  /* ID: 719, type: enum, name: EL1_CHIP */
+  2,  /* ID: 720, type: enum, name: EL2_CHIP */
+  4,  /* ID: 721, type: uint, name: EL1_ADDR */
+  4,  /* ID: 722, type: uint, name: EL2_ADDR */
+  1,  /* ID: 723, type: bool, name: ERR_LOG_ENB */
+  1,  /* ID: 724, type: bool, name: isErrLogValid */
+  2,  /* ID: 725, type: ushort, name: nOfErrLogEntries */
+  4,  /* ID: 726, type: uint, name: MAX_SEM_PCKT_CYC */
+  4,  /* ID: 727, type: uint, name: FBF_BLCK_WR_DUR */
+  4,  /* ID: 728, type: uint, name: FBF_BLCK_RD_DUR */
+  1,  /* ID: 729, type: bool, name: isFbfOpen */
+  1,  /* ID: 730, type: bool, name: isFbfValid */
+  1,  /* ID: 731, type: bool, name: FBF_ENB */
+  2,  /* ID: 732, type: enum, name: FBF_CHIP */
+  4,  /* ID: 733, type: uint, name: FBF_ADDR */
+  2,  /* ID: 734, type: ushort, name: fbfNBlocks */
+  4,  /* ID: 735, type: float, name: THR_MA_A_1 */
+  4,  /* ID: 736, type: float, name: THR_MA_A_2 */
+  4,  /* ID: 737, type: float, name: THR_MA_A_3 */
+  4,  /* ID: 738, type: float, name: THR_MA_A_4 */
+  4,  /* ID: 739, type: float, name: THR_MA_A_5 */
+  4,  /* ID: 740, type: float, name: wcet_1 */
+  4,  /* ID: 741, type: float, name: wcet_2 */
+  4,  /* ID: 742, type: float, name: wcet_3 */
+  4,  /* ID: 743, type: float, name: wcet_4 */
+  4,  /* ID: 744, type: float, name: wcet_5 */
+  4,  /* ID: 745, type: float, name: wcetAver_1 */
+  4,  /* ID: 746, type: float, name: wcetAver_2 */
+  4,  /* ID: 747, type: float, name: wcetAver_3 */
+  4,  /* ID: 748, type: float, name: wcetAver_4 */
+  4,  /* ID: 749, type: float, name: wcetAver_5 */
+  4,  /* ID: 750, type: float, name: wcetMax_1 */
+  4,  /* ID: 751, type: float, name: wcetMax_2 */
+  4,  /* ID: 752, type: float, name: wcetMax_3 */
+  4,  /* ID: 753, type: float, name: wcetMax_4 */
+  4,  /* ID: 754, type: float, name: wcetMax_5 */
+  4,  /* ID: 755, type: uint, name: nOfNotif_1 */
+  4,  /* ID: 756, type: uint, name: nOfNotif_2 */
+  4,  /* ID: 757, type: uint, name: nOfNotif_3 */
+  4,  /* ID: 758, type: uint, name: nOfNotif_4 */
+  4,  /* ID: 759, type: uint, name: nOfNotif_5 */
+  4,  /* ID: 760, type: uint, name: nofFuncExec_1 */
+  4,  /* ID: 761, type: uint, name: nofFuncExec_2 */
+  4,  /* ID: 762, type: uint, name: nofFuncExec_3 */
+  4,  /* ID: 763, type: uint, name: nofFuncExec_4 */
+  4,  /* ID: 764, type: uint, name: nofFuncExec_5 */
+  2,  /* ID: 765, type: ushort, name: wcetTimeStampFine_1 */
+  2,  /* ID: 766, type: ushort, name: wcetTimeStampFine_2 */
+  2,  /* ID: 767, type: ushort, name: wcetTimeStampFine_3 */
+  2,  /* ID: 768, type: ushort, name: wcetTimeStampFine_4 */
+  2,  /* ID: 769, type: ushort, name: wcetTimeStampFine_5 */
+  4,  /* ID: 770, type: uint, name: wcetTimeStampCoarse_1 */
+  4,  /* ID: 771, type: uint, name: wcetTimeStampCoarse_2 */
+  4,  /* ID: 772, type: uint, name: wcetTimeStampCoarse_3 */
+  4,  /* ID: 773, type: uint, name: wcetTimeStampCoarse_4 */
+  4,  /* ID: 774, type: uint, name: wcetTimeStampCoarse_5 */
+  4,  /* ID: 775, type: uint, name: flashContStepCnt */
+  4,  /* ID: 776, type: float, name: OTA_TM1A_NOM */
+  4,  /* ID: 777, type: float, name: OTA_TM1A_RED */
+  4,  /* ID: 778, type: float, name: OTA_TM1B_NOM */
+  4,  /* ID: 779, type: float, name: OTA_TM1B_RED */
+  4,  /* ID: 780, type: float, name: OTA_TM2A_NOM */
+  4,  /* ID: 781, type: float, name: OTA_TM2A_RED */
+  4,  /* ID: 782, type: float, name: OTA_TM2B_NOM */
+  4,  /* ID: 783, type: float, name: OTA_TM2B_RED */
+  4,  /* ID: 784, type: float, name: OTA_TM3A_NOM */
+  4,  /* ID: 785, type: float, name: OTA_TM3A_RED */
+  4,  /* ID: 786, type: float, name: OTA_TM3B_NOM */
+  4,  /* ID: 787, type: float, name: OTA_TM3B_RED */
+  4,  /* ID: 788, type: float, name: OTA_TM4A_NOM */
+  4,  /* ID: 789, type: float, name: OTA_TM4A_RED */
+  4,  /* ID: 790, type: float, name: OTA_TM4B_NOM */
+  4,  /* ID: 791, type: float, name: OTA_TM4B_RED */
+  1,  /* ID: 792, type: uchar, name: Core0Load */
+  1,  /* ID: 793, type: uchar, name: Core1Load */
+  4,  /* ID: 794, type: uint, name: InterruptRate */
+  1,  /* ID: 795, type: uchar, name: CyclicalActivitiesCtr */
+  4,  /* ID: 796, type: uint, name: Uptime */
+  1,  /* ID: 797, type: uchar, name: SemTick */
+  4,  /* ID: 798, type: uint, name: SemPwrOnTimestamp */
+  4,  /* ID: 799, type: uint, name: SemPwrOffTimestamp */
+  2,  /* ID: 800, type: ushort, name: IASW_EVT_CTR */
+  4,  /* ID: 801, type: uint, name: BAD_COPY_ID */
+  4,  /* ID: 802, type: uint, name: BAD_PASTE_ID */
+  4,  /* ID: 803, type: uint, name: ObcInputBufferPackets */
+  4,  /* ID: 804, type: uint, name: GrndInputBufferPackets */
+  4,  /* ID: 805, type: uint, name: MilBusBytesIn */
+  4,  /* ID: 806, type: uint, name: MilBusBytesOut */
+  2,  /* ID: 807, type: ushort, name: MilBusDroppedBytes */
+  2,  /* ID: 808, type: ushort, name: IRL1 */
+  1,  /* ID: 809, type: uchar, name: IRL1_AHBSTAT */
+  1,  /* ID: 810, type: uchar, name: IRL1_GRGPIO_6 */
+  1,  /* ID: 811, type: uchar, name: IRL1_GRTIMER */
+  1,  /* ID: 812, type: uchar, name: IRL1_GPTIMER_0 */
+  1,  /* ID: 813, type: uchar, name: IRL1_GPTIMER_1 */
+  1,  /* ID: 814, type: uchar, name: IRL1_GPTIMER_2 */
+  1,  /* ID: 815, type: uchar, name: IRL1_GPTIMER_3 */
+  1,  /* ID: 816, type: uchar, name: IRL1_IRQMP */
+  1,  /* ID: 817, type: uchar, name: IRL1_B1553BRM */
+  2,  /* ID: 818, type: ushort, name: IRL2 */
+  1,  /* ID: 819, type: uchar, name: IRL2_GRSPW2_0 */
+  1,  /* ID: 820, type: uchar, name: IRL2_GRSPW2_1 */
+  2,  /* ID: 821, type: enum, name: SemRoute */
+  4,  /* ID: 822, type: uint, name: SpW0BytesIn */
+  4,  /* ID: 823, type: uint, name: SpW0BytesOut */
+  4,  /* ID: 824, type: uint, name: SpW1BytesIn */
+  4,  /* ID: 825, type: uint, name: SpW1BytesOut */
+  1,  /* ID: 826, type: uchar, name: Spw0TxDescAvail */
+  1,  /* ID: 827, type: uchar, name: Spw0RxPcktAvail */
+  1,  /* ID: 828, type: uchar, name: Spw1TxDescAvail */
+  1,  /* ID: 829, type: uchar, name: Spw1RxPcktAvail */
+  4,  /* ID: 830, type: uint, name: MilCucCoarseTime */
+  2,  /* ID: 831, type: ushort, name: MilCucFineTime */
+  4,  /* ID: 832, type: uint, name: CucCoarseTime */
+  2,  /* ID: 833, type: ushort, name: CucFineTime */
+  4,  /* ID: 834, type: uint, name: Sram1ScrCurrAddr */
+  4,  /* ID: 835, type: uint, name: Sram2ScrCurrAddr */
+  2,  /* ID: 836, type: ushort, name: Sram1ScrLength */
+  2,  /* ID: 837, type: ushort, name: Sram2ScrLength */
+  1,  /* ID: 838, type: uchar, name: EdacSingleRepaired */
+  2,  /* ID: 839, type: ushort, name: EdacSingleFaults */
+  4,  /* ID: 840, type: uint, name: EdacLastSingleFail */
+  1,  /* ID: 841, type: uchar, name: EdacDoubleFaults */
+  4,  /* ID: 842, type: uint, name: EdacDoubleFAddr */
+  2,  /* ID: 843, type: enum, name: Cpu2ProcStatus */
+  1,  /* ID: 844, type: uchar, name: HEARTBEAT_ENABLED */
+  4,  /* ID: 845, type: uint, name: S1AllocDbs */
+  4,  /* ID: 846, type: uint, name: S1AllocSw */
+  4,  /* ID: 847, type: uint, name: S1AllocHeap */
+  4,  /* ID: 848, type: uint, name: S1AllocFlash */
+  4,  /* ID: 849, type: uint, name: S1AllocAux */
+  4,  /* ID: 850, type: uint, name: S1AllocRes */
+  4,  /* ID: 851, type: uint, name: S1AllocSwap */
+  4,  /* ID: 852, type: uint, name: S2AllocSciHeap */
+  2,  /* ID: 853, type: enum, name: TaAlgoId */
+  2,  /* ID: 854, type: ushort, name: TAACQALGOID */
+  4,  /* ID: 855, type: uint, name: TASPARE32 */
+  2,  /* ID: 856, type: ushort, name: TaTimingPar1 */
+  2,  /* ID: 857, type: ushort, name: TaTimingPar2 */
+  2,  /* ID: 858, type: ushort, name: TaDistanceThrd */
+  2,  /* ID: 859, type: ushort, name: TaIterations */
+  2,  /* ID: 860, type: ushort, name: TaRebinningFact */
+  2,  /* ID: 861, type: ushort, name: TaDetectionThrd */
+  2,  /* ID: 862, type: ushort, name: TaSeReducedExtr */
+  2,  /* ID: 863, type: ushort, name: TaSeReducedRadius */
+  2,  /* ID: 864, type: ushort, name: TaSeTolerance */
+  2,  /* ID: 865, type: ushort, name: TaMvaTolerance */
+  2,  /* ID: 866, type: ushort, name: TaAmaTolerance */
+  2,  /* ID: 867, type: ushort, name: TAPOINTUNCERT */
+  4,  /* ID: 868, type: uint, name: TATARGETSIG */
+  2,  /* ID: 869, type: ushort, name: TANROFSTARS */
+  4,  /* ID: 870, type: float, name: TaMaxSigFract */
+  4,  /* ID: 871, type: float, name: TaBias */
+  4,  /* ID: 872, type: float, name: TaDark */
+  4,  /* ID: 873, type: float, name: TaSkyBg */
+  1,  /* ID: 874, type: uchar, name: COGBITS */
+  4,  /* ID: 875, type: float, name: CENT_MULT_X */
+  4,  /* ID: 876, type: float, name: CENT_MULT_Y */
+  4,  /* ID: 877, type: float, name: CENT_OFFSET_X */
+  4,  /* ID: 878, type: float, name: CENT_OFFSET_Y */
+  1,  /* ID: 879, type: uchar, name: CENT_MEDIANFILTER */
+  2,  /* ID: 880, type: ushort, name: CENT_DIM_X */
+  2,  /* ID: 881, type: ushort, name: CENT_DIM_Y */
+  1,  /* ID: 882, type: bool, name: CENT_CHECKS */
+  4,  /* ID: 883, type: uint, name: CEN_SIGMALIMIT */
+  4,  /* ID: 884, type: uint, name: CEN_SIGNALLIMIT */
+  4,  /* ID: 885, type: uint, name: CEN_MEDIAN_THRD */
+  4,  /* ID: 886, type: float, name: OPT_AXIS_X */
+  4,  /* ID: 887, type: float, name: OPT_AXIS_Y */
+  1,  /* ID: 888, type: bool, name: DIST_CORR */
+  1,  /* ID: 889, type: uchar, name: pStckOrderSci */
+  2,  /* ID: 890, type: ushort, name: pWinSizeXSci */
+  2,  /* ID: 891, type: ushort, name: pWinSizeYSci */
+  2,  /* ID: 892, type: enum, name: SdpImageAptShape */
+  2,  /* ID: 893, type: ushort, name: SdpImageAptX */
+  2,  /* ID: 894, type: ushort, name: SdpImageAptY */
+  2,  /* ID: 895, type: enum, name: SdpImgttAptShape */
+  2,  /* ID: 896, type: ushort, name: SdpImgttAptX */
+  2,  /* ID: 897, type: ushort, name: SdpImgttAptY */
+  1,  /* ID: 898, type: uchar, name: SdpImgttStckOrder */
+  1,  /* ID: 899, type: uchar, name: SdpLosStckOrder */
+  1,  /* ID: 900, type: uchar, name: SdpLblkStckOrder */
+  1,  /* ID: 901, type: uchar, name: SdpLdkStckOrder */
+  1,  /* ID: 902, type: uchar, name: SdpRdkStckOrder */
+  1,  /* ID: 903, type: uchar, name: SdpRblkStckOrder */
+  1,  /* ID: 904, type: uchar, name: SdpTosStckOrder */
+  1,  /* ID: 905, type: uchar, name: SdpTdkStckOrder */
+  2,  /* ID: 906, type: enum, name: SdpImgttStrat */
+  4,  /* ID: 907, type: float, name: Sdp3StatAmpl */
+  2,  /* ID: 908, type: enum, name: SdpPhotStrat */
+  1,  /* ID: 909, type: uchar, name: SdpPhotRcent */
+  1,  /* ID: 910, type: uchar, name: SdpPhotRann1 */
+  1,  /* ID: 911, type: uchar, name: SdpPhotRann2 */
+  1,  /* ID: 912, type: uchar, name: SdpCrc */
+  2,  /* ID: 913, type: ushort, name: CCPRODUCT */
+  2,  /* ID: 914, type: ushort, name: CCSTEP */
+  2,  /* ID: 915, type: ushort, name: XIB_FAILURES */
+  1,  /* ID: 916, type: uchar, name: FEE_SIDE_A */
+  1,  /* ID: 917, type: uchar, name: FEE_SIDE_B */
+  4,  /* ID: 918, type: uint, name: NLCBORDERS */
+  4,  /* ID: 919, type: float, name: NLCCOEFF_A */
+  4,  /* ID: 920, type: float, name: NLCCOEFF_B */
+  4,  /* ID: 921, type: float, name: NLCCOEFF_C */
+  4,  /* ID: 922, type: float, name: NLCCOEFF_D */
+  2,  /* ID: 923, type: ushort, name: SdpGlobalBias */
+  2,  /* ID: 924, type: enum, name: BiasOrigin */
+  4,  /* ID: 925, type: float, name: SdpGlobalGain */
+  4,  /* ID: 926, type: uint, name: SdpWinImageCeKey */
+  4,  /* ID: 927, type: uint, name: SdpWinImgttCeKey */
+  4,  /* ID: 928, type: uint, name: SdpWinHdrCeKey */
+  4,  /* ID: 929, type: uint, name: SdpWinMLOSCeKey */
+  4,  /* ID: 930, type: uint, name: SdpWinMLBLKCeKey */
+  4,  /* ID: 931, type: uint, name: SdpWinMLDKCeKey */
+  4,  /* ID: 932, type: uint, name: SdpWinMRDKCeKey */
+  4,  /* ID: 933, type: uint, name: SdpWinMRBLKCeKey */
+  4,  /* ID: 934, type: uint, name: SdpWinMTOSCeKey */
+  4,  /* ID: 935, type: uint, name: SdpWinMTDKCeKey */
+  4,  /* ID: 936, type: uint, name: SdpFullImgCeKey */
+  4,  /* ID: 937, type: uint, name: SdpFullHdrCeKey */
+  4,  /* ID: 938, type: uint, name: CE_Timetag_crs */
+  2,  /* ID: 939, type: ushort, name: CE_Timetag_fine */
+  2,  /* ID: 940, type: ushort, name: CE_Counter */
+  2,  /* ID: 941, type: ushort, name: CE_Version */
+  1,  /* ID: 942, type: uchar, name: CE_Integrity */
+  2,  /* ID: 943, type: ushort, name: CE_SemWindowPosX */
+  2,  /* ID: 944, type: ushort, name: CE_SemWindowPosY */
+  2,  /* ID: 945, type: ushort, name: CE_SemWindowSizeX */
+  2,  /* ID: 946, type: ushort, name: CE_SemWindowSizeY */
+  4,  /* ID: 947, type: uint, name: SPILL_CTR */
+  1,  /* ID: 948, type: uchar, name: RZIP_ITER1 */
+  1,  /* ID: 949, type: uchar, name: RZIP_ITER2 */
+  1,  /* ID: 950, type: uchar, name: RZIP_ITER3 */
+  1,  /* ID: 951, type: uchar, name: RZIP_ITER4 */
+  2,  /* ID: 952, type: ushort, name: SdpLdkColMask */
+  2,  /* ID: 953, type: ushort, name: SdpRdkColMask */
+  2,  /* ID: 954, type: ushort, name: FPGA_Version */
+  2,  /* ID: 955, type: ushort, name: FPGA_DPU_Status */
+  2,  /* ID: 956, type: ushort, name: FPGA_DPU_Address */
+  2,  /* ID: 957, type: ushort, name: FPGA_RESET_Status */
+  2,  /* ID: 958, type: ushort, name: FPGA_SEM_Status */
+  2,  /* ID: 959, type: ushort, name: FPGA_Oper_Heater_Status */
+  2,  /* ID: 960, type: ushort, name: GIBTOTRANSFER */
+  2,  /* ID: 961, type: ushort, name: TRANSFERMODE */
+  4,  /* ID: 962, type: uint, name: S2TOTRANSFERSIZE */
+  4,  /* ID: 963, type: uint, name: S4TOTRANSFERSIZE */
+  1,  /* ID: 964, type: uchar, name: TransferComplete */
+  4,  /* ID: 965, type: uint, name: NLCBORDERS_2 */
+  4,  /* ID: 966, type: float, name: NLCCOEFF_A_2 */
+  4,  /* ID: 967, type: float, name: NLCCOEFF_B_2 */
+  4,  /* ID: 968, type: float, name: NLCCOEFF_C_2 */
+  1,  /* ID: 969, type: uchar, name: RF100 */
+  1,  /* ID: 970, type: uchar, name: RF230 */
+  4,  /* ID: 971, type: float, name: distc1 */
+  4,  /* ID: 972, type: float, name: distc2 */
+  4,  /* ID: 973, type: float, name: distc3 */
+  4,  /* ID: 974, type: uint, name: SPARE_UI_0 */
+  4,  /* ID: 975, type: uint, name: SPARE_UI_1 */
+  4,  /* ID: 976, type: uint, name: SPARE_UI_2 */
+  4,  /* ID: 977, type: uint, name: SPARE_UI_3 */
+  4,  /* ID: 978, type: uint, name: SPARE_UI_4 */
+  4,  /* ID: 979, type: uint, name: SPARE_UI_5 */
+  4,  /* ID: 980, type: uint, name: SPARE_UI_6 */
+  4,  /* ID: 981, type: uint, name: SPARE_UI_7 */
+  4,  /* ID: 982, type: uint, name: SPARE_UI_8 */
+  4,  /* ID: 983, type: uint, name: SPARE_UI_9 */
+  4,  /* ID: 984, type: uint, name: SPARE_UI_10 */
+  4,  /* ID: 985, type: uint, name: SPARE_UI_11 */
+  4,  /* ID: 986, type: uint, name: SPARE_UI_12 */
+  4,  /* ID: 987, type: uint, name: SPARE_UI_13 */
+  4,  /* ID: 988, type: uint, name: SPARE_UI_14 */
+  4,  /* ID: 989, type: uint, name: SPARE_UI_15 */
+  4,  /* ID: 990, type: float, name: SPARE_F_0 */
+  4,  /* ID: 991, type: float, name: SPARE_F_1 */
+  4,  /* ID: 992, type: float, name: SPARE_F_2 */
+  4,  /* ID: 993, type: float, name: SPARE_F_3 */
+  4,  /* ID: 994, type: float, name: SPARE_F_4 */
+  4,  /* ID: 995, type: float, name: SPARE_F_5 */
+  4,  /* ID: 996, type: float, name: SPARE_F_6 */
+  4,  /* ID: 997, type: float, name: SPARE_F_7 */
+  4,  /* ID: 998, type: float, name: SPARE_F_8 */
+  4,  /* ID: 999, type: float, name: SPARE_F_9 */
+  4,  /* ID: 1000, type: float, name: SPARE_F_10 */
+  4,  /* ID: 1001, type: float, name: SPARE_F_11 */
+  4,  /* ID: 1002, type: float, name: SPARE_F_12 */
+  4,  /* ID: 1003, type: float, name: SPARE_F_13 */
+  4,  /* ID: 1004, type: float, name: SPARE_F_14 */
+  4,  /* ID: 1005, type: float, name: SPARE_F_15 */
+};
+
+/**
+ * Initialization of the array holding the addresses of data pool items.
+ */
+static void * dataPoolAddr[1006] = { 
+  0,  /* ID: 0, unused */
+  (void *)&dpIasw.buildNumber,  /* ID: 1 */
+  (void *)&dpCordet.AppErrCode,  /* ID: 2 */
+  (void *)&dpCordet.NofAllocatedInRep,  /* ID: 3 */
+  (void *)&dpCordet.MaxNOfInRep,  /* ID: 4 */
+  (void *)&dpCordet.NofAllocatedInCmd,  /* ID: 5 */
+  (void *)&dpCordet.MaxNOfInCmd,  /* ID: 6 */
+  (void *)&dpCordet.Sem_NOfPendingInCmp,  /* ID: 7 */
+  (void *)&dpCordet.Sem_PCRLSize,  /* ID: 8 */
+  (void *)&dpCordet.Sem_NOfLoadedInCmp,  /* ID: 9 */
+  (void *)&dpCordet.GrdObc_NOfPendingInCmp,  /* ID: 10 */
+  (void *)&dpCordet.GrdObc_PCRLSize,  /* ID: 11 */
+  (void *)&dpCordet.NOfAllocatedOutCmp,  /* ID: 12 */
+  (void *)&dpCordet.MaxNOfOutCmp,  /* ID: 13 */
+  (void *)&dpCordet.NOfInstanceId,  /* ID: 14 */
+  (void *)&dpCordet.OutMg1_NOfPendingOutCmp,  /* ID: 15 */
+  (void *)&dpCordet.OutMg1_POCLSize,  /* ID: 16 */
+  (void *)&dpCordet.OutMg1_NOfLoadedOutCmp,  /* ID: 17 */
+  (void *)&dpCordet.OutMg2_NOfPendingOutCmp,  /* ID: 18 */
+  (void *)&dpCordet.OutMg2_POCLSize,  /* ID: 19 */
+  (void *)&dpCordet.OutMg2_NOfLoadedOutCmp,  /* ID: 20 */
+  (void *)&dpCordet.OutMg3_NOfPendingOutCmp,  /* ID: 21 */
+  (void *)&dpCordet.OutMg3_POCLSize,  /* ID: 22 */
+  (void *)&dpCordet.OutMg3_NOfLoadedOutCmp,  /* ID: 23 */
+  (void *)&dpCordet.InSem_SeqCnt,  /* ID: 24 */
+  (void *)&dpCordet.InSem_NOfPendingPckts,  /* ID: 25 */
+  (void *)&dpCordet.InSem_NOfGroups,  /* ID: 26 */
+  (void *)&dpCordet.InSem_PcktQueueSize,  /* ID: 27 */
+  (void *)&dpCordet.InSem_Src,  /* ID: 28 */
+  (void *)&dpCordet.InObc_NOfPendingPckts,  /* ID: 29 */
+  (void *)&dpCordet.InObc_NOfGroups,  /* ID: 30 */
+  (void *)&dpCordet.InObc_PcktQueueSize,  /* ID: 31 */
+  (void *)&dpCordet.InObc_Src,  /* ID: 32 */
+  (void *)&dpCordet.InGrd_NOfPendingPckts,  /* ID: 33 */
+  (void *)&dpCordet.InGrd_NOfGroups,  /* ID: 34 */
+  (void *)&dpCordet.InGrd_PcktQueueSize,  /* ID: 35 */
+  (void *)&dpCordet.InGrd_Src,  /* ID: 36 */
+  (void *)&dpCordet.OutSem_Dest,  /* ID: 37 */
+  (void *)&dpCordet.OutSem_SeqCnt,  /* ID: 38 */
+  (void *)&dpCordet.OutSem_NOfPendingPckts,  /* ID: 39 */
+  (void *)&dpCordet.OutSem_NOfGroups,  /* ID: 40 */
+  (void *)&dpCordet.OutSem_PcktQueueSize,  /* ID: 41 */
+  (void *)&dpCordet.OutObc_Dest,  /* ID: 42 */
+  (void *)&dpCordet.OutObc_SeqCnt_Group0,  /* ID: 43 */
+  (void *)&dpCordet.OutObc_SeqCnt_Group1,  /* ID: 44 */
+  (void *)&dpCordet.OutObc_NOfPendingPckts,  /* ID: 45 */
+  (void *)&dpCordet.OutObc_NOfGroups,  /* ID: 46 */
+  (void *)&dpCordet.OutObc_PcktQueueSize,  /* ID: 47 */
+  (void *)&dpCordet.OutGrd_Dest,  /* ID: 48 */
+  (void *)&dpCordet.OutGrd_SeqCnt_Group0,  /* ID: 49 */
+  (void *)&dpCordet.OutGrd_SeqCnt_Group1,  /* ID: 50 */
+  (void *)&dpCordet.OutGrd_SeqCnt_Group2,  /* ID: 51 */
+  (void *)&dpCordet.OutGrd_NOfPendingPckts,  /* ID: 52 */
+  (void *)&dpCordet.OutGrd_NOfGroups,  /* ID: 53 */
+  (void *)&dpCordet.OutGrd_PcktQueueSize,  /* ID: 54 */
+  (void *)&dpIasw.sibNFull,  /* ID: 55 */
+  (void *)&dpIasw.cibNFull,  /* ID: 56 */
+  (void *)&dpIasw.gibNFull,  /* ID: 57 */
+  (void *)&dpIasw.sibNWin,  /* ID: 58 */
+  (void *)&dpIasw.cibNWin,  /* ID: 59 */
+  (void *)&dpIasw.gibNWin,  /* ID: 60 */
+  (void *)&dpIasw.sibSizeFull,  /* ID: 61 */
+  (void *)&dpIasw.cibSizeFull,  /* ID: 62 */
+  (void *)&dpIasw.gibSizeFull,  /* ID: 63 */
+  (void *)&dpIasw.sibSizeWin,  /* ID: 64 */
+  (void *)&dpIasw.cibSizeWin,  /* ID: 65 */
+  (void *)&dpIasw.gibSizeWin,  /* ID: 66 */
+  (void *)&dpIasw.sibIn,  /* ID: 67 */
+  (void *)&dpIasw.sibOut,  /* ID: 68 */
+  (void *)&dpIasw.cibIn,  /* ID: 69 */
+  (void *)&dpIasw.gibIn,  /* ID: 70 */
+  (void *)&dpIasw.gibOut,  /* ID: 71 */
+  (void *)&dpIasw.sdbState,  /* ID: 72 */
+  (void *)&dpIasw.sdbStateCnt,  /* ID: 73 */
+  (void *)&dpIasw.OffsetX,  /* ID: 74 */
+  (void *)&dpIasw.OffsetY,  /* ID: 75 */
+  (void *)&dpIasw.TargetLocationX,  /* ID: 76 */
+  (void *)&dpIasw.TargetLocationY,  /* ID: 77 */
+  (void *)&dpIasw.IntegStartTimeCrs,  /* ID: 78 */
+  (void *)&dpIasw.IntegStartTimeFine,  /* ID: 79 */
+  (void *)&dpIasw.IntegEndTimeCrs,  /* ID: 80 */
+  (void *)&dpIasw.IntegEndTimeFine,  /* ID: 81 */
+  (void *)&dpIasw.DataCadence,  /* ID: 82 */
+  (void *)&dpIasw.ValidityStatus,  /* ID: 83 */
+  (void *)&dpIasw.NOfTcAcc,  /* ID: 84 */
+  (void *)&dpIasw.NOfAccFailedTc,  /* ID: 85 */
+  (void *)&dpIasw.SeqCntLastAccTcFromObc,  /* ID: 86 */
+  (void *)&dpIasw.SeqCntLastAccTcFromGrd,  /* ID: 87 */
+  (void *)&dpIasw.SeqCntLastAccFailTc,  /* ID: 88 */
+  (void *)&dpIasw.NOfStartFailedTc,  /* ID: 89 */
+  (void *)&dpIasw.SeqCntLastStartFailTc,  /* ID: 90 */
+  (void *)&dpIasw.NOfTcTerm,  /* ID: 91 */
+  (void *)&dpIasw.NOfTermFailedTc,  /* ID: 92 */
+  (void *)&dpIasw.SeqCntLastTermFailTc,  /* ID: 93 */
+  (void *)&dpIasw.RdlSidList,  /* ID: 94 */
+  (void *)&dpIasw.isRdlFree,  /* ID: 95 */
+  (void *)&dpIasw.RdlCycCntList,  /* ID: 96 */
+  (void *)&dpIasw.RdlPeriodList,  /* ID: 97 */
+  (void *)&dpIasw.RdlEnabledList,  /* ID: 98 */
+  (void *)&dpIasw.RdlDestList,  /* ID: 99 */
+  (void *)&dpIasw.RdlDataItemList_0,  /* ID: 100 */
+  (void *)&dpIasw.RdlDataItemList_1,  /* ID: 101 */
+  (void *)&dpIasw.RdlDataItemList_2,  /* ID: 102 */
+  (void *)&dpIasw.RdlDataItemList_3,  /* ID: 103 */
+  (void *)&dpIasw.RdlDataItemList_4,  /* ID: 104 */
+  (void *)&dpIasw.RdlDataItemList_5,  /* ID: 105 */
+  (void *)&dpIasw.RdlDataItemList_6,  /* ID: 106 */
+  (void *)&dpIasw.RdlDataItemList_7,  /* ID: 107 */
+  (void *)&dpIasw.RdlDataItemList_8,  /* ID: 108 */
+  (void *)&dpIasw.RdlDataItemList_9,  /* ID: 109 */
+  (void *)&dpIasw.DEBUG_VAR,  /* ID: 110 */
+  (void *)&dpIasw.DEBUG_VAR_ADDR,  /* ID: 111 */
+  (void *)&dpIasw.EVTFILTERDEF,  /* ID: 112 */
+  (void *)&dpIasw.evtEnabledList,  /* ID: 113 */
+  (void *)&dpIasw.lastPatchedAddr,  /* ID: 114 */
+  (void *)&dpIasw.lastDumpAddr,  /* ID: 115 */
+  (void *)&dpIasw.sdu2State,  /* ID: 116 */
+  (void *)&dpIasw.sdu4State,  /* ID: 117 */
+  (void *)&dpIasw.sdu2StateCnt,  /* ID: 118 */
+  (void *)&dpIasw.sdu4StateCnt,  /* ID: 119 */
+  (void *)&dpIasw.sdu2BlockCnt,  /* ID: 120 */
+  (void *)&dpIasw.sdu4BlockCnt,  /* ID: 121 */
+  (void *)&dpIasw.sdu2RemSize,  /* ID: 122 */
+  (void *)&dpIasw.sdu4RemSize,  /* ID: 123 */
+  (void *)&dpIasw.sdu2DownTransferSize,  /* ID: 124 */
+  (void *)&dpIasw.sdu4DownTransferSize,  /* ID: 125 */
+  (void *)&dpIasw.sdsCounter,  /* ID: 126 */
+  (void *)&dpIasw.FdGlbEnable,  /* ID: 127 */
+  (void *)&dpIasw.RpGlbEnable,  /* ID: 128 */
+  (void *)&dpIasw.FdCheckTTMState,  /* ID: 129 */
+  (void *)&dpIasw.FdCheckTTMIntEn,  /* ID: 130 */
+  (void *)&dpIasw.FdCheckTTMExtEn,  /* ID: 131 */
+  (void *)&dpIasw.RpTTMIntEn,  /* ID: 132 */
+  (void *)&dpIasw.RpTTMExtEn,  /* ID: 133 */
+  (void *)&dpIasw.FdCheckTTMCnt,  /* ID: 134 */
+  (void *)&dpIasw.FdCheckTTMSpCnt,  /* ID: 135 */
+  (void *)&dpIasw.FdCheckTTMCntThr,  /* ID: 136 */
+  (void *)&dpIasw.TTC_LL,  /* ID: 137 */
+  (void *)&dpIasw.TTC_UL,  /* ID: 138 */
+  (void *)&dpIasw.TTM_LIM,  /* ID: 139 */
+  (void *)&dpIasw.FdCheckSDSCState,  /* ID: 140 */
+  (void *)&dpIasw.FdCheckSDSCIntEn,  /* ID: 141 */
+  (void *)&dpIasw.FdCheckSDSCExtEn,  /* ID: 142 */
+  (void *)&dpIasw.RpSDSCIntEn,  /* ID: 143 */
+  (void *)&dpIasw.RpSDSCExtEn,  /* ID: 144 */
+  (void *)&dpIasw.FdCheckSDSCCnt,  /* ID: 145 */
+  (void *)&dpIasw.FdCheckSDSCSpCnt,  /* ID: 146 */
+  (void *)&dpIasw.FdCheckSDSCCntThr,  /* ID: 147 */
+  (void *)&dpIasw.FdCheckComErrState,  /* ID: 148 */
+  (void *)&dpIasw.FdCheckComErrIntEn,  /* ID: 149 */
+  (void *)&dpIasw.FdCheckComErrExtEn,  /* ID: 150 */
+  (void *)&dpIasw.RpComErrIntEn,  /* ID: 151 */
+  (void *)&dpIasw.RpComErrExtEn,  /* ID: 152 */
+  (void *)&dpIasw.FdCheckComErrCnt,  /* ID: 153 */
+  (void *)&dpIasw.FdCheckComErrSpCnt,  /* ID: 154 */
+  (void *)&dpIasw.FdCheckComErrCntThr,  /* ID: 155 */
+  (void *)&dpIasw.FdCheckTimeOutState,  /* ID: 156 */
+  (void *)&dpIasw.FdCheckTimeOutIntEn,  /* ID: 157 */
+  (void *)&dpIasw.FdCheckTimeOutExtEn,  /* ID: 158 */
+  (void *)&dpIasw.RpTimeOutIntEn,  /* ID: 159 */
+  (void *)&dpIasw.RpTimeOutExtEn,  /* ID: 160 */
+  (void *)&dpIasw.FdCheckTimeOutCnt,  /* ID: 161 */
+  (void *)&dpIasw.FdCheckTimeOutSpCnt,  /* ID: 162 */
+  (void *)&dpIasw.FdCheckTimeOutCntThr,  /* ID: 163 */
+  (void *)&dpIasw.SEM_TO_POWERON,  /* ID: 164 */
+  (void *)&dpIasw.SEM_TO_SAFE,  /* ID: 165 */
+  (void *)&dpIasw.SEM_TO_STAB,  /* ID: 166 */
+  (void *)&dpIasw.SEM_TO_TEMP,  /* ID: 167 */
+  (void *)&dpIasw.SEM_TO_CCD,  /* ID: 168 */
+  (void *)&dpIasw.SEM_TO_DIAG,  /* ID: 169 */
+  (void *)&dpIasw.SEM_TO_STANDBY,  /* ID: 170 */
+  (void *)&dpIasw.FdCheckSafeModeState,  /* ID: 171 */
+  (void *)&dpIasw.FdCheckSafeModeIntEn,  /* ID: 172 */
+  (void *)&dpIasw.FdCheckSafeModeExtEn,  /* ID: 173 */
+  (void *)&dpIasw.RpSafeModeIntEn,  /* ID: 174 */
+  (void *)&dpIasw.RpSafeModeExtEn,  /* ID: 175 */
+  (void *)&dpIasw.FdCheckSafeModeCnt,  /* ID: 176 */
+  (void *)&dpIasw.FdCheckSafeModeSpCnt,  /* ID: 177 */
+  (void *)&dpIasw.FdCheckSafeModeCntThr,  /* ID: 178 */
+  (void *)&dpIasw.FdCheckAliveState,  /* ID: 179 */
+  (void *)&dpIasw.FdCheckAliveIntEn,  /* ID: 180 */
+  (void *)&dpIasw.FdCheckAliveExtEn,  /* ID: 181 */
+  (void *)&dpIasw.RpAliveIntEn,  /* ID: 182 */
+  (void *)&dpIasw.RpAliveExtEn,  /* ID: 183 */
+  (void *)&dpIasw.FdCheckAliveCnt,  /* ID: 184 */
+  (void *)&dpIasw.FdCheckAliveSpCnt,  /* ID: 185 */
+  (void *)&dpIasw.FdCheckAliveCntThr,  /* ID: 186 */
+  (void *)&dpIasw.SEM_HK_DEF_PER,  /* ID: 187 */
+  (void *)&dpIasw.SEMALIVE_DELAYEDSEMHK,  /* ID: 188 */
+  (void *)&dpIasw.FdCheckSemAnoEvtState,  /* ID: 189 */
+  (void *)&dpIasw.FdCheckSemAnoEvtIntEn,  /* ID: 190 */
+  (void *)&dpIasw.FdCheckSemAnoEvtExtEn,  /* ID: 191 */
+  (void *)&dpIasw.RpSemAnoEvtIntEn,  /* ID: 192 */
+  (void *)&dpIasw.RpSemAnoEvtExtEn,  /* ID: 193 */
+  (void *)&dpIasw.FdCheckSemAnoEvtCnt,  /* ID: 194 */
+  (void *)&dpIasw.FdCheckSemAnoEvtSpCnt,  /* ID: 195 */
+  (void *)&dpIasw.FdCheckSemAnoEvtCntThr,  /* ID: 196 */
+  (void *)&dpIasw.semAnoEvtResp_1,  /* ID: 197 */
+  (void *)&dpIasw.semAnoEvtResp_2,  /* ID: 198 */
+  (void *)&dpIasw.semAnoEvtResp_3,  /* ID: 199 */
+  (void *)&dpIasw.semAnoEvtResp_4,  /* ID: 200 */
+  (void *)&dpIasw.semAnoEvtResp_5,  /* ID: 201 */
+  (void *)&dpIasw.semAnoEvtResp_6,  /* ID: 202 */
+  (void *)&dpIasw.semAnoEvtResp_7,  /* ID: 203 */
+  (void *)&dpIasw.semAnoEvtResp_8,  /* ID: 204 */
+  (void *)&dpIasw.semAnoEvtResp_9,  /* ID: 205 */
+  (void *)&dpIasw.semAnoEvtResp_10,  /* ID: 206 */
+  (void *)&dpIasw.semAnoEvtResp_11,  /* ID: 207 */
+  (void *)&dpIasw.semAnoEvtResp_12,  /* ID: 208 */
+  (void *)&dpIasw.semAnoEvtResp_13,  /* ID: 209 */
+  (void *)&dpIasw.semAnoEvtResp_14,  /* ID: 210 */
+  (void *)&dpIasw.semAnoEvtResp_15,  /* ID: 211 */
+  (void *)&dpIasw.semAnoEvtResp_16,  /* ID: 212 */
+  (void *)&dpIasw.semAnoEvtResp_17,  /* ID: 213 */
+  (void *)&dpIasw.semAnoEvtResp_18,  /* ID: 214 */
+  (void *)&dpIasw.semAnoEvtResp_19,  /* ID: 215 */
+  (void *)&dpIasw.semAnoEvtResp_20,  /* ID: 216 */
+  (void *)&dpIasw.semAnoEvtResp_21,  /* ID: 217 */
+  (void *)&dpIasw.semAnoEvtResp_22,  /* ID: 218 */
+  (void *)&dpIasw.semAnoEvtResp_23,  /* ID: 219 */
+  (void *)&dpIasw.semAnoEvtResp_24,  /* ID: 220 */
+  (void *)&dpIasw.semAnoEvtResp_25,  /* ID: 221 */
+  (void *)&dpIasw.semAnoEvtResp_26,  /* ID: 222 */
+  (void *)&dpIasw.semAnoEvtResp_27,  /* ID: 223 */
+  (void *)&dpIasw.semAnoEvtResp_28,  /* ID: 224 */
+  (void *)&dpIasw.semAnoEvtResp_29,  /* ID: 225 */
+  (void *)&dpIasw.FdCheckSemLimitState,  /* ID: 226 */
+  (void *)&dpIasw.FdCheckSemLimitIntEn,  /* ID: 227 */
+  (void *)&dpIasw.FdCheckSemLimitExtEn,  /* ID: 228 */
+  (void *)&dpIasw.RpSemLimitIntEn,  /* ID: 229 */
+  (void *)&dpIasw.RpSemLimitExtEn,  /* ID: 230 */
+  (void *)&dpIasw.FdCheckSemLimitCnt,  /* ID: 231 */
+  (void *)&dpIasw.FdCheckSemLimitSpCnt,  /* ID: 232 */
+  (void *)&dpIasw.FdCheckSemLimitCntThr,  /* ID: 233 */
+  (void *)&dpIasw.SEM_LIM_DEL_T,  /* ID: 234 */
+  (void *)&dpIasw.FdCheckDpuHkState,  /* ID: 235 */
+  (void *)&dpIasw.FdCheckDpuHkIntEn,  /* ID: 236 */
+  (void *)&dpIasw.FdCheckDpuHkExtEn,  /* ID: 237 */
+  (void *)&dpIasw.RpDpuHkIntEn,  /* ID: 238 */
+  (void *)&dpIasw.RpDpuHkExtEn,  /* ID: 239 */
+  (void *)&dpIasw.FdCheckDpuHkCnt,  /* ID: 240 */
+  (void *)&dpIasw.FdCheckDpuHkSpCnt,  /* ID: 241 */
+  (void *)&dpIasw.FdCheckDpuHkCntThr,  /* ID: 242 */
+  (void *)&dpIasw.FdCheckCentConsState,  /* ID: 243 */
+  (void *)&dpIasw.FdCheckCentConsIntEn,  /* ID: 244 */
+  (void *)&dpIasw.FdCheckCentConsExtEn,  /* ID: 245 */
+  (void *)&dpIasw.RpCentConsIntEn,  /* ID: 246 */
+  (void *)&dpIasw.RpCentConsExtEn,  /* ID: 247 */
+  (void *)&dpIasw.FdCheckCentConsCnt,  /* ID: 248 */
+  (void *)&dpIasw.FdCheckCentConsSpCnt,  /* ID: 249 */
+  (void *)&dpIasw.FdCheckCentConsCntThr,  /* ID: 250 */
+  (void *)&dpIasw.FdCheckResState,  /* ID: 251 */
+  (void *)&dpIasw.FdCheckResIntEn,  /* ID: 252 */
+  (void *)&dpIasw.FdCheckResExtEn,  /* ID: 253 */
+  (void *)&dpIasw.RpResIntEn,  /* ID: 254 */
+  (void *)&dpIasw.RpResExtEn,  /* ID: 255 */
+  (void *)&dpIasw.FdCheckResCnt,  /* ID: 256 */
+  (void *)&dpIasw.FdCheckResSpCnt,  /* ID: 257 */
+  (void *)&dpIasw.FdCheckResCntThr,  /* ID: 258 */
+  (void *)&dpIasw.CPU1_USAGE_MAX,  /* ID: 259 */
+  (void *)&dpIasw.MEM_USAGE_MAX,  /* ID: 260 */
+  (void *)&dpIasw.FdCheckSemCons,  /* ID: 261 */
+  (void *)&dpIasw.FdCheckSemConsIntEn,  /* ID: 262 */
+  (void *)&dpIasw.FdCheckSemConsExtEn,  /* ID: 263 */
+  (void *)&dpIasw.RpSemConsIntEn,  /* ID: 264 */
+  (void *)&dpIasw.RpSemConsExtEn,  /* ID: 265 */
+  (void *)&dpIasw.FdCheckSemConsCnt,  /* ID: 266 */
+  (void *)&dpIasw.FdCheckSemConsSpCnt,  /* ID: 267 */
+  (void *)&dpIasw.FdCheckSemConsCntThr,  /* ID: 268 */
+  (void *)&dpIasw.semState,  /* ID: 269 */
+  (void *)&dpIasw.semOperState,  /* ID: 270 */
+  (void *)&dpIasw.semStateCnt,  /* ID: 271 */
+  (void *)&dpIasw.semOperStateCnt,  /* ID: 272 */
+  (void *)&dpIasw.imageCycleCnt,  /* ID: 273 */
+  (void *)&dpIasw.acqImageCnt,  /* ID: 274 */
+  (void *)&dpIasw.sciSubMode,  /* ID: 275 */
+  (void *)&dpIasw.LastSemPckt,  /* ID: 276 */
+  (void *)&dpIasw.SEM_ON_CODE,  /* ID: 277 */
+  (void *)&dpIasw.SEM_OFF_CODE,  /* ID: 278 */
+  (void *)&dpIasw.SEM_INIT_T1,  /* ID: 279 */
+  (void *)&dpIasw.SEM_INIT_T2,  /* ID: 280 */
+  (void *)&dpIasw.SEM_OPER_T1,  /* ID: 281 */
+  (void *)&dpIasw.SEM_SHUTDOWN_T1,  /* ID: 282 */
+  (void *)&dpIasw.SEM_SHUTDOWN_T11,  /* ID: 283 */
+  (void *)&dpIasw.SEM_SHUTDOWN_T12,  /* ID: 284 */
+  (void *)&dpIasw.SEM_SHUTDOWN_T2,  /* ID: 285 */
+  (void *)&dpIasw.iaswState,  /* ID: 286 */
+  (void *)&dpIasw.iaswStateCnt,  /* ID: 287 */
+  (void *)&dpIasw.iaswCycleCnt,  /* ID: 288 */
+  (void *)&dpIasw.prepScienceNode,  /* ID: 289 */
+  (void *)&dpIasw.prepScienceCnt,  /* ID: 290 */
+  (void *)&dpIasw.controlledSwitchOffNode,  /* ID: 291 */
+  (void *)&dpIasw.controlledSwitchOffCnt,  /* ID: 292 */
+  (void *)&dpIasw.CTRLD_SWITCH_OFF_T1,  /* ID: 293 */
+  (void *)&dpIasw.algoCent0State,  /* ID: 294 */
+  (void *)&dpIasw.algoCent0Cnt,  /* ID: 295 */
+  (void *)&dpIasw.algoCent0Enabled,  /* ID: 296 */
+  (void *)&dpIasw.algoCent1State,  /* ID: 297 */
+  (void *)&dpIasw.algoCent1Cnt,  /* ID: 298 */
+  (void *)&dpIasw.algoCent1Enabled,  /* ID: 299 */
+  (void *)&dpIasw.CENT_EXEC_PHASE,  /* ID: 300 */
+  (void *)&dpIasw.algoAcq1State,  /* ID: 301 */
+  (void *)&dpIasw.algoAcq1Cnt,  /* ID: 302 */
+  (void *)&dpIasw.algoAcq1Enabled,  /* ID: 303 */
+  (void *)&dpIasw.ACQ_PH,  /* ID: 304 */
+  (void *)&dpIasw.algoCcState,  /* ID: 305 */
+  (void *)&dpIasw.algoCcCnt,  /* ID: 306 */
+  (void *)&dpIasw.algoCcEnabled,  /* ID: 307 */
+  (void *)&dpIasw.STCK_ORDER,  /* ID: 308 */
+  (void *)&dpIasw.algoTTC1State,  /* ID: 309 */
+  (void *)&dpIasw.algoTTC1Cnt,  /* ID: 310 */
+  (void *)&dpIasw.algoTTC1Enabled,  /* ID: 311 */
+  (void *)&dpIasw.TTC1_EXEC_PHASE,  /* ID: 312 */
+  (void *)&dpIasw.TTC1_EXEC_PER,  /* ID: 313 */
+  (void *)&dpIasw.TTC1_LL_FRT,  /* ID: 314 */
+  (void *)&dpIasw.TTC1_LL_AFT,  /* ID: 315 */
+  (void *)&dpIasw.TTC1_UL_FRT,  /* ID: 316 */
+  (void *)&dpIasw.TTC1_UL_AFT,  /* ID: 317 */
+  (void *)&dpIasw.ttc1AvTempAft,  /* ID: 318 */
+  (void *)&dpIasw.ttc1AvTempFrt,  /* ID: 319 */
+  (void *)&dpIasw.algoTTC2State,  /* ID: 320 */
+  (void *)&dpIasw.algoTTC2Cnt,  /* ID: 321 */
+  (void *)&dpIasw.algoTTC2Enabled,  /* ID: 322 */
+  (void *)&dpIasw.TTC2_EXEC_PER,  /* ID: 323 */
+  (void *)&dpIasw.TTC2_REF_TEMP,  /* ID: 324 */
+  (void *)&dpIasw.TTC2_OFFSETA,  /* ID: 325 */
+  (void *)&dpIasw.TTC2_OFFSETF,  /* ID: 326 */
+  (void *)&dpIasw.intTimeAft,  /* ID: 327 */
+  (void *)&dpIasw.onTimeAft,  /* ID: 328 */
+  (void *)&dpIasw.intTimeFront,  /* ID: 329 */
+  (void *)&dpIasw.onTimeFront,  /* ID: 330 */
+  (void *)&dpIasw.TTC2_PA,  /* ID: 331 */
+  (void *)&dpIasw.TTC2_DA,  /* ID: 332 */
+  (void *)&dpIasw.TTC2_IA,  /* ID: 333 */
+  (void *)&dpIasw.TTC2_PF,  /* ID: 334 */
+  (void *)&dpIasw.TTC2_DF,  /* ID: 335 */
+  (void *)&dpIasw.TTC2_IF,  /* ID: 336 */
+  (void *)&dpIasw.algoSaaEvalState,  /* ID: 337 */
+  (void *)&dpIasw.algoSaaEvalCnt,  /* ID: 338 */
+  (void *)&dpIasw.algoSaaEvalEnabled,  /* ID: 339 */
+  (void *)&dpIasw.SAA_EXEC_PHASE,  /* ID: 340 */
+  (void *)&dpIasw.SAA_EXEC_PER,  /* ID: 341 */
+  (void *)&dpIasw.isSaaActive,  /* ID: 342 */
+  (void *)&dpIasw.saaCounter,  /* ID: 343 */
+  (void *)&dpIasw.pInitSaaCounter,  /* ID: 344 */
+  (void *)&dpIasw.algoSdsEvalState,  /* ID: 345 */
+  (void *)&dpIasw.algoSdsEvalCnt,  /* ID: 346 */
+  (void *)&dpIasw.algoSdsEvalEnabled,  /* ID: 347 */
+  (void *)&dpIasw.SDS_EXEC_PHASE,  /* ID: 348 */
+  (void *)&dpIasw.SDS_EXEC_PER,  /* ID: 349 */
+  (void *)&dpIasw.isSdsActive,  /* ID: 350 */
+  (void *)&dpIasw.SDS_FORCED,  /* ID: 351 */
+  (void *)&dpIasw.SDS_INHIBITED,  /* ID: 352 */
+  (void *)&dpIasw.EARTH_OCCULT_ACTIVE,  /* ID: 353 */
+  (void *)&dpIasw.HEARTBEAT_D1,  /* ID: 354 */
+  (void *)&dpIasw.HEARTBEAT_D2,  /* ID: 355 */
+  (void *)&dpIasw.HbSem,  /* ID: 356 */
+  (void *)&dpIasw.starMap,  /* ID: 357 */
+  (void *)&dpIasw.observationId,  /* ID: 358 */
+  (void *)&dpIasw.centValProcOutput,  /* ID: 359 */
+  (void *)&dpIasw.CENT_OFFSET_LIM,  /* ID: 360 */
+  (void *)&dpIasw.CENT_FROZEN_LIM,  /* ID: 361 */
+  (void *)&dpIasw.SEM_SERV1_1_FORWARD,  /* ID: 362 */
+  (void *)&dpIasw.SEM_SERV1_2_FORWARD,  /* ID: 363 */
+  (void *)&dpIasw.SEM_SERV1_7_FORWARD,  /* ID: 364 */
+  (void *)&dpIasw.SEM_SERV1_8_FORWARD,  /* ID: 365 */
+  (void *)&dpIasw.SEM_SERV3_1_FORWARD,  /* ID: 366 */
+  (void *)&dpIasw.SEM_SERV3_2_FORWARD,  /* ID: 367 */
+  (void *)&dpIasw.SEM_HK_TS_DEF_CRS,  /* ID: 368 */
+  (void *)&dpIasw.SEM_HK_TS_DEF_FINE,  /* ID: 369 */
+  (void *)&dpIasw.SEM_HK_TS_EXT_CRS,  /* ID: 370 */
+  (void *)&dpIasw.SEM_HK_TS_EXT_FINE,  /* ID: 371 */
+  (void *)&dpIasw.STAT_MODE,  /* ID: 372 */
+  (void *)&dpIasw.STAT_FLAGS,  /* ID: 373 */
+  (void *)&dpIasw.STAT_LAST_SPW_ERR,  /* ID: 374 */
+  (void *)&dpIasw.STAT_LAST_ERR_ID,  /* ID: 375 */
+  (void *)&dpIasw.STAT_LAST_ERR_FREQ,  /* ID: 376 */
+  (void *)&dpIasw.STAT_NUM_CMD_RECEIVED,  /* ID: 377 */
+  (void *)&dpIasw.STAT_NUM_CMD_EXECUTED,  /* ID: 378 */
+  (void *)&dpIasw.STAT_NUM_DATA_SENT,  /* ID: 379 */
+  (void *)&dpIasw.STAT_SCU_PROC_DUTY_CL,  /* ID: 380 */
+  (void *)&dpIasw.STAT_SCU_NUM_AHB_ERR,  /* ID: 381 */
+  (void *)&dpIasw.STAT_SCU_NUM_AHB_CERR,  /* ID: 382 */
+  (void *)&dpIasw.STAT_SCU_NUM_LUP_ERR,  /* ID: 383 */
+  (void *)&dpIasw.TEMP_SEM_SCU,  /* ID: 384 */
+  (void *)&dpIasw.TEMP_SEM_PCU,  /* ID: 385 */
+  (void *)&dpIasw.VOLT_SCU_P3_4,  /* ID: 386 */
+  (void *)&dpIasw.VOLT_SCU_P5,  /* ID: 387 */
+  (void *)&dpIasw.TEMP_FEE_CCD,  /* ID: 388 */
+  (void *)&dpIasw.TEMP_FEE_STRAP,  /* ID: 389 */
+  (void *)&dpIasw.TEMP_FEE_ADC,  /* ID: 390 */
+  (void *)&dpIasw.TEMP_FEE_BIAS,  /* ID: 391 */
+  (void *)&dpIasw.TEMP_FEE_DEB,  /* ID: 392 */
+  (void *)&dpIasw.VOLT_FEE_VOD,  /* ID: 393 */
+  (void *)&dpIasw.VOLT_FEE_VRD,  /* ID: 394 */
+  (void *)&dpIasw.VOLT_FEE_VOG,  /* ID: 395 */
+  (void *)&dpIasw.VOLT_FEE_VSS,  /* ID: 396 */
+  (void *)&dpIasw.VOLT_FEE_CCD,  /* ID: 397 */
+  (void *)&dpIasw.VOLT_FEE_CLK,  /* ID: 398 */
+  (void *)&dpIasw.VOLT_FEE_ANA_P5,  /* ID: 399 */
+  (void *)&dpIasw.VOLT_FEE_ANA_N5,  /* ID: 400 */
+  (void *)&dpIasw.VOLT_FEE_ANA_P3_3,  /* ID: 401 */
+  (void *)&dpIasw.CURR_FEE_CLK_BUF,  /* ID: 402 */
+  (void *)&dpIasw.VOLT_SCU_FPGA_P1_5,  /* ID: 403 */
+  (void *)&dpIasw.CURR_SCU_P3_4,  /* ID: 404 */
+  (void *)&dpIasw.STAT_NUM_SPW_ERR_CRE,  /* ID: 405 */
+  (void *)&dpIasw.STAT_NUM_SPW_ERR_ESC,  /* ID: 406 */
+  (void *)&dpIasw.STAT_NUM_SPW_ERR_DISC,  /* ID: 407 */
+  (void *)&dpIasw.STAT_NUM_SPW_ERR_PAR,  /* ID: 408 */
+  (void *)&dpIasw.STAT_NUM_SPW_ERR_WRSY,  /* ID: 409 */
+  (void *)&dpIasw.STAT_NUM_SPW_ERR_INVA,  /* ID: 410 */
+  (void *)&dpIasw.STAT_NUM_SPW_ERR_EOP,  /* ID: 411 */
+  (void *)&dpIasw.STAT_NUM_SPW_ERR_RXAH,  /* ID: 412 */
+  (void *)&dpIasw.STAT_NUM_SPW_ERR_TXAH,  /* ID: 413 */
+  (void *)&dpIasw.STAT_NUM_SPW_ERR_TXBL,  /* ID: 414 */
+  (void *)&dpIasw.STAT_NUM_SPW_ERR_TXLE,  /* ID: 415 */
+  (void *)&dpIasw.STAT_NUM_SP_ERR_RX,  /* ID: 416 */
+  (void *)&dpIasw.STAT_NUM_SP_ERR_TX,  /* ID: 417 */
+  (void *)&dpIasw.STAT_HEAT_PWM_FPA_CCD,  /* ID: 418 */
+  (void *)&dpIasw.STAT_HEAT_PWM_FEE_STR,  /* ID: 419 */
+  (void *)&dpIasw.STAT_HEAT_PWM_FEE_ANA,  /* ID: 420 */
+  (void *)&dpIasw.STAT_HEAT_PWM_SPARE,  /* ID: 421 */
+  (void *)&dpIasw.STAT_HEAT_PWM_FLAGS,  /* ID: 422 */
+  (void *)&dpIasw.STAT_OBTIME_SYNC_DELTA,  /* ID: 423 */
+  (void *)&dpIasw.TEMP_SEM_SCU_LW,  /* ID: 424 */
+  (void *)&dpIasw.TEMP_SEM_PCU_LW,  /* ID: 425 */
+  (void *)&dpIasw.VOLT_SCU_P3_4_LW,  /* ID: 426 */
+  (void *)&dpIasw.VOLT_SCU_P5_LW,  /* ID: 427 */
+  (void *)&dpIasw.TEMP_FEE_CCD_LW,  /* ID: 428 */
+  (void *)&dpIasw.TEMP_FEE_STRAP_LW,  /* ID: 429 */
+  (void *)&dpIasw.TEMP_FEE_ADC_LW,  /* ID: 430 */
+  (void *)&dpIasw.TEMP_FEE_BIAS_LW,  /* ID: 431 */
+  (void *)&dpIasw.TEMP_FEE_DEB_LW,  /* ID: 432 */
+  (void *)&dpIasw.VOLT_FEE_VOD_LW,  /* ID: 433 */
+  (void *)&dpIasw.VOLT_FEE_VRD_LW,  /* ID: 434 */
+  (void *)&dpIasw.VOLT_FEE_VOG_LW,  /* ID: 435 */
+  (void *)&dpIasw.VOLT_FEE_VSS_LW,  /* ID: 436 */
+  (void *)&dpIasw.VOLT_FEE_CCD_LW,  /* ID: 437 */
+  (void *)&dpIasw.VOLT_FEE_CLK_LW,  /* ID: 438 */
+  (void *)&dpIasw.VOLT_FEE_ANA_P5_LW,  /* ID: 439 */
+  (void *)&dpIasw.VOLT_FEE_ANA_N5_LW,  /* ID: 440 */
+  (void *)&dpIasw.VOLT_FEE_ANA_P3_3_LW,  /* ID: 441 */
+  (void *)&dpIasw.CURR_FEE_CLK_BUF_LW,  /* ID: 442 */
+  (void *)&dpIasw.VOLT_SCU_FPGA_P1_5_LW,  /* ID: 443 */
+  (void *)&dpIasw.CURR_SCU_P3_4_LW,  /* ID: 444 */
+  (void *)&dpIasw.TEMP_SEM_SCU_UW,  /* ID: 445 */
+  (void *)&dpIasw.TEMP_SEM_PCU_UW,  /* ID: 446 */
+  (void *)&dpIasw.VOLT_SCU_P3_4_UW,  /* ID: 447 */
+  (void *)&dpIasw.VOLT_SCU_P5_UW,  /* ID: 448 */
+  (void *)&dpIasw.TEMP_FEE_CCD_UW,  /* ID: 449 */
+  (void *)&dpIasw.TEMP_FEE_STRAP_UW,  /* ID: 450 */
+  (void *)&dpIasw.TEMP_FEE_ADC_UW,  /* ID: 451 */
+  (void *)&dpIasw.TEMP_FEE_BIAS_UW,  /* ID: 452 */
+  (void *)&dpIasw.TEMP_FEE_DEB_UW,  /* ID: 453 */
+  (void *)&dpIasw.VOLT_FEE_VOD_UW,  /* ID: 454 */
+  (void *)&dpIasw.VOLT_FEE_VRD_UW,  /* ID: 455 */
+  (void *)&dpIasw.VOLT_FEE_VOG_UW,  /* ID: 456 */
+  (void *)&dpIasw.VOLT_FEE_VSS_UW,  /* ID: 457 */
+  (void *)&dpIasw.VOLT_FEE_CCD_UW,  /* ID: 458 */
+  (void *)&dpIasw.VOLT_FEE_CLK_UW,  /* ID: 459 */
+  (void *)&dpIasw.VOLT_FEE_ANA_P5_UW,  /* ID: 460 */
+  (void *)&dpIasw.VOLT_FEE_ANA_N5_UW,  /* ID: 461 */
+  (void *)&dpIasw.VOLT_FEE_ANA_P3_3_UW,  /* ID: 462 */
+  (void *)&dpIasw.CURR_FEE_CLK_BUF_UW,  /* ID: 463 */
+  (void *)&dpIasw.VOLT_SCU_FPGA_P1_5_UW,  /* ID: 464 */
+  (void *)&dpIasw.CURR_SCU_P3_4_UW,  /* ID: 465 */
+  (void *)&dpIasw.TEMP_SEM_SCU_LA,  /* ID: 466 */
+  (void *)&dpIasw.TEMP_SEM_PCU_LA,  /* ID: 467 */
+  (void *)&dpIasw.VOLT_SCU_P3_4_LA,  /* ID: 468 */
+  (void *)&dpIasw.VOLT_SCU_P5_LA,  /* ID: 469 */
+  (void *)&dpIasw.TEMP_FEE_CCD_LA,  /* ID: 470 */
+  (void *)&dpIasw.TEMP_FEE_STRAP_LA,  /* ID: 471 */
+  (void *)&dpIasw.TEMP_FEE_ADC_LA,  /* ID: 472 */
+  (void *)&dpIasw.TEMP_FEE_BIAS_LA,  /* ID: 473 */
+  (void *)&dpIasw.TEMP_FEE_DEB_LA,  /* ID: 474 */
+  (void *)&dpIasw.VOLT_FEE_VOD_LA,  /* ID: 475 */
+  (void *)&dpIasw.VOLT_FEE_VRD_LA,  /* ID: 476 */
+  (void *)&dpIasw.VOLT_FEE_VOG_LA,  /* ID: 477 */
+  (void *)&dpIasw.VOLT_FEE_VSS_LA,  /* ID: 478 */
+  (void *)&dpIasw.VOLT_FEE_CCD_LA,  /* ID: 479 */
+  (void *)&dpIasw.VOLT_FEE_CLK_LA,  /* ID: 480 */
+  (void *)&dpIasw.VOLT_FEE_ANA_P5_LA,  /* ID: 481 */
+  (void *)&dpIasw.VOLT_FEE_ANA_N5_LA,  /* ID: 482 */
+  (void *)&dpIasw.VOLT_FEE_ANA_P3_3_LA,  /* ID: 483 */
+  (void *)&dpIasw.CURR_FEE_CLK_BUF_LA,  /* ID: 484 */
+  (void *)&dpIasw.VOLT_SCU_FPGA_P1_5_LA,  /* ID: 485 */
+  (void *)&dpIasw.CURR_SCU_P3_4_LA,  /* ID: 486 */
+  (void *)&dpIasw.TEMP_SEM_SCU_UA,  /* ID: 487 */
+  (void *)&dpIasw.TEMP_SEM_PCU_UA,  /* ID: 488 */
+  (void *)&dpIasw.VOLT_SCU_P3_4_UA,  /* ID: 489 */
+  (void *)&dpIasw.VOLT_SCU_P5_UA,  /* ID: 490 */
+  (void *)&dpIasw.TEMP_FEE_CCD_UA,  /* ID: 491 */
+  (void *)&dpIasw.TEMP_FEE_STRAP_UA,  /* ID: 492 */
+  (void *)&dpIasw.TEMP_FEE_ADC_UA,  /* ID: 493 */
+  (void *)&dpIasw.TEMP_FEE_BIAS_UA,  /* ID: 494 */
+  (void *)&dpIasw.TEMP_FEE_DEB_UA,  /* ID: 495 */
+  (void *)&dpIasw.VOLT_FEE_VOD_UA,  /* ID: 496 */
+  (void *)&dpIasw.VOLT_FEE_VRD_UA,  /* ID: 497 */
+  (void *)&dpIasw.VOLT_FEE_VOG_UA,  /* ID: 498 */
+  (void *)&dpIasw.VOLT_FEE_VSS_UA,  /* ID: 499 */
+  (void *)&dpIasw.VOLT_FEE_CCD_UA,  /* ID: 500 */
+  (void *)&dpIasw.VOLT_FEE_CLK_UA,  /* ID: 501 */
+  (void *)&dpIasw.VOLT_FEE_ANA_P5_UA,  /* ID: 502 */
+  (void *)&dpIasw.VOLT_FEE_ANA_N5_UA,  /* ID: 503 */
+  (void *)&dpIasw.VOLT_FEE_ANA_P3_3_UA,  /* ID: 504 */
+  (void *)&dpIasw.CURR_FEE_CLK_BUF_UA,  /* ID: 505 */
+  (void *)&dpIasw.VOLT_SCU_FPGA_P1_5_UA,  /* ID: 506 */
+  (void *)&dpIasw.CURR_SCU_P3_4_UA,  /* ID: 507 */
+  (void *)&dpIasw.semEvtCounter,  /* ID: 508 */
+  (void *)&dpIasw.SEM_SERV5_1_FORWARD,  /* ID: 509 */
+  (void *)&dpIasw.SEM_SERV5_2_FORWARD,  /* ID: 510 */
+  (void *)&dpIasw.SEM_SERV5_3_FORWARD,  /* ID: 511 */
+  (void *)&dpIasw.SEM_SERV5_4_FORWARD,  /* ID: 512 */
+  (void *)&dpIasw.pExpTime,  /* ID: 513 */
+  (void *)&dpIasw.pImageRep,  /* ID: 514 */
+  (void *)&dpIasw.pAcqNum,  /* ID: 515 */
+  (void *)&dpIasw.pDataOs,  /* ID: 516 */
+  (void *)&dpIasw.pCcdRdMode,  /* ID: 517 */
+  (void *)&dpIasw.pWinPosX,  /* ID: 518 */
+  (void *)&dpIasw.pWinPosY,  /* ID: 519 */
+  (void *)&dpIasw.pWinSizeX,  /* ID: 520 */
+  (void *)&dpIasw.pWinSizeY,  /* ID: 521 */
+  (void *)&dpIasw.pDtAcqSrc,  /* ID: 522 */
+  (void *)&dpIasw.pTempCtrlTarget,  /* ID: 523 */
+  (void *)&dpIasw.pVoltFeeVod,  /* ID: 524 */
+  (void *)&dpIasw.pVoltFeeVrd,  /* ID: 525 */
+  (void *)&dpIasw.pVoltFeeVss,  /* ID: 526 */
+  (void *)&dpIasw.pHeatTempFpaCCd,  /* ID: 527 */
+  (void *)&dpIasw.pHeatTempFeeStrap,  /* ID: 528 */
+  (void *)&dpIasw.pHeatTempFeeAnach,  /* ID: 529 */
+  (void *)&dpIasw.pHeatTempSpare,  /* ID: 530 */
+  (void *)&dpIasw.pStepEnDiagCcd,  /* ID: 531 */
+  (void *)&dpIasw.pStepEnDiagFee,  /* ID: 532 */
+  (void *)&dpIasw.pStepEnDiagTemp,  /* ID: 533 */
+  (void *)&dpIasw.pStepEnDiagAna,  /* ID: 534 */
+  (void *)&dpIasw.pStepEnDiagExpos,  /* ID: 535 */
+  (void *)&dpIasw.pStepDebDiagCcd,  /* ID: 536 */
+  (void *)&dpIasw.pStepDebDiagFee,  /* ID: 537 */
+  (void *)&dpIasw.pStepDebDiagTemp,  /* ID: 538 */
+  (void *)&dpIasw.pStepDebDiagAna,  /* ID: 539 */
+  (void *)&dpIasw.pStepDebDiagExpos,  /* ID: 540 */
+  (void *)&dpIasw.SEM_SERV220_6_FORWARD,  /* ID: 541 */
+  (void *)&dpIasw.SEM_SERV220_12_FORWARD,  /* ID: 542 */
+  (void *)&dpIasw.SEM_SERV222_6_FORWARD,  /* ID: 543 */
+  (void *)&dpIasw.saveImagesNode,  /* ID: 544 */
+  (void *)&dpIasw.saveImagesCnt,  /* ID: 545 */
+  (void *)&dpIasw.SaveImages_pSaveTarget,  /* ID: 546 */
+  (void *)&dpIasw.SaveImages_pFbfInit,  /* ID: 547 */
+  (void *)&dpIasw.SaveImages_pFbfEnd,  /* ID: 548 */
+  (void *)&dpIasw.acqFullDropNode,  /* ID: 549 */
+  (void *)&dpIasw.acqFullDropCnt,  /* ID: 550 */
+  (void *)&dpIasw.AcqFullDrop_pExpTime,  /* ID: 551 */
+  (void *)&dpIasw.AcqFullDrop_pImageRep,  /* ID: 552 */
+  (void *)&dpIasw.acqFullDropT1,  /* ID: 553 */
+  (void *)&dpIasw.acqFullDropT2,  /* ID: 554 */
+  (void *)&dpIasw.calFullSnapNode,  /* ID: 555 */
+  (void *)&dpIasw.calFullSnapCnt,  /* ID: 556 */
+  (void *)&dpIasw.CalFullSnap_pExpTime,  /* ID: 557 */
+  (void *)&dpIasw.CalFullSnap_pImageRep,  /* ID: 558 */
+  (void *)&dpIasw.CalFullSnap_pNmbImages,  /* ID: 559 */
+  (void *)&dpIasw.CalFullSnap_pCentSel,  /* ID: 560 */
+  (void *)&dpIasw.calFullSnapT1,  /* ID: 561 */
+  (void *)&dpIasw.calFullSnapT2,  /* ID: 562 */
+  (void *)&dpIasw.SciWinNode,  /* ID: 563 */
+  (void *)&dpIasw.SciWinCnt,  /* ID: 564 */
+  (void *)&dpIasw.SciWin_pNmbImages,  /* ID: 565 */
+  (void *)&dpIasw.SciWin_pCcdRdMode,  /* ID: 566 */
+  (void *)&dpIasw.SciWin_pExpTime,  /* ID: 567 */
+  (void *)&dpIasw.SciWin_pImageRep,  /* ID: 568 */
+  (void *)&dpIasw.SciWin_pWinPosX,  /* ID: 569 */
+  (void *)&dpIasw.SciWin_pWinPosY,  /* ID: 570 */
+  (void *)&dpIasw.SciWin_pWinSizeX,  /* ID: 571 */
+  (void *)&dpIasw.SciWin_pWinSizeY,  /* ID: 572 */
+  (void *)&dpIasw.SciWin_pCentSel,  /* ID: 573 */
+  (void *)&dpIasw.sciWinT1,  /* ID: 574 */
+  (void *)&dpIasw.sciWinT2,  /* ID: 575 */
+  (void *)&dpIasw.fbfLoadNode,  /* ID: 576 */
+  (void *)&dpIasw.fbfLoadCnt,  /* ID: 577 */
+  (void *)&dpIasw.fbfSaveNode,  /* ID: 578 */
+  (void *)&dpIasw.fbfSaveCnt,  /* ID: 579 */
+  (void *)&dpIasw.FbfLoad_pFbfId,  /* ID: 580 */
+  (void *)&dpIasw.FbfLoad_pFbfNBlocks,  /* ID: 581 */
+  (void *)&dpIasw.FbfLoad_pFbfRamAreaId,  /* ID: 582 */
+  (void *)&dpIasw.FbfLoad_pFbfRamAddr,  /* ID: 583 */
+  (void *)&dpIasw.FbfSave_pFbfId,  /* ID: 584 */
+  (void *)&dpIasw.FbfSave_pFbfNBlocks,  /* ID: 585 */
+  (void *)&dpIasw.FbfSave_pFbfRamAreaId,  /* ID: 586 */
+  (void *)&dpIasw.FbfSave_pFbfRamAddr,  /* ID: 587 */
+  (void *)&dpIasw.fbfLoadBlockCounter,  /* ID: 588 */
+  (void *)&dpIasw.fbfSaveBlockCounter,  /* ID: 589 */
+  (void *)&dpIasw.transFbfToGrndNode,  /* ID: 590 */
+  (void *)&dpIasw.transFbfToGrndCnt,  /* ID: 591 */
+  (void *)&dpIasw.TransFbfToGrnd_pNmbFbf,  /* ID: 592 */
+  (void *)&dpIasw.TransFbfToGrnd_pFbfInit,  /* ID: 593 */
+  (void *)&dpIasw.TransFbfToGrnd_pFbfSize,  /* ID: 594 */
+  (void *)&dpIasw.nomSciNode,  /* ID: 595 */
+  (void *)&dpIasw.nomSciCnt,  /* ID: 596 */
+  (void *)&dpIasw.NomSci_pAcqFlag,  /* ID: 597 */
+  (void *)&dpIasw.NomSci_pCal1Flag,  /* ID: 598 */
+  (void *)&dpIasw.NomSci_pSciFlag,  /* ID: 599 */
+  (void *)&dpIasw.NomSci_pCal2Flag,  /* ID: 600 */
+  (void *)&dpIasw.NomSci_pCibNFull,  /* ID: 601 */
+  (void *)&dpIasw.NomSci_pCibSizeFull,  /* ID: 602 */
+  (void *)&dpIasw.NomSci_pSibNFull,  /* ID: 603 */
+  (void *)&dpIasw.NomSci_pSibSizeFull,  /* ID: 604 */
+  (void *)&dpIasw.NomSci_pGibNFull,  /* ID: 605 */
+  (void *)&dpIasw.NomSci_pGibSizeFull,  /* ID: 606 */
+  (void *)&dpIasw.NomSci_pSibNWin,  /* ID: 607 */
+  (void *)&dpIasw.NomSci_pSibSizeWin,  /* ID: 608 */
+  (void *)&dpIasw.NomSci_pCibNWin,  /* ID: 609 */
+  (void *)&dpIasw.NomSci_pCibSizeWin,  /* ID: 610 */
+  (void *)&dpIasw.NomSci_pGibNWin,  /* ID: 611 */
+  (void *)&dpIasw.NomSci_pGibSizeWin,  /* ID: 612 */
+  (void *)&dpIasw.NomSci_pExpTimeAcq,  /* ID: 613 */
+  (void *)&dpIasw.NomSci_pImageRepAcq,  /* ID: 614 */
+  (void *)&dpIasw.NomSci_pExpTimeCal1,  /* ID: 615 */
+  (void *)&dpIasw.NomSci_pImageRepCal1,  /* ID: 616 */
+  (void *)&dpIasw.NomSci_pNmbImagesCal1,  /* ID: 617 */
+  (void *)&dpIasw.NomSci_pCentSelCal1,  /* ID: 618 */
+  (void *)&dpIasw.NomSci_pNmbImagesSci,  /* ID: 619 */
+  (void *)&dpIasw.NomSci_pCcdRdModeSci,  /* ID: 620 */
+  (void *)&dpIasw.NomSci_pExpTimeSci,  /* ID: 621 */
+  (void *)&dpIasw.NomSci_pImageRepSci,  /* ID: 622 */
+  (void *)&dpIasw.NomSci_pWinPosXSci,  /* ID: 623 */
+  (void *)&dpIasw.NomSci_pWinPosYSci,  /* ID: 624 */
+  (void *)&dpIasw.NomSci_pWinSizeXSci,  /* ID: 625 */
+  (void *)&dpIasw.NomSci_pWinSizeYSci,  /* ID: 626 */
+  (void *)&dpIasw.NomSci_pCentSelSci,  /* ID: 627 */
+  (void *)&dpIasw.NomSci_pExpTimeCal2,  /* ID: 628 */
+  (void *)&dpIasw.NomSci_pImageRepCal2,  /* ID: 629 */
+  (void *)&dpIasw.NomSci_pNmbImagesCal2,  /* ID: 630 */
+  (void *)&dpIasw.NomSci_pCentSelCal2,  /* ID: 631 */
+  (void *)&dpIasw.NomSci_pSaveTarget,  /* ID: 632 */
+  (void *)&dpIasw.NomSci_pFbfInit,  /* ID: 633 */
+  (void *)&dpIasw.NomSci_pFbfEnd,  /* ID: 634 */
+  (void *)&dpIasw.NomSci_pStckOrderCal1,  /* ID: 635 */
+  (void *)&dpIasw.NomSci_pStckOrderSci,  /* ID: 636 */
+  (void *)&dpIasw.NomSci_pStckOrderCal2,  /* ID: 637 */
+  (void *)&dpIasw.ConfigSdb_pSdbCmd,  /* ID: 638 */
+  (void *)&dpIasw.ConfigSdb_pCibNFull,  /* ID: 639 */
+  (void *)&dpIasw.ConfigSdb_pCibSizeFull,  /* ID: 640 */
+  (void *)&dpIasw.ConfigSdb_pSibNFull,  /* ID: 641 */
+  (void *)&dpIasw.ConfigSdb_pSibSizeFull,  /* ID: 642 */
+  (void *)&dpIasw.ConfigSdb_pGibNFull,  /* ID: 643 */
+  (void *)&dpIasw.ConfigSdb_pGibSizeFull,  /* ID: 644 */
+  (void *)&dpIasw.ConfigSdb_pSibNWin,  /* ID: 645 */
+  (void *)&dpIasw.ConfigSdb_pSibSizeWin,  /* ID: 646 */
+  (void *)&dpIasw.ConfigSdb_pCibNWin,  /* ID: 647 */
+  (void *)&dpIasw.ConfigSdb_pCibSizeWin,  /* ID: 648 */
+  (void *)&dpIasw.ConfigSdb_pGibNWin,  /* ID: 649 */
+  (void *)&dpIasw.ConfigSdb_pGibSizeWin,  /* ID: 650 */
+  (void *)&dpIasw.ADC_P3V3,  /* ID: 651 */
+  (void *)&dpIasw.ADC_P5V,  /* ID: 652 */
+  (void *)&dpIasw.ADC_P1V8,  /* ID: 653 */
+  (void *)&dpIasw.ADC_P2V5,  /* ID: 654 */
+  (void *)&dpIasw.ADC_N5V,  /* ID: 655 */
+  (void *)&dpIasw.ADC_PGND,  /* ID: 656 */
+  (void *)&dpIasw.ADC_TEMPOH1A,  /* ID: 657 */
+  (void *)&dpIasw.ADC_TEMP1,  /* ID: 658 */
+  (void *)&dpIasw.ADC_TEMPOH2A,  /* ID: 659 */
+  (void *)&dpIasw.ADC_TEMPOH1B,  /* ID: 660 */
+  (void *)&dpIasw.ADC_TEMPOH3A,  /* ID: 661 */
+  (void *)&dpIasw.ADC_TEMPOH2B,  /* ID: 662 */
+  (void *)&dpIasw.ADC_TEMPOH4A,  /* ID: 663 */
+  (void *)&dpIasw.ADC_TEMPOH3B,  /* ID: 664 */
+  (void *)&dpIasw.ADC_TEMPOH4B,  /* ID: 665 */
+  (void *)&dpIasw.SEM_P15V,  /* ID: 666 */
+  (void *)&dpIasw.SEM_P30V,  /* ID: 667 */
+  (void *)&dpIasw.SEM_P5V0,  /* ID: 668 */
+  (void *)&dpIasw.SEM_P7V0,  /* ID: 669 */
+  (void *)&dpIasw.SEM_N5V0,  /* ID: 670 */
+  (void *)&dpIasw.ADC_P3V3_RAW,  /* ID: 671 */
+  (void *)&dpIasw.ADC_P5V_RAW,  /* ID: 672 */
+  (void *)&dpIasw.ADC_P1V8_RAW,  /* ID: 673 */
+  (void *)&dpIasw.ADC_P2V5_RAW,  /* ID: 674 */
+  (void *)&dpIasw.ADC_N5V_RAW,  /* ID: 675 */
+  (void *)&dpIasw.ADC_PGND_RAW,  /* ID: 676 */
+  (void *)&dpIasw.ADC_TEMPOH1A_RAW,  /* ID: 677 */
+  (void *)&dpIasw.ADC_TEMP1_RAW,  /* ID: 678 */
+  (void *)&dpIasw.ADC_TEMPOH2A_RAW,  /* ID: 679 */
+  (void *)&dpIasw.ADC_TEMPOH1B_RAW,  /* ID: 680 */
+  (void *)&dpIasw.ADC_TEMPOH3A_RAW,  /* ID: 681 */
+  (void *)&dpIasw.ADC_TEMPOH2B_RAW,  /* ID: 682 */
+  (void *)&dpIasw.ADC_TEMPOH4A_RAW,  /* ID: 683 */
+  (void *)&dpIasw.ADC_TEMPOH3B_RAW,  /* ID: 684 */
+  (void *)&dpIasw.ADC_TEMPOH4B_RAW,  /* ID: 685 */
+  (void *)&dpIasw.SEM_P15V_RAW,  /* ID: 686 */
+  (void *)&dpIasw.SEM_P30V_RAW,  /* ID: 687 */
+  (void *)&dpIasw.SEM_P5V0_RAW,  /* ID: 688 */
+  (void *)&dpIasw.SEM_P7V0_RAW,  /* ID: 689 */
+  (void *)&dpIasw.SEM_N5V0_RAW,  /* ID: 690 */
+  (void *)&dpIasw.ADC_P3V3_U,  /* ID: 691 */
+  (void *)&dpIasw.ADC_P5V_U,  /* ID: 692 */
+  (void *)&dpIasw.ADC_P1V8_U,  /* ID: 693 */
+  (void *)&dpIasw.ADC_P2V5_U,  /* ID: 694 */
+  (void *)&dpIasw.ADC_N5V_L,  /* ID: 695 */
+  (void *)&dpIasw.ADC_PGND_U,  /* ID: 696 */
+  (void *)&dpIasw.ADC_PGND_L,  /* ID: 697 */
+  (void *)&dpIasw.ADC_TEMPOH1A_U,  /* ID: 698 */
+  (void *)&dpIasw.ADC_TEMP1_U,  /* ID: 699 */
+  (void *)&dpIasw.ADC_TEMPOH2A_U,  /* ID: 700 */
+  (void *)&dpIasw.ADC_TEMPOH1B_U,  /* ID: 701 */
+  (void *)&dpIasw.ADC_TEMPOH3A_U,  /* ID: 702 */
+  (void *)&dpIasw.ADC_TEMPOH2B_U,  /* ID: 703 */
+  (void *)&dpIasw.ADC_TEMPOH4A_U,  /* ID: 704 */
+  (void *)&dpIasw.ADC_TEMPOH3B_U,  /* ID: 705 */
+  (void *)&dpIasw.ADC_TEMPOH4B_U,  /* ID: 706 */
+  (void *)&dpIasw.SEM_P15V_U,  /* ID: 707 */
+  (void *)&dpIasw.SEM_P30V_U,  /* ID: 708 */
+  (void *)&dpIasw.SEM_P5V0_U,  /* ID: 709 */
+  (void *)&dpIasw.SEM_P7V0_U,  /* ID: 710 */
+  (void *)&dpIasw.SEM_N5V0_L,  /* ID: 711 */
+  (void *)&dpIasw.HbSemPassword,  /* ID: 712 */
+  (void *)&dpIasw.HbSemCounter,  /* ID: 713 */
+  (void *)&dpIbsw.isWatchdogEnabled,  /* ID: 714 */
+  (void *)&dpIbsw.isSynchronized,  /* ID: 715 */
+  (void *)&dpIbsw.missedMsgCnt,  /* ID: 716 */
+  (void *)&dpIbsw.missedPulseCnt,  /* ID: 717 */
+  (void *)&dpIbsw.milFrameDelay,  /* ID: 718 */
+  (void *)&dpIbsw.EL1_CHIP,  /* ID: 719 */
+  (void *)&dpIbsw.EL2_CHIP,  /* ID: 720 */
+  (void *)&dpIbsw.EL1_ADDR,  /* ID: 721 */
+  (void *)&dpIbsw.EL2_ADDR,  /* ID: 722 */
+  (void *)&dpIbsw.ERR_LOG_ENB,  /* ID: 723 */
+  (void *)&dpIbsw.isErrLogValid,  /* ID: 724 */
+  (void *)&dpIbsw.nOfErrLogEntries,  /* ID: 725 */
+  (void *)&dpIasw.MAX_SEM_PCKT_CYC,  /* ID: 726 */
+  (void *)&dpIbsw.FBF_BLCK_WR_DUR,  /* ID: 727 */
+  (void *)&dpIbsw.FBF_BLCK_RD_DUR,  /* ID: 728 */
+  (void *)&dpIbsw.isFbfOpen,  /* ID: 729 */
+  (void *)&dpIbsw.isFbfValid,  /* ID: 730 */
+  (void *)&dpIbsw.FBF_ENB,  /* ID: 731 */
+  (void *)&dpIbsw.FBF_CHIP,  /* ID: 732 */
+  (void *)&dpIbsw.FBF_ADDR,  /* ID: 733 */
+  (void *)&dpIbsw.fbfNBlocks,  /* ID: 734 */
+  (void *)&dpIbsw.THR_MA_A_1,  /* ID: 735 */
+  (void *)&dpIbsw.THR_MA_A_2,  /* ID: 736 */
+  (void *)&dpIbsw.THR_MA_A_3,  /* ID: 737 */
+  (void *)&dpIbsw.THR_MA_A_4,  /* ID: 738 */
+  (void *)&dpIbsw.THR_MA_A_5,  /* ID: 739 */
+  (void *)&dpIbsw.wcet_1,  /* ID: 740 */
+  (void *)&dpIbsw.wcet_2,  /* ID: 741 */
+  (void *)&dpIbsw.wcet_3,  /* ID: 742 */
+  (void *)&dpIbsw.wcet_4,  /* ID: 743 */
+  (void *)&dpIbsw.wcet_5,  /* ID: 744 */
+  (void *)&dpIbsw.wcetAver_1,  /* ID: 745 */
+  (void *)&dpIbsw.wcetAver_2,  /* ID: 746 */
+  (void *)&dpIbsw.wcetAver_3,  /* ID: 747 */
+  (void *)&dpIbsw.wcetAver_4,  /* ID: 748 */
+  (void *)&dpIbsw.wcetAver_5,  /* ID: 749 */
+  (void *)&dpIbsw.wcetMax_1,  /* ID: 750 */
+  (void *)&dpIbsw.wcetMax_2,  /* ID: 751 */
+  (void *)&dpIbsw.wcetMax_3,  /* ID: 752 */
+  (void *)&dpIbsw.wcetMax_4,  /* ID: 753 */
+  (void *)&dpIbsw.wcetMax_5,  /* ID: 754 */
+  (void *)&dpIbsw.nOfNotif_1,  /* ID: 755 */
+  (void *)&dpIbsw.nOfNotif_2,  /* ID: 756 */
+  (void *)&dpIbsw.nOfNotif_3,  /* ID: 757 */
+  (void *)&dpIbsw.nOfNotif_4,  /* ID: 758 */
+  (void *)&dpIbsw.nOfNotif_5,  /* ID: 759 */
+  (void *)&dpIbsw.nofFuncExec_1,  /* ID: 760 */
+  (void *)&dpIbsw.nofFuncExec_2,  /* ID: 761 */
+  (void *)&dpIbsw.nofFuncExec_3,  /* ID: 762 */
+  (void *)&dpIbsw.nofFuncExec_4,  /* ID: 763 */
+  (void *)&dpIbsw.nofFuncExec_5,  /* ID: 764 */
+  (void *)&dpIbsw.wcetTimeStampFine_1,  /* ID: 765 */
+  (void *)&dpIbsw.wcetTimeStampFine_2,  /* ID: 766 */
+  (void *)&dpIbsw.wcetTimeStampFine_3,  /* ID: 767 */
+  (void *)&dpIbsw.wcetTimeStampFine_4,  /* ID: 768 */
+  (void *)&dpIbsw.wcetTimeStampFine_5,  /* ID: 769 */
+  (void *)&dpIbsw.wcetTimeStampCoarse_1,  /* ID: 770 */
+  (void *)&dpIbsw.wcetTimeStampCoarse_2,  /* ID: 771 */
+  (void *)&dpIbsw.wcetTimeStampCoarse_3,  /* ID: 772 */
+  (void *)&dpIbsw.wcetTimeStampCoarse_4,  /* ID: 773 */
+  (void *)&dpIbsw.wcetTimeStampCoarse_5,  /* ID: 774 */
+  (void *)&dpIbsw.flashContStepCnt,  /* ID: 775 */
+  (void *)&dpIbsw.OTA_TM1A_NOM,  /* ID: 776 */
+  (void *)&dpIbsw.OTA_TM1A_RED,  /* ID: 777 */
+  (void *)&dpIbsw.OTA_TM1B_NOM,  /* ID: 778 */
+  (void *)&dpIbsw.OTA_TM1B_RED,  /* ID: 779 */
+  (void *)&dpIbsw.OTA_TM2A_NOM,  /* ID: 780 */
+  (void *)&dpIbsw.OTA_TM2A_RED,  /* ID: 781 */
+  (void *)&dpIbsw.OTA_TM2B_NOM,  /* ID: 782 */
+  (void *)&dpIbsw.OTA_TM2B_RED,  /* ID: 783 */
+  (void *)&dpIbsw.OTA_TM3A_NOM,  /* ID: 784 */
+  (void *)&dpIbsw.OTA_TM3A_RED,  /* ID: 785 */
+  (void *)&dpIbsw.OTA_TM3B_NOM,  /* ID: 786 */
+  (void *)&dpIbsw.OTA_TM3B_RED,  /* ID: 787 */
+  (void *)&dpIbsw.OTA_TM4A_NOM,  /* ID: 788 */
+  (void *)&dpIbsw.OTA_TM4A_RED,  /* ID: 789 */
+  (void *)&dpIbsw.OTA_TM4B_NOM,  /* ID: 790 */
+  (void *)&dpIbsw.OTA_TM4B_RED,  /* ID: 791 */
+  (void *)&dpIbsw.Core0Load,  /* ID: 792 */
+  (void *)&dpIbsw.Core1Load,  /* ID: 793 */
+  (void *)&dpIbsw.InterruptRate,  /* ID: 794 */
+  (void *)&dpIbsw.CyclicalActivitiesCtr,  /* ID: 795 */
+  (void *)&dpIbsw.Uptime,  /* ID: 796 */
+  (void *)&dpIbsw.SemTick,  /* ID: 797 */
+  (void *)&dpIasw.SemPwrOnTimestamp,  /* ID: 798 */
+  (void *)&dpIasw.SemPwrOffTimestamp,  /* ID: 799 */
+  (void *)&dpIasw.IASW_EVT_CTR,  /* ID: 800 */
+  (void *)&dpIbsw.BAD_COPY_ID,  /* ID: 801 */
+  (void *)&dpIbsw.BAD_PASTE_ID,  /* ID: 802 */
+  (void *)&dpIbsw.ObcInputBufferPackets,  /* ID: 803 */
+  (void *)&dpIbsw.GrndInputBufferPackets,  /* ID: 804 */
+  (void *)&dpIbsw.MilBusBytesIn,  /* ID: 805 */
+  (void *)&dpIbsw.MilBusBytesOut,  /* ID: 806 */
+  (void *)&dpIbsw.MilBusDroppedBytes,  /* ID: 807 */
+  (void *)&dpIbsw.IRL1,  /* ID: 808 */
+  (void *)&dpIbsw.IRL1_AHBSTAT,  /* ID: 809 */
+  (void *)&dpIbsw.IRL1_GRGPIO_6,  /* ID: 810 */
+  (void *)&dpIbsw.IRL1_GRTIMER,  /* ID: 811 */
+  (void *)&dpIbsw.IRL1_GPTIMER_0,  /* ID: 812 */
+  (void *)&dpIbsw.IRL1_GPTIMER_1,  /* ID: 813 */
+  (void *)&dpIbsw.IRL1_GPTIMER_2,  /* ID: 814 */
+  (void *)&dpIbsw.IRL1_GPTIMER_3,  /* ID: 815 */
+  (void *)&dpIbsw.IRL1_IRQMP,  /* ID: 816 */
+  (void *)&dpIbsw.IRL1_B1553BRM,  /* ID: 817 */
+  (void *)&dpIbsw.IRL2,  /* ID: 818 */
+  (void *)&dpIbsw.IRL2_GRSPW2_0,  /* ID: 819 */
+  (void *)&dpIbsw.IRL2_GRSPW2_1,  /* ID: 820 */
+  (void *)&dpIbsw.SemRoute,  /* ID: 821 */
+  (void *)&dpIbsw.SpW0BytesIn,  /* ID: 822 */
+  (void *)&dpIbsw.SpW0BytesOut,  /* ID: 823 */
+  (void *)&dpIbsw.SpW1BytesIn,  /* ID: 824 */
+  (void *)&dpIbsw.SpW1BytesOut,  /* ID: 825 */
+  (void *)&dpIbsw.Spw0TxDescAvail,  /* ID: 826 */
+  (void *)&dpIbsw.Spw0RxPcktAvail,  /* ID: 827 */
+  (void *)&dpIbsw.Spw1TxDescAvail,  /* ID: 828 */
+  (void *)&dpIbsw.Spw1RxPcktAvail,  /* ID: 829 */
+  (void *)&dpIbsw.MilCucCoarseTime,  /* ID: 830 */
+  (void *)&dpIbsw.MilCucFineTime,  /* ID: 831 */
+  (void *)&dpIbsw.CucCoarseTime,  /* ID: 832 */
+  (void *)&dpIbsw.CucFineTime,  /* ID: 833 */
+  (void *)&dpIasw.Sram1ScrCurrAddr,  /* ID: 834 */
+  (void *)&dpIasw.Sram2ScrCurrAddr,  /* ID: 835 */
+  (void *)&dpIasw.Sram1ScrLength,  /* ID: 836 */
+  (void *)&dpIasw.Sram2ScrLength,  /* ID: 837 */
+  (void *)&dpIasw.EdacSingleRepaired,  /* ID: 838 */
+  (void *)&dpIasw.EdacSingleFaults,  /* ID: 839 */
+  (void *)&dpIasw.EdacLastSingleFail,  /* ID: 840 */
+  (void *)&dpIbsw.EdacDoubleFaults,  /* ID: 841 */
+  (void *)&dpIbsw.EdacDoubleFAddr,  /* ID: 842 */
+  (void *)&dpIasw.Cpu2ProcStatus,  /* ID: 843 */
+  (void *)&dpIbsw.HEARTBEAT_ENABLED,  /* ID: 844 */
+  (void *)&dpIbsw.S1AllocDbs,  /* ID: 845 */
+  (void *)&dpIbsw.S1AllocSw,  /* ID: 846 */
+  (void *)&dpIbsw.S1AllocHeap,  /* ID: 847 */
+  (void *)&dpIbsw.S1AllocFlash,  /* ID: 848 */
+  (void *)&dpIbsw.S1AllocAux,  /* ID: 849 */
+  (void *)&dpIbsw.S1AllocRes,  /* ID: 850 */
+  (void *)&dpIbsw.S1AllocSwap,  /* ID: 851 */
+  (void *)&dpIbsw.S2AllocSciHeap,  /* ID: 852 */
+  (void *)&dpIasw.TaAlgoId,  /* ID: 853 */
+  (void *)&dpIasw.TAACQALGOID,  /* ID: 854 */
+  (void *)&dpIasw.TASPARE32,  /* ID: 855 */
+  (void *)&dpIasw.TaTimingPar1,  /* ID: 856 */
+  (void *)&dpIasw.TaTimingPar2,  /* ID: 857 */
+  (void *)&dpIasw.TaDistanceThrd,  /* ID: 858 */
+  (void *)&dpIasw.TaIterations,  /* ID: 859 */
+  (void *)&dpIasw.TaRebinningFact,  /* ID: 860 */
+  (void *)&dpIasw.TaDetectionThrd,  /* ID: 861 */
+  (void *)&dpIasw.TaSeReducedExtr,  /* ID: 862 */
+  (void *)&dpIasw.TaSeReducedRadius,  /* ID: 863 */
+  (void *)&dpIasw.TaSeTolerance,  /* ID: 864 */
+  (void *)&dpIasw.TaMvaTolerance,  /* ID: 865 */
+  (void *)&dpIasw.TaAmaTolerance,  /* ID: 866 */
+  (void *)&dpIasw.TAPOINTUNCERT,  /* ID: 867 */
+  (void *)&dpIasw.TATARGETSIG,  /* ID: 868 */
+  (void *)&dpIasw.TANROFSTARS,  /* ID: 869 */
+  (void *)&dpIasw.TaMaxSigFract,  /* ID: 870 */
+  (void *)&dpIasw.TaBias,  /* ID: 871 */
+  (void *)&dpIasw.TaDark,  /* ID: 872 */
+  (void *)&dpIasw.TaSkyBg,  /* ID: 873 */
+  (void *)&dpIasw.COGBITS,  /* ID: 874 */
+  (void *)&dpIasw.CENT_MULT_X,  /* ID: 875 */
+  (void *)&dpIasw.CENT_MULT_Y,  /* ID: 876 */
+  (void *)&dpIasw.CENT_OFFSET_X,  /* ID: 877 */
+  (void *)&dpIasw.CENT_OFFSET_Y,  /* ID: 878 */
+  (void *)&dpIasw.CENT_MEDIANFILTER,  /* ID: 879 */
+  (void *)&dpIasw.CENT_DIM_X,  /* ID: 880 */
+  (void *)&dpIasw.CENT_DIM_Y,  /* ID: 881 */
+  (void *)&dpIasw.CENT_CHECKS,  /* ID: 882 */
+  (void *)&dpIasw.CEN_SIGMALIMIT,  /* ID: 883 */
+  (void *)&dpIasw.CEN_SIGNALLIMIT,  /* ID: 884 */
+  (void *)&dpIasw.CEN_MEDIAN_THRD,  /* ID: 885 */
+  (void *)&dpIasw.OPT_AXIS_X,  /* ID: 886 */
+  (void *)&dpIasw.OPT_AXIS_Y,  /* ID: 887 */
+  (void *)&dpIasw.DIST_CORR,  /* ID: 888 */
+  (void *)&dpIasw.pStckOrderSci,  /* ID: 889 */
+  (void *)&dpIasw.pWinSizeXSci,  /* ID: 890 */
+  (void *)&dpIasw.pWinSizeYSci,  /* ID: 891 */
+  (void *)&dpIasw.SdpImageAptShape,  /* ID: 892 */
+  (void *)&dpIasw.SdpImageAptX,  /* ID: 893 */
+  (void *)&dpIasw.SdpImageAptY,  /* ID: 894 */
+  (void *)&dpIasw.SdpImgttAptShape,  /* ID: 895 */
+  (void *)&dpIasw.SdpImgttAptX,  /* ID: 896 */
+  (void *)&dpIasw.SdpImgttAptY,  /* ID: 897 */
+  (void *)&dpIasw.SdpImgttStckOrder,  /* ID: 898 */
+  (void *)&dpIasw.SdpLosStckOrder,  /* ID: 899 */
+  (void *)&dpIasw.SdpLblkStckOrder,  /* ID: 900 */
+  (void *)&dpIasw.SdpLdkStckOrder,  /* ID: 901 */
+  (void *)&dpIasw.SdpRdkStckOrder,  /* ID: 902 */
+  (void *)&dpIasw.SdpRblkStckOrder,  /* ID: 903 */
+  (void *)&dpIasw.SdpTosStckOrder,  /* ID: 904 */
+  (void *)&dpIasw.SdpTdkStckOrder,  /* ID: 905 */
+  (void *)&dpIasw.SdpImgttStrat,  /* ID: 906 */
+  (void *)&dpIasw.Sdp3StatAmpl,  /* ID: 907 */
+  (void *)&dpIasw.SdpPhotStrat,  /* ID: 908 */
+  (void *)&dpIasw.SdpPhotRcent,  /* ID: 909 */
+  (void *)&dpIasw.SdpPhotRann1,  /* ID: 910 */
+  (void *)&dpIasw.SdpPhotRann2,  /* ID: 911 */
+  (void *)&dpIasw.SdpCrc,  /* ID: 912 */
+  (void *)&dpIasw.CCPRODUCT,  /* ID: 913 */
+  (void *)&dpIasw.CCSTEP,  /* ID: 914 */
+  (void *)&dpIasw.XIB_FAILURES,  /* ID: 915 */
+  (void *)&dpIasw.FEE_SIDE_A,  /* ID: 916 */
+  (void *)&dpIasw.FEE_SIDE_B,  /* ID: 917 */
+  (void *)&dpIasw.NLCBORDERS,  /* ID: 918 */
+  (void *)&dpIasw.NLCCOEFF_A,  /* ID: 919 */
+  (void *)&dpIasw.NLCCOEFF_B,  /* ID: 920 */
+  (void *)&dpIasw.NLCCOEFF_C,  /* ID: 921 */
+  (void *)&dpIasw.NLCCOEFF_D,  /* ID: 922 */
+  (void *)&dpIasw.SdpGlobalBias,  /* ID: 923 */
+  (void *)&dpIasw.BiasOrigin,  /* ID: 924 */
+  (void *)&dpIasw.SdpGlobalGain,  /* ID: 925 */
+  (void *)&dpIasw.SdpWinImageCeKey,  /* ID: 926 */
+  (void *)&dpIasw.SdpWinImgttCeKey,  /* ID: 927 */
+  (void *)&dpIasw.SdpWinHdrCeKey,  /* ID: 928 */
+  (void *)&dpIasw.SdpWinMLOSCeKey,  /* ID: 929 */
+  (void *)&dpIasw.SdpWinMLBLKCeKey,  /* ID: 930 */
+  (void *)&dpIasw.SdpWinMLDKCeKey,  /* ID: 931 */
+  (void *)&dpIasw.SdpWinMRDKCeKey,  /* ID: 932 */
+  (void *)&dpIasw.SdpWinMRBLKCeKey,  /* ID: 933 */
+  (void *)&dpIasw.SdpWinMTOSCeKey,  /* ID: 934 */
+  (void *)&dpIasw.SdpWinMTDKCeKey,  /* ID: 935 */
+  (void *)&dpIasw.SdpFullImgCeKey,  /* ID: 936 */
+  (void *)&dpIasw.SdpFullHdrCeKey,  /* ID: 937 */
+  (void *)&dpIasw.CE_Timetag_crs,  /* ID: 938 */
+  (void *)&dpIasw.CE_Timetag_fine,  /* ID: 939 */
+  (void *)&dpIasw.CE_Counter,  /* ID: 940 */
+  (void *)&dpIasw.CE_Version,  /* ID: 941 */
+  (void *)&dpIasw.CE_Integrity,  /* ID: 942 */
+  (void *)&dpIasw.CE_SemWindowPosX,  /* ID: 943 */
+  (void *)&dpIasw.CE_SemWindowPosY,  /* ID: 944 */
+  (void *)&dpIasw.CE_SemWindowSizeX,  /* ID: 945 */
+  (void *)&dpIasw.CE_SemWindowSizeY,  /* ID: 946 */
+  (void *)&dpIasw.SPILL_CTR,  /* ID: 947 */
+  (void *)&dpIasw.RZIP_ITER1,  /* ID: 948 */
+  (void *)&dpIasw.RZIP_ITER2,  /* ID: 949 */
+  (void *)&dpIasw.RZIP_ITER3,  /* ID: 950 */
+  (void *)&dpIasw.RZIP_ITER4,  /* ID: 951 */
+  (void *)&dpIasw.SdpLdkColMask,  /* ID: 952 */
+  (void *)&dpIasw.SdpRdkColMask,  /* ID: 953 */
+  (void *)&dpIbsw.FPGA_Version,  /* ID: 954 */
+  (void *)&dpIbsw.FPGA_DPU_Status,  /* ID: 955 */
+  (void *)&dpIbsw.FPGA_DPU_Address,  /* ID: 956 */
+  (void *)&dpIbsw.FPGA_RESET_Status,  /* ID: 957 */
+  (void *)&dpIbsw.FPGA_SEM_Status,  /* ID: 958 */
+  (void *)&dpIbsw.FPGA_Oper_Heater_Status,  /* ID: 959 */
+  (void *)&dpIasw.GIBTOTRANSFER,  /* ID: 960 */
+  (void *)&dpIasw.TRANSFERMODE,  /* ID: 961 */
+  (void *)&dpIasw.S2TOTRANSFERSIZE,  /* ID: 962 */
+  (void *)&dpIasw.S4TOTRANSFERSIZE,  /* ID: 963 */
+  (void *)&dpIasw.TransferComplete,  /* ID: 964 */
+  (void *)&dpIasw.NLCBORDERS_2,  /* ID: 965 */
+  (void *)&dpIasw.NLCCOEFF_A_2,  /* ID: 966 */
+  (void *)&dpIasw.NLCCOEFF_B_2,  /* ID: 967 */
+  (void *)&dpIasw.NLCCOEFF_C_2,  /* ID: 968 */
+  (void *)&dpIasw.RF100,  /* ID: 969 */
+  (void *)&dpIasw.RF230,  /* ID: 970 */
+  (void *)&dpIasw.distc1,  /* ID: 971 */
+  (void *)&dpIasw.distc2,  /* ID: 972 */
+  (void *)&dpIasw.distc3,  /* ID: 973 */
+  (void *)&dpIasw.SPARE_UI_0,  /* ID: 974 */
+  (void *)&dpIasw.SPARE_UI_1,  /* ID: 975 */
+  (void *)&dpIasw.SPARE_UI_2,  /* ID: 976 */
+  (void *)&dpIasw.SPARE_UI_3,  /* ID: 977 */
+  (void *)&dpIasw.SPARE_UI_4,  /* ID: 978 */
+  (void *)&dpIasw.SPARE_UI_5,  /* ID: 979 */
+  (void *)&dpIasw.SPARE_UI_6,  /* ID: 980 */
+  (void *)&dpIasw.SPARE_UI_7,  /* ID: 981 */
+  (void *)&dpIasw.SPARE_UI_8,  /* ID: 982 */
+  (void *)&dpIasw.SPARE_UI_9,  /* ID: 983 */
+  (void *)&dpIasw.SPARE_UI_10,  /* ID: 984 */
+  (void *)&dpIasw.SPARE_UI_11,  /* ID: 985 */
+  (void *)&dpIasw.SPARE_UI_12,  /* ID: 986 */
+  (void *)&dpIasw.SPARE_UI_13,  /* ID: 987 */
+  (void *)&dpIasw.SPARE_UI_14,  /* ID: 988 */
+  (void *)&dpIasw.SPARE_UI_15,  /* ID: 989 */
+  (void *)&dpIasw.SPARE_F_0,  /* ID: 990 */
+  (void *)&dpIasw.SPARE_F_1,  /* ID: 991 */
+  (void *)&dpIasw.SPARE_F_2,  /* ID: 992 */
+  (void *)&dpIasw.SPARE_F_3,  /* ID: 993 */
+  (void *)&dpIasw.SPARE_F_4,  /* ID: 994 */
+  (void *)&dpIasw.SPARE_F_5,  /* ID: 995 */
+  (void *)&dpIasw.SPARE_F_6,  /* ID: 996 */
+  (void *)&dpIasw.SPARE_F_7,  /* ID: 997 */
+  (void *)&dpIasw.SPARE_F_8,  /* ID: 998 */
+  (void *)&dpIasw.SPARE_F_9,  /* ID: 999 */
+  (void *)&dpIasw.SPARE_F_10,  /* ID: 1000 */
+  (void *)&dpIasw.SPARE_F_11,  /* ID: 1001 */
+  (void *)&dpIasw.SPARE_F_12,  /* ID: 1002 */
+  (void *)&dpIasw.SPARE_F_13,  /* ID: 1003 */
+  (void *)&dpIasw.SPARE_F_14,  /* ID: 1004 */
+  (void *)&dpIasw.SPARE_F_15,  /* ID: 1005 */
+};
+
+/**
+ * Multiplicity of data items.
+ */
+static unsigned int dataPoolMult[1006] = { 
+  0,  /* ID: 0, unused */
+  1,  /* ID: 1, type: uint, name: buildNumber */
+  1,  /* ID: 2, type: uchar, name: AppErrCode */
+  1,  /* ID: 3, type: uchar, name: NofAllocatedInRep */
+  1,  /* ID: 4, type: uchar, name: MaxNOfInRep */
+  1,  /* ID: 5, type: uchar, name: NofAllocatedInCmd */
+  1,  /* ID: 6, type: uchar, name: MaxNOfInCmd */
+  1,  /* ID: 7, type: uchar, name: Sem_NOfPendingInCmp */
+  1,  /* ID: 8, type: uchar, name: Sem_PCRLSize */
+  1,  /* ID: 9, type: uchar, name: Sem_NOfLoadedInCmp */
+  1,  /* ID: 10, type: uchar, name: GrdObc_NOfPendingInCmp */
+  1,  /* ID: 11, type: uchar, name: GrdObc_PCRLSize */
+  1,  /* ID: 12, type: uchar, name: NOfAllocatedOutCmp */
+  1,  /* ID: 13, type: uchar, name: MaxNOfOutCmp */
+  1,  /* ID: 14, type: ushort, name: NOfInstanceId */
+  1,  /* ID: 15, type: uchar, name: OutMg1_NOfPendingOutCmp */
+  1,  /* ID: 16, type: uchar, name: OutMg1_POCLSize */
+  1,  /* ID: 17, type: ushort, name: OutMg1_NOfLoadedOutCmp */
+  1,  /* ID: 18, type: uchar, name: OutMg2_NOfPendingOutCmp */
+  1,  /* ID: 19, type: uchar, name: OutMg2_POCLSize */
+  1,  /* ID: 20, type: ushort, name: OutMg2_NOfLoadedOutCmp */
+  1,  /* ID: 21, type: uchar, name: OutMg3_NOfPendingOutCmp */
+  1,  /* ID: 22, type: uchar, name: OutMg3_POCLSize */
+  1,  /* ID: 23, type: ushort, name: OutMg3_NOfLoadedOutCmp */
+  1,  /* ID: 24, type: uint, name: InSem_SeqCnt */
+  1,  /* ID: 25, type: ushort, name: InSem_NOfPendingPckts */
+  1,  /* ID: 26, type: uchar, name: InSem_NOfGroups */
+  1,  /* ID: 27, type: uchar, name: InSem_PcktQueueSize */
+  1,  /* ID: 28, type: uchar, name: InSem_Src */
+  1,  /* ID: 29, type: uchar, name: InObc_NOfPendingPckts */
+  1,  /* ID: 30, type: uchar, name: InObc_NOfGroups */
+  1,  /* ID: 31, type: uchar, name: InObc_PcktQueueSize */
+  1,  /* ID: 32, type: uchar, name: InObc_Src */
+  1,  /* ID: 33, type: uchar, name: InGrd_NOfPendingPckts */
+  1,  /* ID: 34, type: uchar, name: InGrd_NOfGroups */
+  1,  /* ID: 35, type: uchar, name: InGrd_PcktQueueSize */
+  1,  /* ID: 36, type: uchar, name: InGrd_Src */
+  1,  /* ID: 37, type: uchar, name: OutSem_Dest */
+  1,  /* ID: 38, type: uint, name: OutSem_SeqCnt */
+  1,  /* ID: 39, type: uchar, name: OutSem_NOfPendingPckts */
+  1,  /* ID: 40, type: uchar, name: OutSem_NOfGroups */
+  1,  /* ID: 41, type: uchar, name: OutSem_PcktQueueSize */
+  1,  /* ID: 42, type: uchar, name: OutObc_Dest */
+  1,  /* ID: 43, type: uint, name: OutObc_SeqCnt_Group0 */
+  1,  /* ID: 44, type: uint, name: OutObc_SeqCnt_Group1 */
+  1,  /* ID: 45, type: uchar, name: OutObc_NOfPendingPckts */
+  1,  /* ID: 46, type: uchar, name: OutObc_NOfGroups */
+  1,  /* ID: 47, type: uchar, name: OutObc_PcktQueueSize */
+  1,  /* ID: 48, type: uchar, name: OutGrd_Dest */
+  1,  /* ID: 49, type: uint, name: OutGrd_SeqCnt_Group0 */
+  1,  /* ID: 50, type: uint, name: OutGrd_SeqCnt_Group1 */
+  1,  /* ID: 51, type: uint, name: OutGrd_SeqCnt_Group2 */
+  1,  /* ID: 52, type: uchar, name: OutGrd_NOfPendingPckts */
+  1,  /* ID: 53, type: uchar, name: OutGrd_NOfGroups */
+  1,  /* ID: 54, type: uchar, name: OutGrd_PcktQueueSize */
+  1,  /* ID: 55, type: ushort, name: sibNFull */
+  1,  /* ID: 56, type: ushort, name: cibNFull */
+  1,  /* ID: 57, type: ushort, name: gibNFull */
+  1,  /* ID: 58, type: ushort, name: sibNWin */
+  1,  /* ID: 59, type: ushort, name: cibNWin */
+  1,  /* ID: 60, type: ushort, name: gibNWin */
+  1,  /* ID: 61, type: ushort, name: sibSizeFull */
+  1,  /* ID: 62, type: ushort, name: cibSizeFull */
+  1,  /* ID: 63, type: ushort, name: gibSizeFull */
+  1,  /* ID: 64, type: ushort, name: sibSizeWin */
+  1,  /* ID: 65, type: ushort, name: cibSizeWin */
+  1,  /* ID: 66, type: ushort, name: gibSizeWin */
+  1,  /* ID: 67, type: ushort, name: sibIn */
+  1,  /* ID: 68, type: ushort, name: sibOut */
+  1,  /* ID: 69, type: ushort, name: cibIn */
+  1,  /* ID: 70, type: ushort, name: gibIn */
+  1,  /* ID: 71, type: ushort, name: gibOut */
+  1,  /* ID: 72, type: enum, name: sdbState */
+  1,  /* ID: 73, type: uint, name: sdbStateCnt */
+  1,  /* ID: 74, type: int, name: OffsetX */
+  1,  /* ID: 75, type: int, name: OffsetY */
+  1,  /* ID: 76, type: int, name: TargetLocationX */
+  1,  /* ID: 77, type: int, name: TargetLocationY */
+  1,  /* ID: 78, type: uint, name: IntegStartTimeCrs */
+  1,  /* ID: 79, type: ushort, name: IntegStartTimeFine */
+  1,  /* ID: 80, type: uint, name: IntegEndTimeCrs */
+  1,  /* ID: 81, type: ushort, name: IntegEndTimeFine */
+  1,  /* ID: 82, type: ushort, name: DataCadence */
+  1,  /* ID: 83, type: char, name: ValidityStatus */
+  1,  /* ID: 84, type: ushort, name: NOfTcAcc */
+  1,  /* ID: 85, type: ushort, name: NOfAccFailedTc */
+  1,  /* ID: 86, type: ushort, name: SeqCntLastAccTcFromObc */
+  1,  /* ID: 87, type: ushort, name: SeqCntLastAccTcFromGrd */
+  1,  /* ID: 88, type: ushort, name: SeqCntLastAccFailTc */
+  1,  /* ID: 89, type: ushort, name: NOfStartFailedTc */
+  1,  /* ID: 90, type: ushort, name: SeqCntLastStartFailTc */
+  1,  /* ID: 91, type: ushort, name: NOfTcTerm */
+  1,  /* ID: 92, type: ushort, name: NOfTermFailedTc */
+  1,  /* ID: 93, type: ushort, name: SeqCntLastTermFailTc */
+  10,  /* ID: 94, type: uchar, name: RdlSidList */
+  10,  /* ID: 95, type: bool, name: isRdlFree */
+  10,  /* ID: 96, type: uint, name: RdlCycCntList */
+  10,  /* ID: 97, type: uint, name: RdlPeriodList */
+  10,  /* ID: 98, type: bool, name: RdlEnabledList */
+  10,  /* ID: 99, type: ushort, name: RdlDestList */
+  250,  /* ID: 100, type: ushort, name: RdlDataItemList_0 */
+  250,  /* ID: 101, type: ushort, name: RdlDataItemList_1 */
+  250,  /* ID: 102, type: ushort, name: RdlDataItemList_2 */
+  250,  /* ID: 103, type: ushort, name: RdlDataItemList_3 */
+  250,  /* ID: 104, type: ushort, name: RdlDataItemList_4 */
+  250,  /* ID: 105, type: ushort, name: RdlDataItemList_5 */
+  250,  /* ID: 106, type: ushort, name: RdlDataItemList_6 */
+  250,  /* ID: 107, type: ushort, name: RdlDataItemList_7 */
+  250,  /* ID: 108, type: ushort, name: RdlDataItemList_8 */
+  250,  /* ID: 109, type: ushort, name: RdlDataItemList_9 */
+  20,  /* ID: 110, type: uint, name: DEBUG_VAR */
+  20,  /* ID: 111, type: uint, name: DEBUG_VAR_ADDR */
+  1,  /* ID: 112, type: uchar, name: EVTFILTERDEF */
+  60,  /* ID: 113, type: uchar, name: evtEnabledList */
+  1,  /* ID: 114, type: uint, name: lastPatchedAddr */
+  1,  /* ID: 115, type: uint, name: lastDumpAddr */
+  1,  /* ID: 116, type: enum, name: sdu2State */
+  1,  /* ID: 117, type: enum, name: sdu4State */
+  1,  /* ID: 118, type: uint, name: sdu2StateCnt */
+  1,  /* ID: 119, type: uint, name: sdu4StateCnt */
+  1,  /* ID: 120, type: ushort, name: sdu2BlockCnt */
+  1,  /* ID: 121, type: ushort, name: sdu4BlockCnt */
+  1,  /* ID: 122, type: uint, name: sdu2RemSize */
+  1,  /* ID: 123, type: uint, name: sdu4RemSize */
+  1,  /* ID: 124, type: uint, name: sdu2DownTransferSize */
+  1,  /* ID: 125, type: uint, name: sdu4DownTransferSize */
+  1,  /* ID: 126, type: uint, name: sdsCounter */
+  1,  /* ID: 127, type: bool, name: FdGlbEnable */
+  1,  /* ID: 128, type: bool, name: RpGlbEnable */
+  1,  /* ID: 129, type: enum, name: FdCheckTTMState */
+  1,  /* ID: 130, type: bool, name: FdCheckTTMIntEn */
+  1,  /* ID: 131, type: bool, name: FdCheckTTMExtEn */
+  1,  /* ID: 132, type: bool, name: RpTTMIntEn */
+  1,  /* ID: 133, type: bool, name: RpTTMExtEn */
+  1,  /* ID: 134, type: ushort, name: FdCheckTTMCnt */
+  1,  /* ID: 135, type: ushort, name: FdCheckTTMSpCnt */
+  1,  /* ID: 136, type: ushort, name: FdCheckTTMCntThr */
+  1,  /* ID: 137, type: float, name: TTC_LL */
+  1,  /* ID: 138, type: float, name: TTC_UL */
+  1,  /* ID: 139, type: float, name: TTM_LIM */
+  1,  /* ID: 140, type: enum, name: FdCheckSDSCState */
+  1,  /* ID: 141, type: bool, name: FdCheckSDSCIntEn */
+  1,  /* ID: 142, type: bool, name: FdCheckSDSCExtEn */
+  1,  /* ID: 143, type: bool, name: RpSDSCIntEn */
+  1,  /* ID: 144, type: bool, name: RpSDSCExtEn */
+  1,  /* ID: 145, type: ushort, name: FdCheckSDSCCnt */
+  1,  /* ID: 146, type: ushort, name: FdCheckSDSCSpCnt */
+  1,  /* ID: 147, type: ushort, name: FdCheckSDSCCntThr */
+  1,  /* ID: 148, type: enum, name: FdCheckComErrState */
+  1,  /* ID: 149, type: bool, name: FdCheckComErrIntEn */
+  1,  /* ID: 150, type: bool, name: FdCheckComErrExtEn */
+  1,  /* ID: 151, type: bool, name: RpComErrIntEn */
+  1,  /* ID: 152, type: bool, name: RpComErrExtEn */
+  1,  /* ID: 153, type: ushort, name: FdCheckComErrCnt */
+  1,  /* ID: 154, type: ushort, name: FdCheckComErrSpCnt */
+  1,  /* ID: 155, type: ushort, name: FdCheckComErrCntThr */
+  1,  /* ID: 156, type: enum, name: FdCheckTimeOutState */
+  1,  /* ID: 157, type: bool, name: FdCheckTimeOutIntEn */
+  1,  /* ID: 158, type: bool, name: FdCheckTimeOutExtEn */
+  1,  /* ID: 159, type: bool, name: RpTimeOutIntEn */
+  1,  /* ID: 160, type: bool, name: RpTimeOutExtEn */
+  1,  /* ID: 161, type: ushort, name: FdCheckTimeOutCnt */
+  1,  /* ID: 162, type: ushort, name: FdCheckTimeOutSpCnt */
+  1,  /* ID: 163, type: ushort, name: FdCheckTimeOutCntThr */
+  1,  /* ID: 164, type: uint, name: SEM_TO_POWERON */
+  1,  /* ID: 165, type: uint, name: SEM_TO_SAFE */
+  1,  /* ID: 166, type: uint, name: SEM_TO_STAB */
+  1,  /* ID: 167, type: uint, name: SEM_TO_TEMP */
+  1,  /* ID: 168, type: uint, name: SEM_TO_CCD */
+  1,  /* ID: 169, type: uint, name: SEM_TO_DIAG */
+  1,  /* ID: 170, type: uint, name: SEM_TO_STANDBY */
+  1,  /* ID: 171, type: enum, name: FdCheckSafeModeState */
+  1,  /* ID: 172, type: bool, name: FdCheckSafeModeIntEn */
+  1,  /* ID: 173, type: bool, name: FdCheckSafeModeExtEn */
+  1,  /* ID: 174, type: bool, name: RpSafeModeIntEn */
+  1,  /* ID: 175, type: bool, name: RpSafeModeExtEn */
+  1,  /* ID: 176, type: ushort, name: FdCheckSafeModeCnt */
+  1,  /* ID: 177, type: ushort, name: FdCheckSafeModeSpCnt */
+  1,  /* ID: 178, type: ushort, name: FdCheckSafeModeCntThr */
+  1,  /* ID: 179, type: enum, name: FdCheckAliveState */
+  1,  /* ID: 180, type: bool, name: FdCheckAliveIntEn */
+  1,  /* ID: 181, type: bool, name: FdCheckAliveExtEn */
+  1,  /* ID: 182, type: bool, name: RpAliveIntEn */
+  1,  /* ID: 183, type: bool, name: RpAliveExtEn */
+  1,  /* ID: 184, type: ushort, name: FdCheckAliveCnt */
+  1,  /* ID: 185, type: ushort, name: FdCheckAliveSpCnt */
+  1,  /* ID: 186, type: ushort, name: FdCheckAliveCntThr */
+  1,  /* ID: 187, type: ushort, name: SEM_HK_DEF_PER */
+  1,  /* ID: 188, type: ushort, name: SEMALIVE_DELAYEDSEMHK */
+  1,  /* ID: 189, type: enum, name: FdCheckSemAnoEvtState */
+  1,  /* ID: 190, type: bool, name: FdCheckSemAnoEvtIntEn */
+  1,  /* ID: 191, type: bool, name: FdCheckSemAnoEvtExtEn */
+  1,  /* ID: 192, type: bool, name: RpSemAnoEvtIntEn */
+  1,  /* ID: 193, type: bool, name: RpSemAnoEvtExtEn */
+  1,  /* ID: 194, type: ushort, name: FdCheckSemAnoEvtCnt */
+  1,  /* ID: 195, type: ushort, name: FdCheckSemAnoEvtSpCnt */
+  1,  /* ID: 196, type: ushort, name: FdCheckSemAnoEvtCntThr */
+  1,  /* ID: 197, type: enum, name: semAnoEvtResp_1 */
+  1,  /* ID: 198, type: enum, name: semAnoEvtResp_2 */
+  1,  /* ID: 199, type: enum, name: semAnoEvtResp_3 */
+  1,  /* ID: 200, type: enum, name: semAnoEvtResp_4 */
+  1,  /* ID: 201, type: enum, name: semAnoEvtResp_5 */
+  1,  /* ID: 202, type: enum, name: semAnoEvtResp_6 */
+  1,  /* ID: 203, type: enum, name: semAnoEvtResp_7 */
+  1,  /* ID: 204, type: enum, name: semAnoEvtResp_8 */
+  1,  /* ID: 205, type: enum, name: semAnoEvtResp_9 */
+  1,  /* ID: 206, type: enum, name: semAnoEvtResp_10 */
+  1,  /* ID: 207, type: enum, name: semAnoEvtResp_11 */
+  1,  /* ID: 208, type: enum, name: semAnoEvtResp_12 */
+  1,  /* ID: 209, type: enum, name: semAnoEvtResp_13 */
+  1,  /* ID: 210, type: enum, name: semAnoEvtResp_14 */
+  1,  /* ID: 211, type: enum, name: semAnoEvtResp_15 */
+  1,  /* ID: 212, type: enum, name: semAnoEvtResp_16 */
+  1,  /* ID: 213, type: enum, name: semAnoEvtResp_17 */
+  1,  /* ID: 214, type: enum, name: semAnoEvtResp_18 */
+  1,  /* ID: 215, type: enum, name: semAnoEvtResp_19 */
+  1,  /* ID: 216, type: enum, name: semAnoEvtResp_20 */
+  1,  /* ID: 217, type: enum, name: semAnoEvtResp_21 */
+  1,  /* ID: 218, type: enum, name: semAnoEvtResp_22 */
+  1,  /* ID: 219, type: enum, name: semAnoEvtResp_23 */
+  1,  /* ID: 220, type: enum, name: semAnoEvtResp_24 */
+  1,  /* ID: 221, type: enum, name: semAnoEvtResp_25 */
+  1,  /* ID: 222, type: enum, name: semAnoEvtResp_26 */
+  1,  /* ID: 223, type: enum, name: semAnoEvtResp_27 */
+  1,  /* ID: 224, type: enum, name: semAnoEvtResp_28 */
+  1,  /* ID: 225, type: enum, name: semAnoEvtResp_29 */
+  1,  /* ID: 226, type: enum, name: FdCheckSemLimitState */
+  1,  /* ID: 227, type: bool, name: FdCheckSemLimitIntEn */
+  1,  /* ID: 228, type: bool, name: FdCheckSemLimitExtEn */
+  1,  /* ID: 229, type: bool, name: RpSemLimitIntEn */
+  1,  /* ID: 230, type: bool, name: RpSemLimitExtEn */
+  1,  /* ID: 231, type: ushort, name: FdCheckSemLimitCnt */
+  1,  /* ID: 232, type: ushort, name: FdCheckSemLimitSpCnt */
+  1,  /* ID: 233, type: ushort, name: FdCheckSemLimitCntThr */
+  1,  /* ID: 234, type: ushort, name: SEM_LIM_DEL_T */
+  1,  /* ID: 235, type: enum, name: FdCheckDpuHkState */
+  1,  /* ID: 236, type: bool, name: FdCheckDpuHkIntEn */
+  1,  /* ID: 237, type: bool, name: FdCheckDpuHkExtEn */
+  1,  /* ID: 238, type: bool, name: RpDpuHkIntEn */
+  1,  /* ID: 239, type: bool, name: RpDpuHkExtEn */
+  1,  /* ID: 240, type: ushort, name: FdCheckDpuHkCnt */
+  1,  /* ID: 241, type: ushort, name: FdCheckDpuHkSpCnt */
+  1,  /* ID: 242, type: ushort, name: FdCheckDpuHkCntThr */
+  1,  /* ID: 243, type: enum, name: FdCheckCentConsState */
+  1,  /* ID: 244, type: bool, name: FdCheckCentConsIntEn */
+  1,  /* ID: 245, type: bool, name: FdCheckCentConsExtEn */
+  1,  /* ID: 246, type: bool, name: RpCentConsIntEn */
+  1,  /* ID: 247, type: bool, name: RpCentConsExtEn */
+  1,  /* ID: 248, type: ushort, name: FdCheckCentConsCnt */
+  1,  /* ID: 249, type: ushort, name: FdCheckCentConsSpCnt */
+  1,  /* ID: 250, type: ushort, name: FdCheckCentConsCntThr */
+  1,  /* ID: 251, type: enum, name: FdCheckResState */
+  1,  /* ID: 252, type: bool, name: FdCheckResIntEn */
+  1,  /* ID: 253, type: bool, name: FdCheckResExtEn */
+  1,  /* ID: 254, type: bool, name: RpResIntEn */
+  1,  /* ID: 255, type: bool, name: RpResExtEn */
+  1,  /* ID: 256, type: ushort, name: FdCheckResCnt */
+  1,  /* ID: 257, type: ushort, name: FdCheckResSpCnt */
+  1,  /* ID: 258, type: ushort, name: FdCheckResCntThr */
+  1,  /* ID: 259, type: float, name: CPU1_USAGE_MAX */
+  1,  /* ID: 260, type: float, name: MEM_USAGE_MAX */
+  1,  /* ID: 261, type: enum, name: FdCheckSemCons */
+  1,  /* ID: 262, type: bool, name: FdCheckSemConsIntEn */
+  1,  /* ID: 263, type: bool, name: FdCheckSemConsExtEn */
+  1,  /* ID: 264, type: bool, name: RpSemConsIntEn */
+  1,  /* ID: 265, type: bool, name: RpSemConsExtEn */
+  1,  /* ID: 266, type: ushort, name: FdCheckSemConsCnt */
+  1,  /* ID: 267, type: ushort, name: FdCheckSemConsSpCnt */
+  1,  /* ID: 268, type: ushort, name: FdCheckSemConsCntThr */
+  1,  /* ID: 269, type: enum, name: semState */
+  1,  /* ID: 270, type: enum, name: semOperState */
+  1,  /* ID: 271, type: uint, name: semStateCnt */
+  1,  /* ID: 272, type: uint, name: semOperStateCnt */
+  1,  /* ID: 273, type: uint, name: imageCycleCnt */
+  1,  /* ID: 274, type: uint, name: acqImageCnt */
+  1,  /* ID: 275, type: enum, name: sciSubMode */
+  1,  /* ID: 276, type: bool, name: LastSemPckt */
+  1,  /* ID: 277, type: uchar, name: SEM_ON_CODE */
+  1,  /* ID: 278, type: uchar, name: SEM_OFF_CODE */
+  1,  /* ID: 279, type: ushort, name: SEM_INIT_T1 */
+  1,  /* ID: 280, type: ushort, name: SEM_INIT_T2 */
+  1,  /* ID: 281, type: ushort, name: SEM_OPER_T1 */
+  1,  /* ID: 282, type: ushort, name: SEM_SHUTDOWN_T1 */
+  1,  /* ID: 283, type: ushort, name: SEM_SHUTDOWN_T11 */
+  1,  /* ID: 284, type: ushort, name: SEM_SHUTDOWN_T12 */
+  1,  /* ID: 285, type: ushort, name: SEM_SHUTDOWN_T2 */
+  1,  /* ID: 286, type: enum, name: iaswState */
+  1,  /* ID: 287, type: uint, name: iaswStateCnt */
+  1,  /* ID: 288, type: uint, name: iaswCycleCnt */
+  1,  /* ID: 289, type: enum, name: prepScienceNode */
+  1,  /* ID: 290, type: uint, name: prepScienceCnt */
+  1,  /* ID: 291, type: enum, name: controlledSwitchOffNode */
+  1,  /* ID: 292, type: uint, name: controlledSwitchOffCnt */
+  1,  /* ID: 293, type: ushort, name: CTRLD_SWITCH_OFF_T1 */
+  1,  /* ID: 294, type: enum, name: algoCent0State */
+  1,  /* ID: 295, type: uint, name: algoCent0Cnt */
+  1,  /* ID: 296, type: bool, name: algoCent0Enabled */
+  1,  /* ID: 297, type: enum, name: algoCent1State */
+  1,  /* ID: 298, type: uint, name: algoCent1Cnt */
+  1,  /* ID: 299, type: bool, name: algoCent1Enabled */
+  1,  /* ID: 300, type: uint, name: CENT_EXEC_PHASE */
+  1,  /* ID: 301, type: enum, name: algoAcq1State */
+  1,  /* ID: 302, type: uint, name: algoAcq1Cnt */
+  1,  /* ID: 303, type: bool, name: algoAcq1Enabled */
+  1,  /* ID: 304, type: ushort, name: ACQ_PH */
+  1,  /* ID: 305, type: enum, name: algoCcState */
+  1,  /* ID: 306, type: uint, name: algoCcCnt */
+  1,  /* ID: 307, type: bool, name: algoCcEnabled */
+  1,  /* ID: 308, type: ushort, name: STCK_ORDER */
+  1,  /* ID: 309, type: enum, name: algoTTC1State */
+  1,  /* ID: 310, type: uint, name: algoTTC1Cnt */
+  1,  /* ID: 311, type: bool, name: algoTTC1Enabled */
+  1,  /* ID: 312, type: uint, name: TTC1_EXEC_PHASE */
+  1,  /* ID: 313, type: int, name: TTC1_EXEC_PER */
+  1,  /* ID: 314, type: float, name: TTC1_LL_FRT */
+  1,  /* ID: 315, type: float, name: TTC1_LL_AFT */
+  1,  /* ID: 316, type: float, name: TTC1_UL_FRT */
+  1,  /* ID: 317, type: float, name: TTC1_UL_AFT */
+  1,  /* ID: 318, type: float, name: ttc1AvTempAft */
+  1,  /* ID: 319, type: float, name: ttc1AvTempFrt */
+  1,  /* ID: 320, type: enum, name: algoTTC2State */
+  1,  /* ID: 321, type: uint, name: algoTTC2Cnt */
+  1,  /* ID: 322, type: bool, name: algoTTC2Enabled */
+  1,  /* ID: 323, type: int, name: TTC2_EXEC_PER */
+  1,  /* ID: 324, type: float, name: TTC2_REF_TEMP */
+  1,  /* ID: 325, type: float, name: TTC2_OFFSETA */
+  1,  /* ID: 326, type: float, name: TTC2_OFFSETF */
+  1,  /* ID: 327, type: float, name: intTimeAft */
+  1,  /* ID: 328, type: float, name: onTimeAft */
+  1,  /* ID: 329, type: float, name: intTimeFront */
+  1,  /* ID: 330, type: float, name: onTimeFront */
+  1,  /* ID: 331, type: float, name: TTC2_PA */
+  1,  /* ID: 332, type: float, name: TTC2_DA */
+  1,  /* ID: 333, type: float, name: TTC2_IA */
+  1,  /* ID: 334, type: float, name: TTC2_PF */
+  1,  /* ID: 335, type: float, name: TTC2_DF */
+  1,  /* ID: 336, type: float, name: TTC2_IF */
+  1,  /* ID: 337, type: enum, name: algoSaaEvalState */
+  1,  /* ID: 338, type: uint, name: algoSaaEvalCnt */
+  1,  /* ID: 339, type: bool, name: algoSaaEvalEnabled */
+  1,  /* ID: 340, type: uint, name: SAA_EXEC_PHASE */
+  1,  /* ID: 341, type: int, name: SAA_EXEC_PER */
+  1,  /* ID: 342, type: bool, name: isSaaActive */
+  1,  /* ID: 343, type: uint, name: saaCounter */
+  1,  /* ID: 344, type: uint, name: pInitSaaCounter */
+  1,  /* ID: 345, type: enum, name: algoSdsEvalState */
+  1,  /* ID: 346, type: uint, name: algoSdsEvalCnt */
+  1,  /* ID: 347, type: bool, name: algoSdsEvalEnabled */
+  1,  /* ID: 348, type: uint, name: SDS_EXEC_PHASE */
+  1,  /* ID: 349, type: int, name: SDS_EXEC_PER */
+  1,  /* ID: 350, type: bool, name: isSdsActive */
+  1,  /* ID: 351, type: bool, name: SDS_FORCED */
+  1,  /* ID: 352, type: bool, name: SDS_INHIBITED */
+  1,  /* ID: 353, type: bool, name: EARTH_OCCULT_ACTIVE */
+  1,  /* ID: 354, type: ushort, name: HEARTBEAT_D1 */
+  1,  /* ID: 355, type: ushort, name: HEARTBEAT_D2 */
+  1,  /* ID: 356, type: bool, name: HbSem */
+  276,  /* ID: 357, type: uchar, name: starMap */
+  1,  /* ID: 358, type: uint, name: observationId */
+  1,  /* ID: 359, type: char, name: centValProcOutput */
+  1,  /* ID: 360, type: float, name: CENT_OFFSET_LIM */
+  1,  /* ID: 361, type: float, name: CENT_FROZEN_LIM */
+  1,  /* ID: 362, type: bool, name: SEM_SERV1_1_FORWARD */
+  1,  /* ID: 363, type: bool, name: SEM_SERV1_2_FORWARD */
+  1,  /* ID: 364, type: bool, name: SEM_SERV1_7_FORWARD */
+  1,  /* ID: 365, type: bool, name: SEM_SERV1_8_FORWARD */
+  1,  /* ID: 366, type: bool, name: SEM_SERV3_1_FORWARD */
+  1,  /* ID: 367, type: bool, name: SEM_SERV3_2_FORWARD */
+  1,  /* ID: 368, type: uint, name: SEM_HK_TS_DEF_CRS */
+  1,  /* ID: 369, type: ushort, name: SEM_HK_TS_DEF_FINE */
+  1,  /* ID: 370, type: uint, name: SEM_HK_TS_EXT_CRS */
+  1,  /* ID: 371, type: ushort, name: SEM_HK_TS_EXT_FINE */
+  1,  /* ID: 372, type: enum, name: STAT_MODE */
+  1,  /* ID: 373, type: ushort, name: STAT_FLAGS */
+  1,  /* ID: 374, type: enum, name: STAT_LAST_SPW_ERR */
+  1,  /* ID: 375, type: ushort, name: STAT_LAST_ERR_ID */
+  1,  /* ID: 376, type: ushort, name: STAT_LAST_ERR_FREQ */
+  1,  /* ID: 377, type: ushort, name: STAT_NUM_CMD_RECEIVED */
+  1,  /* ID: 378, type: ushort, name: STAT_NUM_CMD_EXECUTED */
+  1,  /* ID: 379, type: ushort, name: STAT_NUM_DATA_SENT */
+  1,  /* ID: 380, type: ushort, name: STAT_SCU_PROC_DUTY_CL */
+  1,  /* ID: 381, type: ushort, name: STAT_SCU_NUM_AHB_ERR */
+  1,  /* ID: 382, type: ushort, name: STAT_SCU_NUM_AHB_CERR */
+  1,  /* ID: 383, type: ushort, name: STAT_SCU_NUM_LUP_ERR */
+  1,  /* ID: 384, type: float, name: TEMP_SEM_SCU */
+  1,  /* ID: 385, type: float, name: TEMP_SEM_PCU */
+  1,  /* ID: 386, type: float, name: VOLT_SCU_P3_4 */
+  1,  /* ID: 387, type: float, name: VOLT_SCU_P5 */
+  1,  /* ID: 388, type: float, name: TEMP_FEE_CCD */
+  1,  /* ID: 389, type: float, name: TEMP_FEE_STRAP */
+  1,  /* ID: 390, type: float, name: TEMP_FEE_ADC */
+  1,  /* ID: 391, type: float, name: TEMP_FEE_BIAS */
+  1,  /* ID: 392, type: float, name: TEMP_FEE_DEB */
+  1,  /* ID: 393, type: float, name: VOLT_FEE_VOD */
+  1,  /* ID: 394, type: float, name: VOLT_FEE_VRD */
+  1,  /* ID: 395, type: float, name: VOLT_FEE_VOG */
+  1,  /* ID: 396, type: float, name: VOLT_FEE_VSS */
+  1,  /* ID: 397, type: float, name: VOLT_FEE_CCD */
+  1,  /* ID: 398, type: float, name: VOLT_FEE_CLK */
+  1,  /* ID: 399, type: float, name: VOLT_FEE_ANA_P5 */
+  1,  /* ID: 400, type: float, name: VOLT_FEE_ANA_N5 */
+  1,  /* ID: 401, type: float, name: VOLT_FEE_ANA_P3_3 */
+  1,  /* ID: 402, type: float, name: CURR_FEE_CLK_BUF */
+  1,  /* ID: 403, type: float, name: VOLT_SCU_FPGA_P1_5 */
+  1,  /* ID: 404, type: float, name: CURR_SCU_P3_4 */
+  1,  /* ID: 405, type: uchar, name: STAT_NUM_SPW_ERR_CRE */
+  1,  /* ID: 406, type: uchar, name: STAT_NUM_SPW_ERR_ESC */
+  1,  /* ID: 407, type: uchar, name: STAT_NUM_SPW_ERR_DISC */
+  1,  /* ID: 408, type: uchar, name: STAT_NUM_SPW_ERR_PAR */
+  1,  /* ID: 409, type: uchar, name: STAT_NUM_SPW_ERR_WRSY */
+  1,  /* ID: 410, type: uchar, name: STAT_NUM_SPW_ERR_INVA */
+  1,  /* ID: 411, type: uchar, name: STAT_NUM_SPW_ERR_EOP */
+  1,  /* ID: 412, type: uchar, name: STAT_NUM_SPW_ERR_RXAH */
+  1,  /* ID: 413, type: uchar, name: STAT_NUM_SPW_ERR_TXAH */
+  1,  /* ID: 414, type: uchar, name: STAT_NUM_SPW_ERR_TXBL */
+  1,  /* ID: 415, type: uchar, name: STAT_NUM_SPW_ERR_TXLE */
+  1,  /* ID: 416, type: uchar, name: STAT_NUM_SP_ERR_RX */
+  1,  /* ID: 417, type: uchar, name: STAT_NUM_SP_ERR_TX */
+  1,  /* ID: 418, type: uchar, name: STAT_HEAT_PWM_FPA_CCD */
+  1,  /* ID: 419, type: uchar, name: STAT_HEAT_PWM_FEE_STR */
+  1,  /* ID: 420, type: uchar, name: STAT_HEAT_PWM_FEE_ANA */
+  1,  /* ID: 421, type: uchar, name: STAT_HEAT_PWM_SPARE */
+  1,  /* ID: 422, type: uchar, name: STAT_HEAT_PWM_FLAGS */
+  1,  /* ID: 423, type: ushort, name: STAT_OBTIME_SYNC_DELTA */
+  1,  /* ID: 424, type: float, name: TEMP_SEM_SCU_LW */
+  1,  /* ID: 425, type: float, name: TEMP_SEM_PCU_LW */
+  1,  /* ID: 426, type: float, name: VOLT_SCU_P3_4_LW */
+  1,  /* ID: 427, type: float, name: VOLT_SCU_P5_LW */
+  1,  /* ID: 428, type: float, name: TEMP_FEE_CCD_LW */
+  1,  /* ID: 429, type: float, name: TEMP_FEE_STRAP_LW */
+  1,  /* ID: 430, type: float, name: TEMP_FEE_ADC_LW */
+  1,  /* ID: 431, type: float, name: TEMP_FEE_BIAS_LW */
+  1,  /* ID: 432, type: float, name: TEMP_FEE_DEB_LW */
+  1,  /* ID: 433, type: float, name: VOLT_FEE_VOD_LW */
+  1,  /* ID: 434, type: float, name: VOLT_FEE_VRD_LW */
+  1,  /* ID: 435, type: float, name: VOLT_FEE_VOG_LW */
+  1,  /* ID: 436, type: float, name: VOLT_FEE_VSS_LW */
+  1,  /* ID: 437, type: float, name: VOLT_FEE_CCD_LW */
+  1,  /* ID: 438, type: float, name: VOLT_FEE_CLK_LW */
+  1,  /* ID: 439, type: float, name: VOLT_FEE_ANA_P5_LW */
+  1,  /* ID: 440, type: float, name: VOLT_FEE_ANA_N5_LW */
+  1,  /* ID: 441, type: float, name: VOLT_FEE_ANA_P3_3_LW */
+  1,  /* ID: 442, type: float, name: CURR_FEE_CLK_BUF_LW */
+  1,  /* ID: 443, type: float, name: VOLT_SCU_FPGA_P1_5_LW */
+  1,  /* ID: 444, type: float, name: CURR_SCU_P3_4_LW */
+  1,  /* ID: 445, type: float, name: TEMP_SEM_SCU_UW */
+  1,  /* ID: 446, type: float, name: TEMP_SEM_PCU_UW */
+  1,  /* ID: 447, type: float, name: VOLT_SCU_P3_4_UW */
+  1,  /* ID: 448, type: float, name: VOLT_SCU_P5_UW */
+  1,  /* ID: 449, type: float, name: TEMP_FEE_CCD_UW */
+  1,  /* ID: 450, type: float, name: TEMP_FEE_STRAP_UW */
+  1,  /* ID: 451, type: float, name: TEMP_FEE_ADC_UW */
+  1,  /* ID: 452, type: float, name: TEMP_FEE_BIAS_UW */
+  1,  /* ID: 453, type: float, name: TEMP_FEE_DEB_UW */
+  1,  /* ID: 454, type: float, name: VOLT_FEE_VOD_UW */
+  1,  /* ID: 455, type: float, name: VOLT_FEE_VRD_UW */
+  1,  /* ID: 456, type: float, name: VOLT_FEE_VOG_UW */
+  1,  /* ID: 457, type: float, name: VOLT_FEE_VSS_UW */
+  1,  /* ID: 458, type: float, name: VOLT_FEE_CCD_UW */
+  1,  /* ID: 459, type: float, name: VOLT_FEE_CLK_UW */
+  1,  /* ID: 460, type: float, name: VOLT_FEE_ANA_P5_UW */
+  1,  /* ID: 461, type: float, name: VOLT_FEE_ANA_N5_UW */
+  1,  /* ID: 462, type: float, name: VOLT_FEE_ANA_P3_3_UW */
+  1,  /* ID: 463, type: float, name: CURR_FEE_CLK_BUF_UW */
+  1,  /* ID: 464, type: float, name: VOLT_SCU_FPGA_P1_5_UW */
+  1,  /* ID: 465, type: float, name: CURR_SCU_P3_4_UW */
+  1,  /* ID: 466, type: float, name: TEMP_SEM_SCU_LA */
+  1,  /* ID: 467, type: float, name: TEMP_SEM_PCU_LA */
+  1,  /* ID: 468, type: float, name: VOLT_SCU_P3_4_LA */
+  1,  /* ID: 469, type: float, name: VOLT_SCU_P5_LA */
+  1,  /* ID: 470, type: float, name: TEMP_FEE_CCD_LA */
+  1,  /* ID: 471, type: float, name: TEMP_FEE_STRAP_LA */
+  1,  /* ID: 472, type: float, name: TEMP_FEE_ADC_LA */
+  1,  /* ID: 473, type: float, name: TEMP_FEE_BIAS_LA */
+  1,  /* ID: 474, type: float, name: TEMP_FEE_DEB_LA */
+  1,  /* ID: 475, type: float, name: VOLT_FEE_VOD_LA */
+  1,  /* ID: 476, type: float, name: VOLT_FEE_VRD_LA */
+  1,  /* ID: 477, type: float, name: VOLT_FEE_VOG_LA */
+  1,  /* ID: 478, type: float, name: VOLT_FEE_VSS_LA */
+  1,  /* ID: 479, type: float, name: VOLT_FEE_CCD_LA */
+  1,  /* ID: 480, type: float, name: VOLT_FEE_CLK_LA */
+  1,  /* ID: 481, type: float, name: VOLT_FEE_ANA_P5_LA */
+  1,  /* ID: 482, type: float, name: VOLT_FEE_ANA_N5_LA */
+  1,  /* ID: 483, type: float, name: VOLT_FEE_ANA_P3_3_LA */
+  1,  /* ID: 484, type: float, name: CURR_FEE_CLK_BUF_LA */
+  1,  /* ID: 485, type: float, name: VOLT_SCU_FPGA_P1_5_LA */
+  1,  /* ID: 486, type: float, name: CURR_SCU_P3_4_LA */
+  1,  /* ID: 487, type: float, name: TEMP_SEM_SCU_UA */
+  1,  /* ID: 488, type: float, name: TEMP_SEM_PCU_UA */
+  1,  /* ID: 489, type: float, name: VOLT_SCU_P3_4_UA */
+  1,  /* ID: 490, type: float, name: VOLT_SCU_P5_UA */
+  1,  /* ID: 491, type: float, name: TEMP_FEE_CCD_UA */
+  1,  /* ID: 492, type: float, name: TEMP_FEE_STRAP_UA */
+  1,  /* ID: 493, type: float, name: TEMP_FEE_ADC_UA */
+  1,  /* ID: 494, type: float, name: TEMP_FEE_BIAS_UA */
+  1,  /* ID: 495, type: float, name: TEMP_FEE_DEB_UA */
+  1,  /* ID: 496, type: float, name: VOLT_FEE_VOD_UA */
+  1,  /* ID: 497, type: float, name: VOLT_FEE_VRD_UA */
+  1,  /* ID: 498, type: float, name: VOLT_FEE_VOG_UA */
+  1,  /* ID: 499, type: float, name: VOLT_FEE_VSS_UA */
+  1,  /* ID: 500, type: float, name: VOLT_FEE_CCD_UA */
+  1,  /* ID: 501, type: float, name: VOLT_FEE_CLK_UA */
+  1,  /* ID: 502, type: float, name: VOLT_FEE_ANA_P5_UA */
+  1,  /* ID: 503, type: float, name: VOLT_FEE_ANA_N5_UA */
+  1,  /* ID: 504, type: float, name: VOLT_FEE_ANA_P3_3_UA */
+  1,  /* ID: 505, type: float, name: CURR_FEE_CLK_BUF_UA */
+  1,  /* ID: 506, type: float, name: VOLT_SCU_FPGA_P1_5_UA */
+  1,  /* ID: 507, type: float, name: CURR_SCU_P3_4_UA */
+  1,  /* ID: 508, type: uint, name: semEvtCounter */
+  1,  /* ID: 509, type: bool, name: SEM_SERV5_1_FORWARD */
+  1,  /* ID: 510, type: bool, name: SEM_SERV5_2_FORWARD */
+  1,  /* ID: 511, type: bool, name: SEM_SERV5_3_FORWARD */
+  1,  /* ID: 512, type: bool, name: SEM_SERV5_4_FORWARD */
+  1,  /* ID: 513, type: uint, name: pExpTime */
+  1,  /* ID: 514, type: uint, name: pImageRep */
+  1,  /* ID: 515, type: uint, name: pAcqNum */
+  1,  /* ID: 516, type: enum, name: pDataOs */
+  1,  /* ID: 517, type: enum, name: pCcdRdMode */
+  1,  /* ID: 518, type: ushort, name: pWinPosX */
+  1,  /* ID: 519, type: ushort, name: pWinPosY */
+  1,  /* ID: 520, type: ushort, name: pWinSizeX */
+  1,  /* ID: 521, type: ushort, name: pWinSizeY */
+  1,  /* ID: 522, type: enum, name: pDtAcqSrc */
+  1,  /* ID: 523, type: enum, name: pTempCtrlTarget */
+  1,  /* ID: 524, type: float, name: pVoltFeeVod */
+  1,  /* ID: 525, type: float, name: pVoltFeeVrd */
+  1,  /* ID: 526, type: float, name: pVoltFeeVss */
+  1,  /* ID: 527, type: float, name: pHeatTempFpaCCd */
+  1,  /* ID: 528, type: float, name: pHeatTempFeeStrap */
+  1,  /* ID: 529, type: float, name: pHeatTempFeeAnach */
+  1,  /* ID: 530, type: float, name: pHeatTempSpare */
+  1,  /* ID: 531, type: enum, name: pStepEnDiagCcd */
+  1,  /* ID: 532, type: enum, name: pStepEnDiagFee */
+  1,  /* ID: 533, type: enum, name: pStepEnDiagTemp */
+  1,  /* ID: 534, type: enum, name: pStepEnDiagAna */
+  1,  /* ID: 535, type: enum, name: pStepEnDiagExpos */
+  1,  /* ID: 536, type: enum, name: pStepDebDiagCcd */
+  1,  /* ID: 537, type: enum, name: pStepDebDiagFee */
+  1,  /* ID: 538, type: enum, name: pStepDebDiagTemp */
+  1,  /* ID: 539, type: enum, name: pStepDebDiagAna */
+  1,  /* ID: 540, type: enum, name: pStepDebDiagExpos */
+  1,  /* ID: 541, type: bool, name: SEM_SERV220_6_FORWARD */
+  1,  /* ID: 542, type: bool, name: SEM_SERV220_12_FORWARD */
+  1,  /* ID: 543, type: bool, name: SEM_SERV222_6_FORWARD */
+  1,  /* ID: 544, type: enum, name: saveImagesNode */
+  1,  /* ID: 545, type: uint, name: saveImagesCnt */
+  1,  /* ID: 546, type: enum, name: SaveImages_pSaveTarget */
+  1,  /* ID: 547, type: uchar, name: SaveImages_pFbfInit */
+  1,  /* ID: 548, type: uchar, name: SaveImages_pFbfEnd */
+  1,  /* ID: 549, type: enum, name: acqFullDropNode */
+  1,  /* ID: 550, type: uint, name: acqFullDropCnt */
+  1,  /* ID: 551, type: uint, name: AcqFullDrop_pExpTime */
+  1,  /* ID: 552, type: uint, name: AcqFullDrop_pImageRep */
+  1,  /* ID: 553, type: uint, name: acqFullDropT1 */
+  1,  /* ID: 554, type: uint, name: acqFullDropT2 */
+  1,  /* ID: 555, type: enum, name: calFullSnapNode */
+  1,  /* ID: 556, type: uint, name: calFullSnapCnt */
+  1,  /* ID: 557, type: uint, name: CalFullSnap_pExpTime */
+  1,  /* ID: 558, type: uint, name: CalFullSnap_pImageRep */
+  1,  /* ID: 559, type: uint, name: CalFullSnap_pNmbImages */
+  1,  /* ID: 560, type: enum, name: CalFullSnap_pCentSel */
+  1,  /* ID: 561, type: uint, name: calFullSnapT1 */
+  1,  /* ID: 562, type: uint, name: calFullSnapT2 */
+  1,  /* ID: 563, type: enum, name: SciWinNode */
+  1,  /* ID: 564, type: uint, name: SciWinCnt */
+  1,  /* ID: 565, type: uint, name: SciWin_pNmbImages */
+  1,  /* ID: 566, type: enum, name: SciWin_pCcdRdMode */
+  1,  /* ID: 567, type: uint, name: SciWin_pExpTime */
+  1,  /* ID: 568, type: uint, name: SciWin_pImageRep */
+  1,  /* ID: 569, type: ushort, name: SciWin_pWinPosX */
+  1,  /* ID: 570, type: ushort, name: SciWin_pWinPosY */
+  1,  /* ID: 571, type: ushort, name: SciWin_pWinSizeX */
+  1,  /* ID: 572, type: ushort, name: SciWin_pWinSizeY */
+  1,  /* ID: 573, type: enum, name: SciWin_pCentSel */
+  1,  /* ID: 574, type: uint, name: sciWinT1 */
+  1,  /* ID: 575, type: uint, name: sciWinT2 */
+  1,  /* ID: 576, type: enum, name: fbfLoadNode */
+  1,  /* ID: 577, type: uint, name: fbfLoadCnt */
+  1,  /* ID: 578, type: enum, name: fbfSaveNode */
+  1,  /* ID: 579, type: uint, name: fbfSaveCnt */
+  1,  /* ID: 580, type: uchar, name: FbfLoad_pFbfId */
+  1,  /* ID: 581, type: uchar, name: FbfLoad_pFbfNBlocks */
+  1,  /* ID: 582, type: ushort, name: FbfLoad_pFbfRamAreaId */
+  1,  /* ID: 583, type: uint, name: FbfLoad_pFbfRamAddr */
+  1,  /* ID: 584, type: uchar, name: FbfSave_pFbfId */
+  1,  /* ID: 585, type: uchar, name: FbfSave_pFbfNBlocks */
+  1,  /* ID: 586, type: ushort, name: FbfSave_pFbfRamAreaId */
+  1,  /* ID: 587, type: uint, name: FbfSave_pFbfRamAddr */
+  1,  /* ID: 588, type: uchar, name: fbfLoadBlockCounter */
+  1,  /* ID: 589, type: uchar, name: fbfSaveBlockCounter */
+  1,  /* ID: 590, type: enum, name: transFbfToGrndNode */
+  1,  /* ID: 591, type: uint, name: transFbfToGrndCnt */
+  1,  /* ID: 592, type: uchar, name: TransFbfToGrnd_pNmbFbf */
+  1,  /* ID: 593, type: uchar, name: TransFbfToGrnd_pFbfInit */
+  1,  /* ID: 594, type: uchar, name: TransFbfToGrnd_pFbfSize */
+  1,  /* ID: 595, type: enum, name: nomSciNode */
+  1,  /* ID: 596, type: uint, name: nomSciCnt */
+  1,  /* ID: 597, type: bool, name: NomSci_pAcqFlag */
+  1,  /* ID: 598, type: bool, name: NomSci_pCal1Flag */
+  1,  /* ID: 599, type: bool, name: NomSci_pSciFlag */
+  1,  /* ID: 600, type: bool, name: NomSci_pCal2Flag */
+  1,  /* ID: 601, type: uchar, name: NomSci_pCibNFull */
+  1,  /* ID: 602, type: ushort, name: NomSci_pCibSizeFull */
+  1,  /* ID: 603, type: uchar, name: NomSci_pSibNFull */
+  1,  /* ID: 604, type: ushort, name: NomSci_pSibSizeFull */
+  1,  /* ID: 605, type: uchar, name: NomSci_pGibNFull */
+  1,  /* ID: 606, type: ushort, name: NomSci_pGibSizeFull */
+  1,  /* ID: 607, type: uchar, name: NomSci_pSibNWin */
+  1,  /* ID: 608, type: ushort, name: NomSci_pSibSizeWin */
+  1,  /* ID: 609, type: uchar, name: NomSci_pCibNWin */
+  1,  /* ID: 610, type: ushort, name: NomSci_pCibSizeWin */
+  1,  /* ID: 611, type: uchar, name: NomSci_pGibNWin */
+  1,  /* ID: 612, type: ushort, name: NomSci_pGibSizeWin */
+  1,  /* ID: 613, type: uint, name: NomSci_pExpTimeAcq */
+  1,  /* ID: 614, type: uint, name: NomSci_pImageRepAcq */
+  1,  /* ID: 615, type: uint, name: NomSci_pExpTimeCal1 */
+  1,  /* ID: 616, type: uint, name: NomSci_pImageRepCal1 */
+  1,  /* ID: 617, type: uint, name: NomSci_pNmbImagesCal1 */
+  1,  /* ID: 618, type: enum, name: NomSci_pCentSelCal1 */
+  1,  /* ID: 619, type: uint, name: NomSci_pNmbImagesSci */
+  1,  /* ID: 620, type: enum, name: NomSci_pCcdRdModeSci */
+  1,  /* ID: 621, type: uint, name: NomSci_pExpTimeSci */
+  1,  /* ID: 622, type: uint, name: NomSci_pImageRepSci */
+  1,  /* ID: 623, type: ushort, name: NomSci_pWinPosXSci */
+  1,  /* ID: 624, type: ushort, name: NomSci_pWinPosYSci */
+  1,  /* ID: 625, type: ushort, name: NomSci_pWinSizeXSci */
+  1,  /* ID: 626, type: ushort, name: NomSci_pWinSizeYSci */
+  1,  /* ID: 627, type: enum, name: NomSci_pCentSelSci */
+  1,  /* ID: 628, type: uint, name: NomSci_pExpTimeCal2 */
+  1,  /* ID: 629, type: uint, name: NomSci_pImageRepCal2 */
+  1,  /* ID: 630, type: uint, name: NomSci_pNmbImagesCal2 */
+  1,  /* ID: 631, type: enum, name: NomSci_pCentSelCal2 */
+  1,  /* ID: 632, type: enum, name: NomSci_pSaveTarget */
+  1,  /* ID: 633, type: uchar, name: NomSci_pFbfInit */
+  1,  /* ID: 634, type: uchar, name: NomSci_pFbfEnd */
+  1,  /* ID: 635, type: ushort, name: NomSci_pStckOrderCal1 */
+  1,  /* ID: 636, type: ushort, name: NomSci_pStckOrderSci */
+  1,  /* ID: 637, type: ushort, name: NomSci_pStckOrderCal2 */
+  1,  /* ID: 638, type: enum, name: ConfigSdb_pSdbCmd */
+  1,  /* ID: 639, type: uchar, name: ConfigSdb_pCibNFull */
+  1,  /* ID: 640, type: ushort, name: ConfigSdb_pCibSizeFull */
+  1,  /* ID: 641, type: uchar, name: ConfigSdb_pSibNFull */
+  1,  /* ID: 642, type: ushort, name: ConfigSdb_pSibSizeFull */
+  1,  /* ID: 643, type: uchar, name: ConfigSdb_pGibNFull */
+  1,  /* ID: 644, type: ushort, name: ConfigSdb_pGibSizeFull */
+  1,  /* ID: 645, type: uchar, name: ConfigSdb_pSibNWin */
+  1,  /* ID: 646, type: ushort, name: ConfigSdb_pSibSizeWin */
+  1,  /* ID: 647, type: uchar, name: ConfigSdb_pCibNWin */
+  1,  /* ID: 648, type: ushort, name: ConfigSdb_pCibSizeWin */
+  1,  /* ID: 649, type: uchar, name: ConfigSdb_pGibNWin */
+  1,  /* ID: 650, type: ushort, name: ConfigSdb_pGibSizeWin */
+  1,  /* ID: 651, type: float, name: ADC_P3V3 */
+  1,  /* ID: 652, type: float, name: ADC_P5V */
+  1,  /* ID: 653, type: float, name: ADC_P1V8 */
+  1,  /* ID: 654, type: float, name: ADC_P2V5 */
+  1,  /* ID: 655, type: float, name: ADC_N5V */
+  1,  /* ID: 656, type: float, name: ADC_PGND */
+  1,  /* ID: 657, type: float, name: ADC_TEMPOH1A */
+  1,  /* ID: 658, type: float, name: ADC_TEMP1 */
+  1,  /* ID: 659, type: float, name: ADC_TEMPOH2A */
+  1,  /* ID: 660, type: float, name: ADC_TEMPOH1B */
+  1,  /* ID: 661, type: float, name: ADC_TEMPOH3A */
+  1,  /* ID: 662, type: float, name: ADC_TEMPOH2B */
+  1,  /* ID: 663, type: float, name: ADC_TEMPOH4A */
+  1,  /* ID: 664, type: float, name: ADC_TEMPOH3B */
+  1,  /* ID: 665, type: float, name: ADC_TEMPOH4B */
+  1,  /* ID: 666, type: float, name: SEM_P15V */
+  1,  /* ID: 667, type: float, name: SEM_P30V */
+  1,  /* ID: 668, type: float, name: SEM_P5V0 */
+  1,  /* ID: 669, type: float, name: SEM_P7V0 */
+  1,  /* ID: 670, type: float, name: SEM_N5V0 */
+  1,  /* ID: 671, type: short, name: ADC_P3V3_RAW */
+  1,  /* ID: 672, type: short, name: ADC_P5V_RAW */
+  1,  /* ID: 673, type: short, name: ADC_P1V8_RAW */
+  1,  /* ID: 674, type: short, name: ADC_P2V5_RAW */
+  1,  /* ID: 675, type: short, name: ADC_N5V_RAW */
+  1,  /* ID: 676, type: short, name: ADC_PGND_RAW */
+  1,  /* ID: 677, type: short, name: ADC_TEMPOH1A_RAW */
+  1,  /* ID: 678, type: short, name: ADC_TEMP1_RAW */
+  1,  /* ID: 679, type: short, name: ADC_TEMPOH2A_RAW */
+  1,  /* ID: 680, type: short, name: ADC_TEMPOH1B_RAW */
+  1,  /* ID: 681, type: short, name: ADC_TEMPOH3A_RAW */
+  1,  /* ID: 682, type: short, name: ADC_TEMPOH2B_RAW */
+  1,  /* ID: 683, type: short, name: ADC_TEMPOH4A_RAW */
+  1,  /* ID: 684, type: short, name: ADC_TEMPOH3B_RAW */
+  1,  /* ID: 685, type: short, name: ADC_TEMPOH4B_RAW */
+  1,  /* ID: 686, type: short, name: SEM_P15V_RAW */
+  1,  /* ID: 687, type: short, name: SEM_P30V_RAW */
+  1,  /* ID: 688, type: short, name: SEM_P5V0_RAW */
+  1,  /* ID: 689, type: short, name: SEM_P7V0_RAW */
+  1,  /* ID: 690, type: short, name: SEM_N5V0_RAW */
+  1,  /* ID: 691, type: float, name: ADC_P3V3_U */
+  1,  /* ID: 692, type: float, name: ADC_P5V_U */
+  1,  /* ID: 693, type: float, name: ADC_P1V8_U */
+  1,  /* ID: 694, type: float, name: ADC_P2V5_U */
+  1,  /* ID: 695, type: float, name: ADC_N5V_L */
+  1,  /* ID: 696, type: float, name: ADC_PGND_U */
+  1,  /* ID: 697, type: float, name: ADC_PGND_L */
+  1,  /* ID: 698, type: float, name: ADC_TEMPOH1A_U */
+  1,  /* ID: 699, type: float, name: ADC_TEMP1_U */
+  1,  /* ID: 700, type: float, name: ADC_TEMPOH2A_U */
+  1,  /* ID: 701, type: float, name: ADC_TEMPOH1B_U */
+  1,  /* ID: 702, type: float, name: ADC_TEMPOH3A_U */
+  1,  /* ID: 703, type: float, name: ADC_TEMPOH2B_U */
+  1,  /* ID: 704, type: float, name: ADC_TEMPOH4A_U */
+  1,  /* ID: 705, type: float, name: ADC_TEMPOH3B_U */
+  1,  /* ID: 706, type: float, name: ADC_TEMPOH4B_U */
+  1,  /* ID: 707, type: float, name: SEM_P15V_U */
+  1,  /* ID: 708, type: float, name: SEM_P30V_U */
+  1,  /* ID: 709, type: float, name: SEM_P5V0_U */
+  1,  /* ID: 710, type: float, name: SEM_P7V0_U */
+  1,  /* ID: 711, type: float, name: SEM_N5V0_L */
+  1,  /* ID: 712, type: ushort, name: HbSemPassword */
+  1,  /* ID: 713, type: uint, name: HbSemCounter */
+  1,  /* ID: 714, type: bool, name: isWatchdogEnabled */
+  1,  /* ID: 715, type: bool, name: isSynchronized */
+  1,  /* ID: 716, type: int, name: missedMsgCnt */
+  1,  /* ID: 717, type: int, name: missedPulseCnt */
+  1,  /* ID: 718, type: uint, name: milFrameDelay */
+  1,  /* ID: 719, type: enum, name: EL1_CHIP */
+  1,  /* ID: 720, type: enum, name: EL2_CHIP */
+  1,  /* ID: 721, type: uint, name: EL1_ADDR */
+  1,  /* ID: 722, type: uint, name: EL2_ADDR */
+  1,  /* ID: 723, type: bool, name: ERR_LOG_ENB */
+  1,  /* ID: 724, type: bool, name: isErrLogValid */
+  1,  /* ID: 725, type: ushort, name: nOfErrLogEntries */
+  1,  /* ID: 726, type: uint, name: MAX_SEM_PCKT_CYC */
+  1,  /* ID: 727, type: uint, name: FBF_BLCK_WR_DUR */
+  1,  /* ID: 728, type: uint, name: FBF_BLCK_RD_DUR */
+  250,  /* ID: 729, type: bool, name: isFbfOpen */
+  250,  /* ID: 730, type: bool, name: isFbfValid */
+  250,  /* ID: 731, type: bool, name: FBF_ENB */
+  250,  /* ID: 732, type: enum, name: FBF_CHIP */
+  250,  /* ID: 733, type: uint, name: FBF_ADDR */
+  250,  /* ID: 734, type: ushort, name: fbfNBlocks */
+  1,  /* ID: 735, type: float, name: THR_MA_A_1 */
+  1,  /* ID: 736, type: float, name: THR_MA_A_2 */
+  1,  /* ID: 737, type: float, name: THR_MA_A_3 */
+  1,  /* ID: 738, type: float, name: THR_MA_A_4 */
+  1,  /* ID: 739, type: float, name: THR_MA_A_5 */
+  1,  /* ID: 740, type: float, name: wcet_1 */
+  1,  /* ID: 741, type: float, name: wcet_2 */
+  1,  /* ID: 742, type: float, name: wcet_3 */
+  1,  /* ID: 743, type: float, name: wcet_4 */
+  1,  /* ID: 744, type: float, name: wcet_5 */
+  1,  /* ID: 745, type: float, name: wcetAver_1 */
+  1,  /* ID: 746, type: float, name: wcetAver_2 */
+  1,  /* ID: 747, type: float, name: wcetAver_3 */
+  1,  /* ID: 748, type: float, name: wcetAver_4 */
+  1,  /* ID: 749, type: float, name: wcetAver_5 */
+  1,  /* ID: 750, type: float, name: wcetMax_1 */
+  1,  /* ID: 751, type: float, name: wcetMax_2 */
+  1,  /* ID: 752, type: float, name: wcetMax_3 */
+  1,  /* ID: 753, type: float, name: wcetMax_4 */
+  1,  /* ID: 754, type: float, name: wcetMax_5 */
+  1,  /* ID: 755, type: uint, name: nOfNotif_1 */
+  1,  /* ID: 756, type: uint, name: nOfNotif_2 */
+  1,  /* ID: 757, type: uint, name: nOfNotif_3 */
+  1,  /* ID: 758, type: uint, name: nOfNotif_4 */
+  1,  /* ID: 759, type: uint, name: nOfNotif_5 */
+  1,  /* ID: 760, type: uint, name: nofFuncExec_1 */
+  1,  /* ID: 761, type: uint, name: nofFuncExec_2 */
+  1,  /* ID: 762, type: uint, name: nofFuncExec_3 */
+  1,  /* ID: 763, type: uint, name: nofFuncExec_4 */
+  1,  /* ID: 764, type: uint, name: nofFuncExec_5 */
+  1,  /* ID: 765, type: ushort, name: wcetTimeStampFine_1 */
+  1,  /* ID: 766, type: ushort, name: wcetTimeStampFine_2 */
+  1,  /* ID: 767, type: ushort, name: wcetTimeStampFine_3 */
+  1,  /* ID: 768, type: ushort, name: wcetTimeStampFine_4 */
+  1,  /* ID: 769, type: ushort, name: wcetTimeStampFine_5 */
+  1,  /* ID: 770, type: uint, name: wcetTimeStampCoarse_1 */
+  1,  /* ID: 771, type: uint, name: wcetTimeStampCoarse_2 */
+  1,  /* ID: 772, type: uint, name: wcetTimeStampCoarse_3 */
+  1,  /* ID: 773, type: uint, name: wcetTimeStampCoarse_4 */
+  1,  /* ID: 774, type: uint, name: wcetTimeStampCoarse_5 */
+  1,  /* ID: 775, type: uint, name: flashContStepCnt */
+  1,  /* ID: 776, type: float, name: OTA_TM1A_NOM */
+  1,  /* ID: 777, type: float, name: OTA_TM1A_RED */
+  1,  /* ID: 778, type: float, name: OTA_TM1B_NOM */
+  1,  /* ID: 779, type: float, name: OTA_TM1B_RED */
+  1,  /* ID: 780, type: float, name: OTA_TM2A_NOM */
+  1,  /* ID: 781, type: float, name: OTA_TM2A_RED */
+  1,  /* ID: 782, type: float, name: OTA_TM2B_NOM */
+  1,  /* ID: 783, type: float, name: OTA_TM2B_RED */
+  1,  /* ID: 784, type: float, name: OTA_TM3A_NOM */
+  1,  /* ID: 785, type: float, name: OTA_TM3A_RED */
+  1,  /* ID: 786, type: float, name: OTA_TM3B_NOM */
+  1,  /* ID: 787, type: float, name: OTA_TM3B_RED */
+  1,  /* ID: 788, type: float, name: OTA_TM4A_NOM */
+  1,  /* ID: 789, type: float, name: OTA_TM4A_RED */
+  1,  /* ID: 790, type: float, name: OTA_TM4B_NOM */
+  1,  /* ID: 791, type: float, name: OTA_TM4B_RED */
+  1,  /* ID: 792, type: uchar, name: Core0Load */
+  1,  /* ID: 793, type: uchar, name: Core1Load */
+  1,  /* ID: 794, type: uint, name: InterruptRate */
+  1,  /* ID: 795, type: uchar, name: CyclicalActivitiesCtr */
+  1,  /* ID: 796, type: uint, name: Uptime */
+  1,  /* ID: 797, type: uchar, name: SemTick */
+  1,  /* ID: 798, type: uint, name: SemPwrOnTimestamp */
+  1,  /* ID: 799, type: uint, name: SemPwrOffTimestamp */
+  1,  /* ID: 800, type: ushort, name: IASW_EVT_CTR */
+  1,  /* ID: 801, type: uint, name: BAD_COPY_ID */
+  1,  /* ID: 802, type: uint, name: BAD_PASTE_ID */
+  1,  /* ID: 803, type: uint, name: ObcInputBufferPackets */
+  1,  /* ID: 804, type: uint, name: GrndInputBufferPackets */
+  1,  /* ID: 805, type: uint, name: MilBusBytesIn */
+  1,  /* ID: 806, type: uint, name: MilBusBytesOut */
+  1,  /* ID: 807, type: ushort, name: MilBusDroppedBytes */
+  1,  /* ID: 808, type: ushort, name: IRL1 */
+  1,  /* ID: 809, type: uchar, name: IRL1_AHBSTAT */
+  1,  /* ID: 810, type: uchar, name: IRL1_GRGPIO_6 */
+  1,  /* ID: 811, type: uchar, name: IRL1_GRTIMER */
+  1,  /* ID: 812, type: uchar, name: IRL1_GPTIMER_0 */
+  1,  /* ID: 813, type: uchar, name: IRL1_GPTIMER_1 */
+  1,  /* ID: 814, type: uchar, name: IRL1_GPTIMER_2 */
+  1,  /* ID: 815, type: uchar, name: IRL1_GPTIMER_3 */
+  1,  /* ID: 816, type: uchar, name: IRL1_IRQMP */
+  1,  /* ID: 817, type: uchar, name: IRL1_B1553BRM */
+  1,  /* ID: 818, type: ushort, name: IRL2 */
+  1,  /* ID: 819, type: uchar, name: IRL2_GRSPW2_0 */
+  1,  /* ID: 820, type: uchar, name: IRL2_GRSPW2_1 */
+  1,  /* ID: 821, type: enum, name: SemRoute */
+  1,  /* ID: 822, type: uint, name: SpW0BytesIn */
+  1,  /* ID: 823, type: uint, name: SpW0BytesOut */
+  1,  /* ID: 824, type: uint, name: SpW1BytesIn */
+  1,  /* ID: 825, type: uint, name: SpW1BytesOut */
+  1,  /* ID: 826, type: uchar, name: Spw0TxDescAvail */
+  1,  /* ID: 827, type: uchar, name: Spw0RxPcktAvail */
+  1,  /* ID: 828, type: uchar, name: Spw1TxDescAvail */
+  1,  /* ID: 829, type: uchar, name: Spw1RxPcktAvail */
+  1,  /* ID: 830, type: uint, name: MilCucCoarseTime */
+  1,  /* ID: 831, type: ushort, name: MilCucFineTime */
+  1,  /* ID: 832, type: uint, name: CucCoarseTime */
+  1,  /* ID: 833, type: ushort, name: CucFineTime */
+  1,  /* ID: 834, type: uint, name: Sram1ScrCurrAddr */
+  1,  /* ID: 835, type: uint, name: Sram2ScrCurrAddr */
+  1,  /* ID: 836, type: ushort, name: Sram1ScrLength */
+  1,  /* ID: 837, type: ushort, name: Sram2ScrLength */
+  1,  /* ID: 838, type: uchar, name: EdacSingleRepaired */
+  1,  /* ID: 839, type: ushort, name: EdacSingleFaults */
+  1,  /* ID: 840, type: uint, name: EdacLastSingleFail */
+  1,  /* ID: 841, type: uchar, name: EdacDoubleFaults */
+  1,  /* ID: 842, type: uint, name: EdacDoubleFAddr */
+  1,  /* ID: 843, type: enum, name: Cpu2ProcStatus */
+  1,  /* ID: 844, type: uchar, name: HEARTBEAT_ENABLED */
+  1,  /* ID: 845, type: uint, name: S1AllocDbs */
+  1,  /* ID: 846, type: uint, name: S1AllocSw */
+  1,  /* ID: 847, type: uint, name: S1AllocHeap */
+  1,  /* ID: 848, type: uint, name: S1AllocFlash */
+  1,  /* ID: 849, type: uint, name: S1AllocAux */
+  1,  /* ID: 850, type: uint, name: S1AllocRes */
+  1,  /* ID: 851, type: uint, name: S1AllocSwap */
+  1,  /* ID: 852, type: uint, name: S2AllocSciHeap */
+  1,  /* ID: 853, type: enum, name: TaAlgoId */
+  1,  /* ID: 854, type: ushort, name: TAACQALGOID */
+  1,  /* ID: 855, type: uint, name: TASPARE32 */
+  1,  /* ID: 856, type: ushort, name: TaTimingPar1 */
+  1,  /* ID: 857, type: ushort, name: TaTimingPar2 */
+  1,  /* ID: 858, type: ushort, name: TaDistanceThrd */
+  1,  /* ID: 859, type: ushort, name: TaIterations */
+  1,  /* ID: 860, type: ushort, name: TaRebinningFact */
+  1,  /* ID: 861, type: ushort, name: TaDetectionThrd */
+  1,  /* ID: 862, type: ushort, name: TaSeReducedExtr */
+  1,  /* ID: 863, type: ushort, name: TaSeReducedRadius */
+  1,  /* ID: 864, type: ushort, name: TaSeTolerance */
+  1,  /* ID: 865, type: ushort, name: TaMvaTolerance */
+  1,  /* ID: 866, type: ushort, name: TaAmaTolerance */
+  1,  /* ID: 867, type: ushort, name: TAPOINTUNCERT */
+  1,  /* ID: 868, type: uint, name: TATARGETSIG */
+  1,  /* ID: 869, type: ushort, name: TANROFSTARS */
+  1,  /* ID: 870, type: float, name: TaMaxSigFract */
+  1,  /* ID: 871, type: float, name: TaBias */
+  1,  /* ID: 872, type: float, name: TaDark */
+  1,  /* ID: 873, type: float, name: TaSkyBg */
+  1,  /* ID: 874, type: uchar, name: COGBITS */
+  1,  /* ID: 875, type: float, name: CENT_MULT_X */
+  1,  /* ID: 876, type: float, name: CENT_MULT_Y */
+  1,  /* ID: 877, type: float, name: CENT_OFFSET_X */
+  1,  /* ID: 878, type: float, name: CENT_OFFSET_Y */
+  1,  /* ID: 879, type: uchar, name: CENT_MEDIANFILTER */
+  1,  /* ID: 880, type: ushort, name: CENT_DIM_X */
+  1,  /* ID: 881, type: ushort, name: CENT_DIM_Y */
+  1,  /* ID: 882, type: bool, name: CENT_CHECKS */
+  1,  /* ID: 883, type: uint, name: CEN_SIGMALIMIT */
+  1,  /* ID: 884, type: uint, name: CEN_SIGNALLIMIT */
+  1,  /* ID: 885, type: uint, name: CEN_MEDIAN_THRD */
+  1,  /* ID: 886, type: float, name: OPT_AXIS_X */
+  1,  /* ID: 887, type: float, name: OPT_AXIS_Y */
+  1,  /* ID: 888, type: bool, name: DIST_CORR */
+  1,  /* ID: 889, type: uchar, name: pStckOrderSci */
+  1,  /* ID: 890, type: ushort, name: pWinSizeXSci */
+  1,  /* ID: 891, type: ushort, name: pWinSizeYSci */
+  1,  /* ID: 892, type: enum, name: SdpImageAptShape */
+  1,  /* ID: 893, type: ushort, name: SdpImageAptX */
+  1,  /* ID: 894, type: ushort, name: SdpImageAptY */
+  1,  /* ID: 895, type: enum, name: SdpImgttAptShape */
+  1,  /* ID: 896, type: ushort, name: SdpImgttAptX */
+  1,  /* ID: 897, type: ushort, name: SdpImgttAptY */
+  1,  /* ID: 898, type: uchar, name: SdpImgttStckOrder */
+  1,  /* ID: 899, type: uchar, name: SdpLosStckOrder */
+  1,  /* ID: 900, type: uchar, name: SdpLblkStckOrder */
+  1,  /* ID: 901, type: uchar, name: SdpLdkStckOrder */
+  1,  /* ID: 902, type: uchar, name: SdpRdkStckOrder */
+  1,  /* ID: 903, type: uchar, name: SdpRblkStckOrder */
+  1,  /* ID: 904, type: uchar, name: SdpTosStckOrder */
+  1,  /* ID: 905, type: uchar, name: SdpTdkStckOrder */
+  1,  /* ID: 906, type: enum, name: SdpImgttStrat */
+  1,  /* ID: 907, type: float, name: Sdp3StatAmpl */
+  1,  /* ID: 908, type: enum, name: SdpPhotStrat */
+  1,  /* ID: 909, type: uchar, name: SdpPhotRcent */
+  1,  /* ID: 910, type: uchar, name: SdpPhotRann1 */
+  1,  /* ID: 911, type: uchar, name: SdpPhotRann2 */
+  1,  /* ID: 912, type: uchar, name: SdpCrc */
+  1,  /* ID: 913, type: ushort, name: CCPRODUCT */
+  1,  /* ID: 914, type: ushort, name: CCSTEP */
+  1,  /* ID: 915, type: ushort, name: XIB_FAILURES */
+  FEE_SCRIPTS,  /* ID: 916, type: uchar, name: FEE_SIDE_A */
+  FEE_SCRIPTS,  /* ID: 917, type: uchar, name: FEE_SIDE_B */
+  28,  /* ID: 918, type: uint, name: NLCBORDERS */
+  28,  /* ID: 919, type: float, name: NLCCOEFF_A */
+  28,  /* ID: 920, type: float, name: NLCCOEFF_B */
+  28,  /* ID: 921, type: float, name: NLCCOEFF_C */
+  28,  /* ID: 922, type: float, name: NLCCOEFF_D */
+  1,  /* ID: 923, type: ushort, name: SdpGlobalBias */
+  1,  /* ID: 924, type: enum, name: BiasOrigin */
+  1,  /* ID: 925, type: float, name: SdpGlobalGain */
+  1,  /* ID: 926, type: uint, name: SdpWinImageCeKey */
+  1,  /* ID: 927, type: uint, name: SdpWinImgttCeKey */
+  1,  /* ID: 928, type: uint, name: SdpWinHdrCeKey */
+  1,  /* ID: 929, type: uint, name: SdpWinMLOSCeKey */
+  1,  /* ID: 930, type: uint, name: SdpWinMLBLKCeKey */
+  1,  /* ID: 931, type: uint, name: SdpWinMLDKCeKey */
+  1,  /* ID: 932, type: uint, name: SdpWinMRDKCeKey */
+  1,  /* ID: 933, type: uint, name: SdpWinMRBLKCeKey */
+  1,  /* ID: 934, type: uint, name: SdpWinMTOSCeKey */
+  1,  /* ID: 935, type: uint, name: SdpWinMTDKCeKey */
+  1,  /* ID: 936, type: uint, name: SdpFullImgCeKey */
+  1,  /* ID: 937, type: uint, name: SdpFullHdrCeKey */
+  1,  /* ID: 938, type: uint, name: CE_Timetag_crs */
+  1,  /* ID: 939, type: ushort, name: CE_Timetag_fine */
+  1,  /* ID: 940, type: ushort, name: CE_Counter */
+  1,  /* ID: 941, type: ushort, name: CE_Version */
+  1,  /* ID: 942, type: uchar, name: CE_Integrity */
+  1,  /* ID: 943, type: ushort, name: CE_SemWindowPosX */
+  1,  /* ID: 944, type: ushort, name: CE_SemWindowPosY */
+  1,  /* ID: 945, type: ushort, name: CE_SemWindowSizeX */
+  1,  /* ID: 946, type: ushort, name: CE_SemWindowSizeY */
+  1,  /* ID: 947, type: uint, name: SPILL_CTR */
+  1,  /* ID: 948, type: uchar, name: RZIP_ITER1 */
+  1,  /* ID: 949, type: uchar, name: RZIP_ITER2 */
+  1,  /* ID: 950, type: uchar, name: RZIP_ITER3 */
+  1,  /* ID: 951, type: uchar, name: RZIP_ITER4 */
+  1,  /* ID: 952, type: ushort, name: SdpLdkColMask */
+  1,  /* ID: 953, type: ushort, name: SdpRdkColMask */
+  1,  /* ID: 954, type: ushort, name: FPGA_Version */
+  1,  /* ID: 955, type: ushort, name: FPGA_DPU_Status */
+  1,  /* ID: 956, type: ushort, name: FPGA_DPU_Address */
+  1,  /* ID: 957, type: ushort, name: FPGA_RESET_Status */
+  1,  /* ID: 958, type: ushort, name: FPGA_SEM_Status */
+  1,  /* ID: 959, type: ushort, name: FPGA_Oper_Heater_Status */
+  1,  /* ID: 960, type: ushort, name: GIBTOTRANSFER */
+  1,  /* ID: 961, type: ushort, name: TRANSFERMODE */
+  1,  /* ID: 962, type: uint, name: S2TOTRANSFERSIZE */
+  1,  /* ID: 963, type: uint, name: S4TOTRANSFERSIZE */
+  1,  /* ID: 964, type: uchar, name: TransferComplete */
+  28,  /* ID: 965, type: uint, name: NLCBORDERS_2 */
+  28,  /* ID: 966, type: float, name: NLCCOEFF_A_2 */
+  28,  /* ID: 967, type: float, name: NLCCOEFF_B_2 */
+  28,  /* ID: 968, type: float, name: NLCCOEFF_C_2 */
+  12,  /* ID: 969, type: uchar, name: RF100 */
+  12,  /* ID: 970, type: uchar, name: RF230 */
+  1,  /* ID: 971, type: float, name: distc1 */
+  1,  /* ID: 972, type: float, name: distc2 */
+  1,  /* ID: 973, type: float, name: distc3 */
+  1,  /* ID: 974, type: uint, name: SPARE_UI_0 */
+  1,  /* ID: 975, type: uint, name: SPARE_UI_1 */
+  1,  /* ID: 976, type: uint, name: SPARE_UI_2 */
+  1,  /* ID: 977, type: uint, name: SPARE_UI_3 */
+  1,  /* ID: 978, type: uint, name: SPARE_UI_4 */
+  1,  /* ID: 979, type: uint, name: SPARE_UI_5 */
+  1,  /* ID: 980, type: uint, name: SPARE_UI_6 */
+  1,  /* ID: 981, type: uint, name: SPARE_UI_7 */
+  1,  /* ID: 982, type: uint, name: SPARE_UI_8 */
+  1,  /* ID: 983, type: uint, name: SPARE_UI_9 */
+  1,  /* ID: 984, type: uint, name: SPARE_UI_10 */
+  1,  /* ID: 985, type: uint, name: SPARE_UI_11 */
+  1,  /* ID: 986, type: uint, name: SPARE_UI_12 */
+  1,  /* ID: 987, type: uint, name: SPARE_UI_13 */
+  1,  /* ID: 988, type: uint, name: SPARE_UI_14 */
+  1,  /* ID: 989, type: uint, name: SPARE_UI_15 */
+  1,  /* ID: 990, type: float, name: SPARE_F_0 */
+  1,  /* ID: 991, type: float, name: SPARE_F_1 */
+  1,  /* ID: 992, type: float, name: SPARE_F_2 */
+  1,  /* ID: 993, type: float, name: SPARE_F_3 */
+  1,  /* ID: 994, type: float, name: SPARE_F_4 */
+  1,  /* ID: 995, type: float, name: SPARE_F_5 */
+  1,  /* ID: 996, type: float, name: SPARE_F_6 */
+  1,  /* ID: 997, type: float, name: SPARE_F_7 */
+  1,  /* ID: 998, type: float, name: SPARE_F_8 */
+  1,  /* ID: 999, type: float, name: SPARE_F_9 */
+  1,  /* ID: 1000, type: float, name: SPARE_F_10 */
+  1,  /* ID: 1001, type: float, name: SPARE_F_11 */
+  1,  /* ID: 1002, type: float, name: SPARE_F_12 */
+  1,  /* ID: 1003, type: float, name: SPARE_F_13 */
+  1,  /* ID: 1004, type: float, name: SPARE_F_14 */
+  1,  /* ID: 1005, type: float, name: SPARE_F_15 */
+};
+
+
+
+#ifdef PC_TARGET
+void InitDataPool()
+{
+  dpCordet = dpCordetInit;
+  dpIasw = dpIaswInit;
+  dpIbsw = dpIbswInit;
+}
+
+/*
+  NOTE: content generated with:
+  cat src/CrIaDataPool.c | sed -n -e "3092,/1005/p" | sed -e "s/,/);/g" -e "s/\./->/g" -e "s/&/\&(p/g" > mycolumn
+*/
+void initDpAddresses (struct DataPoolCordet *pdpCordet, struct DataPoolIasw *pdpIasw, struct DataPoolIbsw *pdpIbsw)
+{
+  dataPoolAddr[0] = NULL;  /* ID: 0, unused */
+  dataPoolAddr[1] = (void *)&(pdpIasw->buildNumber);  /* ID: 1 */		   	   
+  dataPoolAddr[2] = (void *)&(pdpCordet->AppErrCode);  /* ID: 2 */	   
+  dataPoolAddr[3] = (void *)&(pdpCordet->NofAllocatedInRep);  /* ID: 3 */	   	   
+  dataPoolAddr[4] = (void *)&(pdpCordet->MaxNOfInRep);  /* ID: 4 */	   
+  dataPoolAddr[5] = (void *)&(pdpCordet->NofAllocatedInCmd);  /* ID: 5 */	   	   
+  dataPoolAddr[6] = (void *)&(pdpCordet->MaxNOfInCmd);  /* ID: 6 */	   
+  dataPoolAddr[7] = (void *)&(pdpCordet->Sem_NOfPendingInCmp);  /* ID: 7 */  
+  dataPoolAddr[8] = (void *)&(pdpCordet->Sem_PCRLSize);  /* ID: 8 */	   
+  dataPoolAddr[9] = (void *)&(pdpCordet->Sem_NOfLoadedInCmp);  /* ID: 9 */   
+  dataPoolAddr[10] = (void *)&(pdpCordet->GrdObc_NOfPendingInCmp);  /* ID: 10 */  	   
+  dataPoolAddr[11] = (void *)&(pdpCordet->GrdObc_PCRLSize);  /* ID: 11 */	       	   
+  dataPoolAddr[12] = (void *)&(pdpCordet->NOfAllocatedOutCmp);  /* ID: 12 */      
+  dataPoolAddr[13] = (void *)&(pdpCordet->MaxNOfOutCmp);  /* ID: 13 */	       
+  dataPoolAddr[14] = (void *)&(pdpCordet->NOfInstanceId);  /* ID: 14 */	       
+  dataPoolAddr[15] = (void *)&(pdpCordet->OutMg1_NOfPendingOutCmp);  /* ID: 15 */ 	   
+  dataPoolAddr[16] = (void *)&(pdpCordet->OutMg1_POCLSize);  /* ID: 16 */	       	   
+  dataPoolAddr[17] = (void *)&(pdpCordet->OutMg1_NOfLoadedOutCmp);  /* ID: 17 */  	   
+  dataPoolAddr[18] = (void *)&(pdpCordet->OutMg2_NOfPendingOutCmp);  /* ID: 18 */ 	   
+  dataPoolAddr[19] = (void *)&(pdpCordet->OutMg2_POCLSize);  /* ID: 19 */	       	   
+  dataPoolAddr[20] = (void *)&(pdpCordet->OutMg2_NOfLoadedOutCmp);  /* ID: 20 */  	   
+  dataPoolAddr[21] = (void *)&(pdpCordet->OutMg3_NOfPendingOutCmp);  /* ID: 21 */ 	   
+  dataPoolAddr[22] = (void *)&(pdpCordet->OutMg3_POCLSize);  /* ID: 22 */	       	   
+  dataPoolAddr[23] = (void *)&(pdpCordet->OutMg3_NOfLoadedOutCmp);  /* ID: 23 */  	   
+  dataPoolAddr[24] = (void *)&(pdpCordet->InSem_SeqCnt);  /* ID: 24 */	       
+  dataPoolAddr[25] = (void *)&(pdpCordet->InSem_NOfPendingPckts);  /* ID: 25 */  
+  dataPoolAddr[26] = (void *)&(pdpCordet->InSem_NOfGroups);  /* ID: 26 */	      	   
+  dataPoolAddr[27] = (void *)&(pdpCordet->InSem_PcktQueueSize);  /* ID: 27 */    
+  dataPoolAddr[28] = (void *)&(pdpCordet->InSem_Src);  /* ID: 28 */	      
+  dataPoolAddr[29] = (void *)&(pdpCordet->InObc_NOfPendingPckts);  /* ID: 29 */  
+  dataPoolAddr[30] = (void *)&(pdpCordet->InObc_NOfGroups);  /* ID: 30 */	      	   
+  dataPoolAddr[31] = (void *)&(pdpCordet->InObc_PcktQueueSize);  /* ID: 31 */    
+  dataPoolAddr[32] = (void *)&(pdpCordet->InObc_Src);  /* ID: 32 */	      
+  dataPoolAddr[33] = (void *)&(pdpCordet->InGrd_NOfPendingPckts);  /* ID: 33 */  
+  dataPoolAddr[34] = (void *)&(pdpCordet->InGrd_NOfGroups);  /* ID: 34 */	      	   
+  dataPoolAddr[35] = (void *)&(pdpCordet->InGrd_PcktQueueSize);  /* ID: 35 */    
+  dataPoolAddr[36] = (void *)&(pdpCordet->InGrd_Src);  /* ID: 36 */	      
+  dataPoolAddr[37] = (void *)&(pdpCordet->OutSem_Dest);  /* ID: 37 */	      
+  dataPoolAddr[38] = (void *)&(pdpCordet->OutSem_SeqCnt);  /* ID: 38 */	      
+  dataPoolAddr[39] = (void *)&(pdpCordet->OutSem_NOfPendingPckts);  /* ID: 39 */ 	   
+  dataPoolAddr[40] = (void *)&(pdpCordet->OutSem_NOfGroups);  /* ID: 40 */	      	   
+  dataPoolAddr[41] = (void *)&(pdpCordet->OutSem_PcktQueueSize);  /* ID: 41 */   
+  dataPoolAddr[42] = (void *)&(pdpCordet->OutObc_Dest);  /* ID: 42 */	      
+  dataPoolAddr[43] = (void *)&(pdpCordet->OutObc_SeqCnt_Group0);  /* ID: 43 */   
+  dataPoolAddr[44] = (void *)&(pdpCordet->OutObc_SeqCnt_Group1);  /* ID: 44 */   
+  dataPoolAddr[45] = (void *)&(pdpCordet->OutObc_NOfPendingPckts);  /* ID: 45 */ 	   
+  dataPoolAddr[46] = (void *)&(pdpCordet->OutObc_NOfGroups);  /* ID: 46 */	      	   
+  dataPoolAddr[47] = (void *)&(pdpCordet->OutObc_PcktQueueSize);  /* ID: 47 */   
+  dataPoolAddr[48] = (void *)&(pdpCordet->OutGrd_Dest);  /* ID: 48 */	      
+  dataPoolAddr[49] = (void *)&(pdpCordet->OutGrd_SeqCnt_Group0);  /* ID: 49 */   
+  dataPoolAddr[50] = (void *)&(pdpCordet->OutGrd_SeqCnt_Group1);  /* ID: 50 */   
+  dataPoolAddr[51] = (void *)&(pdpCordet->OutGrd_SeqCnt_Group2);  /* ID: 51 */   
+  dataPoolAddr[52] = (void *)&(pdpCordet->OutGrd_NOfPendingPckts);  /* ID: 52 */ 	   
+  dataPoolAddr[53] = (void *)&(pdpCordet->OutGrd_NOfGroups);  /* ID: 53 */	      	   
+  dataPoolAddr[54] = (void *)&(pdpCordet->OutGrd_PcktQueueSize);  /* ID: 54 */   
+  dataPoolAddr[55] = (void *)&(pdpIasw->sibNFull);  /* ID: 55 */		      	   
+  dataPoolAddr[56] = (void *)&(pdpIasw->cibNFull);  /* ID: 56 */		      	   
+  dataPoolAddr[57] = (void *)&(pdpIasw->gibNFull);  /* ID: 57 */		      	   
+  dataPoolAddr[58] = (void *)&(pdpIasw->sibNWin);  /* ID: 58 */		      
+  dataPoolAddr[59] = (void *)&(pdpIasw->cibNWin);  /* ID: 59 */		      
+  dataPoolAddr[60] = (void *)&(pdpIasw->gibNWin);  /* ID: 60 */		      
+  dataPoolAddr[61] = (void *)&(pdpIasw->sibSizeFull);  /* ID: 61 */	      
+  dataPoolAddr[62] = (void *)&(pdpIasw->cibSizeFull);  /* ID: 62 */	      
+  dataPoolAddr[63] = (void *)&(pdpIasw->gibSizeFull);  /* ID: 63 */	      
+  dataPoolAddr[64] = (void *)&(pdpIasw->sibSizeWin);  /* ID: 64 */		      	   
+  dataPoolAddr[65] = (void *)&(pdpIasw->cibSizeWin);  /* ID: 65 */		      	   
+  dataPoolAddr[66] = (void *)&(pdpIasw->gibSizeWin);  /* ID: 66 */		      	   
+  dataPoolAddr[67] = (void *)&(pdpIasw->sibIn);  /* ID: 67 */		      
+  dataPoolAddr[68] = (void *)&(pdpIasw->sibOut);  /* ID: 68 */		      
+  dataPoolAddr[69] = (void *)&(pdpIasw->cibIn);  /* ID: 69 */		      
+  dataPoolAddr[70] = (void *)&(pdpIasw->gibIn);  /* ID: 70 */		      
+  dataPoolAddr[71] = (void *)&(pdpIasw->gibOut);  /* ID: 71 */		      
+  dataPoolAddr[72] = (void *)&(pdpIasw->sdbState);  /* ID: 72 */		      	   
+  dataPoolAddr[73] = (void *)&(pdpIasw->sdbStateCnt);  /* ID: 73 */	      
+  dataPoolAddr[74] = (void *)&(pdpIasw->OffsetX);  /* ID: 74 */		      
+  dataPoolAddr[75] = (void *)&(pdpIasw->OffsetY);  /* ID: 75 */		      
+  dataPoolAddr[76] = (void *)&(pdpIasw->TargetLocationX);  /* ID: 76 */	      
+  dataPoolAddr[77] = (void *)&(pdpIasw->TargetLocationY);  /* ID: 77 */	      
+  dataPoolAddr[78] = (void *)&(pdpIasw->IntegStartTimeCrs);  /* ID: 78 */	      	   
+  dataPoolAddr[79] = (void *)&(pdpIasw->IntegStartTimeFine);  /* ID: 79 */	      	   
+  dataPoolAddr[80] = (void *)&(pdpIasw->IntegEndTimeCrs);  /* ID: 80 */	      
+  dataPoolAddr[81] = (void *)&(pdpIasw->IntegEndTimeFine);  /* ID: 81 */	      	   
+  dataPoolAddr[82] = (void *)&(pdpIasw->DataCadence);  /* ID: 82 */	      
+  dataPoolAddr[83] = (void *)&(pdpIasw->ValidityStatus);  /* ID: 83 */	      
+  dataPoolAddr[84] = (void *)&(pdpIasw->NOfTcAcc);  /* ID: 84 */		      	   
+  dataPoolAddr[85] = (void *)&(pdpIasw->NOfAccFailedTc);  /* ID: 85 */	      
+  dataPoolAddr[86] = (void *)&(pdpIasw->SeqCntLastAccTcFromObc);  /* ID: 86 */   
+  dataPoolAddr[87] = (void *)&(pdpIasw->SeqCntLastAccTcFromGrd);  /* ID: 87 */   
+  dataPoolAddr[88] = (void *)&(pdpIasw->SeqCntLastAccFailTc);  /* ID: 88 */      
+  dataPoolAddr[89] = (void *)&(pdpIasw->NOfStartFailedTc);  /* ID: 89 */	      	   
+  dataPoolAddr[90] = (void *)&(pdpIasw->SeqCntLastStartFailTc);  /* ID: 90 */    
+  dataPoolAddr[91] = (void *)&(pdpIasw->NOfTcTerm);  /* ID: 91 */		      	   
+  dataPoolAddr[92] = (void *)&(pdpIasw->NOfTermFailedTc);  /* ID: 92 */	      
+  dataPoolAddr[93] = (void *)&(pdpIasw->SeqCntLastTermFailTc);  /* ID: 93 */     
+  dataPoolAddr[94] = (void *)&(pdpIasw->RdlSidList);  /* ID: 94 */		      	   
+  dataPoolAddr[95] = (void *)&(pdpIasw->isRdlFree);  /* ID: 95 */		      	   
+  dataPoolAddr[96] = (void *)&(pdpIasw->RdlCycCntList);  /* ID: 96 */	      
+  dataPoolAddr[97] = (void *)&(pdpIasw->RdlPeriodList);  /* ID: 97 */	      
+  dataPoolAddr[98] = (void *)&(pdpIasw->RdlEnabledList);  /* ID: 98 */	      
+  dataPoolAddr[99] = (void *)&(pdpIasw->RdlDestList);  /* ID: 99 */              
+  dataPoolAddr[100] = (void *)&(pdpIasw->RdlDataItemList_0);  /* ID: 100 */		 	   
+  dataPoolAddr[101] = (void *)&(pdpIasw->RdlDataItemList_1);  /* ID: 101 */		 	   
+  dataPoolAddr[102] = (void *)&(pdpIasw->RdlDataItemList_2);  /* ID: 102 */		 	   
+  dataPoolAddr[103] = (void *)&(pdpIasw->RdlDataItemList_3);  /* ID: 103 */		 	   
+  dataPoolAddr[104] = (void *)&(pdpIasw->RdlDataItemList_4);  /* ID: 104 */		 	   
+  dataPoolAddr[105] = (void *)&(pdpIasw->RdlDataItemList_5);  /* ID: 105 */		 	   
+  dataPoolAddr[106] = (void *)&(pdpIasw->RdlDataItemList_6);  /* ID: 106 */		 	   
+  dataPoolAddr[107] = (void *)&(pdpIasw->RdlDataItemList_7);  /* ID: 107 */		 	   
+  dataPoolAddr[108] = (void *)&(pdpIasw->RdlDataItemList_8);  /* ID: 108 */		 	   
+  dataPoolAddr[109] = (void *)&(pdpIasw->RdlDataItemList_9);  /* ID: 109 */		 	   
+  dataPoolAddr[110] = (void *)&(pdpIasw->DEBUG_VAR);  /* ID: 110 */			 	   
+  dataPoolAddr[111] = (void *)&(pdpIasw->DEBUG_VAR_ADDR);  /* ID: 111 */		 	   
+  dataPoolAddr[112] = (void *)&(pdpIasw->EVTFILTERDEF);  /* ID: 112 */		 
+  dataPoolAddr[113] = (void *)&(pdpIasw->evtEnabledList);  /* ID: 113 */		 	   
+  dataPoolAddr[114] = (void *)&(pdpIasw->lastPatchedAddr);  /* ID: 114 */		 	   
+  dataPoolAddr[115] = (void *)&(pdpIasw->lastDumpAddr);  /* ID: 115 */		 
+  dataPoolAddr[116] = (void *)&(pdpIasw->sdu2State);  /* ID: 116 */			 	   
+  dataPoolAddr[117] = (void *)&(pdpIasw->sdu4State);  /* ID: 117 */			 	   
+  dataPoolAddr[118] = (void *)&(pdpIasw->sdu2StateCnt);  /* ID: 118 */		 
+  dataPoolAddr[119] = (void *)&(pdpIasw->sdu4StateCnt);  /* ID: 119 */		 
+  dataPoolAddr[120] = (void *)&(pdpIasw->sdu2BlockCnt);  /* ID: 120 */		 
+  dataPoolAddr[121] = (void *)&(pdpIasw->sdu4BlockCnt);  /* ID: 121 */		 
+  dataPoolAddr[122] = (void *)&(pdpIasw->sdu2RemSize);  /* ID: 122 */		 
+  dataPoolAddr[123] = (void *)&(pdpIasw->sdu4RemSize);  /* ID: 123 */		 
+  dataPoolAddr[124] = (void *)&(pdpIasw->sdu2DownTransferSize);  /* ID: 124 */	 
+  dataPoolAddr[125] = (void *)&(pdpIasw->sdu4DownTransferSize);  /* ID: 125 */	 
+  dataPoolAddr[126] = (void *)&(pdpIasw->sdsCounter);  /* ID: 126 */		 
+  dataPoolAddr[127] = (void *)&(pdpIasw->FdGlbEnable);  /* ID: 127 */		 
+  dataPoolAddr[128] = (void *)&(pdpIasw->RpGlbEnable);  /* ID: 128 */		 
+  dataPoolAddr[129] = (void *)&(pdpIasw->FdCheckTTMState);  /* ID: 129 */		 	   
+  dataPoolAddr[130] = (void *)&(pdpIasw->FdCheckTTMIntEn);  /* ID: 130 */		 	   
+  dataPoolAddr[131] = (void *)&(pdpIasw->FdCheckTTMExtEn);  /* ID: 131 */		 	   
+  dataPoolAddr[132] = (void *)&(pdpIasw->RpTTMIntEn);  /* ID: 132 */		 
+  dataPoolAddr[133] = (void *)&(pdpIasw->RpTTMExtEn);  /* ID: 133 */		 
+  dataPoolAddr[134] = (void *)&(pdpIasw->FdCheckTTMCnt);  /* ID: 134 */		 
+  dataPoolAddr[135] = (void *)&(pdpIasw->FdCheckTTMSpCnt);  /* ID: 135 */		 	   
+  dataPoolAddr[136] = (void *)&(pdpIasw->FdCheckTTMCntThr);  /* ID: 136 */		 	   
+  dataPoolAddr[137] = (void *)&(pdpIasw->TTC_LL);  /* ID: 137 */			 	   
+  dataPoolAddr[138] = (void *)&(pdpIasw->TTC_UL);  /* ID: 138 */			 	   
+  dataPoolAddr[139] = (void *)&(pdpIasw->TTM_LIM);  /* ID: 139 */			 	   
+  dataPoolAddr[140] = (void *)&(pdpIasw->FdCheckSDSCState);  /* ID: 140 */		 	   
+  dataPoolAddr[141] = (void *)&(pdpIasw->FdCheckSDSCIntEn);  /* ID: 141 */		 	   
+  dataPoolAddr[142] = (void *)&(pdpIasw->FdCheckSDSCExtEn);  /* ID: 142 */		 	   
+  dataPoolAddr[143] = (void *)&(pdpIasw->RpSDSCIntEn);  /* ID: 143 */		 
+  dataPoolAddr[144] = (void *)&(pdpIasw->RpSDSCExtEn);  /* ID: 144 */		 
+  dataPoolAddr[145] = (void *)&(pdpIasw->FdCheckSDSCCnt);  /* ID: 145 */		 	   
+  dataPoolAddr[146] = (void *)&(pdpIasw->FdCheckSDSCSpCnt);  /* ID: 146 */		 	   
+  dataPoolAddr[147] = (void *)&(pdpIasw->FdCheckSDSCCntThr);  /* ID: 147 */		 	   
+  dataPoolAddr[148] = (void *)&(pdpIasw->FdCheckComErrState);  /* ID: 148 */	 
+  dataPoolAddr[149] = (void *)&(pdpIasw->FdCheckComErrIntEn);  /* ID: 149 */	 
+  dataPoolAddr[150] = (void *)&(pdpIasw->FdCheckComErrExtEn);  /* ID: 150 */	 
+  dataPoolAddr[151] = (void *)&(pdpIasw->RpComErrIntEn);  /* ID: 151 */		 
+  dataPoolAddr[152] = (void *)&(pdpIasw->RpComErrExtEn);  /* ID: 152 */		 
+  dataPoolAddr[153] = (void *)&(pdpIasw->FdCheckComErrCnt);  /* ID: 153 */		 	   
+  dataPoolAddr[154] = (void *)&(pdpIasw->FdCheckComErrSpCnt);  /* ID: 154 */	 
+  dataPoolAddr[155] = (void *)&(pdpIasw->FdCheckComErrCntThr);  /* ID: 155 */	 
+  dataPoolAddr[156] = (void *)&(pdpIasw->FdCheckTimeOutState);  /* ID: 156 */	 
+  dataPoolAddr[157] = (void *)&(pdpIasw->FdCheckTimeOutIntEn);  /* ID: 157 */	 
+  dataPoolAddr[158] = (void *)&(pdpIasw->FdCheckTimeOutExtEn);  /* ID: 158 */	 
+  dataPoolAddr[159] = (void *)&(pdpIasw->RpTimeOutIntEn);  /* ID: 159 */		 	   
+  dataPoolAddr[160] = (void *)&(pdpIasw->RpTimeOutExtEn);  /* ID: 160 */		 	   
+  dataPoolAddr[161] = (void *)&(pdpIasw->FdCheckTimeOutCnt);  /* ID: 161 */		 	   
+  dataPoolAddr[162] = (void *)&(pdpIasw->FdCheckTimeOutSpCnt);  /* ID: 162 */	 
+  dataPoolAddr[163] = (void *)&(pdpIasw->FdCheckTimeOutCntThr);  /* ID: 163 */	 
+  dataPoolAddr[164] = (void *)&(pdpIasw->SEM_TO_POWERON);  /* ID: 164 */		 	   
+  dataPoolAddr[165] = (void *)&(pdpIasw->SEM_TO_SAFE);  /* ID: 165 */		 
+  dataPoolAddr[166] = (void *)&(pdpIasw->SEM_TO_STAB);  /* ID: 166 */		 
+  dataPoolAddr[167] = (void *)&(pdpIasw->SEM_TO_TEMP);  /* ID: 167 */		 
+  dataPoolAddr[168] = (void *)&(pdpIasw->SEM_TO_CCD);  /* ID: 168 */		 
+  dataPoolAddr[169] = (void *)&(pdpIasw->SEM_TO_DIAG);  /* ID: 169 */		 
+  dataPoolAddr[170] = (void *)&(pdpIasw->SEM_TO_STANDBY);  /* ID: 170 */		 	   
+  dataPoolAddr[171] = (void *)&(pdpIasw->FdCheckSafeModeState);  /* ID: 171 */	 
+  dataPoolAddr[172] = (void *)&(pdpIasw->FdCheckSafeModeIntEn);  /* ID: 172 */	 
+  dataPoolAddr[173] = (void *)&(pdpIasw->FdCheckSafeModeExtEn);  /* ID: 173 */	 
+  dataPoolAddr[174] = (void *)&(pdpIasw->RpSafeModeIntEn);  /* ID: 174 */		 	   
+  dataPoolAddr[175] = (void *)&(pdpIasw->RpSafeModeExtEn);  /* ID: 175 */		 	   
+  dataPoolAddr[176] = (void *)&(pdpIasw->FdCheckSafeModeCnt);  /* ID: 176 */	 
+  dataPoolAddr[177] = (void *)&(pdpIasw->FdCheckSafeModeSpCnt);  /* ID: 177 */	 
+  dataPoolAddr[178] = (void *)&(pdpIasw->FdCheckSafeModeCntThr);  /* ID: 178 */	 
+  dataPoolAddr[179] = (void *)&(pdpIasw->FdCheckAliveState);  /* ID: 179 */		 	   
+  dataPoolAddr[180] = (void *)&(pdpIasw->FdCheckAliveIntEn);  /* ID: 180 */		 	   
+  dataPoolAddr[181] = (void *)&(pdpIasw->FdCheckAliveExtEn);  /* ID: 181 */		 	   
+  dataPoolAddr[182] = (void *)&(pdpIasw->RpAliveIntEn);  /* ID: 182 */		 
+  dataPoolAddr[183] = (void *)&(pdpIasw->RpAliveExtEn);  /* ID: 183 */		 
+  dataPoolAddr[184] = (void *)&(pdpIasw->FdCheckAliveCnt);  /* ID: 184 */		 	   
+  dataPoolAddr[185] = (void *)&(pdpIasw->FdCheckAliveSpCnt);  /* ID: 185 */		 	   
+  dataPoolAddr[186] = (void *)&(pdpIasw->FdCheckAliveCntThr);  /* ID: 186 */	 
+  dataPoolAddr[187] = (void *)&(pdpIasw->SEM_HK_DEF_PER);  /* ID: 187 */		 	   
+  dataPoolAddr[188] = (void *)&(pdpIasw->SEMALIVE_DELAYEDSEMHK);  /* ID: 188 */	 
+  dataPoolAddr[189] = (void *)&(pdpIasw->FdCheckSemAnoEvtState);  /* ID: 189 */	 
+  dataPoolAddr[190] = (void *)&(pdpIasw->FdCheckSemAnoEvtIntEn);  /* ID: 190 */	 
+  dataPoolAddr[191] = (void *)&(pdpIasw->FdCheckSemAnoEvtExtEn);  /* ID: 191 */	 
+  dataPoolAddr[192] = (void *)&(pdpIasw->RpSemAnoEvtIntEn);  /* ID: 192 */		 	   
+  dataPoolAddr[193] = (void *)&(pdpIasw->RpSemAnoEvtExtEn);  /* ID: 193 */		 	   
+  dataPoolAddr[194] = (void *)&(pdpIasw->FdCheckSemAnoEvtCnt);  /* ID: 194 */	 
+  dataPoolAddr[195] = (void *)&(pdpIasw->FdCheckSemAnoEvtSpCnt);  /* ID: 195 */	 
+  dataPoolAddr[196] = (void *)&(pdpIasw->FdCheckSemAnoEvtCntThr);  /* ID: 196 */	 	   
+  dataPoolAddr[197] = (void *)&(pdpIasw->semAnoEvtResp_1);  /* ID: 197 */		 	   
+  dataPoolAddr[198] = (void *)&(pdpIasw->semAnoEvtResp_2);  /* ID: 198 */		 	   
+  dataPoolAddr[199] = (void *)&(pdpIasw->semAnoEvtResp_3);  /* ID: 199 */		 	   
+  dataPoolAddr[200] = (void *)&(pdpIasw->semAnoEvtResp_4);  /* ID: 200 */		 	   
+  dataPoolAddr[201] = (void *)&(pdpIasw->semAnoEvtResp_5);  /* ID: 201 */		 	   
+  dataPoolAddr[202] = (void *)&(pdpIasw->semAnoEvtResp_6);  /* ID: 202 */		 	   
+  dataPoolAddr[203] = (void *)&(pdpIasw->semAnoEvtResp_7);  /* ID: 203 */		 	   
+  dataPoolAddr[204] = (void *)&(pdpIasw->semAnoEvtResp_8);  /* ID: 204 */		 	   
+  dataPoolAddr[205] = (void *)&(pdpIasw->semAnoEvtResp_9);  /* ID: 205 */		 	   
+  dataPoolAddr[206] = (void *)&(pdpIasw->semAnoEvtResp_10);  /* ID: 206 */		 	   
+  dataPoolAddr[207] = (void *)&(pdpIasw->semAnoEvtResp_11);  /* ID: 207 */		 	   
+  dataPoolAddr[208] = (void *)&(pdpIasw->semAnoEvtResp_12);  /* ID: 208 */		 	   
+  dataPoolAddr[209] = (void *)&(pdpIasw->semAnoEvtResp_13);  /* ID: 209 */		 	   
+  dataPoolAddr[210] = (void *)&(pdpIasw->semAnoEvtResp_14);  /* ID: 210 */		 	   
+  dataPoolAddr[211] = (void *)&(pdpIasw->semAnoEvtResp_15);  /* ID: 211 */		 	   
+  dataPoolAddr[212] = (void *)&(pdpIasw->semAnoEvtResp_16);  /* ID: 212 */		 	   
+  dataPoolAddr[213] = (void *)&(pdpIasw->semAnoEvtResp_17);  /* ID: 213 */		 	   
+  dataPoolAddr[214] = (void *)&(pdpIasw->semAnoEvtResp_18);  /* ID: 214 */		 	   
+  dataPoolAddr[215] = (void *)&(pdpIasw->semAnoEvtResp_19);  /* ID: 215 */		 	   
+  dataPoolAddr[216] = (void *)&(pdpIasw->semAnoEvtResp_20);  /* ID: 216 */		 	   
+  dataPoolAddr[217] = (void *)&(pdpIasw->semAnoEvtResp_21);  /* ID: 217 */		 	   
+  dataPoolAddr[218] = (void *)&(pdpIasw->semAnoEvtResp_22);  /* ID: 218 */		 	   
+  dataPoolAddr[219] = (void *)&(pdpIasw->semAnoEvtResp_23);  /* ID: 219 */		 	   
+  dataPoolAddr[220] = (void *)&(pdpIasw->semAnoEvtResp_24);  /* ID: 220 */		 	   
+  dataPoolAddr[221] = (void *)&(pdpIasw->semAnoEvtResp_25);  /* ID: 221 */		 	   
+  dataPoolAddr[222] = (void *)&(pdpIasw->semAnoEvtResp_26);  /* ID: 222 */		 	   
+  dataPoolAddr[223] = (void *)&(pdpIasw->semAnoEvtResp_27);  /* ID: 223 */		 	   
+  dataPoolAddr[224] = (void *)&(pdpIasw->semAnoEvtResp_28);  /* ID: 224 */		 	   
+  dataPoolAddr[225] = (void *)&(pdpIasw->semAnoEvtResp_29);  /* ID: 225 */		 	   
+  dataPoolAddr[226] = (void *)&(pdpIasw->FdCheckSemLimitState);  /* ID: 226 */	 
+  dataPoolAddr[227] = (void *)&(pdpIasw->FdCheckSemLimitIntEn);  /* ID: 227 */	 
+  dataPoolAddr[228] = (void *)&(pdpIasw->FdCheckSemLimitExtEn);  /* ID: 228 */	 
+  dataPoolAddr[229] = (void *)&(pdpIasw->RpSemLimitIntEn);  /* ID: 229 */		 	   
+  dataPoolAddr[230] = (void *)&(pdpIasw->RpSemLimitExtEn);  /* ID: 230 */		 	   
+  dataPoolAddr[231] = (void *)&(pdpIasw->FdCheckSemLimitCnt);  /* ID: 231 */	 
+  dataPoolAddr[232] = (void *)&(pdpIasw->FdCheckSemLimitSpCnt);  /* ID: 232 */	 
+  dataPoolAddr[233] = (void *)&(pdpIasw->FdCheckSemLimitCntThr);  /* ID: 233 */	 
+  dataPoolAddr[234] = (void *)&(pdpIasw->SEM_LIM_DEL_T);  /* ID: 234 */		 
+  dataPoolAddr[235] = (void *)&(pdpIasw->FdCheckDpuHkState);  /* ID: 235 */		 	   
+  dataPoolAddr[236] = (void *)&(pdpIasw->FdCheckDpuHkIntEn);  /* ID: 236 */		 	   
+  dataPoolAddr[237] = (void *)&(pdpIasw->FdCheckDpuHkExtEn);  /* ID: 237 */		 	   
+  dataPoolAddr[238] = (void *)&(pdpIasw->RpDpuHkIntEn);  /* ID: 238 */		 
+  dataPoolAddr[239] = (void *)&(pdpIasw->RpDpuHkExtEn);  /* ID: 239 */		 
+  dataPoolAddr[240] = (void *)&(pdpIasw->FdCheckDpuHkCnt);  /* ID: 240 */		 	   
+  dataPoolAddr[241] = (void *)&(pdpIasw->FdCheckDpuHkSpCnt);  /* ID: 241 */		 	   
+  dataPoolAddr[242] = (void *)&(pdpIasw->FdCheckDpuHkCntThr);  /* ID: 242 */	 
+  dataPoolAddr[243] = (void *)&(pdpIasw->FdCheckCentConsState);  /* ID: 243 */	 
+  dataPoolAddr[244] = (void *)&(pdpIasw->FdCheckCentConsIntEn);  /* ID: 244 */	 
+  dataPoolAddr[245] = (void *)&(pdpIasw->FdCheckCentConsExtEn);  /* ID: 245 */	 
+  dataPoolAddr[246] = (void *)&(pdpIasw->RpCentConsIntEn);  /* ID: 246 */		 	   
+  dataPoolAddr[247] = (void *)&(pdpIasw->RpCentConsExtEn);  /* ID: 247 */		 	   
+  dataPoolAddr[248] = (void *)&(pdpIasw->FdCheckCentConsCnt);  /* ID: 248 */	 
+  dataPoolAddr[249] = (void *)&(pdpIasw->FdCheckCentConsSpCnt);  /* ID: 249 */	 
+  dataPoolAddr[250] = (void *)&(pdpIasw->FdCheckCentConsCntThr);  /* ID: 250 */	 
+  dataPoolAddr[251] = (void *)&(pdpIasw->FdCheckResState);  /* ID: 251 */		 	   
+  dataPoolAddr[252] = (void *)&(pdpIasw->FdCheckResIntEn);  /* ID: 252 */		 	   
+  dataPoolAddr[253] = (void *)&(pdpIasw->FdCheckResExtEn);  /* ID: 253 */		 	   
+  dataPoolAddr[254] = (void *)&(pdpIasw->RpResIntEn);  /* ID: 254 */		 
+  dataPoolAddr[255] = (void *)&(pdpIasw->RpResExtEn);  /* ID: 255 */		 
+  dataPoolAddr[256] = (void *)&(pdpIasw->FdCheckResCnt);  /* ID: 256 */		 
+  dataPoolAddr[257] = (void *)&(pdpIasw->FdCheckResSpCnt);  /* ID: 257 */		 	   
+  dataPoolAddr[258] = (void *)&(pdpIasw->FdCheckResCntThr);  /* ID: 258 */		 	   
+  dataPoolAddr[259] = (void *)&(pdpIasw->CPU1_USAGE_MAX);  /* ID: 259 */		 	   
+  dataPoolAddr[260] = (void *)&(pdpIasw->MEM_USAGE_MAX);  /* ID: 260 */		 
+  dataPoolAddr[261] = (void *)&(pdpIasw->FdCheckSemCons);  /* ID: 261 */		 	   
+  dataPoolAddr[262] = (void *)&(pdpIasw->FdCheckSemConsIntEn);  /* ID: 262 */	 
+  dataPoolAddr[263] = (void *)&(pdpIasw->FdCheckSemConsExtEn);  /* ID: 263 */	 
+  dataPoolAddr[264] = (void *)&(pdpIasw->RpSemConsIntEn);  /* ID: 264 */		 	   
+  dataPoolAddr[265] = (void *)&(pdpIasw->RpSemConsExtEn);  /* ID: 265 */		 	   
+  dataPoolAddr[266] = (void *)&(pdpIasw->FdCheckSemConsCnt);  /* ID: 266 */		 	   
+  dataPoolAddr[267] = (void *)&(pdpIasw->FdCheckSemConsSpCnt);  /* ID: 267 */	 
+  dataPoolAddr[268] = (void *)&(pdpIasw->FdCheckSemConsCntThr);  /* ID: 268 */	 
+  dataPoolAddr[269] = (void *)&(pdpIasw->semState);  /* ID: 269 */			 	   
+  dataPoolAddr[270] = (void *)&(pdpIasw->semOperState);  /* ID: 270 */		 
+  dataPoolAddr[271] = (void *)&(pdpIasw->semStateCnt);  /* ID: 271 */		 
+  dataPoolAddr[272] = (void *)&(pdpIasw->semOperStateCnt);  /* ID: 272 */		 	   
+  dataPoolAddr[273] = (void *)&(pdpIasw->imageCycleCnt);  /* ID: 273 */		 
+  dataPoolAddr[274] = (void *)&(pdpIasw->acqImageCnt);  /* ID: 274 */		 
+  dataPoolAddr[275] = (void *)&(pdpIasw->sciSubMode);  /* ID: 275 */		 
+  dataPoolAddr[276] = (void *)&(pdpIasw->LastSemPckt);  /* ID: 276 */		 
+  dataPoolAddr[277] = (void *)&(pdpIasw->SEM_ON_CODE);  /* ID: 277 */		 
+  dataPoolAddr[278] = (void *)&(pdpIasw->SEM_OFF_CODE);  /* ID: 278 */		 
+  dataPoolAddr[279] = (void *)&(pdpIasw->SEM_INIT_T1);  /* ID: 279 */		 
+  dataPoolAddr[280] = (void *)&(pdpIasw->SEM_INIT_T2);  /* ID: 280 */		 
+  dataPoolAddr[281] = (void *)&(pdpIasw->SEM_OPER_T1);  /* ID: 281 */		 
+  dataPoolAddr[282] = (void *)&(pdpIasw->SEM_SHUTDOWN_T1);  /* ID: 282 */		 	   
+  dataPoolAddr[283] = (void *)&(pdpIasw->SEM_SHUTDOWN_T11);  /* ID: 283 */		 	   
+  dataPoolAddr[284] = (void *)&(pdpIasw->SEM_SHUTDOWN_T12);  /* ID: 284 */		 	   
+  dataPoolAddr[285] = (void *)&(pdpIasw->SEM_SHUTDOWN_T2);  /* ID: 285 */		 	   
+  dataPoolAddr[286] = (void *)&(pdpIasw->iaswState);  /* ID: 286 */			 	   
+  dataPoolAddr[287] = (void *)&(pdpIasw->iaswStateCnt);  /* ID: 287 */		 
+  dataPoolAddr[288] = (void *)&(pdpIasw->iaswCycleCnt);  /* ID: 288 */		 
+  dataPoolAddr[289] = (void *)&(pdpIasw->prepScienceNode);  /* ID: 289 */		 	   
+  dataPoolAddr[290] = (void *)&(pdpIasw->prepScienceCnt);  /* ID: 290 */		 	   
+  dataPoolAddr[291] = (void *)&(pdpIasw->controlledSwitchOffNode);  /* ID: 291 */	 	   
+  dataPoolAddr[292] = (void *)&(pdpIasw->controlledSwitchOffCnt);  /* ID: 292 */	 	   
+  dataPoolAddr[293] = (void *)&(pdpIasw->CTRLD_SWITCH_OFF_T1);  /* ID: 293 */	 
+  dataPoolAddr[294] = (void *)&(pdpIasw->algoCent0State);  /* ID: 294 */		 	   
+  dataPoolAddr[295] = (void *)&(pdpIasw->algoCent0Cnt);  /* ID: 295 */		 
+  dataPoolAddr[296] = (void *)&(pdpIasw->algoCent0Enabled);  /* ID: 296 */		 	   
+  dataPoolAddr[297] = (void *)&(pdpIasw->algoCent1State);  /* ID: 297 */		 	   
+  dataPoolAddr[298] = (void *)&(pdpIasw->algoCent1Cnt);  /* ID: 298 */		 
+  dataPoolAddr[299] = (void *)&(pdpIasw->algoCent1Enabled);  /* ID: 299 */		 	   
+  dataPoolAddr[300] = (void *)&(pdpIasw->CENT_EXEC_PHASE);  /* ID: 300 */		 	   
+  dataPoolAddr[301] = (void *)&(pdpIasw->algoAcq1State);  /* ID: 301 */		 
+  dataPoolAddr[302] = (void *)&(pdpIasw->algoAcq1Cnt);  /* ID: 302 */		 
+  dataPoolAddr[303] = (void *)&(pdpIasw->algoAcq1Enabled);  /* ID: 303 */		 	   
+  dataPoolAddr[304] = (void *)&(pdpIasw->ACQ_PH);  /* ID: 304 */			 	   
+  dataPoolAddr[305] = (void *)&(pdpIasw->algoCcState);  /* ID: 305 */		 
+  dataPoolAddr[306] = (void *)&(pdpIasw->algoCcCnt);  /* ID: 306 */			 	   
+  dataPoolAddr[307] = (void *)&(pdpIasw->algoCcEnabled);  /* ID: 307 */		 
+  dataPoolAddr[308] = (void *)&(pdpIasw->STCK_ORDER);  /* ID: 308 */		 
+  dataPoolAddr[309] = (void *)&(pdpIasw->algoTTC1State);  /* ID: 309 */		 
+  dataPoolAddr[310] = (void *)&(pdpIasw->algoTTC1Cnt);  /* ID: 310 */		 
+  dataPoolAddr[311] = (void *)&(pdpIasw->algoTTC1Enabled);  /* ID: 311 */		 	   
+  dataPoolAddr[312] = (void *)&(pdpIasw->TTC1_EXEC_PHASE);  /* ID: 312 */		 	   
+  dataPoolAddr[313] = (void *)&(pdpIasw->TTC1_EXEC_PER);  /* ID: 313 */		 
+  dataPoolAddr[314] = (void *)&(pdpIasw->TTC1_LL_FRT);  /* ID: 314 */		 
+  dataPoolAddr[315] = (void *)&(pdpIasw->TTC1_LL_AFT);  /* ID: 315 */		 
+  dataPoolAddr[316] = (void *)&(pdpIasw->TTC1_UL_FRT);  /* ID: 316 */		 
+  dataPoolAddr[317] = (void *)&(pdpIasw->TTC1_UL_AFT);  /* ID: 317 */		 
+  dataPoolAddr[318] = (void *)&(pdpIasw->ttc1AvTempAft);  /* ID: 318 */		 
+  dataPoolAddr[319] = (void *)&(pdpIasw->ttc1AvTempFrt);  /* ID: 319 */		 
+  dataPoolAddr[320] = (void *)&(pdpIasw->algoTTC2State);  /* ID: 320 */		 
+  dataPoolAddr[321] = (void *)&(pdpIasw->algoTTC2Cnt);  /* ID: 321 */		 
+  dataPoolAddr[322] = (void *)&(pdpIasw->algoTTC2Enabled);  /* ID: 322 */		 	   
+  dataPoolAddr[323] = (void *)&(pdpIasw->TTC2_EXEC_PER);  /* ID: 323 */		 
+  dataPoolAddr[324] = (void *)&(pdpIasw->TTC2_REF_TEMP);  /* ID: 324 */		 
+  dataPoolAddr[325] = (void *)&(pdpIasw->TTC2_OFFSETA);  /* ID: 325 */		 
+  dataPoolAddr[326] = (void *)&(pdpIasw->TTC2_OFFSETF);  /* ID: 326 */		 
+  dataPoolAddr[327] = (void *)&(pdpIasw->intTimeAft);  /* ID: 327 */		 
+  dataPoolAddr[328] = (void *)&(pdpIasw->onTimeAft);  /* ID: 328 */			 	   
+  dataPoolAddr[329] = (void *)&(pdpIasw->intTimeFront);  /* ID: 329 */		 
+  dataPoolAddr[330] = (void *)&(pdpIasw->onTimeFront);  /* ID: 330 */		 
+  dataPoolAddr[331] = (void *)&(pdpIasw->TTC2_PA);  /* ID: 331 */			 	   
+  dataPoolAddr[332] = (void *)&(pdpIasw->TTC2_DA);  /* ID: 332 */			 	   
+  dataPoolAddr[333] = (void *)&(pdpIasw->TTC2_IA);  /* ID: 333 */			 	   
+  dataPoolAddr[334] = (void *)&(pdpIasw->TTC2_PF);  /* ID: 334 */			 	   
+  dataPoolAddr[335] = (void *)&(pdpIasw->TTC2_DF);  /* ID: 335 */			 	   
+  dataPoolAddr[336] = (void *)&(pdpIasw->TTC2_IF);  /* ID: 336 */			 	   
+  dataPoolAddr[337] = (void *)&(pdpIasw->algoSaaEvalState);  /* ID: 337 */		 	   
+  dataPoolAddr[338] = (void *)&(pdpIasw->algoSaaEvalCnt);  /* ID: 338 */		 	   
+  dataPoolAddr[339] = (void *)&(pdpIasw->algoSaaEvalEnabled);  /* ID: 339 */	 
+  dataPoolAddr[340] = (void *)&(pdpIasw->SAA_EXEC_PHASE);  /* ID: 340 */		 	   
+  dataPoolAddr[341] = (void *)&(pdpIasw->SAA_EXEC_PER);  /* ID: 341 */		 
+  dataPoolAddr[342] = (void *)&(pdpIasw->isSaaActive);  /* ID: 342 */		 
+  dataPoolAddr[343] = (void *)&(pdpIasw->saaCounter);  /* ID: 343 */		 
+  dataPoolAddr[344] = (void *)&(pdpIasw->pInitSaaCounter);  /* ID: 344 */		 	   
+  dataPoolAddr[345] = (void *)&(pdpIasw->algoSdsEvalState);  /* ID: 345 */		 	   
+  dataPoolAddr[346] = (void *)&(pdpIasw->algoSdsEvalCnt);  /* ID: 346 */		 	   
+  dataPoolAddr[347] = (void *)&(pdpIasw->algoSdsEvalEnabled);  /* ID: 347 */	 
+  dataPoolAddr[348] = (void *)&(pdpIasw->SDS_EXEC_PHASE);  /* ID: 348 */		 	   
+  dataPoolAddr[349] = (void *)&(pdpIasw->SDS_EXEC_PER);  /* ID: 349 */		 
+  dataPoolAddr[350] = (void *)&(pdpIasw->isSdsActive);  /* ID: 350 */		 
+  dataPoolAddr[351] = (void *)&(pdpIasw->SDS_FORCED);  /* ID: 351 */		 
+  dataPoolAddr[352] = (void *)&(pdpIasw->SDS_INHIBITED);  /* ID: 352 */		 
+  dataPoolAddr[353] = (void *)&(pdpIasw->EARTH_OCCULT_ACTIVE);  /* ID: 353 */	 
+  dataPoolAddr[354] = (void *)&(pdpIasw->HEARTBEAT_D1);  /* ID: 354 */		 
+  dataPoolAddr[355] = (void *)&(pdpIasw->HEARTBEAT_D2);  /* ID: 355 */		 
+  dataPoolAddr[356] = (void *)&(pdpIasw->HbSem);  /* ID: 356 */			 
+  dataPoolAddr[357] = (void *)&(pdpIasw->starMap);  /* ID: 357 */			 	   
+  dataPoolAddr[358] = (void *)&(pdpIasw->observationId);  /* ID: 358 */		 
+  dataPoolAddr[359] = (void *)&(pdpIasw->centValProcOutput);  /* ID: 359 */		 	   
+  dataPoolAddr[360] = (void *)&(pdpIasw->CENT_OFFSET_LIM);  /* ID: 360 */		 	   
+  dataPoolAddr[361] = (void *)&(pdpIasw->CENT_FROZEN_LIM);  /* ID: 361 */		 	   
+  dataPoolAddr[362] = (void *)&(pdpIasw->SEM_SERV1_1_FORWARD);  /* ID: 362 */	 
+  dataPoolAddr[363] = (void *)&(pdpIasw->SEM_SERV1_2_FORWARD);  /* ID: 363 */	 
+  dataPoolAddr[364] = (void *)&(pdpIasw->SEM_SERV1_7_FORWARD);  /* ID: 364 */	 
+  dataPoolAddr[365] = (void *)&(pdpIasw->SEM_SERV1_8_FORWARD);  /* ID: 365 */	 
+  dataPoolAddr[366] = (void *)&(pdpIasw->SEM_SERV3_1_FORWARD);  /* ID: 366 */	 
+  dataPoolAddr[367] = (void *)&(pdpIasw->SEM_SERV3_2_FORWARD);  /* ID: 367 */	 
+  dataPoolAddr[368] = (void *)&(pdpIasw->SEM_HK_TS_DEF_CRS);  /* ID: 368 */		 	   
+  dataPoolAddr[369] = (void *)&(pdpIasw->SEM_HK_TS_DEF_FINE);  /* ID: 369 */	 
+  dataPoolAddr[370] = (void *)&(pdpIasw->SEM_HK_TS_EXT_CRS);  /* ID: 370 */		 	   
+  dataPoolAddr[371] = (void *)&(pdpIasw->SEM_HK_TS_EXT_FINE);  /* ID: 371 */	 
+  dataPoolAddr[372] = (void *)&(pdpIasw->STAT_MODE);  /* ID: 372 */			 	   
+  dataPoolAddr[373] = (void *)&(pdpIasw->STAT_FLAGS);  /* ID: 373 */		 
+  dataPoolAddr[374] = (void *)&(pdpIasw->STAT_LAST_SPW_ERR);  /* ID: 374 */		 	   
+  dataPoolAddr[375] = (void *)&(pdpIasw->STAT_LAST_ERR_ID);  /* ID: 375 */		 	   
+  dataPoolAddr[376] = (void *)&(pdpIasw->STAT_LAST_ERR_FREQ);  /* ID: 376 */	 
+  dataPoolAddr[377] = (void *)&(pdpIasw->STAT_NUM_CMD_RECEIVED);  /* ID: 377 */	 
+  dataPoolAddr[378] = (void *)&(pdpIasw->STAT_NUM_CMD_EXECUTED);  /* ID: 378 */	 
+  dataPoolAddr[379] = (void *)&(pdpIasw->STAT_NUM_DATA_SENT);  /* ID: 379 */	 
+  dataPoolAddr[380] = (void *)&(pdpIasw->STAT_SCU_PROC_DUTY_CL);  /* ID: 380 */	 
+  dataPoolAddr[381] = (void *)&(pdpIasw->STAT_SCU_NUM_AHB_ERR);  /* ID: 381 */	 
+  dataPoolAddr[382] = (void *)&(pdpIasw->STAT_SCU_NUM_AHB_CERR);  /* ID: 382 */	 
+  dataPoolAddr[383] = (void *)&(pdpIasw->STAT_SCU_NUM_LUP_ERR);  /* ID: 383 */	 
+  dataPoolAddr[384] = (void *)&(pdpIasw->TEMP_SEM_SCU);  /* ID: 384 */		 
+  dataPoolAddr[385] = (void *)&(pdpIasw->TEMP_SEM_PCU);  /* ID: 385 */		 
+  dataPoolAddr[386] = (void *)&(pdpIasw->VOLT_SCU_P3_4);  /* ID: 386 */		 
+  dataPoolAddr[387] = (void *)&(pdpIasw->VOLT_SCU_P5);  /* ID: 387 */		 
+  dataPoolAddr[388] = (void *)&(pdpIasw->TEMP_FEE_CCD);  /* ID: 388 */		 
+  dataPoolAddr[389] = (void *)&(pdpIasw->TEMP_FEE_STRAP);  /* ID: 389 */		 	   
+  dataPoolAddr[390] = (void *)&(pdpIasw->TEMP_FEE_ADC);  /* ID: 390 */		 
+  dataPoolAddr[391] = (void *)&(pdpIasw->TEMP_FEE_BIAS);  /* ID: 391 */		 
+  dataPoolAddr[392] = (void *)&(pdpIasw->TEMP_FEE_DEB);  /* ID: 392 */		 
+  dataPoolAddr[393] = (void *)&(pdpIasw->VOLT_FEE_VOD);  /* ID: 393 */		 
+  dataPoolAddr[394] = (void *)&(pdpIasw->VOLT_FEE_VRD);  /* ID: 394 */		 
+  dataPoolAddr[395] = (void *)&(pdpIasw->VOLT_FEE_VOG);  /* ID: 395 */		 
+  dataPoolAddr[396] = (void *)&(pdpIasw->VOLT_FEE_VSS);  /* ID: 396 */		 
+  dataPoolAddr[397] = (void *)&(pdpIasw->VOLT_FEE_CCD);  /* ID: 397 */		 
+  dataPoolAddr[398] = (void *)&(pdpIasw->VOLT_FEE_CLK);  /* ID: 398 */		 
+  dataPoolAddr[399] = (void *)&(pdpIasw->VOLT_FEE_ANA_P5);  /* ID: 399 */		 	   
+  dataPoolAddr[400] = (void *)&(pdpIasw->VOLT_FEE_ANA_N5);  /* ID: 400 */		 	   
+  dataPoolAddr[401] = (void *)&(pdpIasw->VOLT_FEE_ANA_P3_3);  /* ID: 401 */		 	   
+  dataPoolAddr[402] = (void *)&(pdpIasw->CURR_FEE_CLK_BUF);  /* ID: 402 */		 	   
+  dataPoolAddr[403] = (void *)&(pdpIasw->VOLT_SCU_FPGA_P1_5);  /* ID: 403 */	 
+  dataPoolAddr[404] = (void *)&(pdpIasw->CURR_SCU_P3_4);  /* ID: 404 */		 
+  dataPoolAddr[405] = (void *)&(pdpIasw->STAT_NUM_SPW_ERR_CRE);  /* ID: 405 */	 
+  dataPoolAddr[406] = (void *)&(pdpIasw->STAT_NUM_SPW_ERR_ESC);  /* ID: 406 */	 
+  dataPoolAddr[407] = (void *)&(pdpIasw->STAT_NUM_SPW_ERR_DISC);  /* ID: 407 */	 
+  dataPoolAddr[408] = (void *)&(pdpIasw->STAT_NUM_SPW_ERR_PAR);  /* ID: 408 */	 
+  dataPoolAddr[409] = (void *)&(pdpIasw->STAT_NUM_SPW_ERR_WRSY);  /* ID: 409 */	 
+  dataPoolAddr[410] = (void *)&(pdpIasw->STAT_NUM_SPW_ERR_INVA);  /* ID: 410 */	 
+  dataPoolAddr[411] = (void *)&(pdpIasw->STAT_NUM_SPW_ERR_EOP);  /* ID: 411 */	 
+  dataPoolAddr[412] = (void *)&(pdpIasw->STAT_NUM_SPW_ERR_RXAH);  /* ID: 412 */	 
+  dataPoolAddr[413] = (void *)&(pdpIasw->STAT_NUM_SPW_ERR_TXAH);  /* ID: 413 */	 
+  dataPoolAddr[414] = (void *)&(pdpIasw->STAT_NUM_SPW_ERR_TXBL);  /* ID: 414 */	 
+  dataPoolAddr[415] = (void *)&(pdpIasw->STAT_NUM_SPW_ERR_TXLE);  /* ID: 415 */	 
+  dataPoolAddr[416] = (void *)&(pdpIasw->STAT_NUM_SP_ERR_RX);  /* ID: 416 */	 
+  dataPoolAddr[417] = (void *)&(pdpIasw->STAT_NUM_SP_ERR_TX);  /* ID: 417 */	 
+  dataPoolAddr[418] = (void *)&(pdpIasw->STAT_HEAT_PWM_FPA_CCD);  /* ID: 418 */	 
+  dataPoolAddr[419] = (void *)&(pdpIasw->STAT_HEAT_PWM_FEE_STR);  /* ID: 419 */	 
+  dataPoolAddr[420] = (void *)&(pdpIasw->STAT_HEAT_PWM_FEE_ANA);  /* ID: 420 */	 
+  dataPoolAddr[421] = (void *)&(pdpIasw->STAT_HEAT_PWM_SPARE);  /* ID: 421 */	 
+  dataPoolAddr[422] = (void *)&(pdpIasw->STAT_HEAT_PWM_FLAGS);  /* ID: 422 */	 
+  dataPoolAddr[423] = (void *)&(pdpIasw->STAT_OBTIME_SYNC_DELTA);  /* ID: 423 */	 	   
+  dataPoolAddr[424] = (void *)&(pdpIasw->TEMP_SEM_SCU_LW);  /* ID: 424 */		 	   
+  dataPoolAddr[425] = (void *)&(pdpIasw->TEMP_SEM_PCU_LW);  /* ID: 425 */		 	   
+  dataPoolAddr[426] = (void *)&(pdpIasw->VOLT_SCU_P3_4_LW);  /* ID: 426 */		 	   
+  dataPoolAddr[427] = (void *)&(pdpIasw->VOLT_SCU_P5_LW);  /* ID: 427 */		 	   
+  dataPoolAddr[428] = (void *)&(pdpIasw->TEMP_FEE_CCD_LW);  /* ID: 428 */		 	   
+  dataPoolAddr[429] = (void *)&(pdpIasw->TEMP_FEE_STRAP_LW);  /* ID: 429 */		 	   
+  dataPoolAddr[430] = (void *)&(pdpIasw->TEMP_FEE_ADC_LW);  /* ID: 430 */		 	   
+  dataPoolAddr[431] = (void *)&(pdpIasw->TEMP_FEE_BIAS_LW);  /* ID: 431 */		 	   
+  dataPoolAddr[432] = (void *)&(pdpIasw->TEMP_FEE_DEB_LW);  /* ID: 432 */		 	   
+  dataPoolAddr[433] = (void *)&(pdpIasw->VOLT_FEE_VOD_LW);  /* ID: 433 */		 	   
+  dataPoolAddr[434] = (void *)&(pdpIasw->VOLT_FEE_VRD_LW);  /* ID: 434 */		 	   
+  dataPoolAddr[435] = (void *)&(pdpIasw->VOLT_FEE_VOG_LW);  /* ID: 435 */		 	   
+  dataPoolAddr[436] = (void *)&(pdpIasw->VOLT_FEE_VSS_LW);  /* ID: 436 */		 	   
+  dataPoolAddr[437] = (void *)&(pdpIasw->VOLT_FEE_CCD_LW);  /* ID: 437 */		 	   
+  dataPoolAddr[438] = (void *)&(pdpIasw->VOLT_FEE_CLK_LW);  /* ID: 438 */		 	   
+  dataPoolAddr[439] = (void *)&(pdpIasw->VOLT_FEE_ANA_P5_LW);  /* ID: 439 */	 
+  dataPoolAddr[440] = (void *)&(pdpIasw->VOLT_FEE_ANA_N5_LW);  /* ID: 440 */	 
+  dataPoolAddr[441] = (void *)&(pdpIasw->VOLT_FEE_ANA_P3_3_LW);  /* ID: 441 */	 
+  dataPoolAddr[442] = (void *)&(pdpIasw->CURR_FEE_CLK_BUF_LW);  /* ID: 442 */	 
+  dataPoolAddr[443] = (void *)&(pdpIasw->VOLT_SCU_FPGA_P1_5_LW);  /* ID: 443 */	 
+  dataPoolAddr[444] = (void *)&(pdpIasw->CURR_SCU_P3_4_LW);  /* ID: 444 */		 	   
+  dataPoolAddr[445] = (void *)&(pdpIasw->TEMP_SEM_SCU_UW);  /* ID: 445 */		 	   
+  dataPoolAddr[446] = (void *)&(pdpIasw->TEMP_SEM_PCU_UW);  /* ID: 446 */		 	   
+  dataPoolAddr[447] = (void *)&(pdpIasw->VOLT_SCU_P3_4_UW);  /* ID: 447 */		 	   
+  dataPoolAddr[448] = (void *)&(pdpIasw->VOLT_SCU_P5_UW);  /* ID: 448 */		 	   
+  dataPoolAddr[449] = (void *)&(pdpIasw->TEMP_FEE_CCD_UW);  /* ID: 449 */		 	   
+  dataPoolAddr[450] = (void *)&(pdpIasw->TEMP_FEE_STRAP_UW);  /* ID: 450 */		 	   
+  dataPoolAddr[451] = (void *)&(pdpIasw->TEMP_FEE_ADC_UW);  /* ID: 451 */		 	   
+  dataPoolAddr[452] = (void *)&(pdpIasw->TEMP_FEE_BIAS_UW);  /* ID: 452 */		 	   
+  dataPoolAddr[453] = (void *)&(pdpIasw->TEMP_FEE_DEB_UW);  /* ID: 453 */		 	   
+  dataPoolAddr[454] = (void *)&(pdpIasw->VOLT_FEE_VOD_UW);  /* ID: 454 */		 	   
+  dataPoolAddr[455] = (void *)&(pdpIasw->VOLT_FEE_VRD_UW);  /* ID: 455 */		 	   
+  dataPoolAddr[456] = (void *)&(pdpIasw->VOLT_FEE_VOG_UW);  /* ID: 456 */		 	   
+  dataPoolAddr[457] = (void *)&(pdpIasw->VOLT_FEE_VSS_UW);  /* ID: 457 */		 	   
+  dataPoolAddr[458] = (void *)&(pdpIasw->VOLT_FEE_CCD_UW);  /* ID: 458 */		 	   
+  dataPoolAddr[459] = (void *)&(pdpIasw->VOLT_FEE_CLK_UW);  /* ID: 459 */		 	   
+  dataPoolAddr[460] = (void *)&(pdpIasw->VOLT_FEE_ANA_P5_UW);  /* ID: 460 */	 
+  dataPoolAddr[461] = (void *)&(pdpIasw->VOLT_FEE_ANA_N5_UW);  /* ID: 461 */	 
+  dataPoolAddr[462] = (void *)&(pdpIasw->VOLT_FEE_ANA_P3_3_UW);  /* ID: 462 */	 
+  dataPoolAddr[463] = (void *)&(pdpIasw->CURR_FEE_CLK_BUF_UW);  /* ID: 463 */	 
+  dataPoolAddr[464] = (void *)&(pdpIasw->VOLT_SCU_FPGA_P1_5_UW);  /* ID: 464 */	 
+  dataPoolAddr[465] = (void *)&(pdpIasw->CURR_SCU_P3_4_UW);  /* ID: 465 */		 	   
+  dataPoolAddr[466] = (void *)&(pdpIasw->TEMP_SEM_SCU_LA);  /* ID: 466 */		 	   
+  dataPoolAddr[467] = (void *)&(pdpIasw->TEMP_SEM_PCU_LA);  /* ID: 467 */		 	   
+  dataPoolAddr[468] = (void *)&(pdpIasw->VOLT_SCU_P3_4_LA);  /* ID: 468 */		 	   
+  dataPoolAddr[469] = (void *)&(pdpIasw->VOLT_SCU_P5_LA);  /* ID: 469 */		 	   
+  dataPoolAddr[470] = (void *)&(pdpIasw->TEMP_FEE_CCD_LA);  /* ID: 470 */		 	   
+  dataPoolAddr[471] = (void *)&(pdpIasw->TEMP_FEE_STRAP_LA);  /* ID: 471 */		 	   
+  dataPoolAddr[472] = (void *)&(pdpIasw->TEMP_FEE_ADC_LA);  /* ID: 472 */		 	   
+  dataPoolAddr[473] = (void *)&(pdpIasw->TEMP_FEE_BIAS_LA);  /* ID: 473 */		 	   
+  dataPoolAddr[474] = (void *)&(pdpIasw->TEMP_FEE_DEB_LA);  /* ID: 474 */		 	   
+  dataPoolAddr[475] = (void *)&(pdpIasw->VOLT_FEE_VOD_LA);  /* ID: 475 */		 	   
+  dataPoolAddr[476] = (void *)&(pdpIasw->VOLT_FEE_VRD_LA);  /* ID: 476 */		 	   
+  dataPoolAddr[477] = (void *)&(pdpIasw->VOLT_FEE_VOG_LA);  /* ID: 477 */		 	   
+  dataPoolAddr[478] = (void *)&(pdpIasw->VOLT_FEE_VSS_LA);  /* ID: 478 */		 	   
+  dataPoolAddr[479] = (void *)&(pdpIasw->VOLT_FEE_CCD_LA);  /* ID: 479 */		 	   
+  dataPoolAddr[480] = (void *)&(pdpIasw->VOLT_FEE_CLK_LA);  /* ID: 480 */		 	   
+  dataPoolAddr[481] = (void *)&(pdpIasw->VOLT_FEE_ANA_P5_LA);  /* ID: 481 */	 
+  dataPoolAddr[482] = (void *)&(pdpIasw->VOLT_FEE_ANA_N5_LA);  /* ID: 482 */	 
+  dataPoolAddr[483] = (void *)&(pdpIasw->VOLT_FEE_ANA_P3_3_LA);  /* ID: 483 */	 
+  dataPoolAddr[484] = (void *)&(pdpIasw->CURR_FEE_CLK_BUF_LA);  /* ID: 484 */	 
+  dataPoolAddr[485] = (void *)&(pdpIasw->VOLT_SCU_FPGA_P1_5_LA);  /* ID: 485 */	 
+  dataPoolAddr[486] = (void *)&(pdpIasw->CURR_SCU_P3_4_LA);  /* ID: 486 */		 	   
+  dataPoolAddr[487] = (void *)&(pdpIasw->TEMP_SEM_SCU_UA);  /* ID: 487 */		 	   
+  dataPoolAddr[488] = (void *)&(pdpIasw->TEMP_SEM_PCU_UA);  /* ID: 488 */		 	   
+  dataPoolAddr[489] = (void *)&(pdpIasw->VOLT_SCU_P3_4_UA);  /* ID: 489 */		 	   
+  dataPoolAddr[490] = (void *)&(pdpIasw->VOLT_SCU_P5_UA);  /* ID: 490 */		 	   
+  dataPoolAddr[491] = (void *)&(pdpIasw->TEMP_FEE_CCD_UA);  /* ID: 491 */		 	   
+  dataPoolAddr[492] = (void *)&(pdpIasw->TEMP_FEE_STRAP_UA);  /* ID: 492 */		 	   
+  dataPoolAddr[493] = (void *)&(pdpIasw->TEMP_FEE_ADC_UA);  /* ID: 493 */		 	   
+  dataPoolAddr[494] = (void *)&(pdpIasw->TEMP_FEE_BIAS_UA);  /* ID: 494 */		 	   
+  dataPoolAddr[495] = (void *)&(pdpIasw->TEMP_FEE_DEB_UA);  /* ID: 495 */		 	   
+  dataPoolAddr[496] = (void *)&(pdpIasw->VOLT_FEE_VOD_UA);  /* ID: 496 */		 	   
+  dataPoolAddr[497] = (void *)&(pdpIasw->VOLT_FEE_VRD_UA);  /* ID: 497 */		 	   
+  dataPoolAddr[498] = (void *)&(pdpIasw->VOLT_FEE_VOG_UA);  /* ID: 498 */		 	   
+  dataPoolAddr[499] = (void *)&(pdpIasw->VOLT_FEE_VSS_UA);  /* ID: 499 */		 	   
+  dataPoolAddr[500] = (void *)&(pdpIasw->VOLT_FEE_CCD_UA);  /* ID: 500 */		 	   
+  dataPoolAddr[501] = (void *)&(pdpIasw->VOLT_FEE_CLK_UA);  /* ID: 501 */		 	   
+  dataPoolAddr[502] = (void *)&(pdpIasw->VOLT_FEE_ANA_P5_UA);  /* ID: 502 */	 
+  dataPoolAddr[503] = (void *)&(pdpIasw->VOLT_FEE_ANA_N5_UA);  /* ID: 503 */	 
+  dataPoolAddr[504] = (void *)&(pdpIasw->VOLT_FEE_ANA_P3_3_UA);  /* ID: 504 */	 
+  dataPoolAddr[505] = (void *)&(pdpIasw->CURR_FEE_CLK_BUF_UA);  /* ID: 505 */	 
+  dataPoolAddr[506] = (void *)&(pdpIasw->VOLT_SCU_FPGA_P1_5_UA);  /* ID: 506 */	 
+  dataPoolAddr[507] = (void *)&(pdpIasw->CURR_SCU_P3_4_UA);  /* ID: 507 */		 	   
+  dataPoolAddr[508] = (void *)&(pdpIasw->semEvtCounter);  /* ID: 508 */		 
+  dataPoolAddr[509] = (void *)&(pdpIasw->SEM_SERV5_1_FORWARD);  /* ID: 509 */	 
+  dataPoolAddr[510] = (void *)&(pdpIasw->SEM_SERV5_2_FORWARD);  /* ID: 510 */	 
+  dataPoolAddr[511] = (void *)&(pdpIasw->SEM_SERV5_3_FORWARD);  /* ID: 511 */	 
+  dataPoolAddr[512] = (void *)&(pdpIasw->SEM_SERV5_4_FORWARD);  /* ID: 512 */	 
+  dataPoolAddr[513] = (void *)&(pdpIasw->pExpTime);  /* ID: 513 */			 	   
+  dataPoolAddr[514] = (void *)&(pdpIasw->pImageRep);  /* ID: 514 */			 	   
+  dataPoolAddr[515] = (void *)&(pdpIasw->pAcqNum);  /* ID: 515 */			 	   
+  dataPoolAddr[516] = (void *)&(pdpIasw->pDataOs);  /* ID: 516 */			 	   
+  dataPoolAddr[517] = (void *)&(pdpIasw->pCcdRdMode);  /* ID: 517 */		 
+  dataPoolAddr[518] = (void *)&(pdpIasw->pWinPosX);  /* ID: 518 */			 	   
+  dataPoolAddr[519] = (void *)&(pdpIasw->pWinPosY);  /* ID: 519 */			 	   
+  dataPoolAddr[520] = (void *)&(pdpIasw->pWinSizeX);  /* ID: 520 */			 	   
+  dataPoolAddr[521] = (void *)&(pdpIasw->pWinSizeY);  /* ID: 521 */			 	   
+  dataPoolAddr[522] = (void *)&(pdpIasw->pDtAcqSrc);  /* ID: 522 */			 	   
+  dataPoolAddr[523] = (void *)&(pdpIasw->pTempCtrlTarget);  /* ID: 523 */		 	   
+  dataPoolAddr[524] = (void *)&(pdpIasw->pVoltFeeVod);  /* ID: 524 */		 
+  dataPoolAddr[525] = (void *)&(pdpIasw->pVoltFeeVrd);  /* ID: 525 */		 
+  dataPoolAddr[526] = (void *)&(pdpIasw->pVoltFeeVss);  /* ID: 526 */		 
+  dataPoolAddr[527] = (void *)&(pdpIasw->pHeatTempFpaCCd);  /* ID: 527 */		 	   
+  dataPoolAddr[528] = (void *)&(pdpIasw->pHeatTempFeeStrap);  /* ID: 528 */		 	   
+  dataPoolAddr[529] = (void *)&(pdpIasw->pHeatTempFeeAnach);  /* ID: 529 */		 	   
+  dataPoolAddr[530] = (void *)&(pdpIasw->pHeatTempSpare);  /* ID: 530 */		 	   
+  dataPoolAddr[531] = (void *)&(pdpIasw->pStepEnDiagCcd);  /* ID: 531 */		 	   
+  dataPoolAddr[532] = (void *)&(pdpIasw->pStepEnDiagFee);  /* ID: 532 */		 	   
+  dataPoolAddr[533] = (void *)&(pdpIasw->pStepEnDiagTemp);  /* ID: 533 */		 	   
+  dataPoolAddr[534] = (void *)&(pdpIasw->pStepEnDiagAna);  /* ID: 534 */		 	   
+  dataPoolAddr[535] = (void *)&(pdpIasw->pStepEnDiagExpos);  /* ID: 535 */		 	   
+  dataPoolAddr[536] = (void *)&(pdpIasw->pStepDebDiagCcd);  /* ID: 536 */		 	   
+  dataPoolAddr[537] = (void *)&(pdpIasw->pStepDebDiagFee);  /* ID: 537 */		 	   
+  dataPoolAddr[538] = (void *)&(pdpIasw->pStepDebDiagTemp);  /* ID: 538 */		 	   
+  dataPoolAddr[539] = (void *)&(pdpIasw->pStepDebDiagAna);  /* ID: 539 */		 	   
+  dataPoolAddr[540] = (void *)&(pdpIasw->pStepDebDiagExpos);  /* ID: 540 */		 	   
+  dataPoolAddr[541] = (void *)&(pdpIasw->SEM_SERV220_6_FORWARD);  /* ID: 541 */	 
+  dataPoolAddr[542] = (void *)&(pdpIasw->SEM_SERV220_12_FORWARD);  /* ID: 542 */	 	   
+  dataPoolAddr[543] = (void *)&(pdpIasw->SEM_SERV222_6_FORWARD);  /* ID: 543 */	 
+  dataPoolAddr[544] = (void *)&(pdpIasw->saveImagesNode);  /* ID: 544 */		 	   
+  dataPoolAddr[545] = (void *)&(pdpIasw->saveImagesCnt);  /* ID: 545 */		 
+  dataPoolAddr[546] = (void *)&(pdpIasw->SaveImages_pSaveTarget);  /* ID: 546 */	 	   
+  dataPoolAddr[547] = (void *)&(pdpIasw->SaveImages_pFbfInit);  /* ID: 547 */	 
+  dataPoolAddr[548] = (void *)&(pdpIasw->SaveImages_pFbfEnd);  /* ID: 548 */	 
+  dataPoolAddr[549] = (void *)&(pdpIasw->acqFullDropNode);  /* ID: 549 */		 	   
+  dataPoolAddr[550] = (void *)&(pdpIasw->acqFullDropCnt);  /* ID: 550 */		 	   
+  dataPoolAddr[551] = (void *)&(pdpIasw->AcqFullDrop_pExpTime);  /* ID: 551 */	 
+  dataPoolAddr[552] = (void *)&(pdpIasw->AcqFullDrop_pImageRep);  /* ID: 552 */	 
+  dataPoolAddr[553] = (void *)&(pdpIasw->acqFullDropT1);  /* ID: 553 */		 
+  dataPoolAddr[554] = (void *)&(pdpIasw->acqFullDropT2);  /* ID: 554 */		 
+  dataPoolAddr[555] = (void *)&(pdpIasw->calFullSnapNode);  /* ID: 555 */		 	   
+  dataPoolAddr[556] = (void *)&(pdpIasw->calFullSnapCnt);  /* ID: 556 */		 	   
+  dataPoolAddr[557] = (void *)&(pdpIasw->CalFullSnap_pExpTime);  /* ID: 557 */	 
+  dataPoolAddr[558] = (void *)&(pdpIasw->CalFullSnap_pImageRep);  /* ID: 558 */	 
+  dataPoolAddr[559] = (void *)&(pdpIasw->CalFullSnap_pNmbImages);  /* ID: 559 */	 	   
+  dataPoolAddr[560] = (void *)&(pdpIasw->CalFullSnap_pCentSel);  /* ID: 560 */	 
+  dataPoolAddr[561] = (void *)&(pdpIasw->calFullSnapT1);  /* ID: 561 */		 
+  dataPoolAddr[562] = (void *)&(pdpIasw->calFullSnapT2);  /* ID: 562 */		 
+  dataPoolAddr[563] = (void *)&(pdpIasw->SciWinNode);  /* ID: 563 */		 
+  dataPoolAddr[564] = (void *)&(pdpIasw->SciWinCnt);  /* ID: 564 */			 	   
+  dataPoolAddr[565] = (void *)&(pdpIasw->SciWin_pNmbImages);  /* ID: 565 */		 	   
+  dataPoolAddr[566] = (void *)&(pdpIasw->SciWin_pCcdRdMode);  /* ID: 566 */		 	   
+  dataPoolAddr[567] = (void *)&(pdpIasw->SciWin_pExpTime);  /* ID: 567 */		 	   
+  dataPoolAddr[568] = (void *)&(pdpIasw->SciWin_pImageRep);  /* ID: 568 */		 	   
+  dataPoolAddr[569] = (void *)&(pdpIasw->SciWin_pWinPosX);  /* ID: 569 */		 	   
+  dataPoolAddr[570] = (void *)&(pdpIasw->SciWin_pWinPosY);  /* ID: 570 */		 	   
+  dataPoolAddr[571] = (void *)&(pdpIasw->SciWin_pWinSizeX);  /* ID: 571 */		 	   
+  dataPoolAddr[572] = (void *)&(pdpIasw->SciWin_pWinSizeY);  /* ID: 572 */		 	   
+  dataPoolAddr[573] = (void *)&(pdpIasw->SciWin_pCentSel);  /* ID: 573 */		 	   
+  dataPoolAddr[574] = (void *)&(pdpIasw->sciWinT1);  /* ID: 574 */			 	   
+  dataPoolAddr[575] = (void *)&(pdpIasw->sciWinT2);  /* ID: 575 */			 	   
+  dataPoolAddr[576] = (void *)&(pdpIasw->fbfLoadNode);  /* ID: 576 */		 
+  dataPoolAddr[577] = (void *)&(pdpIasw->fbfLoadCnt);  /* ID: 577 */		 
+  dataPoolAddr[578] = (void *)&(pdpIasw->fbfSaveNode);  /* ID: 578 */		 
+  dataPoolAddr[579] = (void *)&(pdpIasw->fbfSaveCnt);  /* ID: 579 */		 
+  dataPoolAddr[580] = (void *)&(pdpIasw->FbfLoad_pFbfId);  /* ID: 580 */		 	   
+  dataPoolAddr[581] = (void *)&(pdpIasw->FbfLoad_pFbfNBlocks);  /* ID: 581 */	 
+  dataPoolAddr[582] = (void *)&(pdpIasw->FbfLoad_pFbfRamAreaId);  /* ID: 582 */	 
+  dataPoolAddr[583] = (void *)&(pdpIasw->FbfLoad_pFbfRamAddr);  /* ID: 583 */	 
+  dataPoolAddr[584] = (void *)&(pdpIasw->FbfSave_pFbfId);  /* ID: 584 */		 	   
+  dataPoolAddr[585] = (void *)&(pdpIasw->FbfSave_pFbfNBlocks);  /* ID: 585 */	 
+  dataPoolAddr[586] = (void *)&(pdpIasw->FbfSave_pFbfRamAreaId);  /* ID: 586 */	 
+  dataPoolAddr[587] = (void *)&(pdpIasw->FbfSave_pFbfRamAddr);  /* ID: 587 */	 
+  dataPoolAddr[588] = (void *)&(pdpIasw->fbfLoadBlockCounter);  /* ID: 588 */	 
+  dataPoolAddr[589] = (void *)&(pdpIasw->fbfSaveBlockCounter);  /* ID: 589 */	 
+  dataPoolAddr[590] = (void *)&(pdpIasw->transFbfToGrndNode);  /* ID: 590 */	 
+  dataPoolAddr[591] = (void *)&(pdpIasw->transFbfToGrndCnt);  /* ID: 591 */		 	   
+  dataPoolAddr[592] = (void *)&(pdpIasw->TransFbfToGrnd_pNmbFbf);  /* ID: 592 */	 	   
+  dataPoolAddr[593] = (void *)&(pdpIasw->TransFbfToGrnd_pFbfInit);  /* ID: 593 */	 	   
+  dataPoolAddr[594] = (void *)&(pdpIasw->TransFbfToGrnd_pFbfSize);  /* ID: 594 */	 	   
+  dataPoolAddr[595] = (void *)&(pdpIasw->nomSciNode);  /* ID: 595 */		 
+  dataPoolAddr[596] = (void *)&(pdpIasw->nomSciCnt);  /* ID: 596 */			 	   
+  dataPoolAddr[597] = (void *)&(pdpIasw->NomSci_pAcqFlag);  /* ID: 597 */		 	   
+  dataPoolAddr[598] = (void *)&(pdpIasw->NomSci_pCal1Flag);  /* ID: 598 */		 	   
+  dataPoolAddr[599] = (void *)&(pdpIasw->NomSci_pSciFlag);  /* ID: 599 */		 	   
+  dataPoolAddr[600] = (void *)&(pdpIasw->NomSci_pCal2Flag);  /* ID: 600 */		 	   
+  dataPoolAddr[601] = (void *)&(pdpIasw->NomSci_pCibNFull);  /* ID: 601 */		 	   
+  dataPoolAddr[602] = (void *)&(pdpIasw->NomSci_pCibSizeFull);  /* ID: 602 */	 
+  dataPoolAddr[603] = (void *)&(pdpIasw->NomSci_pSibNFull);  /* ID: 603 */		 	   
+  dataPoolAddr[604] = (void *)&(pdpIasw->NomSci_pSibSizeFull);  /* ID: 604 */	 
+  dataPoolAddr[605] = (void *)&(pdpIasw->NomSci_pGibNFull);  /* ID: 605 */		 	   
+  dataPoolAddr[606] = (void *)&(pdpIasw->NomSci_pGibSizeFull);  /* ID: 606 */	 
+  dataPoolAddr[607] = (void *)&(pdpIasw->NomSci_pSibNWin);  /* ID: 607 */		 	   
+  dataPoolAddr[608] = (void *)&(pdpIasw->NomSci_pSibSizeWin);  /* ID: 608 */	 
+  dataPoolAddr[609] = (void *)&(pdpIasw->NomSci_pCibNWin);  /* ID: 609 */		 	   
+  dataPoolAddr[610] = (void *)&(pdpIasw->NomSci_pCibSizeWin);  /* ID: 610 */	 
+  dataPoolAddr[611] = (void *)&(pdpIasw->NomSci_pGibNWin);  /* ID: 611 */		 	   
+  dataPoolAddr[612] = (void *)&(pdpIasw->NomSci_pGibSizeWin);  /* ID: 612 */	 
+  dataPoolAddr[613] = (void *)&(pdpIasw->NomSci_pExpTimeAcq);  /* ID: 613 */	 
+  dataPoolAddr[614] = (void *)&(pdpIasw->NomSci_pImageRepAcq);  /* ID: 614 */	 
+  dataPoolAddr[615] = (void *)&(pdpIasw->NomSci_pExpTimeCal1);  /* ID: 615 */	 
+  dataPoolAddr[616] = (void *)&(pdpIasw->NomSci_pImageRepCal1);  /* ID: 616 */	 
+  dataPoolAddr[617] = (void *)&(pdpIasw->NomSci_pNmbImagesCal1);  /* ID: 617 */	 
+  dataPoolAddr[618] = (void *)&(pdpIasw->NomSci_pCentSelCal1);  /* ID: 618 */	 
+  dataPoolAddr[619] = (void *)&(pdpIasw->NomSci_pNmbImagesSci);  /* ID: 619 */	 
+  dataPoolAddr[620] = (void *)&(pdpIasw->NomSci_pCcdRdModeSci);  /* ID: 620 */	 
+  dataPoolAddr[621] = (void *)&(pdpIasw->NomSci_pExpTimeSci);  /* ID: 621 */	 
+  dataPoolAddr[622] = (void *)&(pdpIasw->NomSci_pImageRepSci);  /* ID: 622 */	 
+  dataPoolAddr[623] = (void *)&(pdpIasw->NomSci_pWinPosXSci);  /* ID: 623 */	 
+  dataPoolAddr[624] = (void *)&(pdpIasw->NomSci_pWinPosYSci);  /* ID: 624 */	 
+  dataPoolAddr[625] = (void *)&(pdpIasw->NomSci_pWinSizeXSci);  /* ID: 625 */	 
+  dataPoolAddr[626] = (void *)&(pdpIasw->NomSci_pWinSizeYSci);  /* ID: 626 */	 
+  dataPoolAddr[627] = (void *)&(pdpIasw->NomSci_pCentSelSci);  /* ID: 627 */	 
+  dataPoolAddr[628] = (void *)&(pdpIasw->NomSci_pExpTimeCal2);  /* ID: 628 */	 
+  dataPoolAddr[629] = (void *)&(pdpIasw->NomSci_pImageRepCal2);  /* ID: 629 */	 
+  dataPoolAddr[630] = (void *)&(pdpIasw->NomSci_pNmbImagesCal2);  /* ID: 630 */	 
+  dataPoolAddr[631] = (void *)&(pdpIasw->NomSci_pCentSelCal2);  /* ID: 631 */	 
+  dataPoolAddr[632] = (void *)&(pdpIasw->NomSci_pSaveTarget);  /* ID: 632 */	 
+  dataPoolAddr[633] = (void *)&(pdpIasw->NomSci_pFbfInit);  /* ID: 633 */		 	   
+  dataPoolAddr[634] = (void *)&(pdpIasw->NomSci_pFbfEnd);  /* ID: 634 */		 	   
+  dataPoolAddr[635] = (void *)&(pdpIasw->NomSci_pStckOrderCal1);  /* ID: 635 */	 
+  dataPoolAddr[636] = (void *)&(pdpIasw->NomSci_pStckOrderSci);  /* ID: 636 */	 
+  dataPoolAddr[637] = (void *)&(pdpIasw->NomSci_pStckOrderCal2);  /* ID: 637 */	 
+  dataPoolAddr[638] = (void *)&(pdpIasw->ConfigSdb_pSdbCmd);  /* ID: 638 */		 	   
+  dataPoolAddr[639] = (void *)&(pdpIasw->ConfigSdb_pCibNFull);  /* ID: 639 */	 
+  dataPoolAddr[640] = (void *)&(pdpIasw->ConfigSdb_pCibSizeFull);  /* ID: 640 */	 	   
+  dataPoolAddr[641] = (void *)&(pdpIasw->ConfigSdb_pSibNFull);  /* ID: 641 */	 
+  dataPoolAddr[642] = (void *)&(pdpIasw->ConfigSdb_pSibSizeFull);  /* ID: 642 */	 	   
+  dataPoolAddr[643] = (void *)&(pdpIasw->ConfigSdb_pGibNFull);  /* ID: 643 */	 
+  dataPoolAddr[644] = (void *)&(pdpIasw->ConfigSdb_pGibSizeFull);  /* ID: 644 */	 	   
+  dataPoolAddr[645] = (void *)&(pdpIasw->ConfigSdb_pSibNWin);  /* ID: 645 */	 
+  dataPoolAddr[646] = (void *)&(pdpIasw->ConfigSdb_pSibSizeWin);  /* ID: 646 */	 
+  dataPoolAddr[647] = (void *)&(pdpIasw->ConfigSdb_pCibNWin);  /* ID: 647 */	 
+  dataPoolAddr[648] = (void *)&(pdpIasw->ConfigSdb_pCibSizeWin);  /* ID: 648 */	 
+  dataPoolAddr[649] = (void *)&(pdpIasw->ConfigSdb_pGibNWin);  /* ID: 649 */	 
+  dataPoolAddr[650] = (void *)&(pdpIasw->ConfigSdb_pGibSizeWin);  /* ID: 650 */	 
+  dataPoolAddr[651] = (void *)&(pdpIasw->ADC_P3V3);  /* ID: 651 */			 	   
+  dataPoolAddr[652] = (void *)&(pdpIasw->ADC_P5V);  /* ID: 652 */			 	   
+  dataPoolAddr[653] = (void *)&(pdpIasw->ADC_P1V8);  /* ID: 653 */			 	   
+  dataPoolAddr[654] = (void *)&(pdpIasw->ADC_P2V5);  /* ID: 654 */			 	   
+  dataPoolAddr[655] = (void *)&(pdpIasw->ADC_N5V);  /* ID: 655 */			 	   
+  dataPoolAddr[656] = (void *)&(pdpIasw->ADC_PGND);  /* ID: 656 */			 	   
+  dataPoolAddr[657] = (void *)&(pdpIasw->ADC_TEMPOH1A);  /* ID: 657 */		 
+  dataPoolAddr[658] = (void *)&(pdpIasw->ADC_TEMP1);  /* ID: 658 */			 	   
+  dataPoolAddr[659] = (void *)&(pdpIasw->ADC_TEMPOH2A);  /* ID: 659 */		 
+  dataPoolAddr[660] = (void *)&(pdpIasw->ADC_TEMPOH1B);  /* ID: 660 */		 
+  dataPoolAddr[661] = (void *)&(pdpIasw->ADC_TEMPOH3A);  /* ID: 661 */		 
+  dataPoolAddr[662] = (void *)&(pdpIasw->ADC_TEMPOH2B);  /* ID: 662 */		 
+  dataPoolAddr[663] = (void *)&(pdpIasw->ADC_TEMPOH4A);  /* ID: 663 */		 
+  dataPoolAddr[664] = (void *)&(pdpIasw->ADC_TEMPOH3B);  /* ID: 664 */		 
+  dataPoolAddr[665] = (void *)&(pdpIasw->ADC_TEMPOH4B);  /* ID: 665 */		 
+  dataPoolAddr[666] = (void *)&(pdpIasw->SEM_P15V);  /* ID: 666 */			 	   
+  dataPoolAddr[667] = (void *)&(pdpIasw->SEM_P30V);  /* ID: 667 */			 	   
+  dataPoolAddr[668] = (void *)&(pdpIasw->SEM_P5V0);  /* ID: 668 */			 	   
+  dataPoolAddr[669] = (void *)&(pdpIasw->SEM_P7V0);  /* ID: 669 */			 	   
+  dataPoolAddr[670] = (void *)&(pdpIasw->SEM_N5V0);  /* ID: 670 */			 	   
+  dataPoolAddr[671] = (void *)&(pdpIasw->ADC_P3V3_RAW);  /* ID: 671 */		 
+  dataPoolAddr[672] = (void *)&(pdpIasw->ADC_P5V_RAW);  /* ID: 672 */		 
+  dataPoolAddr[673] = (void *)&(pdpIasw->ADC_P1V8_RAW);  /* ID: 673 */		 
+  dataPoolAddr[674] = (void *)&(pdpIasw->ADC_P2V5_RAW);  /* ID: 674 */		 
+  dataPoolAddr[675] = (void *)&(pdpIasw->ADC_N5V_RAW);  /* ID: 675 */		 
+  dataPoolAddr[676] = (void *)&(pdpIasw->ADC_PGND_RAW);  /* ID: 676 */		 
+  dataPoolAddr[677] = (void *)&(pdpIasw->ADC_TEMPOH1A_RAW);  /* ID: 677 */		 	   
+  dataPoolAddr[678] = (void *)&(pdpIasw->ADC_TEMP1_RAW);  /* ID: 678 */		 
+  dataPoolAddr[679] = (void *)&(pdpIasw->ADC_TEMPOH2A_RAW);  /* ID: 679 */		 	   
+  dataPoolAddr[680] = (void *)&(pdpIasw->ADC_TEMPOH1B_RAW);  /* ID: 680 */		 	   
+  dataPoolAddr[681] = (void *)&(pdpIasw->ADC_TEMPOH3A_RAW);  /* ID: 681 */		 	   
+  dataPoolAddr[682] = (void *)&(pdpIasw->ADC_TEMPOH2B_RAW);  /* ID: 682 */		 	   
+  dataPoolAddr[683] = (void *)&(pdpIasw->ADC_TEMPOH4A_RAW);  /* ID: 683 */		 	   
+  dataPoolAddr[684] = (void *)&(pdpIasw->ADC_TEMPOH3B_RAW);  /* ID: 684 */		 	   
+  dataPoolAddr[685] = (void *)&(pdpIasw->ADC_TEMPOH4B_RAW);  /* ID: 685 */		 	   
+  dataPoolAddr[686] = (void *)&(pdpIasw->SEM_P15V_RAW);  /* ID: 686 */		 
+  dataPoolAddr[687] = (void *)&(pdpIasw->SEM_P30V_RAW);  /* ID: 687 */		 
+  dataPoolAddr[688] = (void *)&(pdpIasw->SEM_P5V0_RAW);  /* ID: 688 */		 
+  dataPoolAddr[689] = (void *)&(pdpIasw->SEM_P7V0_RAW);  /* ID: 689 */		 
+  dataPoolAddr[690] = (void *)&(pdpIasw->SEM_N5V0_RAW);  /* ID: 690 */		 
+  dataPoolAddr[691] = (void *)&(pdpIasw->ADC_P3V3_U);  /* ID: 691 */		 
+  dataPoolAddr[692] = (void *)&(pdpIasw->ADC_P5V_U);  /* ID: 692 */			 	   
+  dataPoolAddr[693] = (void *)&(pdpIasw->ADC_P1V8_U);  /* ID: 693 */		 
+  dataPoolAddr[694] = (void *)&(pdpIasw->ADC_P2V5_U);  /* ID: 694 */		 
+  dataPoolAddr[695] = (void *)&(pdpIasw->ADC_N5V_L);  /* ID: 695 */			 	   
+  dataPoolAddr[696] = (void *)&(pdpIasw->ADC_PGND_U);  /* ID: 696 */		 
+  dataPoolAddr[697] = (void *)&(pdpIasw->ADC_PGND_L);  /* ID: 697 */		 
+  dataPoolAddr[698] = (void *)&(pdpIasw->ADC_TEMPOH1A_U);  /* ID: 698 */		 	   
+  dataPoolAddr[699] = (void *)&(pdpIasw->ADC_TEMP1_U);  /* ID: 699 */		 
+  dataPoolAddr[700] = (void *)&(pdpIasw->ADC_TEMPOH2A_U);  /* ID: 700 */		 	   
+  dataPoolAddr[701] = (void *)&(pdpIasw->ADC_TEMPOH1B_U);  /* ID: 701 */		 	   
+  dataPoolAddr[702] = (void *)&(pdpIasw->ADC_TEMPOH3A_U);  /* ID: 702 */		 	   
+  dataPoolAddr[703] = (void *)&(pdpIasw->ADC_TEMPOH2B_U);  /* ID: 703 */		 	   
+  dataPoolAddr[704] = (void *)&(pdpIasw->ADC_TEMPOH4A_U);  /* ID: 704 */		 	   
+  dataPoolAddr[705] = (void *)&(pdpIasw->ADC_TEMPOH3B_U);  /* ID: 705 */		 	   
+  dataPoolAddr[706] = (void *)&(pdpIasw->ADC_TEMPOH4B_U);  /* ID: 706 */		 	   
+  dataPoolAddr[707] = (void *)&(pdpIasw->SEM_P15V_U);  /* ID: 707 */		 
+  dataPoolAddr[708] = (void *)&(pdpIasw->SEM_P30V_U);  /* ID: 708 */		 
+  dataPoolAddr[709] = (void *)&(pdpIasw->SEM_P5V0_U);  /* ID: 709 */		 
+  dataPoolAddr[710] = (void *)&(pdpIasw->SEM_P7V0_U);  /* ID: 710 */		 
+  dataPoolAddr[711] = (void *)&(pdpIasw->SEM_N5V0_L);  /* ID: 711 */		 
+  dataPoolAddr[712] = (void *)&(pdpIasw->HbSemPassword);  /* ID: 712 */		 
+  dataPoolAddr[713] = (void *)&(pdpIasw->HbSemCounter);  /* ID: 713 */		 
+  dataPoolAddr[714] = (void *)&(pdpIbsw->isWatchdogEnabled);  /* ID: 714 */		 	   
+  dataPoolAddr[715] = (void *)&(pdpIbsw->isSynchronized);  /* ID: 715 */		 	   
+  dataPoolAddr[716] = (void *)&(pdpIbsw->missedMsgCnt);  /* ID: 716 */		 
+  dataPoolAddr[717] = (void *)&(pdpIbsw->missedPulseCnt);  /* ID: 717 */		 	   
+  dataPoolAddr[718] = (void *)&(pdpIbsw->milFrameDelay);  /* ID: 718 */		 
+  dataPoolAddr[719] = (void *)&(pdpIbsw->EL1_CHIP);  /* ID: 719 */			 	   
+  dataPoolAddr[720] = (void *)&(pdpIbsw->EL2_CHIP);  /* ID: 720 */			 	   
+  dataPoolAddr[721] = (void *)&(pdpIbsw->EL1_ADDR);  /* ID: 721 */			 	   
+  dataPoolAddr[722] = (void *)&(pdpIbsw->EL2_ADDR);  /* ID: 722 */			 	   
+  dataPoolAddr[723] = (void *)&(pdpIbsw->ERR_LOG_ENB);  /* ID: 723 */		 
+  dataPoolAddr[724] = (void *)&(pdpIbsw->isErrLogValid);  /* ID: 724 */		 
+  dataPoolAddr[725] = (void *)&(pdpIbsw->nOfErrLogEntries);  /* ID: 725 */		 	   
+  dataPoolAddr[726] = (void *)&(pdpIasw->MAX_SEM_PCKT_CYC);  /* ID: 726 */		 	   
+  dataPoolAddr[727] = (void *)&(pdpIbsw->FBF_BLCK_WR_DUR);  /* ID: 727 */		 	   
+  dataPoolAddr[728] = (void *)&(pdpIbsw->FBF_BLCK_RD_DUR);  /* ID: 728 */		 	   
+  dataPoolAddr[729] = (void *)&(pdpIbsw->isFbfOpen);  /* ID: 729 */			 	   
+  dataPoolAddr[730] = (void *)&(pdpIbsw->isFbfValid);  /* ID: 730 */		 
+  dataPoolAddr[731] = (void *)&(pdpIbsw->FBF_ENB);  /* ID: 731 */			 	   
+  dataPoolAddr[732] = (void *)&(pdpIbsw->FBF_CHIP);  /* ID: 732 */			 	   
+  dataPoolAddr[733] = (void *)&(pdpIbsw->FBF_ADDR);  /* ID: 733 */			 	   
+  dataPoolAddr[734] = (void *)&(pdpIbsw->fbfNBlocks);  /* ID: 734 */		 
+  dataPoolAddr[735] = (void *)&(pdpIbsw->THR_MA_A_1);  /* ID: 735 */		 
+  dataPoolAddr[736] = (void *)&(pdpIbsw->THR_MA_A_2);  /* ID: 736 */		 
+  dataPoolAddr[737] = (void *)&(pdpIbsw->THR_MA_A_3);  /* ID: 737 */		 
+  dataPoolAddr[738] = (void *)&(pdpIbsw->THR_MA_A_4);  /* ID: 738 */		 
+  dataPoolAddr[739] = (void *)&(pdpIbsw->THR_MA_A_5);  /* ID: 739 */		 
+  dataPoolAddr[740] = (void *)&(pdpIbsw->wcet_1);  /* ID: 740 */			 	   
+  dataPoolAddr[741] = (void *)&(pdpIbsw->wcet_2);  /* ID: 741 */			 	   
+  dataPoolAddr[742] = (void *)&(pdpIbsw->wcet_3);  /* ID: 742 */			 	   
+  dataPoolAddr[743] = (void *)&(pdpIbsw->wcet_4);  /* ID: 743 */			 	   
+  dataPoolAddr[744] = (void *)&(pdpIbsw->wcet_5);  /* ID: 744 */			 	   
+  dataPoolAddr[745] = (void *)&(pdpIbsw->wcetAver_1);  /* ID: 745 */		 
+  dataPoolAddr[746] = (void *)&(pdpIbsw->wcetAver_2);  /* ID: 746 */		 
+  dataPoolAddr[747] = (void *)&(pdpIbsw->wcetAver_3);  /* ID: 747 */		 
+  dataPoolAddr[748] = (void *)&(pdpIbsw->wcetAver_4);  /* ID: 748 */		 
+  dataPoolAddr[749] = (void *)&(pdpIbsw->wcetAver_5);  /* ID: 749 */		 
+  dataPoolAddr[750] = (void *)&(pdpIbsw->wcetMax_1);  /* ID: 750 */			 	   
+  dataPoolAddr[751] = (void *)&(pdpIbsw->wcetMax_2);  /* ID: 751 */			 	   
+  dataPoolAddr[752] = (void *)&(pdpIbsw->wcetMax_3);  /* ID: 752 */			 	   
+  dataPoolAddr[753] = (void *)&(pdpIbsw->wcetMax_4);  /* ID: 753 */			 	   
+  dataPoolAddr[754] = (void *)&(pdpIbsw->wcetMax_5);  /* ID: 754 */			 	   
+  dataPoolAddr[755] = (void *)&(pdpIbsw->nOfNotif_1);  /* ID: 755 */		 
+  dataPoolAddr[756] = (void *)&(pdpIbsw->nOfNotif_2);  /* ID: 756 */		 
+  dataPoolAddr[757] = (void *)&(pdpIbsw->nOfNotif_3);  /* ID: 757 */		 
+  dataPoolAddr[758] = (void *)&(pdpIbsw->nOfNotif_4);  /* ID: 758 */		 
+  dataPoolAddr[759] = (void *)&(pdpIbsw->nOfNotif_5);  /* ID: 759 */		 
+  dataPoolAddr[760] = (void *)&(pdpIbsw->nofFuncExec_1);  /* ID: 760 */		 
+  dataPoolAddr[761] = (void *)&(pdpIbsw->nofFuncExec_2);  /* ID: 761 */		 
+  dataPoolAddr[762] = (void *)&(pdpIbsw->nofFuncExec_3);  /* ID: 762 */		 
+  dataPoolAddr[763] = (void *)&(pdpIbsw->nofFuncExec_4);  /* ID: 763 */		 
+  dataPoolAddr[764] = (void *)&(pdpIbsw->nofFuncExec_5);  /* ID: 764 */		 
+  dataPoolAddr[765] = (void *)&(pdpIbsw->wcetTimeStampFine_1);  /* ID: 765 */	 
+  dataPoolAddr[766] = (void *)&(pdpIbsw->wcetTimeStampFine_2);  /* ID: 766 */	 
+  dataPoolAddr[767] = (void *)&(pdpIbsw->wcetTimeStampFine_3);  /* ID: 767 */	 
+  dataPoolAddr[768] = (void *)&(pdpIbsw->wcetTimeStampFine_4);  /* ID: 768 */	 
+  dataPoolAddr[769] = (void *)&(pdpIbsw->wcetTimeStampFine_5);  /* ID: 769 */	 
+  dataPoolAddr[770] = (void *)&(pdpIbsw->wcetTimeStampCoarse_1);  /* ID: 770 */	 
+  dataPoolAddr[771] = (void *)&(pdpIbsw->wcetTimeStampCoarse_2);  /* ID: 771 */	 
+  dataPoolAddr[772] = (void *)&(pdpIbsw->wcetTimeStampCoarse_3);  /* ID: 772 */	 
+  dataPoolAddr[773] = (void *)&(pdpIbsw->wcetTimeStampCoarse_4);  /* ID: 773 */	 
+  dataPoolAddr[774] = (void *)&(pdpIbsw->wcetTimeStampCoarse_5);  /* ID: 774 */	 
+  dataPoolAddr[775] = (void *)&(pdpIbsw->flashContStepCnt);  /* ID: 775 */		 	   
+  dataPoolAddr[776] = (void *)&(pdpIbsw->OTA_TM1A_NOM);  /* ID: 776 */		 
+  dataPoolAddr[777] = (void *)&(pdpIbsw->OTA_TM1A_RED);  /* ID: 777 */		 
+  dataPoolAddr[778] = (void *)&(pdpIbsw->OTA_TM1B_NOM);  /* ID: 778 */		 
+  dataPoolAddr[779] = (void *)&(pdpIbsw->OTA_TM1B_RED);  /* ID: 779 */		 
+  dataPoolAddr[780] = (void *)&(pdpIbsw->OTA_TM2A_NOM);  /* ID: 780 */		 
+  dataPoolAddr[781] = (void *)&(pdpIbsw->OTA_TM2A_RED);  /* ID: 781 */		 
+  dataPoolAddr[782] = (void *)&(pdpIbsw->OTA_TM2B_NOM);  /* ID: 782 */		 
+  dataPoolAddr[783] = (void *)&(pdpIbsw->OTA_TM2B_RED);  /* ID: 783 */		 
+  dataPoolAddr[784] = (void *)&(pdpIbsw->OTA_TM3A_NOM);  /* ID: 784 */		 
+  dataPoolAddr[785] = (void *)&(pdpIbsw->OTA_TM3A_RED);  /* ID: 785 */		 
+  dataPoolAddr[786] = (void *)&(pdpIbsw->OTA_TM3B_NOM);  /* ID: 786 */		 
+  dataPoolAddr[787] = (void *)&(pdpIbsw->OTA_TM3B_RED);  /* ID: 787 */		 
+  dataPoolAddr[788] = (void *)&(pdpIbsw->OTA_TM4A_NOM);  /* ID: 788 */		 
+  dataPoolAddr[789] = (void *)&(pdpIbsw->OTA_TM4A_RED);  /* ID: 789 */		 
+  dataPoolAddr[790] = (void *)&(pdpIbsw->OTA_TM4B_NOM);  /* ID: 790 */		 
+  dataPoolAddr[791] = (void *)&(pdpIbsw->OTA_TM4B_RED);  /* ID: 791 */		 
+  dataPoolAddr[792] = (void *)&(pdpIbsw->Core0Load);  /* ID: 792 */			 	   
+  dataPoolAddr[793] = (void *)&(pdpIbsw->Core1Load);  /* ID: 793 */			 	   
+  dataPoolAddr[794] = (void *)&(pdpIbsw->InterruptRate);  /* ID: 794 */		 
+  dataPoolAddr[795] = (void *)&(pdpIbsw->CyclicalActivitiesCtr);  /* ID: 795 */	 
+  dataPoolAddr[796] = (void *)&(pdpIbsw->Uptime);  /* ID: 796 */			 	   
+  dataPoolAddr[797] = (void *)&(pdpIbsw->SemTick);  /* ID: 797 */			 	   
+  dataPoolAddr[798] = (void *)&(pdpIasw->SemPwrOnTimestamp);  /* ID: 798 */		 	   
+  dataPoolAddr[799] = (void *)&(pdpIasw->SemPwrOffTimestamp);  /* ID: 799 */	 
+  dataPoolAddr[800] = (void *)&(pdpIasw->IASW_EVT_CTR);  /* ID: 800 */		 
+  dataPoolAddr[801] = (void *)&(pdpIbsw->BAD_COPY_ID);  /* ID: 801 */		 
+  dataPoolAddr[802] = (void *)&(pdpIbsw->BAD_PASTE_ID);  /* ID: 802 */		 
+  dataPoolAddr[803] = (void *)&(pdpIbsw->ObcInputBufferPackets);  /* ID: 803 */	 
+  dataPoolAddr[804] = (void *)&(pdpIbsw->GrndInputBufferPackets);  /* ID: 804 */	 	   
+  dataPoolAddr[805] = (void *)&(pdpIbsw->MilBusBytesIn);  /* ID: 805 */		 
+  dataPoolAddr[806] = (void *)&(pdpIbsw->MilBusBytesOut);  /* ID: 806 */		 	   
+  dataPoolAddr[807] = (void *)&(pdpIbsw->MilBusDroppedBytes);  /* ID: 807 */	 
+  dataPoolAddr[808] = (void *)&(pdpIbsw->IRL1);  /* ID: 808 */			 
+  dataPoolAddr[809] = (void *)&(pdpIbsw->IRL1_AHBSTAT);  /* ID: 809 */		 
+  dataPoolAddr[810] = (void *)&(pdpIbsw->IRL1_GRGPIO_6);  /* ID: 810 */		 
+  dataPoolAddr[811] = (void *)&(pdpIbsw->IRL1_GRTIMER);  /* ID: 811 */		 
+  dataPoolAddr[812] = (void *)&(pdpIbsw->IRL1_GPTIMER_0);  /* ID: 812 */		 	   
+  dataPoolAddr[813] = (void *)&(pdpIbsw->IRL1_GPTIMER_1);  /* ID: 813 */		 	   
+  dataPoolAddr[814] = (void *)&(pdpIbsw->IRL1_GPTIMER_2);  /* ID: 814 */		 	   
+  dataPoolAddr[815] = (void *)&(pdpIbsw->IRL1_GPTIMER_3);  /* ID: 815 */		 	   
+  dataPoolAddr[816] = (void *)&(pdpIbsw->IRL1_IRQMP);  /* ID: 816 */		 
+  dataPoolAddr[817] = (void *)&(pdpIbsw->IRL1_B1553BRM);  /* ID: 817 */		 
+  dataPoolAddr[818] = (void *)&(pdpIbsw->IRL2);  /* ID: 818 */			 
+  dataPoolAddr[819] = (void *)&(pdpIbsw->IRL2_GRSPW2_0);  /* ID: 819 */		 
+  dataPoolAddr[820] = (void *)&(pdpIbsw->IRL2_GRSPW2_1);  /* ID: 820 */		 
+  dataPoolAddr[821] = (void *)&(pdpIbsw->SemRoute);  /* ID: 821 */			 	   
+  dataPoolAddr[822] = (void *)&(pdpIbsw->SpW0BytesIn);  /* ID: 822 */		 
+  dataPoolAddr[823] = (void *)&(pdpIbsw->SpW0BytesOut);  /* ID: 823 */		 
+  dataPoolAddr[824] = (void *)&(pdpIbsw->SpW1BytesIn);  /* ID: 824 */		 
+  dataPoolAddr[825] = (void *)&(pdpIbsw->SpW1BytesOut);  /* ID: 825 */		 
+  dataPoolAddr[826] = (void *)&(pdpIbsw->Spw0TxDescAvail);  /* ID: 826 */		 	   
+  dataPoolAddr[827] = (void *)&(pdpIbsw->Spw0RxPcktAvail);  /* ID: 827 */		 	   
+  dataPoolAddr[828] = (void *)&(pdpIbsw->Spw1TxDescAvail);  /* ID: 828 */		 	   
+  dataPoolAddr[829] = (void *)&(pdpIbsw->Spw1RxPcktAvail);  /* ID: 829 */		 	   
+  dataPoolAddr[830] = (void *)&(pdpIbsw->MilCucCoarseTime);  /* ID: 830 */		 	   
+  dataPoolAddr[831] = (void *)&(pdpIbsw->MilCucFineTime);  /* ID: 831 */		 	   
+  dataPoolAddr[832] = (void *)&(pdpIbsw->CucCoarseTime);  /* ID: 832 */		 
+  dataPoolAddr[833] = (void *)&(pdpIbsw->CucFineTime);  /* ID: 833 */		 
+  dataPoolAddr[834] = (void *)&(pdpIasw->Sram1ScrCurrAddr);  /* ID: 834 */		 	   
+  dataPoolAddr[835] = (void *)&(pdpIasw->Sram2ScrCurrAddr);  /* ID: 835 */		 	   
+  dataPoolAddr[836] = (void *)&(pdpIasw->Sram1ScrLength);  /* ID: 836 */		 	   
+  dataPoolAddr[837] = (void *)&(pdpIasw->Sram2ScrLength);  /* ID: 837 */		 	   
+  dataPoolAddr[838] = (void *)&(pdpIasw->EdacSingleRepaired);  /* ID: 838 */	 
+  dataPoolAddr[839] = (void *)&(pdpIasw->EdacSingleFaults);  /* ID: 839 */		 	   
+  dataPoolAddr[840] = (void *)&(pdpIasw->EdacLastSingleFail);  /* ID: 840 */	 
+  dataPoolAddr[841] = (void *)&(pdpIbsw->EdacDoubleFaults);  /* ID: 841 */		 	   
+  dataPoolAddr[842] = (void *)&(pdpIbsw->EdacDoubleFAddr);  /* ID: 842 */		 	   
+  dataPoolAddr[843] = (void *)&(pdpIasw->Cpu2ProcStatus);  /* ID: 843 */		 	   
+  dataPoolAddr[844] = (void *)&(pdpIbsw->HEARTBEAT_ENABLED);  /* ID: 844 */		 	   
+  dataPoolAddr[845] = (void *)&(pdpIbsw->S1AllocDbs);  /* ID: 845 */		 
+  dataPoolAddr[846] = (void *)&(pdpIbsw->S1AllocSw);  /* ID: 846 */			 	   
+  dataPoolAddr[847] = (void *)&(pdpIbsw->S1AllocHeap);  /* ID: 847 */		 
+  dataPoolAddr[848] = (void *)&(pdpIbsw->S1AllocFlash);  /* ID: 848 */		 
+  dataPoolAddr[849] = (void *)&(pdpIbsw->S1AllocAux);  /* ID: 849 */		 
+  dataPoolAddr[850] = (void *)&(pdpIbsw->S1AllocRes);  /* ID: 850 */		 
+  dataPoolAddr[851] = (void *)&(pdpIbsw->S1AllocSwap);  /* ID: 851 */		 
+  dataPoolAddr[852] = (void *)&(pdpIbsw->S2AllocSciHeap);  /* ID: 852 */		 	   
+  dataPoolAddr[853] = (void *)&(pdpIasw->TaAlgoId);  /* ID: 853 */			 	   
+  dataPoolAddr[854] = (void *)&(pdpIasw->TAACQALGOID);  /* ID: 854 */		 
+  dataPoolAddr[855] = (void *)&(pdpIasw->TASPARE32);  /* ID: 855 */			 	   
+  dataPoolAddr[856] = (void *)&(pdpIasw->TaTimingPar1);  /* ID: 856 */		 
+  dataPoolAddr[857] = (void *)&(pdpIasw->TaTimingPar2);  /* ID: 857 */		 
+  dataPoolAddr[858] = (void *)&(pdpIasw->TaDistanceThrd);  /* ID: 858 */		 	   
+  dataPoolAddr[859] = (void *)&(pdpIasw->TaIterations);  /* ID: 859 */		 
+  dataPoolAddr[860] = (void *)&(pdpIasw->TaRebinningFact);  /* ID: 860 */		 	   
+  dataPoolAddr[861] = (void *)&(pdpIasw->TaDetectionThrd);  /* ID: 861 */		 	   
+  dataPoolAddr[862] = (void *)&(pdpIasw->TaSeReducedExtr);  /* ID: 862 */		 	   
+  dataPoolAddr[863] = (void *)&(pdpIasw->TaSeReducedRadius);  /* ID: 863 */		 	   
+  dataPoolAddr[864] = (void *)&(pdpIasw->TaSeTolerance);  /* ID: 864 */		 
+  dataPoolAddr[865] = (void *)&(pdpIasw->TaMvaTolerance);  /* ID: 865 */		 	   
+  dataPoolAddr[866] = (void *)&(pdpIasw->TaAmaTolerance);  /* ID: 866 */		 	   
+  dataPoolAddr[867] = (void *)&(pdpIasw->TAPOINTUNCERT);  /* ID: 867 */		 
+  dataPoolAddr[868] = (void *)&(pdpIasw->TATARGETSIG);  /* ID: 868 */		 
+  dataPoolAddr[869] = (void *)&(pdpIasw->TANROFSTARS);  /* ID: 869 */		 
+  dataPoolAddr[870] = (void *)&(pdpIasw->TaMaxSigFract);  /* ID: 870 */		 
+  dataPoolAddr[871] = (void *)&(pdpIasw->TaBias);  /* ID: 871 */			 	   
+  dataPoolAddr[872] = (void *)&(pdpIasw->TaDark);  /* ID: 872 */			 	   
+  dataPoolAddr[873] = (void *)&(pdpIasw->TaSkyBg);  /* ID: 873 */			 	   
+  dataPoolAddr[874] = (void *)&(pdpIasw->COGBITS);  /* ID: 874 */			 	   
+  dataPoolAddr[875] = (void *)&(pdpIasw->CENT_MULT_X);  /* ID: 875 */		 
+  dataPoolAddr[876] = (void *)&(pdpIasw->CENT_MULT_Y);  /* ID: 876 */		 
+  dataPoolAddr[877] = (void *)&(pdpIasw->CENT_OFFSET_X);  /* ID: 877 */		 
+  dataPoolAddr[878] = (void *)&(pdpIasw->CENT_OFFSET_Y);  /* ID: 878 */		 
+  dataPoolAddr[879] = (void *)&(pdpIasw->CENT_MEDIANFILTER);  /* ID: 879 */		 	   
+  dataPoolAddr[880] = (void *)&(pdpIasw->CENT_DIM_X);  /* ID: 880 */		 
+  dataPoolAddr[881] = (void *)&(pdpIasw->CENT_DIM_Y);  /* ID: 881 */		 
+  dataPoolAddr[882] = (void *)&(pdpIasw->CENT_CHECKS);  /* ID: 882 */		 
+  dataPoolAddr[883] = (void *)&(pdpIasw->CEN_SIGMALIMIT);  /* ID: 883 */		 	   
+  dataPoolAddr[884] = (void *)&(pdpIasw->CEN_SIGNALLIMIT);  /* ID: 884 */		 	   
+  dataPoolAddr[885] = (void *)&(pdpIasw->CEN_MEDIAN_THRD);  /* ID: 885 */		 	   
+  dataPoolAddr[886] = (void *)&(pdpIasw->OPT_AXIS_X);  /* ID: 886 */		 
+  dataPoolAddr[887] = (void *)&(pdpIasw->OPT_AXIS_Y);  /* ID: 887 */		 
+  dataPoolAddr[888] = (void *)&(pdpIasw->DIST_CORR);  /* ID: 888 */			 	   
+  dataPoolAddr[889] = (void *)&(pdpIasw->pStckOrderSci);  /* ID: 889 */		 
+  dataPoolAddr[890] = (void *)&(pdpIasw->pWinSizeXSci);  /* ID: 890 */		 
+  dataPoolAddr[891] = (void *)&(pdpIasw->pWinSizeYSci);  /* ID: 891 */		 
+  dataPoolAddr[892] = (void *)&(pdpIasw->SdpImageAptShape);  /* ID: 892 */		 	   
+  dataPoolAddr[893] = (void *)&(pdpIasw->SdpImageAptX);  /* ID: 893 */		 
+  dataPoolAddr[894] = (void *)&(pdpIasw->SdpImageAptY);  /* ID: 894 */		 
+  dataPoolAddr[895] = (void *)&(pdpIasw->SdpImgttAptShape);  /* ID: 895 */		 	   
+  dataPoolAddr[896] = (void *)&(pdpIasw->SdpImgttAptX);  /* ID: 896 */		 
+  dataPoolAddr[897] = (void *)&(pdpIasw->SdpImgttAptY);  /* ID: 897 */		 
+  dataPoolAddr[898] = (void *)&(pdpIasw->SdpImgttStckOrder);  /* ID: 898 */		 	   
+  dataPoolAddr[899] = (void *)&(pdpIasw->SdpLosStckOrder);  /* ID: 899 */		 	   
+  dataPoolAddr[900] = (void *)&(pdpIasw->SdpLblkStckOrder);  /* ID: 900 */		 	   
+  dataPoolAddr[901] = (void *)&(pdpIasw->SdpLdkStckOrder);  /* ID: 901 */		 	   
+  dataPoolAddr[902] = (void *)&(pdpIasw->SdpRdkStckOrder);  /* ID: 902 */		 	   
+  dataPoolAddr[903] = (void *)&(pdpIasw->SdpRblkStckOrder);  /* ID: 903 */		 	   
+  dataPoolAddr[904] = (void *)&(pdpIasw->SdpTosStckOrder);  /* ID: 904 */		 	   
+  dataPoolAddr[905] = (void *)&(pdpIasw->SdpTdkStckOrder);  /* ID: 905 */		 	   
+  dataPoolAddr[906] = (void *)&(pdpIasw->SdpImgttStrat);  /* ID: 906 */		 
+  dataPoolAddr[907] = (void *)&(pdpIasw->Sdp3StatAmpl);  /* ID: 907 */		 
+  dataPoolAddr[908] = (void *)&(pdpIasw->SdpPhotStrat);  /* ID: 908 */		 
+  dataPoolAddr[909] = (void *)&(pdpIasw->SdpPhotRcent);  /* ID: 909 */		 
+  dataPoolAddr[910] = (void *)&(pdpIasw->SdpPhotRann1);  /* ID: 910 */		 
+  dataPoolAddr[911] = (void *)&(pdpIasw->SdpPhotRann2);  /* ID: 911 */		 
+  dataPoolAddr[912] = (void *)&(pdpIasw->SdpCrc);  /* ID: 912 */			 	   
+  dataPoolAddr[913] = (void *)&(pdpIasw->CCPRODUCT);  /* ID: 913 */			 	   
+  dataPoolAddr[914] = (void *)&(pdpIasw->CCSTEP);  /* ID: 914 */			 	   
+  dataPoolAddr[915] = (void *)&(pdpIasw->XIB_FAILURES);  /* ID: 915 */		 
+  dataPoolAddr[916] = (void *)&(pdpIasw->FEE_SIDE_A);  /* ID: 916 */		 
+  dataPoolAddr[917] = (void *)&(pdpIasw->FEE_SIDE_B);  /* ID: 917 */		 
+  dataPoolAddr[918] = (void *)&(pdpIasw->NLCBORDERS);  /* ID: 918 */		 
+  dataPoolAddr[919] = (void *)&(pdpIasw->NLCCOEFF_A);  /* ID: 919 */		 
+  dataPoolAddr[920] = (void *)&(pdpIasw->NLCCOEFF_B);  /* ID: 920 */		 
+  dataPoolAddr[921] = (void *)&(pdpIasw->NLCCOEFF_C);  /* ID: 921 */		 
+  dataPoolAddr[922] = (void *)&(pdpIasw->NLCCOEFF_D);  /* ID: 922 */		 
+  dataPoolAddr[923] = (void *)&(pdpIasw->SdpGlobalBias);  /* ID: 923 */		 
+  dataPoolAddr[924] = (void *)&(pdpIasw->BiasOrigin);  /* ID: 924 */		 
+  dataPoolAddr[925] = (void *)&(pdpIasw->SdpGlobalGain);  /* ID: 925 */		 
+  dataPoolAddr[926] = (void *)&(pdpIasw->SdpWinImageCeKey);  /* ID: 926 */		 	   
+  dataPoolAddr[927] = (void *)&(pdpIasw->SdpWinImgttCeKey);  /* ID: 927 */		 	   
+  dataPoolAddr[928] = (void *)&(pdpIasw->SdpWinHdrCeKey);  /* ID: 928 */		 	   
+  dataPoolAddr[929] = (void *)&(pdpIasw->SdpWinMLOSCeKey);  /* ID: 929 */		 	   
+  dataPoolAddr[930] = (void *)&(pdpIasw->SdpWinMLBLKCeKey);  /* ID: 930 */		 	   
+  dataPoolAddr[931] = (void *)&(pdpIasw->SdpWinMLDKCeKey);  /* ID: 931 */		 	   
+  dataPoolAddr[932] = (void *)&(pdpIasw->SdpWinMRDKCeKey);  /* ID: 932 */		 	   
+  dataPoolAddr[933] = (void *)&(pdpIasw->SdpWinMRBLKCeKey);  /* ID: 933 */		 	   
+  dataPoolAddr[934] = (void *)&(pdpIasw->SdpWinMTOSCeKey);  /* ID: 934 */		 	   
+  dataPoolAddr[935] = (void *)&(pdpIasw->SdpWinMTDKCeKey);  /* ID: 935 */		 	   
+  dataPoolAddr[936] = (void *)&(pdpIasw->SdpFullImgCeKey);  /* ID: 936 */		 	   
+  dataPoolAddr[937] = (void *)&(pdpIasw->SdpFullHdrCeKey);  /* ID: 937 */		 	   
+  dataPoolAddr[938] = (void *)&(pdpIasw->CE_Timetag_crs);  /* ID: 938 */		 	   
+  dataPoolAddr[939] = (void *)&(pdpIasw->CE_Timetag_fine);  /* ID: 939 */		 	   
+  dataPoolAddr[940] = (void *)&(pdpIasw->CE_Counter);  /* ID: 940 */		 
+  dataPoolAddr[941] = (void *)&(pdpIasw->CE_Version);  /* ID: 941 */		 
+  dataPoolAddr[942] = (void *)&(pdpIasw->CE_Integrity);  /* ID: 942 */		 
+  dataPoolAddr[943] = (void *)&(pdpIasw->CE_SemWindowPosX);  /* ID: 943 */		 	   
+  dataPoolAddr[944] = (void *)&(pdpIasw->CE_SemWindowPosY);  /* ID: 944 */		 	   
+  dataPoolAddr[945] = (void *)&(pdpIasw->CE_SemWindowSizeX);  /* ID: 945 */		 	   
+  dataPoolAddr[946] = (void *)&(pdpIasw->CE_SemWindowSizeY);  /* ID: 946 */		 	   
+  dataPoolAddr[947] = (void *)&(pdpIasw->SPILL_CTR);  /* ID: 947 */			 	   
+  dataPoolAddr[948] = (void *)&(pdpIasw->RZIP_ITER1);  /* ID: 948 */		 
+  dataPoolAddr[949] = (void *)&(pdpIasw->RZIP_ITER2);  /* ID: 949 */		 
+  dataPoolAddr[950] = (void *)&(pdpIasw->RZIP_ITER3);  /* ID: 950 */		 
+  dataPoolAddr[951] = (void *)&(pdpIasw->RZIP_ITER4);  /* ID: 951 */		 
+  dataPoolAddr[952] = (void *)&(pdpIasw->SdpLdkColMask);  /* ID: 952 */		 
+  dataPoolAddr[953] = (void *)&(pdpIasw->SdpRdkColMask);  /* ID: 953 */		 
+  dataPoolAddr[954] = (void *)&(pdpIbsw->FPGA_Version);  /* ID: 954 */		 
+  dataPoolAddr[955] = (void *)&(pdpIbsw->FPGA_DPU_Status);  /* ID: 955 */		 	   
+  dataPoolAddr[956] = (void *)&(pdpIbsw->FPGA_DPU_Address);  /* ID: 956 */		 	   
+  dataPoolAddr[957] = (void *)&(pdpIbsw->FPGA_RESET_Status);  /* ID: 957 */		 	   
+  dataPoolAddr[958] = (void *)&(pdpIbsw->FPGA_SEM_Status);  /* ID: 958 */		 	   
+  dataPoolAddr[959] = (void *)&(pdpIbsw->FPGA_Oper_Heater_Status);  /* ID: 959 */	 	   
+  dataPoolAddr[960] = (void *)&(pdpIasw->GIBTOTRANSFER);  /* ID: 960 */		 
+  dataPoolAddr[961] = (void *)&(pdpIasw->TRANSFERMODE);  /* ID: 961 */		 
+  dataPoolAddr[962] = (void *)&(pdpIasw->S2TOTRANSFERSIZE);  /* ID: 962 */		 	   
+  dataPoolAddr[963] = (void *)&(pdpIasw->S4TOTRANSFERSIZE);  /* ID: 963 */		 	   
+  dataPoolAddr[964] = (void *)&(pdpIasw->TransferComplete);  /* ID: 964 */		 
+  dataPoolAddr[965] = (void *)&(pdpIasw->NLCBORDERS_2);  /* ID: 965 */		 
+  dataPoolAddr[966] = (void *)&(pdpIasw->NLCCOEFF_A_2);  /* ID: 966 */		 
+  dataPoolAddr[967] = (void *)&(pdpIasw->NLCCOEFF_B_2);  /* ID: 967 */		 
+  dataPoolAddr[968] = (void *)&(pdpIasw->NLCCOEFF_C_2);  /* ID: 968 */		 
+  dataPoolAddr[969] = (void *)&(pdpIasw->RF100);  /* ID: 969 */			 
+  dataPoolAddr[970] = (void *)&(pdpIasw->RF230);  /* ID: 970 */			 
+  dataPoolAddr[971] = (void *)&(pdpIasw->distc1);  /* ID: 971 */			 
+  dataPoolAddr[972] = (void *)&(pdpIasw->distc2);  /* ID: 972 */			 
+  dataPoolAddr[973] = (void *)&(pdpIasw->distc3);  /* ID: 973 */			 
+  dataPoolAddr[974] = (void *)&(pdpIasw->SPARE_UI_0);  /* ID: 974 */		 
+  dataPoolAddr[975] = (void *)&(pdpIasw->SPARE_UI_1);  /* ID: 975 */		 
+  dataPoolAddr[976] = (void *)&(pdpIasw->SPARE_UI_2);  /* ID: 976 */		 
+  dataPoolAddr[977] = (void *)&(pdpIasw->SPARE_UI_3);  /* ID: 977 */		 
+  dataPoolAddr[978] = (void *)&(pdpIasw->SPARE_UI_4);  /* ID: 978 */		 
+  dataPoolAddr[979] = (void *)&(pdpIasw->SPARE_UI_5);  /* ID: 979 */		 
+  dataPoolAddr[980] = (void *)&(pdpIasw->SPARE_UI_6);  /* ID: 980 */		 
+  dataPoolAddr[981] = (void *)&(pdpIasw->SPARE_UI_7);  /* ID: 981 */		 
+  dataPoolAddr[982] = (void *)&(pdpIasw->SPARE_UI_8);  /* ID: 982 */		 
+  dataPoolAddr[983] = (void *)&(pdpIasw->SPARE_UI_9);  /* ID: 983 */		 
+  dataPoolAddr[984] = (void *)&(pdpIasw->SPARE_UI_10);  /* ID: 984 */		 
+  dataPoolAddr[985] = (void *)&(pdpIasw->SPARE_UI_11);  /* ID: 985 */		 
+  dataPoolAddr[986] = (void *)&(pdpIasw->SPARE_UI_12);  /* ID: 986 */		 
+  dataPoolAddr[987] = (void *)&(pdpIasw->SPARE_UI_13);  /* ID: 987 */		 
+  dataPoolAddr[988] = (void *)&(pdpIasw->SPARE_UI_14);  /* ID: 988 */		 
+  dataPoolAddr[989] = (void *)&(pdpIasw->SPARE_UI_15);  /* ID: 989 */		 
+  dataPoolAddr[990] = (void *)&(pdpIasw->SPARE_F_0);  /* ID: 990 */			 
+  dataPoolAddr[991] = (void *)&(pdpIasw->SPARE_F_1);  /* ID: 991 */			 
+  dataPoolAddr[992] = (void *)&(pdpIasw->SPARE_F_2);  /* ID: 992 */			 
+  dataPoolAddr[993] = (void *)&(pdpIasw->SPARE_F_3);  /* ID: 993 */			 
+  dataPoolAddr[994] = (void *)&(pdpIasw->SPARE_F_4);  /* ID: 994 */			 
+  dataPoolAddr[995] = (void *)&(pdpIasw->SPARE_F_5);  /* ID: 995 */			 
+  dataPoolAddr[996] = (void *)&(pdpIasw->SPARE_F_6);  /* ID: 996 */			 
+  dataPoolAddr[997] = (void *)&(pdpIasw->SPARE_F_7);  /* ID: 997 */			 
+  dataPoolAddr[998] = (void *)&(pdpIasw->SPARE_F_8);  /* ID: 998 */			 
+  dataPoolAddr[999] = (void *)&(pdpIasw->SPARE_F_9);  /* ID: 999 */			 
+  dataPoolAddr[1000] = (void *)&(pdpIasw->SPARE_F_10);  /* ID: 1000 */		  
+  dataPoolAddr[1001] = (void *)&(pdpIasw->SPARE_F_11);  /* ID: 1001 */		  
+  dataPoolAddr[1002] = (void *)&(pdpIasw->SPARE_F_12);  /* ID: 1002 */		  
+  dataPoolAddr[1003] = (void *)&(pdpIasw->SPARE_F_13);  /* ID: 1003 */		  
+  dataPoolAddr[1004] = (void *)&(pdpIasw->SPARE_F_14);  /* ID: 1004 */		  
+  dataPoolAddr[1005] = (void *)&(pdpIasw->SPARE_F_15);  /* ID: 1005 */                 
+
+  return;
+}
+#endif /* PC_TARGET */
+
+unsigned char GetFpmSide (unsigned char id)
+{
+  unsigned int i;
+  unsigned char myid;
+  
+  for (i=0; i<FEE_SCRIPTS; i++)
+    {
+      CrIaCopyArrayItem (FEE_SIDE_A_ID, &myid, i);
+      if (myid == id)
+	return FPM_SIDE_A;
+    }
+
+  for (i=0; i<FEE_SCRIPTS; i++)
+    {      
+      CrIaCopyArrayItem (FEE_SIDE_B_ID, &myid, i);
+      if (myid == id)
+	return FPM_SIDE_B;      
+    }
+  
+  /* NOTE: in the case of an unknown id, we go ahead with side A */
+
+  return FPM_SIDE_A;
+}
+
+
+unsigned char GetRf (unsigned char id)
+{
+  unsigned int i;
+  unsigned char myid;
+  
+  for (i=0; i<FEE_SCRIPTS; i++)
+    {
+      CrIaCopyArrayItem (RF230_ID, &myid, i);
+      if (myid == id)
+	return RF230KHZ;      
+    }
+
+  for (i=0; i<FEE_SCRIPTS; i++)
+    {
+      CrIaCopyArrayItem (RF100_ID, &myid, i);
+      if (myid == id)
+	return RF100KHZ;
+    }
+
+  /* NOTE: in the case of an unknown id, we use 230 kHz */
+
+  return RF230KHZ;
+}
+
+
+unsigned int GetDataPoolSize(unsigned int id)
+{
+  return dataPoolSize[id];
+}
+
+unsigned int GetDataPoolMult(unsigned int id)
+{
+  return dataPoolMult[id];
+}
+
+
+void CrIa_Copy(unsigned int id, void * targetAddr, int tgtsize)
+{
+  int sizeOfTmType;
+  unsigned int i, dpvalue;
+  
+  sizeOfTmType = dataPoolSize[id];
+  if (sizeOfTmType != tgtsize)
+    {
+      dpIbsw.BAD_COPY_ID = id;
+      return;
+    }
+
+  /* the debug variables need special treatment, because the addresses are stored in DEBUG_VAR_ADDR */
+  if (id == DEBUG_VAR_ID)
+    {
+      for (i=0; i < dataPoolMult[id]; i++)
+	{
+	  CrIaCopyArrayItem(DEBUG_VAR_ADDR_ID, &dpvalue, i); /* get address of the address(!) into debugvar */
+
+	  if (dpvalue == 0) /* NOTE: we do not check if invalid address. This is the user's responsibility */
+	    {
+	      /* report the wrong address */
+	      memcpy (&((unsigned int *)targetAddr)[i], &dpvalue, 4);
+	    }
+	  else
+	    {	    	     
+	     memcpy (&((unsigned int *)targetAddr)[i], (unsigned int *)((unsigned long int)dpvalue), 4);
+	    }
+	}
+      
+      return;
+    }
+
+  /* all normal DP entries are treated hereafter */
+  for (i=0; i < dataPoolMult[id]; i++)
+    {
+      dpvalue = ((unsigned int *)(dataPoolAddr[id]))[i];
+      
+      switch (sizeOfTmType)
+	{
+	  
+	case 1 :
+	  {
+	    ((unsigned char *)targetAddr)[i] = (unsigned char)(dpvalue & 0xff);
+	    break;
+	  }
+	  
+	case 2 :
+	  {	  
+	    /* destination can be unaligned */
+	    ((unsigned char *)targetAddr)[2*i] = (unsigned char)((dpvalue >> 8) & 0xff);
+	    ((unsigned char *)targetAddr)[2*i+1] = (unsigned char)(dpvalue & 0xff);
+	    break;
+	  }
+	  
+	default : /* sizeOfTmType == 4 */
+	  {
+	    /* destination can be unaligned */
+	    ((unsigned char *)targetAddr)[4*i] = (unsigned char)((dpvalue >> 24) & 0xff);
+	    ((unsigned char *)targetAddr)[4*i+1] = (unsigned char)((dpvalue >> 16) & 0xff);	
+	    ((unsigned char *)targetAddr)[4*i+2] = (unsigned char)((dpvalue >> 8) & 0xff);
+	    ((unsigned char *)targetAddr)[4*i+3] = (unsigned char)(dpvalue & 0xff);
+	    break;
+	  }
+
+	}
+    }
+}
+
+#ifdef PC_TARGET
+/* copy ALL array elements of a parameter */
+void CrIa_Copy_PC(unsigned int id, void * targetAddr, int tgtsize)
+{
+        int sizeOfTmType, sizeOfImplType;
+        unsigned int i, debugvar;
+        void *dest, *src;
+
+        /* determine size of telemetry and implementation types */
+        sizeOfTmType = dataPoolSize[id];
+
+	sizeOfImplType = 4; /* NOTE: all our DP variables are implemented with a size of 4 */
+
+	if (tgtsize != sizeOfTmType) {
+	  x_printf("COPY >> Pool ID: %d; arg size should be: %d, is %d caller: %lx\n",
+		   id, sizeOfTmType, tgtsize, (unsigned long int)__builtin_return_address(0));
+		return;
+	}
+
+        /* Copy data item from data pool (where it is stored according to its */
+        /* implementation type) to a location in the telemetry packet (where  */
+        /* it is stored according to its telemetry type)                      */
+
+        for (i=0; i < dataPoolMult[id]; i++)
+        {
+#if (__sparc__)
+                dest = (void *)(((unsigned long int) targetAddr) + i * sizeOfTmType);
+                src  = (void *)(((unsigned long int) dataPoolAddr[id])
+                                + (sizeOfImplType - sizeOfTmType) + i * sizeOfImplType);
+#else
+                dest = (void *)((unsigned long int) targetAddr + i * sizeOfTmType);
+                src  = (void *)((unsigned long int) dataPoolAddr[id] + i * sizeOfImplType);
+#endif
+
+#if (__sparc__)
+		/* the debug variables need special treatment, because the addresses are stored in DEBUG_VAR_ADDR */
+		if (id == DEBUG_VAR_ID)
+		  {
+		    debugvar = 0;
+		    CrIaCopyArrayItem(DEBUG_VAR_ADDR_ID, &debugvar, i); /* get address of the address(!) into debugvar */
+		    src = (unsigned int *) debugvar; /* get the address of the value to debug into src */
+		    if (src == 0) /* NOTE: we do not check if this is an invalid address. This is the user's responsibility. */
+		      {
+			/* report the wrong address */
+			src = (unsigned int *)(((unsigned long int)(dataPoolAddr[DEBUG_VAR_ADDR_ID])) + i * sizeOfImplType);
+		      }
+		  }
+#else
+		(void) debugvar;
+#endif	
+                memcpy(dest, src, sizeOfTmType);
+        }
+}
+#endif
+
+#if !(__sparc__)
+/* Copy ALL array elements of a parameter. 
+   This function is needed on PC to swap  
+   the endianess during the copy to a PUS packet.
+   Do not use it for transfer to local variables. */
+void CrIaCopyPcPckt(unsigned int id, void * targetAddr)
+{
+  int sizeOfTmType, sizeOfImplType;
+  unsigned int *src;
+  unsigned char *dest;
+  unsigned int value;
+  unsigned int i;
+  
+  /* determine size of telemetry and implementation types */
+  sizeOfTmType = dataPoolSize[id];
+  if (sizeOfTmType<5)
+    sizeOfImplType = 4;
+  else
+    sizeOfImplType = 8;
+  
+  /* Copy data item from data pool (where it is stored according to its */
+  /* implementation type) to a location in the telemetry packet (where  */
+  /* it is stored according to its telemetry type)                      */
+
+  for (i=0; i<dataPoolMult[id]; i++)
+    {
+      src = (unsigned int *)(((unsigned long int)(dataPoolAddr[id])) + i * sizeOfImplType);
+
+      value = *src;
+      
+      dest = ((unsigned char *)targetAddr) + i * sizeOfTmType;
+
+      if (sizeOfTmType == 1)
+	{
+	  dest[0] = value & 0xff;
+	}
+      else if (sizeOfTmType == 2)
+	{
+	  dest[0] = (value >> 8) & 0xff;
+	  dest[1] = value & 0xff;
+	}
+      else /* must be 4 */
+	{
+	  dest[0] = (value >> 24) & 0xff;
+	  dest[1] = (value >> 16) & 0xff;     
+	  dest[2] = (value >> 8) & 0xff;
+	  dest[3] = value & 0xff;     
+	}
+    }
+}
+#endif
+
+/* Copy a single array element of a parameter */
+void CrIaCopyArrayItem(unsigned int id, void * targetAddr, unsigned int arrayElement)
+{
+        int sizeOfTmType, sizeOfImplType;
+        void  *src;
+
+        /* determine size of telemetry and implementation types */
+        sizeOfTmType = dataPoolSize[id];
+
+	sizeOfImplType = 4; /* NOTE: all our DP variables are implemented with a size of 4 */
+
+        /* Copy data item from data pool (where it is stored according to its */
+        /* implementation type) to a location in the telemetry packet (where  */
+        /* it is stored according to its telemetry type)                      */
+
+#if (__sparc__)
+        src = (void *)(((unsigned long int) dataPoolAddr[id])
+        	       + (sizeOfImplType - sizeOfTmType) + arrayElement * sizeOfImplType);
+#else
+        src = (void *)(((unsigned long int) dataPoolAddr[id]) + arrayElement * sizeOfImplType);
+#endif
+
+        memcpy(targetAddr, src, sizeOfTmType);
+
+}
+
+#if PC_TARGET
+/* Copy a single array element of a parameter. 
+ * This function is needed on PC to swap  
+ *  the endianess during the copy to a PUS packet.
+ *  Do not use it for transfer to local variables.
+*/
+void CrIaCopyArrayItemPcPckt(unsigned int id, void * targetAddr, unsigned int arrayElement)
+{
+  int sizeOfTmType, sizeOfImplType;
+  unsigned int *src;
+  unsigned char *dest;
+  unsigned int value;
+  
+  /* determine size of telemetry and implementation types */
+  sizeOfTmType = dataPoolSize[id];
+  if (sizeOfTmType<5)
+    sizeOfImplType = 4;
+  else
+    sizeOfImplType = 8;
+  
+  /* Copy data item from data pool (where it is stored according to its
+   * implementation type) to a location in the telemetry packet (where
+   * it is stored according to its telemetry type)                      
+   */
+  src = (unsigned int *)(((unsigned long int)(dataPoolAddr[id])) + arrayElement * sizeOfImplType);
+  value = *src;
+  
+  dest = (unsigned char *)targetAddr;
+
+  if (sizeOfTmType == 1)
+    {
+      dest[0] = value & 0xff;
+    }
+  else if (sizeOfTmType == 2)
+    {
+      dest[0] = (value >> 8) & 0xff;
+      dest[1] = value & 0xff;
+    }
+  else /* must be 4 */
+    {
+      dest[0] = (value >> 24) & 0xff;
+      dest[1] = (value >> 16) & 0xff;     
+      dest[2] = (value >> 8) & 0xff;
+      dest[3] = value & 0xff;     
+    }
+  
+  return;
+}
+#endif /* PC_TARGET */
+
+
+/* paste ALL array elements of a parameter */
+void CrIa_Paste(unsigned int id, void * sourceAddr, int tgtsize)
+{
+  int sizeOfTmType;
+  unsigned int i;
+  
+  /* determine size of telemetry and implementation types */
+  sizeOfTmType = dataPoolSize[id];
+  if (sizeOfTmType != tgtsize)
+    {
+      dpIbsw.BAD_PASTE_ID = id;
+      return;
+    }
+  
+  for (i=0; i < dataPoolMult[id]; i++)
+    {
+
+      switch (sizeOfTmType)
+	{
+
+	case 1 :
+	  {
+	    ((unsigned int *)(dataPoolAddr[id]))[i] = ((unsigned char *)sourceAddr)[i];
+	    break;
+	  }
+
+	case 2 : 
+	  {
+	    ((unsigned int *)(dataPoolAddr[id]))[i] = ((unsigned short *)sourceAddr)[i];
+	    break;
+	  }
+
+	default : /* sizeOfTmType == 4 */
+	  {
+	    ((unsigned int *)(dataPoolAddr[id]))[i] = ((unsigned int *)sourceAddr)[i];
+	  }
+	  
+	}
+    }
+}
+
+
+#ifdef PC_TARGET
+/* paste ALL array elements of a parameter */
+void CrIa_Paste_PC(unsigned int id, void * sourceAddr, int tgtsize)
+{
+  int sizeOfTmType, sizeOfImplType;
+  unsigned int i;
+  void *dest, *src;
+  
+  /* determine size of telemetry and implementation types */
+  sizeOfTmType = dataPoolSize[id];
+
+  sizeOfImplType = 4; /* NOTE: all our DP variables are implemented with a size of 4 */
+  
+  if (tgtsize != sizeOfTmType)
+    {
+      x_printf("PASTE >> Pool ID: %d; arg size should be: %d, is %d caller: %lx\n",
+	       id, sizeOfTmType, tgtsize, (unsigned long int)__builtin_return_address(0));
+      return;
+    }
+  
+  /* Copy data item from a location in the telemetry packet (where it
+   * is stored according to its telemetry type) to the data pool (where
+   * it is stored according to its implementation type)
+   */
+  for (i=0; i < dataPoolMult[id]; i++)
+    {
+#if (__sparc__)
+      dest = (void *)(((unsigned long int) dataPoolAddr[id])
+		      + (sizeOfImplType - sizeOfTmType) + i * sizeOfImplType);
+      src  = (void *)(((unsigned long int) sourceAddr) + i * sizeOfTmType);
+#else
+      dest = (void *)((unsigned long int) dataPoolAddr[id] + i * sizeOfImplType);
+      src  = (void *)((unsigned long int) sourceAddr + i * sizeOfTmType);
+#endif /* __sparc__ */
+      
+      memcpy(dest, src, sizeOfTmType); /* RO last minute change from ImplType to TmType */
+    }
+  
+  return;
+}
+#endif
+
+/* paste only a single element from a parameter array */
+void CrIaPasteArrayItem(unsigned int id, const void * sourceAddr, unsigned int arrayElement)
+{
+  int sizeOfTmType, sizeOfImplType;
+  void *dest;
+  
+  /* determine size of telemetry and implementation types */
+  sizeOfTmType = dataPoolSize[id];
+
+  sizeOfImplType = 4; /* NOTE: all our DP variables are implemented with a size of 4 */
+  
+#if (__sparc__)
+  dest = (void *)(((unsigned long int) dataPoolAddr[id])
+		  + (sizeOfImplType - sizeOfTmType) + arrayElement*sizeOfImplType);
+#else
+  dest = (void *)(((unsigned long int) dataPoolAddr[id])
+		  + arrayElement*sizeOfImplType);
+#endif /* __sparc__ */
+  
+  memcpy(dest, sourceAddr, sizeOfTmType); /* RO last minute change from ImplType to TmType */
+
+  return;
+}
+
+#ifndef ISOLATED
+void CrFwUpdateDataPool(FwSmDesc_t inManagerSem, 
+                        FwSmDesc_t inManagerGrdObc,
+                        FwSmDesc_t outManager1,
+                        FwSmDesc_t outManager2,
+                        FwSmDesc_t outManager3,
+                        FwSmDesc_t localInStreamSem,
+                        FwSmDesc_t localInStreamObc,
+                        FwSmDesc_t localInStreamGrd,
+                        FwSmDesc_t localOutStreamSem,
+                        FwSmDesc_t localOutStreamObc,
+                        FwSmDesc_t localOutStreamGrd)
+{
+  unsigned char  temp_uchar;
+  char           temp_char;
+  unsigned short temp_ushort;
+  short          temp_short;
+  unsigned int   temp_uint;
+  int            temp_int;
+
+  unsigned short sm_state, esm_state;
+  unsigned short pr_state;
+  unsigned int sm_state_cnt;
+  unsigned int pr_state_cnt;  
+  FwSmDesc_t smDescSemOper;
+
+  (void) temp_uchar;
+  (void) temp_char;
+  (void) temp_ushort;
+  (void) temp_short;
+  (void) temp_uint;
+  (void) temp_int;
+  
+  /****************************************/
+  /* update all items from DataPoolCordet */
+  /****************************************/
+
+  /* InFactory */
+
+  temp_uchar = CrFwInFactoryGetNOfAllocatedInRep();
+  CrIaPaste(NOFALLOCATEDINREP_ID, &temp_uchar);
+                             
+  temp_uchar = CrFwInFactoryGetMaxNOfInRep();
+  CrIaPaste(MAXNOFINREP_ID, &temp_uchar);
+  
+  temp_uchar = CrFwInFactoryGetNOfAllocatedInCmd();
+  CrIaPaste(NOFALLOCATEDINCMD_ID, &temp_uchar);
+
+  temp_uchar = CrFwInFactoryGetMaxNOfInCmd();
+  CrIaPaste(MAXNOFINCMD_ID, &temp_uchar);
+
+  /* InManager SEM */
+
+  temp_uchar = CrFwInManagerGetNOfPendingInCmp(inManagerSem);
+  CrIaPaste(SEM_NOFPENDINGINCMP_ID, &temp_uchar);
+  /*  DEBUGP("\n\n\nCrFwInManagerGetNOfPendingInCmp(inManagerSem) = %d\n", temp_uchar); */
+
+  temp_uchar =  CrFwInManagerGetPCRLSize(inManagerSem);
+  CrIaPaste(SEM_PCRLSIZE_ID, &temp_uchar);
+
+  temp_uchar =  CrFwInManagerGetNOfLoadedInCmp(inManagerSem);
+  CrIaPaste(SEM_NOFLOADEDINCMP_ID, &temp_uchar);
+  /*  DEBUGP("CrFwInManagerGetNOfLoadedInCmp(inManagerSem) = %d\n", temp_uchar); */
+
+  /* InManager GRD/OBC */
+
+  temp_uchar =  CrFwInManagerGetNOfPendingInCmp(inManagerGrdObc);
+  CrIaPaste(GRDOBC_NOFPENDINGINCMP_ID, &temp_uchar);
+
+  temp_uchar =  CrFwInManagerGetPCRLSize(inManagerGrdObc);
+  CrIaPaste(GRDOBC_PCRLSIZE_ID, &temp_uchar);
+
+  /* OutFactory */
+
+  temp_uchar = CrFwOutFactoryGetNOfAllocatedOutCmp();
+  CrIaPaste(NOFALLOCATEDOUTCMP_ID, &temp_uchar);
+
+  temp_uchar = CrFwOutFactoryGetMaxNOfOutCmp();
+  CrIaPaste(MAXNOFOUTCMP_ID, &temp_uchar);
+
+  temp_ushort = (unsigned short)(CrFwOutFactoryGetNOfInstanceId() & 0xffff);
+  CrIaPaste(NOFINSTANCEID_ID, &temp_ushort);
+
+
+  /* Out Manager 1 */
+
+  temp_uchar = CrFwOutManagerGetNOfPendingOutCmp(outManager1);
+  CrIaPaste(OUTMG1_NOFPENDINGOUTCMP_ID, &temp_uchar);
+
+  temp_uchar = CrFwOutManagerGetPOCLSize(outManager1);
+  CrIaPaste(OUTMG1_POCLSIZE_ID, &temp_uchar);
+
+  temp_ushort = CrFwOutManagerGetNOfLoadedOutCmp(outManager1);
+  CrIaPaste(OUTMG1_NOFLOADEDOUTCMP_ID, &temp_ushort);
+
+  /* Out Manager 2 */
+
+  temp_uchar = CrFwOutManagerGetNOfPendingOutCmp(outManager2);
+  CrIaPaste(OUTMG2_NOFPENDINGOUTCMP_ID, &temp_uchar); 
+
+  temp_uchar = CrFwOutManagerGetPOCLSize(outManager2);
+  CrIaPaste(OUTMG2_POCLSIZE_ID, &temp_uchar);
+
+  temp_ushort = CrFwOutManagerGetNOfLoadedOutCmp(outManager2);
+  CrIaPaste(OUTMG2_NOFLOADEDOUTCMP_ID, &temp_ushort);
+
+  /* Out Manager 3 */
+
+  temp_uchar = CrFwOutManagerGetNOfPendingOutCmp(outManager3);
+  CrIaPaste(OUTMG3_NOFPENDINGOUTCMP_ID, &temp_uchar); 
+
+  temp_uchar = CrFwOutManagerGetPOCLSize(outManager3);
+  CrIaPaste(OUTMG3_POCLSIZE_ID, &temp_uchar);
+
+  temp_ushort = CrFwOutManagerGetNOfLoadedOutCmp(outManager3);
+  CrIaPaste(OUTMG3_NOFLOADEDOUTCMP_ID, &temp_ushort);
+
+  /* InStream SEM */
+
+  temp_uint = CrFwInStreamGetSeqCnt(localInStreamSem, 0);  /* group = 0, PCAT = 1 */
+  CrIaPaste(INSEM_SEQCNT_ID, &temp_uint);
+  /*  DEBUGP("CrFwInStreamGetSeqCnt(localInStreamSem, 0) = %d\n", temp_uint); */
+
+  temp_ushort = CrFwInStreamGetNOfPendingPckts(localInStreamSem);
+  CrIaPaste(INSEM_NOFPENDINGPCKTS_ID, &temp_ushort);
+  /*  DEBUGP("CrFwInStreamGetNOfPendingPckts(localInStreamSem) = %d\n", temp_ushort); */
+
+  temp_uchar = CrFwInStreamGetNOfGroups(localInStreamSem);
+  CrIaPaste(INSEM_NOFGROUPS_ID, &temp_uchar);
+
+  temp_uchar = CrFwInStreamGetPcktQueueSize(localInStreamSem);
+  CrIaPaste(INSEM_PCKTQUEUESIZE_ID, &temp_uchar);
+
+  /* have to be set asynchron */
+  /*temp_uchar = CrFwInRepGetSrc(localInStreamSem);*/ /* CrFwInCmdGetSrc(localInStreamSem) not used, no InCmd from SEM */
+  /*CrIaPaste(INSEM_SRC_ID, &temp_uchar);*/
+
+  /* InStream OBC */
+
+  temp_uchar = CrFwInStreamGetNOfPendingPckts(localInStreamObc);
+  CrIaPaste(INOBC_NOFPENDINGPCKTS_ID, &temp_uchar);
+
+  temp_uchar = CrFwInStreamGetNOfGroups(localInStreamObc);
+  CrIaPaste(INOBC_NOFGROUPS_ID, &temp_uchar);
+
+  temp_uchar = CrFwInStreamGetPcktQueueSize(localInStreamObc);
+  CrIaPaste(INOBC_PCKTQUEUESIZE_ID, &temp_uchar);
+
+  /* have to be set asynchron */
+  /*temp_uchar = CrFwInCmdGetSrc(localInStreamObc);*/ /* CrFwInRepGetSrc(localInStreamObc) not used, no InRep from OBC */
+  /*CrIaPaste(INOBC_SRC_ID, &temp_uchar);*/
+
+  /* InStream GRD */
+
+  temp_uchar = CrFwInStreamGetNOfPendingPckts(localInStreamGrd);
+  CrIaPaste(INGRD_NOFPENDINGPCKTS_ID, &temp_uchar);
+  /*  DEBUGP("CrFwInStreamGetNOfPendingPckts(localInStreamGrd) = %d\n\n\n", temp_uchar);*/
+
+  temp_uchar = CrFwInStreamGetNOfGroups(localInStreamGrd);
+  CrIaPaste(INGRD_NOFGROUPS_ID, &temp_uchar);
+
+  temp_uchar = CrFwInStreamGetPcktQueueSize(localInStreamGrd);
+  CrIaPaste(INGRD_PCKTQUEUESIZE_ID, &temp_uchar);
+
+  /* have to be set asynchron */
+  /*temp_uchar = CrFwInCmdGetSrc(localInStreamGrd);*/ /* CrFwInRepGetSrc(localInStreamGrd) not used, no InRep from GRD */
+  /*CrIaPaste(INGRD_SRC_ID, &temp_uchar);*/
+
+  /* OutStream SEM */
+
+  temp_uchar = CrFwOutStreamGetDest(localOutStreamSem);
+  CrIaPaste(OUTSEM_DEST_ID, &temp_uchar);  
+
+  temp_uint =  CrFwOutStreamGetSeqCnt(localOutStreamSem, 0); /* group = 0, PCAT = 1 */
+  CrIaPaste(OUTSEM_SEQCNT_ID, &temp_uint);
+  
+  temp_uchar = CrFwOutStreamGetNOfPendingPckts(localOutStreamSem);
+  CrIaPaste(OUTSEM_NOFPENDINGPCKTS_ID, &temp_uchar);
+
+  temp_uchar = CrFwOutStreamGetNOfGroups(localOutStreamSem);
+  CrIaPaste(OUTSEM_NOFGROUPS_ID, &temp_uchar);	
+ 
+  temp_uchar = CrFwOutStreamGetPcktQueueSize(localOutStreamSem);
+  CrIaPaste(OUTSEM_PCKTQUEUESIZE_ID, &temp_uchar);
+
+  /* OutStream OBC */
+
+  temp_uchar = CrFwOutStreamGetDest(localOutStreamObc);
+  CrIaPaste(OUTOBC_DEST_ID, &temp_uchar);
+
+  temp_uint =  CrFwOutStreamGetSeqCnt(localOutStreamObc, 0); /* group = 0, PCAT = 1 */
+  CrIaPaste(OUTOBC_SEQCNT_GROUP0_ID, &temp_uint);
+
+  temp_uint =  CrFwOutStreamGetSeqCnt(localOutStreamObc, 1); /* group = 1, PCAT = 2 */
+  CrIaPaste(OUTOBC_SEQCNT_GROUP1_ID, &temp_uint);	
+ 
+  temp_uchar = CrFwOutStreamGetNOfPendingPckts(localOutStreamObc);
+  CrIaPaste(OUTOBC_NOFPENDINGPCKTS_ID, &temp_uchar);
+
+  temp_uchar = CrFwOutStreamGetNOfGroups(localOutStreamObc);
+  CrIaPaste(OUTOBC_NOFGROUPS_ID, &temp_uchar);	 
+
+  temp_uchar = CrFwOutStreamGetPcktQueueSize(localOutStreamObc);
+  CrIaPaste(OUTOBC_PCKTQUEUESIZE_ID, &temp_uchar);
+
+  /* OutStream GRD */
+
+  temp_uchar = CrFwOutStreamGetDest(localOutStreamGrd);
+  CrIaPaste(OUTGRD_DEST_ID, &temp_uchar);
+
+  temp_uint =  CrFwOutStreamGetSeqCnt(localOutStreamGrd, 0); /* group = 0, PCAT = 1 */
+  CrIaPaste(OUTGRD_SEQCNT_GROUP0_ID, &temp_uint);
+
+  temp_uint =  CrFwOutStreamGetSeqCnt(localOutStreamGrd, 1); /* group = 1, PCAT = 2 */
+  CrIaPaste(OUTGRD_SEQCNT_GROUP1_ID, &temp_uint);
+
+  temp_uint =  CrFwOutStreamGetSeqCnt(localOutStreamGrd, 2); /* group = 2, PCAT = 3 */
+  CrIaPaste(OUTGRD_SEQCNT_GROUP2_ID, &temp_uint);
+
+  temp_uchar = CrFwOutStreamGetNOfPendingPckts(localOutStreamGrd);
+  CrIaPaste(OUTGRD_NOFPENDINGPCKTS_ID, &temp_uchar);
+
+  temp_uchar = CrFwOutStreamGetNOfGroups(localOutStreamGrd);
+  CrIaPaste(OUTGRD_NOFGROUPS_ID, &temp_uchar);	 
+
+  temp_uchar = CrFwOutStreamGetPcktQueueSize(localOutStreamGrd);
+  CrIaPaste(OUTGRD_PCKTQUEUESIZE_ID, &temp_uchar);
+  
+  /****************************************/
+  /*         update all SM states         */
+  /****************************************/
+
+  sm_state = FwSmGetCurState(smDescIasw);
+  CrIaPaste(IASWSTATE_ID, &sm_state);
+  sm_state_cnt = FwSmGetStateExecCnt(smDescIasw);
+  CrIaPaste(IASWSTATECNT_ID, &sm_state_cnt);
+  sm_state_cnt = FwSmGetExecCnt(smDescIasw);
+  CrIaPaste(IASWCYCLECNT_ID, &sm_state_cnt);
+
+  sm_state = FwSmGetCurState(smDescSem);
+  CrIaPaste(SEMSTATE_ID, &sm_state);
+  sm_state_cnt = FwSmGetStateExecCnt(smDescSem);
+  CrIaPaste(SEMSTATECNT_ID, &sm_state_cnt);
+
+  esm_state = FwSmGetCurStateEmb(smDescSem);
+  CrIaPaste(SEMOPERSTATE_ID, &esm_state);
+  /* Get the SEM Oper SM which is embedded in the current state of the SEM SM.
+   * This function returns either a SM Description (if there is a SM embedded
+   * in the current state of the SEM SM) or NULL (if there is no SM embedded
+   * in the current state of the SEM SM). */
+  smDescSemOper = FwSmGetEmbSmCur(smDescSem); 
+  if (smDescSemOper != NULL)
+    sm_state_cnt = FwSmGetStateExecCnt(smDescSemOper);
+  else
+    sm_state_cnt = 0; 
+  CrIaPaste(SEMOPERSTATECNT_ID, &sm_state_cnt);
+
+  /* FdCheck */
+  sm_state = FwSmGetCurState(smDescFdTelescopeTempMonitorCheck);
+  CrIaPaste(FDCHECKTTMSTATE_ID, &sm_state);
+
+  sm_state = FwSmGetCurState(smDescFdIncorrectSDSCntrCheck);
+  CrIaPaste(FDCHECKSDSCSTATE_ID, &sm_state);
+
+  sm_state = FwSmGetCurState(smDescFdSemCommErrCheck);
+  CrIaPaste(FDCHECKCOMERRSTATE_ID, &sm_state);
+
+  sm_state = FwSmGetCurState(smDescFdSemModeTimeOutCheck);
+  CrIaPaste(FDCHECKTIMEOUTSTATE_ID, &sm_state);
+  
+  sm_state = FwSmGetCurState(smDescFdSemSafeModeCheck);
+  CrIaPaste(FDCHECKSAFEMODESTATE_ID, &sm_state);
+
+  sm_state = FwSmGetCurState(smDescFdSemAliveCheck);
+  CrIaPaste(FDCHECKALIVESTATE_ID, &sm_state);
+
+  sm_state = FwSmGetCurState(smDescFdSemAnomalyEventCheck);
+  CrIaPaste(FDCHECKSEMANOEVTSTATE_ID, &sm_state);
+
+  sm_state = FwSmGetCurState(smDescFdSemLimitCheck);
+  CrIaPaste(FDCHECKSEMLIMITSTATE_ID, &sm_state);
+
+  sm_state = FwSmGetCurState(smDescFdDpuHousekeepingCheck);
+  CrIaPaste(FDCHECKDPUHKSTATE_ID, &sm_state);
+
+  sm_state = FwSmGetCurState(smDescFdCentroidConsistencyCheck);
+  CrIaPaste(FDCHECKCENTCONSSTATE_ID, &sm_state);
+
+  sm_state = FwSmGetCurState(smDescFdResourceCheck);
+  CrIaPaste(FDCHECKRESSTATE_ID, &sm_state);
+
+  sm_state = FwSmGetCurState(smDescFdSemModeConsistencyCheck);
+  CrIaPaste(FDCHECKSEMCONS_ID, &sm_state);
+
+  /* SDU */
+  sm_state = FwSmGetCurState(smDescSdu2);
+  CrIaPaste(SDU2STATE_ID, &sm_state);
+  sm_state_cnt = FwSmGetStateExecCnt(smDescSdu2);
+  CrIaPaste(SDU2STATECNT_ID, &sm_state_cnt);
+
+  sm_state = FwSmGetCurState(smDescSdu4);
+  CrIaPaste(SDU4STATE_ID, &sm_state);
+  sm_state_cnt = FwSmGetStateExecCnt(smDescSdu4);
+  CrIaPaste(SDU4STATECNT_ID, &sm_state_cnt);
+
+  /* SDB */
+  sm_state = FwSmGetCurState(smDescSdb);
+  CrIaPaste(SDBSTATE_ID, &sm_state);
+  sm_state_cnt = FwSmGetStateExecCnt(smDescSdb);
+  CrIaPaste(SDBSTATECNT_ID, &sm_state_cnt);
+
+  sm_state = FwSmGetCurState(smDescAlgoCent0);
+  CrIaPaste(ALGOCENT0STATE_ID, &sm_state);
+  sm_state_cnt = FwSmGetStateExecCnt(smDescAlgoCent0);
+  CrIaPaste(ALGOCENT0CNT_ID, &sm_state_cnt);
+
+  sm_state = FwSmGetCurState(smDescAlgoCent1);
+  CrIaPaste(ALGOCENT1STATE_ID, &sm_state);
+  sm_state_cnt = FwSmGetStateExecCnt(smDescAlgoCent1);
+  CrIaPaste(ALGOCENT1CNT_ID, &sm_state_cnt);
+
+  sm_state = FwSmGetCurState(smDescAlgoAcq1);
+  CrIaPaste(ALGOACQ1STATE_ID, &sm_state);
+  sm_state_cnt = FwSmGetStateExecCnt(smDescAlgoAcq1);
+  CrIaPaste(ALGOACQ1CNT_ID, &sm_state_cnt);
+
+  sm_state = FwSmGetCurState(smDescAlgoCmpr);
+  CrIaPaste(ALGOCCSTATE_ID, &sm_state);
+  sm_state_cnt = FwSmGetStateExecCnt(smDescAlgoCmpr);
+  CrIaPaste(ALGOCCCNT_ID, &sm_state_cnt);
+
+  sm_state = FwSmGetCurState(smDescAlgoTtc1);
+  CrIaPaste(ALGOTTC1STATE_ID, &sm_state);
+  sm_state_cnt = FwSmGetStateExecCnt(smDescAlgoTtc1);
+  CrIaPaste(ALGOTTC1CNT_ID, &sm_state_cnt);
+
+  sm_state = FwSmGetCurState(smDescAlgoTtc2);
+  CrIaPaste(ALGOTTC2STATE_ID, &sm_state);
+  sm_state_cnt = FwSmGetStateExecCnt(smDescAlgoTtc2);
+  CrIaPaste(ALGOTTC2CNT_ID, &sm_state_cnt);
+
+  sm_state = FwSmGetCurState(smDescAlgoSaaEval);
+  CrIaPaste(ALGOSAAEVALSTATE_ID, &sm_state);
+  sm_state_cnt = FwSmGetStateExecCnt(smDescAlgoSaaEval);
+  CrIaPaste(ALGOSAAEVALCNT_ID, &sm_state_cnt);
+
+  sm_state = FwSmGetCurState(smDescAlgoSdsEval);
+  CrIaPaste(ALGOSDSEVALSTATE_ID, &sm_state);
+  sm_state_cnt = FwSmGetStateExecCnt(smDescAlgoSdsEval);
+  CrIaPaste(ALGOSDSEVALCNT_ID, &sm_state_cnt);
+
+  /****************************************/
+  /*         update all PR states         */
+  /****************************************/
+
+  /* 1 - SAVE_IMG_PR   */
+  pr_state = (unsigned short) (FwPrGetCurNode(prDescSaveImages) & 0xffff);
+  CrIaPaste(SAVEIMAGESNODE_ID, &pr_state);
+  pr_state_cnt = FwPrGetNodeExecCnt(prDescSaveImages);
+  CrIaPaste(SAVEIMAGESCNT_ID, &pr_state_cnt);
+
+  /* 2 - ACQ_FULL_DROP */
+  pr_state = (unsigned short) (FwPrGetCurNode(prDescAcqFullDrop) & 0xffff);
+  CrIaPaste(ACQFULLDROPNODE_ID, &pr_state);
+  pr_state_cnt = FwPrGetNodeExecCnt(prDescAcqFullDrop);
+  CrIaPaste(ACQFULLDROPCNT_ID, &pr_state_cnt);
+
+  /* 3 - CAL_FULL_SNAP */
+  pr_state = (unsigned short) (FwPrGetCurNode(prDescCalFullSnap) & 0xffff);
+  CrIaPaste(CALFULLSNAPNODE_ID, &pr_state);
+  pr_state_cnt = FwPrGetNodeExecCnt(prDescCalFullSnap);
+  CrIaPaste(CALFULLSNAPCNT_ID, &pr_state_cnt);
+
+  /* 4 - FBF_LOAD_PR   */
+  pr_state = (unsigned short) (FwPrGetCurNode(prDescFbfLoad) & 0xffff);
+  CrIaPaste(FBFLOADNODE_ID, &pr_state);
+  pr_state_cnt = FwPrGetNodeExecCnt(prDescFbfLoad);
+  CrIaPaste(FBFLOADCNT_ID, &pr_state_cnt);
+
+  /* 5 - FBF_SAVE_PR   */
+  pr_state = (unsigned short) (FwPrGetCurNode(prDescFbfSave) & 0xffff);
+  CrIaPaste(FBFSAVENODE_ID, &pr_state);
+  pr_state_cnt = FwPrGetNodeExecCnt(prDescFbfSave);
+  CrIaPaste(FBFSAVECNT_ID, &pr_state_cnt);
+
+  /* 6 - SCI_STACK_PR  */
+  pr_state = (unsigned short) (FwPrGetCurNode(prDescSciStack) & 0xffff);
+  CrIaPaste(SCIWINNODE_ID, &pr_state);
+  pr_state_cnt = FwPrGetNodeExecCnt(prDescFbfSave);
+  CrIaPaste(SCIWINCNT_ID, &pr_state_cnt);
+
+  /* 7 - FBF_TO_GND_PR */
+  pr_state = (unsigned short) (FwPrGetCurNode(prDescTransferFbfToGround) & 0xffff);
+  CrIaPaste(TRANSFBFTOGRNDNODE_ID, &pr_state);
+  pr_state_cnt = FwPrGetNodeExecCnt(prDescTransferFbfToGround);
+  CrIaPaste(TRANSFBFTOGRNDCNT_ID, &pr_state_cnt);
+
+  /* 8 - NOM_SCI_PR    */
+  pr_state = (unsigned short) (FwPrGetCurNode(prDescNomSci) & 0xffff);
+  CrIaPaste(NOMSCINODE_ID, &pr_state);
+  pr_state_cnt = FwPrGetNodeExecCnt(prDescNomSci);
+  CrIaPaste(NOMSCICNT_ID, &pr_state_cnt);
+
+  /* 9 - CONFIG_SDB_PR */
+  /* NOTE: update of the state is done in CrIaServ198ProcStartProgressAction() */  
+
+  pr_state = (unsigned short) (FwPrGetCurNode(prDescPrepSci) & 0xffff);
+  CrIaPaste(PREPSCIENCENODE_ID, &pr_state);
+  pr_state_cnt = FwPrGetNodeExecCnt(prDescPrepSci);
+  CrIaPaste(PREPSCIENCECNT_ID, &pr_state_cnt);
+
+  pr_state = (unsigned short) (FwPrGetCurNode(prDescCtrldSwitchOffIasw) & 0xffff);
+  CrIaPaste(CONTROLLEDSWITCHOFFNODE_ID, &pr_state);
+  pr_state_cnt = FwPrGetNodeExecCnt(prDescCtrldSwitchOffIasw);
+  CrIaPaste(CONTROLLEDSWITCHOFFCNT_ID, &pr_state_cnt);
+
+  return;
+}
+#endif
+
+
+
+
+
+
+
+
+
+
+
+
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
diff --git a/CrIa/src/CrIaDataPool.h b/CrIa/src/CrIaDataPool.h
new file mode 100644
index 0000000..0e5cd2c
--- /dev/null
+++ b/CrIa/src/CrIaDataPool.h
@@ -0,0 +1,1316 @@
+/**
+* @file
+* Interface for accessing data pool items.
+*
+* A data pool is created by three structures encapsulating data related
+* to CORDET Framework, IASW and IBSW.
+*
+* These data items can be accessed directly by accessing structure items.
+* Use in application code these declarations:
+*
+* \li \c <code>extern DataPoolCordet dpCordet;</code>
+* \li \c <code>extern DataPoolIasw dpIasw;</code>
+* \li \c <code>extern DataPoolIbsw dpIbsw;</code>
+*
+* The data pool items can be also accessed by provided functions. These function
+* allows reading and modifying the data pool items by an unique identifier.
+*
+* For implementation reasons, the type of all items in the data pool is set
+* such that the size of the data item is a multiple of 4 bytes.
+* Thus, each data item has a "telemetry type" (the type of the data item as
+* it appears in telemetry) and an "implementation type" (the type of the data
+* item as it is implemented in the data pool). The latter has a size which is
+* a multiple of 4 bytes. The Data Pool Component knows about the size of
+* the telemetry types which is stored in private array "dataPoolSize".
+*
+* Data items in the data pool may be either of primitive type or of array type.
+* To each data item a multiplicity is associated.
+* If the multiplicity is equal to 1, then the data item is of primitive type.
+* If the multiplicity is greater than 1, then the data type is of array type
+* and the multiplicity is the size of the array.
+* The multplicity information is stored in private array "dataPoolMult".
+*
+* The definition of the data pool in this header file is derived from the
+* IFSW Configuration File.
+* The IFSW Configuration File defines constants in addition to data items.
+* The constants are implemented as <code>#define</code> constants.
+*
+* @note This code was generated.
+* @authors V. Cechticky and A. Pasetti
+* @copyright P&P Software GmbH, 2015, All Rights Reserved
+*/
+
+#ifndef CRIADATAPOOL_H_
+#define CRIADATAPOOL_H_
+
+#ifndef ISOLATED
+/* Includes */
+#include <CrFwConstants.h>
+#endif
+
+/*
+   NOTE: the __BUILD_ID is a defsym provided to the linker
+
+   Its format is: 0xGGGGMMCC, where
+   GGGG is the git-inspired buildnumber
+   MM is the major version of the SW,
+   CC the compression entity version
+
+   MMCC is what we put in the CE as "Version"
+ */
+#if (__sparc__)
+extern unsigned char __BUILD_ID;
+
+#define BUILD ((unsigned long int)&__BUILD_ID)
+#define VERSION ((unsigned short)(0xffff & (unsigned long int)&__BUILD_ID))
+#else
+#define BUILD BUILD_ID
+#define VERSION ((unsigned short)(0xffff & BUILD_ID))
+#endif
+
+
+#define NMB_LIMIT_CHECK_MAX 50
+
+/** Definition of data pool constants */
+#define DP_ID_MAX 1005
+#define SDB_SIZE 33554416
+#define SID_MAX 50
+#define RDL_SIZE 10
+#define RD_MAX_ITEMS 250
+#define RD_MAX_SIZE 1024
+#define N_DEBUG_VAR 20
+#define VALID_RAM_ADDR 1073741824
+#define N_EVT_ID 60
+#define S13_MIN_BLOCK_SIZE 200
+#define N_CENT_ALGO 2
+#define CENT_EXEC_PER 0
+#define N_ACQ_ALGO 1
+#define ACQ_EXEC_PHASE 0
+#define ACQ_EXEC_PER -1
+#define N_TTC_ALGO 2
+#define SEM_EVT_STORE_SIZE 32000
+#define HBSEM_MON_PER 160
+#define HBSEM_MON_LIM 6
+#define ERR_LOG_N1 64
+#define ERR_LOG_N2 12
+#define ERR_LOG_N3 10
+#define MAX_SIZE_SMALL_PCKT 128
+#define N_PCKT_SMALL 67
+#define N_PCKT_LARGE 220
+#define FBF_NFILES 250
+#define FBF_SIZE 4
+#define DPU_OBC_LINK_CAPACITY 2048
+#define N_RT_CONT 5
+#define RT_CONT1_ID 1
+#define RT_CONT2_ID 2
+#define RT_CONT3_ID 3
+#define RT_CONT4_ID 4
+#define RT_CONT5_ID 5
+#define SRC_PACKET_MIN_SIZE 12
+#define MAXNROFSTARS 60
+#define SPLINE_SEGMENTS 28
+#define BITOFFSET_SIZE 96
+#define MAX_DUMP_SIZE 996	/* PnP TM/TC ICD 001 i3.0 */
+#define ADS_PARAM_OFFSET 212010000U
+#define FID_MAX 13
+#define MAX_ID_ALGO 11
+#define MAX_ID_PROC 9
+
+#define FEE_SCRIPTS 12 /* SEM ICD 2.4 */
+#define RF100KHZ 100
+#define RF230KHZ 230
+
+
+extern struct DataPoolCordet dpCordet;
+extern struct DataPoolIasw dpIasw;
+extern struct DataPoolIbsw dpIbsw;
+
+extern unsigned int useMaxAcquisitionNum; /* Mantis 2168 */
+
+
+/** The structure holding data pool variables and parameter items for CORDET. */
+struct DataPoolCordet {
+    unsigned int AppErrCode;
+    unsigned int NofAllocatedInRep;
+    unsigned int MaxNOfInRep;
+    unsigned int NofAllocatedInCmd;
+    unsigned int MaxNOfInCmd;
+    unsigned int Sem_NOfPendingInCmp;
+    unsigned int Sem_PCRLSize;
+    unsigned int Sem_NOfLoadedInCmp;
+    unsigned int GrdObc_NOfPendingInCmp;
+    unsigned int GrdObc_PCRLSize;
+    unsigned int NOfAllocatedOutCmp;
+    unsigned int MaxNOfOutCmp;
+    unsigned int NOfInstanceId;
+    unsigned int OutMg1_NOfPendingOutCmp;
+    unsigned int OutMg1_POCLSize;
+    unsigned int OutMg1_NOfLoadedOutCmp;
+    unsigned int OutMg2_NOfPendingOutCmp;
+    unsigned int OutMg2_POCLSize;
+    unsigned int OutMg2_NOfLoadedOutCmp;
+    unsigned int OutMg3_NOfPendingOutCmp;
+    unsigned int OutMg3_POCLSize;
+    unsigned int OutMg3_NOfLoadedOutCmp;
+    unsigned int InSem_SeqCnt;
+    unsigned int InSem_NOfPendingPckts;
+    unsigned int InSem_NOfGroups;
+    unsigned int InSem_PcktQueueSize;
+    unsigned int InSem_Src;
+    unsigned int InObc_NOfPendingPckts;
+    unsigned int InObc_NOfGroups;
+    unsigned int InObc_PcktQueueSize;
+    unsigned int InObc_Src;
+    unsigned int InGrd_NOfPendingPckts;
+    unsigned int InGrd_NOfGroups;
+    unsigned int InGrd_PcktQueueSize;
+    unsigned int InGrd_Src;
+    unsigned int OutSem_Dest;
+    unsigned int OutSem_SeqCnt;
+    unsigned int OutSem_NOfPendingPckts;
+    unsigned int OutSem_NOfGroups;
+    unsigned int OutSem_PcktQueueSize;
+    unsigned int OutObc_Dest;
+    unsigned int OutObc_SeqCnt_Group0;
+    unsigned int OutObc_SeqCnt_Group1;
+    unsigned int OutObc_NOfPendingPckts;
+    unsigned int OutObc_NOfGroups;
+    unsigned int OutObc_PcktQueueSize;
+    unsigned int OutGrd_Dest;
+    unsigned int OutGrd_SeqCnt_Group0;
+    unsigned int OutGrd_SeqCnt_Group1;
+    unsigned int OutGrd_SeqCnt_Group2;
+    unsigned int OutGrd_NOfPendingPckts;
+    unsigned int OutGrd_NOfGroups;
+    unsigned int OutGrd_PcktQueueSize;
+} ;
+
+/** The structure holding data pool variables and parameter items for IASW. */
+struct DataPoolIasw {
+    unsigned int buildNumber;
+    unsigned int sibNFull;
+    unsigned int cibNFull;
+    unsigned int gibNFull;
+    unsigned int sibNWin;
+    unsigned int cibNWin;
+    unsigned int gibNWin;
+    unsigned int sibSizeFull;
+    unsigned int cibSizeFull;
+    unsigned int gibSizeFull;
+    unsigned int sibSizeWin;
+    unsigned int cibSizeWin;
+    unsigned int gibSizeWin;
+    unsigned int sibIn;
+    unsigned int sibOut;
+    unsigned int cibIn;
+    unsigned int gibIn;
+    unsigned int gibOut;
+    int sdbState;
+    unsigned int sdbStateCnt;
+    int OffsetX;
+    int OffsetY;
+    int TargetLocationX;
+    int TargetLocationY;
+    unsigned int IntegStartTimeCrs;
+    unsigned int IntegStartTimeFine;
+    unsigned int IntegEndTimeCrs;
+    unsigned int IntegEndTimeFine;
+    unsigned int DataCadence;
+    int ValidityStatus;
+    unsigned int NOfTcAcc;
+    unsigned int NOfAccFailedTc;
+    unsigned int SeqCntLastAccTcFromObc;
+    unsigned int SeqCntLastAccTcFromGrd;
+    unsigned int SeqCntLastAccFailTc;
+    unsigned int NOfStartFailedTc;
+    unsigned int SeqCntLastStartFailTc;
+    unsigned int NOfTcTerm;
+    unsigned int NOfTermFailedTc;
+    unsigned int SeqCntLastTermFailTc;
+    unsigned int RdlSidList[10];
+    int isRdlFree[10];
+    unsigned int RdlCycCntList[10];
+    unsigned int RdlPeriodList[10];
+    int RdlEnabledList[10];
+    unsigned int RdlDestList[10];
+    unsigned int RdlDataItemList_0[250];
+    unsigned int RdlDataItemList_1[250];
+    unsigned int RdlDataItemList_2[250];
+    unsigned int RdlDataItemList_3[250];
+    unsigned int RdlDataItemList_4[250];
+    unsigned int RdlDataItemList_5[250];
+    unsigned int RdlDataItemList_6[250];
+    unsigned int RdlDataItemList_7[250];
+    unsigned int RdlDataItemList_8[250];
+    unsigned int RdlDataItemList_9[250];
+    unsigned int DEBUG_VAR[20];
+    unsigned int DEBUG_VAR_ADDR[20];
+    unsigned int EVTFILTERDEF;
+    unsigned int evtEnabledList[60];
+    unsigned int lastPatchedAddr;
+    unsigned int lastDumpAddr;
+    int sdu2State;
+    int sdu4State;
+    unsigned int sdu2StateCnt;
+    unsigned int sdu4StateCnt;
+    unsigned int sdu2BlockCnt;
+    unsigned int sdu4BlockCnt;
+    unsigned int sdu2RemSize;
+    unsigned int sdu4RemSize;
+    unsigned int sdu2DownTransferSize;
+    unsigned int sdu4DownTransferSize;
+    unsigned int sdsCounter;
+    int FdGlbEnable;
+    int RpGlbEnable;
+    int FdCheckTTMState;
+    int FdCheckTTMIntEn;
+    int FdCheckTTMExtEn;
+    int RpTTMIntEn;
+    int RpTTMExtEn;
+    unsigned int FdCheckTTMCnt;
+    unsigned int FdCheckTTMSpCnt;
+    unsigned int FdCheckTTMCntThr;
+    float TTC_LL;
+    float TTC_UL;
+    float TTM_LIM;
+    int FdCheckSDSCState;
+    int FdCheckSDSCIntEn;
+    int FdCheckSDSCExtEn;
+    int RpSDSCIntEn;
+    int RpSDSCExtEn;
+    unsigned int FdCheckSDSCCnt;
+    unsigned int FdCheckSDSCSpCnt;
+    unsigned int FdCheckSDSCCntThr;
+    int FdCheckComErrState;
+    int FdCheckComErrIntEn;
+    int FdCheckComErrExtEn;
+    int RpComErrIntEn;
+    int RpComErrExtEn;
+    unsigned int FdCheckComErrCnt;
+    unsigned int FdCheckComErrSpCnt;
+    unsigned int FdCheckComErrCntThr;
+    int FdCheckTimeOutState;
+    int FdCheckTimeOutIntEn;
+    int FdCheckTimeOutExtEn;
+    int RpTimeOutIntEn;
+    int RpTimeOutExtEn;
+    unsigned int FdCheckTimeOutCnt;
+    unsigned int FdCheckTimeOutSpCnt;
+    unsigned int FdCheckTimeOutCntThr;
+    unsigned int SEM_TO_POWERON;
+    unsigned int SEM_TO_SAFE;
+    unsigned int SEM_TO_STAB;
+    unsigned int SEM_TO_TEMP;
+    unsigned int SEM_TO_CCD;
+    unsigned int SEM_TO_DIAG;
+    unsigned int SEM_TO_STANDBY;
+    int FdCheckSafeModeState;
+    int FdCheckSafeModeIntEn;
+    int FdCheckSafeModeExtEn;
+    int RpSafeModeIntEn;
+    int RpSafeModeExtEn;
+    unsigned int FdCheckSafeModeCnt;
+    unsigned int FdCheckSafeModeSpCnt;
+    unsigned int FdCheckSafeModeCntThr;
+    int FdCheckAliveState;
+    int FdCheckAliveIntEn;
+    int FdCheckAliveExtEn;
+    int RpAliveIntEn;
+    int RpAliveExtEn;
+    unsigned int FdCheckAliveCnt;
+    unsigned int FdCheckAliveSpCnt;
+    unsigned int FdCheckAliveCntThr;
+    unsigned int SEM_HK_DEF_PER;
+    unsigned int SEMALIVE_DELAYEDSEMHK;
+    int FdCheckSemAnoEvtState;
+    int FdCheckSemAnoEvtIntEn;
+    int FdCheckSemAnoEvtExtEn;
+    int RpSemAnoEvtIntEn;
+    int RpSemAnoEvtExtEn;
+    unsigned int FdCheckSemAnoEvtCnt;
+    unsigned int FdCheckSemAnoEvtSpCnt;
+    unsigned int FdCheckSemAnoEvtCntThr;
+    int semAnoEvtResp_1;
+    int semAnoEvtResp_2;
+    int semAnoEvtResp_3;
+    int semAnoEvtResp_4;
+    int semAnoEvtResp_5;
+    int semAnoEvtResp_6;
+    int semAnoEvtResp_7;
+    int semAnoEvtResp_8;
+    int semAnoEvtResp_9;
+    int semAnoEvtResp_10;
+    int semAnoEvtResp_11;
+    int semAnoEvtResp_12;
+    int semAnoEvtResp_13;
+    int semAnoEvtResp_14;
+    int semAnoEvtResp_15;
+    int semAnoEvtResp_16;
+    int semAnoEvtResp_17;
+    int semAnoEvtResp_18;
+    int semAnoEvtResp_19;
+    int semAnoEvtResp_20;
+    int semAnoEvtResp_21;
+    int semAnoEvtResp_22;
+    int semAnoEvtResp_23;
+    int semAnoEvtResp_24;
+    int semAnoEvtResp_25;
+    int semAnoEvtResp_26;
+    int semAnoEvtResp_27;
+    int semAnoEvtResp_28;
+    int semAnoEvtResp_29;
+    int FdCheckSemLimitState;
+    int FdCheckSemLimitIntEn;
+    int FdCheckSemLimitExtEn;
+    int RpSemLimitIntEn;
+    int RpSemLimitExtEn;
+    unsigned int FdCheckSemLimitCnt;
+    unsigned int FdCheckSemLimitSpCnt;
+    unsigned int FdCheckSemLimitCntThr;
+    unsigned int SEM_LIM_DEL_T;
+    int FdCheckDpuHkState;
+    int FdCheckDpuHkIntEn;
+    int FdCheckDpuHkExtEn;
+    int RpDpuHkIntEn;
+    int RpDpuHkExtEn;
+    unsigned int FdCheckDpuHkCnt;
+    unsigned int FdCheckDpuHkSpCnt;
+    unsigned int FdCheckDpuHkCntThr;
+    int FdCheckCentConsState;
+    int FdCheckCentConsIntEn;
+    int FdCheckCentConsExtEn;
+    int RpCentConsIntEn;
+    int RpCentConsExtEn;
+    unsigned int FdCheckCentConsCnt;
+    unsigned int FdCheckCentConsSpCnt;
+    unsigned int FdCheckCentConsCntThr;
+    int FdCheckResState;
+    int FdCheckResIntEn;
+    int FdCheckResExtEn;
+    int RpResIntEn;
+    int RpResExtEn;
+    unsigned int FdCheckResCnt;
+    unsigned int FdCheckResSpCnt;
+    unsigned int FdCheckResCntThr;
+    float CPU1_USAGE_MAX;
+    float MEM_USAGE_MAX;
+    int FdCheckSemCons;
+    int FdCheckSemConsIntEn;
+    int FdCheckSemConsExtEn;
+    int RpSemConsIntEn;
+    int RpSemConsExtEn;
+    unsigned int FdCheckSemConsCnt;
+    unsigned int FdCheckSemConsSpCnt;
+    unsigned int FdCheckSemConsCntThr;
+    int semState;
+    int semOperState;
+    unsigned int semStateCnt;
+    unsigned int semOperStateCnt;
+    unsigned int imageCycleCnt;
+    unsigned int acqImageCnt;
+    int sciSubMode;
+    int LastSemPckt;
+    unsigned int SEM_ON_CODE;
+    unsigned int SEM_OFF_CODE;
+    unsigned int SEM_INIT_T1;
+    unsigned int SEM_INIT_T2;
+    unsigned int SEM_OPER_T1;
+    unsigned int SEM_SHUTDOWN_T1;
+    unsigned int SEM_SHUTDOWN_T11;
+    unsigned int SEM_SHUTDOWN_T12;
+    unsigned int SEM_SHUTDOWN_T2;
+    int iaswState;
+    unsigned int iaswStateCnt;
+    unsigned int iaswCycleCnt;
+    int prepScienceNode;
+    unsigned int prepScienceCnt;
+    int controlledSwitchOffNode;
+    unsigned int controlledSwitchOffCnt;
+    unsigned int CTRLD_SWITCH_OFF_T1;
+    int algoCent0State;
+    unsigned int algoCent0Cnt;
+    int algoCent0Enabled;
+    int algoCent1State;
+    unsigned int algoCent1Cnt;
+    int algoCent1Enabled;
+    unsigned int CENT_EXEC_PHASE;
+    int algoAcq1State;
+    unsigned int algoAcq1Cnt;
+    int algoAcq1Enabled;
+    unsigned int ACQ_PH;
+    int algoCcState;
+    unsigned int algoCcCnt;
+    int algoCcEnabled;
+    unsigned int STCK_ORDER;
+    int algoTTC1State;
+    unsigned int algoTTC1Cnt;
+    int algoTTC1Enabled;
+    unsigned int TTC1_EXEC_PHASE;
+    int TTC1_EXEC_PER;
+    float TTC1_LL_FRT;
+    float TTC1_LL_AFT;
+    float TTC1_UL_FRT;
+    float TTC1_UL_AFT;
+    float ttc1AvTempAft;
+    float ttc1AvTempFrt;
+    int algoTTC2State;
+    unsigned int algoTTC2Cnt;
+    int algoTTC2Enabled;
+    int TTC2_EXEC_PER;
+    float TTC2_REF_TEMP;
+    float TTC2_OFFSETA;
+    float TTC2_OFFSETF;
+    float intTimeAft;
+    float onTimeAft;
+    float intTimeFront;
+    float onTimeFront;
+    float TTC2_PA;
+    float TTC2_DA;
+    float TTC2_IA;
+    float TTC2_PF;
+    float TTC2_DF;
+    float TTC2_IF;
+    int algoSaaEvalState;
+    unsigned int algoSaaEvalCnt;
+    int algoSaaEvalEnabled;
+    unsigned int SAA_EXEC_PHASE;
+    int SAA_EXEC_PER;
+    int isSaaActive;
+    unsigned int saaCounter;
+    unsigned int pInitSaaCounter;
+    int algoSdsEvalState;
+    unsigned int algoSdsEvalCnt;
+    int algoSdsEvalEnabled;
+    unsigned int SDS_EXEC_PHASE;
+    int SDS_EXEC_PER;
+    int isSdsActive;
+    int SDS_FORCED;
+    int SDS_INHIBITED;
+    int EARTH_OCCULT_ACTIVE;
+    unsigned int HEARTBEAT_D1;
+    unsigned int HEARTBEAT_D2;
+    int HbSem;
+    unsigned int starMap[276];
+    unsigned int observationId;
+    int centValProcOutput;
+    float CENT_OFFSET_LIM;
+    float CENT_FROZEN_LIM;
+    int SEM_SERV1_1_FORWARD;
+    int SEM_SERV1_2_FORWARD;
+    int SEM_SERV1_7_FORWARD;
+    int SEM_SERV1_8_FORWARD;
+    int SEM_SERV3_1_FORWARD;
+    int SEM_SERV3_2_FORWARD;
+    unsigned int SEM_HK_TS_DEF_CRS;
+    unsigned int SEM_HK_TS_DEF_FINE;
+    unsigned int SEM_HK_TS_EXT_CRS;
+    unsigned int SEM_HK_TS_EXT_FINE;
+    int STAT_MODE;
+    unsigned int STAT_FLAGS;
+    int STAT_LAST_SPW_ERR;
+    unsigned int STAT_LAST_ERR_ID;
+    unsigned int STAT_LAST_ERR_FREQ;
+    unsigned int STAT_NUM_CMD_RECEIVED;
+    unsigned int STAT_NUM_CMD_EXECUTED;
+    unsigned int STAT_NUM_DATA_SENT;
+    unsigned int STAT_SCU_PROC_DUTY_CL;
+    unsigned int STAT_SCU_NUM_AHB_ERR;
+    unsigned int STAT_SCU_NUM_AHB_CERR;
+    unsigned int STAT_SCU_NUM_LUP_ERR;
+    float TEMP_SEM_SCU;
+    float TEMP_SEM_PCU;
+    float VOLT_SCU_P3_4;
+    float VOLT_SCU_P5;
+    float TEMP_FEE_CCD;
+    float TEMP_FEE_STRAP;
+    float TEMP_FEE_ADC;
+    float TEMP_FEE_BIAS;
+    float TEMP_FEE_DEB;
+    float VOLT_FEE_VOD;
+    float VOLT_FEE_VRD;
+    float VOLT_FEE_VOG;
+    float VOLT_FEE_VSS;
+    float VOLT_FEE_CCD;
+    float VOLT_FEE_CLK;
+    float VOLT_FEE_ANA_P5;
+    float VOLT_FEE_ANA_N5;
+    float VOLT_FEE_ANA_P3_3;
+    float CURR_FEE_CLK_BUF;
+    float VOLT_SCU_FPGA_P1_5;
+    float CURR_SCU_P3_4;
+    unsigned int STAT_NUM_SPW_ERR_CRE;
+    unsigned int STAT_NUM_SPW_ERR_ESC;
+    unsigned int STAT_NUM_SPW_ERR_DISC;
+    unsigned int STAT_NUM_SPW_ERR_PAR;
+    unsigned int STAT_NUM_SPW_ERR_WRSY;
+    unsigned int STAT_NUM_SPW_ERR_INVA;
+    unsigned int STAT_NUM_SPW_ERR_EOP;
+    unsigned int STAT_NUM_SPW_ERR_RXAH;
+    unsigned int STAT_NUM_SPW_ERR_TXAH;
+    unsigned int STAT_NUM_SPW_ERR_TXBL;
+    unsigned int STAT_NUM_SPW_ERR_TXLE;
+    unsigned int STAT_NUM_SP_ERR_RX;
+    unsigned int STAT_NUM_SP_ERR_TX;
+    unsigned int STAT_HEAT_PWM_FPA_CCD;
+    unsigned int STAT_HEAT_PWM_FEE_STR;
+    unsigned int STAT_HEAT_PWM_FEE_ANA;
+    unsigned int STAT_HEAT_PWM_SPARE;
+    unsigned int STAT_HEAT_PWM_FLAGS;
+    unsigned int STAT_OBTIME_SYNC_DELTA;
+    float TEMP_SEM_SCU_LW;
+    float TEMP_SEM_PCU_LW;
+    float VOLT_SCU_P3_4_LW;
+    float VOLT_SCU_P5_LW;
+    float TEMP_FEE_CCD_LW;
+    float TEMP_FEE_STRAP_LW;
+    float TEMP_FEE_ADC_LW;
+    float TEMP_FEE_BIAS_LW;
+    float TEMP_FEE_DEB_LW;
+    float VOLT_FEE_VOD_LW;
+    float VOLT_FEE_VRD_LW;
+    float VOLT_FEE_VOG_LW;
+    float VOLT_FEE_VSS_LW;
+    float VOLT_FEE_CCD_LW;
+    float VOLT_FEE_CLK_LW;
+    float VOLT_FEE_ANA_P5_LW;
+    float VOLT_FEE_ANA_N5_LW;
+    float VOLT_FEE_ANA_P3_3_LW;
+    float CURR_FEE_CLK_BUF_LW;
+    float VOLT_SCU_FPGA_P1_5_LW;
+    float CURR_SCU_P3_4_LW;
+    float TEMP_SEM_SCU_UW;
+    float TEMP_SEM_PCU_UW;
+    float VOLT_SCU_P3_4_UW;
+    float VOLT_SCU_P5_UW;
+    float TEMP_FEE_CCD_UW;
+    float TEMP_FEE_STRAP_UW;
+    float TEMP_FEE_ADC_UW;
+    float TEMP_FEE_BIAS_UW;
+    float TEMP_FEE_DEB_UW;
+    float VOLT_FEE_VOD_UW;
+    float VOLT_FEE_VRD_UW;
+    float VOLT_FEE_VOG_UW;
+    float VOLT_FEE_VSS_UW;
+    float VOLT_FEE_CCD_UW;
+    float VOLT_FEE_CLK_UW;
+    float VOLT_FEE_ANA_P5_UW;
+    float VOLT_FEE_ANA_N5_UW;
+    float VOLT_FEE_ANA_P3_3_UW;
+    float CURR_FEE_CLK_BUF_UW;
+    float VOLT_SCU_FPGA_P1_5_UW;
+    float CURR_SCU_P3_4_UW;
+    float TEMP_SEM_SCU_LA;
+    float TEMP_SEM_PCU_LA;
+    float VOLT_SCU_P3_4_LA;
+    float VOLT_SCU_P5_LA;
+    float TEMP_FEE_CCD_LA;
+    float TEMP_FEE_STRAP_LA;
+    float TEMP_FEE_ADC_LA;
+    float TEMP_FEE_BIAS_LA;
+    float TEMP_FEE_DEB_LA;
+    float VOLT_FEE_VOD_LA;
+    float VOLT_FEE_VRD_LA;
+    float VOLT_FEE_VOG_LA;
+    float VOLT_FEE_VSS_LA;
+    float VOLT_FEE_CCD_LA;
+    float VOLT_FEE_CLK_LA;
+    float VOLT_FEE_ANA_P5_LA;
+    float VOLT_FEE_ANA_N5_LA;
+    float VOLT_FEE_ANA_P3_3_LA;
+    float CURR_FEE_CLK_BUF_LA;
+    float VOLT_SCU_FPGA_P1_5_LA;
+    float CURR_SCU_P3_4_LA;
+    float TEMP_SEM_SCU_UA;
+    float TEMP_SEM_PCU_UA;
+    float VOLT_SCU_P3_4_UA;
+    float VOLT_SCU_P5_UA;
+    float TEMP_FEE_CCD_UA;
+    float TEMP_FEE_STRAP_UA;
+    float TEMP_FEE_ADC_UA;
+    float TEMP_FEE_BIAS_UA;
+    float TEMP_FEE_DEB_UA;
+    float VOLT_FEE_VOD_UA;
+    float VOLT_FEE_VRD_UA;
+    float VOLT_FEE_VOG_UA;
+    float VOLT_FEE_VSS_UA;
+    float VOLT_FEE_CCD_UA;
+    float VOLT_FEE_CLK_UA;
+    float VOLT_FEE_ANA_P5_UA;
+    float VOLT_FEE_ANA_N5_UA;
+    float VOLT_FEE_ANA_P3_3_UA;
+    float CURR_FEE_CLK_BUF_UA;
+    float VOLT_SCU_FPGA_P1_5_UA;
+    float CURR_SCU_P3_4_UA;
+    unsigned int semEvtCounter;
+    int SEM_SERV5_1_FORWARD;
+    int SEM_SERV5_2_FORWARD;
+    int SEM_SERV5_3_FORWARD;
+    int SEM_SERV5_4_FORWARD;
+    unsigned int pExpTime;
+    unsigned int pImageRep;
+    unsigned int pAcqNum;
+    int pDataOs;
+    int pCcdRdMode;
+    unsigned int pWinPosX;
+    unsigned int pWinPosY;
+    unsigned int pWinSizeX;
+    unsigned int pWinSizeY;
+    int pDtAcqSrc;
+    int pTempCtrlTarget;
+    float pVoltFeeVod;
+    float pVoltFeeVrd;
+    float pVoltFeeVss;
+    float pHeatTempFpaCCd;
+    float pHeatTempFeeStrap;
+    float pHeatTempFeeAnach;
+    float pHeatTempSpare;
+    int pStepEnDiagCcd;
+    int pStepEnDiagFee;
+    int pStepEnDiagTemp;
+    int pStepEnDiagAna;
+    int pStepEnDiagExpos;
+    int pStepDebDiagCcd;
+    int pStepDebDiagFee;
+    int pStepDebDiagTemp;
+    int pStepDebDiagAna;
+    int pStepDebDiagExpos;
+    int SEM_SERV220_6_FORWARD;
+    int SEM_SERV220_12_FORWARD;
+    int SEM_SERV222_6_FORWARD;
+    int saveImagesNode;
+    unsigned int saveImagesCnt;
+    int SaveImages_pSaveTarget;
+    unsigned int SaveImages_pFbfInit;
+    unsigned int SaveImages_pFbfEnd;
+    int acqFullDropNode;
+    unsigned int acqFullDropCnt;
+    unsigned int AcqFullDrop_pExpTime;
+    unsigned int AcqFullDrop_pImageRep;
+    unsigned int acqFullDropT1;
+    unsigned int acqFullDropT2;
+    int calFullSnapNode;
+    unsigned int calFullSnapCnt;
+    unsigned int CalFullSnap_pExpTime;
+    unsigned int CalFullSnap_pImageRep;
+    unsigned int CalFullSnap_pNmbImages;
+    int CalFullSnap_pCentSel;
+    unsigned int calFullSnapT1;
+    unsigned int calFullSnapT2;
+    int SciWinNode;
+    unsigned int SciWinCnt;
+    unsigned int SciWin_pNmbImages;
+    int SciWin_pCcdRdMode;
+    unsigned int SciWin_pExpTime;
+    unsigned int SciWin_pImageRep;
+    unsigned int SciWin_pWinPosX;
+    unsigned int SciWin_pWinPosY;
+    unsigned int SciWin_pWinSizeX;
+    unsigned int SciWin_pWinSizeY;
+    int SciWin_pCentSel;
+    unsigned int sciWinT1;
+    unsigned int sciWinT2;
+    int fbfLoadNode;
+    unsigned int fbfLoadCnt;
+    int fbfSaveNode;
+    unsigned int fbfSaveCnt;
+    unsigned int FbfLoad_pFbfId;
+    unsigned int FbfLoad_pFbfNBlocks;
+    unsigned int FbfLoad_pFbfRamAreaId;
+    unsigned int FbfLoad_pFbfRamAddr;
+    unsigned int FbfSave_pFbfId;
+    unsigned int FbfSave_pFbfNBlocks;
+    unsigned int FbfSave_pFbfRamAreaId;
+    unsigned int FbfSave_pFbfRamAddr;
+    unsigned int fbfLoadBlockCounter;
+    unsigned int fbfSaveBlockCounter;
+    int transFbfToGrndNode;
+    unsigned int transFbfToGrndCnt;
+    unsigned int TransFbfToGrnd_pNmbFbf;
+    unsigned int TransFbfToGrnd_pFbfInit;
+    unsigned int TransFbfToGrnd_pFbfSize;
+    int nomSciNode;
+    unsigned int nomSciCnt;
+    int NomSci_pAcqFlag;
+    int NomSci_pCal1Flag;
+    int NomSci_pSciFlag;
+    int NomSci_pCal2Flag;
+    unsigned int NomSci_pCibNFull;
+    unsigned int NomSci_pCibSizeFull;
+    unsigned int NomSci_pSibNFull;
+    unsigned int NomSci_pSibSizeFull;
+    unsigned int NomSci_pGibNFull;
+    unsigned int NomSci_pGibSizeFull;
+    unsigned int NomSci_pSibNWin;
+    unsigned int NomSci_pSibSizeWin;
+    unsigned int NomSci_pCibNWin;
+    unsigned int NomSci_pCibSizeWin;
+    unsigned int NomSci_pGibNWin;
+    unsigned int NomSci_pGibSizeWin;
+    unsigned int NomSci_pExpTimeAcq;
+    unsigned int NomSci_pImageRepAcq;
+    unsigned int NomSci_pExpTimeCal1;
+    unsigned int NomSci_pImageRepCal1;
+    unsigned int NomSci_pNmbImagesCal1;
+    int NomSci_pCentSelCal1;
+    unsigned int NomSci_pNmbImagesSci;
+    int NomSci_pCcdRdModeSci;
+    unsigned int NomSci_pExpTimeSci;
+    unsigned int NomSci_pImageRepSci;
+    unsigned int NomSci_pWinPosXSci;
+    unsigned int NomSci_pWinPosYSci;
+    unsigned int NomSci_pWinSizeXSci;
+    unsigned int NomSci_pWinSizeYSci;
+    int NomSci_pCentSelSci;
+    unsigned int NomSci_pExpTimeCal2;
+    unsigned int NomSci_pImageRepCal2;
+    unsigned int NomSci_pNmbImagesCal2;
+    int NomSci_pCentSelCal2;
+    int NomSci_pSaveTarget;
+    unsigned int NomSci_pFbfInit;
+    unsigned int NomSci_pFbfEnd;
+    unsigned int NomSci_pStckOrderCal1;
+    unsigned int NomSci_pStckOrderSci;
+    unsigned int NomSci_pStckOrderCal2;
+    int ConfigSdb_pSdbCmd;
+    unsigned int ConfigSdb_pCibNFull;
+    unsigned int ConfigSdb_pCibSizeFull;
+    unsigned int ConfigSdb_pSibNFull;
+    unsigned int ConfigSdb_pSibSizeFull;
+    unsigned int ConfigSdb_pGibNFull;
+    unsigned int ConfigSdb_pGibSizeFull;
+    unsigned int ConfigSdb_pSibNWin;
+    unsigned int ConfigSdb_pSibSizeWin;
+    unsigned int ConfigSdb_pCibNWin;
+    unsigned int ConfigSdb_pCibSizeWin;
+    unsigned int ConfigSdb_pGibNWin;
+    unsigned int ConfigSdb_pGibSizeWin;
+    float ADC_P3V3;
+    float ADC_P5V;
+    float ADC_P1V8;
+    float ADC_P2V5;
+    float ADC_N5V;
+    float ADC_PGND;
+    float ADC_TEMPOH1A;
+    float ADC_TEMP1;
+    float ADC_TEMPOH2A;
+    float ADC_TEMPOH1B;
+    float ADC_TEMPOH3A;
+    float ADC_TEMPOH2B;
+    float ADC_TEMPOH4A;
+    float ADC_TEMPOH3B;
+    float ADC_TEMPOH4B;
+    float SEM_P15V;
+    float SEM_P30V;
+    float SEM_P5V0;
+    float SEM_P7V0;
+    float SEM_N5V0;
+    int ADC_P3V3_RAW;
+    int ADC_P5V_RAW;
+    int ADC_P1V8_RAW;
+    int ADC_P2V5_RAW;
+    int ADC_N5V_RAW;
+    int ADC_PGND_RAW;
+    int ADC_TEMPOH1A_RAW;
+    int ADC_TEMP1_RAW;
+    int ADC_TEMPOH2A_RAW;
+    int ADC_TEMPOH1B_RAW;
+    int ADC_TEMPOH3A_RAW;
+    int ADC_TEMPOH2B_RAW;
+    int ADC_TEMPOH4A_RAW;
+    int ADC_TEMPOH3B_RAW;
+    int ADC_TEMPOH4B_RAW;
+    int SEM_P15V_RAW;
+    int SEM_P30V_RAW;
+    int SEM_P5V0_RAW;
+    int SEM_P7V0_RAW;
+    int SEM_N5V0_RAW;
+    float ADC_P3V3_U;
+    float ADC_P5V_U;
+    float ADC_P1V8_U;
+    float ADC_P2V5_U;
+    float ADC_N5V_L;
+    float ADC_PGND_U;
+    float ADC_PGND_L;
+    float ADC_TEMPOH1A_U;
+    float ADC_TEMP1_U;
+    float ADC_TEMPOH2A_U;
+    float ADC_TEMPOH1B_U;
+    float ADC_TEMPOH3A_U;
+    float ADC_TEMPOH2B_U;
+    float ADC_TEMPOH4A_U;
+    float ADC_TEMPOH3B_U;
+    float ADC_TEMPOH4B_U;
+    float SEM_P15V_U;
+    float SEM_P30V_U;
+    float SEM_P5V0_U;
+    float SEM_P7V0_U;
+    float SEM_N5V0_L;
+    unsigned int HbSemPassword;
+    unsigned int HbSemCounter;
+    unsigned int MAX_SEM_PCKT_CYC;
+    unsigned int SemPwrOnTimestamp;
+    unsigned int SemPwrOffTimestamp;
+    unsigned int IASW_EVT_CTR;
+    unsigned int Sram1ScrCurrAddr;
+    unsigned int Sram2ScrCurrAddr;
+    unsigned int Sram1ScrLength;
+    unsigned int Sram2ScrLength;
+    unsigned int EdacSingleRepaired;
+    unsigned int EdacSingleFaults;
+    unsigned int EdacLastSingleFail;
+    int Cpu2ProcStatus;
+    int TaAlgoId;
+    unsigned int TAACQALGOID;
+    unsigned int TASPARE32;
+    unsigned int TaTimingPar1;
+    unsigned int TaTimingPar2;
+    unsigned int TaDistanceThrd;
+    unsigned int TaIterations;
+    unsigned int TaRebinningFact;
+    unsigned int TaDetectionThrd;
+    unsigned int TaSeReducedExtr;
+    unsigned int TaSeReducedRadius;
+    unsigned int TaSeTolerance;
+    unsigned int TaMvaTolerance;
+    unsigned int TaAmaTolerance;
+    unsigned int TAPOINTUNCERT;
+    unsigned int TATARGETSIG;
+    unsigned int TANROFSTARS;
+    float TaMaxSigFract;
+    float TaBias;
+    float TaDark;
+    float TaSkyBg;
+    unsigned int COGBITS;
+    float CENT_MULT_X;
+    float CENT_MULT_Y;
+    float CENT_OFFSET_X;
+    float CENT_OFFSET_Y;
+    unsigned int CENT_MEDIANFILTER;
+    unsigned int CENT_DIM_X;
+    unsigned int CENT_DIM_Y;
+    int CENT_CHECKS;
+    unsigned int CEN_SIGMALIMIT;
+    unsigned int CEN_SIGNALLIMIT;
+    unsigned int CEN_MEDIAN_THRD;
+    float OPT_AXIS_X;
+    float OPT_AXIS_Y;
+    int DIST_CORR;
+    unsigned int pStckOrderSci;
+    unsigned int pWinSizeXSci;
+    unsigned int pWinSizeYSci;
+    int SdpImageAptShape;
+    unsigned int SdpImageAptX;
+    unsigned int SdpImageAptY;
+    int SdpImgttAptShape;
+    unsigned int SdpImgttAptX;
+    unsigned int SdpImgttAptY;
+    unsigned int SdpImgttStckOrder;
+    unsigned int SdpLosStckOrder;
+    unsigned int SdpLblkStckOrder;
+    unsigned int SdpLdkStckOrder;
+    unsigned int SdpRdkStckOrder;
+    unsigned int SdpRblkStckOrder;
+    unsigned int SdpTosStckOrder;
+    unsigned int SdpTdkStckOrder;
+    int SdpImgttStrat;
+    float Sdp3StatAmpl;
+    int SdpPhotStrat;
+    unsigned int SdpPhotRcent;
+    unsigned int SdpPhotRann1;
+    unsigned int SdpPhotRann2;
+    unsigned int SdpCrc;
+    unsigned int CCPRODUCT;
+    unsigned int CCSTEP;
+    unsigned int XIB_FAILURES;
+    unsigned int FEE_SIDE_A[FEE_SCRIPTS];
+    unsigned int FEE_SIDE_B[FEE_SCRIPTS];
+    unsigned int NLCBORDERS[28];
+    float NLCCOEFF_A[28];
+    float NLCCOEFF_B[28];
+    float NLCCOEFF_C[28];
+    float NLCCOEFF_D[28];
+    unsigned int SdpGlobalBias;
+    int BiasOrigin;
+    float SdpGlobalGain;
+    unsigned int SdpWinImageCeKey;
+    unsigned int SdpWinImgttCeKey;
+    unsigned int SdpWinHdrCeKey;
+    unsigned int SdpWinMLOSCeKey;
+    unsigned int SdpWinMLBLKCeKey;
+    unsigned int SdpWinMLDKCeKey;
+    unsigned int SdpWinMRDKCeKey;
+    unsigned int SdpWinMRBLKCeKey;
+    unsigned int SdpWinMTOSCeKey;
+    unsigned int SdpWinMTDKCeKey;
+    unsigned int SdpFullImgCeKey;
+    unsigned int SdpFullHdrCeKey;
+    unsigned int CE_Timetag_crs;
+    unsigned int CE_Timetag_fine;
+    unsigned int CE_Counter;
+    unsigned int CE_Version;
+    unsigned int CE_Integrity;
+    unsigned int CE_SemWindowPosX;
+    unsigned int CE_SemWindowPosY;
+    unsigned int CE_SemWindowSizeX;
+    unsigned int CE_SemWindowSizeY;
+    unsigned int SPILL_CTR;
+    unsigned int RZIP_ITER1;
+    unsigned int RZIP_ITER2;
+    unsigned int RZIP_ITER3;
+    unsigned int RZIP_ITER4;
+    unsigned int SdpLdkColMask;
+    unsigned int SdpRdkColMask;
+    unsigned int GIBTOTRANSFER;
+    unsigned int TRANSFERMODE;
+    unsigned int S2TOTRANSFERSIZE;
+    unsigned int S4TOTRANSFERSIZE;
+    unsigned int TransferComplete;
+    unsigned int NLCBORDERS_2[28];
+    float NLCCOEFF_A_2[28];
+    float NLCCOEFF_B_2[28];
+    float NLCCOEFF_C_2[28];
+    unsigned int RF100[12];
+    unsigned int RF230[12];
+    float distc1;
+    float distc2;
+    float distc3;
+    unsigned int SPARE_UI_0;
+    unsigned int SPARE_UI_1;
+    unsigned int SPARE_UI_2;
+    unsigned int SPARE_UI_3;
+    unsigned int SPARE_UI_4;
+    unsigned int SPARE_UI_5;
+    unsigned int SPARE_UI_6;
+    unsigned int SPARE_UI_7;
+    unsigned int SPARE_UI_8;
+    unsigned int SPARE_UI_9;
+    unsigned int SPARE_UI_10;
+    unsigned int SPARE_UI_11;
+    unsigned int SPARE_UI_12;
+    unsigned int SPARE_UI_13;
+    unsigned int SPARE_UI_14;
+    unsigned int SPARE_UI_15;
+    float SPARE_F_0;
+    float SPARE_F_1;
+    float SPARE_F_2;
+    float SPARE_F_3;
+    float SPARE_F_4;
+    float SPARE_F_5;
+    float SPARE_F_6;
+    float SPARE_F_7;
+    float SPARE_F_8;
+    float SPARE_F_9;
+    float SPARE_F_10;
+    float SPARE_F_11;
+    float SPARE_F_12;
+    float SPARE_F_13;
+    float SPARE_F_14;
+    float SPARE_F_15;
+} ;
+
+/** The structure holding data pool variables and parameter items for IBSW. */
+struct DataPoolIbsw {
+    int isWatchdogEnabled;
+    int isSynchronized;
+    int missedMsgCnt;
+    int missedPulseCnt;
+    unsigned int milFrameDelay;
+    int EL1_CHIP;
+    int EL2_CHIP;
+    unsigned int EL1_ADDR;
+    unsigned int EL2_ADDR;
+    int ERR_LOG_ENB;
+    int isErrLogValid;
+    unsigned int nOfErrLogEntries;
+    unsigned int FBF_BLCK_WR_DUR;
+    unsigned int FBF_BLCK_RD_DUR;
+    int isFbfOpen[250];
+    int isFbfValid[250];
+    int FBF_ENB[250];
+    int FBF_CHIP[250];
+    unsigned int FBF_ADDR[250];
+    unsigned int fbfNBlocks[250];
+    float THR_MA_A_1;
+    float THR_MA_A_2;
+    float THR_MA_A_3;
+    float THR_MA_A_4;
+    float THR_MA_A_5;
+    float wcet_1;
+    float wcet_2;
+    float wcet_3;
+    float wcet_4;
+    float wcet_5;
+    float wcetAver_1;
+    float wcetAver_2;
+    float wcetAver_3;
+    float wcetAver_4;
+    float wcetAver_5;
+    float wcetMax_1;
+    float wcetMax_2;
+    float wcetMax_3;
+    float wcetMax_4;
+    float wcetMax_5;
+    unsigned int nOfNotif_1;
+    unsigned int nOfNotif_2;
+    unsigned int nOfNotif_3;
+    unsigned int nOfNotif_4;
+    unsigned int nOfNotif_5;
+    unsigned int nofFuncExec_1;
+    unsigned int nofFuncExec_2;
+    unsigned int nofFuncExec_3;
+    unsigned int nofFuncExec_4;
+    unsigned int nofFuncExec_5;
+    unsigned int wcetTimeStampFine_1;
+    unsigned int wcetTimeStampFine_2;
+    unsigned int wcetTimeStampFine_3;
+    unsigned int wcetTimeStampFine_4;
+    unsigned int wcetTimeStampFine_5;
+    unsigned int wcetTimeStampCoarse_1;
+    unsigned int wcetTimeStampCoarse_2;
+    unsigned int wcetTimeStampCoarse_3;
+    unsigned int wcetTimeStampCoarse_4;
+    unsigned int wcetTimeStampCoarse_5;
+    unsigned int flashContStepCnt;
+    float OTA_TM1A_NOM;
+    float OTA_TM1A_RED;
+    float OTA_TM1B_NOM;
+    float OTA_TM1B_RED;
+    float OTA_TM2A_NOM;
+    float OTA_TM2A_RED;
+    float OTA_TM2B_NOM;
+    float OTA_TM2B_RED;
+    float OTA_TM3A_NOM;
+    float OTA_TM3A_RED;
+    float OTA_TM3B_NOM;
+    float OTA_TM3B_RED;
+    float OTA_TM4A_NOM;
+    float OTA_TM4A_RED;
+    float OTA_TM4B_NOM;
+    float OTA_TM4B_RED;
+    unsigned int Core0Load;
+    unsigned int Core1Load;
+    unsigned int InterruptRate;
+    unsigned int CyclicalActivitiesCtr;
+    unsigned int Uptime;
+    unsigned int SemTick;
+    unsigned int BAD_COPY_ID;
+    unsigned int BAD_PASTE_ID;
+    unsigned int ObcInputBufferPackets;
+    unsigned int GrndInputBufferPackets;
+    unsigned int MilBusBytesIn;
+    unsigned int MilBusBytesOut;
+    unsigned int MilBusDroppedBytes;
+    unsigned int IRL1;
+    unsigned int IRL1_AHBSTAT;
+    unsigned int IRL1_GRGPIO_6;
+    unsigned int IRL1_GRTIMER;
+    unsigned int IRL1_GPTIMER_0;
+    unsigned int IRL1_GPTIMER_1;
+    unsigned int IRL1_GPTIMER_2;
+    unsigned int IRL1_GPTIMER_3;
+    unsigned int IRL1_IRQMP;
+    unsigned int IRL1_B1553BRM;
+    unsigned int IRL2;
+    unsigned int IRL2_GRSPW2_0;
+    unsigned int IRL2_GRSPW2_1;
+    int SemRoute;
+    unsigned int SpW0BytesIn;
+    unsigned int SpW0BytesOut;
+    unsigned int SpW1BytesIn;
+    unsigned int SpW1BytesOut;
+    unsigned int Spw0TxDescAvail;
+    unsigned int Spw0RxPcktAvail;
+    unsigned int Spw1TxDescAvail;
+    unsigned int Spw1RxPcktAvail;
+    unsigned int MilCucCoarseTime;
+    unsigned int MilCucFineTime;
+    unsigned int CucCoarseTime;
+    unsigned int CucFineTime;
+    unsigned int EdacDoubleFaults;
+    unsigned int EdacDoubleFAddr;
+    unsigned int HEARTBEAT_ENABLED;
+    unsigned int S1AllocDbs;
+    unsigned int S1AllocSw;
+    unsigned int S1AllocHeap;
+    unsigned int S1AllocFlash;
+    unsigned int S1AllocAux;
+    unsigned int S1AllocRes;
+    unsigned int S1AllocSwap;
+    unsigned int S2AllocSciHeap;
+    unsigned int FPGA_Version;
+    unsigned int FPGA_DPU_Status;
+    unsigned int FPGA_DPU_Address;
+    unsigned int FPGA_RESET_Status;
+    unsigned int FPGA_SEM_Status;
+    unsigned int FPGA_Oper_Heater_Status;
+} ;
+
+
+#define CC_PROLOGUE  0x0000
+#define CC_HEADERS   0x1000
+#define CC_STACKED   0x2000
+#define CC_IMAGETTES 0x3000
+#define CC_MRGLOS    0x4000
+#define CC_MRGLDK    0x5000
+#define CC_MRGLBLK   0x6000
+#define CC_MRGRDK    0x7000
+#define CC_MRGRBLK   0x8000
+#define CC_MRGTDK    0x9000
+#define CC_MRGTOS    0xA000
+#define CC_MIDPART   0xB000
+#define CC_COLLECT   0xC000
+#define CC_FINISHED  0xF000
+
+#define CC_COMPR_STARTED      0x0C00
+#define CC_PRODUCT_DISABLE    0x0C10
+#define CC_PRODUCT_HEADERS    0x0C11
+#define CC_PRODUCT_STACKED    0x0C12
+#define CC_PRODUCT_IMAGETTES  0x0C13
+#define CC_PRODUCT_MRGLOS     0x0C14
+#define CC_PRODUCT_MRGLDK     0x0C15
+#define CC_PRODUCT_MRGLBLK    0x0C16
+#define CC_PRODUCT_MRGRDK     0x0C17
+#define CC_PRODUCT_MRGRBLK    0x0C18
+#define CC_PRODUCT_MRGTDK     0x0C19
+#define CC_PRODUCT_MRGTOS     0x0C1A
+#define CC_PREPROC_NONE       0x0C20
+#define CC_PREPROC_NLC        0x0C21
+#define CC_PREPROC_NLCPHOT    0x0C22
+#define CC_PREPROC_PHOT       0x0C23
+#define CC_PREPROC_NLC2       0x0C24
+#define CC_LOSSY1_NONE        0x0C30
+#define CC_LOSSY1_COADD       0x0C31
+#define CC_LOSSY1_MEAN        0x0C32
+#define CC_LOSSY1_GMEAN       0x0C33
+#define CC_LOSSY1_GCOADD      0x0C34
+#define CC_LOSSY2_NONE        0x0C40
+#define CC_LOSSY2_3STAT       0x0C41
+#define CC_LOSSY2_3STATUI_ROW 0x0C42
+#define CC_LOSSY2_3STATUI_COL 0x0C43
+#define CC_LOSSY2_3STATUI     0x0C44
+#define CC_LOSSY2_4STAT       0x0C45
+#define CC_LOSSY2_CIRCMASK    0x0C46
+#define CC_LOSSY2_CIRCEXTRACT 0x0C47
+#define CC_DECORR_NONE        0x0C50
+#define CC_DECORR_DIFF        0x0C51
+#define CC_DECORR_KEYFR       0x0C52
+#define CC_DECORR_IWT1        0x0C53
+#define CC_DECORR_IWT2        0x0C54
+#define CC_LLC_NONE           0x0C60
+#define CC_LLC_RZIP           0x0C61
+#define CC_LLC_ARI1           0x0C62
+#define CC_LLC_PACK16         0x0C63
+#define CC_LOSSY3_NONE        0x0C70
+#define CC_LOSSY3_ROUND1      0x0C71
+#define CC_LOSSY3_ROUND2      0x0C72
+#define CC_LOSSY3_ROUND3      0x0C73
+#define CC_LOSSY3_ROUND4      0x0C74
+#define CC_LOSSY3_ROUND5      0x0C75
+#define CC_LOSSY3_ROUND6      0x0C76
+
+#define DTSIZE_FROM_HEADER 0xffffffff
+
+#define FPM_SIDE_A 0 /* nominal */
+#define FPM_SIDE_B 1 /* redundant */
+
+unsigned char GetFpmSide (unsigned char id);
+
+unsigned char GetRf (unsigned char id);
+
+/* access needed e.g. in IfswUtilities */
+unsigned int GetDataPoolMult (unsigned int id);
+
+unsigned int GetDataPoolSize (unsigned int id);
+
+#ifdef PC_TARGET
+extern struct DataPoolCordet dpCordetInit;
+extern struct DataPoolIasw dpIaswInit;
+extern struct DataPoolIbsw dpIbswInit;
+
+void InitDataPool();
+
+void initDpAddresses(struct DataPoolCordet *pdpCordet, struct DataPoolIasw *pdpIasw, struct DataPoolIbsw *pdpIbsw);
+#endif /* PC_TARGET */
+
+#if (__sparc__)
+
+#define CrIaCopy(id, addr_ptr)	CrIa_Copy(id, addr_ptr, sizeof(*addr_ptr))
+#define CrIaPaste(id, addr_ptr)	CrIa_Paste(id, addr_ptr, sizeof(*addr_ptr))
+
+/**
+ * Copy a value of the data pool item addressed by the identifier to a target variable.
+ * The copy interface is only intended for use by "Housekeeping Data Reporting Service".
+ * It is responsibility of a caller to ensure that:
+ * - identifier of the data pool item exists
+ * - target variable has a type corresponding to the telemetry type of the data item being copied.
+ * @param id the data pool item identifier
+ * @param targetAddr the address of the target variable
+ */
+
+void CrIa_Copy(unsigned int id, void * targetAddr, int tgtsize);
+
+/**
+ * Paste a source variable value to the data pool item addressed by the identifier.
+ * The paste interface is only intended for use by "Housekeeping Data Reporting Service".
+ * It is responsibility of a caller to ensure that:
+ * - identifier of the data pool item exists
+ * - source variable has a type corresponding to the telemetry type of the data item being paste.
+ * @param id the data pool item identifier
+ * @param sourceAddr the address of the source variable
+ */
+
+void CrIa_Paste(unsigned int id, void * targetAddr, int tgtsize);
+
+#else
+
+#define CrIaCopy(id, addr_ptr)	CrIa_Copy_PC(id, addr_ptr, sizeof(*addr_ptr))
+#define CrIaPaste(id, addr_ptr)	CrIa_Paste_PC(id, addr_ptr, sizeof(*addr_ptr))
+
+void CrIa_Copy_PC(unsigned int id, void * targetAddr, int tgtsize);
+
+void CrIa_Paste_PC(unsigned int id, void * targetAddr, int tgtsize);
+
+#endif
+
+
+void CrIaCopyPcPckt(unsigned int id, void * targetAddr);
+
+void CrIaCopyArrayItem(unsigned int id, void * targetAddr, unsigned int arrayElement);
+void CrIaCopyArrayItemPcPckt(unsigned int id, void * targetAddr, unsigned int arrayElement);
+
+/**
+ * Paste an array item value to the data pool item addressed by the identifier.
+ * The paste interface is only intended for use by "Housekeeping Data Reporting Service".
+ * It is responsibility of a caller to ensure that:
+ * - identifier of the data pool item exists
+ * - source variable has a type corresponding to the telemetry type of the data item being paste.
+ * - the number of array elements is not exceeded
+ * @param id the data pool item identifier
+ * @param sourceAddr the address of the source array
+ * @param arrayElement the array element index, the first has value 0
+ */
+void CrIaPasteArrayItem(unsigned int id, const void * sourceAddr, unsigned int arrayElement);
+
+
+#ifndef ISOLATED
+/**
+ * Update values in the data pool. This function is called at the beginning of every cycle,
+ * so that the data pool elements are the current ones.
+ * - all items from the DataPoolCordet are updated
+ * - there are items which cannot be updated this way, because they are asynchronous (e.g. CPU load)
+ * - items from other sections are TBC
+ */
+void CrFwUpdateDataPool(FwSmDesc_t inManagerSem, 
+                        FwSmDesc_t inManagerGrdObc,
+                        FwSmDesc_t outManager1,
+                        FwSmDesc_t outManager2,
+                        FwSmDesc_t outManager3,
+                        FwSmDesc_t inStreamSem,
+                        FwSmDesc_t inStreamObc,
+                        FwSmDesc_t inStreamGrd,
+                        FwSmDesc_t outStreamSem,
+                        FwSmDesc_t outStreamObc,
+                        FwSmDesc_t outStreamGrd);
+#endif
+
+#endif /* CRIADATAPOOL_H_ */
diff --git a/CrIa/src/CrIaDataPoolId.h b/CrIa/src/CrIaDataPoolId.h
new file mode 100644
index 0000000..401f733
--- /dev/null
+++ b/CrIa/src/CrIaDataPoolId.h
@@ -0,0 +1,1019 @@
+/**
+* @file
+* Identifiers of data pool items.
+*
+* @note This code was generated.
+* @authors V. Cechticky and A. Pasetti
+* @copyright P&P Software GmbH, 2015, All Rights Reserved
+*/
+
+#ifndef CRIADATAPOOLID_H_
+#define CRIADATAPOOLID_H_
+
+#define BUILDNUMBER_ID 1
+#define APPERRCODE_ID 2
+#define NOFALLOCATEDINREP_ID 3
+#define MAXNOFINREP_ID 4
+#define NOFALLOCATEDINCMD_ID 5
+#define MAXNOFINCMD_ID 6
+#define SEM_NOFPENDINGINCMP_ID 7
+#define SEM_PCRLSIZE_ID 8
+#define SEM_NOFLOADEDINCMP_ID 9
+#define GRDOBC_NOFPENDINGINCMP_ID 10
+#define GRDOBC_PCRLSIZE_ID 11
+#define NOFALLOCATEDOUTCMP_ID 12
+#define MAXNOFOUTCMP_ID 13
+#define NOFINSTANCEID_ID 14
+#define OUTMG1_NOFPENDINGOUTCMP_ID 15
+#define OUTMG1_POCLSIZE_ID 16
+#define OUTMG1_NOFLOADEDOUTCMP_ID 17
+#define OUTMG2_NOFPENDINGOUTCMP_ID 18
+#define OUTMG2_POCLSIZE_ID 19
+#define OUTMG2_NOFLOADEDOUTCMP_ID 20
+#define OUTMG3_NOFPENDINGOUTCMP_ID 21
+#define OUTMG3_POCLSIZE_ID 22
+#define OUTMG3_NOFLOADEDOUTCMP_ID 23
+#define INSEM_SEQCNT_ID 24
+#define INSEM_NOFPENDINGPCKTS_ID 25
+#define INSEM_NOFGROUPS_ID 26
+#define INSEM_PCKTQUEUESIZE_ID 27
+#define INSEM_SRC_ID 28
+#define INOBC_NOFPENDINGPCKTS_ID 29
+#define INOBC_NOFGROUPS_ID 30
+#define INOBC_PCKTQUEUESIZE_ID 31
+#define INOBC_SRC_ID 32
+#define INGRD_NOFPENDINGPCKTS_ID 33
+#define INGRD_NOFGROUPS_ID 34
+#define INGRD_PCKTQUEUESIZE_ID 35
+#define INGRD_SRC_ID 36
+#define OUTSEM_DEST_ID 37
+#define OUTSEM_SEQCNT_ID 38
+#define OUTSEM_NOFPENDINGPCKTS_ID 39
+#define OUTSEM_NOFGROUPS_ID 40
+#define OUTSEM_PCKTQUEUESIZE_ID 41
+#define OUTOBC_DEST_ID 42
+#define OUTOBC_SEQCNT_GROUP0_ID 43
+#define OUTOBC_SEQCNT_GROUP1_ID 44
+#define OUTOBC_NOFPENDINGPCKTS_ID 45
+#define OUTOBC_NOFGROUPS_ID 46
+#define OUTOBC_PCKTQUEUESIZE_ID 47
+#define OUTGRD_DEST_ID 48
+#define OUTGRD_SEQCNT_GROUP0_ID 49
+#define OUTGRD_SEQCNT_GROUP1_ID 50
+#define OUTGRD_SEQCNT_GROUP2_ID 51
+#define OUTGRD_NOFPENDINGPCKTS_ID 52
+#define OUTGRD_NOFGROUPS_ID 53
+#define OUTGRD_PCKTQUEUESIZE_ID 54
+#define SIBNFULL_ID 55
+#define CIBNFULL_ID 56
+#define GIBNFULL_ID 57
+#define SIBNWIN_ID 58
+#define CIBNWIN_ID 59
+#define GIBNWIN_ID 60
+#define SIBSIZEFULL_ID 61
+#define CIBSIZEFULL_ID 62
+#define GIBSIZEFULL_ID 63
+#define SIBSIZEWIN_ID 64
+#define CIBSIZEWIN_ID 65
+#define GIBSIZEWIN_ID 66
+#define SIBIN_ID 67
+#define SIBOUT_ID 68
+#define CIBIN_ID 69
+#define GIBIN_ID 70
+#define GIBOUT_ID 71
+#define SDBSTATE_ID 72
+#define SDBSTATECNT_ID 73
+#define OFFSETX_ID 74
+#define OFFSETY_ID 75
+#define TARGETLOCATIONX_ID 76
+#define TARGETLOCATIONY_ID 77
+#define INTEGSTARTTIMECRS_ID 78
+#define INTEGSTARTTIMEFINE_ID 79
+#define INTEGENDTIMECRS_ID 80
+#define INTEGENDTIMEFINE_ID 81
+#define DATACADENCE_ID 82
+#define VALIDITYSTATUS_ID 83
+#define NOFTCACC_ID 84
+#define NOFACCFAILEDTC_ID 85
+#define SEQCNTLASTACCTCFROMOBC_ID 86
+#define SEQCNTLASTACCTCFROMGRD_ID 87
+#define SEQCNTLASTACCFAILTC_ID 88
+#define NOFSTARTFAILEDTC_ID 89
+#define SEQCNTLASTSTARTFAILTC_ID 90
+#define NOFTCTERM_ID 91
+#define NOFTERMFAILEDTC_ID 92
+#define SEQCNTLASTTERMFAILTC_ID 93
+#define RDLSIDLIST_ID 94
+#define ISRDLFREE_ID 95
+#define RDLCYCCNTLIST_ID 96
+#define RDLPERIODLIST_ID 97
+#define RDLENABLEDLIST_ID 98
+#define RDLDESTLIST_ID 99
+#define RDLDATAITEMLIST_0_ID 100
+#define RDLDATAITEMLIST_1_ID 101
+#define RDLDATAITEMLIST_2_ID 102
+#define RDLDATAITEMLIST_3_ID 103
+#define RDLDATAITEMLIST_4_ID 104
+#define RDLDATAITEMLIST_5_ID 105
+#define RDLDATAITEMLIST_6_ID 106
+#define RDLDATAITEMLIST_7_ID 107
+#define RDLDATAITEMLIST_8_ID 108
+#define RDLDATAITEMLIST_9_ID 109
+#define DEBUG_VAR_ID 110
+#define DEBUG_VAR_ADDR_ID 111
+#define EVTFILTERDEF_ID 112
+#define EVTENABLEDLIST_ID 113
+#define LASTPATCHEDADDR_ID 114
+#define LASTDUMPADDR_ID 115
+#define SDU2STATE_ID 116
+#define SDU4STATE_ID 117
+#define SDU2STATECNT_ID 118
+#define SDU4STATECNT_ID 119
+#define SDU2BLOCKCNT_ID 120
+#define SDU4BLOCKCNT_ID 121
+#define SDU2REMSIZE_ID 122
+#define SDU4REMSIZE_ID 123
+#define SDU2DOWNTRANSFERSIZE_ID 124
+#define SDU4DOWNTRANSFERSIZE_ID 125
+#define SDSCOUNTER_ID 126
+#define FDGLBENABLE_ID 127
+#define RPGLBENABLE_ID 128
+#define FDCHECKTTMSTATE_ID 129
+#define FDCHECKTTMINTEN_ID 130
+#define FDCHECKTTMEXTEN_ID 131
+#define RPTTMINTEN_ID 132
+#define RPTTMEXTEN_ID 133
+#define FDCHECKTTMCNT_ID 134
+#define FDCHECKTTMSPCNT_ID 135
+#define FDCHECKTTMCNTTHR_ID 136
+#define TTC_LL_ID 137
+#define TTC_UL_ID 138
+#define TTM_LIM_ID 139
+#define FDCHECKSDSCSTATE_ID 140
+#define FDCHECKSDSCINTEN_ID 141
+#define FDCHECKSDSCEXTEN_ID 142
+#define RPSDSCINTEN_ID 143
+#define RPSDSCEXTEN_ID 144
+#define FDCHECKSDSCCNT_ID 145
+#define FDCHECKSDSCSPCNT_ID 146
+#define FDCHECKSDSCCNTTHR_ID 147
+#define FDCHECKCOMERRSTATE_ID 148
+#define FDCHECKCOMERRINTEN_ID 149
+#define FDCHECKCOMERREXTEN_ID 150
+#define RPCOMERRINTEN_ID 151
+#define RPCOMERREXTEN_ID 152
+#define FDCHECKCOMERRCNT_ID 153
+#define FDCHECKCOMERRSPCNT_ID 154
+#define FDCHECKCOMERRCNTTHR_ID 155
+#define FDCHECKTIMEOUTSTATE_ID 156
+#define FDCHECKTIMEOUTINTEN_ID 157
+#define FDCHECKTIMEOUTEXTEN_ID 158
+#define RPTIMEOUTINTEN_ID 159
+#define RPTIMEOUTEXTEN_ID 160
+#define FDCHECKTIMEOUTCNT_ID 161
+#define FDCHECKTIMEOUTSPCNT_ID 162
+#define FDCHECKTIMEOUTCNTTHR_ID 163
+#define SEM_TO_POWERON_ID 164
+#define SEM_TO_SAFE_ID 165
+#define SEM_TO_STAB_ID 166
+#define SEM_TO_TEMP_ID 167
+#define SEM_TO_CCD_ID 168
+#define SEM_TO_DIAG_ID 169
+#define SEM_TO_STANDBY_ID 170
+#define FDCHECKSAFEMODESTATE_ID 171
+#define FDCHECKSAFEMODEINTEN_ID 172
+#define FDCHECKSAFEMODEEXTEN_ID 173
+#define RPSAFEMODEINTEN_ID 174
+#define RPSAFEMODEEXTEN_ID 175
+#define FDCHECKSAFEMODECNT_ID 176
+#define FDCHECKSAFEMODESPCNT_ID 177
+#define FDCHECKSAFEMODECNTTHR_ID 178
+#define FDCHECKALIVESTATE_ID 179
+#define FDCHECKALIVEINTEN_ID 180
+#define FDCHECKALIVEEXTEN_ID 181
+#define RPALIVEINTEN_ID 182
+#define RPALIVEEXTEN_ID 183
+#define FDCHECKALIVECNT_ID 184
+#define FDCHECKALIVESPCNT_ID 185
+#define FDCHECKALIVECNTTHR_ID 186
+#define SEM_HK_DEF_PER_ID 187
+#define SEMALIVE_DELAYEDSEMHK_ID 188
+#define FDCHECKSEMANOEVTSTATE_ID 189
+#define FDCHECKSEMANOEVTINTEN_ID 190
+#define FDCHECKSEMANOEVTEXTEN_ID 191
+#define RPSEMANOEVTINTEN_ID 192
+#define RPSEMANOEVTEXTEN_ID 193
+#define FDCHECKSEMANOEVTCNT_ID 194
+#define FDCHECKSEMANOEVTSPCNT_ID 195
+#define FDCHECKSEMANOEVTCNTTHR_ID 196
+#define SEMANOEVTRESP_1_ID 197
+#define SEMANOEVTRESP_2_ID 198
+#define SEMANOEVTRESP_3_ID 199
+#define SEMANOEVTRESP_4_ID 200
+#define SEMANOEVTRESP_5_ID 201
+#define SEMANOEVTRESP_6_ID 202
+#define SEMANOEVTRESP_7_ID 203
+#define SEMANOEVTRESP_8_ID 204
+#define SEMANOEVTRESP_9_ID 205
+#define SEMANOEVTRESP_10_ID 206
+#define SEMANOEVTRESP_11_ID 207
+#define SEMANOEVTRESP_12_ID 208
+#define SEMANOEVTRESP_13_ID 209
+#define SEMANOEVTRESP_14_ID 210
+#define SEMANOEVTRESP_15_ID 211
+#define SEMANOEVTRESP_16_ID 212
+#define SEMANOEVTRESP_17_ID 213
+#define SEMANOEVTRESP_18_ID 214
+#define SEMANOEVTRESP_19_ID 215
+#define SEMANOEVTRESP_20_ID 216
+#define SEMANOEVTRESP_21_ID 217
+#define SEMANOEVTRESP_22_ID 218
+#define SEMANOEVTRESP_23_ID 219
+#define SEMANOEVTRESP_24_ID 220
+#define SEMANOEVTRESP_25_ID 221
+#define SEMANOEVTRESP_26_ID 222
+#define SEMANOEVTRESP_27_ID 223
+#define SEMANOEVTRESP_28_ID 224
+#define SEMANOEVTRESP_29_ID 225
+#define FDCHECKSEMLIMITSTATE_ID 226
+#define FDCHECKSEMLIMITINTEN_ID 227
+#define FDCHECKSEMLIMITEXTEN_ID 228
+#define RPSEMLIMITINTEN_ID 229
+#define RPSEMLIMITEXTEN_ID 230
+#define FDCHECKSEMLIMITCNT_ID 231
+#define FDCHECKSEMLIMITSPCNT_ID 232
+#define FDCHECKSEMLIMITCNTTHR_ID 233
+#define SEM_LIM_DEL_T_ID 234
+#define FDCHECKDPUHKSTATE_ID 235
+#define FDCHECKDPUHKINTEN_ID 236
+#define FDCHECKDPUHKEXTEN_ID 237
+#define RPDPUHKINTEN_ID 238
+#define RPDPUHKEXTEN_ID 239
+#define FDCHECKDPUHKCNT_ID 240
+#define FDCHECKDPUHKSPCNT_ID 241
+#define FDCHECKDPUHKCNTTHR_ID 242
+#define FDCHECKCENTCONSSTATE_ID 243
+#define FDCHECKCENTCONSINTEN_ID 244
+#define FDCHECKCENTCONSEXTEN_ID 245
+#define RPCENTCONSINTEN_ID 246
+#define RPCENTCONSEXTEN_ID 247
+#define FDCHECKCENTCONSCNT_ID 248
+#define FDCHECKCENTCONSSPCNT_ID 249
+#define FDCHECKCENTCONSCNTTHR_ID 250
+#define FDCHECKRESSTATE_ID 251
+#define FDCHECKRESINTEN_ID 252
+#define FDCHECKRESEXTEN_ID 253
+#define RPRESINTEN_ID 254
+#define RPRESEXTEN_ID 255
+#define FDCHECKRESCNT_ID 256
+#define FDCHECKRESSPCNT_ID 257
+#define FDCHECKRESCNTTHR_ID 258
+#define CPU1_USAGE_MAX_ID 259
+#define MEM_USAGE_MAX_ID 260
+#define FDCHECKSEMCONS_ID 261
+#define FDCHECKSEMCONSINTEN_ID 262
+#define FDCHECKSEMCONSEXTEN_ID 263
+#define RPSEMCONSINTEN_ID 264
+#define RPSEMCONSEXTEN_ID 265
+#define FDCHECKSEMCONSCNT_ID 266
+#define FDCHECKSEMCONSSPCNT_ID 267
+#define FDCHECKSEMCONSCNTTHR_ID 268
+#define SEMSTATE_ID 269
+#define SEMOPERSTATE_ID 270
+#define SEMSTATECNT_ID 271
+#define SEMOPERSTATECNT_ID 272
+#define IMAGECYCLECNT_ID 273
+#define ACQIMAGECNT_ID 274
+#define SCISUBMODE_ID 275
+#define LASTSEMPCKT_ID 276
+#define SEM_ON_CODE_ID 277
+#define SEM_OFF_CODE_ID 278
+#define SEM_INIT_T1_ID 279
+#define SEM_INIT_T2_ID 280
+#define SEM_OPER_T1_ID 281
+#define SEM_SHUTDOWN_T1_ID 282
+#define SEM_SHUTDOWN_T11_ID 283
+#define SEM_SHUTDOWN_T12_ID 284
+#define SEM_SHUTDOWN_T2_ID 285
+#define IASWSTATE_ID 286
+#define IASWSTATECNT_ID 287
+#define IASWCYCLECNT_ID 288
+#define PREPSCIENCENODE_ID 289
+#define PREPSCIENCECNT_ID 290
+#define CONTROLLEDSWITCHOFFNODE_ID 291
+#define CONTROLLEDSWITCHOFFCNT_ID 292
+#define CTRLD_SWITCH_OFF_T1_ID 293
+#define ALGOCENT0STATE_ID 294
+#define ALGOCENT0CNT_ID 295
+#define ALGOCENT0ENABLED_ID 296
+#define ALGOCENT1STATE_ID 297
+#define ALGOCENT1CNT_ID 298
+#define ALGOCENT1ENABLED_ID 299
+#define CENT_EXEC_PHASE_ID 300
+#define ALGOACQ1STATE_ID 301
+#define ALGOACQ1CNT_ID 302
+#define ALGOACQ1ENABLED_ID 303
+#define ACQ_PH_ID 304
+#define ALGOCCSTATE_ID 305
+#define ALGOCCCNT_ID 306
+#define ALGOCCENABLED_ID 307
+#define STCK_ORDER_ID 308
+#define ALGOTTC1STATE_ID 309
+#define ALGOTTC1CNT_ID 310
+#define ALGOTTC1ENABLED_ID 311
+#define TTC1_EXEC_PHASE_ID 312
+#define TTC1_EXEC_PER_ID 313
+#define TTC1_LL_FRT_ID 314
+#define TTC1_LL_AFT_ID 315
+#define TTC1_UL_FRT_ID 316
+#define TTC1_UL_AFT_ID 317
+#define TTC1AVTEMPAFT_ID 318
+#define TTC1AVTEMPFRT_ID 319
+#define ALGOTTC2STATE_ID 320
+#define ALGOTTC2CNT_ID 321
+#define ALGOTTC2ENABLED_ID 322
+#define TTC2_EXEC_PER_ID 323
+#define TTC2_REF_TEMP_ID 324
+#define TTC2_OFFSETA_ID 325
+#define TTC2_OFFSETF_ID 326
+#define INTTIMEAFT_ID 327
+#define ONTIMEAFT_ID 328
+#define INTTIMEFRONT_ID 329
+#define ONTIMEFRONT_ID 330
+#define TTC2_PA_ID 331
+#define TTC2_DA_ID 332
+#define TTC2_IA_ID 333
+#define TTC2_PF_ID 334
+#define TTC2_DF_ID 335
+#define TTC2_IF_ID 336
+#define ALGOSAAEVALSTATE_ID 337
+#define ALGOSAAEVALCNT_ID 338
+#define ALGOSAAEVALENABLED_ID 339
+#define SAA_EXEC_PHASE_ID 340
+#define SAA_EXEC_PER_ID 341
+#define ISSAAACTIVE_ID 342
+#define SAACOUNTER_ID 343
+#define PINITSAACOUNTER_ID 344
+#define ALGOSDSEVALSTATE_ID 345
+#define ALGOSDSEVALCNT_ID 346
+#define ALGOSDSEVALENABLED_ID 347
+#define SDS_EXEC_PHASE_ID 348
+#define SDS_EXEC_PER_ID 349
+#define ISSDSACTIVE_ID 350
+#define SDS_FORCED_ID 351
+#define SDS_INHIBITED_ID 352
+#define EARTH_OCCULT_ACTIVE_ID 353
+#define HEARTBEAT_D1_ID 354
+#define HEARTBEAT_D2_ID 355
+#define HBSEM_ID 356
+#define STARMAP_ID 357
+#define OBSERVATIONID_ID 358
+#define CENTVALPROCOUTPUT_ID 359
+#define CENT_OFFSET_LIM_ID 360
+#define CENT_FROZEN_LIM_ID 361
+#define SEM_SERV1_1_FORWARD_ID 362
+#define SEM_SERV1_2_FORWARD_ID 363
+#define SEM_SERV1_7_FORWARD_ID 364
+#define SEM_SERV1_8_FORWARD_ID 365
+#define SEM_SERV3_1_FORWARD_ID 366
+#define SEM_SERV3_2_FORWARD_ID 367
+#define SEM_HK_TS_DEF_CRS_ID 368
+#define SEM_HK_TS_DEF_FINE_ID 369
+#define SEM_HK_TS_EXT_CRS_ID 370
+#define SEM_HK_TS_EXT_FINE_ID 371
+#define STAT_MODE_ID 372
+#define STAT_FLAGS_ID 373
+#define STAT_LAST_SPW_ERR_ID 374
+#define STAT_LAST_ERR_ID_ID 375
+#define STAT_LAST_ERR_FREQ_ID 376
+#define STAT_NUM_CMD_RECEIVED_ID 377
+#define STAT_NUM_CMD_EXECUTED_ID 378
+#define STAT_NUM_DATA_SENT_ID 379
+#define STAT_SCU_PROC_DUTY_CL_ID 380
+#define STAT_SCU_NUM_AHB_ERR_ID 381
+#define STAT_SCU_NUM_AHB_CERR_ID 382
+#define STAT_SCU_NUM_LUP_ERR_ID 383
+#define TEMP_SEM_SCU_ID 384
+#define TEMP_SEM_PCU_ID 385
+#define VOLT_SCU_P3_4_ID 386
+#define VOLT_SCU_P5_ID 387
+#define TEMP_FEE_CCD_ID 388
+#define TEMP_FEE_STRAP_ID 389
+#define TEMP_FEE_ADC_ID 390
+#define TEMP_FEE_BIAS_ID 391
+#define TEMP_FEE_DEB_ID 392
+#define VOLT_FEE_VOD_ID 393
+#define VOLT_FEE_VRD_ID 394
+#define VOLT_FEE_VOG_ID 395
+#define VOLT_FEE_VSS_ID 396
+#define VOLT_FEE_CCD_ID 397
+#define VOLT_FEE_CLK_ID 398
+#define VOLT_FEE_ANA_P5_ID 399
+#define VOLT_FEE_ANA_N5_ID 400
+#define VOLT_FEE_ANA_P3_3_ID 401
+#define CURR_FEE_CLK_BUF_ID 402
+#define VOLT_SCU_FPGA_P1_5_ID 403
+#define CURR_SCU_P3_4_ID 404
+#define STAT_NUM_SPW_ERR_CRE_ID 405
+#define STAT_NUM_SPW_ERR_ESC_ID 406
+#define STAT_NUM_SPW_ERR_DISC_ID 407
+#define STAT_NUM_SPW_ERR_PAR_ID 408
+#define STAT_NUM_SPW_ERR_WRSY_ID 409
+#define STAT_NUM_SPW_ERR_INVA_ID 410
+#define STAT_NUM_SPW_ERR_EOP_ID 411
+#define STAT_NUM_SPW_ERR_RXAH_ID 412
+#define STAT_NUM_SPW_ERR_TXAH_ID 413
+#define STAT_NUM_SPW_ERR_TXBL_ID 414
+#define STAT_NUM_SPW_ERR_TXLE_ID 415
+#define STAT_NUM_SP_ERR_RX_ID 416
+#define STAT_NUM_SP_ERR_TX_ID 417
+#define STAT_HEAT_PWM_FPA_CCD_ID 418
+#define STAT_HEAT_PWM_FEE_STR_ID 419
+#define STAT_HEAT_PWM_FEE_ANA_ID 420
+#define STAT_HEAT_PWM_SPARE_ID 421
+#define STAT_HEAT_PWM_FLAGS_ID 422
+#define STAT_OBTIME_SYNC_DELTA_ID 423
+#define TEMP_SEM_SCU_LW_ID 424
+#define TEMP_SEM_PCU_LW_ID 425
+#define VOLT_SCU_P3_4_LW_ID 426
+#define VOLT_SCU_P5_LW_ID 427
+#define TEMP_FEE_CCD_LW_ID 428
+#define TEMP_FEE_STRAP_LW_ID 429
+#define TEMP_FEE_ADC_LW_ID 430
+#define TEMP_FEE_BIAS_LW_ID 431
+#define TEMP_FEE_DEB_LW_ID 432
+#define VOLT_FEE_VOD_LW_ID 433
+#define VOLT_FEE_VRD_LW_ID 434
+#define VOLT_FEE_VOG_LW_ID 435
+#define VOLT_FEE_VSS_LW_ID 436
+#define VOLT_FEE_CCD_LW_ID 437
+#define VOLT_FEE_CLK_LW_ID 438
+#define VOLT_FEE_ANA_P5_LW_ID 439
+#define VOLT_FEE_ANA_N5_LW_ID 440
+#define VOLT_FEE_ANA_P3_3_LW_ID 441
+#define CURR_FEE_CLK_BUF_LW_ID 442
+#define VOLT_SCU_FPGA_P1_5_LW_ID 443
+#define CURR_SCU_P3_4_LW_ID 444
+#define TEMP_SEM_SCU_UW_ID 445
+#define TEMP_SEM_PCU_UW_ID 446
+#define VOLT_SCU_P3_4_UW_ID 447
+#define VOLT_SCU_P5_UW_ID 448
+#define TEMP_FEE_CCD_UW_ID 449
+#define TEMP_FEE_STRAP_UW_ID 450
+#define TEMP_FEE_ADC_UW_ID 451
+#define TEMP_FEE_BIAS_UW_ID 452
+#define TEMP_FEE_DEB_UW_ID 453
+#define VOLT_FEE_VOD_UW_ID 454
+#define VOLT_FEE_VRD_UW_ID 455
+#define VOLT_FEE_VOG_UW_ID 456
+#define VOLT_FEE_VSS_UW_ID 457
+#define VOLT_FEE_CCD_UW_ID 458
+#define VOLT_FEE_CLK_UW_ID 459
+#define VOLT_FEE_ANA_P5_UW_ID 460
+#define VOLT_FEE_ANA_N5_UW_ID 461
+#define VOLT_FEE_ANA_P3_3_UW_ID 462
+#define CURR_FEE_CLK_BUF_UW_ID 463
+#define VOLT_SCU_FPGA_P1_5_UW_ID 464
+#define CURR_SCU_P3_4_UW_ID 465
+#define TEMP_SEM_SCU_LA_ID 466
+#define TEMP_SEM_PCU_LA_ID 467
+#define VOLT_SCU_P3_4_LA_ID 468
+#define VOLT_SCU_P5_LA_ID 469
+#define TEMP_FEE_CCD_LA_ID 470
+#define TEMP_FEE_STRAP_LA_ID 471
+#define TEMP_FEE_ADC_LA_ID 472
+#define TEMP_FEE_BIAS_LA_ID 473
+#define TEMP_FEE_DEB_LA_ID 474
+#define VOLT_FEE_VOD_LA_ID 475
+#define VOLT_FEE_VRD_LA_ID 476
+#define VOLT_FEE_VOG_LA_ID 477
+#define VOLT_FEE_VSS_LA_ID 478
+#define VOLT_FEE_CCD_LA_ID 479
+#define VOLT_FEE_CLK_LA_ID 480
+#define VOLT_FEE_ANA_P5_LA_ID 481
+#define VOLT_FEE_ANA_N5_LA_ID 482
+#define VOLT_FEE_ANA_P3_3_LA_ID 483
+#define CURR_FEE_CLK_BUF_LA_ID 484
+#define VOLT_SCU_FPGA_P1_5_LA_ID 485
+#define CURR_SCU_P3_4_LA_ID 486
+#define TEMP_SEM_SCU_UA_ID 487
+#define TEMP_SEM_PCU_UA_ID 488
+#define VOLT_SCU_P3_4_UA_ID 489
+#define VOLT_SCU_P5_UA_ID 490
+#define TEMP_FEE_CCD_UA_ID 491
+#define TEMP_FEE_STRAP_UA_ID 492
+#define TEMP_FEE_ADC_UA_ID 493
+#define TEMP_FEE_BIAS_UA_ID 494
+#define TEMP_FEE_DEB_UA_ID 495
+#define VOLT_FEE_VOD_UA_ID 496
+#define VOLT_FEE_VRD_UA_ID 497
+#define VOLT_FEE_VOG_UA_ID 498
+#define VOLT_FEE_VSS_UA_ID 499
+#define VOLT_FEE_CCD_UA_ID 500
+#define VOLT_FEE_CLK_UA_ID 501
+#define VOLT_FEE_ANA_P5_UA_ID 502
+#define VOLT_FEE_ANA_N5_UA_ID 503
+#define VOLT_FEE_ANA_P3_3_UA_ID 504
+#define CURR_FEE_CLK_BUF_UA_ID 505
+#define VOLT_SCU_FPGA_P1_5_UA_ID 506
+#define CURR_SCU_P3_4_UA_ID 507
+#define SEMEVTCOUNTER_ID 508
+#define SEM_SERV5_1_FORWARD_ID 509
+#define SEM_SERV5_2_FORWARD_ID 510
+#define SEM_SERV5_3_FORWARD_ID 511
+#define SEM_SERV5_4_FORWARD_ID 512
+#define PEXPTIME_ID 513
+#define PIMAGEREP_ID 514
+#define PACQNUM_ID 515
+#define PDATAOS_ID 516
+#define PCCDRDMODE_ID 517
+#define PWINPOSX_ID 518
+#define PWINPOSY_ID 519
+#define PWINSIZEX_ID 520
+#define PWINSIZEY_ID 521
+#define PDTACQSRC_ID 522
+#define PTEMPCTRLTARGET_ID 523
+#define PVOLTFEEVOD_ID 524
+#define PVOLTFEEVRD_ID 525
+#define PVOLTFEEVSS_ID 526
+#define PHEATTEMPFPACCD_ID 527
+#define PHEATTEMPFEESTRAP_ID 528
+#define PHEATTEMPFEEANACH_ID 529
+#define PHEATTEMPSPARE_ID 530
+#define PSTEPENDIAGCCD_ID 531
+#define PSTEPENDIAGFEE_ID 532
+#define PSTEPENDIAGTEMP_ID 533
+#define PSTEPENDIAGANA_ID 534
+#define PSTEPENDIAGEXPOS_ID 535
+#define PSTEPDEBDIAGCCD_ID 536
+#define PSTEPDEBDIAGFEE_ID 537
+#define PSTEPDEBDIAGTEMP_ID 538
+#define PSTEPDEBDIAGANA_ID 539
+#define PSTEPDEBDIAGEXPOS_ID 540
+#define SEM_SERV220_6_FORWARD_ID 541
+#define SEM_SERV220_12_FORWARD_ID 542
+#define SEM_SERV222_6_FORWARD_ID 543
+#define SAVEIMAGESNODE_ID 544
+#define SAVEIMAGESCNT_ID 545
+#define SAVEIMAGES_PSAVETARGET_ID 546
+#define SAVEIMAGES_PFBFINIT_ID 547
+#define SAVEIMAGES_PFBFEND_ID 548
+#define ACQFULLDROPNODE_ID 549
+#define ACQFULLDROPCNT_ID 550
+#define ACQFULLDROP_PEXPTIME_ID 551
+#define ACQFULLDROP_PIMAGEREP_ID 552
+#define ACQFULLDROPT1_ID 553
+#define ACQFULLDROPT2_ID 554
+#define CALFULLSNAPNODE_ID 555
+#define CALFULLSNAPCNT_ID 556
+#define CALFULLSNAP_PEXPTIME_ID 557
+#define CALFULLSNAP_PIMAGEREP_ID 558
+#define CALFULLSNAP_PNMBIMAGES_ID 559
+#define CALFULLSNAP_PCENTSEL_ID 560
+#define CALFULLSNAPT1_ID 561
+#define CALFULLSNAPT2_ID 562
+#define SCIWINNODE_ID 563
+#define SCIWINCNT_ID 564
+#define SCIWIN_PNMBIMAGES_ID 565
+#define SCIWIN_PCCDRDMODE_ID 566
+#define SCIWIN_PEXPTIME_ID 567
+#define SCIWIN_PIMAGEREP_ID 568
+#define SCIWIN_PWINPOSX_ID 569
+#define SCIWIN_PWINPOSY_ID 570
+#define SCIWIN_PWINSIZEX_ID 571
+#define SCIWIN_PWINSIZEY_ID 572
+#define SCIWIN_PCENTSEL_ID 573
+#define SCIWINT1_ID 574
+#define SCIWINT2_ID 575
+#define FBFLOADNODE_ID 576
+#define FBFLOADCNT_ID 577
+#define FBFSAVENODE_ID 578
+#define FBFSAVECNT_ID 579
+#define FBFLOAD_PFBFID_ID 580
+#define FBFLOAD_PFBFNBLOCKS_ID 581
+#define FBFLOAD_PFBFRAMAREAID_ID 582
+#define FBFLOAD_PFBFRAMADDR_ID 583
+#define FBFSAVE_PFBFID_ID 584
+#define FBFSAVE_PFBFNBLOCKS_ID 585
+#define FBFSAVE_PFBFRAMAREAID_ID 586
+#define FBFSAVE_PFBFRAMADDR_ID 587
+#define FBFLOADBLOCKCOUNTER_ID 588
+#define FBFSAVEBLOCKCOUNTER_ID 589
+#define TRANSFBFTOGRNDNODE_ID 590
+#define TRANSFBFTOGRNDCNT_ID 591
+#define TRANSFBFTOGRND_PNMBFBF_ID 592
+#define TRANSFBFTOGRND_PFBFINIT_ID 593
+#define TRANSFBFTOGRND_PFBFSIZE_ID 594
+#define NOMSCINODE_ID 595
+#define NOMSCICNT_ID 596
+#define NOMSCI_PACQFLAG_ID 597
+#define NOMSCI_PCAL1FLAG_ID 598
+#define NOMSCI_PSCIFLAG_ID 599
+#define NOMSCI_PCAL2FLAG_ID 600
+#define NOMSCI_PCIBNFULL_ID 601
+#define NOMSCI_PCIBSIZEFULL_ID 602
+#define NOMSCI_PSIBNFULL_ID 603
+#define NOMSCI_PSIBSIZEFULL_ID 604
+#define NOMSCI_PGIBNFULL_ID 605
+#define NOMSCI_PGIBSIZEFULL_ID 606
+#define NOMSCI_PSIBNWIN_ID 607
+#define NOMSCI_PSIBSIZEWIN_ID 608
+#define NOMSCI_PCIBNWIN_ID 609
+#define NOMSCI_PCIBSIZEWIN_ID 610
+#define NOMSCI_PGIBNWIN_ID 611
+#define NOMSCI_PGIBSIZEWIN_ID 612
+#define NOMSCI_PEXPTIMEACQ_ID 613
+#define NOMSCI_PIMAGEREPACQ_ID 614
+#define NOMSCI_PEXPTIMECAL1_ID 615
+#define NOMSCI_PIMAGEREPCAL1_ID 616
+#define NOMSCI_PNMBIMAGESCAL1_ID 617
+#define NOMSCI_PCENTSELCAL1_ID 618
+#define NOMSCI_PNMBIMAGESSCI_ID 619
+#define NOMSCI_PCCDRDMODESCI_ID 620
+#define NOMSCI_PEXPTIMESCI_ID 621
+#define NOMSCI_PIMAGEREPSCI_ID 622
+#define NOMSCI_PWINPOSXSCI_ID 623
+#define NOMSCI_PWINPOSYSCI_ID 624
+#define NOMSCI_PWINSIZEXSCI_ID 625
+#define NOMSCI_PWINSIZEYSCI_ID 626
+#define NOMSCI_PCENTSELSCI_ID 627
+#define NOMSCI_PEXPTIMECAL2_ID 628
+#define NOMSCI_PIMAGEREPCAL2_ID 629
+#define NOMSCI_PNMBIMAGESCAL2_ID 630
+#define NOMSCI_PCENTSELCAL2_ID 631
+#define NOMSCI_PSAVETARGET_ID 632
+#define NOMSCI_PFBFINIT_ID 633
+#define NOMSCI_PFBFEND_ID 634
+#define NOMSCI_PSTCKORDERCAL1_ID 635
+#define NOMSCI_PSTCKORDERSCI_ID 636
+#define NOMSCI_PSTCKORDERCAL2_ID 637
+#define CONFIGSDB_PSDBCMD_ID 638
+#define CONFIGSDB_PCIBNFULL_ID 639
+#define CONFIGSDB_PCIBSIZEFULL_ID 640
+#define CONFIGSDB_PSIBNFULL_ID 641
+#define CONFIGSDB_PSIBSIZEFULL_ID 642
+#define CONFIGSDB_PGIBNFULL_ID 643
+#define CONFIGSDB_PGIBSIZEFULL_ID 644
+#define CONFIGSDB_PSIBNWIN_ID 645
+#define CONFIGSDB_PSIBSIZEWIN_ID 646
+#define CONFIGSDB_PCIBNWIN_ID 647
+#define CONFIGSDB_PCIBSIZEWIN_ID 648
+#define CONFIGSDB_PGIBNWIN_ID 649
+#define CONFIGSDB_PGIBSIZEWIN_ID 650
+#define ADC_P3V3_ID 651
+#define ADC_P5V_ID 652
+#define ADC_P1V8_ID 653
+#define ADC_P2V5_ID 654
+#define ADC_N5V_ID 655
+#define ADC_PGND_ID 656
+#define ADC_TEMPOH1A_ID 657
+#define ADC_TEMP1_ID 658
+#define ADC_TEMPOH2A_ID 659
+#define ADC_TEMPOH1B_ID 660
+#define ADC_TEMPOH3A_ID 661
+#define ADC_TEMPOH2B_ID 662
+#define ADC_TEMPOH4A_ID 663
+#define ADC_TEMPOH3B_ID 664
+#define ADC_TEMPOH4B_ID 665
+#define SEM_P15V_ID 666
+#define SEM_P30V_ID 667
+#define SEM_P5V0_ID 668
+#define SEM_P7V0_ID 669
+#define SEM_N5V0_ID 670
+#define ADC_P3V3_RAW_ID 671
+#define ADC_P5V_RAW_ID 672
+#define ADC_P1V8_RAW_ID 673
+#define ADC_P2V5_RAW_ID 674
+#define ADC_N5V_RAW_ID 675
+#define ADC_PGND_RAW_ID 676
+#define ADC_TEMPOH1A_RAW_ID 677
+#define ADC_TEMP1_RAW_ID 678
+#define ADC_TEMPOH2A_RAW_ID 679
+#define ADC_TEMPOH1B_RAW_ID 680
+#define ADC_TEMPOH3A_RAW_ID 681
+#define ADC_TEMPOH2B_RAW_ID 682
+#define ADC_TEMPOH4A_RAW_ID 683
+#define ADC_TEMPOH3B_RAW_ID 684
+#define ADC_TEMPOH4B_RAW_ID 685
+#define SEM_P15V_RAW_ID 686
+#define SEM_P30V_RAW_ID 687
+#define SEM_P5V0_RAW_ID 688
+#define SEM_P7V0_RAW_ID 689
+#define SEM_N5V0_RAW_ID 690
+#define ADC_P3V3_U_ID 691
+#define ADC_P5V_U_ID 692
+#define ADC_P1V8_U_ID 693
+#define ADC_P2V5_U_ID 694
+#define ADC_N5V_L_ID 695
+#define ADC_PGND_U_ID 696
+#define ADC_PGND_L_ID 697
+#define ADC_TEMPOH1A_U_ID 698
+#define ADC_TEMP1_U_ID 699
+#define ADC_TEMPOH2A_U_ID 700
+#define ADC_TEMPOH1B_U_ID 701
+#define ADC_TEMPOH3A_U_ID 702
+#define ADC_TEMPOH2B_U_ID 703
+#define ADC_TEMPOH4A_U_ID 704
+#define ADC_TEMPOH3B_U_ID 705
+#define ADC_TEMPOH4B_U_ID 706
+#define SEM_P15V_U_ID 707
+#define SEM_P30V_U_ID 708
+#define SEM_P5V0_U_ID 709
+#define SEM_P7V0_U_ID 710
+#define SEM_N5V0_L_ID 711
+#define HBSEMPASSWORD_ID 712
+#define HBSEMCOUNTER_ID 713
+#define ISWATCHDOGENABLED_ID 714
+#define ISSYNCHRONIZED_ID 715
+#define MISSEDMSGCNT_ID 716
+#define MISSEDPULSECNT_ID 717
+#define MILFRAMEDELAY_ID 718
+#define EL1_CHIP_ID 719
+#define EL2_CHIP_ID 720
+#define EL1_ADDR_ID 721
+#define EL2_ADDR_ID 722
+#define ERR_LOG_ENB_ID 723
+#define ISERRLOGVALID_ID 724
+#define NOFERRLOGENTRIES_ID 725
+#define MAX_SEM_PCKT_CYC_ID 726
+#define FBF_BLCK_WR_DUR_ID 727
+#define FBF_BLCK_RD_DUR_ID 728
+#define ISFBFOPEN_ID 729
+#define ISFBFVALID_ID 730
+#define FBF_ENB_ID 731
+#define FBF_CHIP_ID 732
+#define FBF_ADDR_ID 733
+#define FBFNBLOCKS_ID 734
+#define THR_MA_A_1_ID 735
+#define THR_MA_A_2_ID 736
+#define THR_MA_A_3_ID 737
+#define THR_MA_A_4_ID 738
+#define THR_MA_A_5_ID 739
+#define WCET_1_ID 740
+#define WCET_2_ID 741
+#define WCET_3_ID 742
+#define WCET_4_ID 743
+#define WCET_5_ID 744
+#define WCETAVER_1_ID 745
+#define WCETAVER_2_ID 746
+#define WCETAVER_3_ID 747
+#define WCETAVER_4_ID 748
+#define WCETAVER_5_ID 749
+#define WCETMAX_1_ID 750
+#define WCETMAX_2_ID 751
+#define WCETMAX_3_ID 752
+#define WCETMAX_4_ID 753
+#define WCETMAX_5_ID 754
+#define NOFNOTIF_1_ID 755
+#define NOFNOTIF_2_ID 756
+#define NOFNOTIF_3_ID 757
+#define NOFNOTIF_4_ID 758
+#define NOFNOTIF_5_ID 759
+#define NOFFUNCEXEC_1_ID 760
+#define NOFFUNCEXEC_2_ID 761
+#define NOFFUNCEXEC_3_ID 762
+#define NOFFUNCEXEC_4_ID 763
+#define NOFFUNCEXEC_5_ID 764
+#define WCETTIMESTAMPFINE_1_ID 765
+#define WCETTIMESTAMPFINE_2_ID 766
+#define WCETTIMESTAMPFINE_3_ID 767
+#define WCETTIMESTAMPFINE_4_ID 768
+#define WCETTIMESTAMPFINE_5_ID 769
+#define WCETTIMESTAMPCOARSE_1_ID 770
+#define WCETTIMESTAMPCOARSE_2_ID 771
+#define WCETTIMESTAMPCOARSE_3_ID 772
+#define WCETTIMESTAMPCOARSE_4_ID 773
+#define WCETTIMESTAMPCOARSE_5_ID 774
+#define FLASHCONTSTEPCNT_ID 775
+#define OTA_TM1A_NOM_ID 776
+#define OTA_TM1A_RED_ID 777
+#define OTA_TM1B_NOM_ID 778
+#define OTA_TM1B_RED_ID 779
+#define OTA_TM2A_NOM_ID 780
+#define OTA_TM2A_RED_ID 781
+#define OTA_TM2B_NOM_ID 782
+#define OTA_TM2B_RED_ID 783
+#define OTA_TM3A_NOM_ID 784
+#define OTA_TM3A_RED_ID 785
+#define OTA_TM3B_NOM_ID 786
+#define OTA_TM3B_RED_ID 787
+#define OTA_TM4A_NOM_ID 788
+#define OTA_TM4A_RED_ID 789
+#define OTA_TM4B_NOM_ID 790
+#define OTA_TM4B_RED_ID 791
+#define CORE0LOAD_ID 792
+#define CORE1LOAD_ID 793
+#define INTERRUPTRATE_ID 794
+#define CYCLICALACTIVITIESCTR_ID 795
+#define UPTIME_ID 796
+#define SEMTICK_ID 797
+#define SEMPWRONTIMESTAMP_ID 798
+#define SEMPWROFFTIMESTAMP_ID 799
+#define IASW_EVT_CTR_ID 800
+#define BAD_COPY_ID_ID 801
+#define BAD_PASTE_ID_ID 802
+#define OBCINPUTBUFFERPACKETS_ID 803
+#define GRNDINPUTBUFFERPACKETS_ID 804
+#define MILBUSBYTESIN_ID 805
+#define MILBUSBYTESOUT_ID 806
+#define MILBUSDROPPEDBYTES_ID 807
+#define IRL1_ID 808
+#define IRL1_AHBSTAT_ID 809
+#define IRL1_GRGPIO_6_ID 810
+#define IRL1_GRTIMER_ID 811
+#define IRL1_GPTIMER_0_ID 812
+#define IRL1_GPTIMER_1_ID 813
+#define IRL1_GPTIMER_2_ID 814
+#define IRL1_GPTIMER_3_ID 815
+#define IRL1_IRQMP_ID 816
+#define IRL1_B1553BRM_ID 817
+#define IRL2_ID 818
+#define IRL2_GRSPW2_0_ID 819
+#define IRL2_GRSPW2_1_ID 820
+#define SEMROUTE_ID 821
+#define SPW0BYTESIN_ID 822
+#define SPW0BYTESOUT_ID 823
+#define SPW1BYTESIN_ID 824
+#define SPW1BYTESOUT_ID 825
+#define SPW0TXDESCAVAIL_ID 826
+#define SPW0RXPCKTAVAIL_ID 827
+#define SPW1TXDESCAVAIL_ID 828
+#define SPW1RXPCKTAVAIL_ID 829
+#define MILCUCCOARSETIME_ID 830
+#define MILCUCFINETIME_ID 831
+#define CUCCOARSETIME_ID 832
+#define CUCFINETIME_ID 833
+#define SRAM1SCRCURRADDR_ID 834
+#define SRAM2SCRCURRADDR_ID 835
+#define SRAM1SCRLENGTH_ID 836
+#define SRAM2SCRLENGTH_ID 837
+#define EDACSINGLEREPAIRED_ID 838
+#define EDACSINGLEFAULTS_ID 839
+#define EDACLASTSINGLEFAIL_ID 840
+#define EDACDOUBLEFAULTS_ID 841
+#define EDACDOUBLEFADDR_ID 842
+#define CPU2PROCSTATUS_ID 843
+#define HEARTBEAT_ENABLED_ID 844
+#define S1ALLOCDBS_ID 845
+#define S1ALLOCSW_ID 846
+#define S1ALLOCHEAP_ID 847
+#define S1ALLOCFLASH_ID 848
+#define S1ALLOCAUX_ID 849
+#define S1ALLOCRES_ID 850
+#define S1ALLOCSWAP_ID 851
+#define S2ALLOCSCIHEAP_ID 852
+#define TAALGOID_ID 853
+#define TAACQALGOID_ID 854
+#define TASPARE32_ID 855
+#define TATIMINGPAR1_ID 856
+#define TATIMINGPAR2_ID 857
+#define TADISTANCETHRD_ID 858
+#define TAITERATIONS_ID 859
+#define TAREBINNINGFACT_ID 860
+#define TADETECTIONTHRD_ID 861
+#define TASEREDUCEDEXTR_ID 862
+#define TASEREDUCEDRADIUS_ID 863
+#define TASETOLERANCE_ID 864
+#define TAMVATOLERANCE_ID 865
+#define TAAMATOLERANCE_ID 866
+#define TAPOINTUNCERT_ID 867
+#define TATARGETSIG_ID 868
+#define TANROFSTARS_ID 869
+#define TAMAXSIGFRACT_ID 870
+#define TABIAS_ID 871
+#define TADARK_ID 872
+#define TASKYBG_ID 873
+#define COGBITS_ID 874
+#define CENT_MULT_X_ID 875
+#define CENT_MULT_Y_ID 876
+#define CENT_OFFSET_X_ID 877
+#define CENT_OFFSET_Y_ID 878
+#define CENT_MEDIANFILTER_ID 879
+#define CENT_DIM_X_ID 880
+#define CENT_DIM_Y_ID 881
+#define CENT_CHECKS_ID 882
+#define CEN_SIGMALIMIT_ID 883
+#define CEN_SIGNALLIMIT_ID 884
+#define CEN_MEDIAN_THRD_ID 885
+#define OPT_AXIS_X_ID 886
+#define OPT_AXIS_Y_ID 887
+#define DIST_CORR_ID 888
+#define PSTCKORDERSCI_ID 889
+#define PWINSIZEXSCI_ID 890
+#define PWINSIZEYSCI_ID 891
+#define SDPIMAGEAPTSHAPE_ID 892
+#define SDPIMAGEAPTX_ID 893
+#define SDPIMAGEAPTY_ID 894
+#define SDPIMGTTAPTSHAPE_ID 895
+#define SDPIMGTTAPTX_ID 896
+#define SDPIMGTTAPTY_ID 897
+#define SDPIMGTTSTCKORDER_ID 898
+#define SDPLOSSTCKORDER_ID 899
+#define SDPLBLKSTCKORDER_ID 900
+#define SDPLDKSTCKORDER_ID 901
+#define SDPRDKSTCKORDER_ID 902
+#define SDPRBLKSTCKORDER_ID 903
+#define SDPTOSSTCKORDER_ID 904
+#define SDPTDKSTCKORDER_ID 905
+#define SDPIMGTTSTRAT_ID 906
+#define SDP3STATAMPL_ID 907
+#define SDPPHOTSTRAT_ID 908
+#define SDPPHOTRCENT_ID 909
+#define SDPPHOTRANN1_ID 910
+#define SDPPHOTRANN2_ID 911
+#define SDPCRC_ID 912
+#define CCPRODUCT_ID 913
+#define CCSTEP_ID 914
+#define XIB_FAILURES_ID 915
+#define FEE_SIDE_A_ID 916
+#define FEE_SIDE_B_ID 917
+#define NLCBORDERS_ID 918
+#define NLCCOEFF_A_ID 919
+#define NLCCOEFF_B_ID 920
+#define NLCCOEFF_C_ID 921
+#define NLCCOEFF_D_ID 922
+#define SDPGLOBALBIAS_ID 923
+#define BIASORIGIN_ID 924
+#define SDPGLOBALGAIN_ID 925
+#define SDPWINIMAGECEKEY_ID 926
+#define SDPWINIMGTTCEKEY_ID 927
+#define SDPWINHDRCEKEY_ID 928
+#define SDPWINMLOSCEKEY_ID 929
+#define SDPWINMLBLKCEKEY_ID 930
+#define SDPWINMLDKCEKEY_ID 931
+#define SDPWINMRDKCEKEY_ID 932
+#define SDPWINMRBLKCEKEY_ID 933
+#define SDPWINMTOSCEKEY_ID 934
+#define SDPWINMTDKCEKEY_ID 935
+#define SDPFULLIMGCEKEY_ID 936
+#define SDPFULLHDRCEKEY_ID 937
+#define CE_TIMETAG_CRS_ID 938
+#define CE_TIMETAG_FINE_ID 939
+#define CE_COUNTER_ID 940
+#define CE_VERSION_ID 941
+#define CE_INTEGRITY_ID 942
+#define CE_SEMWINDOWPOSX_ID 943
+#define CE_SEMWINDOWPOSY_ID 944
+#define CE_SEMWINDOWSIZEX_ID 945
+#define CE_SEMWINDOWSIZEY_ID 946
+#define SPILL_CTR_ID 947
+#define RZIP_ITER1_ID 948
+#define RZIP_ITER2_ID 949
+#define RZIP_ITER3_ID 950
+#define RZIP_ITER4_ID 951
+#define SDPLDKCOLMASK_ID 952
+#define SDPRDKCOLMASK_ID 953
+#define FPGA_VERSION_ID 954
+#define FPGA_DPU_STATUS_ID 955
+#define FPGA_DPU_ADDRESS_ID 956
+#define FPGA_RESET_STATUS_ID 957
+#define FPGA_SEM_STATUS_ID 958
+#define FPGA_OPER_HEATER_STATUS_ID 959
+#define GIBTOTRANSFER_ID 960
+#define TRANSFERMODE_ID 961
+#define S2TOTRANSFERSIZE_ID 962
+#define S4TOTRANSFERSIZE_ID 963
+#define TRANSFERCOMPLETE_ID 964
+#define NLCBORDERS_2_ID 965
+#define NLCCOEFF_A_2_ID 966
+#define NLCCOEFF_B_2_ID 967
+#define NLCCOEFF_C_2_ID 968
+#define RF100_ID 969
+#define RF230_ID 970
+#define DISTC1_ID 971
+#define DISTC2_ID 972
+#define DISTC3_ID 973
+#define SPARE_UI_0_ID 974
+#define SPARE_UI_1_ID 975
+#define SPARE_UI_2_ID 976
+#define SPARE_UI_3_ID 977
+#define SPARE_UI_4_ID 978
+#define SPARE_UI_5_ID 979
+#define SPARE_UI_6_ID 980
+#define SPARE_UI_7_ID 981
+#define SPARE_UI_8_ID 982
+#define SPARE_UI_9_ID 983
+#define SPARE_UI_10_ID 984
+#define SPARE_UI_11_ID 985
+#define SPARE_UI_12_ID 986
+#define SPARE_UI_13_ID 987
+#define SPARE_UI_14_ID 988
+#define SPARE_UI_15_ID 989
+#define SPARE_F_0_ID 990
+#define SPARE_F_1_ID 991
+#define SPARE_F_2_ID 992
+#define SPARE_F_3_ID 993
+#define SPARE_F_4_ID 994
+#define SPARE_F_5_ID 995
+#define SPARE_F_6_ID 996
+#define SPARE_F_7_ID 997
+#define SPARE_F_8_ID 998
+#define SPARE_F_9_ID 999
+#define SPARE_F_10_ID 1000
+#define SPARE_F_11_ID 1001
+#define SPARE_F_12_ID 1002
+#define SPARE_F_13_ID 1003
+#define SPARE_F_14_ID 1004
+#define SPARE_F_15_ID 1005
+
+#endif /* CRIADATAPOOLID_H_ */
diff --git a/CrIa/src/CrIaIasw.c b/CrIa/src/CrIaIasw.c
new file mode 100644
index 0000000..947bc6a
--- /dev/null
+++ b/CrIa/src/CrIaIasw.c
@@ -0,0 +1,2967 @@
+/**
+ * @file CrIaIasw.c
+ * @ingroup CrIaIasw
+ * @authors V. Cechticky and A. Pasetti, P&P Software GmbH, 2015; R. Ottensamer and C. Reimers, Institute for Astrophysics, 2015-2016
+ * @date    September, 2016
+ *
+ * @brief Implementation of the functions provided or used by the IASW.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @defgroup CrIaIasw IASW Base Components
+ * @ingroup IASW
+ * @brief All IASW base components
+ *
+ * @defgroup CrIaConfig IASW Configuration
+ * @ingroup IASW
+ * @brief User-configurable constants and types as well as user-modifiable parameters for the IASW components
+ *
+ * @defgroup CrIaSm State Machines
+ * @ingroup IASW
+ * @brief All state machines used in the IASW
+ *
+ * @defgroup CrIaPr Procedures
+ * @ingroup IASW
+ * @brief All procedures used in the IASW except the @ref Science Procedures
+ *
+ * @defgroup CrIaServices TM/TC Services OBC/GRND
+ * @ingroup IASW
+ * @brief Services provided to OBC and Ground
+ *
+ * @defgroup CrIaServicesSem TM/TC Services SEM
+ * @ingroup IASW
+ * @brief Services provided to SEM
+ *
+ * @defgroup CrIaServicesGeneral TM/TC Services General
+ * @ingroup IASW
+ * @brief General constants, setters and getters for the TM/TC services
+ *
+ * @defgroup CrIaPrSci Science Procedures
+ * @ingroup IASW
+ * @brief All science  procedures used in the IASW
+ *
+ * Operation in science mode consists of a sequence of observations. On-board, the execution
+ * of such a sequence of observations is controlled by a Science Procedure. Thus, a science
+ * procedure is responsible for:
+ * - Bringing the SEM into the correct science mode for a certain observation
+ * - Configuring the SEM in accordance with the read-out mode required for the observation. The SEM is configured through its (220,3) and (220,11) telecommands.
+ * - Configuring the SDB in accordance with the needs of the observation.
+ * - Starting and stopping the algorithms required for the observation.
+ * - Managing the transfer of processed science data to ground.
+ * - Waiting until the observation is terminated and then, if the procedure is not yet
+ *
+ * The SemTransition variable is used to report the arrival of mode-transition events from the SEM. The variable is set in
+ * function CrSemServ5EvtNormUpdateAction in response to the reception of an event from the SEM and holds the current SEM state
+ * as reported by the event. The SemTransition variable is a global variable visible throughout the software where it is used to
+ * check whether the SEM has performed a certain state transition. The variable SemTransition is only used for the SEM state
+ * machines and corresponding procedures. It is reset to zero after it was checked in a condition and will not be used
+ * afterwards.
+ *
+ * In function CrSemServ5EvtNormUpdateAction the flags CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_[xyz]_SET are set in response to
+ * the reception of an event from the SEM. They are used to report the arrival of a mode-changing event from the SEM and is used
+ * for the SEM Mode Time-Out FdCheck. The flags are checked every cycle after the responding command (e.g. sending
+ * "GoToStabilize") was sent and the transition starts. To signal the start of an transition the flags 
+ * CMD_MODE_TRANSITION_TO_[xyz]_Flag were set. They are reset after a successfull mode-transition is reported from SEM.
+ */
+
+
+/* Includes */
+#include <CrIaIasw.h> 
+#include <CrIaPckt.h>
+#include <CrIaInCmp.h>
+
+#include <FwSmConfig.h>
+#include <FwPrConfig.h>
+#include <FwPrCore.h>
+#include <OutCmp/CrFwOutCmp.h>
+#include <IfswUtilities.h>
+
+/* FW Profile files */
+#include <FwSmConstants.h>
+
+/* State machines */
+#include "CrIaPrSm/CrIaIaswCreate.h"
+#include "CrIaPrSm/CrIaSemCreate.h"
+#include "CrIaPrSm/CrIaFdCheckCreate.h"
+#include "CrIaPrSm/CrIaSduCreate.h"
+#include "CrIaPrSm/CrIaSdbCreate.h"
+#include "CrIaPrSm/CrIaAlgoCreate.h"
+
+/* Procedures */
+#include "CrIaPrSm/CrIaNomSciCreate.h"
+#include "CrIaPrSm/CrIaAcqFullDropCreate.h"
+#include "CrIaPrSm/CrIaCalFullSnapCreate.h"
+#include "CrIaPrSm/CrIaSciWinCreate.h"
+#include "CrIaPrSm/CrIaPrepSciCreate.h"
+#include "CrIaPrSm/CrIaSciDataUpdCreate.h"
+#include "CrIaPrSm/CrIaSaveImagesCreate.h"
+#include "CrIaPrSm/CrIaTransferFbfToGroundCreate.h"
+#include "CrIaPrSm/CrIaCentAlgoCreate.h"
+#include "CrIaPrSm/CrIaAcquAlgoExecCreate.h"
+#include "CrIaPrSm/CrIaCmprAlgoExecCreate.h"
+#include "CrIaPrSm/CrIaCentValProcCreate.h"
+#include "CrIaPrSm/CrIaSaaEvalAlgoExecCreate.h"
+#include "CrIaPrSm/CrIaSdsEvalAlgoExecCreate.h"
+#include "CrIaPrSm/CrIaTTC1Create.h"
+#include "CrIaPrSm/CrIaTTC2Create.h"
+#include "CrIaPrSm/CrIaFbfLoadCreate.h"
+#include "CrIaPrSm/CrIaFbfSaveCreate.h"
+#include "CrIaPrSm/CrIaSemInitCreate.h"
+#include "CrIaPrSm/CrIaSemShutdownCreate.h"
+#include "CrIaPrSm/CrIaCtrldSwitchOffCreate.h"
+#include "CrIaPrSm/CrIaSemAnoEvtRPCreate.h"
+#include "CrIaPrSm/CrIaHbSemMonCreate.h"
+#include "CrIaPrSm/CrIaSemConsCheckCreate.h"
+
+/* Common framework files */
+#include <CrFwTime.h>
+#include <Pckt/CrFwPckt.h>
+#include <BaseCmp/CrFwBaseCmp.h>
+#include <UtilityFunctions/CrFwUtilityFunctions.h>
+
+/* InStream */
+#include <InLoader/CrFwInLoader.h>
+#include <InStream/CrFwInStream.h>
+#include <InFactory/CrFwInFactory.h>
+#include <InManager/CrFwInManager.h>
+#include <InRegistry/CrFwInRegistry.h>
+
+/* OutStream */
+#include <OutLoader/CrFwOutLoader.h>
+#include <OutStream/CrFwOutStream.h>
+#include <OutFactory/CrFwOutFactory.h>
+#include <OutManager/CrFwOutManager.h>
+#include <OutRegistry/CrFwOutRegistry.h>
+
+/* Auxiliary functions */
+#include <Aux/CrFwAux.h>
+#include <OutFactory/CrFwOutFactory.h>
+
+/* has ResetEventCounts() */
+#include <Services/CrIaServ5EventReportingService/OutRep/CrIaServ5Event.h>
+
+/* endianess treatment */
+#include <byteorder.h>
+
+/* bcc library functions */
+#include <string.h>
+#include <stdlib.h>
+
+#if (__sparc__)
+#include <asm/leon.h> /* for leon3_cpuid() */
+#include <wrap_malloc.h> /* for SRAM2_SDB_ADDR */
+#include <error_log.h> /* for ERROR_LOG_INFO_SIZE */
+#include <ibsw_interface.h>
+#include <iwf_fpga.h>
+#include "../../ifsw.h" /* cpu1_notification */
+#else
+#include <sys/ipc.h> /* for shared memory */
+#include <sys/shm.h> /* for shared memory */
+#endif
+
+#ifdef PC_TARGET
+#include <stdio.h>
+#include <time.h>
+#include <unistd.h>
+#include <errno.h>
+#include <signal.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <arpa/inet.h>
+#include <pthread.h>
+#define OBC_ENDPOINT_FOR_IASW "127.0.0.1:5572"
+#define IASW_ENDPOINT_FOR_SEM "127.0.0.1:5573"
+#endif /* PC_TARGET */
+
+/* DataPool */
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+/* Services */
+#include <Services/General/CrIaConstants.h>
+#include <Services/General/CrSemConstants.h>
+#include <Services/General/CrIaParamSetter.h>
+
+/* SEM Events */
+#include <CrIaSemEvents.h>
+
+#include <Services/CrIaServ5EventReportingService/OutRep/CrIaServ5Event.h>
+
+#include <IfswDebug.h>
+
+#include <ScienceDataProcessing.h> /* for CrIaSib */
+ 
+#ifdef PC_TARGET
+#include <TargetAcquisition.h>
+#endif
+
+/* global variables */
+static int IASW_initialised;
+unsigned int milFrameDelay = 20000; /* is updated cyclically from the DP */
+unsigned short SemTransition = 0; /* needed by SemFunc and SemOperFunc */
+FwSmBool_t semShutdownProcTerminated = 0; /* needed by SemFunc */
+unsigned short SemHkIaswStateExecCnt = 0; /* needed by FdCheckFunc and InRep/CrSemServ3DatHk */
+FwSmBool_t flagDelayedSemHkPacket = 0; /* needed by FdCheckFunc and SemFunc */
+FwSmBool_t signalSemStateStandby = 1; /* needed by CrSemServ5EvtNorm and SemFunc */
+unsigned int warnLimitDefCnt, alarmLimitDefCnt; /* needed for FdCheckFunc and InRep/CrSemServ3DatHk */
+unsigned int warnLimitExtCnt, alarmLimitExtCnt; /* needed for FdCheckFunc and InRep/CrSemServ3DatHk */
+unsigned int semAliveStatusDefCnt, semAliveStatusExtCnt; /* needed by FdCheckFunc and InRep/CrSemServ3DatHk */
+unsigned short SemAnoEvtId; /* needed by FdCheck */
+unsigned int *sibAddressFull = NULL; /* needed by CrIaSdbFunc */
+unsigned int *cibAddressFull = NULL;
+unsigned int *gibAddressFull = NULL;
+unsigned int *sibAddressWin = NULL;
+unsigned int *cibAddressWin = NULL;
+unsigned int *gibAddressWin = NULL;
+
+unsigned int *sdb_address_orig;
+unsigned int *res_address_orig;
+unsigned int *aux_address_orig;
+unsigned int *swap_address_orig; 
+unsigned long int sdb_offset; /* the address is also offset */
+unsigned long int res_offset; /* the address is also offset */
+unsigned long int aux_offset; /* the address is also offset */
+unsigned long int swap_offset; /* the address is also offset */
+unsigned int *sdb_address_mod; /* the address we use is 1 kiB aligned and offset */
+unsigned int *res_address_mod; /* the address we use is 1 kiB aligned and offset */
+unsigned int *aux_address_mod; /* the address we use is 1 kiB aligned and offset */
+unsigned int *swap_address_mod; /* the address we use is 1 kiB aligned and offset */
+
+#if (__sparc__)
+struct CrIaSib incomingSibInStruct; /* needed for S21 input buffering */
+struct CrIaSib outgoingSibInStruct; /* needed for Centroiding and Acquisition */
+#else
+struct CrIaSib *ShmIncomingSibInPTR; /* shared memory for fork() */
+struct CrIaSib *ShmOutgoingSibInPTR; /* shared memory for fork() */
+#endif /* (__sparc__) */
+
+unsigned int   S21LastAcqId = 0xffffffff;
+unsigned short S21LastPacketNum = 0;
+unsigned char  S21_Flag1 = 0;
+unsigned char  signal_Ta = 0;
+unsigned char  S196Flag = 0;
+
+static unsigned int LoggedEntries = 0;
+
+struct IaswEvent {
+  CrFwServSubType_t SubType;
+  unsigned short used; /* NOTE: make sure this is initialized to 0 */
+  unsigned short evtId;
+  unsigned short evtData[2]; /* all of our events have a DataSize of 4 bytes */
+  unsigned int DataSize;  
+} ;
+
+static struct IaswEvent IbswEvents[ERR_LOG_N3];
+
+static struct IaswEvent SdpEvents[ERR_LOG_N3];
+
+/* Prototypes */
+#ifdef PC_TARGET
+int ShmSdbAddressOrigID;
+int ShmResAddressOrigID;
+int ShmAuxAddressOrigID;
+int ShmSwapAddressOrigID;
+unsigned int *ShmRequestAcquisitionPTR; /* shared memory for fork() */
+unsigned int *ShmRequestCompressionPTR; /* shared memory for fork() */
+static void *accept_connections(void *ptr);
+static int setupConnection(const char* url);
+static void shutdownSocket(int socket);
+void pollConnectionSem();
+static void pollConnectionMil();
+static void debugPacket(char* pckt, size_t size);
+static CrFwBool_t socketSendPackageOnExistingConnection(int fdType, CrFwPckt_t pckt);
+static CrFwBool_t socketSendPackageOnNewConnection(CrFwPckt_t pckt, const char* url);
+static CrFwPckt_t socketReceivePackage(int fdType);
+static CrFwBool_t socketCheckPackageAvailable(int fdType);
+static int socketConnectPoll(const char* url);
+static void reRouteCnC(CrFwPckt_t pckt);
+#endif /* PC_TARGET */
+
+void InsertCrc(CrFwPckt_t pckt);
+void CrIaLoadHeartbeatReport();
+void CrIaLoadPredefinedHousekeeping();
+void CrIaLoadSemTimeCmd();
+
+void pollConnectionSem();
+static void pollConnectionMil();
+
+static void printPackageInfo(CrFwPckt_t pckt);
+
+#ifdef PC_TARGET
+static unsigned int PcSemCycleCount;
+static int PcSemCollPckt;
+static int PcMilUsed;
+static int PcCycCount;
+static int socketObc, socketSem;
+static int socketConnectPoll(const char* url);
+static int fdSem;
+pthread_t th_obc, th_sem;
+void cpu_relax(void) { /* PC stub */ }
+#endif /* PC_TARGET */
+
+FwSmDesc_t inStreamSem; /* global variable used by SEM Unit State Machine */
+static FwSmDesc_t inStreamObc, inStreamGrd;
+
+/* global handles for the state machines */
+FwSmDesc_t smDescSem, smDescIasw;
+FwSmDesc_t smDescFdTelescopeTempMonitorCheck, smDescFdIncorrectSDSCntrCheck, smDescFdSemCommErrCheck;
+FwSmDesc_t smDescFdSemModeTimeOutCheck, smDescFdSemSafeModeCheck, smDescFdSemAliveCheck;
+FwSmDesc_t smDescFdSemAnomalyEventCheck, smDescFdSemLimitCheck, smDescFdDpuHousekeepingCheck;
+FwSmDesc_t smDescFdCentroidConsistencyCheck, smDescFdResourceCheck, smDescFdSemModeConsistencyCheck;
+FwSmDesc_t smDescSdu2, smDescSdu4;
+FwSmDesc_t smDescSdb;
+FwSmDesc_t smDescAlgoCent0, smDescAlgoCent1, smDescAlgoTtc1, smDescAlgoTtc2, smDescAlgoAcq1, smDescAlgoCmpr, smDescAlgoSaaEval, smDescAlgoSdsEval;
+FwSmDesc_t algoSm[MAX_ID_ALGO];
+
+/* global handles for the procedures */
+FwPrDesc_t prDescNomSci, prDescAcqFullDrop, prDescCalFullSnap, prDescSciStack;
+FwPrDesc_t prDescPrepSci, prDescSciDataUpd, prDescSaveImages, prDescTransferFbfToGround;
+FwPrDesc_t prDescCentAlgo, prDescAcq1AlgoExec, prDescCmprAlgoExec, prDescTtc1aft, prDescTtc1front, prDescTtc2aft, prDescTtc2front;
+FwPrDesc_t prDescFbfLoad, prDescFbfSave;
+FwPrDesc_t prDescCentVal, prDescSaaEval, prDescSdsEval;
+FwPrDesc_t prDescSemInit, prDescSemShutdown, prDescCtrldSwitchOffIasw;
+FwPrDesc_t prDescSemAnoEvtRP, prDescHbSemMon, prDescSemModeConsistencyCheck;
+FwPrDesc_t procPr[MAX_ID_PROC];
+
+/* global handles for TM/TCs */
+FwSmDesc_t smDescSemTimeCmd;
+
+/* global handles For FdCheck */
+unsigned int fdSemCommErrCnt;
+
+/* in v09 we need a global handle for the S21,3 pckt to replace the SetData/GetData mechanism */
+CrFwPckt_t S21SemPacket; /* (char *) */ 
+
+unsigned short evtDataRep[2];
+
+#if (__sparc__)
+static unsigned int routing_status;
+#endif
+
+#ifdef PC_TARGET
+struct th_arg
+{
+  int *sock_fd;
+  int *conn_fd;
+};
+
+struct th_arg arg_obc, arg_sem;
+#endif /* PC_TARGET */
+
+
+#ifdef PC_TARGET
+void fpga_heater_on(enum heater __attribute__((unused)) h) { /* PC stub */ }
+void fpga_heater_off(enum heater __attribute__((unused)) h) { /* PC stub */ }
+#endif /* PC_TARGET */
+
+
+#ifdef PC_TARGET
+unsigned short cpu1_notification (unsigned short action)
+{
+  /*return action;*/
+  CRIA_UNUSED(action);
+  return SDP_STATUS_IDLE;
+}
+#endif /* PC_TARGET */
+
+
+#ifdef PC_TARGET
+/**
+ *  * handle partial transmissions
+ *   */
+static int send_all(int sockfd, char *buf, int len)
+{
+  int n;
+
+  while(len)
+    {
+      n = send(sockfd, buf, len, 0);
+      if (n == -1)
+        {
+          perror("send_all");
+          return len;
+        }
+      len -= n;
+      buf += n;
+    }
+
+  return len;
+}
+#endif /* PC_TARGET */
+
+
+#ifdef PC_TARGET
+void sigint_handler(int s __attribute__((unused)))
+{
+  pthread_cancel(th_sem);
+
+  if(fdSem)
+    close(fdSem);
+  if(socketObc)
+    close(socketObc);
+  if(socketSem)
+    close(socketSem);
+
+  DEBUGP("\nExiting\n");
+  exit(EXIT_SUCCESS);	/* that's debatable */
+
+  return;
+}
+#endif /* PC_TARGET */
+
+
+#ifdef PC_TARGET
+void setupConnections()
+{
+  int err;
+
+  socketSem  = setupConnection(IASW_ENDPOINT_FOR_SEM);
+
+  if((err = pthread_create(&th_sem, NULL, accept_connections, &arg_sem)))
+    {
+      DEBUGP("Epic fail in pthread_create: %s\n", strerror(err));
+      exit(EXIT_FAILURE);
+    }
+
+  arg_sem.sock_fd = &socketSem;
+  arg_sem.conn_fd = &fdSem;
+
+  socketObc = socketConnectPoll(OBC_ENDPOINT_FOR_IASW);
+  DEBUGP("Socket connection established to: %s\n", OBC_ENDPOINT_FOR_IASW);
+
+  return;
+}
+#endif /* PC_TARGET */
+
+
+#ifdef PC_TARGET
+void shutdownConnections()
+{
+  shutdownSocket(socketObc);
+  shutdownSocket(socketSem);
+
+  return;
+}
+#endif /* PC_TARGET */
+
+
+/* PC FBF Stubs */
+#ifdef PC_TARGET
+int CrIbFlashIsReady(void) {return 1; /* stub */}
+void CrIbFbfClose(unsigned char __attribute__((unused)) fbf){/* stub */}
+void CrIbFbfOpen(unsigned char __attribute__((unused)) fbf){/* stub */}
+int CrIbFlashTriggerWrite(unsigned char __attribute__((unused)) fbf, unsigned int __attribute__((unused)) *mem){return 0; /* stub */}
+int CrIbFlashTriggerRead(unsigned char __attribute__((unused)) fbf, unsigned short __attribute__((unused)) block, unsigned int __attribute__((unused)) *mem){return 0; /* stub */}
+unsigned int flash_gen_logical_addr(unsigned int __attribute__((unused)) block, unsigned int __attribute__((unused)) page, unsigned int __attribute__((unused)) offset){return 0; /* stub */}
+#endif /* PC_TARGET */
+
+
+/* these need to be global to enable the CrIaOutStreamConnectionAvail() in the cyc activities */
+FwSmDesc_t outStreamSem, outStreamObc, outStreamGrd;
+
+
+/**
+ * @brief IASW Initialization Function implementing all initialization actions for the IASW
+ *
+ * - instantiate and start all IASW state machines needed by the IASW
+ * - instantiate all IASW procedures needed by the IASW
+ * - instantiate and initialize all IASW data structures
+ * - load the predefined housekeeping reports and the heartbeat report
+ * - start the SDS Evaluation Algorithm
+ * - start the TTC Algorithms
+ * - initialize the buildNumber variable in the data pool
+ *
+ * @note Ready Check Procedure of the predefined housekeeping reports is not used
+ * @note Watchdog Reset Procedure is not used
+ *
+ * @param none
+ */
+int CrIaInit()
+{
+  FwSmDesc_t fwCmp[CR_IA_NOF_FW_CMP];
+  int i, i_algo;
+  unsigned int buildNumber;
+  unsigned char FdCheckDpuHousekeepingIntEn, FdCheckResourceIntEn;
+		
+#ifdef PC_TARGET
+  PcCycCount = 0;
+#endif /* PC_TARGET */
+
+  /* 
+     NOTE: If we wanted to test the RAM EDAC, we would instrument the code 
+     here like this:
+
+     CrIbInjectFault(1,3,(void *)SRAM1_FLASH_ADDR);
+     CrIbInjectFault(1,2,(void *)(SRAM1_FLASH_ADDR + 40*4096));
+  */
+  
+  /**
+   * N1: Instantiate the Data Pool
+   */
+
+  /* set LTbl init for Crc to 0 */
+  LTblInit = 0;
+	
+  /* clear all SEM event flags */
+  CrIaClearSemEventFlags();
+
+  /* reset the V09+ event filter */
+  ResetEventCounts();
+
+  /* insert the build number into the data pool */
+  buildNumber = BUILD;
+  CrIaPaste(BUILDNUMBER_ID, &buildNumber);
+	
+  /**
+   * N2: Instantiate all IASW-Specific Components, like all the state machines
+   */
+  DEBUGP("### CrIaInit ### Instantiate all IASW-Specific Components\n");
+
+  /********************/
+  /* SDB Structure SM */
+  /********************/
+
+  /* due to the 16 bit sib, cib, gib pointers, we need special measures
+     to manage the SDB */
+#if (__sparc__)
+  sdb_address_orig = (unsigned int *)SRAM2_SDB_ADDR;
+  res_address_orig = (unsigned int *)SRAM1_RES_ADDR;
+  aux_address_orig = (unsigned int *)SRAM1_AUX_ADDR;
+  swap_address_orig = (unsigned int *)SRAM1_SWAP_ADDR;
+#else
+  /* on the PC we simulate the SRAM2 SDB with a 32 MiB buffer in a shared memory */
+  ShmSdbAddressOrigID = shmget(IPC_PRIVATE, 32*1024*1024, IPC_CREAT | 0666);
+  ShmResAddressOrigID = shmget(IPC_PRIVATE, 6*1024*1024, IPC_CREAT | 0666);
+  ShmAuxAddressOrigID = shmget(IPC_PRIVATE, 4*1024*1024, IPC_CREAT | 0666);
+  ShmSwapAddressOrigID = shmget(IPC_PRIVATE, 6*1024*1024, IPC_CREAT | 0666);
+
+  sdb_address_orig = (unsigned int *) shmat(ShmSdbAddressOrigID,  NULL, 0);
+  res_address_orig = (unsigned int *) shmat(ShmResAddressOrigID,  NULL, 0);
+  aux_address_orig = (unsigned int *) shmat(ShmAuxAddressOrigID,  NULL, 0);  
+  swap_address_orig = (unsigned int *) shmat(ShmSwapAddressOrigID,  NULL, 0);  
+#endif /* __sparc__ */
+
+  /* align the address to 1 kiB */
+  sdb_address_mod = (unsigned int *)((((unsigned int)sdb_address_orig) + 1023) & 0xFFFFFC00);
+  res_address_mod = (unsigned int *)((((unsigned int)res_address_orig) + 1023) & 0xFFFFFC00);
+  aux_address_mod = (unsigned int *)((((unsigned int)aux_address_orig) + 1023) & 0xFFFFFC00);
+  swap_address_mod = (unsigned int *)((((unsigned int)swap_address_orig) + 1023) & 0xFFFFFC00);
+
+  /* the address shifted by 10 is still larger than 16 bit, so we need a local offset */
+  sdb_offset = (unsigned int)sdb_address_mod;
+  res_offset = (unsigned int)res_address_mod;
+  aux_offset = (unsigned int)aux_address_mod;
+  swap_offset = (unsigned int)swap_address_mod; 
+
+	
+  smDescSdb = CrIaSdbCreate(NULL);
+  if (FwSmCheckRec(smDescSdb) != smSuccess)
+    {
+      DEBUGP("SDB SM is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  DEBUGP("# Start SDB SM ...\n");
+  FwSmStart(smDescSdb);                 
+
+  /********************/
+  /*     SDU SMs      */
+  /********************/
+  smDescSdu2 = CrIaSduCreate(NULL);
+  if (FwSmCheckRec(smDescSdu2) != smSuccess)
+    {
+      DEBUGP("SDU2 SM is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  DEBUGP("# Start SDU2 SM ...\n");
+  FwSmStart(smDescSdu2);                 
+    
+  smDescSdu4 = CrIaSduCreate(NULL);
+  if (FwSmCheckRec(smDescSdu4) != smSuccess)
+    {
+      DEBUGP("SDU4 SM is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  DEBUGP("# Start SDU4 SM ...\n");
+  FwSmStart(smDescSdu4);                 
+  
+  /********************/
+  /*  FD Check SMs    */
+  /********************/
+  
+  /* Instantiation of State Machine for FdCheck Telescope Temperature Monitor */
+  smDescFdTelescopeTempMonitorCheck = CrIaFdCheckCreate(NULL);
+  if (FwSmCheckRec(smDescFdTelescopeTempMonitorCheck) != smSuccess)
+    {
+      DEBUGP("The state machine CrIaFdCheck for Telescope Temperature Monitor is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  FwSmStart(smDescFdTelescopeTempMonitorCheck);
+
+  /** Instantiation of State Machine for FdCheck Incorrect Science Data Sequence Counter */
+  smDescFdIncorrectSDSCntrCheck = CrIaFdCheckCreate(NULL);
+  if (FwSmCheckRec(smDescFdIncorrectSDSCntrCheck) != smSuccess)
+    {
+      DEBUGP("The state machine CrIaFdCheck for Incorrect Science Data Sequence Counter is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  FwSmStart(smDescFdIncorrectSDSCntrCheck);
+
+  /** Instantiation of State Machine for FdCheck SEM Communication Error */
+  smDescFdSemCommErrCheck = CrIaFdCheckCreate(NULL);
+  if (FwSmCheckRec(smDescFdSemCommErrCheck) != smSuccess)
+    {
+      DEBUGP("The state machine CrIaFdCheck for SEM Communication Error is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  FwSmStart(smDescFdSemCommErrCheck);
+
+  /** Instantiation of State Machine for FdCheck SEM Mode Time-Out */
+  smDescFdSemModeTimeOutCheck = CrIaFdCheckCreate(NULL);
+  if (FwSmCheckRec(smDescFdSemModeTimeOutCheck) != smSuccess)
+    {
+      DEBUGP("The state machine CrIaFdCheck for SEM Mode Time-Out is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  FwSmStart(smDescFdSemModeTimeOutCheck);
+
+  /* SEM Safe Mode */
+  smDescFdSemSafeModeCheck = CrIaFdCheckCreate(NULL);
+  if (FwSmCheckRec(smDescFdSemSafeModeCheck) != smSuccess)
+    {
+      DEBUGP("The state machine CrIaFdCheck for SEM Safe Mode Check is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  FwSmStart(smDescFdSemSafeModeCheck);
+  
+  /* SEM Alive Check */
+  smDescFdSemAliveCheck = CrIaFdCheckCreate(NULL);
+  if (FwSmCheckRec(smDescFdSemAliveCheck) != smSuccess)
+    {
+      DEBUGP("The state machine CrIaFdCheck for SEM Alive Check is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  FwSmStart(smDescFdSemAliveCheck);
+  
+  /** Instantiation of State Machine for FdCheck SEM Anomaly Event */
+  smDescFdSemAnomalyEventCheck = CrIaFdCheckCreate(NULL);
+  if (FwSmCheckRec(smDescFdSemAnomalyEventCheck) != smSuccess)
+    {
+      DEBUGP("The state machine CrIaFdCheck for SEM Anomaly Event is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  FwSmStart(smDescFdSemAnomalyEventCheck);
+
+  /** Instantiation of State Machine for FdCheck SEM Limit Check */
+  smDescFdSemLimitCheck = CrIaFdCheckCreate(NULL);
+  if (FwSmCheckRec(smDescFdSemLimitCheck) != smSuccess)
+    {
+      DEBUGP("The state machine CrIaFdCheck for SEM Limit Check is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  FwSmStart(smDescFdSemLimitCheck);
+
+  /** Instantiation of State Machine for FdCheck DPU Housekeeping Check */
+  smDescFdDpuHousekeepingCheck = CrIaFdCheckCreate(NULL);
+  if (FwSmCheckRec(smDescFdDpuHousekeepingCheck) != smSuccess)
+    {
+      DEBUGP("The state machine CrIaFdCheck for DPU Housekeeping Check is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  FwSmStart(smDescFdDpuHousekeepingCheck);
+  /* Enable DPU housekeeping FdCheck */
+  FdCheckDpuHousekeepingIntEn = 1;
+  CrIaPaste(FDCHECKDPUHKINTEN_ID, &FdCheckDpuHousekeepingIntEn);
+
+  /** Instantiation of State Machine for FdCheck Centroid Consistency Check */
+  smDescFdCentroidConsistencyCheck = CrIaFdCheckCreate(NULL);
+  if (FwSmCheckRec(smDescFdCentroidConsistencyCheck) != smSuccess)
+    {
+      DEBUGP("The state machine CrIaFdCheck for Centroid Consistency Check is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  FwSmStart(smDescFdCentroidConsistencyCheck);
+
+  /** Instantiation of State Machine for FdCheck Resource Check */
+  smDescFdResourceCheck = CrIaFdCheckCreate(NULL);
+  if (FwSmCheckRec(smDescFdResourceCheck) != smSuccess)
+    {
+      DEBUGP("The state machine CrIaFdCheck for Resource Check is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  FwSmStart(smDescFdResourceCheck);
+  /* Enable Resource FdCheck */
+  FdCheckResourceIntEn = 1;
+  CrIaPaste(FDCHECKRESINTEN_ID, &FdCheckResourceIntEn);
+
+  /** Instantiation of State Machine for FdCheck SEM Mode Consistency Check */
+  smDescFdSemModeConsistencyCheck = CrIaFdCheckCreate(NULL);
+  if (FwSmCheckRec(smDescFdSemModeConsistencyCheck) != smSuccess)
+    {
+      DEBUGP("The state machine CrIaFdCheck for SEM Mode Consistency Check is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  FwSmStart(smDescFdSemModeConsistencyCheck);
+
+  /********************/
+  /*  Save Images Pr  */
+  /********************/
+  prDescSaveImages = CrIaSaveImagesCreate(NULL);
+  if (FwPrCheck(prDescSaveImages) != prSuccess)
+    {
+      DEBUGP("Save Images PR is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  
+  /*****************************/
+  /* Transfer Fbf To Ground Pr */
+  /*****************************/
+  prDescTransferFbfToGround = CrIaTransferFbfToGroundCreate(NULL);
+  if (FwPrCheck(prDescTransferFbfToGround) != prSuccess)
+    {
+      DEBUGP("Transfer Fbf To Ground PR is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  
+  /********************/
+  /*  Nom Science Pr  */
+  /********************/
+  prDescNomSci = CrIaNomSciCreate(NULL);
+  if (FwPrCheck(prDescNomSci) != prSuccess)
+    {
+      DEBUGP("Nominal Science PR is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  
+  /********************/
+  /* Acq Full Drop Pr */
+  /********************/
+  prDescAcqFullDrop = CrIaAcqFullDropCreate(NULL);
+  if (FwPrCheck(prDescAcqFullDrop) != prSuccess)
+    {
+      DEBUGP("Acquire Full Drop PR is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  
+  /********************/
+  /* Cal Full Snap Pr */
+  /********************/
+  prDescCalFullSnap = CrIaCalFullSnapCreate(NULL);
+  if (FwPrCheck(prDescCalFullSnap) != prSuccess)
+    {
+      DEBUGP("Calibrate Full Snap PR is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  
+  /********************/
+  /* Science Stack Pr */
+  /********************/
+  prDescSciStack = CrIaSciWinCreate(NULL);
+  if (FwPrCheck(prDescSciStack) != prSuccess)
+    {
+      DEBUGP("Science Stack PR is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  
+  /********************/
+  /*  PreScience Pr   */
+  /********************/
+  prDescPrepSci = CrIaPrepSciCreate(NULL);
+  if (FwPrCheck(prDescPrepSci) != prSuccess)
+    {
+      DEBUGP("Prepare Science PR is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  
+  /********************/
+  /*   CentAlgo  Pr   */
+  /********************/
+  prDescCentAlgo = CrIaCentAlgoCreate(NULL);
+  if (FwPrCheck(prDescCentAlgo) != prSuccess)
+    {
+      DEBUGP("Cent Algo PR is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  
+  /********************/
+  /* Acq1Algo Exec Pr */
+  /********************/
+  prDescAcq1AlgoExec = CrIaAcquAlgoExecCreate(NULL);
+  if (FwPrCheck(prDescAcq1AlgoExec) != prSuccess)
+    {
+      DEBUGP("Acq1 Algo Exec PR is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  
+  /********************/
+  /* CmprAlgo Exec Pr */
+  /********************/
+  prDescCmprAlgoExec = CrIaCmprAlgoExecCreate(NULL);
+  if (FwPrCheck(prDescCmprAlgoExec) != prSuccess)
+    {
+      DEBUGP("Cmpr Algo Exec PR is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  
+  /********************/
+  /*  TTC1 Pr         */
+  /********************/
+  prDescTtc1aft = CrIaTTC1Create(NULL);
+  if (FwPrCheck(prDescTtc1aft) != prSuccess)
+    {
+      DEBUGP("TTC1 PR for aft thermistors/heaters is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  prDescTtc1front = CrIaTTC1Create(NULL);
+  if (FwPrCheck(prDescTtc1front) != prSuccess)
+    {
+      DEBUGP("TTC1 PR for front thermistors/heaters is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+
+  /********************/
+  /*  TTC2 Pr         */
+  /********************/
+  prDescTtc2aft = CrIaTTC2Create(NULL);
+  if (FwPrCheck(prDescTtc2aft) != prSuccess)
+    {
+      DEBUGP("TTC2 PR for aft thermistors/heaters is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  prDescTtc2front = CrIaTTC2Create(NULL);
+  if (FwPrCheck(prDescTtc2front) != prSuccess)
+    {
+      DEBUGP("TTC2 PR for front thermistors/heaters is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  
+  /********************/
+  /*   Fbf Pr's       */
+  /********************/
+  prDescFbfLoad = CrIaFbfLoadCreate(NULL);
+  if (FwPrCheck(prDescFbfLoad) != prSuccess) 
+    {
+      DEBUGP("FBF Load PR is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  prDescFbfSave = CrIaFbfSaveCreate(NULL);
+  if (FwPrCheck(prDescFbfSave) != prSuccess) 
+    {
+      DEBUGP("FBF Save PR is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  
+  /* initialize procedure descriptors in an array */ 
+  procPr[CRIA_SERV198_SAVE_IMG_PR-1] = prDescSaveImages;
+  procPr[CRIA_SERV198_ACQ_FULL_DROP-1] = prDescAcqFullDrop;
+  procPr[CRIA_SERV198_CAL_FULL_SNAP-1] = prDescCalFullSnap;
+  procPr[CRIA_SERV198_FBF_LOAD_PR-1] = prDescFbfLoad;
+  procPr[CRIA_SERV198_FBF_SAVE_PR-1] = prDescFbfSave;
+  procPr[CRIA_SERV198_SCI_STACK_PR-1] = prDescSciStack;
+  procPr[CRIA_SERV198_FBF_TO_GND_PR-1] = prDescTransferFbfToGround;
+  procPr[CRIA_SERV198_NOM_SCI_PR-1] = prDescNomSci;
+  procPr[CRIA_SERV198_CONFIG_SDB_PR-1] = NULL; /* this procedure is instantaneous */
+
+  /********************/
+  /*   Validity Pr's  */
+  /********************/
+  prDescCentVal = CrIaCentValProcCreate(NULL);
+  if (FwPrCheck(prDescCentVal) != prSuccess) 
+    {
+      DEBUGP("Centroid Validity PR is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+
+  prDescSaaEval = CrIaSaaEvalAlgoExecCreate(NULL);
+  if (FwPrCheck(prDescSaaEval) != prSuccess) 
+    {
+      DEBUGP("SAA Evaluation PR is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+
+  prDescSdsEval = CrIaSdsEvalAlgoExecCreate(NULL);
+  if (FwPrCheck(prDescSdsEval) != prSuccess) 
+    {
+      DEBUGP("SDS Evaluation PR is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  
+  /********************/
+  /*   SEM Init Pr    */
+  /********************/
+  prDescSemInit = CrIaSemInitCreate(NULL);
+  if (FwPrCheck(prDescSemInit) != prSuccess) {
+    DEBUGP("The procedure CrIaSemInit is NOT properly configured ... FAILURE\n");
+    return EXIT_FAILURE;
+  }
+  
+  /********************/
+  /* SEM Shutdown Pr  */
+  /********************/
+  prDescSemShutdown = CrIaSemShutdownCreate(NULL);
+  if (FwPrCheck(prDescSemShutdown) != prSuccess)
+    {
+      DEBUGP("The procedure CrIaSemShutdown is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+
+  /***********************/
+  /* Ctrld Switch Off Pr */
+  /***********************/
+  prDescCtrldSwitchOffIasw = CrIaCtrldSwitchOffCreate(NULL);
+  if (FwPrCheck(prDescCtrldSwitchOffIasw) != prSuccess)
+    {
+      DEBUGP("The procedure CrIaCtrldSwitchOff is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+
+  /************************/
+  /* SEM Anomaly Event Pr */
+  /************************/
+  prDescSemAnoEvtRP = CrIaSemAnoEvtRPCreate(NULL);
+  if (FwPrCheck(prDescSemAnoEvtRP) != prSuccess)
+    {
+      DEBUGP("The procedure CrIaSemAnoEvtRP is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+
+  /********************/
+  /*   SEM Unit SM    */
+  /********************/
+  /** Define the state machine descriptor (SMD) */
+  smDescSem = CrIaSemCreate(NULL);
+  
+  /** Check that the SM is properly configured */
+  if (FwSmCheckRec(smDescSem) != smSuccess)
+    {
+      DEBUGP("The SEM state machine is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  else
+    {
+      DEBUGP("The SEM state machine is properly configured ... SUCCESS\n");
+    }
+  /** Start the SM */
+  DEBUGP("# Start SEM State Machine ...\n");
+  FwSmStart(smDescSem);                  /* -> enters state OFF */
+  
+  /********************/
+  /*    Algo SMs      */
+  /********************/
+  smDescAlgoCent0 = CrIaAlgoCreate(NULL);
+  if (FwSmCheckRec(smDescAlgoCent0) != smSuccess)
+    {
+      DEBUGP("The state machine CrIaAlgo for Cent0 is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  else
+    {
+      DEBUGP("The state machine CrIaAlgo for Cent0 is properly configured ... SUCCESS\n");
+    }
+  /** Start the SM */
+  FwSmStart(smDescAlgoCent0);
+
+  smDescAlgoCent1 = CrIaAlgoCreate(NULL);
+  if (FwSmCheckRec(smDescAlgoCent1) != smSuccess)
+    {
+      DEBUGP("The state machine CrIaAlgo for Cent1 is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  else
+    {
+      DEBUGP("The state machine CrIaAlgo for Cent1 is properly configured ... SUCCESS\n");
+    }
+  /** Start the SM */
+  FwSmStart(smDescAlgoCent1);
+  
+  smDescAlgoTtc1 = CrIaAlgoCreate(NULL);
+  if (FwSmCheckRec(smDescAlgoTtc1) != smSuccess)
+    {
+      DEBUGP("The state machine CrIaAlgo for Ttc1 is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  else {
+    DEBUGP("The state machine CrIaAlgo for Ttc1 is properly configured ... SUCCESS\n");
+  }
+  /** Start the SM */
+  FwSmStart(smDescAlgoTtc1);
+
+  smDescAlgoTtc2 = CrIaAlgoCreate(NULL);
+  if (FwSmCheckRec(smDescAlgoTtc2) != smSuccess)
+    {
+      DEBUGP("The state machine CrIaAlgo for Ttc2 is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  else {
+    DEBUGP("The state machine CrIaAlgo for Ttc2 is properly configured ... SUCCESS\n");
+  }
+#ifdef PC_TARGET
+{
+  /* Set the enable status of the TTC2 Algorithm to true, because the Data Pool is still not initialized */
+  unsigned char algoTtc2Enabled = 1;
+  CrIaPaste(ALGOTTC2ENABLED_ID, &algoTtc2Enabled);
+}
+#endif /* PC_TARGET */
+  /** Start the SM */
+  FwSmStart(smDescAlgoTtc2);
+  /** Activate TTC2 Algorithm by default */
+  FwSmMakeTrans(smDescAlgoTtc2, Start);
+  
+  smDescAlgoAcq1 = CrIaAlgoCreate(NULL);
+  if (FwSmCheckRec(smDescAlgoAcq1) != smSuccess)
+    {
+      DEBUGP("The state machine CrIaAlgo for Acq1 is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  else
+    {
+      DEBUGP("The state machine CrIaAlgo for Acq1 is properly configured ... SUCCESS\n");
+    }
+  /** Start the SM */
+  FwSmStart(smDescAlgoAcq1);
+  
+  smDescAlgoCmpr = CrIaAlgoCreate(NULL);
+  if (FwSmCheckRec(smDescAlgoCmpr) != smSuccess)
+    {
+      DEBUGP("The state machine CrIaAlgo for Cmpr is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  else
+    {
+      DEBUGP("The state machine CrIaAlgo for Cmpr is properly configured ... SUCCESS\n");
+    }
+  /** Start the SM */
+  FwSmStart(smDescAlgoCmpr);
+
+  smDescAlgoSaaEval = CrIaAlgoCreate(NULL);
+  if (FwSmCheckRec(smDescAlgoSaaEval) != smSuccess)
+    {
+      DEBUGP("The state machine CrIaAlgo for SAA Eval is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  else
+    {
+      DEBUGP("The state machine CrIaAlgo for SAA Eval is properly configured ... SUCCESS\n");
+    }
+  /** Start the SM */
+  FwSmStart(smDescAlgoSaaEval);
+
+  smDescAlgoSdsEval = CrIaAlgoCreate(NULL);
+  if (FwSmCheckRec(smDescAlgoSdsEval) != smSuccess)
+    {
+      DEBUGP("The state machine CrIaAlgo for SDS Eval is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  else
+    {
+      DEBUGP("The state machine CrIaAlgo for SDS Eval is properly configured ... SUCCESS\n");
+    }
+  /** Start the SM */
+  FwSmStart(smDescAlgoSdsEval);
+  /** Mantis 2232: Activate SDS Algorithm by default */
+  FwSmMakeTrans(smDescAlgoSdsEval, Start);
+
+  for (i_algo=0;i_algo<MAX_ID_ALGO;i_algo++)
+    {
+      algoSm[i_algo] = NULL;
+    }
+  algoSm[SAA_EVAL_ALGO-1] = smDescAlgoSaaEval;
+  algoSm[CLCT_ALGO-1] = smDescAlgoCmpr;
+  algoSm[ACQ1_ALGO-1] = smDescAlgoAcq1;
+  algoSm[CNT1_ALGO-1] = smDescAlgoCent1;
+  algoSm[SDS_EVAL_ALGO-1] = smDescAlgoSdsEval;
+  algoSm[TTC1_ALGO-1] = smDescAlgoTtc1;
+  algoSm[TTC2_ALGO-1] = smDescAlgoTtc2;
+  algoSm[CENT0_ALGO-1] = smDescAlgoCent0;
+
+
+  /********************/
+  /*  Sci Data Upd Pr *  (21,3) InRep from SEM */
+  /********************/
+  prDescSciDataUpd = CrIaSciDataUpdCreate(NULL);
+  
+  /** Check that the procedure is properly configured */
+  if (FwPrCheck(prDescSciDataUpd) != prSuccess)
+    {
+      DEBUGP("The procedure CrIaSciDataUpd is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  else 
+    {
+      DEBUGP("The procedure CrIaSciDataUpd is properly configured ... SUCCESS\n");
+    }
+  
+  /********************/
+  /*   HbSem Mon Pr   */
+  /********************/
+  prDescHbSemMon = CrIaHbSemMonCreate(NULL);
+
+  /** Check that the procedure is properly configured */
+  if (FwPrCheck(prDescHbSemMon) != prSuccess) {
+    DEBUGP("The procedure CrIaHbSemMon is NOT properly configured ... FAILURE\n");
+    return EXIT_FAILURE;
+    }
+  else
+    {
+      DEBUGP("The procedure CrIaHbSemMon is properly configured ... SUCCESS\n");
+    }
+  /** Start the procedure */
+  FwPrStart(prDescHbSemMon);
+
+  /***************************/
+  /* SEM Mode Consistency Pr */
+  /***************************/
+  prDescSemModeConsistencyCheck = CrIaSemConsCheckCreate(NULL);
+
+  /** Check that the procedure is properly configured */
+  if (FwPrCheck(prDescSemModeConsistencyCheck) != prSuccess) {
+    DEBUGP("The procedure CrIaSemConsCheck is NOT properly configured ... FAILURE\n");
+    return EXIT_FAILURE;
+    }
+  else
+    {
+      DEBUGP("The procedure CrIaSemConsCheck is properly configured ... SUCCESS\n");
+    }
+
+  /**
+   * N3: Instantiate all Framework Components
+   * This is done by calling the factory functions
+   * offered by the CORDET Framework
+   */
+  
+  /* Check consistency of configuration parameters */
+  switch (CrFwAuxConfigCheck())
+    {
+    case crConsistencyCheckSuccess:
+      DEBUGP("### CrIaInit ### MA: Consistency check of configuration parameters ran successfully.\n");
+      break;
+    case crOutRegistryConfigParInconsistent:
+      DEBUGP("Consistency check of OutRegistry parameters failed\n");
+      return -1; 
+    case crOutFactoryConfigParInconsistent:
+      DEBUGP("Consistency check of OutFactory parameters failed\n");
+      return -1;
+    case crInFactoryInCmdConfigParInconsistent:
+      DEBUGP("Consistency check of InCommand parameters in InFactory failed\n");
+      return -1;
+    case crInFactoryInRepConfigParInconsistent:
+      DEBUGP("Consistency check of InRepot parameters in InFactory failed\n");
+      return -1;
+    }
+  
+  /* Create In- and OutStreams */
+  inStreamSem = CrFwInStreamMake(0);
+  inStreamObc = CrFwInStreamMake(1);
+  inStreamGrd = CrFwInStreamMake(2);
+  outStreamSem = CrFwOutStreamMake(0);
+  outStreamObc = CrFwOutStreamMake(1);
+  outStreamGrd = CrFwOutStreamMake(2);
+  
+  /**
+   * N4: Start all IASW State Machines
+   * This is done through the framework-
+   * function FwSmStart
+   */
+  
+  /** Define the state machine descriptor (SMD) */
+  smDescIasw = CrIaIaswCreate(NULL);
+  
+  /** Check that the SM is properly configured */
+  if (FwSmCheckRec(smDescIasw) != smSuccess)
+    {
+      DEBUGP("The IASW state machine is NOT properly configured ... FAILURE\n");
+      return EXIT_FAILURE;
+    }
+  else
+    {
+      DEBUGP("The IASW state machine is properly configured ... SUCCESS\n");
+    }
+  
+  /** Start the SM */
+  DEBUGP("# Start IASW State Machine ...\n");
+  FwSmStart(smDescIasw);
+  
+  /**
+   * N5: Initialize all Framework Components
+   * This is done through the framework-
+   * provided function CrFwCmpInit
+   */
+  
+  /* Initialize the In- and OutStreams */
+  CrFwCmpInit(inStreamSem);
+  CrFwCmpInit(inStreamObc);
+  CrFwCmpInit(inStreamGrd);
+  CrFwCmpInit(outStreamSem);
+  CrFwCmpInit(outStreamObc);
+  CrFwCmpInit(outStreamGrd);
+  if (!CrFwCmpIsInInitialized(inStreamSem)) return -1;
+  if (!CrFwCmpIsInInitialized(inStreamObc)) return -1;
+  if (!CrFwCmpIsInInitialized(inStreamGrd)) return -1;
+  if (!CrFwCmpIsInInitialized(outStreamSem)) return -1;
+  if (!CrFwCmpIsInInitialized(outStreamObc)) return -1;
+  if (!CrFwCmpIsInInitialized(outStreamGrd)) return -1;
+  
+  /**
+   * N6: Configure all Framework Components
+   * This is done through the framework-
+   * provided function CrFwCmpReset
+   */
+  
+  /* Configure the In- and OutStreams */
+  CrFwCmpReset(inStreamSem);
+  CrFwCmpReset(inStreamObc);
+  CrFwCmpReset(inStreamGrd);
+  CrFwCmpReset(outStreamSem);
+  CrFwCmpReset(outStreamObc);
+  CrFwCmpReset(outStreamGrd);
+  
+  /* Initialize and reset framework components */
+  fwCmp[0] = CrFwOutFactoryMake();
+  fwCmp[1] = CrFwInFactoryMake();
+  fwCmp[2] = CrFwInLoaderMake();
+  fwCmp[3] = CrFwInManagerMake(0);
+  fwCmp[4] = CrFwInManagerMake(1);
+  fwCmp[5] = CrFwInRegistryMake();
+  fwCmp[6] = CrFwOutLoaderMake();
+  fwCmp[7] = CrFwOutRegistryMake();
+  fwCmp[8] = CrFwOutManagerMake(0);
+  fwCmp[9] = CrFwOutManagerMake(1);
+  fwCmp[10] = CrFwOutManagerMake(2);
+  
+  /**
+   * N7: Perform Configuartion Check
+   * on Framwork Components
+   * The framework configuration check verifies
+   * that all framework components are in state
+   * CONFIGURED (this is done using function
+   * CrFwCmpIsInConfigured
+   */
+  if (!CrFwCmpIsInConfigured(inStreamSem)) return -1;
+  if (!CrFwCmpIsInConfigured(inStreamObc)) return -1;
+  if (!CrFwCmpIsInConfigured(inStreamGrd)) return -1;
+  if (!CrFwCmpIsInConfigured(outStreamSem)) return -1;
+  if (!CrFwCmpIsInConfigured(outStreamObc)) return -1;
+  if (!CrFwCmpIsInConfigured(outStreamGrd)) return -1;
+
+  for (i=0; i<CR_IA_NOF_FW_CMP; i++)
+    {
+      CrFwCmpInit(fwCmp[i]);
+      if (!CrFwCmpIsInInitialized(fwCmp[i])) return -1;
+      CrFwCmpReset(fwCmp[i]);
+      if (!CrFwCmpIsInConfigured(fwCmp[i])) return -1;
+    }
+  
+  /* If instantiation or configuration check successful */
+  CrIaLoadPredefinedHousekeeping();
+  CrIaLoadHeartbeatReport();
+  
+  /*	DEBUGP("INIT SUCCESSFUL!\n"); */
+  
+  IASW_initialised = 1;
+    
+  return 0;
+}
+
+
+static void EventRaise(CrFwServSubType_t SubType, unsigned short evtId, unsigned short *evtData, unsigned int DataSize, struct IaswEvent *EventBuffer)
+{
+  unsigned int i;
+  
+  for (i=0; i < ERR_LOG_N3; i++)
+    {
+      if (EventBuffer[i].used == 0)
+	break;
+    }
+
+  /* i is the index of the next free write slot */
+  
+  if (i == ERR_LOG_N3)
+    {
+      /* no space in SavedEvents array */
+      return;
+    }
+
+  EventBuffer[i].SubType = SubType;
+  EventBuffer[i].evtId   = evtId;
+  EventBuffer[i].evtData[0] = evtData[0];
+  EventBuffer[i].evtData[1] = evtData[1];
+  EventBuffer[i].DataSize = DataSize;
+
+  cpu_relax(); /* Mantis 1977: this barrier prevents the compiler from reordering the last assignment */
+  EventBuffer[i].used = 1;
+
+  return;
+}
+
+
+/**
+ * @brief Report an Event by saving it in the IbswEvents array
+ *
+ * Instead of generating an event such as done with the @ref CrIaEvtRep function, this function only
+ * saves the event to be picked up later and flushed out with the @ref FlushEvents function.
+ *
+ */
+
+void CrIaEvtRaise(CrFwServSubType_t SubType, unsigned short evtId, unsigned short *evtData, unsigned int DataSize)
+{
+  EventRaise (SubType, evtId, evtData, DataSize, IbswEvents);
+}
+
+/**
+ * @brief Report an Event by the Science
+ *
+ * Instead of generating an event such as done with the @ref CrIaEvtRep function, this function only
+ * saves the event to be picked up later and flushed out with the @ref FlushEvents function.
+ *
+ */
+
+void SdpEvtRaise(CrFwServSubType_t SubType, unsigned short evtId, unsigned short *evtData, unsigned int DataSize)
+{
+#if (__sparc__)
+  if(leon3_cpuid() == 0)
+#endif
+    {
+      /* on PC as well as on the first core we just want to emit the event */
+      CrIaEvtRep (SubType, evtId, evtData, DataSize);
+      return;
+    }
+
+  EventRaise (SubType, evtId, evtData, DataSize, SdpEvents);
+
+  return;
+}
+
+
+/**
+ * @brief Flush the events saved in the IaswSavedEvents array out
+ *
+ * For every saved event, the @ref CrIaEvtRep function is called.
+ *
+ */
+
+void FlushEvents (struct IaswEvent *EventBuffer)
+{
+  unsigned int i;
+
+  /* flush out all IBSW events */
+  for (i=0; i < ERR_LOG_N3; i++)
+    {
+      if (EventBuffer[i].used == 1)
+	{
+	  CrIaEvtRep(EventBuffer[i].SubType, EventBuffer[i].evtId, &(EventBuffer[i].evtData[0]), EventBuffer[i].DataSize);
+
+	  cpu_relax(); /* Mantis 1977: this barrier prevents the compiler from reordering the last assignment */
+	  EventBuffer[i].used = 0;
+	}
+    }
+  
+  return;
+}
+
+
+/**
+ * @brief Generate Service 5 Event Reports 
+ *
+ * @note An event filtering is done in the case an event with the same event ID is notified periodically.
+ * Then the filter reduces the generation of this event report packets.
+ *
+ */
+
+void CrIaEvtRep(CrFwServSubType_t SubType, unsigned short evtId, unsigned short *evtData, unsigned int DataSize)
+{
+  FwSmDesc_t rep;
+  unsigned char evtRepEnbldStatus, counts;
+  unsigned short CibNFull, SibNFull, GibNFull, SibNWin, CibNWin, GibNWin; /* for Error Event SDB Config Failure */
+  unsigned short CibSizeFull, SibSizeFull, GibSizeFull, CibSizeWin, SibSizeWin, GibSizeWin; /* for Error Event SDB Config Failure */
+  unsigned short iaswEvtCtr;
+  
+
+  CrIaCopy(IASW_EVT_CTR_ID, &iaswEvtCtr);
+  iaswEvtCtr++;
+  CrIaPaste(IASW_EVT_CTR_ID, &iaswEvtCtr);
+  
+  if(!IASW_initialised)
+    return;
+  
+  /* NOTE: errors are copied to the error log */
+  if (SubType == CRIA_SERV5_EVT_ERR_MED_SEV)
+    CrIaErrRep (SubType, evtId, evtData, DataSize);
+  
+  if (SubType == CRIA_SERV5_EVT_ERR_HIGH_SEV)
+    CrIaErrRep (SubType, evtId, evtData, DataSize);
+    
+  /* first get the count limit from the EVTENABLEDLIST */
+  CrIaCopyArrayItem(EVTENABLEDLIST_ID, &evtRepEnbldStatus, EventIndex(evtId));
+  
+  /* we increment the counter for this event no matter if it is enabled */
+  counts = CountEvent(evtId);
+
+  /* counts will always be >0 here because it is increased before.
+     so if the Limit is set to 0 counts will already be > and no event is generated. */
+  if (counts > evtRepEnbldStatus) 
+    {
+#if (__sparc__)
+      /* 
+	 We have to further mask the SPW interrrupts temporarily 
+	 for the link errors to prevent the interrupt storm.
+	 These are re-enabled in the CrIa cycle. 
+      */
+      if (evtId == CRIA_SERV5_EVT_SPW_ERR_M)
+	{      
+	  CrIbDisableSemSpWLinkErrorIRQ();
+#if (__SPW_ROUTING__)
+	  CrIbDisableMonSpWLinkErrorIRQ();
+#endif
+	}
+
+      if (evtId == CRIA_SERV5_EVT_SPW_ERR_H)
+	{      
+	  CrIbDisableSemSpWLinkErrorIRQ();
+#if (__SPW_ROUTING__)
+	  CrIbDisableMonSpWLinkErrorIRQ();
+#endif
+	}
+#endif
+      return;
+    }
+  /* end of filter */
+  
+  /* Create out component */
+  /* Normal/Progress Report and Error Report - Low Severity */
+  rep = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRIA_SERV5, SubType, evtId, 0); /* arguments: type, subType, discriminant/evtId, length */
+  if (rep == NULL)
+    {
+      /* handled by Resource FdCheck */
+      return;
+    }
+
+  /* Set out component parameters */
+  CrFwOutCmpSetDest(rep, CR_FW_CLIENT_GRD_PUS);
+  
+  /* Set parameters of service (5,1) and (5,2) */
+  CrIaServ5EvtSetEvtId(rep, evtId);
+
+  switch (evtId)
+    {
+
+    case CRIA_SERV5_EVT_INV_DEST: 
+      CrIaServ5EvtInvDestParamSetInvDest (rep, evtData[1]);
+      break;
+      
+    case CRIA_SERV5_EVT_SEQ_CNT_ERR:
+      CrIaServ5EvtSeqCntErrParamSetExpSeqCnt (rep, evtData[0]);
+      CrIaServ5EvtSeqCntErrParamSetActSeqCnt (rep, evtData[1]);
+      break;
+      
+    case CRIA_SERV5_EVT_INREP_CR_FAIL:
+      CrIaServ5EvtInrepCrFailParamSetRepSeqCnt (rep, evtData[0]);
+      break;
+      
+    case CRIA_SERV5_EVT_PCRL2_FULL:
+      CrIaServ5EvtPcrl2FullParamSetRepSeqCnt (rep, evtData[0]);
+      break;
+      
+    case CRIA_SERV5_EVT_FD_FAILED:
+      CrIaServ5EvtFdFailedParamSetFdCheckId (rep, evtData[0]);
+      break;
+      
+    case CRIA_SERV5_EVT_RP_STARTED:
+      CrIaServ5EvtRpStartedParamSetFdCheckId (rep, evtData[0]);
+      CrIaServ5EvtRpStartedParamSetRecovProcId (rep, evtData[1]);
+      break;
+      
+    case CRIA_SERV5_EVT_SEM_TR: 
+      CrIaServ5EvtSemTrParamSetSrcSemSt (rep, evtData[0]);
+      CrIaServ5EvtSemTrParamSetDestSemSt (rep, evtData[1]);
+      break;
+      
+    case CRIA_SERV5_EVT_IASW_TR:
+      CrIaServ5EvtIaswTrParamSetSrcIaswSt (rep, evtData[0]);
+      CrIaServ5EvtIaswTrParamSetDestIaswSt (rep,evtData[1]);
+      break;
+      
+    case CRIA_SERV5_EVT_SDSC_ILL:
+      CrIaServ5EvtSdscIllParamSetSciSeqCnt (rep, evtData[0]);
+      break;
+      
+    case CRIA_SERV5_EVT_SDSC_OOS:
+      CrIaServ5EvtSdscOosParamSetExpSciSeqCnt (rep, evtData[0]);
+      CrIaServ5EvtSdscOosParamSetActSciSeqCnt (rep, evtData[1]);
+      break;
+
+    case CRIA_SERV5_EVT_CLCT_SIZE:
+      CrIaServ5EvtClctSizeParamSetGibSize(rep, evtData[0]);
+      break;
+      
+    case CRIA_SERV5_EVT_SIB_SIZE:
+      CrIaServ5EvtSibSizeParamSetSibSize (rep, evtData[0]);
+      break;
+
+    case CRIA_SERV5_EVT_FBF_LOAD_RISK:
+      CrIaServ5EvtFbfLoadRiskParamSetFbfId (rep, evtData[0]);
+      break;
+      
+    case CRIA_SERV5_EVT_FBF_SAVE_DENIED:
+      CrIaServ5EvtFbfSaveDeniedParamSetFbfId (rep, evtData[0]);
+      break;
+      
+    case CRIA_SERV5_EVT_FBF_SAVE_ABRT:
+      CrIaServ5EvtFbfSaveAbrtParamSetFbfId (rep, evtData[0]);
+      CrIaServ5EvtFbfSaveAbrtParamSetFbfNBlocks (rep, evtData[1]);
+      break;
+      
+    case CRIA_SERV5_EVT_SDB_CNF_FAIL:
+      CrIaServ5EvtSdbCnfFailParamSetProcId (rep, evtData[0]);      /* is filled via evtData by SDB Config */
+      /* Full */
+      CrIaCopy(CIBNFULL_ID, &CibNFull);
+      CrIaServ5EvtSdbCnfFailParamSetCibNFull (rep, (unsigned char)CibNFull); 
+      CrIaCopy(CIBSIZEFULL_ID, &CibSizeFull);
+      CrIaServ5EvtSdbCnfFailParamSetCibSizeFull (rep, CibSizeFull);
+      CrIaCopy(SIBNFULL_ID, &SibNFull);
+      CrIaServ5EvtSdbCnfFailParamSetSibNFull (rep, (unsigned char)SibNFull); 
+      CrIaCopy(SIBSIZEFULL_ID, &SibSizeFull);
+      CrIaServ5EvtSdbCnfFailParamSetSibSizeFull (rep, SibSizeFull); 
+      CrIaCopy(GIBNFULL_ID, &GibNFull);
+      CrIaServ5EvtSdbCnfFailParamSetGibNFull (rep, (unsigned char)GibNFull); 
+      CrIaCopy(GIBSIZEFULL_ID, &GibSizeFull);
+      CrIaServ5EvtSdbCnfFailParamSetGibSizeFull (rep, GibSizeFull);
+      /* Win */
+      CrIaCopy(SIBNWIN_ID, &SibNWin);
+      CrIaServ5EvtSdbCnfFailParamSetSibNWin (rep, (unsigned char)SibNWin); 
+      CrIaCopy(SIBSIZEWIN_ID, &SibSizeWin);
+      CrIaServ5EvtSdbCnfFailParamSetSibSizeWin (rep, SibSizeWin);
+      CrIaCopy(CIBNWIN_ID, &CibNWin);
+      CrIaServ5EvtSdbCnfFailParamSetCibNWin (rep, (unsigned char)CibNWin);
+      CrIaCopy(CIBSIZEWIN_ID, &CibSizeWin);
+      CrIaServ5EvtSdbCnfFailParamSetCibSizeWin (rep, CibSizeWin); 
+      CrIaCopy(GIBNWIN_ID, &GibNWin);
+      CrIaServ5EvtSdbCnfFailParamSetGibNWin (rep, (unsigned char)GibNWin); 
+      CrIaCopy(GIBSIZEWIN_ID, &GibSizeWin);
+      CrIaServ5EvtSdbCnfFailParamSetGibSizeWin (rep, GibSizeWin); 
+      break;
+      
+    case CRIA_SERV5_EVT_CMPR_SIZE:
+      CrIaServ5EvtCmprSizeParamSetImgBufferSize (rep, ((unsigned int)evtData[0] << 16) | ((unsigned int) evtData[1]));
+      break;
+      
+    case CRIA_SERV5_EVT_SEMOP_TR:
+      CrIaServ5EvtSemopTrParamSetSrcSemOpSt (rep, evtData[0]);
+      CrIaServ5EvtSemopTrParamSetDestSemOpSt (rep, evtData[1]);
+      break;
+      
+    case CRIA_SERV5_EVT_SC_PR_STRT:
+      CrIaServ5EvtScPrStrtParamSetProcId (rep, evtData[0]);
+      break;
+      
+    case CRIA_SERV5_EVT_SC_PR_END:
+      CrIaServ5EvtScPrEndParamSetProcId (rep, evtData[0]);
+      CrIaServ5EvtScPrEndParamSetProcTermCode (rep, evtData[1]);
+      break;
+      
+    case CRIA_SERV5_EVT_INSTRM_PQF: /* was: EVT_INSTREAM_PQ_FULL */
+      CrIaServ5EvtInstrmPqfParamSetInStreamId (rep, evtData[1]);
+      break;
+      
+    case CRIA_SERV5_EVT_OCMP_INVD:
+      CrIaServ5EvtOcmpInvdParamSetOutCompId (rep, evtData[0]);
+      CrIaServ5EvtOcmpInvdParamSetInvDest (rep, evtData[1]);
+      break;
+      
+    case CRIA_SERV5_EVT_OCMP_ILLGR: /* was: EVT_OUTCMP_ILL_GROUP */
+      CrIaServ5EvtOcmpIllgrParamSetOutStreamId (rep, evtData[0]);
+      CrIaServ5EvtOcmpIllgrParamSetGroupId (rep, evtData[1]&0xff);
+      break;      
+      
+    case CRIA_SERV5_EVT_IN_ILLGR: /* was: EVT_INCMDREP_ILL_GROUP */
+      CrIaServ5EvtInIllgrParamSetInStreamId(rep, evtData[0]);
+      CrIaServ5EvtInIllgrParamSetGroupId(rep, evtData[1] & 0xff);
+      break;
+
+    case CRIA_SERV5_EVT_INV_CENT:
+      /* no parameter */
+      break;		
+      
+    case CRIA_SERV5_EVT_OOL_PARAM:
+      CrIaServ5EvtOolParamParamSetParamId(rep, (evtData[0] << 16) | evtData[1]);
+      break;    
+
+    case CRIA_SERV5_EVT_INIT_SUCC:
+      /* no parameter */
+      break;
+      
+    case CRIA_SERV5_EVT_INIT_FAIL: 
+      CrIaServ5EvtInitFailParamSetNoOfErrors (rep, evtData[0]);
+      CrIaServ5EvtInitFailParamSetIbswErrNo (rep, evtData[1]);
+      break;      
+      
+    case CRIA_SERV5_EVT_THRD_OR:     
+      CrIaServ5EvtThrdOrParamSetThrdId (rep, evtData[0]);
+      CrIaServ5EvtThrdOrParamSetThrdOrSize (rep, evtData[1]);
+      break;
+
+    case CRIA_SERV5_EVT_NOTIF_ERR:
+      CrIaServ5EvtNotifErrParamSetContdId (rep, evtData[0]);
+      CrIaServ5EvtNotifErrParamSetNotifCnt (rep, evtData[1]);
+      break;
+      
+    case CRIA_SERV5_EVT_1553_ERR_L:
+      CrIaServ5Evt1553ErrLParamSetIbswErrNo (rep, evtData[1]); /* errno is in evtData[1] */
+      break;
+      
+    case CRIA_SERV5_EVT_1553_ERR_M:
+      CrIaServ5Evt1553ErrMParamSetIbswErrNo (rep, evtData[1]);
+      break;
+      
+    case CRIA_SERV5_EVT_1553_ERR_H:
+      CrIaServ5Evt1553ErrHParamSetIbswErrNo (rep, evtData[1]);
+      break;
+      
+    case CRIA_SERV5_EVT_SPW_ERR_L:
+      fdSemCommErrCnt++; /* counter to signal that an communication error occurs; will be reseted every IASW cycle */
+      CrIaServ5EvtSpwErrLParamSetIbswErrNo (rep, evtData[1]);
+      break;
+      
+    case CRIA_SERV5_EVT_SPW_ERR_M:
+      fdSemCommErrCnt++; /* counter to signal that an communication error occurs; will be reseted every IASW cycle */
+      CrIaServ5EvtSpwErrMParamSetIbswErrNo (rep, evtData[1]);
+      break;
+      
+    case CRIA_SERV5_EVT_SPW_ERR_H:
+      fdSemCommErrCnt++; /* counter to signal that an communication error occurs; will be reseted every IASW cycle */
+      CrIaServ5EvtSpwErrHParamSetIbswErrNo (rep, evtData[1]);
+      break;
+      
+    case CRIA_SERV5_EVT_FL_EL_ERR:
+      CrIaServ5EvtFlElErrParamSetIbswErrNo (rep, errno); /* NOTE: we only see the last errno of this cycle */
+      CrIaServ5EvtFlElErrParamSetFlashAdd (rep, (evtData[0] << 16) | evtData[1]);
+      break;
+      
+    case CRIA_SERV5_EVT_FL_FBF_ERR:
+      CrIaServ5EvtFlFbfErrParamSetIbswErrNo (rep, errno); /* NOTE: we only see the last errno of this cycle */
+      CrIaServ5EvtFlFbfErrParamSetFlashAdd (rep, 0);  /* NOTE: we cannot get the address here, this will stay 0 */
+      CrIaServ5EvtFlFbfErrParamSetFbfId (rep, evtData[1]); /* right short word because of big endianess */
+      break;
+
+    case CRIA_SERV5_EVT_FL_FBF_BB:
+      CrIaServ5EvtFlFbfBbParamSetChipId (rep, evtData[0]);
+      CrIaServ5EvtFlFbfBbParamSetBlck (rep, evtData[1]);
+      break;
+      
+    case CRIA_SERV5_EVT_SBIT_ERR:
+      CrIaServ5EvtSbitErrParamSetRamAdd(rep, (evtData[0] << 16) | evtData[1]);
+      break;
+      
+    case CRIA_SERV5_EVT_DBIT_ERR:
+      CrIaServ5EvtDbitErrParamSetRamAdd(rep, (evtData[0] << 16) | evtData[1]);
+      break;
+      
+    case CRIA_SERV5_EVT_SYNC_LOSS:
+      /* no parameter */
+      break;
+      
+    case CRIA_SERV5_EVT_SDP_NOMEM:
+      CrIaServ5EvtSdpNomemParamSetStepNmb(rep, evtData[0]);
+      CrIaServ5EvtSdpNomemParamSetDebugVal(rep, evtData[1]);
+      break;
+
+    case CRIA_SERV5_EVT_SEM_ILL_ST:
+      CrIaSetUShortValue(rep, evtData[0], 2); /* generic setter used */
+      CrIaSetUShortValue(rep, evtData[1], 4);
+      break;
+
+    case CRIA_SERV5_EVT_ACQ_FAIL:
+      /* no parameter */
+      break;
+
+    case CRIA_SERV5_EVT_PROCBUF_INSUF:
+      CrIaServ5EvtProcbufInsufParamSetProductID(rep, evtData[0]);
+      CrIaServ5EvtProcbufInsufParamSetReqSize(rep, (((unsigned int)evtData[1])<<16) | ((unsigned int)evtData[2]));
+      CrIaServ5EvtProcbufInsufParamSetAvailSize(rep, (((unsigned int)evtData[3])<<16) | ((unsigned int)evtData[4]));
+      break;
+
+    case CRIA_SERV5_EVT_IMG_INSUF:
+      CrIaServ5EvtImgInsufParamSetProductID(rep, evtData[0]);
+      CrIaServ5EvtImgInsufParamSetStepID(rep, evtData[1]);
+      CrIaServ5EvtImgInsufParamSetReqSize(rep, (((unsigned int)evtData[2])<<16) | ((unsigned int)evtData[3]));
+      CrIaServ5EvtImgInsufParamSetAvailSize(rep, (((unsigned int)evtData[4])<<16) | ((unsigned int)evtData[5]));
+      break;
+
+    case CRIA_SERV5_EVT_XIB_FULL :
+      CrIaServ5EvtXibFullParamSetBufID(rep, evtData[0]); /* was: CrIaSetUShortValue(rep, evtData[0], 2); */
+      break;
+
+    default :
+      DEBUGP("!!!! UNKNOWN EVENT: %d\n", evtId);
+      break;
+    }
+  
+  CrFwOutLoaderLoad(rep);
+  
+  return;
+}
+
+
+/* NOTE: do not call directly, but call CrIaEvtRep instead. It will call CrIaErrRep for MED and HIGH */
+void CrIaErrRep(CrFwServSubType_t SubType, unsigned short evtId, unsigned short *evtData, unsigned int DataSize)
+{
+#if (__sparc__)
+  unsigned int i;
+  unsigned char loginfo[ERR_LOG_N2];
+  
+  if(!IASW_initialised)
+    return;
+  
+  DEBUGP("ERR \n");
+  
+  /* make local copy */
+  memcpy(loginfo, evtData, DataSize);
+      
+  /* pad with zeroes */
+  for (i=DataSize; i < ERR_LOG_N2; i++)
+    loginfo[i] = 0;
+    
+  /* Make entry in the RAM error log if the number of errors 
+     reported in this cycle has not yet reached the limit. */
+  if (LoggedEntries < ERR_LOG_N3)
+    {
+      CrIbLogError (evtId, loginfo);
+      LoggedEntries++;
+    } 
+#endif /* __sparc__ */
+  
+  (void) SubType;
+  (void) evtId;
+  (void) evtData;
+  (void) DataSize;
+  
+  return;
+}
+
+
+/**
+ * @brief Execution of the Cyclical Activities
+ * 
+ * @param none
+ */
+
+void CrIaExecCycActivities() 
+{
+  unsigned int pctr;
+  unsigned int MaxSemPcktCyc;
+#if (__sparc__)
+  unsigned int edacErrors;
+  unsigned short cpu2status, scrublength;
+  unsigned char edacSingleRepaired;
+#endif /* __sparc__ */
+  unsigned char lstpckt;
+  unsigned short routing = 0;
+
+  
+#ifdef PC_TARGET
+  PcSemCycleCount = 0;
+  PcSemCollPckt = 0;
+  PcMilUsed = 0;
+#endif /* PC_TARGET */
+
+  CrIaCopy(MILFRAMEDELAY_ID, &milFrameDelay);
+
+  CrIaCopy(SEMROUTE_ID, &routing);	
+
+#if (__sparc__)
+  if (routing_status == 0)
+    {
+      if (routing == 1)
+	{
+	  CrIbEnableSpWRoutingNOIRQ();
+	  routing_status = 1;
+	}
+    }
+
+  if (routing_status == 1)
+    {
+      if (routing == 0)
+	{
+	  CrIbDisableSpWRouting();
+	  routing_status = 0;
+	}
+    }
+
+#endif /* __sparc__ */
+
+  
+  if (routing == 0)
+    {
+      /* Load packets from the instreams */
+      
+      /* 1.1 Execute CrFwInStreamPcktAvail on InStreamSem */
+      /* Load packets from SEM */
+      pollConnectionSem();
+      
+      /* 1.2 Execute the InLoader on InStreamSem MAX_SEM_PCKT_CYC times */
+      /* packets from SEM */
+      CrIaCopy(MAX_SEM_PCKT_CYC_ID, &MaxSemPcktCyc);
+      CrFwInLoaderSetInStream(inStreamSem);
+      
+      for (pctr = 0; pctr < MaxSemPcktCyc; pctr++)
+	{
+	  FwSmExecute(CrFwInLoaderMake());
+	}
+    }
+  else
+    {
+#if (__sparc__)
+      CrIbSpWRoute();
+#endif
+    }
+  
+  
+#if (__sparc__)
+  /* update the ADC values in the data pool */
+  CrIbUpdateDataPoolVariablesWithFpgaValues();
+  
+  /*
+    DEBUGP("H1: %d\n", fpga_heater_status(HEATER_1));
+    DEBUGP("H2: %d\n", fpga_heater_status(HEATER_2));
+    DEBUGP("H3: %d\n", fpga_heater_status(HEATER_3));
+    DEBUGP("H4: %d\n", fpga_heater_status(HEATER_4));
+  */	
+  
+  /* update the IBSW values in the data pool */
+  /*	CrIbUpdateDataPoolVariablesWithValuesFromIbswSysctlTree(8); */
+#endif /* __sparc__ */
+  
+  /* Execute managers */
+  /* 2 Execute the inManagerSem */
+  FwSmExecute(CrFwInManagerMake(0));
+  
+  /* 3 Execute SEM Unit State Machine */
+  FwSmMakeTrans(smDescSem, Execute);
+  
+  /* 4 Execute, in sequence, each FdCheck and its associated Recovery Procedure
+     NB: The Recovery Procedures consist of one-shot actions. They are therefore
+         not implemented as self-standing procedures. They are instead implemented
+         in function CrIaFdCheckFunc::executeRecoveryProc. This function is executed
+         by an FdCheck when a failure is declared. Hence, the code below (which only
+         executes the FdCheck) is equivalent to the specification (which requires
+         the execution of the FdCheck and of their recovery procedures). 
+  */
+  FwSmMakeTrans(smDescFdTelescopeTempMonitorCheck, Execute);
+  FwSmMakeTrans(smDescFdIncorrectSDSCntrCheck, Execute);
+  FwSmMakeTrans(smDescFdSemCommErrCheck, Execute);
+  FwSmMakeTrans(smDescFdSemModeTimeOutCheck, Execute);
+  FwSmMakeTrans(smDescFdSemSafeModeCheck, Execute);
+  FwSmMakeTrans(smDescFdSemAliveCheck, Execute);
+  FwSmMakeTrans(smDescFdSemAnomalyEventCheck, Execute);
+  FwSmMakeTrans(smDescFdSemLimitCheck, Execute);
+  FwSmMakeTrans(smDescFdDpuHousekeepingCheck, Execute);
+  FwSmMakeTrans(smDescFdCentroidConsistencyCheck, Execute);
+  FwSmMakeTrans(smDescFdResourceCheck, Execute);
+  FwSmMakeTrans(smDescFdSemModeConsistencyCheck, Execute);
+
+  /* reset counter, which signals that an communication error in this IASW cycle occured */
+  fdSemCommErrCnt = 0;
+
+  /* 5 Execute the Validity Procedure */
+  FwPrExecute(prDescCentVal);
+  
+  /* 6 Execute the IASW State Machine */
+  FwSmMakeTrans(smDescIasw, Execute);
+  
+  /* 7.1 Execute all Science Procedures */
+  /* NOTE: prDescNomSci is executed by IASW Science Do Action */
+  /* NOTE: prDescAcqFullDrop is executed by IASW Science Do Action */
+  /* NOTE: prDescCalFullSnap is executed by IASW Science Do Action */
+  /* NOTE: prDescSciStack is executed by IASW Science Do Action */
+  /* NOTE: prDescSciDataUpd is executed in S21 DatCcdWindowUpdate action */
+  FwPrExecute(prDescSaveImages);
+#ifdef PC_TARGET
+  FwPrExecute(prDescAcq1AlgoExec);
+  FwPrExecute(prDescCmprAlgoExec);
+#endif /* PC_TARGET */
+  
+  /* 7.2 Execute FBF Procedures */
+  FwPrExecute(prDescFbfLoad);
+  FwPrExecute(prDescFbfSave);
+  FwPrExecute(prDescTransferFbfToGround);
+
+  /* 8 Execute all Algorithm State Machines */
+  FwSmExecute(smDescAlgoCent0);
+  FwSmExecute(smDescAlgoCent1);
+  FwSmExecute(smDescAlgoTtc1);
+  FwSmExecute(smDescAlgoTtc2);
+#ifdef PC_TARGET
+  FwSmExecute(smDescAlgoAcq1);
+  FwSmExecute(smDescAlgoCmpr);
+#endif /* PC_TARGET */
+  FwSmExecute(smDescAlgoSaaEval);
+  FwSmExecute(smDescAlgoSdsEval);
+  
+  /* 9 Execute the Update operation on the data pool */
+  /* Note: this does not update asynchronous items */
+  CrFwUpdateDataPool(CrFwInManagerMake(0),  /* inManagerSem    */ 
+		     CrFwInManagerMake(1),  /* inManagerGrdObc */
+		     CrFwOutManagerMake(0), /* outManager1     */
+		     CrFwOutManagerMake(1), /* outManager2     */
+		     CrFwOutManagerMake(2), /* outManager3     */
+		     inStreamSem,
+		     inStreamObc,
+		     inStreamGrd,
+		     outStreamSem,
+		     outStreamObc,
+		     outStreamGrd);
+  
+  /* 10.1 Execute CrFwInStreamPcktAvail on InStreamObc */
+  /* 10.2 Execute CrFwInStreamPcktAvail on InStreamGrd */
+  /* Load packets from OBC and GRND */
+  pollConnectionMil();
+  
+  /* 10.3 Execute the InLoader on InStreamObc */
+  /* Load packets from the instreams */
+  CrFwInLoaderSetInStream(inStreamObc);
+  FwSmExecute(CrFwInLoaderMake());
+  /* 10.4 Execute the InLoader on InStreamGrd */
+  /* Load packets from the instreams */
+  CrFwInLoaderSetInStream(inStreamGrd);
+  FwSmExecute(CrFwInLoaderMake());
+  
+  /* 11 Execute the InManagerGrdObc */
+  /* Execute managers */
+  FwSmExecute(CrFwInManagerMake(1));
+
+  /* Mantis 1823 */
+  FlushEvents(IbswEvents);
+
+  /* Mantis 1977 */
+  FlushEvents(SdpEvents);
+  
+  /* 12 Execute the OutManager1 */
+  /* Execute managers */
+  FwSmExecute(CrFwOutManagerMake(0));
+  
+  /* 13 Execute SDU2 State Machine */
+  FwSmMakeTrans(smDescSdu2, Execute);
+  
+  /* 14 Execute the OutManager2 */
+  /* Execute managers */
+  FwSmExecute(CrFwOutManagerMake(1));
+  
+  /* 15 Execute SDU2 State Machine */
+  FwSmMakeTrans(smDescSdu2, Execute);
+  
+  /* 16 Execute the OutManager2 */
+  /* Execute managers */
+  FwSmExecute(CrFwOutManagerMake(1));
+
+  /* 17 Execute SDU4 State Machines */
+  FwSmMakeTrans(smDescSdu4, Execute);
+  
+  /* 18 Execute the OutManager3 */
+  /* Execute managers */
+  FwSmExecute(CrFwOutManagerMake(2)); /* OutManager3 */
+  
+  /* 19 Execute SDU4 State Machines */
+  FwSmMakeTrans(smDescSdu4, Execute);
+  
+  /* 20 Execute the OutManager3 */
+  /* Execute managers */
+  FwSmExecute(CrFwOutManagerMake(2)); /* OutManager3 */
+  
+  /* Clear all SEM Event flags Mantis 1179, has to be after the out managers */
+  CrIaClearSemEventFlags();
+  
+  /* reset the V09+ event filter each cycle */
+  ResetEventCounts();
+
+#if (__sparc__)
+  /* re-enable SpW interrupts just in case they were deactivated by the filter */
+  CrIbEnableSemSpWLinkErrorIRQ();
+#if (__SPW_ROUTING__)
+  CrIbEnableMonSpWLinkErrorIRQ();
+#endif
+#endif
+
+#if (__sparc__)
+  /* Memory scrubbing as part of the cycle (no thread) */
+  
+  CrIaCopy (SRAM1SCRLENGTH_ID, &scrublength);	  
+  if (scrublength > 0)    
+    CrIbScrubMemory (SRAM1_ID, scrublength);
+  
+  CrIaCopy (SRAM2SCRLENGTH_ID, &scrublength);
+  if (scrublength > 0)    
+    CrIbScrubMemory (SRAM2_ID, scrublength);
+  
+  /* Check if the second cpu is running in this cycle, then correct.
+     If it is active, then we retry in the next cycle. */
+  CrIaCopy (CPU2PROCSTATUS_ID, &cpu2status);
+  
+  if (cpu2status == SDP_STATUS_IDLE)
+    {
+      /* set status to ERROR and correct EDAC errors */
+      cpu2status = SDP_STATUS_ERROR;
+      CrIaPaste (CPU2PROCSTATUS_ID, &cpu2status);
+      
+      edacErrors = CrIbMemRepair ();	
+      
+      CrIaCopy(EDACSINGLEREPAIRED_ID, &edacSingleRepaired);
+      edacSingleRepaired += (unsigned char) edacErrors;
+      CrIaPaste(EDACSINGLEREPAIRED_ID, &edacSingleRepaired);
+      
+      /* set back to IDLE */
+      cpu2status = SDP_STATUS_IDLE;
+      CrIaPaste (CPU2PROCSTATUS_ID, &cpu2status);
+    }	  	
+#endif /* __sparc__ */
+  
+  /* Start and Execute the TTC1 procedure -> already done in Algorithm State Machine */
+  
+  /* 21 Execute the Watchdog Reset Procedure */
+#if (__sparc__)
+  CrIbResetWd();
+#endif /* __sparc__ */
+
+  /* 22 reset the LastSemPcktFlag and the S196Flag */
+  lstpckt = 0;  
+  CrIaPaste(LASTSEMPCKT_ID, &lstpckt);
+  S196Flag = 0;
+    
+  /* issue ConnectionAvailable signals */
+  CrIaOutStreamConnectionAvail(outStreamSem);
+  CrIaOutStreamConnectionAvail(outStreamObc);
+  CrIaOutStreamConnectionAvail(outStreamGrd);
+    
+  CrIbUpdateDataPoolVariablesWithValuesFromIbswSysctlTree(8.0);
+  
+  /* periodic creation of Service 9 time (+ this triggers a tick) */
+   
+  
+#ifdef PC_TARGET
+  PcCycCount ++;
+#endif /* PC_TARGET */
+
+  /* Execute HbSem Mon Pr */
+  if (FwSmGetExecCnt(smDescIasw) % HBSEM_MON_PER == 0)
+    {
+      FwPrExecute(prDescHbSemMon);
+    }
+  
+  /* reset received SEM Anomaly Event ID */
+  SemAnoEvtId = 0;
+
+  /* reset limit for error log entries per cycle */
+  LoggedEntries = 0;
+    
+  return; 
+}
+
+
+void CrIaOutStreamConnectionAvail(FwSmDesc_t smDesc) {
+  CrFwOutStreamConnectionAvail(smDesc);
+}
+
+
+CrFwTimeStamp_t CrFwGetCurrentTime()
+{
+  return CrIbGetCurrentTime();
+}
+
+
+#ifdef PC_TARGET
+/**
+ * Provide the current time.
+ *
+ * This function implements the CORDET interface from CrFwTime.h. Time is
+ * provided as a 32-bit integer of which the MSB 8 bits are set to zero and the
+ * remaining 24 bits comply with the CUC time format (the 0
+ */
+CrFwTimeStamp_t CrIbGetCurrentTime()
+{
+  struct timespec now;
+  time_t coarse;
+  unsigned int fine;
+  CrFwTimeStamp_t ts; /* unsigned char struct.t[6] */
+
+  clock_gettime(CLOCK_REALTIME, &now);
+  coarse = now.tv_sec;
+  fine = (unsigned int)(32.768 * (float)now.tv_nsec / (float)1000000);
+/*
+  DEBUGP("Coarsetime: %ld\n", coarse);
+  DEBUGP("Finetime: %d\n", fine);
+*/
+
+  ts.t[3] = coarse & 0xff;
+  ts.t[2] = (coarse >> 8) & 0xff;
+  ts.t[1] = (coarse >> 16) & 0xff;
+  ts.t[0] = (coarse >> 24) & 0xff;
+  ts.t[4] = (fine >> 7) & 0x7f;
+  ts.t[5] = fine & 0xfe;
+
+  return ts;
+}
+#endif /* PC_TARGET */
+
+
+#ifdef PC_TARGET
+void CrIbUpdateDataPoolVariablesWithValuesFromIbswSysctlTree(unsigned int hz)
+{
+  static unsigned int firstcoarse;
+  unsigned int coarse;
+  CrFwTimeStamp_t ts;
+  
+  (void) hz;
+  
+  ts = CrIbGetCurrentTime();
+  
+  coarse = ((unsigned int)ts.t[0] << 24) | ((unsigned int)ts.t[1] << 16) | ((unsigned int)ts.t[2] << 8) | (unsigned int)ts.t[3];
+  
+  if (firstcoarse == 0)
+    firstcoarse = coarse;
+  
+  coarse -= firstcoarse;
+  
+  CrIaPaste(UPTIME_ID, &coarse);
+  
+  return;
+}
+#endif /* PC_TARGET */
+
+
+#ifdef PC_TARGET
+/**
+ * Provide the time at next sync pulse. Dummy implementation for PC
+ */
+CrFwTimeStamp_t CrIbGetNextTime()
+{
+  return CrIbGetCurrentTime();
+}
+#endif /* PC_TARGET */
+
+
+#ifdef PC_TARGET
+/**
+ * Provide the current cycle on PC
+ */
+unsigned int CrIbGetNotifyCnt()
+{
+  return (PcCycCount % 8) + 1;
+}
+#endif /* PC_TARGET */
+
+
+/**
+ * Load Predefined Housekeeping
+ * Service (3, 25) OutRep
+ */
+void CrIaLoadPredefinedHousekeeping()
+{
+  FwSmDesc_t rep;
+  CrFwGroup_t group = 1; /* PCAT = 2 */
+  unsigned char sid;
+  unsigned int hkSize;
+  
+  DEBUGP("### CrIaInit ### Within IASW predefined Housekeeping packet generation.\n");
+  
+  /* Create out components predefined housekeepings */
+  for(sid = 1; sid <= 6; sid++)
+    {
+      hkSize = getHkDataSize (sid);
+      
+      rep  = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRIA_SERV3, CRIA_SERV3_HK_DR, sid, hkSize);
+      if (rep == NULL)
+	{
+          /* handled by Resource FdCheck */
+	  DEBUGP("ERROR: CrIaLoadPredefinedHousekeeping cannot generate a packet!\n");
+	  return;
+	}
+      
+      CrFwOutCmpSetGroup(rep, group);
+      CrFwOutLoaderLoad(rep);
+    }
+
+  return;
+}
+
+/**
+ * Load Heartbeat Report
+ * Service (195, 1) OutRep
+ */
+void CrIaLoadHeartbeatReport()
+{
+  FwSmDesc_t rep;
+  CrFwGroup_t group = 1; /* group 1 PCAT = 2 */
+  
+  /* Create out component */
+  rep = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRIA_SERV195, CRIA_SERV195_HB_REP, 0, 0);
+  if (rep == NULL)
+    {
+      /* handled by Resource FdCheck */
+      DEBUGP("ERROR: CrIaLoadHeartbeatReport cannot generate a packet!\n");
+      return;
+    }
+  
+  /* Set out component parameters */
+  CrFwOutCmpSetGroup(rep, group);
+  
+  CrFwOutCmpSetDest(rep, CR_FW_CLIENT_OBC);
+  
+  CrFwOutLoaderLoad(rep);
+
+  return;
+}
+
+/**
+ * Load Aocs Report 
+ * Service (196, 1) OutRep
+ */
+void CrIaLoadAocsReport() /* used in CrIaIaswFunc */
+{
+  FwSmDesc_t rep;
+  CrFwGroup_t group = 2; /* group 2 PCAT = 3 */
+  
+  /* Create an out component */
+  rep = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRIA_SERV196, CRIA_SERV196_AOCS_REP, 0, 0);
+  if (rep == NULL)
+    {
+      /* handled by Resource FdCheck */
+      return;
+    }
+  
+  /* Set out component parameters */
+  CrFwOutCmpSetGroup(rep, group);
+  
+  CrFwOutCmpSetDest(rep, CR_FW_CLIENT_OBC); /* obc: CR_FW_CLIENT_OBC, grnd: CR_FW_CLIENT_GRD_PUS */
+  
+  CrFwOutLoaderLoad(rep);
+
+  return;
+}
+
+/**
+ * Load Sem Service 9 time command
+ * Service (9, 1) OutCmd
+ */
+void CrIaLoadSemTimeCmd() /* used in CrIaSemFunc */
+{
+  /* S9 command for the time distribution */
+  CrFwBool_t SemTimeCmdAcceptFlag   = 0;
+  CrFwBool_t SemTimeCmdStartFlag    = 0;
+  CrFwBool_t SemTimeCmdProgressFlag = 0;
+  CrFwBool_t SemTimeCmdTermFlag     = 0;
+  
+  /* prepare the Load TC(9,129) to SEM */
+  smDescSemTimeCmd = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRSEM_SERV9, CRSEM_SERV9_CMD_TIME_UPDATE, 0, 0);
+  
+  if (smDescSemTimeCmd != NULL) 
+    {
+      CrFwOutCmpSetAckLevel(smDescSemTimeCmd, SemTimeCmdAcceptFlag, SemTimeCmdStartFlag, SemTimeCmdProgressFlag, SemTimeCmdTermFlag);
+      CrFwOutCmpSetDest(smDescSemTimeCmd, CR_FW_CLIENT_SEM);
+      /* NOTE: the time is set in the update action of serv 9 outCmd */	    
+    }
+
+  CrFwOutLoaderLoad(smDescSemTimeCmd);
+  
+  return;
+}
+
+
+void CrIbRebootDpu()
+{
+  /* nothing to do */
+}
+
+
+void CrIbResetDpu()
+{
+  /* nothing to do */
+}
+
+
+#ifdef PC_TARGET
+CrFwBool_t CrIbIsSemPcktAvail(CrFwDestSrc_t src)
+{
+  unsigned int MaxSemPcktCyc;
+
+  /* DEBUGP("\nCrIbIsSemPcktAvail()\n"); */
+  CRIA_UNUSED(src);
+  
+  CrIaCopy(MAX_SEM_PCKT_CYC_ID, &MaxSemPcktCyc);
+  if (PcSemCycleCount < MaxSemPcktCyc)
+    {
+      PcSemCycleCount++;
+      return socketCheckPackageAvailable(fdSem);
+    }
+  
+  DEBUGP("SEM Cycle count exceeded!\n");
+  return 0;
+}
+#endif /* PC_TARGET */
+
+
+#ifdef PC_TARGET
+CrFwPckt_t CrIbSemPcktCollect(CrFwDestSrc_t src)
+{
+  DEBUGP("\nCrIbSemPcktCollect() \n");
+  CRIA_UNUSED(src);
+  PcSemCollPckt++;
+  return socketReceivePackage(fdSem);  
+}
+#endif /* PC_TARGET */
+
+
+#ifdef PC_TARGET
+CrFwBool_t CrIbSemPcktHandover(CrFwPckt_t pckt)
+{
+  DEBUGP("\nCrIbSemPcktHandover()\n");
+  InsertCrc(pckt);
+  return socketSendPackageOnExistingConnection(fdSem, pckt);
+}
+#endif /* PC_TARGET */
+
+
+CrFwBool_t CrIbIsObcPcktAvail(CrFwDestSrc_t src)
+{
+  (void) src;
+  return CrIbIsMilBusPcktAvail(CR_FW_CLIENT_OBC);
+}
+
+CrFwBool_t CrIbIsGrdPcktAvail(CrFwDestSrc_t src)
+{
+  (void) src;
+  return CrIbIsMilBusPcktAvail(CR_FW_CLIENT_GRD);
+}
+
+CrFwPckt_t CrIbObcPcktCollect(CrFwDestSrc_t src)
+{
+  (void) src;
+  return CrIbMilBusPcktCollect(CR_FW_CLIENT_OBC);
+}
+
+CrFwPckt_t CrIbGrdPcktCollect(CrFwDestSrc_t src)
+{
+  (void) src;
+  return CrIbMilBusPcktCollect(CR_FW_CLIENT_GRD);
+}
+
+
+#ifdef PC_TARGET
+CrFwBool_t CrIbIsMilBusPcktAvail(CrFwDestSrc_t src)
+{
+  CRIA_UNUSED(src);
+  return socketCheckPackageAvailable(socketObc); /* on PC, we only have OBC */
+}
+#endif /* PC_TARGET */
+
+
+#ifdef PC_TARGET
+CrFwPckt_t CrIbMilBusPcktCollect(CrFwDestSrc_t src)
+{
+  CRIA_UNUSED(src);
+  return socketReceivePackage(socketObc); /* on PC, we only have OBC */
+}
+#endif /* PC_TARGET */
+
+
+#ifdef PC_TARGET
+CrFwBool_t CrIbMilBusPcktHandover(CrFwPckt_t pckt)
+{
+  CrFwPcktLength_t len;
+  
+  DEBUGP("\nCrIbMilBusPcktHandover()\n");
+  
+  /* usleep(60000); */ /* 62.5 ms ~ 16 Hz */
+  /* instead of the sleep we imitate the milbus via fill state */
+  
+  len = CrFwPcktGetLength(pckt);
+  
+  if ((PcMilUsed + len) > 2048)
+    return 0;
+  
+  PcMilUsed += len; /* the slot is reset at the end of a cycle */
+  
+  return socketSendPackageOnExistingConnection(socketObc, pckt);;
+}
+#endif /* PC_TARGET */
+
+
+CrFwBool_t CrIbMilBusPcktHandoverPrepare(CrFwPckt_t pckt)
+{
+#if (__sparc__)
+  InsertCrc(pckt);
+#endif /* __sparc__ */
+  return CrIbMilBusPcktHandover(pckt);
+}
+
+CrFwBool_t CrIbSemPcktHandoverPrepare(CrFwPckt_t pckt)
+{
+#if (__sparc__)
+  InsertCrc(pckt);
+#endif /* __sparc__ */
+  return CrIbSemPcktHandover(pckt);
+}
+
+
+#ifdef PC_TARGET
+static void *accept_connections(void *ptr)
+{
+  int fd=0;
+  struct th_arg arg, *p_arg;
+  struct sockaddr_storage client_addr;
+  socklen_t client_addr_len;
+  
+  p_arg = (struct th_arg *) ptr;
+  
+  arg.sock_fd = p_arg->sock_fd;
+  arg.conn_fd = p_arg->conn_fd;
+  
+  /**
+   * for simplicity, close an existing connection
+   * as soon as anther client connects.
+   * if we really need to have multiple clients at once, we'll have to manage
+   * file descriptors in one fd_set per socket
+   */
+  
+  client_addr_len = sizeof(client_addr);
+  while(1)
+    {
+      fd = accept((*arg.sock_fd), (struct sockaddr *) &client_addr, &client_addr_len);
+      if (fd < 0) {
+	perror("accept");
+	exit(EXIT_FAILURE);
+      }
+      
+      if((*arg.conn_fd))
+	{
+	  close((*arg.conn_fd));
+	}
+      
+      (*arg.conn_fd) = fd;
+    }
+}
+#endif /* PC_TARGET */
+
+
+#ifdef PC_TARGET
+static int setupConnection(const char* url)
+{
+  char *str;
+  int sockfd, endpoint;
+  int optval=1;
+  struct sockaddr_in server;
+  
+  struct sigaction sigint;
+  
+  str = malloc(strlen(url)+1);
+  if (str == NULL)
+    {
+      perror("ERROR setting up connection\n");
+      exit(EXIT_FAILURE);
+    }
+  strcpy(str,url);
+  
+  /* don't getaddrinfo(), explicitly bind to given address */
+  server.sin_addr.s_addr = inet_addr(strtok(str, ":"));
+  server.sin_family = AF_INET;
+  server.sin_port = htons(atoi(strtok(NULL, ":")));
+  
+  free(str);
+  
+  sockfd = socket(AF_INET , SOCK_STREAM , 0);
+  
+  if (sockfd < 0)
+    {
+      DEBUGP("socket creation failed: %s\n", strerror(errno));
+      exit(EXIT_FAILURE);
+    }
+  setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
+   
+  endpoint = bind(sockfd, (struct sockaddr *) &server , sizeof(server));
+  
+  if (endpoint < 0)
+    {
+      close(sockfd);
+      DEBUGP("could not bind endpoint %s: %s\n", url, strerror(errno));
+      exit(EXIT_FAILURE);
+    }
+
+  sigint.sa_handler = sigint_handler;
+  sigemptyset(&sigint.sa_mask);
+  sigint.sa_flags = 0;
+  if (sigaction(SIGINT, &sigint, NULL) == -1)
+    {
+      perror("sigaction");
+      close(sockfd);
+      exit(EXIT_FAILURE);
+    }
+  
+  if (listen(sockfd, 0) < 0)
+    {
+      close(sockfd);
+      perror("listen");
+      exit(EXIT_FAILURE);
+    }
+  
+  return sockfd;
+}
+#endif /* PC_TARGET */
+
+#ifdef PC_TARGET
+static void shutdownSocket(int socket)
+{
+  int ret = 0;
+  
+  ret = shutdown(socket, 0);
+  if (ret == -1)
+    {
+      DEBUGP("socket shutdown failed: %s\n", strerror(errno));
+    }
+  
+  return;
+}
+#endif /* PC_TARGET */
+
+
+void pollConnectionSem()
+{
+  FwSmDesc_t inStream;
+  
+  if (CrIbIsSemPcktAvail(0) == 0)
+    {
+      return;
+    }
+  
+  inStream = CrFwInStreamGet(CR_FW_CLIENT_SEM);
+  CrFwInStreamPcktAvail(inStream);
+  
+  return;
+}
+
+
+static void pollConnectionMil()
+{
+  FwSmDesc_t localInStreamObc, localInStreamGrd;
+  
+  if (CrIbIsObcPcktAvail(CR_FW_CLIENT_OBC) != 0)
+    {
+      /* DEBUGP("get pckt from OBC\n"); */
+      localInStreamObc = CrFwInStreamGet(CR_FW_CLIENT_OBC);
+      CrFwInStreamPcktAvail(localInStreamObc);	    
+    }
+  
+  if (CrIbIsGrdPcktAvail(CR_FW_CLIENT_GRD) != 0)
+    {
+      /* DEBUGP("get pckt from GRD\n"); */
+      localInStreamGrd = CrFwInStreamGet(CR_FW_CLIENT_GRD);
+      CrFwInStreamPcktAvail(localInStreamGrd);	    
+    }
+
+  return;
+}
+
+void InsertCrc(CrFwPckt_t pckt)
+{
+  CrIaPcktCrc_t Chk;
+  CrFwPcktLength_t len, i;
+    
+  /* Calculate CRC */
+  Chk = 0xFFFF;
+  if (!LTblInit)
+    {
+      InitLtbl(LTbl);
+      LTblInit = 1;
+    }
+  len = CrFwPcktGetLength(pckt) - sizeof(CrIaPcktCrc_t);
+  for (i=0; i<len; ++i)
+    {
+      Chk = Crc(pckt[i], Chk, LTbl);
+    }
+  Chk = cpu_to_le16(Chk);
+  CrIaPcktSetCrc(pckt, Chk);
+
+  return;
+}
+
+
+#ifdef PC_TARGET
+/* just a dummy. implementation only in OBC simulation. */
+__attribute__((unused))
+static void reRouteCnC(CrFwPckt_t pckt)
+{
+  CRIA_UNUSED(pckt);
+}
+#endif
+
+
+#ifdef PC_TARGET
+/*
+ * Function:  socketCheckPackageAvailable()
+ * -----------------------------------
+ * Check if package is available on given socket.
+ *
+ *  fdType: specifies the socket endpoint: e.g. fdGrnd or fdIasw or fdObc
+ *
+ *  returns: 0 in case of error, 1 in case of success.
+ */
+static CrFwBool_t socketCheckPackageAvailable(int fdType)
+{
+  __attribute__((unused)) int i;
+  ssize_t recv_bytes;
+  char recv_buffer_small[6];
+  unsigned short int packet_length;
+  char recv_buffer[CR_IA_MAX_SIZE_PCKT_LARGE];
+  struct timeval timeout;
+  
+  fd_set readset;
+  
+  if(!fdType)
+    return 0;
+  
+  timeout.tv_sec=0;
+  timeout.tv_usec=500;
+  
+  FD_ZERO(&readset);
+  FD_SET(fdType, &readset);
+  
+  if(select(FD_SETSIZE, &readset, NULL, NULL, &timeout) <= 0)
+    {
+      return 0;	/* socket's not ready */
+    }
+  
+  /* check if there's at least a valid PUS header in the recv stream
+   * we obviously assume that the top of the recv queue always
+   * starts with a valid PUS header
+   * if this must be safe, we need circular recv buffers and a
+   * full packet inspection
+   */
+  recv_bytes = recv(fdType, recv_buffer_small, 6, MSG_PEEK);
+  if (recv_bytes <= 0)
+    {
+      perror("socketCheckPackageAvailable()");
+      close(fdType);
+      return 0;
+    }
+  /*for (i=0; i<recv_bytes; i++) {
+    DEBUGP("%x-",recv_buffer[i]);
+    }
+    DEBUGP("\n");*/
+  
+  if (recv_bytes == 6)
+    {
+      DEBUGP("\nat least 6 bytes received \n");
+      packet_length = ((unsigned short int) recv_buffer_small[4] << 8) | (((unsigned short int) recv_buffer_small[5]) & 0x00ff);
+      /* ecss say: C = (Number of octets in packet data field) - 1 */
+      packet_length++;
+      DEBUGP("the packet length is: %d \n", packet_length);
+
+      recv_bytes = recv(fdType, recv_buffer, packet_length+6, MSG_PEEK);
+      DEBUGP("got all bytes: %d \n", recv_bytes);      
+
+      if (recv_bytes == packet_length+6)
+        {
+          DEBUGP("\npacket is available \n");
+          return 1;
+        }
+      else if (recv_bytes < packet_length+6) 
+        {
+          DEBUGP("\nclear: %d Bytes \n", recv_bytes);
+          recv_bytes = recv(fdType, recv_buffer, recv_bytes, 0);
+	  (void) recv_bytes;
+        } 
+    }
+  
+  return 0;
+}
+#endif /* PC_TARGET */
+
+
+#ifdef PC_TARGET
+/*
+ * Function:  socketSendPackageOnExistingConnection()
+ * -----------------------------------
+ * Sends given package via existing socket connection.
+ *
+ *  pckt: The framework package type CrFwPckt_t holding the package that will be sent.
+ *  fdType: specifies the socket endpoint: e.g. fdGrnd or fdIasw or fdObc
+ *
+ *  returns: 0 in case of error, 1 in case of success.
+ */
+static CrFwBool_t socketSendPackageOnExistingConnection(int fdType, CrFwPckt_t pckt)
+{
+  int ret;
+  char *buf;
+  CrFwPcktLength_t len, __attribute__((unused)) len1;
+  CrFwTimeStamp_t __attribute__((unused)) timeS;
+  
+  /* Christian: check TimeStamp and insert CRC */
+  DEBUGP("InsertCrc (existing connection)\n");
+  InsertCrc(pckt);
+  len = CrFwPcktGetLength(pckt);
+  DEBUGP("len = %d\n", len);
+  
+  buf = malloc(len);
+  if (buf == NULL)
+    {
+      perror("ERROR setting up connection\n");
+      exit(EXIT_FAILURE);
+    }
+  memcpy(buf, pckt, len);
+  
+  ret = send_all(fdType, buf, len);
+  
+  free(buf);
+  
+  if (ret)
+    {
+      DEBUGP("socket send failed to transmit all bytes: %d remaining\n", ret);
+      return 0;
+    }
+  
+  DEBUGP ("package sent:");
+  printPackageInfo(pckt);
+  
+  return 1;
+}
+#endif /* PC_TARGET */
+
+
+#ifdef PC_TARGET
+/*
+ * Function:  socketSendPackageOnNewConnection()
+ * -----------------------------------
+ * Opens socket connection to specified host url and sends given package. Socket is closed afterwards.
+ *
+ *  pckt: The framework package type CrFwPckt_t holding the package that will be sent.
+ *  url:  String holding the socket url (inclusive port).
+ *
+ *  returns: 0 in case of error, 1 in case of success.
+ */
+__attribute__((unused))
+static CrFwBool_t socketSendPackageOnNewConnection(CrFwPckt_t pckt, const char* url)
+{
+  int ret, sockfd, endpoint;
+  char *buf, *str;
+  struct sockaddr_in server;
+  CrFwPcktLength_t len;
+  __attribute__((unused)) CrFwTimeStamp_t timeS;
+  
+  /* Christian: check TimeStamp and insert CRC */
+  DEBUGP("InsertCrc (new connection)\n");
+  InsertCrc(pckt);
+  len = CrFwPcktGetLength(pckt);
+  DEBUGP("len = %d\n", len);
+  
+  buf = malloc(len);
+  if (buf == NULL)
+    {
+      perror("ERROR setting up connection\n");
+      exit(EXIT_FAILURE);
+    }
+  memcpy(buf, pckt, len);
+  
+  str = malloc(strlen(url));
+  if (str == NULL)
+    {
+      perror("ERROR setting up connection\n");
+      exit(EXIT_FAILURE);
+    }
+  strcpy(str, url);
+  
+  server.sin_addr.s_addr = inet_addr(strtok(str, ":"));
+  server.sin_family = AF_INET;
+  server.sin_port = htons(atoi(strtok(NULL, ":")));
+  free(str);
+  
+  sockfd = socket(AF_INET , SOCK_STREAM , 0);
+  endpoint = connect(sockfd, (struct sockaddr *) &server , sizeof(server));
+  if (endpoint < 0)
+    {
+      close(sockfd);
+      free(buf);
+      DEBUGP("could not connect to endpoint: %s\n", url);
+      return 0;
+    }
+  
+  ret = send_all(sockfd, buf, len);
+  free(buf);
+  
+  if (ret)
+    {
+      DEBUGP("socket send failed to transmit all bytes: %d remaining\n", ret);
+      return 0;
+    }
+  
+  DEBUGP ("package sent to: %s\n", url);
+  printPackageInfo(pckt);
+  close(endpoint);
+  close(sockfd);
+  
+  return 1;
+}
+#endif /* PC_TARGET */
+
+
+#ifdef PC_TARGET
+/*
+ * Function:  socketReceivePackage()
+ * -----------------------------------
+ * Receives package as bytes on a given server socket. This method is called by collection methods like: CrIbGrndPcktCollect() and CrIbMilBusPcktCollect()
+ *
+ * fdType: specifies the socket endpoint: e.g. fdGrnd or fdIasw or fdObc
+ *
+ *  returns: The framework package type CrFwPckt_t
+ */
+static CrFwPckt_t socketReceivePackage(int fdType)
+{
+  __attribute__((unused)) int i;
+  ssize_t recv_bytes;
+  unsigned short int packet_length;
+  char recv_buffer_small[6];
+  char recv_buffer[CR_IA_MAX_SIZE_PCKT_LARGE];
+  CrFwPckt_t pckt;
+   
+  /* peek at the header again and try to fetch a packet*/
+  recv_bytes = recv(fdType, recv_buffer_small, 6, MSG_PEEK);
+  if (recv_bytes < 6)
+    {
+      DEBUGP("ERROR reading from socket\n");
+    }
+  
+  /* DEBUGP("Received header\n"); */
+  
+  packet_length = ((unsigned short int) recv_buffer_small[4] << 8) | (((unsigned short int) recv_buffer_small[5]) & 0x00ff);
+  /* ecss say: C = (Number of octets in packet data field) - 1 */
+  packet_length++;
+  
+  recv_bytes = recv(fdType, recv_buffer, packet_length+6, 0);
+  
+  if (recv_bytes == -1)
+    {
+      perror("receivePackageOnSocket()");
+      return NULL;
+    }
+  /* DEBUGP("recv_bytes: %d ", recv_bytes);
+     for (i=0; i<recv_bytes; i++) {
+     
+     DEBUGP("%x-",(unsigned int)recv_buffer[i]&0xff);
+     
+     }
+     DEBUGP("\n"); */
+  debugPacket(recv_buffer, packet_length+6);
+  
+  if ((((ssize_t) packet_length)+6) != recv_bytes)
+    {
+      DEBUGP("returning NULL \n");
+      return NULL;
+    }
+  
+  DEBUGP("CrFwPcktMake with a length of %d bytes\n", recv_bytes);
+  pckt = CrFwPcktMake((CrFwPcktLength_t)recv_bytes);
+  if (pckt == NULL)
+    {
+      DEBUGP("CrFwPcktMake returned null on %d bytes\n", recv_bytes);
+      return NULL;
+    }
+  memcpy(pckt, recv_buffer, ((int)recv_bytes));
+  /*	free(recv_buffer); */
+  
+  /* DEBUG: Injecting specific package.*/
+  /*pckt = CrFwPcktMake((CrFwPcktLength_t) (12));
+    memcpy(pckt, srv17TcIasw, 12); */
+  
+  DEBUGP ("package received:\n");
+  printPackageInfo(pckt);
+  
+  reRouteCnC(pckt);
+  
+  return pckt;
+}
+#endif /* PC_TARGET */
+
+
+#ifdef PC_TARGET
+static int socketConnectPoll(const char* url)
+{
+  int sockfd, ret;
+  char *str;
+  struct sockaddr_in server;
+  
+  DEBUGP("connecting to endpoint: %s\n", url);
+  
+  str = malloc(strlen(url)+1);
+  if (str == NULL)
+    {
+      perror("ERROR setting up connection\n");
+      exit(EXIT_FAILURE);
+    }
+  strcpy(str, url);
+  
+  server.sin_addr.s_addr = inet_addr(strtok(str, ":"));
+  server.sin_family = AF_INET;
+  server.sin_port = htons(atoi(strtok(NULL, ":")));
+  free(str);
+  sockfd = socket(AF_INET , SOCK_STREAM , 0);
+  while(1)
+    {
+      ret = connect(sockfd, (struct sockaddr *) &server , sizeof(server));
+      if (ret < 0)
+	{
+	  sleep(1);
+	}
+      else
+	{
+	  return sockfd;
+	}
+    }
+}
+#endif /* PC_TARGET */
+
+
+#ifdef PC_TARGET
+static void debugPacket(char* pckt, size_t size)
+{
+  size_t i;
+  
+  for (i = 0; i < size; i++)
+    {
+      if (i > 0) DEBUGP(":");
+      DEBUGP("%02X", (unsigned char)pckt[i]);
+    }
+  DEBUGP("\n");
+  
+  return;
+}
+#endif /* PC_TARGET */
+
+
+__attribute__((unused)) static void printPackageInfo(CrFwPckt_t pckt)
+{
+  /* CLANG does not see DEBUGP using these variables */
+  __attribute__((unused)) CrFwDestSrc_t pcktDest; 
+  __attribute__((unused)) CrFwDestSrc_t pcktSrc;
+  __attribute__((unused)) CrFwGroup_t group;
+  __attribute__((unused)) char* str;
+
+  int type;
+  
+  pcktDest = CrFwPcktGetDest(pckt);
+  pcktSrc = CrFwPcktGetSrc(pckt);
+  type = CrFwPcktGetCmdRepType(pckt);
+  group = CrFwPcktGetGroup(pckt);
+  if (type == crCmdType)
+    {
+      str = "command";
+    }
+  else
+    {
+      str = "report";
+    }
+  DEBUGP("Package -- sourceID: %d, destID: %d, packetType: %s, Group: %d \n", pcktSrc, pcktDest, str, group);
+
+  return;
+}
diff --git a/CrIa/src/CrIaIasw.h b/CrIa/src/CrIaIasw.h
new file mode 100644
index 0000000..2f4415d
--- /dev/null
+++ b/CrIa/src/CrIaIasw.h
@@ -0,0 +1,204 @@
+/**
+ * @file CrIaIasw.h
+ * @authors V. Cechticky and A. Pasetti, P&P Software GmbH, 2015; R. Ottensamer and C. Reimers, Institute for Astrophysics, 2015-2016
+ *
+ * @brief Functions provided or called by the IASW.
+ *
+ * These functions define the call-back interface that the IASW software
+ * provides or uses.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef CRIA_IASW_H
+#define CRIA_IASW_H
+
+/* Includes */
+#include <CrFwConstants.h>
+#include <CrIaDataPool.h> /* for MAX_ID_ALGO */
+#include <stddef.h> 
+
+#define MAX_PUS_PACKET_SIZE 65542		/* 16 bit addressing + 6 header bytes */
+
+/* Constants as of CHEOPS-PNP-INST-RS-001, issue 8.1, section 13, HbSem Monitoring Function */
+#define HBSEM_MON_LIM 6 
+#define HBSEM_MON_PER 160 /* cycles */
+
+/* global variable for state machine descriptor for the SEM state machine */
+extern FwSmDesc_t smDescSem, smDescIasw;
+extern FwSmDesc_t smDescFdTelescopeTempMonitorCheck, smDescFdIncorrectSDSCntrCheck, smDescFdSemCommErrCheck;
+extern FwSmDesc_t smDescFdSemModeTimeOutCheck, smDescFdSemSafeModeCheck, smDescFdSemAliveCheck;
+extern FwSmDesc_t smDescFdSemAnomalyEventCheck, smDescFdSemLimitCheck, smDescFdDpuHousekeepingCheck;
+extern FwSmDesc_t smDescFdCentroidConsistencyCheck, smDescFdResourceCheck, smDescFdSemModeConsistencyCheck;
+extern unsigned char CRSEM_SERV5_EVENT_PRG_THERMAL_STABILITY_SET;
+extern FwSmDesc_t outStreamSem, outStreamObc, outStreamGrd;
+extern FwSmDesc_t smDescSdu2, smDescSdu4;
+extern FwSmDesc_t smDescSdb;
+extern FwSmDesc_t smDescAlgoCent0, smDescAlgoCent1, smDescAlgoTtc1, smDescAlgoTtc2, smDescAlgoAcq1, smDescAlgoCmpr, smDescAlgoSaaEval, smDescAlgoSdsEval;
+extern FwSmDesc_t algoSm[MAX_ID_ALGO];
+
+/* global variable for procedure descriptor for the Science Procedure */
+extern FwPrDesc_t prDescNomSci, prDescAcqFullDrop, prDescCalFullSnap, prDescSciStack;
+extern FwPrDesc_t prDescPrepSci, prDescSciDataUpd, prDescSaveImages, prDescTransferFbfToGround;
+extern FwPrDesc_t prDescCentAlgo, prDescAcq1AlgoExec, prDescCmprAlgoExec, prDescTtc1aft, prDescTtc1front, prDescTtc2aft, prDescTtc2front;
+extern FwPrDesc_t prDescFbfLoad, prDescFbfSave;
+extern FwPrDesc_t prDescCentVal, prDescSaaEval, prDescSdsEval;
+extern FwPrDesc_t prDescSemInit, prDescSemShutdown, prDescCtrldSwitchOffIasw;
+extern FwPrDesc_t prDescSemAnoEvtRP, prDescHbSemMon, prDescSemModeConsistencyCheck;
+extern FwPrDesc_t procPr[MAX_ID_PROC];
+
+/* global handles for TM/TCs */
+extern FwSmDesc_t smDescSemTimeCmd;
+
+/* global variable used by SEM Unit State Machine */
+extern FwSmDesc_t inStreamSem; 
+
+/* global handles For FdCheck */
+extern unsigned int fdSemCommErrCnt;
+extern CrFwBool_t CMD_MODE_TRANSITION_TO_POWERON_Flag;
+extern CrFwBool_t CMD_MODE_TRANSITION_TO_SAFE_Flag;
+extern CrFwBool_t CMD_MODE_TRANSITION_TO_STAB_Flag;
+extern CrFwBool_t CMD_MODE_TRANSITION_TO_TEMP_Flag;
+extern CrFwBool_t CMD_MODE_TRANSITION_TO_CCDWIN_Flag;
+extern CrFwBool_t CMD_MODE_TRANSITION_TO_CCDFULL_Flag;
+extern CrFwBool_t CMD_MODE_TRANSITION_TO_DIAG_Flag;
+extern CrFwBool_t CMD_MODE_TRANSITION_TO_STANDBY_Flag;
+extern CrFwBool_t FD_SDSC_ILL_Flag, FD_SDSC_OOS_Flag; 
+
+/* S21 globals. */
+#if (__sparc__)
+extern struct CrIaSib incomingSibInStruct;
+extern struct CrIaSib outgoingSibInStruct; 
+#else
+extern struct CrIaSib *ShmIncomingSibInPTR; /* shared memory for fork() */
+extern struct CrIaSib *ShmOutgoingSibInPTR; /* shared memory for fork() */
+#endif /* (__sparc__) */
+
+/* our collection of flags */
+extern unsigned int   S21LastAcqId;
+extern unsigned short S21LastPacketNum;
+extern unsigned char  S21_Flag1;
+extern unsigned char  signal_Ta;
+extern unsigned char  S196Flag;
+
+extern CrFwBool_t firstCycleAcqCycTtc2;
+
+/* Demo Specific Interface */
+void setupConnections();
+void shutdownConnections();
+
+#if (__sparc__)
+#include "../../ifsw.h"
+#else
+#define RTCONT_ACQ 4
+#define RTCONT_CMPR 5
+#define DEADLINE_ACQ 0.0f
+#define DEADLINE_CMPR 0.0f
+unsigned short cpu1_notification (unsigned short action);
+void run_acquisition(void);
+void run_compression(void);
+void execute_acquisition(void);
+void execute_compression(void);
+void run_rt(unsigned int rt_id, float deadline, void (*behaviour) (void));
+#endif /* __sparc__ */
+
+extern unsigned int *sibAddressFull, *cibAddressFull, *gibAddressFull;
+extern unsigned int *sibAddressWin, *cibAddressWin, *gibAddressWin;
+
+extern CrFwPckt_t S21SemPacket;
+
+#include "Sdp/SdpBuffers.h"
+
+
+/**
+ * Interface provided by the IASW and called by the IBSW.
+ *
+ * \return 0 in case of success, -1 in case of error.
+ */
+int CrIaInit();
+
+void CrIaEvtRaise(CrFwServSubType_t SubType, unsigned short evtId, unsigned short *evtData, unsigned int DataSize);
+
+void SdpEvtRaise(CrFwServSubType_t SubType, unsigned short evtId, unsigned short *evtData, unsigned int DataSize);
+
+void CrIaEvtRep(CrFwServSubType_t SubType, unsigned short evtId, unsigned short *evtData, unsigned int DataSize);
+
+void CrIaErrRep(CrFwServSubType_t SubType, unsigned short evtId, unsigned short *evtData, unsigned int DataSize);
+
+void CrIaExecCycActivities();
+
+void CrIaLoadSemTimeCmd();
+
+void CrIaOutStreamConnectionAvail(FwSmDesc_t smDesc);
+
+/* Interface provided by IBSW and called by the IASW */
+CrFwBool_t CrIbIsSemPcktAvail(CrFwDestSrc_t src);
+CrFwPckt_t CrIbSemPcktCollect(CrFwDestSrc_t src);
+CrFwBool_t CrIbSemPcktHandover(CrFwPckt_t pckt);
+
+CrFwBool_t CrIbIsObcPcktAvail(CrFwDestSrc_t src);
+CrFwBool_t CrIbIsGrdPcktAvail(CrFwDestSrc_t src);
+CrFwBool_t CrIbIsMilBusPcktAvail(CrFwDestSrc_t src);
+CrFwPckt_t CrIbObcPcktCollect(CrFwDestSrc_t src);
+CrFwPckt_t CrIbGrdPcktCollect(CrFwDestSrc_t src);
+CrFwPckt_t CrIbMilBusPcktCollect(CrFwDestSrc_t src);
+
+CrFwBool_t CrIbMilBusPcktHandover(CrFwPckt_t pckt);
+CrFwBool_t CrIbMilBusPcktHandoverPrepare(CrFwPckt_t pckt);
+CrFwBool_t CrIbSemPcktHandoverPrepare(CrFwPckt_t pckt);
+
+/* framework wants "Fw" not "Ib" */
+CrFwTimeStamp_t CrFwGetCurrentTime();
+
+#ifdef PC_TARGET
+/*extern unsigned int requestAcquisition;*/ 
+/*extern unsigned int requestCompression;*/
+/* global handles for shared memory for fork() for PC simulation */
+extern unsigned int *ShmRequestAcquisitionPTR; /* shared memory for fork() */
+extern unsigned int *ShmRequestCompressionPTR; /* shared memory for fork() */
+
+extern struct DataPoolCordet dpCordet;
+extern struct DataPoolIasw dpIasw;
+extern struct DataPoolIbsw dpIbsw;
+#endif /* PC_TARGET */
+
+/* time interface for PC simulation */
+#ifdef PC_TARGET
+CrFwTimeStamp_t CrIbGetCurrentTime();
+CrFwTimeStamp_t CrIbGetNextTime();
+unsigned int CrIbGetNotifyCnt();
+void CrIbUpdateDataPoolVariablesWithValuesFromIbswSysctlTree(unsigned int hz);
+#endif /* PC_TARGET */
+
+/* heater switches stubs for PC */
+#ifdef PC_TARGET
+enum heater {HEATER_1, HEATER_2, HEATER_3, HEATER_4};
+void fpga_heater_on(enum heater h);
+void fpga_heater_off(enum heater h);
+#endif /* PC_TARGET */
+
+/* flash stubs for PC */
+#ifdef PC_TARGET
+int CrIbFlashIsReady(void);
+void CrIbFbfClose(unsigned char fbf);
+void CrIbFbfOpen(unsigned char fbf);
+int CrIbFlashTriggerWrite(unsigned char fbf, unsigned int *mem);
+int CrIbFlashTriggerRead(unsigned char fbf, unsigned short block, unsigned int *mem);
+unsigned int flash_gen_logical_addr(unsigned int block, unsigned int page, unsigned int offset);
+#endif /* PC_TARGET */
+
+void CrIaLoadHeartbeatReport();
+
+void CrIaLoadAocsReport();
+
+#endif /* CRIA_IASW_H */
+
diff --git a/CrIa/src/CrIaInCmp.c b/CrIa/src/CrIaInCmp.c
new file mode 100644
index 0000000..6642b3b
--- /dev/null
+++ b/CrIa/src/CrIaInCmp.c
@@ -0,0 +1,114 @@
+/**
+ * @file CrIaInCmp.c
+ * @ingroup CrIaDemo
+ *
+ * Implmentation of Cordet Framework adaptation points for InComponents.
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH, 2014
+ */
+
+/* Includes */
+#include <string.h>
+#include "FwProfile/FwPrConfig.h"
+#include "CrFramework/Pckt/CrFwPckt.h"
+#include "CrFwCmpData.h"
+#include "CrIaPckt.h"
+#include <byteorder.h>
+
+#include <string.h>
+
+#include <IfswDebug.h>
+#include <IfswUtilities.h>
+
+int LTblInit; /* set in CrIaInit to 0 */
+CrIaPcktCrc_t LTbl[256];
+
+
+CrFwBool_t CheckCrc(CrFwPckt_t pckt)
+{
+  CrIaPcktCrc_t CrcPckt;
+  CrIaPcktCrc_t CrcCheck;
+  CrFwPcktLength_t len, i;
+  
+  /* Get stored CRC from packet */
+  CrcPckt = CrIaPcktGetCrc(pckt);
+  
+  /* Calculate CRC from packet */
+  CrcCheck = 0xFFFF;
+  if (!LTblInit)
+    {
+      InitLtbl(LTbl);
+      LTblInit = 1;
+    }	
+  len = CrFwPcktGetLength(pckt) - sizeof(CrIaPcktCrc_t);
+  for (i=0; i<len; ++i)
+    {
+      CrcCheck = Crc(pckt[i], CrcCheck, LTbl);
+    }
+  CrcCheck = be16_to_cpu(CrcCheck);
+  
+  DEBUGP("CRC stored in packet: %d \nCRC calculated from package: %d \n", CrcPckt, CrcCheck);
+  
+  /* Compare stored and calculated CRC
+   * 0 = failure
+   * 1 = success
+   */
+  return (CrcPckt == CrcCheck);
+}
+
+CrFwBool_t CrIaInCmdValidityCheck(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* cmpSpecificData;
+  CrFwPckt_t pckt;
+  
+  cmpData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+  pckt = cmpSpecificData->pckt;
+  
+  DEBUGP("CrIaInCmdValidityCheck: prDesc is at home at %08x\n", (unsigned int)prDesc);
+  
+  /* Check checksum of InCmd. Note that this also implicitly verifies the
+     correctness of the command's length. This is because function CheckCrc
+     uses the command length to locate the position of the CRC field. hence,
+     if the command length is incorrect, the CRC cannot be found and the
+     CRC check fails */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* Ckeck length of InCmd: NOTE is done implicitly with previous check of CRC */
+  DEBUGP("CrIaInCmdValidityCheck: length = %d\n", CrFwPcktGetLength(pckt));
+  
+  return 1;
+}
+
+CrFwBool_t CrIaInRepValidityCheck(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t* cmpData;
+  CrFwInRepData_t* cmpSpecificData;
+  CrFwPckt_t pckt;
+  
+  cmpData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInRepData_t*)(cmpData->cmpSpecificData);
+  pckt = cmpSpecificData->pckt;
+  
+  DEBUGP("CrIaInRepValidityCheck: prDesc is at home at %08x\n", (unsigned int)prDesc);
+  
+  /* No CRC check for service 21 InReps */
+  if (CrFwPcktGetServType(pckt) != 21)
+    {
+      /* Check checksum of InRep */
+      if (!CheckCrc(pckt))
+        {
+          SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+          return 0;
+        }
+    }
+  
+  return 1;
+}
+
diff --git a/CrIa/src/CrIaInCmp.h b/CrIa/src/CrIaInCmp.h
new file mode 100644
index 0000000..5b591e2
--- /dev/null
+++ b/CrIa/src/CrIaInCmp.h
@@ -0,0 +1,28 @@
+/**
+ * @file CrIaInCmp.h
+ * @ingroup CrIaDemo
+ *
+ * Implmentation of Cordet Framework adaptation points for InComponents.
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH, 2014
+ */
+
+#ifndef CRIA_INCMP_H
+#define CRIA_INCMP_H
+
+/* Includes */
+#include <FwPrConstants.h>
+#include <CrFwConstants.h>
+
+extern int LTblInit;
+extern CrIaPcktCrc_t LTbl[256];
+
+CrFwBool_t CheckCrc(CrFwPckt_t pckt);
+
+CrFwBool_t CrIaInCmdValidityCheck(FwPrDesc_t prDesc);
+
+CrFwBool_t CrIaInRepValidityCheck(FwPrDesc_t prDesc);
+
+#endif /* CRIA_INCMP_H */
+
diff --git a/CrIa/src/CrIaInLoader.c b/CrIa/src/CrIaInLoader.c
new file mode 100644
index 0000000..043e67d
--- /dev/null
+++ b/CrIa/src/CrIaInLoader.c
@@ -0,0 +1,42 @@
+/**
+ * @file CrIaInLoader.c
+ * @ingroup CrIaDemo
+ *
+ * Implementation of the functions used by the InLoader component.
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH, 2014
+ */
+
+/* Includes */
+#include <stdlib.h>
+#include "CrIaInLoader.h"
+#include "IfswDebug.h"
+
+CrFwInstanceId_t CrIaInLoaderGetInManager(CrFwServType_t servType,
+		CrFwServSubType_t servSubType, CrFwDiscriminant_t discriminant,
+		CrFwCmdRepType_t cmdRepFlag)
+{
+  CRIA_UNUSED(servType);
+  CRIA_UNUSED(servSubType);
+  CRIA_UNUSED(discriminant);
+  if (cmdRepFlag == crRepType)
+    {
+      /* incoming TM packets from SEM */
+      DEBUGP("CrIaInLoaderGetInManager: incoming TM packets from SEM\n");
+      return 0;
+    }
+  /* incoming TC packets from Grnd / OBC */
+  DEBUGP("CrIaInLoaderGetInManager: incoming TM packets from Grnd / OBC\n");
+  return 1;
+}
+
+CrFwDestSrc_t CrIaInLoaderGetReroutingDestination(CrFwDestSrc_t pcktDest)
+{
+  if ((pcktDest == CR_FW_CLIENT_SEM) || 
+      (pcktDest == CR_FW_CLIENT_OBC) ||
+      (pcktDest == CR_FW_CLIENT_GRD))
+      return pcktDest; /* Packet must be re-routed to the SEM, OBC or GRD */
+  else
+    return 0; /* Packet destination is invalid */
+}
diff --git a/CrIa/src/CrIaInLoader.h b/CrIa/src/CrIaInLoader.h
new file mode 100644
index 0000000..54edf50
--- /dev/null
+++ b/CrIa/src/CrIaInLoader.h
@@ -0,0 +1,26 @@
+/**
+ * @file CrIaInLoader.h
+ * @ingroup CrIaDemo
+ *
+ * Definition of the functions used by the InLoader component.
+ *
+ * \see CrFwInLoader.h
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH, 2014
+ */
+
+#ifndef CRIA_INLOADER_H
+#define CRIA_INLOADER_H
+
+/* Includes */
+#include <CrFwConstants.h>
+#include "CrFwUserConstants.h"
+
+CrFwInstanceId_t CrIaInLoaderGetInManager(CrFwServType_t servType, CrFwServSubType_t servSubType,
+					  CrFwDiscriminant_t discriminant, CrFwCmdRepType_t cmdRepFlag);
+
+CrFwDestSrc_t CrIaInLoaderGetReroutingDestination(CrFwDestSrc_t pcktDest);
+
+#endif /* CRIA_INLOADER_H */
+
diff --git a/CrIa/src/CrIaMain.c b/CrIa/src/CrIaMain.c
new file mode 100644
index 0000000..1d2fedf
--- /dev/null
+++ b/CrIa/src/CrIaMain.c
@@ -0,0 +1,279 @@
+/**
+ * @file CrIaDemoMain.c
+ * @ingroup CrIaDemo
+ *
+ * Implementation of the functionality of the IBSW.
+ *
+ * This module is an emulation of the functionality of the Instrument Basic
+ * Software (IBSW). Its main responsibility for the demo application is to run
+ * an infinite loop that triggers the IASW components.
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH, 2014
+ */
+
+#define IASW_ENDPOINT_GRND "tcp://*:5571"
+#define IASW_ENDPOINT_SEM "tcp://*:5572"
+#define BILLION 1000000000
+#define CYCLIC_INTERVAL 125000000 /* 125 ms */
+
+typedef struct timespec Time;
+
+/* Includes DEBUG staff */
+#include "IfswDebug.h"
+
+/* Includes */
+#include "CrIaIasw.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <stdint.h>
+#include <unistd.h> /* for fork() */
+
+#ifdef PC_TARGET
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+#include <Services/General/CrIaConstants.h>
+#include <ScienceDataProcessing.h>
+#include <EngineeringAlgorithms.h>
+#include <TargetAcquisition.h>
+#include <IfswConversions.h>
+#include <sys/ipc.h> /* for shared memory */
+#include <sys/shm.h> /* for shared memory */
+#include <unistd.h> /* for fork() */
+#include <string.h> /* mor memcpy */
+#endif /* PC_TARGET */
+
+static unsigned int nOfNotif_ID[N_RT_CONT] = {
+	NOFNOTIF_1_ID, NOFNOTIF_2_ID, NOFNOTIF_3_ID, NOFNOTIF_4_ID,
+	NOFNOTIF_5_ID};
+
+/* Prototypes */
+int startCyclicActivities();
+Time addTime(Time t1, Time t2);
+int diffTime(Time t3, Time t4);
+
+int main() {
+	if (CrIaInit() == -1) return EXIT_FAILURE;
+
+#ifdef PC_TARGET
+	setupConnections();
+
+	DEBUGP("start cyclic execution IASW %u\n", BUILD); 
+	if (startCyclicActivities() == -1) return EXIT_FAILURE;
+
+	shutdownConnections();
+#else
+	/** TODO **/
+#endif /* PC_TARGET */
+
+	return EXIT_SUCCESS;
+}
+
+#ifdef PC_TARGET
+int startCyclicActivities() 
+{
+/*  int ShmID;   */
+/*  int *ShmPTR; */
+  pid_t pid;
+/*  int status; */
+  int ShmRequestAcquisitionID;
+  int ShmRequestCompressionID;
+  int ShmOutgoingSibInID;
+  int ShmIncomingSibInID;
+  int ShmdpCordetID;
+  int ShmdpIaswID;
+  int ShmdpIbswID;
+  struct DataPoolCordet *pdpCordet;
+  struct DataPoolIasw *pdpIasw;
+  struct DataPoolIbsw *pdpIbsw;
+  unsigned short status;
+  unsigned int rt_idx;
+  unsigned int nOfNotif;
+  unsigned char FdCheckDpuHousekeepingIntEn, FdCheckResourceIntEn;
+  short valueShort, ADC_TEMP1_RAW, DPU_N5V_RAW;
+  float valueFloat;
+
+  Time nextTime, interval;
+
+  interval.tv_sec = 0;
+  interval.tv_nsec = CYCLIC_INTERVAL;
+
+  if (clock_gettime(CLOCK_MONOTONIC, &nextTime) == -1)
+    {
+      perror("clock_gettime error");
+      return -1;
+    }
+
+  ShmRequestAcquisitionID = shmget(IPC_PRIVATE, sizeof(unsigned int),   IPC_CREAT | 0666);
+  ShmRequestCompressionID = shmget(IPC_PRIVATE, sizeof(unsigned int),   IPC_CREAT | 0666);
+  ShmOutgoingSibInID = shmget(IPC_PRIVATE, sizeof(struct CrIaSib),   IPC_CREAT | 0666);
+  ShmIncomingSibInID = shmget(IPC_PRIVATE, sizeof(struct CrIaSib),   IPC_CREAT | 0666);
+
+  ShmRequestAcquisitionPTR = (unsigned int *)   shmat(ShmRequestAcquisitionID, NULL, 0);
+  ShmRequestCompressionPTR = (unsigned int *)   shmat(ShmRequestCompressionID, NULL, 0);
+  ShmOutgoingSibInPTR = (struct CrIaSib *)   shmat(ShmOutgoingSibInID, NULL, 0);
+  ShmIncomingSibInPTR = (struct CrIaSib *)   shmat(ShmIncomingSibInID, NULL, 0);
+
+  ShmdpCordetID = shmget(IPC_PRIVATE, sizeof(struct DataPoolCordet), IPC_CREAT | 0666);
+  ShmdpIaswID = shmget(IPC_PRIVATE, sizeof(struct DataPoolIasw), IPC_CREAT | 0666);
+  ShmdpIbswID = shmget(IPC_PRIVATE, sizeof(struct DataPoolIbsw), IPC_CREAT | 0666);
+
+  pdpCordet = (struct DataPoolCordet *) shmat(ShmdpCordetID,  NULL, 0);
+  pdpIasw = (struct DataPoolIasw *) shmat(ShmdpIaswID,  NULL, 0);
+  pdpIbsw = (struct DataPoolIbsw *) shmat(ShmdpIbswID,  NULL, 0);  
+
+  memcpy (pdpCordet, &dpCordetInit, sizeof(struct DataPoolCordet));
+  memcpy (pdpIasw, &dpIaswInit, sizeof(struct DataPoolIasw));
+  memcpy (pdpIbsw, &dpIbswInit, sizeof(struct DataPoolIbsw));
+
+  /* fork */
+  pid = fork();
+
+  if (!pid)
+    {
+      initDpAddresses(pdpCordet, pdpIasw, pdpIbsw);
+
+      usleep(10000);
+
+      /* child: CPU2 */
+      while (1)
+        {
+          usleep(1000);
+
+          /* waiting for notifications */
+
+         if (ShmRequestAcquisitionPTR[0] > 0)
+            {
+              DEBUGP(">>>\n>>> CPU2 was notified for ACQUISITION (Cnt: %d), and start TargetAcquisition ...\n>>>\n", ShmRequestAcquisitionPTR[0]);
+
+              CrIaCopy(CPU2PROCSTATUS_ID, &status);  
+
+              if (status == SDP_STATUS_IDLE)
+                {
+                  status = SDP_STATUS_ACQUISITION;
+                  CrIaPaste(CPU2PROCSTATUS_ID, &status);  
+
+                  TargetAcquisition(ShmOutgoingSibInPTR);
+
+                  status = SDP_STATUS_IDLE;
+                  CrIaPaste(CPU2PROCSTATUS_ID, &status);  
+                  ShmRequestAcquisitionPTR[0]--;    
+                }
+
+              DEBUGP(">>>\n>>> CPU2 finished TargetAcquisition ...\n>>>\n");
+            }
+
+          if (ShmRequestCompressionPTR[0] > 0)
+            {
+              DEBUGP(">>>\n>>> CPU2 was notified COMPRESSION (Cnt: %d), and start ScienceProcessing ...\n>>>\n", ShmRequestCompressionPTR[0]);
+
+              CrIaCopy(CPU2PROCSTATUS_ID, &status);  
+
+              /* increment nOfNotif */
+              rt_idx = 0;
+              CrIaCopy(nOfNotif_ID[rt_idx], &nOfNotif);
+              nOfNotif++;
+              CrIaPaste(nOfNotif_ID[rt_idx], &nOfNotif);
+
+              DEBUGP("nOfNotif = %d\n", nOfNotif);
+
+              if (status == SDP_STATUS_IDLE)
+                {
+                  status = SDP_STATUS_SCIENCE;
+                  CrIaPaste(CPU2PROCSTATUS_ID, &status);  
+
+                  ScienceProcessing();
+
+                  status = SDP_STATUS_IDLE;
+                  CrIaPaste(CPU2PROCSTATUS_ID, &status);  
+                  ShmRequestCompressionPTR[0]--;
+                }
+
+              DEBUGP(">>>\n>>> CPU2 finished ScienceProcessing ...\n>>>\n");
+            }
+
+        }
+
+    } 
+  else if (pid > 0) 
+    {
+      initDpAddresses(pdpCordet, pdpIasw, pdpIbsw);
+
+      usleep(10000);
+
+      /* Enable DPU housekeeping FdCheck */
+      FdCheckDpuHousekeepingIntEn = 1;
+      CrIaPaste(FDCHECKDPUHKINTEN_ID, &FdCheckDpuHousekeepingIntEn);
+
+      /* Enable Resource FdCheck */
+      FdCheckResourceIntEn = 1;
+      CrIaPaste(FDCHECKRESINTEN_ID, &FdCheckResourceIntEn);
+
+      /* Initialize temperature values */
+      DPU_N5V_RAW = 3504; /* = -5.12488317489624 V */
+      CrIaPaste(ADC_N5V_RAW_ID, &DPU_N5V_RAW);
+      valueShort = 3300; /* = -16.437718 degC */
+      CrIaPaste(ADC_TEMPOH1A_RAW_ID, &valueShort);
+      CrIaPaste(ADC_TEMPOH2A_RAW_ID, &valueShort);
+      CrIaPaste(ADC_TEMPOH3A_RAW_ID, &valueShort);
+      CrIaPaste(ADC_TEMPOH4A_RAW_ID, &valueShort);
+      CrIaPaste(ADC_TEMPOH1B_RAW_ID, &valueShort);
+      CrIaPaste(ADC_TEMPOH2B_RAW_ID, &valueShort);
+      CrIaPaste(ADC_TEMPOH3B_RAW_ID, &valueShort);
+      CrIaPaste(ADC_TEMPOH4B_RAW_ID, &valueShort);
+      ADC_TEMP1_RAW = 4700; /* = 19.545044 degC */
+      CrIaPaste(ADC_TEMP1_RAW_ID, &ADC_TEMP1_RAW);
+      valueFloat = convertToTempEngVal_DPU(ADC_TEMP1_RAW) + CONVERT_KTODEGC;
+      CrIaPaste(ADC_TEMP1_ID, &valueFloat);
+
+      /* parent: CPU1 */
+      while (1)
+        {
+          CrIaExecCycActivities();
+          nextTime = addTime(nextTime, interval);
+          clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &nextTime, NULL);
+        }
+
+    }
+  else 
+    {
+      perror("fork error");
+      return -1;
+
+    }
+
+  return 0;
+}
+
+Time addTime(Time t1, Time t2) {
+	Time resTime;
+	long sec = t2.tv_sec + t1.tv_sec;
+	long nsec = t2.tv_nsec + t1.tv_nsec;
+	if (nsec >= BILLION) {
+		nsec -= BILLION;
+		sec++;
+	}
+	resTime.tv_sec = sec;
+	resTime.tv_nsec = nsec;
+	return resTime;
+}
+
+int diffTime(Time t3, Time t4) {
+	Time resTime;
+	long sec = t4.tv_sec - t3.tv_sec;
+	long nsec = t4.tv_nsec - t3.tv_nsec;
+	if (nsec < 0) {
+		nsec += BILLION;
+		sec--;
+	}
+	resTime.tv_sec = sec;
+	resTime.tv_nsec = nsec;
+	if(resTime.tv_sec<0) {
+		return 1;
+	} else {
+		return 0;
+	}
+}
+#endif /* PC_TARGET */
diff --git a/CrIa/src/CrIaOutCmp.c b/CrIa/src/CrIaOutCmp.c
new file mode 100644
index 0000000..620ff3b
--- /dev/null
+++ b/CrIa/src/CrIaOutCmp.c
@@ -0,0 +1,48 @@
+/**
+ * @file CrIaOutCmp.c
+ * @ingroup CrIaDemo
+ *
+ * Implmentation of Cordet Framework adaptation points for OutComponents.
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH, 2014
+ */
+
+/* Includes */
+#include <CrFwConstants.h>
+#include <Pckt/CrFwPckt.h>
+#include <FwSmConfig.h>
+#include "CrFwCmpData.h"
+#include "CrIaPckt.h"
+
+/**
+ * Set packet values fixed for the IASW.
+ *
+ * Fixed fields in the TC / TM packets are.
+ *  - Version Number (always binary '000')
+ *  - Data Field Header flag (always binary '1')
+ *  - Sequence / Segmentation flags (always binary '11')
+ *  - PUS version number (always binary '001')
+ *  - CRC
+ *  - CRC not done because of Mantis 756
+ */
+static void CrIaPcktSetFixedFields(CrFwPckt_t pckt)
+{
+  CrIaPcktSetVersion(pckt, 0x00);
+  CrIaPcktSetDataFieldFlag(pckt, 0x01);
+  CrIaPcktSetSeqFlags(pckt, 0x03);
+  CrIaPcktSetPusVersion(pckt, 0x01);
+  return;
+}
+
+
+void CrIaOutCmpDefSerialize(FwSmDesc_t smDesc)
+{
+  CrFwPckt_t pckt;
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  pckt = cmpSpecificData->pckt;
+  CrIaPcktSetFixedFields(pckt);
+  return;
+}
+
diff --git a/CrIa/src/CrIaOutCmp.h b/CrIa/src/CrIaOutCmp.h
new file mode 100644
index 0000000..cbda279
--- /dev/null
+++ b/CrIa/src/CrIaOutCmp.h
@@ -0,0 +1,20 @@
+/**
+ * @file CrIaOutCmp.h
+ * @ingroup CrIaDemo
+ *
+ * Implmentation of Cordet Framework adaptation points for OutComponents.
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH, 2014
+ */
+
+#ifndef CRIA_OUTCMP_H
+#define CRIA_OUTCMP_H
+
+/* Includes */
+#include <CrFwConstants.h>
+
+void CrIaOutCmpDefSerialize(FwSmDesc_t smDesc);
+
+#endif /* CRIA_OUTCMP_H */
+
diff --git a/CrIa/src/CrIaOutLoader.c b/CrIa/src/CrIaOutLoader.c
new file mode 100644
index 0000000..1995fd6
--- /dev/null
+++ b/CrIa/src/CrIaOutLoader.c
@@ -0,0 +1,64 @@
+/**
+ * @file CrIaOutLoader.c
+ * @ingroup CrIaDemo
+ *
+ * Implementation of the functions used by the InLoader component.
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH, 2014
+ */
+
+/* Includes */
+#include "CrFwUserConstants.h"
+#include "CrIaOutLoader.h"
+#include "CrFwCmpData.h"
+#include <Pckt/CrFwPckt.h>
+#include <OutManager/CrFwOutManager.h>
+#include <FwSmConfig.h>
+#include <Services/General/CrIaParamGetter.h>
+
+FwSmDesc_t CrIaOutLoaderGetOutManager(FwSmDesc_t outCmp)
+{
+  CrFwCmpData_t* data;
+  CrFwOutCmpData_t* cmpSpecificData;
+  CrFwPckt_t pckt;
+  CrFwServType_t servType;
+  CrFwServSubType_t servSubType;
+  CrFwCmdRepType_t cmdRepType;
+  CrFwDestSrc_t dest;
+  unsigned char sduId = 0;
+
+  /* Get package */
+  data	= (CrFwCmpData_t*)FwSmGetData(outCmp);
+  cmpSpecificData = (CrFwOutCmpData_t*)(data->cmpSpecificData);
+  pckt = cmpSpecificData->pckt;
+
+  servType = CrFwPcktGetServType(pckt);
+  servSubType = CrFwPcktGetServSubType(pckt);
+  cmdRepType = CrFwPcktGetCmdRepType(pckt);
+  dest = CrFwPcktGetDest(pckt);
+  
+  /* OutManager2 and OutManager3 controls all service 13 reports to the OBC/Ground */
+  if (cmdRepType == crRepType
+      && servType == 13
+      && dest == CR_FW_CLIENT_GRD)
+    {
+      
+      /* get SduId */
+      if (servSubType==1)
+        CrIaServ13FstDwlkParamGetSduId(&sduId, pckt);
+      if (servSubType==2)
+        CrIaServ13IntmDwlkParamGetSduId(&sduId, pckt);
+      if (servSubType==3)
+        CrIaServ13LastDwlkParamGetSduId(&sduId, pckt);
+      
+      if (sduId==2)
+        return CrFwOutManagerMake(1); /* controlled by OutManager 2 */
+      if ((sduId==3) || (sduId==4))
+        return CrFwOutManagerMake(2); /* controlled by OutManager 3 */
+      
+    }
+
+  /* Everything else is controlled by OutManager1 */
+  return CrFwOutManagerMake(0);
+}
diff --git a/CrIa/src/CrIaOutLoader.h b/CrIa/src/CrIaOutLoader.h
new file mode 100644
index 0000000..99ce574
--- /dev/null
+++ b/CrIa/src/CrIaOutLoader.h
@@ -0,0 +1,23 @@
+/**
+ * @file CrIaOutLoader.h
+ * @ingroup CrIaDemo
+ *
+ * Definition of the functions used by the OutLoader component.
+ *
+ * \see CrFwOutLoader.h
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH, 2014
+ */
+
+#ifndef CRIA_OUTLOADER_H
+#define CRIA_OUTLOADER_H
+
+/* Includes */
+#include <FwSmConstants.h>
+
+FwSmDesc_t CrIaOutLoaderGetOutManager(FwSmDesc_t outCmp);
+
+#endif /* CRIA_OUTLOADER_H */
+
+
diff --git a/CrIa/src/CrIaPckt.c b/CrIa/src/CrIaPckt.c
new file mode 100644
index 0000000..0a030a1
--- /dev/null
+++ b/CrIa/src/CrIaPckt.c
@@ -0,0 +1,777 @@
+/**
+ * @file CrIaPckt.c
+ * @ingroup CrIaDemo
+ *
+ * Default implementation of the packet interface of CrFwPckt.h.
+ *
+ * The implementation of this interface is one of the adaptation points of the
+ * CORDET Framework.
+ *
+ * This file provide the implementation for the IASW application.
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH, 2014
+ */
+
+/* Includes */
+#include "IfswDebug.h"
+#include "CrIaPckt.h"
+
+/* for CR_FW_PCAT_SEM_TC */
+#include "CrFwUserConstants.h"
+
+#include <BaseCmp/CrFwBaseCmp.h>
+#include <Pckt/CrFwPckt.h>
+#include <UtilityFunctions/CrFwUtilityFunctions.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#ifdef PC_TARGET
+#include <arpa/inet.h>
+#include <byteorder.h>
+#endif /* PC_TARGET */
+
+
+/**
+ * The array holding the small packets.
+ */
+static char pcktArraySmall[CR_IA_NOF_PCKT_SMALL * CR_IA_MAX_SIZE_PCKT_SMALL];
+
+/**
+ * The array holding the large packets.
+ */
+static char pcktArrayLarge[CR_IA_NOF_PCKT_LARGE * CR_IA_MAX_SIZE_PCKT_LARGE];
+
+/**
+ * The array holding the "in use" status of small packets.
+ *
+ * A packet is in use if it has been requested through a call to the "make"
+ * function and has not yet been released through a call to the "release"
+ * function.
+ */
+/* static CrFwBool_t pcktInUseSmall[CR_IA_MAX_SIZE_PCKT_SMALL] = {0}; */
+static CrFwBool_t pcktInUseSmall[CR_IA_NOF_PCKT_SMALL] = {0}; 
+
+/**
+ * The array holding the "in use" status of large packets.
+ *
+ * A packet is in use if it has been requested through a call to the "make"
+ * function and has not yet been released through a call to the "release"
+ * function.
+ */
+/* static CrFwBool_t pcktInUseLarge[CR_IA_MAX_SIZE_PCKT_LARGE] = {0}; */
+static CrFwBool_t pcktInUseLarge[CR_IA_NOF_PCKT_LARGE] = {0}; 
+
+/**
+ * The number of currently allocated packets.
+ */
+static CrFwCounterU2_t nOfAllocatedPckts = 0;
+
+
+CrFwDestSrc_t CrIaPcktGetPid(CrFwPckt_t pckt)
+{
+  char pid0, pid1;
+  /* The packet header should be valid */
+  pid0 = (pckt[OFFSET_ID_FIELD] & PID0_MASK);
+  pid1 = (pckt[OFFSET_ID_FIELD + 1] & PID1_MASK) >> PID1_SHIFT;
+  return ((pid0 << 4) | pid1);
+}
+
+void CrIaPcktSetPid(CrFwPckt_t pckt, CrFwDestSrc_t pid)
+{
+  char pid0, pid1;
+  /* The packet header should be valid */
+  pckt[OFFSET_ID_FIELD] &= (~PID0_MASK);
+  pckt[OFFSET_ID_FIELD + 1] &= (~PID1_MASK);
+  /* Split pid in one 3 (pid0) and one 4 bit (pid1) parts */
+  pid0 = ((pid & 0x70) >> 4);
+  pid1 = (pid & 0x0F);
+  pckt[OFFSET_ID_FIELD] |= pid0;
+  pckt[OFFSET_ID_FIELD + 1] |= (pid1 << PID1_SHIFT);
+  return;
+}
+
+unsigned short CrIaPcktGetApid(CrFwPckt_t pckt)
+{
+  char apid0, apid1;
+  /* The packet header should be valid */
+  apid0 = (pckt[OFFSET_ID_FIELD] & PID0_MASK);
+  apid1 = pckt[OFFSET_ID_FIELD + 1];
+  return ((apid0 << 8) | apid1);
+}
+
+unsigned short CrIaPcktGetPacketId(CrFwPckt_t pckt)
+{
+  char packetid0, packetid1;
+  /* The packet header should be valid */
+  packetid0 = pckt[OFFSET_ID_FIELD];
+  packetid1 = pckt[OFFSET_ID_FIELD + 1];
+  return ((packetid0 << 8) | packetid1);
+}
+
+CrFwGroup_t CrIaPcktGetPcat(CrFwPckt_t pckt)
+{
+  /* The packet header should be valid */
+  return (pckt[OFFSET_ID_FIELD + PCAT_OFFSET] & PCAT_MASK);
+}
+
+void CrIaPcktSetPcat(CrFwPckt_t pckt, CrFwGroup_t pcat)
+{
+  /* The packet header should be valid */
+  pckt[OFFSET_ID_FIELD + PCAT_OFFSET] &= (~PCAT_MASK);
+  pckt[OFFSET_ID_FIELD + PCAT_OFFSET] |= (pcat & PCAT_MASK);
+  return;
+}
+
+CrFwPckt_t CrFwPcktMake(CrFwPcktLength_t pcktLength)
+{
+  CrFwCounterU2_t i;
+  CrFwPcktLength_t pcktLengthPUS;
+  char pcktLengthPUSN[2];
+  char *buf;
+  
+  DEBUGP("the incoming length is %d\n", pcktLength);
+  
+  if (pcktLength > CR_IA_MAX_SIZE_PCKT_LARGE)
+    {
+      CrFwSetAppErrCode(crPcktAllocationFail);
+      return NULL;
+    }
+
+  if (pcktLength < SRC_PCKT_HDR_LENGTH + 2)
+    {
+      CrFwSetAppErrCode(crPcktAllocationFail);
+      return NULL;
+    }
+  
+  /* Calculate the PUS packet length */
+  pcktLengthPUS = pcktLength - SRC_PCKT_HDR_LENGTH - 1;
+  
+  /* it will be set using memcpy, so we better use a char array for that */
+  pcktLengthPUSN[0] = (pcktLengthPUS >> 8) & 0xff;
+  pcktLengthPUSN[1] = pcktLengthPUS & 0xff;
+  
+  DEBUGP("the length is %01x %01x\n", pcktLengthPUSN[0], pcktLengthPUSN[1]);
+  
+  if (pcktLength <= CR_IA_MAX_SIZE_PCKT_SMALL)
+    {
+      for (i=0; i<CR_IA_NOF_PCKT_SMALL; i++)
+	{
+	  if (pcktInUseSmall[i] == 0)
+	    {
+	      pcktInUseSmall[i] = 1;
+	      buf = &pcktArraySmall[(i*CR_IA_MAX_SIZE_PCKT_SMALL)+OFFSET_LENGTH_FIELD];
+	      memcpy(buf, &pcktLengthPUSN, sizeof(CrFwPcktLength_t));
+	      nOfAllocatedPckts++;
+	      buf = &pcktArraySmall[(i*CR_IA_MAX_SIZE_PCKT_SMALL)];
+	      return buf;
+	    }
+	}
+    }
+  else
+    {
+      for (i=0; i<CR_IA_NOF_PCKT_LARGE; i++)
+	{
+	  if (pcktInUseLarge[i] == 0)
+	    {
+	      pcktInUseLarge[i] = 1;
+	      buf = &pcktArrayLarge[(i*CR_IA_MAX_SIZE_PCKT_LARGE)+OFFSET_LENGTH_FIELD];
+	      memcpy(buf, &pcktLengthPUSN, sizeof(CrFwPcktLength_t));
+	      buf = &pcktArrayLarge[i*CR_IA_MAX_SIZE_PCKT_LARGE];
+	      nOfAllocatedPckts++;
+	      return buf;
+	    }
+	}
+    }
+  
+  CrFwSetAppErrCode(crPcktAllocationFail);
+  return NULL;
+}
+
+void CrFwPcktRelease(CrFwPckt_t pckt)
+{
+  CrFwCounterU2_t i;
+  char *buf;
+
+  if (pckt == NULL)
+    {
+      CrFwSetAppErrCode(crPcktRelErr);
+      return;
+    }
+  
+  if (CrFwPcktGetLength(pckt) <= CR_IA_MAX_SIZE_PCKT_SMALL)
+    {
+      for (i=0; i<CR_IA_NOF_PCKT_SMALL; i++)
+	{
+	  buf = &pcktArraySmall[i*CR_IA_MAX_SIZE_PCKT_SMALL];
+	  if (pckt == buf)
+	    {
+	      if (pcktInUseSmall[i] == 0)
+		{
+		  CrFwSetAppErrCode(crPcktRelErr);
+		}
+	      else
+		{
+		  nOfAllocatedPckts--;
+		  pcktInUseSmall[i] = 0;
+		}
+	      return;
+	    }
+	}
+    }
+  else
+    {
+      for (i=0; i<CR_IA_NOF_PCKT_LARGE; i++)
+	{
+	  buf = &pcktArrayLarge[i*CR_IA_MAX_SIZE_PCKT_LARGE];
+	  if (pckt == buf)
+	    {
+	      if (pcktInUseLarge[i] == 0)
+		{
+		  CrFwSetAppErrCode(crPcktRelErr);
+		}
+	      else
+		{
+		  nOfAllocatedPckts--;
+		  pcktInUseLarge[i] = 0;
+		}
+	      return;
+	    }
+	}
+    }
+  
+  CrFwSetAppErrCode(crPcktRelErr);
+  return;
+}
+
+CrFwCounterU2_t CrFwPcktGetNOfAllocated()
+{
+  return nOfAllocatedPckts;
+}
+
+CrFwPcktLength_t CrFwPcktGetMaxLength()
+{
+  return CR_IA_MAX_SIZE_PCKT_LARGE;
+}
+
+CrFwCmdRepType_t CrFwPcktGetCmdRepType(CrFwPckt_t pckt)
+{
+  unsigned char pusType;
+  /* The packet header should be valid */
+  pusType = ((pckt[OFFSET_ID_FIELD] & PCKT_TYPE_MASK) >> PCKT_TYPE_SHIFT);
+  if (pusType == 0)
+    {
+      return crRepType;
+    }
+  return crCmdType;
+}
+
+void CrFwPcktSetCmdRepType(CrFwPckt_t pckt, CrFwCmdRepType_t type)
+{
+  /* The packet header should be valid */
+  pckt[OFFSET_ID_FIELD] &= ~(PCKT_TYPE_MASK);
+  if (type == crCmdType)
+    {
+      pckt[OFFSET_ID_FIELD] |= (1 << PCKT_TYPE_SHIFT);
+    }
+  return;
+}
+
+CrFwPcktLength_t CrFwPcktGetLength(CrFwPckt_t pckt)
+{
+  CrFwPcktLength_t length;
+  /* The packet header should be valid */
+  length =  pckt[OFFSET_LENGTH_FIELD + 0] << 8;
+  length |= (pckt[OFFSET_LENGTH_FIELD + 1] & 0xff); 
+  
+  DEBUGP("our length is %d\n", length);
+  
+  /* The length is the PUS length. This is specified as 'packet_data_field-1' */
+  /* Christian: PACKET LENGTH + 1 + SRC_PCKT_HDR_LENGTH (=6) + incl. 2 Bytes length of CRC ? */
+  
+  return length + 1 + SRC_PCKT_HDR_LENGTH;
+}
+
+CrFwSeqCnt_t CrFwPcktGetSeqCtrl(CrFwPckt_t pckt)
+{
+  unsigned char seqCtrl0, seqCtrl1;
+  /* The packet header should be valid */
+  seqCtrl0 = pckt[OFFSET_SEQ_CTRL_FIELD];
+  seqCtrl1 = pckt[OFFSET_SEQ_CTRL_FIELD + 1];
+  return ((seqCtrl0 << 8) | seqCtrl1);
+}
+
+void CrFwPcktSetSeqCnt(CrFwPckt_t pckt, CrFwSeqCnt_t seqCnt)
+{
+  CrIaPcktSeqFlags_t storedFlags;
+  CrFwSeqCnt_t seqCntN;
+  storedFlags = CrIaPcktGetSeqFlags(pckt);
+  
+#ifdef PC_TARGET
+  /* endian handling must be defined */
+  seqCntN = (htons(seqCnt & SEQ_COUNT_MASK));
+#else 
+  seqCntN = seqCnt & SEQ_COUNT_MASK;
+#endif /* PC_TARGET */
+
+  /* The packet header should be valid */
+  memcpy(&pckt[OFFSET_SEQ_CTRL_FIELD], &seqCntN, sizeof(CrFwSeqCnt_t));
+  /* Restore sequence flags */
+  CrIaPcktSetSeqFlags(pckt, storedFlags);
+  
+  return;
+}
+
+CrFwSeqCnt_t CrFwPcktGetSeqCnt(CrFwPckt_t pckt)
+{
+  CrFwSeqCnt_t seqCntH, seqCntN;
+  /* The packet header should be valid */
+  memcpy(&seqCntN, &pckt[OFFSET_SEQ_CTRL_FIELD], sizeof(CrFwSeqCnt_t));
+  
+#ifdef PC_TARGET
+  /* endian handling must be defined */
+  seqCntH = ntohs(seqCntN);
+#else
+  seqCntH = seqCntN;
+#endif /* PC_TARGET */
+  
+  return (seqCntH & SEQ_COUNT_MASK);
+}
+
+void CrIaPcktSetCCSDSFlag(CrFwPckt_t pckt, CrFwBool_t flag)
+{
+  /* The packet header should be valid */
+  pckt[OFFSET_DATA_FIELD_TC_TM] &= ~(CCSDS_MASK);
+  if (flag)
+    {
+      pckt[OFFSET_DATA_FIELD_TC_TM] |= (1 << CCSDS_SHIFT);
+    }
+  return;
+}
+
+CrFwBool_t CrIaPcktGetCCSDSFlag(CrFwPckt_t pckt)
+{
+  /* The packet header should be valid */
+  return ((pckt[OFFSET_DATA_FIELD_TC_TM] & CCSDS_MASK) >> CCSDS_SHIFT);
+}
+
+CrFwTimeStamp_t CrFwPcktGetTimeStamp(CrFwPckt_t pckt)
+{
+  /* No endian conversion for timestamp */
+  CrFwTimeStamp_t timeStamp;
+  if (CrFwPcktGetCmdRepType(pckt) == crCmdType)
+    {
+      memset(&timeStamp, 0, sizeof(CrFwTimeStamp_t));
+      return timeStamp;
+    }
+  /* The packet header should be valid */
+  memcpy(&timeStamp, &pckt[OFFSET_DATA_FIELD_TC_TM + SC_TIME_OFFSET], sizeof(CrFwTimeStamp_t));
+  return timeStamp;
+}
+
+void CrFwPcktSetTimeStamp(CrFwPckt_t pckt, CrFwTimeStamp_t timeStamp)
+{
+  CrFwTimeStamp_t timeStamp_f;
+  
+  if (CrFwPcktGetCmdRepType(pckt) == crCmdType)
+    {
+      return;
+    }
+  
+  memcpy(timeStamp_f.t, timeStamp.t, sizeof(timeStamp.t)/sizeof(timeStamp.t[0]));
+  
+  /* The packet header should be valid */
+  memcpy(&pckt[OFFSET_DATA_FIELD_TC_TM + SC_TIME_OFFSET], &timeStamp_f, sizeof(CrFwTimeStamp_t));
+
+  return;
+}
+
+
+CrFwDiscriminant_t CrFwPcktGetDiscriminant(CrFwPckt_t pckt)
+{
+  /* The packet header should be valid */
+  if ((CrFwPcktGetServType(pckt) == 3) && (CrFwPcktGetServSubType(pckt) == 25))
+    {
+      CrFwDiscriminant_t disc = pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT];
+      return disc;
+    }
+  else if ((CrFwPcktGetServType(pckt) == 5) 
+	   && ((CrFwPcktGetServSubType(pckt) == 1) 
+	       ||  (CrFwPcktGetServSubType(pckt) == 2) 
+	       ||  (CrFwPcktGetServSubType(pckt) == 3) 
+	       ||  (CrFwPcktGetServSubType(pckt) == 4)))
+    {
+      CrFwDiscriminant_t disc = ((pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0] << 8) |
+				 (pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1] & 0xff));
+      return disc;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+
+void CrFwPcktSetDiscriminant(CrFwPckt_t pckt, CrFwDiscriminant_t discriminant)
+{
+  /* The packet header should be valid */
+  if ((CrFwPcktGetServType(pckt) == 3) && (CrFwPcktGetServSubType(pckt) == 25))
+    {
+      pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT] = discriminant;
+    }
+  else if ((CrFwPcktGetServType(pckt) == 5) 
+	   && ((CrFwPcktGetServSubType(pckt) == 1) 
+	       ||  (CrFwPcktGetServSubType(pckt) == 2) 
+	       ||  (CrFwPcktGetServSubType(pckt) == 3) 
+	       ||  (CrFwPcktGetServSubType(pckt) == 4)))
+    {
+      pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1] = (discriminant >> 8);
+      pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0] = (discriminant & 0xFF);
+    }
+  
+  return;
+}
+
+void CrFwPcktSetServType(CrFwPckt_t pckt, CrFwServType_t servType)
+{
+  /* The packet header should be valid */
+  pckt[OFFSET_DATA_FIELD_TC_TM + SRV_TYPE_OFFSET] = servType;
+  return;
+}
+
+CrFwServType_t CrFwPcktGetServType(CrFwPckt_t pckt)
+{
+  /* The packet header should be valid */
+  return (pckt[OFFSET_DATA_FIELD_TC_TM + SRV_TYPE_OFFSET]);
+}
+
+void CrFwPcktSetServSubType(CrFwPckt_t pckt, CrFwServSubType_t servSubType)
+{
+  /* The packet header should be valid */
+  pckt[OFFSET_DATA_FIELD_TC_TM + SRV_SUBTYPE_OFFSET] = servSubType;
+  return;
+}
+
+CrFwServSubType_t CrFwPcktGetServSubType(CrFwPckt_t pckt)
+{
+  /* The packet header should be valid */
+  return (pckt[OFFSET_DATA_FIELD_TC_TM + SRV_SUBTYPE_OFFSET]);
+}
+
+void CrFwPcktSetGroup(CrFwPckt_t pckt, CrFwGroup_t group)
+{
+  CrIaPcktSetPcat(pckt, group+1);
+  return;
+}
+
+/* Group is not the PCAT, it is derived from the PCAT */
+CrFwGroup_t CrFwPcktGetGroup(CrFwPckt_t pckt) 
+{
+  CrFwGroup_t pcat;
+  
+  pcat = CrIaPcktGetPcat(pckt);
+  
+  switch (pcat)
+    {
+    case CR_FW_PCAT_SEM_TC :
+      /* case CR_FW_PCAT_DPU_TC : */
+    case CR_FW_PCAT_SEM_TM :
+      /* case CR_FW_PCAT_DPU_TM_SERV1_5_6 : */ 
+      return 0;
+      
+    case CR_FW_PCAT_DPU_TM_SERV13 :
+      return 3;
+      
+    case CR_FW_PCAT_DPU_TM_SERV196 : 
+      return 2;
+      
+    case CR_FW_PCAT_DPU_TM_OTHER : 
+      return 1;
+      
+    default:
+      break;
+    }
+  
+  return 0xEE;      
+}
+
+void CrFwPcktSetDest(CrFwPckt_t pckt, CrFwDestSrc_t dest)
+{
+  CrFwDestSrc_t mappedDest;
+  
+  mappedDest = dest;
+  if (dest == CR_FW_CLIENT_GRD)
+    {
+      mappedDest = CR_FW_CLIENT_GRD_PUS;
+    }
+  
+  if (CrFwPcktGetCmdRepType(pckt) == crCmdType)
+    {
+      CrIaPcktSetPid(pckt, mappedDest);
+      CrIaPcktSetPcat(pckt, CR_FW_PCAT_SEM_TC); /* commands get the SEM TC pcat */
+    }
+  else
+    {
+      /* The packet header should be valid */
+      pckt[OFFSET_DATA_FIELD_TC_TM + SRC_DEST_OFFSET] = mappedDest;
+    }
+  
+  return;
+}
+
+CrFwDestSrc_t CrFwPcktGetDest(CrFwPckt_t pckt)
+{
+  CrFwDestSrc_t rawDest;
+  if (CrFwPcktGetCmdRepType(pckt) == crCmdType)
+    {
+      rawDest = CrIaPcktGetPid(pckt);
+    }
+  else
+    {
+      /* The packet header should be valid */
+      rawDest = pckt[OFFSET_DATA_FIELD_TC_TM + SRC_DEST_OFFSET];
+    }
+  
+  if (rawDest == CR_FW_CLIENT_GRD_PUS)
+    {
+      return CR_FW_CLIENT_GRD;
+    }
+  else
+    {
+      return rawDest;
+    }
+}
+
+void CrFwPcktSetSrc(CrFwPckt_t pckt, CrFwDestSrc_t src)
+{
+  CrFwDestSrc_t mappedSrc;
+  mappedSrc = src;
+  if (src == CR_FW_CLIENT_GRD)
+    {
+      mappedSrc = CR_FW_CLIENT_GRD_PUS;
+    }
+  
+  if (CrFwPcktGetCmdRepType(pckt) == crCmdType)
+    {
+      /* The packet header should be valid */
+      pckt[OFFSET_DATA_FIELD_TC_TM + SRC_DEST_OFFSET] = mappedSrc;
+    }
+  else
+    {
+      CrIaPcktSetPid(pckt, mappedSrc);
+    }
+
+  return;
+}
+
+CrFwDestSrc_t CrFwPcktGetSrc(CrFwPckt_t pckt)
+{
+  CrFwDestSrc_t rawSrc;
+  if (CrFwPcktGetCmdRepType(pckt) == crCmdType)
+    {
+      /* The packet header should be valid */
+      rawSrc = (pckt[OFFSET_DATA_FIELD_TC_TM + SRC_DEST_OFFSET]);
+    }
+  else
+    {
+      rawSrc = CrIaPcktGetPid(pckt);
+    }
+  
+  if (rawSrc == CR_FW_CLIENT_GRD_PUS)
+    {
+      return CR_FW_CLIENT_GRD;
+    }
+  else
+    {
+      return rawSrc;
+    }
+}
+
+void CrFwPcktSetCmdRepId(CrFwPckt_t pckt, CrFwInstanceId_t id)
+{
+  /* Field not present */
+  (void)(pckt);
+  (void)(id);
+  return;
+}
+
+CrFwInstanceId_t CrFwPcktGetCmdRepId(CrFwPckt_t pckt)
+{
+  /* Field not present */
+  (void)(pckt);
+  return 0;
+}
+
+void CrFwPcktSetAckLevel(CrFwPckt_t pckt, CrFwBool_t accept, CrFwBool_t start,
+                         CrFwBool_t progress, CrFwBool_t term)
+{
+  /* The packet header should be valid */
+  pckt[OFFSET_DATA_FIELD_TC_TM] &= ~(ACK_MASK);
+  pckt[OFFSET_DATA_FIELD_TC_TM] |= (accept << ACK_A_SHIFT);
+  pckt[OFFSET_DATA_FIELD_TC_TM] |= (start << ACK_SE_SHIFT);
+  pckt[OFFSET_DATA_FIELD_TC_TM] |= (progress << ACK_PE_SHIFT);
+  pckt[OFFSET_DATA_FIELD_TC_TM] |= (term << ACK_CE_SHIFT);
+  return;
+}
+
+CrFwBool_t CrFwPcktIsAcceptAck(CrFwPckt_t pckt)
+{
+  /* The packet header should be valid */
+  return ((pckt[OFFSET_DATA_FIELD_TC_TM] & ACK_A_MASK) >> ACK_A_SHIFT);
+}
+
+CrFwBool_t CrFwPcktIsStartAck(CrFwPckt_t pckt)
+{
+  /* The packet header should be valid */
+  return ((pckt[OFFSET_DATA_FIELD_TC_TM] & ACK_SE_MASK) >> ACK_SE_SHIFT);
+}
+
+CrFwBool_t CrFwPcktIsProgressAck(CrFwPckt_t pckt)
+{
+  /* The packet header should be valid */
+  return ((pckt[OFFSET_DATA_FIELD_TC_TM] & ACK_PE_MASK) >> ACK_PE_SHIFT);
+}
+
+CrFwBool_t CrFwPcktIsTermAck(CrFwPckt_t pckt)
+{
+  /* The packet header should be valid */
+  return ((pckt[OFFSET_DATA_FIELD_TC_TM] & ACK_CE_MASK) >> ACK_CE_SHIFT);
+}
+
+char* CrFwPcktGetParStart(CrFwPckt_t pckt)
+{
+  /* The packet header should be valid */
+  if (CrFwPcktGetCmdRepType(pckt) == crCmdType)
+    {
+      return &pckt[OFFSET_SRC_DATA_CMD];
+    }
+  return &pckt[OFFSET_SRC_DATA_REP];
+}
+
+CrFwPcktLength_t CrFwPcktGetParLength(CrFwPckt_t pckt)
+{
+  if (CrFwPcktGetCmdRepType(pckt) == crCmdType)
+    {
+      return (CrFwPcktGetLength(pckt)-OFFSET_PAR_LENGTH_TC);
+    }
+  return (CrFwPcktGetLength(pckt)-OFFSET_PAR_LENGTH_TM);
+}
+
+void CrIaPcktSetVersion(CrFwPckt_t pckt, CrIaPcktVersion_t version)
+{
+  /* The packet header should be valid */
+  pckt[OFFSET_ID_FIELD] &= ~(VERSION_MASK);
+  pckt[OFFSET_ID_FIELD] |= ((version << VERSION_SHIFT) & VERSION_MASK);
+  return;
+}
+
+CrIaPcktVersion_t CrIaPcktGetVersion(CrFwPckt_t pckt)
+{
+  /* The packet header should be valid */
+  return ((pckt[OFFSET_ID_FIELD] & VERSION_MASK) >> VERSION_SHIFT);
+}
+
+void CrIaPcktSetDataFieldFlag(CrFwPckt_t pckt, CrFwBool_t flag)
+{
+  /* The packet header should be valid */
+  pckt[OFFSET_ID_FIELD] &= ~(HDR_FLAG_MASK);
+  if (flag)
+    {
+      pckt[OFFSET_ID_FIELD] |= (1 << HDR_FLAG_SHIFT);
+    }
+  return;
+}
+
+CrFwBool_t CrIaPcktGetDataFieldFlag(CrFwPckt_t pckt)
+{
+  /* The packet header should be valid */
+  return ((pckt[OFFSET_ID_FIELD] & HDR_FLAG_MASK) >> HDR_FLAG_SHIFT);
+}
+
+void CrIaPcktSetSeqFlags(CrFwPckt_t pckt, CrIaPcktSeqFlags_t flags)
+{
+  /* The packet header should be valid */
+  pckt[OFFSET_SEQ_CTRL_FIELD] &= ~(SEQ_FLAGS_MASK);
+  pckt[OFFSET_SEQ_CTRL_FIELD] |= ((flags << SEQ_FLAGS_SHIFT) & SEQ_FLAGS_MASK);
+  return;
+}
+
+CrIaPcktSeqFlags_t CrIaPcktGetSeqFlags(CrFwPckt_t pckt)
+{
+  /* The packet header should be valid */
+  return ((pckt[OFFSET_SEQ_CTRL_FIELD] & SEQ_FLAGS_MASK) >> SEQ_FLAGS_SHIFT);
+}
+
+void CrIaPcktSetPusVersion(CrFwPckt_t pckt, CrIaPcktVersion_t ver)
+{
+  /* The packet header should be valid */
+  pckt[OFFSET_DATA_FIELD_TC_TM] &= ~(PUS_VER_MASK);
+  pckt[OFFSET_DATA_FIELD_TC_TM] |= ((ver << PUS_VER_SHIFT) & PUS_VER_MASK);
+  return;
+}
+
+CrIaPcktVersion_t CrIaPcktGetPusVersion(CrFwPckt_t pckt)
+{
+  /* The packet header should be valid */
+  return ((pckt[OFFSET_DATA_FIELD_TC_TM] & PUS_VER_MASK) >> PUS_VER_SHIFT);
+}
+
+void CrIaPcktSetCrc(CrFwPckt_t pckt, CrIaPcktCrc_t crc)
+{
+  /* No endian conversion for crc */
+  size_t pos;
+  DEBUGP("SetCrc: Length is: %d\n", CrFwPcktGetLength(pckt));
+  pos = CrFwPcktGetLength(pckt) - sizeof(CrIaPcktCrc_t);
+  DEBUGP("SetCrc: Position is: %lu\n", (unsigned long) pos);
+  
+  crc = (crc << 8) | ((crc >> 8) & 0xff);
+  /* The packet header should be valid */
+  memcpy(&pckt[pos], &crc, sizeof(CrIaPcktCrc_t));
+
+  return;
+}
+
+CrIaPcktCrc_t CrIaPcktGetCrc(CrFwPckt_t pckt)
+{
+  /* No endian conversion for crc */
+  CrIaPcktCrc_t crc;
+  size_t pos;
+  
+  DEBUGP("this packet length is: %d\n", CrFwPcktGetLength(pckt));
+  DEBUGP("crc datatype length is: %d\n", sizeof(CrIaPcktCrc_t));
+  
+  pos = CrFwPcktGetLength(pckt) - sizeof(CrIaPcktCrc_t);
+  /* The packet header should be valid */
+  memcpy(&crc, &pckt[pos], sizeof(CrIaPcktCrc_t));
+  
+  return crc;
+}
+
+CrIaPcktCrc_t Crc(unsigned char d, CrIaPcktCrc_t chk, CrIaPcktCrc_t table[])
+{
+  return (((chk << 8) & 0xFF00)^table[(((chk >> 8)^d) & 0x00FF)]);
+}
+
+void InitLtbl(CrIaPcktCrc_t table[])
+{
+  CrIaPcktCrc_t i, tmp;
+  
+  for (i=0; i<256; i++)
+    {
+      tmp=0;
+      if ((i & 1) != 0) tmp=tmp ^ 0x1021;
+      if ((i & 2) != 0) tmp=tmp ^ 0x2042;
+      if ((i & 4) != 0) tmp=tmp ^ 0x4084;
+      if ((i & 8) != 0) tmp=tmp ^ 0x8108;
+      if ((i & 16) != 0) tmp=tmp ^ 0x1231;
+      if ((i & 32) != 0) tmp=tmp ^ 0x2462;
+      if ((i & 64) != 0) tmp=tmp ^ 0x48C4;
+      if ((i & 128) != 0) tmp=tmp ^ 0x9188;
+      table [i] = tmp;
+    }
+  
+  return;
+}
+
diff --git a/CrIa/src/CrIaPckt.h b/CrIa/src/CrIaPckt.h
new file mode 100644
index 0000000..97b4275
--- /dev/null
+++ b/CrIa/src/CrIaPckt.h
@@ -0,0 +1,287 @@
+/**
+ * @file CrIaPckt.h
+ * @ingroup CrIaDemo
+ *
+ * IASW specific packet manipulation functions.
+ *
+ * @authors V. Cechticky and A. Pasetti
+ * @copyright P&P Software GmbH, 2014
+ */
+
+#ifndef CRIA_PCKT_H
+#define CRIA_PCKT_H
+
+/* Includes */
+#include "CrIaDataPool.h"
+#include <CrFwConstants.h>
+#include "Services/General/CrIaConstants.h"
+
+/** Offset for the parameter length */
+/**
+#define OFFSET_PAR_LENGTH_TC 10
+#define OFFSET_PAR_LENGTH_TM 16
+*/
+
+/**
+ * The size of a small packet in bytes.
+ */
+#define CR_IA_MAX_SIZE_PCKT_SMALL 128 /* section 6.6 of issue 5 of DD-001 */
+
+/**
+ * The size of a large packets in bytes. This is the maximum size of a TM/TC
+ * packet.
+ */
+#define CR_IA_MAX_SIZE_PCKT_LARGE 1024 /* section 6.6 of issue 5 of DD-001 */
+
+/**
+ * The number of pre-allocated small packets.
+ */
+#define CR_IA_NOF_PCKT_SMALL N_PCKT_SMALL
+
+/**
+ * The number of pre-allocated large packets.
+ */
+#define CR_IA_NOF_PCKT_LARGE N_PCKT_LARGE
+
+/** Offset of the packet id field. */
+#define OFFSET_ID_FIELD 0
+
+/** Offset of the packet sequence control field. */
+#define OFFSET_SEQ_CTRL_FIELD 2
+
+/** Offset of the length field. */
+#define OFFSET_LENGTH_FIELD 4
+
+/** Offset of the data field for TC/TM */
+#define OFFSET_DATA_FIELD_TC_TM 6
+
+/** Offset of the application data for commands. */
+#define OFFSET_SRC_DATA_CMD 11
+
+/** Offset of the application data for reports. */
+#define OFFSET_SRC_DATA_REP 17
+
+/** Offset for the parameter length */
+#define OFFSET_PAR_LENGTH_TC 10
+#define OFFSET_PAR_LENGTH_TM 16
+
+/** Length of the packet without the packet data field */
+#define SRC_PCKT_HDR_LENGTH  6
+
+/** Defines for the version number within the packet id field */
+#define VERSION_MASK          0xE0
+#define VERSION_SHIFT         5
+/** Defines for the packet type within the packet id field */
+#define PCKT_TYPE_MASK        0x10
+#define PCKT_TYPE_SHIFT       4
+/** Defines for the data field header flag within the packet id field */
+#define HDR_FLAG_MASK         0x08
+#define HDR_FLAG_SHIFT        3
+/** Defines for the APID (application process id) */
+#define PID0_MASK             0x07
+#define PID1_MASK             0xF0
+#define PID1_SHIFT            4
+#define PCAT_MASK             0x0F
+#define PCAT_OFFSET           1
+
+/** Mask of the sequence flags within the packet sequence control field. */
+#define SEQ_FLAGS_MASK        0xC0
+#define SEQ_FLAGS_SHIFT       6
+/** Mask of the sequence count within the packet sequence control field. */
+#define SEQ_COUNT_MASK        0x3FFF
+
+/** Mask of the CCSDS secondary header flag within the data field header. */
+#define CCSDS_MASK            0x80
+#define CCSDS_SHIFT           7
+/** Mask of the PUS version within the data field header. */
+#define PUS_VER_MASK          0x70
+#define PUS_VER_SHIFT         4
+/** Mask for all acknolegde flags in a TC */
+#define ACK_MASK              0x0F
+/** Mask of the ack flag A (acceptance) within the data field header. */
+#define ACK_A_MASK            0x01
+#define ACK_A_SHIFT           0
+/** Mask of the ack flag SE (start execution) within the data field header. */
+#define ACK_SE_MASK           0x02
+#define ACK_SE_SHIFT          1
+/** Mask of the ack flag PE (progress execution) within the data field header. */
+#define ACK_PE_MASK           0x04
+#define ACK_PE_SHIFT          2
+/** Mask of the ack flag CE (completion execution) within the data field header. */
+#define ACK_CE_MASK           0x08
+#define ACK_CE_SHIFT          3
+/** Offset of the service type in the data field header */
+#define SRV_TYPE_OFFSET       1
+/** Offset of the service subtype in the data field header */
+#define SRV_SUBTYPE_OFFSET    2
+/** Offset of the source id (in TC) and destination id (TM) in the data field header */
+#define SRC_DEST_OFFSET       3
+/** Offset of the SC Time field in the data field header */
+#define SC_TIME_OFFSET        4
+
+
+CrFwDestSrc_t CrIaPcktGetPid(CrFwPckt_t pckt);
+
+void CrIaPcktSetPid(CrFwPckt_t pckt, CrFwDestSrc_t pid);
+
+unsigned short CrIaPcktGetApid(CrFwPckt_t pckt);
+
+unsigned short CrIaPcktGetPacketId(CrFwPckt_t pckt);
+
+CrFwGroup_t CrIaPcktGetPcat(CrFwPckt_t pckt);
+
+void CrIaPcktSetPcat(CrFwPckt_t pckt, CrFwGroup_t pcat);
+
+CrFwPckt_t CrFwPcktMake(CrFwPcktLength_t pcktLength);
+
+void CrFwPcktRelease(CrFwPckt_t pckt);
+
+CrFwCounterU2_t CrFwPcktGetNOfAllocated();
+
+CrFwPcktLength_t CrFwPcktGetMaxLength();
+
+CrFwCmdRepType_t CrFwPcktGetCmdRepType(CrFwPckt_t pckt);
+
+void CrFwPcktSetCmdRepType(CrFwPckt_t pckt, CrFwCmdRepType_t type);
+
+CrFwPcktLength_t CrFwPcktGetLength(CrFwPckt_t pckt);
+
+CrFwSeqCnt_t CrFwPcktGetSeqCtrl(CrFwPckt_t pckt);
+
+void CrFwPcktSetSeqCnt(CrFwPckt_t pckt, CrFwSeqCnt_t seqCnt);
+
+CrFwSeqCnt_t CrFwPcktGetSeqCnt(CrFwPckt_t pckt);
+
+void CrFwPcktSetServType(CrFwPckt_t pckt, CrFwServType_t servType);
+
+CrFwServType_t CrFwPcktGetServType(CrFwPckt_t pckt);
+
+void CrFwPcktSetServSubType(CrFwPckt_t pckt, CrFwServSubType_t servSubType);
+
+CrFwServSubType_t CrFwPcktGetServSubType(CrFwPckt_t pckt);
+
+void CrFwPcktSetDiscriminant(CrFwPckt_t pckt, CrFwDiscriminant_t discriminant);
+
+CrFwTimeStamp_t CrFwPcktGetTimeStamp(CrFwPckt_t pckt);
+
+void CrFwPcktSetTimeStamp(CrFwPckt_t pckt, CrFwTimeStamp_t timeStamp);
+
+CrFwGroup_t CrIaPcktGetGroup(CrFwPckt_t pckt);
+
+void CrFwPcktSetGroup(CrFwPckt_t pckt, CrFwGroup_t group);
+
+void CrFwPcktSetDest(CrFwPckt_t pckt, CrFwDestSrc_t dest);
+
+CrFwDestSrc_t CrFwPcktGetDest(CrFwPckt_t pckt) ;
+
+void CrFwPcktSetSrc(CrFwPckt_t pckt, CrFwDestSrc_t src);
+
+CrFwDestSrc_t CrFwPcktGetSrc(CrFwPckt_t pckt);
+
+void CrFwPcktSetCmdRepId(CrFwPckt_t pckt, CrFwInstanceId_t id);
+
+CrFwInstanceId_t CrFwPcktGetCmdRepId(CrFwPckt_t pckt);
+
+void CrFwPcktSetAckLevel(CrFwPckt_t pckt, CrFwBool_t accept, CrFwBool_t start, CrFwBool_t progress, CrFwBool_t term);
+
+CrFwBool_t CrFwPcktIsAcceptAck(CrFwPckt_t pckt);
+
+CrFwBool_t CrFwPcktIsStartAck(CrFwPckt_t pckt);
+
+CrFwBool_t CrFwPcktIsProgressAck(CrFwPckt_t pckt);
+
+CrFwBool_t CrFwPcktIsTermAck(CrFwPckt_t pckt);
+
+char* CrFwPcktGetParStart(CrFwPckt_t pckt);
+
+CrFwPcktLength_t CrFwPcktGetParLength(CrFwPckt_t pckt);
+
+/**
+ * Set the version number of a TM/TC packet.
+ */
+void CrIaPcktSetVersion(CrFwPckt_t pckt, CrIaPcktVersion_t version);
+
+/**
+ * Return the version number of a TM/TC packet.
+ */
+CrIaPcktVersion_t CrIaPcktGetVersion(CrFwPckt_t pckt);
+
+/**
+ * Set the data field header flag of a TM/TC packet.
+ */
+void CrIaPcktSetDataFieldFlag(CrFwPckt_t pckt, CrFwBool_t flag);
+
+/**
+ * Return the data field header flag of a TM/TC packet.
+ */
+CrFwBool_t CrIaPcktGetDataFieldFlag(CrFwPckt_t pckt);
+
+/**
+ * Set the sequence flags of a TC packet.
+ */
+void CrIaPcktSetSeqFlags(CrFwPckt_t pckt, CrIaPcktSeqFlags_t flags);
+
+/**
+ * Return the sequence flags of a TC packet.
+ */
+CrIaPcktSeqFlags_t CrIaPcktGetSeqFlags(CrFwPckt_t pckt);
+
+/**
+ * Set the CCSDS Secondary Header Flag in a TM.
+ */
+void CrIaPcktSetCCSDSFlag(CrFwPckt_t pckt, CrFwBool_t flag);
+
+/**
+ * Return the CCSDS Secondary Header Flag in a TM.
+ */
+CrFwBool_t CrIaPcktGetCCSDSFlag(CrFwPckt_t pckt);
+
+/**
+ * Set the PUS version number of a TC/TM packet.
+ */
+void CrIaPcktSetPusVersion(CrFwPckt_t pckt, CrIaPcktVersion_t ver);
+
+/**
+ * Return the PUS version number of a TC/TM packet.
+ */
+CrIaPcktVersion_t CrIaPcktGetPusVersion(CrFwPckt_t pckt);
+
+/**
+ * Return the Discriminant of a type specific TC/TM packet.
+ */
+CrFwDiscriminant_t CrFwPcktGetDiscriminant(CrFwPckt_t pckt);
+
+/**
+ * Set the CRC for the TC/TM packet.
+ */
+void CrIaPcktSetCrc(CrFwPckt_t pckt, CrIaPcktCrc_t crc);
+
+/**
+ * Return the CRC for the TC/TM packet.
+ */
+CrIaPcktCrc_t CrIaPcktGetCrc(CrFwPckt_t pckt);
+
+/**
+ * Calculates the CRC (Cyclic Redundancy Code) for d.
+ *
+ * This is the optimized implementation taken from the ECSS-E-70-41A document.
+ * The name in the document for this routine is @Crc_opt@, but is renamed here
+ * since it is the only CRC routine present.
+ *
+ * According to the specification, the syndrome must be set to all ones before
+ * the check.
+ *
+ * \param d     Byte to be encoded
+ * \param chk   Syndrome
+ * \param table Look-up table
+ */
+CrIaPcktCrc_t Crc(unsigned char d, CrIaPcktCrc_t chk, CrIaPcktCrc_t table[]);
+
+/**
+ * Initializes the Look-up table used for the Crc calculation.
+ */
+void InitLtbl(CrIaPcktCrc_t table[]);
+
+#endif /* CRIA_PCKT_H */
+
+
diff --git a/CrIa/src/CrIaPrSm/CrIaAcqFullDropCreate.c b/CrIa/src/CrIaPrSm/CrIaAcqFullDropCreate.c
new file mode 100644
index 0000000..0520afb
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaAcqFullDropCreate.c
@@ -0,0 +1,138 @@
+/**
+ * @file CrIaAcqFullDropCreate.c
+ * @ingroup CrIaPrSci
+ * @authors FW Profile code generator version 4.63; Institute for Astrophysics, 2015-2016
+ * @date Created on: Jun 3 2016 19:48:4
+ *
+ * @brief Instanziation of the Acquire Full Drop Procedure.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#include "CrIaAcqFullDropCreate.h"
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaAcqFullDrop function definitions */
+#include <stdlib.h>
+
+/**
+ * Action for node N7.
+ * NOP
+ * @param smDesc the procedure descriptor
+ */
+static void code15066(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return;
+}
+
+/**
+ * Action for node N9.
+ * NOP
+ * @param smDesc the procedure descriptor
+ */
+static void code91534(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return;
+}
+
+/**
+ * Guard on the Control Flow from DECISION8 to N9.
+ * <pre>
+ * Target acquisition 
+ * not yet completed  
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code60575(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/**
+ * Guard on the Control Flow from N6 to N7.
+ *  Wait 1 Cycle 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code47070(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return (FwPrGetNodeExecCnt(prDesc) == 1);
+}
+
+/**
+ * Guard on the Control Flow from N9 to N7.
+ *  Wait 1 Cycle 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code53764(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return (FwPrGetNodeExecCnt(prDesc) == 1);
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaAcqFullDropCreate(void* prData)
+{
+	const FwPrCounterU2_t DECISION8 = 1;		/* The identifier of decision node DECISION8 in procedure CrIaAcqFullDrop */
+	const FwPrCounterU2_t N_OUT_OF_DECISION8 = 3;	/* The number of control flows out of decision node DECISION8 in procedure CrIaAcqFullDrop */
+
+	/** Create the procedure */
+	FwPrDesc_t prDesc = FwPrCreate(
+		14,	/* N_ANODES - The number of action nodes */
+		1,	/* N_DNODES - The number of decision nodes */
+		18,	/* N_FLOWS - The number of control flows */
+		14,	/* N_ACTIONS - The number of actions */
+		10	/* N_GUARDS - The number of guards */
+	);
+
+	/** Configure the procedure */
+	FwPrSetData(prDesc, prData);
+	FwPrAddActionNode(prDesc, CrIaAcqFullDrop_N4, &CrIaAcqFullDropN4);
+	FwPrAddActionNode(prDesc, CrIaAcqFullDrop_N5, &CrIaAcqFullDropN5);
+	FwPrAddActionNode(prDesc, CrIaAcqFullDrop_N1, &CrIaAcqFullDropN1);
+	FwPrAddDecisionNode(prDesc, DECISION8, N_OUT_OF_DECISION8);
+	FwPrAddActionNode(prDesc, CrIaAcqFullDrop_N10, &CrIaAcqFullDropN10);
+	FwPrAddActionNode(prDesc, CrIaAcqFullDrop_N6, &CrIaAcqFullDropN6);
+	FwPrAddActionNode(prDesc, CrIaAcqFullDrop_N8, &CrIaAcqFullDropN8);
+	FwPrAddActionNode(prDesc, CrIaAcqFullDrop_N7, &code15066);
+	FwPrAddActionNode(prDesc, CrIaAcqFullDrop_N9, &code91534);
+	FwPrAddActionNode(prDesc, CrIaAcqFullDrop_N12, &CrIaAcqFullDropN12);
+	FwPrAddActionNode(prDesc, CrIaAcqFullDrop_N11, &CrIaAcqFullDropN11);
+	FwPrAddActionNode(prDesc, CrIaAcqFullDrop_N2, &CrIaAcqFullDropN2);
+	FwPrAddActionNode(prDesc, CrIaAcqFullDrop_N3, &CrIaAcqFullDropN3);
+	FwPrAddActionNode(prDesc, CrIaAcqFullDrop_N2_1, &CrIaAcqFullDropN2_1);
+	FwPrAddActionNode(prDesc, CrIaAcqFullDrop_N13, &CrIaAcqFullDropN13);
+	FwPrAddFlowIniToAct(prDesc, CrIaAcqFullDrop_N1, NULL);
+	FwPrAddFlowActToAct(prDesc, CrIaAcqFullDrop_N4, CrIaAcqFullDrop_N5, &CrIaAcqFullDropWaitT2);
+	FwPrAddFlowActToAct(prDesc, CrIaAcqFullDrop_N5, CrIaAcqFullDrop_N6, NULL);
+	FwPrAddFlowActToAct(prDesc, CrIaAcqFullDrop_N1, CrIaAcqFullDrop_N2, &CrIaAcqFullDropIsSemInStab);
+	FwPrAddFlowDecToAct(prDesc, DECISION8, CrIaAcqFullDrop_N10, &CrIaAcqFullDropIsTrgtAcq);
+	FwPrAddFlowDecToAct(prDesc, DECISION8, CrIaAcqFullDrop_N13, &CrIaAcqFullDropIsTrgtNotAcq);
+	FwPrAddFlowDecToAct(prDesc, DECISION8, CrIaAcqFullDrop_N9, &code60575);
+	FwPrAddFlowActToAct(prDesc, CrIaAcqFullDrop_N10, CrIaAcqFullDrop_N11, NULL);
+	FwPrAddFlowActToAct(prDesc, CrIaAcqFullDrop_N6, CrIaAcqFullDrop_N7, &code47070);
+	FwPrAddFlowActToDec(prDesc, CrIaAcqFullDrop_N8, DECISION8, NULL);
+	FwPrAddFlowActToAct(prDesc, CrIaAcqFullDrop_N7, CrIaAcqFullDrop_N8, &CrIaAcqFullDropIsImgAcq);
+	FwPrAddFlowActToAct(prDesc, CrIaAcqFullDrop_N9, CrIaAcqFullDrop_N7, &code53764);
+	FwPrAddFlowActToFin(prDesc, CrIaAcqFullDrop_N12, NULL);
+	FwPrAddFlowActToAct(prDesc, CrIaAcqFullDrop_N11, CrIaAcqFullDrop_N12, &CrIaAcqFullDropIsTerm);
+	FwPrAddFlowActToAct(prDesc, CrIaAcqFullDrop_N2, CrIaAcqFullDrop_N2_1, NULL);
+	FwPrAddFlowActToAct(prDesc, CrIaAcqFullDrop_N3, CrIaAcqFullDrop_N4, &CrIaAcqFullDropWaitT1);
+	FwPrAddFlowActToAct(prDesc, CrIaAcqFullDrop_N2_1, CrIaAcqFullDrop_N3, NULL);
+	FwPrAddFlowActToAct(prDesc, CrIaAcqFullDrop_N13, CrIaAcqFullDrop_N10, NULL);
+
+  return prDesc;
+}
diff --git a/CrIa/src/CrIaPrSm/CrIaAcqFullDropCreate.h b/CrIa/src/CrIaPrSm/CrIaAcqFullDropCreate.h
new file mode 100644
index 0000000..f910acc
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaAcqFullDropCreate.h
@@ -0,0 +1,234 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaAcqFullDrop procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ * @image html CrIaAcqFullDrop.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Jun 3 2016 19:48:4
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaAcqFullDropCreate_H_
+#define CrIaAcqFullDropCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaAcqFullDrop_N1 (1)		/* The identifier of action node N1 in procedure CrIaAcqFullDrop */
+#define CrIaAcqFullDrop_N2 (2)		/* The identifier of action node N2 in procedure CrIaAcqFullDrop */
+#define CrIaAcqFullDrop_N2_1 (3)		/* The identifier of action node N2_1 in procedure CrIaAcqFullDrop */
+#define CrIaAcqFullDrop_N3 (4)		/* The identifier of action node N3 in procedure CrIaAcqFullDrop */
+#define CrIaAcqFullDrop_N4 (5)		/* The identifier of action node N4 in procedure CrIaAcqFullDrop */
+#define CrIaAcqFullDrop_N5 (6)		/* The identifier of action node N5 in procedure CrIaAcqFullDrop */
+#define CrIaAcqFullDrop_N6 (7)		/* The identifier of action node N6 in procedure CrIaAcqFullDrop */
+#define CrIaAcqFullDrop_N7 (8)		/* The identifier of action node N7 in procedure CrIaAcqFullDrop */
+#define CrIaAcqFullDrop_N8 (9)		/* The identifier of action node N8 in procedure CrIaAcqFullDrop */
+#define CrIaAcqFullDrop_N9 (10)		/* The identifier of action node N9 in procedure CrIaAcqFullDrop */
+#define CrIaAcqFullDrop_N10 (11)		/* The identifier of action node N10 in procedure CrIaAcqFullDrop */
+#define CrIaAcqFullDrop_N11 (12)		/* The identifier of action node N11 in procedure CrIaAcqFullDrop */
+#define CrIaAcqFullDrop_N12 (13)		/* The identifier of action node N12 in procedure CrIaAcqFullDrop */
+#define CrIaAcqFullDrop_N13 (14)		/* The identifier of action node N13 in procedure CrIaAcqFullDrop */
+
+/** User-defined includes */
+#include "FwProfile/FwPrCore.h"
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaAcqFullDropCreate(void* prData);
+
+/**
+ * Action for node N4.
+ * Send cmd (220,11) to SEM
+ * @param smDesc the procedure descriptor
+ */
+void CrIaAcqFullDropN4(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N5.
+ * <pre>
+ * Send command GoToCcdFull
+ * to SEM Unit State Machine
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaAcqFullDropN5(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N1.
+ * <pre>
+ * Generate Event Report
+ * EVT_SC_PR_STRT
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaAcqFullDropN1(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N10.
+ * Stop Acquisition Algorithms
+ * @param smDesc the procedure descriptor
+ */
+void CrIaAcqFullDropN10(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N6.
+ * Start Acquisition Algorithms
+ * @param smDesc the procedure descriptor
+ */
+void CrIaAcqFullDropN6(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N8.
+ * <pre>
+ * Evaluate Pointing Error on data in SIB
+ * pointed at by sibOut and then increment sibOut
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaAcqFullDropN8(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N12.
+ * <pre>
+ * Generate Event Report
+ * EVT_SC_PR_END with
+ * outcome equal to: "success"
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaAcqFullDropN12(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N11.
+ * <pre>
+ * Send command GoToStabilize
+ * to SEM Unit State Machine
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaAcqFullDropN11(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N2.
+ * <pre>
+ * Update SEM configuration
+ * parameters in data pool
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaAcqFullDropN2(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N3.
+ * Send cmd (220,3) to SEM
+ * @param smDesc the procedure descriptor
+ */
+void CrIaAcqFullDropN3(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N2_1.
+ * <pre>
+ * Set data pool variable
+ * pCcdRdMode to CCD_FULL
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaAcqFullDropN2_1(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N13.
+ * <pre>
+ * Load event 
+ * EVT_ACQ_FAIL
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaAcqFullDropN13(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N4 to N5.
+ * <pre>
+ *  Wait acqFullDropT2
+ * cycles 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaAcqFullDropWaitT2(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N1 to N2.
+ *  SEM State Machine is in STABILIZE 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaAcqFullDropIsSemInStab(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION8 to N10.
+ * <pre>
+ * Target acquisition
+ * successfully completed 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaAcqFullDropIsTrgtAcq(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION8 to N13.
+ * <pre>
+ * Target acquisition
+ * completed unsuccessfully 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaAcqFullDropIsTrgtNotAcq(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N7 to N8.
+ *  Acquisition of an image has completed 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaAcqFullDropIsImgAcq(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N11 to N12.
+ * <pre>
+ *  (SEM Operational SM is in STABILIZE) &&
+ * (All sporadic activities have terminated)  
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaAcqFullDropIsTerm(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N3 to N4.
+ * <pre>
+ *  Wait acqFullDropT1
+ * cycles 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaAcqFullDropWaitT1(FwPrDesc_t prDesc);
+
+#endif /* CrIaAcqFullDropCreate_H_ */
diff --git a/CrIa/src/CrIaPrSm/CrIaAcqFullDropFunc.c b/CrIa/src/CrIaPrSm/CrIaAcqFullDropFunc.c
new file mode 100644
index 0000000..872d5f7
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaAcqFullDropFunc.c
@@ -0,0 +1,442 @@
+/**
+ * @file CrIaAcqFullDropFunc.c
+ * @ingroup CrIaPrSci
+ * @authors FW Profile code generator version 4.63; Institute for Astrophysics, 2015-2016
+ * @date Created on: Jun 3 2016 19:48:4
+ *
+ * @brief Implementation of the Acquire Full Drop Procedure nodes and guards.
+ * Implements an observation of type ACQ/FULL/DROP.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include <FwProfile/FwSmConfig.h>
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwPrCore.h>
+
+#include <FwProfile/FwPrCore.h> /* for FwPrGetCurNode() */
+
+/** Cordet FW function definitions */
+#include <CrFramework/OutFactory/CrFwOutFactory.h>
+#include <CrFramework/OutLoader/CrFwOutLoader.h>
+#include <CrFramework/OutCmp/CrFwOutCmp.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+#include <Services/General/CrIaConstants.h>
+#include <Services/General/CrSemConstants.h>
+
+#/** CrIaAcqFullDrop function definitions */
+#include "CrIaAcqFullDropCreate.h"
+
+#include <CrIaIasw.h> /* for Event Reporting and extern sm and prDescriptors */
+#include <CrIaPrSm/CrIaSemCreate.h> /* for GoToCcdWindow and GoToStabilize */
+#include <CrIaPrSm/CrIaAlgoCreate.h> /* for Start and Stop */
+
+#include <IfswDebug.h>
+
+#include "EngineeringAlgorithms.h"
+
+
+int nmbIter;
+
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N1. */
+void CrIaAcqFullDropN1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short evt_data[2];
+  unsigned short ProcId = CRIA_SERV198_ACQ_FULL_DROP;
+
+  /* Generate event report EVT_SC_PR_STRT */
+
+  evt_data[0] = ProcId;
+  evt_data[1] = 0; /* NOT USED */
+
+  DEBUGP("AcqFullDrop N1: Event %d generated to signal start of ACQ FULL DROP PR\n", ProcId);
+  CrIaEvtRep(1, CRIA_SERV5_EVT_SC_PR_STRT, evt_data, 4);
+
+  return;
+}
+
+/** Action for node N2. */
+void CrIaAcqFullDropN2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned int utemp32;
+  unsigned short utemp16;
+
+  /* Update SEM configuration parameters in data pool */
+
+  /* needed for TC(220/3) CMD_Operation_Parameter */
+
+  CrIaCopy(ACQFULLDROP_PEXPTIME_ID, &utemp32);
+  CrIaPaste(PEXPTIME_ID, &utemp32);
+
+  CrIaCopy(ACQFULLDROP_PIMAGEREP_ID, &utemp32);
+  CrIaPaste(PIMAGEREP_ID, &utemp32);
+ 
+  /* get Target Acquisition Iterations from data pool and set pAcqNum, assuming that a star map command was sent before (default is 10) */
+  CrIaCopy(TAITERATIONS_ID, &utemp16); 
+  utemp16 += 1;
+  utemp32 = (unsigned int)utemp16;
+  CrIaPaste(PACQNUM_ID, &utemp32);
+
+  /* Mantis 2252 */
+  nmbIter = 0;
+  
+  /* pDatOs keeps the default value */
+
+  /* pCcdRdMode is set in N2_1 */
+
+  return;
+}
+
+/** Action for node N2_1. */
+void CrIaAcqFullDropN2_1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short utemp16;
+
+  /* Set data pool variable pCcdRdMode to CCD_FULL */
+
+  /* CCD readout mode */
+  utemp16 = SEM_CCD_MODE_CCD_FULL;
+  CrIaPaste(PCCDRDMODE_ID, &utemp16);
+
+  return;
+}
+
+/** Action for node N3. */
+void CrIaAcqFullDropN3(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  FwSmDesc_t cmd;
+  CrFwBool_t accept=1, start=0, progress=0, term=1;
+
+  /* Send cmd (220,3) to SEM */
+  /* Changes the SEM Operational Parameter */
+
+  DEBUGP("SciWin N3: Send cmd (220,3) to SEM\n");
+
+  cmd = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRSEM_SERV220, CRSEM_SERV220_CMD_OPER_PARAM, 0, 0);
+  if (cmd == NULL)
+    {
+      /* handled by Resource FdCheck */
+      return;
+    }
+
+  /* NOTE: parameters are set in the cmd update action according to the data pool entries */
+
+  CrFwOutCmpSetAckLevel(cmd, accept, start, progress, term);
+  CrFwOutCmpSetDest(cmd, CR_FW_CLIENT_SEM);
+  CrFwOutLoaderLoad(cmd);
+
+  return;
+}
+
+/** Action for node N4. */
+void CrIaAcqFullDropN4(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  FwSmDesc_t cmd;
+  CrFwBool_t accept=1, start=0, progress=0, term=1;
+
+  /* Send cmd (220,11) to SEM */
+  /* Changes the SEM Functional Parameter */
+
+  DEBUGP("SciWin N4: Send cmd (220,11) to SEM\n");
+
+  cmd = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRSEM_SERV220, CRSEM_SERV220_CMD_FUNCT_PARAM, 0, 0);
+  if (cmd == NULL)
+    {
+      /* handled by Resource FdCheck */
+      return;
+    }
+
+  /* NOTE: parameters are set in the cmd update action according to the data pool entries */
+
+  CrFwOutCmpSetAckLevel(cmd, accept, start, progress, term);
+  CrFwOutCmpSetDest(cmd, CR_FW_CLIENT_SEM);
+  CrFwOutLoaderLoad(cmd);
+
+  return;
+}
+
+/** Action for node N5. */
+void CrIaAcqFullDropN5(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Send command GoToCcdFull to SEM Unit State Machine */
+  FwSmMakeTrans(smDescSem, GoToCcdFull);
+
+  return;
+}
+
+/** Action for node N6. */
+void CrIaAcqFullDropN6(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Start Acquisition Algorithms */
+
+  FwSmMakeTrans(smDescAlgoAcq1, Start);
+ 
+  return;
+}
+
+/** Action for node N8. */
+void CrIaAcqFullDropN8(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short sibIn, sibOut;
+
+  /* NOTE: The Pointing Error is evaluated in the guard */
+
+  /* 
+     Mantis 1624 says increment SIBOUT, but Mantis 1779 overrules this. 
+     Basically, sibout is not used for the acquisition, but we want to
+     use it to have some visibility. We set it to sibin here.
+   */
+  
+  CrIaCopy(SIBIN_ID, &sibIn);
+  sibOut = sibIn;
+  CrIaPaste(SIBOUT_ID, &sibOut); 
+  
+  return;
+}
+
+/** Action for node N10. */
+void CrIaAcqFullDropN10(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Stop Acquisition Algorithms */
+
+  FwSmMakeTrans(smDescAlgoAcq1, Stop);
+
+  return;
+}
+
+/** Action for node N11. */
+void CrIaAcqFullDropN11(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Send command GoToStabilize to SEM Unit State Machine */
+
+  FwSmMakeTrans(smDescSem, GoToStabilize);
+
+  return;
+}
+
+/** Action for node N12. */
+void CrIaAcqFullDropN12(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short evt_data[2];
+  unsigned short ProcId = CRIA_SERV198_ACQ_FULL_DROP;
+
+  /* Generate event report EVT_SC_PR_END with outcome "success" */
+
+  evt_data[0] = ProcId;
+  evt_data[1] = 1; /* 1 = success */
+
+  CrIaEvtRep(1, CRIA_SERV5_EVT_SC_PR_END, evt_data, 4);
+
+  return;
+}
+
+/** Action for node N13. */
+void CrIaAcqFullDropN13(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short evt_data[2];
+
+  /* Load Event EVT_ACQ_FAIL */
+
+  /* NOTE: this has no parameters, so we don't need to 
+     collect the Target Acquisition Iterations from the data pool */
+ 
+  evt_data[0] = 0;     /* not used */
+  evt_data[1] = 0;     /* not used */
+
+  CrIaEvtRep(3, CRIA_SERV5_EVT_ACQ_FAIL, evt_data, 4);
+
+  return;
+}
+
+/**************/
+/*** GUARDS ***/
+/**************/
+
+/** Guard on the Control Flow from N1 to N2. */
+FwPrBool_t CrIaAcqFullDropIsSemInStab(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short sem_oper_state;
+
+  /* [ SEM State Machine is in STABILIZE ] */
+
+  /* get current state */
+  sem_oper_state = FwSmGetCurStateEmb(smDescSem);
+
+  if (sem_oper_state == CrIaSem_STABILIZE)
+    {
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/** Guard on the Control Flow from N3 to N4. */
+FwPrBool_t CrIaAcqFullDropWaitT1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned int acqFullDropT1;
+
+  CrIaCopy(ACQFULLDROPT1_ID, &acqFullDropT1);
+
+  /* Wait sciWinStackT1 cycles */
+  if (FwPrGetNodeExecCnt(prDesc) < acqFullDropT1)
+    {
+      return 0;
+    }
+  else
+    {
+      return 1;
+    }
+}
+
+/** Guard on the Control Flow from N4 to N5. */
+FwPrBool_t CrIaAcqFullDropWaitT2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned int acqFullDropT2;
+
+  CrIaCopy(ACQFULLDROPT2_ID, &acqFullDropT2);
+
+  /* Wait sciWinStackT1 cycles */
+  if (FwPrGetNodeExecCnt(prDesc) < acqFullDropT2)
+    {
+      return 0;
+    }
+  else
+    {
+      return 1;
+    }
+}
+
+/** Guard on the Control Flow from N5 to N6/N7 to N8. */
+FwPrBool_t CrIaAcqFullDropIsImgAcq(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned int acqImageCnt, imageCycleCnt;
+  
+  CrIaCopy(ACQIMAGECNT_ID, &acqImageCnt);
+  CrIaCopy(IMAGECYCLECNT_ID, &imageCycleCnt);
+ 
+  if ((acqImageCnt > 0) && (imageCycleCnt==1)) /* first rep of non-first frame */
+    {
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/** Guard on the Control Flow from DECISION8 to N10. */
+FwPrBool_t CrIaAcqFullDropIsTrgtAcq(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* NOTE: TRGSTRPOSERRTHD_ID is redundant with TADISTANCETHRD */
+  /* NOTE: TRGSTRPOSERRDUR_ID is not used; we use TAITERATIONS instead */
+
+  unsigned short taDistanceThrd;
+  int CentOffsetX, CentOffsetY;
+  double CentOffsetSq, DistSq;
+  unsigned char validityStatus;
+  
+  /* [ Target acquisition successfully completed / Target star acquired ] */
+ 
+  /* get Target Acquisition Distance Threshold from data pool */
+  CrIaCopy(TADISTANCETHRD_ID, &taDistanceThrd);
+  DistSq = (double)taDistanceThrd * (double)taDistanceThrd;
+
+  CrIaCopy (OFFSETX_ID, &CentOffsetX);
+  CrIaCopy (OFFSETY_ID, &CentOffsetY);
+
+  CentOffsetSq = ((double)CentOffsetX * (double)CentOffsetX + (double)CentOffsetY * (double)CentOffsetY)/10000.0f; /* incl. conversion centi-pixel to pixel */
+  
+  CrIaCopy(VALIDITYSTATUS_ID, &validityStatus);
+  
+  if (validityStatus != CEN_VAL_FULL)
+    {
+      /* invalid -> retry */
+      return 0;
+    }
+    
+  if (DistSq > CentOffsetSq)
+    {
+      /* Acquisition Successful */
+      return 1;
+    }
+  else
+    {
+      /* too far away -> retry */
+      return 0;
+    }
+
+}
+
+
+/** Guard on the Control Flow from DECISION8 to N13. */
+FwPrBool_t CrIaAcqFullDropIsTrgtNotAcq(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short taIterations;
+
+  /* [ Target acquisition completely unsuccessfully ] */
+
+  /* get Target Acquisition Iterations from data pool */
+  CrIaCopy(TAITERATIONS_ID, &taIterations);
+
+  /* If iterations = n, we want n+1 images (1 image + n iterations).
+     In N2 we request N+1 images, but the check here happens AFTER the first image has been
+     processed, so in the end we have to adjust nmbIter by adding 1 in the comparison beneath */
+  if (nmbIter + 1 < taIterations) 
+    {
+      nmbIter++;
+      return 0;
+    }
+  else
+    {
+      nmbIter = 0;
+      return 1;
+    }
+
+}
+
+/** Guard on the Control Flow from N11 to N12. */
+FwPrBool_t CrIaAcqFullDropIsTerm(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short sem_oper_state, Cpu2ProcStatus;
+
+  /* get current state */
+  sem_oper_state = FwSmGetCurStateEmb(smDescSem);
+
+  /* get state of second CPU */
+  CrIaCopy(CPU2PROCSTATUS_ID, &Cpu2ProcStatus);
+
+  DEBUGP("N11->N12: %d %d\n", sem_oper_state, Cpu2ProcStatus);
+
+  if (sem_oper_state == CrIaSem_STABILIZE) /* SEM Operational SM is in STABILIZE */
+    {
+      if (Cpu2ProcStatus == SDP_STATUS_IDLE) /* All sporadic activities have terminated */
+	{
+	  return 1;
+	}
+    }
+  
+  return 0;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaAcqFullDropInit.txt b/CrIa/src/CrIaPrSm/CrIaAcqFullDropInit.txt
new file mode 100644
index 0000000..b07786d
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaAcqFullDropInit.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaAcqFullDropCreate(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaAcqFullDrop is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaAcqFullDrop is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaAcquAlgoExecCreate.c b/CrIa/src/CrIaPrSm/CrIaAcquAlgoExecCreate.c
new file mode 100644
index 0000000..73573bf
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaAcquAlgoExecCreate.c
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaAcquAlgoExecCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Sep 21 2016 11:3:44
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaAcquAlgoExec function definitions */
+#include "CrIaAcquAlgoExecCreate.h"
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaAcquAlgoExecCreate(void* prData)
+{
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+                        2,	/* N_ANODES - The number of action nodes */
+                        0,	/* N_DNODES - The number of decision nodes */
+                        3,	/* N_FLOWS - The number of control flows */
+                        2,	/* N_ACTIONS - The number of actions */
+                        1	/* N_GUARDS - The number of guards */
+                      );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddActionNode(prDesc, CrIaAcquAlgoExec_N1, &CrIaAcquAlgoExecN1);
+  FwPrAddActionNode(prDesc, CrIaAcquAlgoExec_N2, &CrIaAcquAlgoExecN2);
+  FwPrAddFlowIniToAct(prDesc, CrIaAcquAlgoExec_N1, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaAcquAlgoExec_N1, CrIaAcquAlgoExec_N2, &CrIaAcquAlgoExecGuard);
+  FwPrAddFlowActToFin(prDesc, CrIaAcquAlgoExec_N2, NULL);
+
+  return prDesc;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaAcquAlgoExecCreate.h b/CrIa/src/CrIaPrSm/CrIaAcquAlgoExecCreate.h
new file mode 100644
index 0000000..fb98c6a
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaAcquAlgoExecCreate.h
@@ -0,0 +1,48 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaAcquAlgoExec procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ * @image html CrIaAcquAlgoExec.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Sep 21 2016 11:3:44
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaAcquAlgoExecCreate_H_
+#define CrIaAcquAlgoExecCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaAcquAlgoExec_N1 1		/* The identifier of action node N1 in procedure CrIaAcquAlgoExec */
+#define CrIaAcquAlgoExec_N2 2		/* The identifier of action node N2 in procedure CrIaAcquAlgoExec */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaAcquAlgoExecCreate(void* prData);
+
+/** Action for node N1. */
+void CrIaAcquAlgoExecN1(FwPrDesc_t __attribute__((unused)) prDesc);
+
+/** Action for node N2. */
+void CrIaAcquAlgoExecN2(FwPrDesc_t __attribute__((unused)) prDesc);
+
+/** Guard on the Control Flow from N1 to N2. */
+FwPrBool_t CrIaAcquAlgoExecGuard(FwPrDesc_t __attribute__((unused)) prDesc);
+
+#endif /* CrIaAcquAlgoExecCreate_H_ */
diff --git a/CrIa/src/CrIaPrSm/CrIaAcquAlgoExecFunc.c b/CrIa/src/CrIaPrSm/CrIaAcquAlgoExecFunc.c
new file mode 100644
index 0000000..1520183
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaAcquAlgoExecFunc.c
@@ -0,0 +1,144 @@
+/**
+ * @file CrIaAcquAlgoExecFunc.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Sep 21 2016 11:3:44
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+#include "FwProfile/FwPrCore.h"
+
+#include "FwProfile/FwSmCore.h"
+#include "CrIaAlgoCreate.h"
+
+/** CrIaAcquAlgoExec function definitions */
+#include "CrIaAcquAlgoExecCreate.h"
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include "Services/General/CrIaConstants.h"
+#include <IfswDebug.h>
+
+#include "CrIaIasw.h" /* cpu1_notification, signal_Ta */
+
+#ifdef PC_TARGET
+/*extern unsigned int requestAcquisition;*/
+extern unsigned int *ShmRequestAcquisitionPTR; /* shared memory for fork() */
+#else
+#include "../IBSW/include/ibsw_interface.h"
+#endif /* PC_TARGET */
+#include "../../ifsw.h"
+
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N1. */
+void CrIaAcquAlgoExecN1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  PRDEBUGP("=== entered ACQAlgoExec\n");
+
+  /* In Revision 8 this is quasi N2 */
+#ifdef PC_TARGET
+  DEBUGP("CrIaAcquAlgoExecN1: SDP_STATUS_ACQUISITION = %d\n", cpu1_notification(SDP_STATUS_ACQUISITION));
+  if (cpu1_notification(SDP_STATUS_ACQUISITION) == SDP_STATUS_IDLE)
+    {
+      DEBUGP("CrIaAcquAlgoExecN1: ... is SDP_STATUS_IDLE\n");
+    }
+#else
+  run_rt(RTCONT_ACQ, DEADLINE_ACQ, run_acquisition);
+#endif 
+  
+  return;
+}
+
+
+/** Action for node N2. [quasi N3 in Revision 8] */
+void CrIaAcquAlgoExecN2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  struct SibCentroid *Centroid;
+
+  int CentOffsetX, CentOffsetY;
+  unsigned short startIntegFine, endIntegFine, dataCadence;
+  unsigned int startIntegCoarse, endIntegCoarse;
+  unsigned char validityStatus;
+
+  PRDEBUGP("=== copy TA results to data pool\n");
+  
+  /* update data pool items
+     the output from the algorithm was written
+     back into the SibStruct Centroid section */
+
+#ifdef PC_TARGET
+  Centroid = (struct SibCentroid *)(ShmOutgoingSibInPTR->Centroid);
+#else
+  Centroid = (struct SibCentroid *)(outgoingSibInStruct.Centroid);
+#endif
+  
+  /* load the report parameters from the data pool and feed into the packet */
+  CentOffsetX = Centroid->offsetX;
+  CrIaPaste (OFFSETX_ID, &CentOffsetX);
+
+  CentOffsetY = Centroid->offsetY;
+  CrIaPaste (OFFSETY_ID, &CentOffsetY);
+
+  DEBUGP ("== copy from SIB to DP [%d, %d] ==\n", CentOffsetX, CentOffsetY);
+  
+  /* NOTE: target location is NOT copied back from the data pool */
+  
+  startIntegCoarse = Centroid->startIntegCoarse;
+  CrIaPaste(INTEGSTARTTIMECRS_ID, &startIntegCoarse);
+
+  startIntegFine = (unsigned short) (Centroid->startIntegFine);
+  CrIaPaste(INTEGSTARTTIMEFINE_ID, &startIntegFine);
+
+  endIntegCoarse = Centroid->endIntegCoarse;
+  CrIaPaste(INTEGENDTIMECRS_ID, &endIntegCoarse);
+
+  endIntegFine = (unsigned short) (Centroid->endIntegFine);
+  CrIaPaste(INTEGENDTIMEFINE_ID, &endIntegFine);
+
+  dataCadence = (unsigned short) (Centroid->dataCadence);
+  CrIaPaste(DATACADENCE_ID, &dataCadence); 
+
+  validityStatus = (unsigned char) (Centroid->validityStatus);
+  CrIaPaste(VALIDITYSTATUS_ID, &validityStatus);
+ 
+  signal_Ta ^= 1; /* toggle signal flag for CrIaServ196AocsRep */
+  
+  return;
+}
+
+
+/** Guard on the Control Flow from N1 to N2. [in Rev 8 there would need to be a guard between N2 and N3] */
+FwPrBool_t CrIaAcquAlgoExecGuard(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+#ifdef PC_TARGET
+  unsigned short Cpu2ProcStatus;
+
+  CrIaCopy(CPU2PROCSTATUS_ID, &Cpu2ProcStatus);
+
+  PRDEBUGP("=== waiting to finish\n");
+  DEBUGP("CrIaAcquAlgoExecGuard: Cpu2ProcStatus = %d\n", Cpu2ProcStatus);
+  
+  /* acquisition has finished */
+  if (Cpu2ProcStatus == SDP_STATUS_IDLE)
+    {
+      DEBUGP("CrIaAcquAlgoExecGuard: ... is SDP_STATUS_IDLE\n");
+      return 1;
+    }
+
+  return 0;
+#else
+  return 1;
+#endif /* PC_TARGET */
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaAlgoCreate.c b/CrIa/src/CrIaPrSm/CrIaAlgoCreate.c
new file mode 100644
index 0000000..bac31ee
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaAlgoCreate.c
@@ -0,0 +1,46 @@
+/**
+ * @file CrIaAlgoCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwSmDCreate.h"
+#include "FwProfile/FwSmConfig.h"
+
+/** CrIaAlgo function definitions */
+#include "CrIaAlgoCreate.h"
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwSmDesc_t CrIaAlgoCreate(void* smData)
+{
+  const FwSmCounterU2_t N_OUT_OF_INACTIVE = 1;	/* The number of transitions out of state INACTIVE */
+  const FwSmCounterU2_t N_OUT_OF_SUSPENDED = 2;	/* The number of transitions out of state SUSPENDED */
+  const FwSmCounterU2_t N_OUT_OF_ACTIVE = 2;	/* The number of transitions out of state ACTIVE */
+
+  /** Create state machine smDesc */
+  FwSmDesc_t smDesc = FwSmCreate(
+                        3,	/* NSTATES - The number of states */
+                        0,	/* NCPS - The number of choice pseudo-states */
+                        6,	/* NTRANS - The number of transitions */
+                        3,	/* NACTIONS - The number of state and transition actions */
+                        1	/* NGUARDS - The number of transition guards */
+                      );
+
+  /** Configure the state machine smDesc */
+  FwSmSetData(smDesc, smData);
+  FwSmAddState(smDesc, CrIaAlgo_INACTIVE, N_OUT_OF_INACTIVE, NULL, NULL, NULL, NULL);
+  FwSmAddState(smDesc, CrIaAlgo_SUSPENDED, N_OUT_OF_SUSPENDED, NULL, NULL, NULL, NULL);
+  FwSmAddState(smDesc, CrIaAlgo_ACTIVE, N_OUT_OF_ACTIVE, &CrIaAlgoInitialization, &CrIaAlgoFinalization, &CrIaAlgoActiveDoAction, NULL);
+  FwSmAddTransIpsToSta(smDesc, CrIaAlgo_INACTIVE, NULL);
+  FwSmAddTransStaToSta(smDesc, Start, CrIaAlgo_INACTIVE, CrIaAlgo_ACTIVE, NULL, &CrIaAlgoIsAlgoEnabled);
+  FwSmAddTransStaToSta(smDesc, Stop, CrIaAlgo_SUSPENDED, CrIaAlgo_INACTIVE, &CrIaAlgoFinalization, NULL);
+  FwSmAddTransStaToSta(smDesc, Resume, CrIaAlgo_SUSPENDED, CrIaAlgo_ACTIVE, NULL, NULL);
+  FwSmAddTransStaToSta(smDesc, Suspend, CrIaAlgo_ACTIVE, CrIaAlgo_SUSPENDED, NULL, NULL);
+  FwSmAddTransStaToSta(smDesc, Stop, CrIaAlgo_ACTIVE, CrIaAlgo_INACTIVE, NULL, NULL);
+
+  return smDesc;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaAlgoCreate.h b/CrIa/src/CrIaPrSm/CrIaAlgoCreate.h
new file mode 100644
index 0000000..aaab32a
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaAlgoCreate.h
@@ -0,0 +1,101 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaAlgo state machine.
+ * The state machine is configured with a set of function pointers representing the non-default
+ * actions and guards of the state machine. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the state machine in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The state machine created by this file is shown in the figure below.
+ *
+ * <b>Note for state ACTIVE</b>
+ * The algorithm period and phase which are needed to 
+ * evaluate Flag_1 are accessed through the pointers
+ * stored in the algorithm data structure.
+ * 
+ * The state actions execute the functions implementing the
+ * algorithm Initialization Action, Execution Action and Finalization
+ * Action. The pointers to these functions are retrieved from
+ * the algorithm data structure.
+ *
+ * <b>Note for Transition from INACTIVE to ACTIVE</b>
+ * The function implementing the guard on this transition 
+ * accesses the enable state of an algorithm through the 
+ * pointer stored in the algorithm data structure.
+ *
+ * <b>Note for Transition from SUSPENDED to INACTIVE</b>
+ * The transition action executes the function which implements the 
+ * Finalization Action for the algorithm. 
+ * The pointer to this function is retrieved from the 
+ * algorithm data structure.
+ *
+ * @image html CrIaAlgo.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaAlgoCreate_H_
+#define CrIaAlgoCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwSmConstants.h"
+
+/** State identifiers */
+#define CrIaAlgo_OFF 0			/* The identifier of state OFF in State Machine CrIaAlgo */
+#define CrIaAlgo_ACTIVE 1		/* The identifier of state ACTIVE in State Machine CrIaAlgo */
+#define CrIaAlgo_INACTIVE 2		/* The identifier of state INACTIVE in State Machine CrIaAlgo */
+#define CrIaAlgo_SUSPENDED 3		/* The identifier of state SUSPENDED in State Machine CrIaAlgo */
+
+/** The identifiers of transition commands (triggers) */
+#define Stop 25
+#define Resume 26
+#define Suspend 27
+#define Start 28
+
+/**
+ * Create a new state machine descriptor.
+ * This interface creates the state machine descriptor dynamically.
+ * @param smData the pointer to the state machine data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the state machine data when the state machine is created is NULL).
+ * @return the pointer to the state machine descriptor
+ */
+FwSmDesc_t CrIaAlgoCreate(void* smData);
+
+/**
+ * Entry Action for the state ACTIVE.
+ * Initialization Action
+ * @param smDesc the state machine descriptor
+ */
+void CrIaAlgoInitialization(FwSmDesc_t smDesc);
+
+/**
+ * Do Action for the state ACTIVE.
+ * if (Flag_1) Execution Action
+ * @param smDesc the state machine descriptor
+ */
+void CrIaAlgoActiveDoAction(FwSmDesc_t smDesc);
+
+/**
+ * Guard on the transition from INACTIVE to ACTIVE.
+ * <pre>
+ *  Algorithm 
+ * is Enabled 
+ * </pre>
+ * @param smDesc the state machine descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwSmBool_t CrIaAlgoIsAlgoEnabled(FwSmDesc_t smDesc);
+
+/**
+ * Action on the transition from SUSPENDED to INACTIVE.
+ * Finalization Action
+ * @param smDesc the state machine descriptor
+ */
+void CrIaAlgoFinalization(FwSmDesc_t smDesc);
+
+#endif /* CrIaAlgoCreate_H_ */
diff --git a/CrIa/src/CrIaPrSm/CrIaAlgoFunc.c b/CrIa/src/CrIaPrSm/CrIaAlgoFunc.c
new file mode 100644
index 0000000..90e4457
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaAlgoFunc.c
@@ -0,0 +1,482 @@
+/**
+ * @file CrIaAlgoFunc.c
+ * @ingroup CrIaSm
+ * @authors FW Profile code generator version 4.63; Institute for Astrophysics, 2015-2016
+ * @date Created on: Feb 11 2016 22:56:45
+ *
+ * @brief Implementation of the Algorithm State Machine actions and guards.
+ *
+ * Following algorithms are used:
+ * - Centroiding Algorithms
+ * - Collection Algorithms [not needed, because it is included in the compression part]
+ * - Acquisition Algorithms
+ * - Telescope Temperature Control Algorithms
+ * - SAA Evaluation Algorithms
+ * - Compression Algorithms
+ * - SDS Evaluation Algorithms
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwSmConstants.h"
+#include "FwProfile/FwSmDCreate.h"
+#include "FwProfile/FwSmConfig.h"
+#include "FwProfile/FwSmCore.h"
+#include "FwProfile/FwPrConfig.h"
+#include "FwProfile/FwPrCore.h"
+
+/** CrIaAlgo function definitions */
+#include "CrIaAlgoCreate.h"
+
+#include <CrIaIasw.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#if (__sparc__)
+#include <iwf_fpga.h>
+#endif
+
+#include "../IfswUtilities.h"
+
+#include "../IfswDebug.h"
+
+CrFwBool_t firstCycleAcqCycTtc2;
+
+extern float prevDelTemp_Aft, prevDelTemp_Frt;
+extern float prevIntTemp_Aft, prevIntTemp_Frt;
+
+unsigned int CentroidLatch = 0;
+
+#ifdef PC_TARGET
+/*extern unsigned int requestAcquisition;*/
+/*extern unsigned int requestCompression;*/
+extern unsigned int *ShmRequestAcquisitionPTR; /* shared memory for fork() */
+extern unsigned int *ShmRequestCompressionPTR; /* shared memory for fork() */
+#endif /* PC_TARGET */
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/**
+ * @brief Entry Action for the state ACTIVE.
+ */
+void CrIaAlgoInitialization(FwSmDesc_t smDesc)
+{
+  /* initialization actions */
+  unsigned int pInitSaaCounter;
+
+  /* Identify Algorithm */
+  if ((smDesc == smDescAlgoCent0) | /* ============================================================== ALGO CENT0 === */
+      (smDesc == smDescAlgoCent1)) /* =============================================================== ALGO CENT1 === */
+    {
+      /* Initialization is algorithm-specific */
+      DEBUGP("AlgoSM: Initialization Action of CENT0/1 ...\n");
+
+      /* Mantis 2180: reset the latch */      
+      CentroidLatch = 0;      
+    }
+  if (smDesc == smDescAlgoAcq1) /* ================================================================== ALGO ACQ1 === */
+    {
+      /* Initialization is algorithm-specific */
+      DEBUGP("AlgoSM: Initialization Action of ACQ1 ...\n");
+    }
+  if (smDesc == smDescAlgoCmpr) /* =================================================================== ALGO CMPR === */
+    {
+      /* Initialization as given in CHEOPS-UVIE-INST-TN-001 */
+      DEBUGP("AlgoSM: Initialization Action of CMPR ...\n");
+    }
+  if (smDesc == smDescAlgoTtc1) /* =================================================================== ALGO TTC1 === */
+    {
+      /* Request Basic Software to start acquisition of tripleredundant telescope temperature measurements
+	 -> this is done cyclically by the IBSW update DP function */
+      DEBUGP("AlgoSM: Initialization Action of TTC1 ...\n");
+    }
+  if (smDesc == smDescAlgoTtc2) /* =================================================================== ALGO TTC2 === */
+    {
+      /* Request Basic Software to start acquisition of tripleredundant telescope temperature measurements 
+	 -> this is done cyclically by the IBSW update DP function */
+      DEBUGP("AlgoSM: Initialization Action of TTC2 ...\n");
+      /* Initialize intTemp to zero */
+      prevIntTemp_Aft = 0.0f;
+      prevIntTemp_Frt = 0.0f;
+      /* Initialize delTemp to zero */
+      prevDelTemp_Aft = 0.0f;
+      prevDelTemp_Frt = 0.0f;
+    }
+  if (smDesc == smDescAlgoSaaEval) /* ================================================================= ALGO SAA === */
+    {
+      /* Initializes saaCounter to pInitSaaCounter and start the procedure */
+      DEBUGP("AlgoSM: Initialization Action of SAA Eval ...\n");
+      CrIaCopy(PINITSAACOUNTER_ID, &pInitSaaCounter);
+      CrIaPaste(SAACOUNTER_ID, &pInitSaaCounter);
+      FwPrStart(prDescSaaEval);
+    }
+  if (smDesc == smDescAlgoSdsEval) /* ================================================================= ALGO SDS === */
+    {
+      /* Initializes sdsCounter to pInitSaaCounter and start the procedure */
+      DEBUGP("AlgoSM: Initialization Action of SDS Eval ...\n");
+      FwPrStart(prDescSdsEval);
+    }
+
+  return;
+}
+
+
+/**
+ * @brief Do Action for the state ACTIVE.
+ */
+void CrIaAlgoActiveDoAction(FwSmDesc_t smDesc)
+{
+  unsigned int imageCycleCnt, iaswCycleCnt;
+  unsigned int centExecPhase, ttc1ExecPhase, saaExecPhase, sdsExecPhase;
+  int ttc1ExecPer, ttc2ExecPer, saaExecPer, sdsExecPer;
+  unsigned char lstpckt;
+
+  /* get current imageCycleCnt */
+  CrIaCopy(IMAGECYCLECNT_ID, &imageCycleCnt);
+
+  /* get current iaswCycleCnt */
+  iaswCycleCnt = FwSmGetStateExecCnt(smDescIasw);
+
+  /* if (Flag_1) execution action */
+  /* Flag 1 depends on the algorithm's period and phase */
+
+  /*********************************/
+  /*** Centroiding Algorithms    ***/
+  /*********************************/
+  /* period = 0 (CENT_EXEC_PER)    */
+  /* phase  = CENT_EXEC_PHASE      */
+
+  if ((smDesc == smDescAlgoCent0) | /* ============================================================== ALGO CENT0 === */
+      (smDesc == smDescAlgoCent1)) /* =============================================================== ALGO CENT1 === */
+    {
+      DEBUGP("* Algo: run Execution Action of Centroiding 1 Algorithm ...\n");
+
+      CrIaCopy(CENT_EXEC_PHASE_ID, &centExecPhase);
+
+      DEBUGP("* Algo: imageCycleCnt: %d\n", imageCycleCnt);
+
+      CrIaCopy(LASTSEMPCKT_ID, &lstpckt);
+
+      /* Mantis 2180: run the centroiding in the cycle after the last SEM packet has been received, plus
+	 looking at the phase. 
+	 NOTE: the latch is reset in the algo init of this module */
+
+      if (lstpckt == 1)
+        {
+          CentroidLatch = 1;
+        }
+
+      /* Mantis 2180 NOTE: for the last image of a sequence, the phase will be ignored, so basically like set to 1 */
+      if ((lstpckt == 0) && (CentroidLatch == 1) && (centExecPhase <= imageCycleCnt))
+	{
+	  CentroidLatch = 0;
+	  
+	  FwPrRun(prDescCentAlgo);	  
+	}
+
+      return;      
+    }
+
+
+  /*********************************/
+  /*** Acquisition Algorithm     ***/
+  /*********************************/
+  /* period = 0 (ACQ_EXEC_PER)     */
+  /* phase  = ACQ_EXEC_PHASE       */
+
+  if (smDesc == smDescAlgoAcq1) /* =================================================================== ALGO ACQ1 === */
+    {
+#if PC_TARGET
+      DEBUGP("* Algo: run Execution Action of Acquisition Algorithm ... %d\n", ShmRequestAcquisitionPTR[0]);
+
+      if (ShmRequestAcquisitionPTR[0] > 0)
+        {
+          FwPrRun(prDescAcq1AlgoExec);
+        }
+#else
+      FwPrRun(prDescAcq1AlgoExec); 
+#endif /* PC_TARGET */ 
+      return; 
+    }
+  
+
+  /*********************************/
+  /*** Compression Algorithm     ***/
+  /*********************************/
+  /* period = -1                   */
+  /* phase  = don't care           */
+
+  if (smDesc == smDescAlgoCmpr) /* =================================================================== ALGO CMPR === */
+    {
+#if PC_TARGET
+      DEBUGP("* Algo: run Execution Action of Compression Algorithm ... %d\n", ShmRequestCompressionPTR[0]);
+
+      if (ShmRequestCompressionPTR[0] > 0)
+        {
+          FwPrRun(prDescCmprAlgoExec);
+        }
+#else
+      FwPrRun(prDescCmprAlgoExec);
+#endif /* PC_TARGET */
+      return;
+    }
+
+
+  /*********************************/
+  /*** TTC1 Algorithm            ***/
+  /*********************************/
+  /* period = TTC1_EXEC_PER        */
+  /* phase  = TTC1_EXEC_PHASE      */
+
+  /* NOTE: For Algorithm TTC1: Run the TTC1 Procedure twice, once for the aft thermistors and the aft heaters and
+     once for the front thermistors and the front heaters. */
+
+  if (smDesc == smDescAlgoTtc1) /* =================================================================== ALGO TTC1 === */
+    {
+      DEBUGP("* Algo: run Execution Action of TTC1 Algorithm (aft and front) ...\n");
+
+      CrIaCopy(TTC1_EXEC_PER_ID, &ttc1ExecPer);
+      CrIaCopy(TTC1_EXEC_PHASE_ID, &ttc1ExecPhase);
+
+      DEBUGP("* Algo: imageCycleCnt: %d\n", imageCycleCnt);
+
+      if ((ttc1ExecPer > 0) && (ttc1ExecPhase == (iaswCycleCnt % ttc1ExecPer)))
+        {
+          /* if the period is non-zero, Flag_1 is true in cycles where (iaswCycleCnt MOD period) is equal to phase (cent phase=0) */
+	  FwPrRun(prDescTtc1aft);
+	  FwPrRun(prDescTtc1front);
+
+        }
+
+    }
+
+
+  /*********************************/
+  /*** TTC2 Algorithm            ***/
+  /*********************************/
+  /* period = TTC2_EXEC_PER        */
+  /* phase  = TTC2_EXEC_PHASE      */
+
+  /* NOTE: For Algorithm TTC1: Run the TTC1 Procedure twice, once for the aft thermistors and the aft heaters and
+     once for the front thermistors and the front heaters. */
+
+  if (smDesc == smDescAlgoTtc2) /* =================================================================== ALGO TTC2 === */
+    {
+      DEBUGP("* Algo: run Execution Action of TTC2 Algorithm (aft and front) ...\n");
+
+      CrIaCopy(TTC2_EXEC_PER_ID, &ttc2ExecPer);
+
+      if ((FwSmGetStateExecCnt(smDescAlgoTtc2) % ttc2ExecPer) == 1)
+        {
+          firstCycleAcqCycTtc2 = 1; /* raise global flag 'first cycle in an acquisition cycle' */
+        }
+      else
+        {
+          firstCycleAcqCycTtc2 = 0; /* reset global flag 'first cycle in an acquisition cycle' */
+        }
+
+      /* run TTC2 procedure each control cycle */
+      FwPrRun(prDescTtc2aft);
+      FwPrRun(prDescTtc2front);
+
+    }
+
+
+  /*********************************/
+  /*** SAA Algorithm             ***/
+  /*********************************/
+  /* period = SAA_EXEC_PER         */
+  /* phase  = SAA_EXEC_PHASE       */
+
+  if (smDesc == smDescAlgoSaaEval) /* ================================================================= ALGO SAA === */
+    {
+      DEBUGP("* Algo: run Execution Action of SAA Evaluation Algorithm ...\n");
+
+      CrIaCopy(SAA_EXEC_PER_ID, &saaExecPer);
+      CrIaCopy(SAA_EXEC_PHASE_ID, &saaExecPhase);
+
+      DEBUGP("* Algo: imageCycleCnt: %d\n", imageCycleCnt);
+
+      if ((saaExecPer > 0) && (saaExecPhase == (iaswCycleCnt % saaExecPer)))
+        {
+          /* if the period is non-zero, Flag_1 is true in cycles where (iaswCycleCnt MOD period) is equal to phase (cent phase=0) */
+          FwPrExecute(prDescSaaEval);
+
+        }
+
+    }
+
+
+  /*********************************/
+  /*** SDS Algorithm             ***/
+  /*********************************/
+  /* period = SDS_EXEC_PER         */
+  /* phase  = SDS_EXEC_PHASE       */
+
+  if (smDesc == smDescAlgoSdsEval) /* ================================================================= ALGO SDS === */
+    {
+      DEBUGP("* Algo: run Execution Action of SDS Evaluation Algorithm ...\n");
+
+      CrIaCopy(SDS_EXEC_PER_ID, &sdsExecPer);
+      CrIaCopy(SDS_EXEC_PHASE_ID, &sdsExecPhase);
+
+      DEBUGP("* Algo: imageCycleCnt: %d\n", imageCycleCnt);
+
+      if ((sdsExecPer > 0) && (sdsExecPhase == (iaswCycleCnt % sdsExecPer)))
+        {
+          /* if the period is non-zero, Flag_1 is true in cycles where (iaswCycleCnt MOD period) is equal to phase (cent phase=0) */
+          FwPrExecute(prDescSdsEval);
+
+      }
+
+    }
+
+  return;
+}
+
+/**
+ * @brief Finalization Action: (Exit Action for the state ACTIVE.) OR
+ *        (Action on the transition from SUSPENDED to INACTIVE.)
+ */
+void CrIaAlgoFinalization(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  /* finalization actions */
+  unsigned int saaCounter;
+  unsigned char isSaaActive, isSdsActive;
+
+  /* Identify Algorithm */
+  if ((smDesc == smDescAlgoCent0) | /* ============================================================== ALGO CENT0 === */
+      (smDesc == smDescAlgoCent1)) /* =============================================================== ALGO CENT1 === */
+    {
+      DEBUGP("AlgoSM: Finalization Action of CENT1 ...\n");
+    }
+  if (smDesc == smDescAlgoAcq1) /* =================================================================== ALGO ACQ1 === */
+    {
+      DEBUGP("AlgoSM: Finalization Action of ACQ1 ...\n");
+    }
+  if (smDesc == smDescAlgoCmpr) /* =================================================================== ALGO CMPR === */
+    {
+      DEBUGP("AlgoSM: Finalization Action of CMPR ...\n");
+    }
+  if (smDesc == smDescAlgoTtc1) /* =================================================================== ALGO TTC1 === */
+    {
+      /* Request Basic Software to stop acquisition of tripleredundant telescope temperature measurements and to
+         switch off all heaters */
+      DEBUGP("AlgoSM: Finalization Action of TTC1 ...\n");
+
+      /* switch off heaters */
+      CrIaHeaterOff(HEATER_1);
+      CrIaHeaterOff(HEATER_2);
+      CrIaHeaterOff(HEATER_3);
+      CrIaHeaterOff(HEATER_4);
+
+      /* NOTE: the basic software always keeps acquiring measurements such as TEMPOH1A every cycle */
+    }
+  if (smDesc == smDescAlgoTtc2) /* =================================================================== ALGO TTC2 === */
+    {
+      /* Request Basic Software to stop acquisition of tripleredundant telescope temperature measurements and to
+         switch off all heaters */
+      DEBUGP("AlgoSM: Finalization Action of TTC2 ...\n");
+
+      /* switch off heaters */
+      CrIaHeaterOff(HEATER_1);
+      CrIaHeaterOff(HEATER_2);
+      CrIaHeaterOff(HEATER_3);
+      CrIaHeaterOff(HEATER_4);
+
+      /* NOTE: the basic software always keeps acquiring measurements such as TEMPOH1A every cycle */
+    }
+  if (smDesc == smDescAlgoSaaEval) /* ================================================================= ALGO SAA === */
+    {
+      /* Set saaCounter to zero and isSaaActive to true and stop the procedure */
+      saaCounter = 0;
+      CrIaPaste(SAACOUNTER_ID, &saaCounter);
+      isSaaActive = 1;
+      CrIaPaste(ISSAAACTIVE_ID, &isSaaActive);
+      FwPrStop(prDescSaaEval);
+    }
+  if (smDesc == smDescAlgoSdsEval) /* ================================================================= ALGO SDS === */
+    {
+      /* Set isSdsActive to true and stop the procedure */
+      isSdsActive = 1;
+      CrIaPaste(ISSDSACTIVE_ID, &isSdsActive);
+      FwPrStop(prDescSdsEval);
+    }
+
+  return;
+}
+
+/**
+ * @brief Guard on the transition from INACTIVE to ACTIVE.
+ */
+FwSmBool_t CrIaAlgoIsAlgoEnabled(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned char algoEnb = 0;
+
+  /* start / algorithm is enabled */
+
+  /* Identify Algorithm */
+  if (smDesc == smDescAlgoCent0) /* ================================================================= ALGO CENT0 === */
+    {
+      /* is algorithm enabled? */
+      CrIaCopy(ALGOCENT0ENABLED_ID, &algoEnb);
+    }
+  if (smDesc == smDescAlgoCent1) /* ================================================================= ALGO CENT1 === */
+    {
+      /* is algorithm enabled? */
+      CrIaCopy(ALGOCENT1ENABLED_ID, &algoEnb);
+    }
+  if (smDesc == smDescAlgoAcq1) /* =================================================================== ALGO ACQ1 === */
+    {
+      /* is algorithm enabled? */
+      CrIaCopy(ALGOACQ1ENABLED_ID, &algoEnb);
+    }
+  if (smDesc == smDescAlgoCmpr) /* =================================================================== ALGO CMPR === */
+    {
+      /* is algorithm enabled? */
+      CrIaCopy(ALGOCCENABLED_ID, &algoEnb);
+    }
+  if (smDesc == smDescAlgoTtc1) /* =================================================================== ALGO TTC1 === */
+    {
+      /* is algorithm enabled? */
+      CrIaCopy(ALGOTTC1ENABLED_ID, &algoEnb);
+    }
+  if (smDesc == smDescAlgoTtc2) /* =================================================================== ALGO TTC2 === */
+    {
+      /* is algorithm enabled? */
+      CrIaCopy(ALGOTTC2ENABLED_ID, &algoEnb);
+    }
+  if (smDesc == smDescAlgoSaaEval) /* ================================================================= ALGO SAA === */
+    {
+      /* is algorithm enabled? */
+      CrIaCopy(ALGOSAAEVALENABLED_ID, &algoEnb);
+    }
+  if (smDesc == smDescAlgoSdsEval) /* ================================================================= ALGO SDS === */
+    {
+      /* is algorithm enabled? */
+      CrIaCopy(ALGOSDSEVALENABLED_ID, &algoEnb);
+    }
+
+  if (algoEnb == 1)
+    return 1;
+
+  return 0;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaAlgoInit.txt b/CrIa/src/CrIaPrSm/CrIaAlgoInit.txt
new file mode 100644
index 0000000..1cafb0d
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaAlgoInit.txt
@@ -0,0 +1,22 @@
+{
+	/** Define the state machine descriptor (SMD) */
+	FwSmDesc_t smDesc = CrIaAlgoCreate(NULL);
+
+	/** Check that the SM is properly configured */
+	if (FwSmCheckRec(smDesc) != smSuccess) {
+		printf("The state machine CrIaAlgo is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The state machine CrIaAlgo is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the SM, send a few transition commands to it, and execute it */
+	FwSmStart(smDesc);
+	FwSmMakeTrans(smDesc, Stop);
+	FwSmMakeTrans(smDesc, Resume);
+	FwSmMakeTrans(smDesc, Suspend);
+	FwSmMakeTrans(smDesc, Start);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaCalFullSnapCreate.c b/CrIa/src/CrIaPrSm/CrIaCalFullSnapCreate.c
new file mode 100644
index 0000000..312ffd0
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaCalFullSnapCreate.c
@@ -0,0 +1,59 @@
+/**
+ * @file CrIaCalFullSnapCreate.c
+ *
+ * @author FW Profile code generator version 5.01
+ * @date Created on: Jul 16 2018 16:41:41
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaCalFullSnap function definitions */
+#include "CrIaCalFullSnapCreate.h"
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaCalFullSnapCreate(void* prData)
+{
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+    12,	/* N_ANODES - The number of action nodes */
+    0,	/* N_DNODES - The number of decision nodes */
+    13,	/* N_FLOWS - The number of control flows */
+    12,	/* N_ACTIONS - The number of actions */
+    5	/* N_GUARDS - The number of guards */
+  );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddActionNode(prDesc, CrIaCalFullSnap_N4, &CrIaCalFullSnapN4);
+  FwPrAddActionNode(prDesc, CrIaCalFullSnap_N1, &CrIaCalFullSnapN1);
+  FwPrAddActionNode(prDesc, CrIaCalFullSnap_N8, &CrIaCalFullSnapN8);
+  FwPrAddActionNode(prDesc, CrIaCalFullSnap_N6, &CrIaCalFullSnapN6);
+  FwPrAddActionNode(prDesc, CrIaCalFullSnap_N9, &CrIaCalFullSnapN9);
+  FwPrAddActionNode(prDesc, CrIaCalFullSnap_N7, &CrIaCalFullSnapN7);
+  FwPrAddActionNode(prDesc, CrIaCalFullSnap_N2, &CrIaCalFullSnapN2);
+  FwPrAddActionNode(prDesc, CrIaCalFullSnap_N3, &CrIaCalFullSnapN3);
+  FwPrAddActionNode(prDesc, CrIaCalFullSnap_N2_1, &CrIaCalFullSnapN2_1);
+  FwPrAddActionNode(prDesc, CrIaCalFullSnap_N5_1, &CrIaCalFullSnapN5_1);
+  FwPrAddActionNode(prDesc, CrIaCalFullSnap_N5_2, &CrIaCalFullSnapN5_2);
+  FwPrAddActionNode(prDesc, CrIaCalFullSnap_N5, &CrIaCalFullSnapN5);
+  FwPrAddFlowIniToAct(prDesc, CrIaCalFullSnap_N1, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaCalFullSnap_N4, CrIaCalFullSnap_N5, &CrIaCalFullSnapWaitT2);
+  FwPrAddFlowActToAct(prDesc, CrIaCalFullSnap_N1, CrIaCalFullSnap_N2, &CrIaCalFullSnapIsSemInStab);
+  FwPrAddFlowActToAct(prDesc, CrIaCalFullSnap_N8, CrIaCalFullSnap_N9, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaCalFullSnap_N6, CrIaCalFullSnap_N7, &CrIaCalFullSnapFlag1And2);
+  FwPrAddFlowActToFin(prDesc, CrIaCalFullSnap_N9, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaCalFullSnap_N7, CrIaCalFullSnap_N8, &CrIaCalFullSnapIsTerm);
+  FwPrAddFlowActToAct(prDesc, CrIaCalFullSnap_N2, CrIaCalFullSnap_N2_1, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaCalFullSnap_N3, CrIaCalFullSnap_N4, &CrIaCalFullSnapWaitT1);
+  FwPrAddFlowActToAct(prDesc, CrIaCalFullSnap_N2_1, CrIaCalFullSnap_N3, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaCalFullSnap_N5_1, CrIaCalFullSnap_N5_2, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaCalFullSnap_N5_2, CrIaCalFullSnap_N6, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaCalFullSnap_N5, CrIaCalFullSnap_N5_1, NULL);
+
+  return prDesc;
+}
diff --git a/CrIa/src/CrIaPrSm/CrIaCalFullSnapCreate.h b/CrIa/src/CrIaPrSm/CrIaCalFullSnapCreate.h
new file mode 100644
index 0000000..8c5b8f0
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaCalFullSnapCreate.h
@@ -0,0 +1,207 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaCalFullSnap procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ * @image html CrIaCalFullSnap.png
+ *
+ * @author FW Profile code generator version 5.01
+ * @date Created on: Jul 16 2018 16:41:41
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaCalFullSnapCreate_H_
+#define CrIaCalFullSnapCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaCalFullSnap_N1 (1)		/* The identifier of action node N1 in procedure CrIaCalFullSnap */
+#define CrIaCalFullSnap_N2 (2)		/* The identifier of action node N2 in procedure CrIaCalFullSnap */
+#define CrIaCalFullSnap_N2_1 (3)		/* The identifier of action node N2_1 in procedure CrIaCalFullSnap */
+#define CrIaCalFullSnap_N3 (4)		/* The identifier of action node N3 in procedure CrIaCalFullSnap */
+#define CrIaCalFullSnap_N4 (5)		/* The identifier of action node N4 in procedure CrIaCalFullSnap */
+#define CrIaCalFullSnap_N5 (6)		/* The identifier of action node N5 in procedure CrIaCalFullSnap */
+#define CrIaCalFullSnap_N5_1 (7)		/* The identifier of action node N5_1 in procedure CrIaCalFullSnap */
+#define CrIaCalFullSnap_N5_2 (8)		/* The identifier of action node N5_2 in procedure CrIaCalFullSnap */
+#define CrIaCalFullSnap_N6 (9)		/* The identifier of action node N6 in procedure CrIaCalFullSnap */
+#define CrIaCalFullSnap_N7 (10)		/* The identifier of action node N7 in procedure CrIaCalFullSnap */
+#define CrIaCalFullSnap_N8 (11)		/* The identifier of action node N8 in procedure CrIaCalFullSnap */
+#define CrIaCalFullSnap_N9 (12)		/* The identifier of action node N9 in procedure CrIaCalFullSnap */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaCalFullSnapCreate(void* prData);
+
+/**
+ * Action for node N4.
+ * Send cmd (220,11) to the SEM
+ * @param smDesc the procedure descriptor
+ */
+void CrIaCalFullSnapN4(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N1.
+ * Generate Event Report EVT_SC_PR_STRT
+ * @param smDesc the procedure descriptor
+ */
+void CrIaCalFullSnapN1(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N8.
+ * <pre>
+ * Stop Compression/Collection
+ * and Centroid Algorithms
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaCalFullSnapN8(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N6.
+ * <pre>
+ * Start Compression/Collection
+ * Algorithm
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaCalFullSnapN6(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N9.
+ * <pre>
+ * Generate Event Report EVT_SC_PR_END
+ *  with outcome equal to: "success"
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaCalFullSnapN9(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N7.
+ * <pre>
+ * Send command GoToStabilize
+ * to SEM Unit State Machine
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaCalFullSnapN7(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N2.
+ * <pre>
+ * Update SEM configuration
+ * parameters in the data pool
+ * with procedure parameters
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaCalFullSnapN2(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N3.
+ * Send cmd (220,3) to the SEM
+ * @param smDesc the procedure descriptor
+ */
+void CrIaCalFullSnapN3(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N2_1.
+ * <pre>
+ * Set data pool variable
+ * pCcdRdMode to CCD_FULL
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaCalFullSnapN2_1(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N5_1.
+ * <pre>
+ * Enable the selected
+ * centroiding algorithm
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaCalFullSnapN5_1(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N5_2.
+ * Start Centroiding Algorithms
+ * @param smDesc the procedure descriptor
+ */
+void CrIaCalFullSnapN5_2(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N5.
+ * <pre>
+ * Send command GoToCcdFull
+ * to SEM Unit State Machine
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaCalFullSnapN5(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N4 to N5.
+ * <pre>
+ *  Wait calFullSnapT2
+ * cycles 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaCalFullSnapWaitT2(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N1 to N2.
+ *  SEM State Machine is in STABILIZE 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaCalFullSnapIsSemInStab(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N6 to N7.
+ *  Flag_1  
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaCalFullSnapFlag1And2(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N7 to N8.
+ * <pre>
+ *  (SEM Operational SM is in STABILIZE) &&
+ * (All sporadic activities have terminated) 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaCalFullSnapIsTerm(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N3 to N4.
+ * <pre>
+ *  Wait calFullSnapT1
+ * cycles 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaCalFullSnapWaitT1(FwPrDesc_t prDesc);
+
+#endif /* CrIaCalFullSnapCreate_H_ */
diff --git a/CrIa/src/CrIaPrSm/CrIaCalFullSnapFunc.c b/CrIa/src/CrIaPrSm/CrIaCalFullSnapFunc.c
new file mode 100644
index 0000000..6836f0b
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaCalFullSnapFunc.c
@@ -0,0 +1,360 @@
+/**
+ * @file CrIaCalFullSnapFunc.c
+ * @ingroup CrIaPrSci
+ * @author FW Profile code generator version 5.01; Institute for Astrophysics, 2015-2016
+ * @date Created on: Jul 16 2018 16:41:41
+ *
+ * @brief Implementation of the Calibration Full Snap Procedure nodes and guards.
+ * Implements an observation of type CAL/FULL/SNAP.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include <FwProfile/FwPrConstants.h>
+#include <FwProfile/FwPrDCreate.h>
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwPrCore.h> /* for FwPrGetCurNode() */
+
+/** Cordet FW function definitions */
+#include <CrFramework/OutFactory/CrFwOutFactory.h>
+#include <CrFramework/OutLoader/CrFwOutLoader.h>
+#include <CrFramework/OutCmp/CrFwOutCmp.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+#include <Services/General/CrIaConstants.h>
+#include <Services/General/CrSemConstants.h>
+
+/** CrIaCalFullSnap function definitions */
+#include "CrIaCalFullSnapCreate.h"
+
+#include <CrIaIasw.h> /* for Event Reporting and extern sm and prDescriptors */
+#include <CrIaPrSm/CrIaSemCreate.h> /* for GoToCcdWindow and GoToStabilize */
+#include <CrIaPrSm/CrIaAlgoCreate.h> /* for Start and Stop */
+
+#include <IfswDebug.h>
+
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N1. */
+void CrIaCalFullSnapN1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short evt_data[2];
+  unsigned short ProcId = CRIA_SERV198_CAL_FULL_SNAP;
+
+  /* Generate event report EVT_SC_PR_STRT */
+
+  evt_data[0] = ProcId;
+  evt_data[1] = 0; /* NOT USED */
+
+  PRDEBUGP("CalFullSnap N1: Event %d generated to signal start of CAL FULL SNAP PR\n", ProcId);
+  CrIaEvtRep(1, CRIA_SERV5_EVT_SC_PR_STRT, evt_data, 4);
+
+  return;
+}
+
+/** Action for node N2. */
+void CrIaCalFullSnapN2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short utemp16;
+  unsigned int utemp32;
+
+  /* Update SEM configuration parameters in data pool */
+
+  /* needed for TC(220/3) CMD_Operation_Parameter */
+
+  CrIaCopy(CALFULLSNAP_PEXPTIME_ID, &utemp32);
+  CrIaPaste(PEXPTIME_ID, &utemp32);
+
+  CrIaCopy(CALFULLSNAP_PIMAGEREP_ID, &utemp32);
+  CrIaPaste(PIMAGEREP_ID, &utemp32);
+
+  CrIaCopy(CALFULLSNAP_PNMBIMAGES_ID, &utemp32);
+  CrIaPaste(PACQNUM_ID, &utemp32);
+
+  /* data oversampling */
+  utemp16 = 0; /* means "NO" */
+  CrIaPaste(PDATAOS_ID, &utemp16);
+
+  /* pCcdRdMode is set in N2_1 */
+
+  return;
+}
+
+/** Action for node N2_1. */
+void CrIaCalFullSnapN2_1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short utemp16;
+
+  /* Set data pool variable pCcdRdMode to CCD_FULL */
+
+  /* CCD readout mode */
+  utemp16 = SEM_CCD_MODE_CCD_FULL;
+  CrIaPaste(PCCDRDMODE_ID, &utemp16);
+
+  return;
+}
+
+/** Action for node N3. */
+void CrIaCalFullSnapN3(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  FwSmDesc_t cmd;
+  CrFwBool_t accept=1, start=0, progress=0, term=1;
+
+  /* Send cmd (220,3) to SEM */
+  /* Changes the SEM Operational Parameter */
+
+  DEBUGP("SciWin N3: Send cmd (220,3) to SEM\n");
+
+  cmd = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRSEM_SERV220, CRSEM_SERV220_CMD_OPER_PARAM, 0, 0);
+  if (cmd == NULL)
+    {
+      /* handled by Resource FdCheck */
+      return;
+    }
+
+  /* NOTE: parameters are set in the cmd update action according to the data pool entries */
+
+  CrFwOutCmpSetAckLevel(cmd, accept, start, progress, term);
+  CrFwOutCmpSetDest(cmd, CR_FW_CLIENT_SEM);
+  CrFwOutLoaderLoad(cmd);
+
+  return;
+}
+
+/** Action for node N4. */
+void CrIaCalFullSnapN4(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  FwSmDesc_t cmd;
+  CrFwBool_t accept=1, start=0, progress=0, term=1;
+
+  /* Send cmd (220,11) to SEM */
+  /* Changes the SEM Functional Parameter */
+
+  DEBUGP("SciWin N4: Send cmd (220,11) to SEM\n");
+
+  cmd = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRSEM_SERV220, CRSEM_SERV220_CMD_FUNCT_PARAM, 0, 0);
+  if (cmd == NULL)
+    {
+      /* handled by Resource FdCheck */
+      return;
+    }
+
+  /* NOTE: parameters are set in the cmd update action according to the data pool entries */
+
+  CrFwOutCmpSetAckLevel(cmd, accept, start, progress, term);
+  CrFwOutCmpSetDest(cmd, CR_FW_CLIENT_SEM);
+  CrFwOutLoaderLoad(cmd);
+
+  return;
+}
+
+/** Action for node N5. */
+void CrIaCalFullSnapN5(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Send command GoToCcdFull to SEM Unit State Machine */
+
+  FwSmMakeTrans(smDescSem, GoToCcdFull);
+
+  return;
+}
+
+/** Action for node N5_1. */
+void CrIaCalFullSnapN5_1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char defCentEnabled = 0, dumCentEnabled = 0;
+  unsigned short pCentSel;
+
+  /* Enable the selected centroiding algorithm */
+
+  CrIaCopy(CALFULLSNAP_PCENTSEL_ID, &pCentSel);
+
+  if (pCentSel != NO_CENT)
+    {
+      if (pCentSel == DUM_CENT)
+        {
+          dumCentEnabled = 1;
+        }
+      else
+        {
+          defCentEnabled = 1;
+        }
+    }
+    
+  CrIaPaste(ALGOCENT0ENABLED_ID, &dumCentEnabled);
+  CrIaPaste(ALGOCENT1ENABLED_ID, &defCentEnabled);
+
+  return;
+}
+
+/** Action for node N5_2. */
+void CrIaCalFullSnapN5_2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Start Centroiding Algorithms */
+
+  FwSmMakeTrans(smDescAlgoCent0, Start);
+  FwSmMakeTrans(smDescAlgoCent1, Start);
+
+  return;
+}
+
+/** Action for node N6. */
+void CrIaCalFullSnapN6(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Start Compression Algorithm and Collection Algorithm */
+
+  FwSmMakeTrans(smDescAlgoCmpr, Start); /* NOTE: Clct is part of Cmpr */
+
+  return;
+}
+
+/** Action for node N7. */
+void CrIaCalFullSnapN7(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Send command GoToStabilize to SEM Unit State Machine */
+
+  FwSmMakeTrans(smDescSem, GoToStabilize);
+
+  return;
+}
+
+/** Action for node N8. */
+void CrIaCalFullSnapN8(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Stop Compression/Collection and Centroiding Algorithms */
+
+  FwSmMakeTrans(smDescAlgoCmpr, Stop); /* NOTE: Clct is part of Cmpr */
+  FwSmMakeTrans(smDescAlgoCent0, Stop);
+  FwSmMakeTrans(smDescAlgoCent1, Stop);
+
+  return;
+}
+
+/** Action for node N9. */
+void CrIaCalFullSnapN9(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short evt_data[2];
+  unsigned short ProcId = CRIA_SERV198_CAL_FULL_SNAP;
+
+  /* Generate event report EVT_SC_PR_END with outcome "success" */
+
+  evt_data[0] = ProcId;
+  evt_data[1] = 1; /* 1 = success */
+
+  CrIaEvtRep(1, CRIA_SERV5_EVT_SC_PR_END, evt_data, 4);
+
+  return;
+}
+
+/**************/
+/*** GUARDS ***/
+/**************/
+
+/** Guard on the Control Flow from N1 to N2. */
+FwPrBool_t CrIaCalFullSnapIsSemInStab(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short sem_oper_state;
+
+  /* [ SEM State Machine is in STABILIZE ] */
+
+  /* get current state */
+  sem_oper_state = FwSmGetCurStateEmb(smDescSem);
+
+  if (sem_oper_state == CrIaSem_STABILIZE)
+    return 1;
+
+  return 0;
+}
+
+/** Guard on the Control Flow from N3 to N4. */
+FwPrBool_t CrIaCalFullSnapWaitT1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned int calFullSnapT1;
+
+  CrIaCopy(CALFULLSNAPT1_ID, &calFullSnapT1);
+
+  /* [ Wait calFullSnapT1 cycles ] */
+  if (FwPrGetNodeExecCnt(prDesc) < calFullSnapT1)
+    {
+      return 0;
+    }
+  else
+    {
+      return 1;
+    }
+}
+
+/** Guard on the Control Flow from N4 to N5. */
+FwPrBool_t CrIaCalFullSnapWaitT2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned int calFullSnapT2;
+
+  CrIaCopy(CALFULLSNAPT2_ID, &calFullSnapT2);
+
+  /* [ Wait calFullSnapT2 cycles ] */
+  if (FwPrGetNodeExecCnt(prDesc) < calFullSnapT2)
+    {
+      return 0;
+    }
+  else 
+    {
+      return 1;
+    }
+}
+
+/** Guard on the Control Flow from N6 to N7. */
+FwPrBool_t CrIaCalFullSnapFlag1And2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned int AcqImageCnt;
+  unsigned int CalFullSnap_pNmbImages;
+  unsigned char lstpckt;
+  
+  /* [ Flag_1 ] */
+  /* Flag_1 is true in the cycle in which (acqImageCnt+1) is equal to pNmbImages and LastSemPckt is true */
+
+  CrIaCopy(ACQIMAGECNT_ID, &AcqImageCnt);
+  CrIaCopy(CALFULLSNAP_PNMBIMAGES_ID, &CalFullSnap_pNmbImages);
+  CrIaCopy(LASTSEMPCKT_ID, &lstpckt);
+ 
+  if (((AcqImageCnt+1) == CalFullSnap_pNmbImages) && (lstpckt == 1))
+      return 1;
+  
+  return 0;
+}
+
+/** Guard on the Control Flow from N7 to N8. */
+FwPrBool_t CrIaCalFullSnapIsTerm(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short sem_oper_state, Cpu2ProcStatus;
+
+  /* get current state */
+  sem_oper_state = FwSmGetCurStateEmb(smDescSem);
+
+  /* get state of second CPU */
+  CrIaCopy(CPU2PROCSTATUS_ID, &Cpu2ProcStatus);
+
+  DEBUGP("N11->N12: %d %d\n", sem_oper_state, Cpu2ProcStatus);
+
+  if (sem_oper_state == CrIaSem_STABILIZE) /* SEM Operational SM is in STABILIZE */
+    if (Cpu2ProcStatus == SDP_STATUS_IDLE) /* All sporadic activities have terminated */
+      return 1;
+
+  return 0;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaCalFullSnapInit.txt b/CrIa/src/CrIaPrSm/CrIaCalFullSnapInit.txt
new file mode 100644
index 0000000..5359feb
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaCalFullSnapInit.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaCalFullSnapCreate(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaCalFullSnap is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaCalFullSnap is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaCentAlgoCreate.c b/CrIa/src/CrIaPrSm/CrIaCentAlgoCreate.c
new file mode 100644
index 0000000..b713eb0
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaCentAlgoCreate.c
@@ -0,0 +1,41 @@
+/**
+ * @file CrIaCentAlgoCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaCentAlgo function definitions */
+#include "CrIaCentAlgoCreate.h"
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaCentAlgoCreate(void* prData)
+{
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+                        3,	/* N_ANODES - The number of action nodes */
+                        0,	/* N_DNODES - The number of decision nodes */
+                        4,	/* N_FLOWS - The number of control flows */
+                        3,	/* N_ACTIONS - The number of actions */
+                        0	/* N_GUARDS - The number of guards */
+                      );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddActionNode(prDesc, CrIaCentAlgo_N1, &CrIaCentAlgoN1);
+  FwPrAddActionNode(prDesc, CrIaCentAlgo_N2, &CrIaCentAlgoN2);
+  FwPrAddActionNode(prDesc, CrIaCentAlgo_N4, &CrIaCentAlgoN4);
+  FwPrAddFlowIniToAct(prDesc, CrIaCentAlgo_N1, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaCentAlgo_N1, CrIaCentAlgo_N2, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaCentAlgo_N2, CrIaCentAlgo_N4, NULL);
+  FwPrAddFlowActToFin(prDesc, CrIaCentAlgo_N4, NULL);
+
+  return prDesc;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaCentAlgoCreate.h b/CrIa/src/CrIaPrSm/CrIaCentAlgoCreate.h
new file mode 100644
index 0000000..7c1a556
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaCentAlgoCreate.h
@@ -0,0 +1,67 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaCentAlgo procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ * @image html CrIaCentAlgo.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaCentAlgoCreate_H_
+#define CrIaCentAlgoCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaCentAlgo_N1 1		/* The identifier of action node N1 in procedure CrIaCentAlgo */
+#define CrIaCentAlgo_N2 2		/* The identifier of action node N2 in procedure CrIaCentAlgo */
+#define CrIaCentAlgo_N4 3		/* The identifier of action node N4 in procedure CrIaCentAlgo */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaCentAlgoCreate(void* prData);
+
+/**
+ * Action for node N1.
+ * <pre>
+ * Select the SIB to be used as input
+ * for the Centroiding Algorithm
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaCentAlgoN1(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N2.
+ * <pre>
+ * Compute centroiding data
+ * for data in the selected input buffer 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaCentAlgoN2(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N4.
+ * Write algorithm output to the data pool
+ * @param smDesc the procedure descriptor
+ */
+void CrIaCentAlgoN4(FwPrDesc_t prDesc);
+
+#endif /* CrIaCentAlgoCreate_H_ */
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaCentAlgoFunc.c b/CrIa/src/CrIaPrSm/CrIaCentAlgoFunc.c
new file mode 100644
index 0000000..673de86
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaCentAlgoFunc.c
@@ -0,0 +1,136 @@
+/**
+ * @file CrIaCentAlgoFunc.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+#include "FwProfile/FwPrCore.h"
+
+#include <FwProfile/FwSmCore.h> /* for FwSmGetCurState() */
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+/** CrIaCentAlgo function definitions */
+#include "CrIaCentAlgoCreate.h"
+
+/** the actual centroiding algorithm */
+#include "EngineeringAlgorithms.h"
+
+#include "IfswDebug.h"
+#include "CrIaIasw.h"
+
+#include <CrIaPrSm/CrIaAlgoCreate.h>
+
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N1. */
+void CrIaCentAlgoN1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* select the SIB to be used as input for the centroiding algorithm */
+
+  /* NOTE: We use the current sib in and via the centroiding phase the user needs to make sure that it is complete.     
+     Alternatively, we could add a (toggle)flag in the sci data upd function (or in the S21) because the 
+     number of expected reports is given in the SEM data. */
+
+  return;
+}
+
+
+/** Action for node N2. */
+void CrIaCentAlgoN2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  struct CrIaSib *p_outgoingSibIn;
+
+#ifdef PC_TARGET
+  p_outgoingSibIn = ShmOutgoingSibInPTR;
+#else
+  p_outgoingSibIn = &outgoingSibInStruct;
+#endif
+  
+  /* compute centroiding data for data in the selected input buffer */
+
+  PRDEBUGP("** Centr SIB: %u", (unsigned int) GET_SDB_OFFSET_FROM_ADDR(p_outgoingSibIn->Base));
+
+  if (p_outgoingSibIn->UsedSize != 0) /* protection to start on invalid Sib */
+    {
+      if (FwSmGetCurState(smDescAlgoCent0) == CrIaAlgo_ACTIVE) /* if Dummy Centroiding is active */
+        {
+          PrepareSibCentroid (p_outgoingSibIn, CEN_INV_ALGO, 0.0f, 0.0f); /* Mantis 2197 */
+        }
+      else
+        {
+          Centroiding (p_outgoingSibIn);
+        }
+
+      /* Mantis 2180 */
+      S196Flag = 1;
+    }
+  else
+    {
+      /* no data, nothing calculated, nothing to report ;) */
+      PRDEBUGP("CEN: no data!\n");
+    }
+
+  return;
+}
+
+/** Action for node N4. */
+void CrIaCentAlgoN4(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  struct SibCentroid *Centroid;
+  int offsetX, offsetY;
+  unsigned short startIntegFine, endIntegFine, dataCadence;
+  unsigned int startIntegCoarse, endIntegCoarse;
+  unsigned char validityStatus;
+
+  /* The output of Centroiding was written back into the SibStruct Centroid section 
+     Here we write the algorithm output to the data pool */  
+
+#ifdef PC_TARGET
+  Centroid = (struct SibCentroid *)(ShmOutgoingSibInPTR->Centroid);
+#else
+  Centroid = (struct SibCentroid *)(outgoingSibInStruct.Centroid);
+#endif
+  
+  /* load the report parameters from the data pool and feed into the packet */
+  offsetX = Centroid->offsetX;
+  CrIaPaste (OFFSETX_ID, &offsetX);
+
+  offsetY = Centroid->offsetY;
+  CrIaPaste (OFFSETY_ID, &offsetY);
+
+  /* NOTE: target location is NOT copied back from the data pool */
+  
+  startIntegCoarse = Centroid->startIntegCoarse;
+  CrIaPaste(INTEGSTARTTIMECRS_ID, &startIntegCoarse);
+
+  startIntegFine = (unsigned short) (Centroid->startIntegFine);
+  CrIaPaste(INTEGSTARTTIMEFINE_ID, &startIntegFine);
+
+  endIntegCoarse = Centroid->endIntegCoarse;
+  CrIaPaste(INTEGENDTIMECRS_ID, &endIntegCoarse);
+
+  endIntegFine = (unsigned short) (Centroid->endIntegFine);
+  CrIaPaste(INTEGENDTIMEFINE_ID, &endIntegFine);
+
+  dataCadence = (unsigned short) (Centroid->dataCadence);
+  CrIaPaste(DATACADENCE_ID, &dataCadence);
+
+  validityStatus = (unsigned char) (Centroid->validityStatus);
+  CrIaPaste(VALIDITYSTATUS_ID, &validityStatus);
+
+  return;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaCentAlgoInit.txt b/CrIa/src/CrIaPrSm/CrIaCentAlgoInit.txt
new file mode 100644
index 0000000..c6dd058
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaCentAlgoInit.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaCentAlgoCreate(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaCentAlgo is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaCentAlgo is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaCentValProcCreate.c b/CrIa/src/CrIaPrSm/CrIaCentValProcCreate.c
new file mode 100644
index 0000000..31dac1b
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaCentValProcCreate.c
@@ -0,0 +1,89 @@
+/**
+ * @file CrIaCentValProcCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:46
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaCentValProc function definitions */
+#include "CrIaCentValProcCreate.h"
+
+/**
+ * Guard on the Control Flow from DECISION2 to DECISION3.
+ *  Else
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code55002(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/**
+ * Guard on the Control Flow from DECISION3 to DECISION4.
+ *  Else
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code31035(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/**
+ * Guard on the Control Flow from DECISION4 to N2.
+ *  Else
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code57742(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaCentValProcCreate(void* prData)
+{
+  const FwPrCounterU2_t DECISION2 = 1;		/* The identifier of decision node DECISION2 in procedure CrIaCentValProc */
+  const FwPrCounterU2_t N_OUT_OF_DECISION2 = 2;	/* The number of control flows out of decision node DECISION2 in procedure CrIaCentValProc */
+  const FwPrCounterU2_t DECISION3 = 2;		/* The identifier of decision node DECISION3 in procedure CrIaCentValProc */
+  const FwPrCounterU2_t N_OUT_OF_DECISION3 = 2;	/* The number of control flows out of decision node DECISION3 in procedure CrIaCentValProc */
+  const FwPrCounterU2_t DECISION4 = 3;		/* The identifier of decision node DECISION4 in procedure CrIaCentValProc */
+  const FwPrCounterU2_t N_OUT_OF_DECISION4 = 2;	/* The number of control flows out of decision node DECISION4 in procedure CrIaCentValProc */
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+                        3,	/* N_ANODES - The number of action nodes */
+                        3,	/* N_DNODES - The number of decision nodes */
+                        10,	/* N_FLOWS - The number of control flows */
+                        3,	/* N_ACTIONS - The number of actions */
+                        6	/* N_GUARDS - The number of guards */
+                      );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddActionNode(prDesc, CrIaCentValProc_N1, &CrIaCentValProcN1);
+  FwPrAddDecisionNode(prDesc, DECISION2, N_OUT_OF_DECISION2);
+  FwPrAddDecisionNode(prDesc, DECISION3, N_OUT_OF_DECISION3);
+  FwPrAddDecisionNode(prDesc, DECISION4, N_OUT_OF_DECISION4);
+  FwPrAddActionNode(prDesc, CrIaCentValProc_N2, &CrIaCentValProcN2);
+  FwPrAddActionNode(prDesc, CrIaCentValProc_N3, &CrIaCentValProcN3);
+  FwPrAddFlowIniToDec(prDesc, DECISION2, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaCentValProc_N1, CrIaCentValProc_N3, NULL);
+  FwPrAddFlowDecToAct(prDesc, DECISION2, CrIaCentValProc_N1, &CrIaCentValProcIsOutFOV);
+  FwPrAddFlowDecToDec(prDesc, DECISION2, DECISION3, &code55002);
+  FwPrAddFlowDecToAct(prDesc, DECISION3, CrIaCentValProc_N1, &CrIaCentValProcIsDistLarge);
+  FwPrAddFlowDecToDec(prDesc, DECISION3, DECISION4, &code31035);
+  FwPrAddFlowDecToAct(prDesc, DECISION4, CrIaCentValProc_N1, &CrIaCentValProcIsFrozen);
+  FwPrAddFlowDecToAct(prDesc, DECISION4, CrIaCentValProc_N2, &code57742);
+  FwPrAddFlowActToFin(prDesc, CrIaCentValProc_N2, NULL);
+  FwPrAddFlowActToFin(prDesc, CrIaCentValProc_N3, NULL);
+
+  return prDesc;
+}
diff --git a/CrIa/src/CrIaPrSm/CrIaCentValProcCreate.h b/CrIa/src/CrIaPrSm/CrIaCentValProcCreate.h
new file mode 100644
index 0000000..fdff23b
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaCentValProcCreate.h
@@ -0,0 +1,105 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaCentValProc procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ * @image html CrIaCentValProc.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:46
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaCentValProcCreate_H_
+#define CrIaCentValProcCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaCentValProc_N1 1		/* The identifier of action node N1 in procedure CrIaCentValProc */
+#define CrIaCentValProc_N2 2		/* The identifier of action node N2 in procedure CrIaCentValProc */
+#define CrIaCentValProc_N3 3		/* The identifier of action node N3 in procedure CrIaCentValProc */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaCentValProcCreate(void* prData);
+
+/**
+ * Action for node N1.
+ * <pre>
+ * Set centValProcOutput to
+ * indicate that the centroid is invalid
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaCentValProcN1(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N2.
+ * <pre>
+ * Set centValProcOutput to
+ * the same value as ValidityStatus
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaCentValProcN2(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N3.
+ * <pre>
+ * Generate event
+ * EVT_INV_CENT
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaCentValProcN3(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION2 to N1.
+ * <pre>
+ *  The position of the target is outside
+ * the instrument field of view 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaCentValProcIsOutFOV(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION3 to N1.
+ * <pre>
+ *  Distance between desired and measured position
+ * of target is greater than CENT_OFFSET_LIM 
+ * of size of instrument field of view 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaCentValProcIsDistLarge(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION4 to N1.
+ * <pre>
+ *  (More than CENT_FROZEN_LIM centroids have been 
+ * computed since IASW was started) && 
+ * (Last CENT_FROZEN_LIM centroids are identical) 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaCentValProcIsFrozen(FwPrDesc_t prDesc);
+
+#endif /* CrIaCentValProcCreate_H_ */
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaCentValProcFunc.c b/CrIa/src/CrIaPrSm/CrIaCentValProcFunc.c
new file mode 100644
index 0000000..713b4ef
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaCentValProcFunc.c
@@ -0,0 +1,210 @@
+/**
+ * @file CrIaCentValProcFunc.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:46
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+#include "FwProfile/FwPrCore.h"
+
+/** CrIaCentValProc function definitions */
+#include "CrIaCentValProcCreate.h"
+
+#include <CrIaIasw.h>
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+#include <EngineeringAlgorithms.h>
+#include <IfswDebug.h>
+
+
+#define CENTCONSCHECKFAIL 0xee
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N1. */
+void CrIaCentValProcN1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char centValProcOutput;
+
+  /* Set centValProcOutput to indicate that the centroid is invalid */
+
+  /* Validity Status:
+     VAL_CCD_WINDOW = 0x00
+     VAL_CCD_FULL = 0x01
+     INV_IN_DATA = 0xFF
+     NO_TARGET = 0xFE
+     LARGE_SMEARING = 0xFD
+     ALGO_FAILED = 0xFC
+     OBT_NOT_SYNC = 0xFB
+   */
+  
+  centValProcOutput = CENTCONSCHECKFAIL;
+  CrIaPaste(CENTVALPROCOUTPUT_ID, &centValProcOutput);
+
+  return;
+}
+
+/** Action for node N2. */
+void CrIaCentValProcN2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char validityStatus;
+
+  /* Set centValProcOutput to the same value as ValidityStatus */
+
+  CrIaCopy(VALIDITYSTATUS_ID, &validityStatus);
+  CrIaPaste(CENTVALPROCOUTPUT_ID, &validityStatus);
+
+  return;
+}
+
+/** Action for node N3. */
+void CrIaCentValProcN3(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short evt_data[2];
+
+  /* Generate event EVT_INV_CENT */
+
+  CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV, CRIA_SERV5_EVT_INV_CENT, evt_data, 4);
+
+  return;
+}
+
+/**********
+ * GUARDS *
+ **********/
+
+/** Guard on the Control Flow from DECISION2 to N1. */
+FwPrBool_t CrIaCentValProcIsOutFOV(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char validityStatus;
+  int CentOffsetX, CentOffsetY;
+  double fovSize, CentOffsetSq;
+
+  /* SPEC: [ The position of the target is outside the instrument field of view - NO_TARGET ] */
+
+  /* get the size of the current image from the current SIB, which was used to calculate the centroid */
+#ifdef PC_TARGET
+  fovSize = (ShmOutgoingSibInPTR->Xdim * ShmOutgoingSibInPTR->Xdim + ShmOutgoingSibInPTR->Ydim * ShmOutgoingSibInPTR->Ydim) * 0.25f;
+#else
+  fovSize = (outgoingSibInStruct.Xdim * outgoingSibInStruct.Xdim + outgoingSibInStruct.Ydim * outgoingSibInStruct.Ydim) * 0.25f;
+#endif
+
+  CrIaCopy (OFFSETX_ID, &CentOffsetX);
+  CrIaCopy (OFFSETY_ID, &CentOffsetY);
+
+  CentOffsetSq = ((double)CentOffsetX * (double)CentOffsetX + (double)CentOffsetY * (double)CentOffsetY) / 10000.0; /* incl. conversion centi-pixel to pixel */
+ 
+  CrIaCopy(VALIDITYSTATUS_ID, &validityStatus);
+
+  if ((validityStatus == CEN_VAL_WINDOW) || (validityStatus == CEN_VAL_FULL))
+    {
+      if (CentOffsetSq > fovSize)
+        {
+          return 1; /* declare inconsistency */
+        }
+    }
+
+  return 0;
+
+}
+
+
+/** Guard on the Control Flow from DECISION3 to N1. */
+FwPrBool_t CrIaCentValProcIsDistLarge(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  float centOffsetLim;
+  int CentOffsetX, CentOffsetY;
+  double fovSizeLimit, CentOffsetSq;
+  
+  /* [ Distance between desired and measured position of target is greater than CENT_OFFSET_LIM of 
+       size of instrument field of view ] */
+
+  DEBUGP("CrIaCentValProcIsDistLarge\n");
+
+  /* get Target Acquisition Distance Threshold from data pool */
+  CrIaCopy(CENT_OFFSET_LIM_ID, &centOffsetLim);
+
+  /* get the size of the current image from the current SIB, which was used to calculate the centroid */
+#ifdef PC_TARGET
+  fovSizeLimit = (ShmOutgoingSibInPTR->Xdim * ShmOutgoingSibInPTR->Xdim + ShmOutgoingSibInPTR->Ydim * ShmOutgoingSibInPTR->Ydim) * 0.25f;
+#else
+  fovSizeLimit = (outgoingSibInStruct.Xdim * outgoingSibInStruct.Xdim + outgoingSibInStruct.Ydim * outgoingSibInStruct.Ydim) * 0.25f;
+#endif
+  fovSizeLimit *= centOffsetLim * centOffsetLim; /* radius squared in pixel */
+  
+  CrIaCopy (OFFSETX_ID, &CentOffsetX);
+  CrIaCopy (OFFSETY_ID, &CentOffsetY);
+
+  CentOffsetSq = ((double)CentOffsetX * (double)CentOffsetX + (double)CentOffsetY * (double)CentOffsetY) / 10000.0; /* incl. conversion centi-pixel to pixel */
+ 
+  if (CentOffsetSq < fovSizeLimit)
+    {
+      return 0; 
+    }
+  else
+    {
+      return 1;
+    }
+  
+}
+
+/** Guard on the Control Flow from DECISION4 to N1. */
+FwPrBool_t CrIaCentValProcIsFrozen(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  int CentOffsetX, CentOffsetY;
+  unsigned int IntegStartTimeCrs;
+  static int CentOffsetXOld, CentOffsetYOld;
+  static unsigned int IntegStartTimeCrsOld;
+  static unsigned int centFrozenNmb = 0; 
+  static unsigned int centFrozenNmbOld = 0; 
+  float centFrozenLim;
+
+  /* [ (More than CENT_FROZEN_LIM centroids have been computed since IASW has started) &&
+       (Last CENT_FROZEN_LIM centroids are identical) ] */
+
+  DEBUGP("CrIaCentValProcIsFrozen\n");
+
+  CrIaCopy(CENT_FROZEN_LIM_ID, &centFrozenLim);
+
+  CrIaCopy (OFFSETX_ID, &CentOffsetX);
+  CrIaCopy (OFFSETY_ID, &CentOffsetY);
+  CrIaCopy (INTEGSTARTTIMECRS_ID, &IntegStartTimeCrs);
+
+  if (CentOffsetX == CentOffsetXOld)
+    {
+      if (CentOffsetY == CentOffsetYOld)
+	{
+          if (IntegStartTimeCrs == IntegStartTimeCrsOld)
+            {
+	      /* values frozen -> increment counter */ 
+	      centFrozenNmb++;
+            }
+	}
+    }
+  
+  if (centFrozenNmb >= (unsigned int)centFrozenLim)
+    {
+      return 1;
+    }
+
+  if (centFrozenNmbOld == centFrozenNmb)
+    centFrozenNmb = 0; /* Last centroid is not frozen, reset counter */
+
+  CentOffsetXOld = CentOffsetX;
+  CentOffsetYOld = CentOffsetY;
+  IntegStartTimeCrsOld = IntegStartTimeCrs;
+  centFrozenNmbOld = centFrozenNmb;
+
+  return 0;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaCentValProcInit.txt b/CrIa/src/CrIaPrSm/CrIaCentValProcInit.txt
new file mode 100644
index 0000000..a331c4f
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaCentValProcInit.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaCentValProcCreate(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaCentValProc is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaCentValProc is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaCmprAlgoExecCreate.c b/CrIa/src/CrIaPrSm/CrIaCmprAlgoExecCreate.c
new file mode 100644
index 0000000..404c52f
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaCmprAlgoExecCreate.c
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaCmprAlgoExecCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Sep 21 2016 11:3:28
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaCmprAlgoExec function definitions */
+#include "CrIaCmprAlgoExecCreate.h"
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaCmprAlgoExecCreate(void* prData)
+{
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+                        2,	/* N_ANODES - The number of action nodes */
+                        0,	/* N_DNODES - The number of decision nodes */
+                        3,	/* N_FLOWS - The number of control flows */
+                        2,	/* N_ACTIONS - The number of actions */
+                        1	/* N_GUARDS - The number of guards */
+                      );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddActionNode(prDesc, CrIaCmprAlgoExec_N1, &CrIaCmprAlgoExecN1);
+  FwPrAddActionNode(prDesc, CrIaCmprAlgoExec_N2, &CrIaCmprAlgoExecN2);
+  FwPrAddFlowIniToAct(prDesc, CrIaCmprAlgoExec_N1, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaCmprAlgoExec_N1, CrIaCmprAlgoExec_N2, &CrIaCmprAlgoExecGuard);
+  FwPrAddFlowActToFin(prDesc, CrIaCmprAlgoExec_N2, NULL);
+
+  return prDesc;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaCmprAlgoExecCreate.h b/CrIa/src/CrIaPrSm/CrIaCmprAlgoExecCreate.h
new file mode 100644
index 0000000..561539a
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaCmprAlgoExecCreate.h
@@ -0,0 +1,48 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaCmprAlgoExec procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ * @image html CrIaCmprAlgoExec.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Sep 21 2016 11:3:28
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaCmprAlgoExecCreate_H_
+#define CrIaCmprAlgoExecCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaCmprAlgoExec_N1 1		/* The identifier of action node N1 in procedure CrIaCmprAlgoExec */
+#define CrIaCmprAlgoExec_N2 2		/* The identifier of action node N2 in procedure CrIaCmprAlgoExec */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaCmprAlgoExecCreate(void* prData);
+
+/** Action for node N1. */
+void CrIaCmprAlgoExecN1(FwPrDesc_t __attribute__((unused)) prDesc);
+
+/** Action for node N2. */
+void CrIaCmprAlgoExecN2(FwPrDesc_t __attribute__((unused)) prDesc);
+
+/** Guard on the Control Flow from N1 to N2. */
+FwPrBool_t CrIaCmprAlgoExecGuard(FwPrDesc_t __attribute__((unused)) prDesc);
+
+#endif /* CrIaCmprAlgoExecCreate_H_ */
diff --git a/CrIa/src/CrIaPrSm/CrIaCmprAlgoExecFunc.c b/CrIa/src/CrIaPrSm/CrIaCmprAlgoExecFunc.c
new file mode 100644
index 0000000..cff3923
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaCmprAlgoExecFunc.c
@@ -0,0 +1,92 @@
+/**
+ * @file CrIaCmprAlgoExecFunc.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Sep 8 2016 18:9:49
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+#include "FwProfile/FwPrCore.h"
+
+/** CrIaCmprAlgoExec function definitions */
+#include "CrIaCmprAlgoExecCreate.h"
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include "Services/General/CrIaConstants.h"
+
+
+#include <IfswDebug.h>
+#include "CrIaIasw.h"
+
+#ifdef PC_TARGET
+/*extern unsigned int requestCompression;*/
+extern unsigned int *ShmRequestCompressionPTR; /* shared memory for fork() */
+#else
+#include "../IBSW/include/ibsw_interface.h"
+#endif /* PC_TARGET */
+#include "../../ifsw.h"
+
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N1. */
+void CrIaCmprAlgoExecN1(FwPrDesc_t __attribute__((unused)) prDesc)
+{ 
+#ifdef PC_TARGET
+  DEBUGP("CrIaCmprAlgoExecN1: SDP_STATUS_SCIENCE = %d\n", cpu1_notification(SDP_STATUS_SCIENCE));
+  if (cpu1_notification(SDP_STATUS_SCIENCE) == SDP_STATUS_IDLE)
+    {
+      DEBUGP("CrIaCmprAlgoExecN1: ... is SDP_STATUS_IDLE\n");
+    }
+
+  /*PRDEBUGP("Cmpr Algo exec.: requestCompression = %d\n", requestCompression);*/
+  PRDEBUGP("Cmpr Algo exec.: requestCompression = %d\n", ShmRequestCompressionPTR[0]);
+#else
+  run_rt(RTCONT_CMPR, DEADLINE_CMPR, run_compression);
+#endif /* PC_TARGET */
+  
+  return;
+}
+
+/** Action for node N2. */
+void CrIaCmprAlgoExecN2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  PRDEBUGP("exiting Cmpr Algo exec.\n");
+
+  return;
+}
+
+/** Guard on the Control Flow from N1 to N2. */
+FwPrBool_t CrIaCmprAlgoExecGuard(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+#ifdef PC_TARGET
+  unsigned short Cpu2ProcStatus;
+
+  CrIaCopy(CPU2PROCSTATUS_ID, &Cpu2ProcStatus);
+
+  PRDEBUGP("Cmpr Algo exec.: Check Cpu2ProcStatus = %d\n", Cpu2ProcStatus);
+  DEBUGP("CrIaCmprAlgoExecGuard: Cpu2ProcStatus = %d\n", Cpu2ProcStatus);
+
+  /* compression has finished */
+  if (Cpu2ProcStatus == SDP_STATUS_IDLE)
+    {
+      DEBUGP("CrIaCmprAlgoExecGuard: ... is SDP_STATUS_IDLE\n");    
+      return 1;  
+    }
+
+  return 0;
+#else
+  return 1;
+#endif /* PC_TARGET */
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaCmprAlgoExecInit.txt b/CrIa/src/CrIaPrSm/CrIaCmprAlgoExecInit.txt
new file mode 100644
index 0000000..c3cf330
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaCmprAlgoExecInit.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaCmprAlgoExecCreate(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaCmprAlgoExec is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaCmprAlgoExec is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaCtrldSwitchOffCreate.c b/CrIa/src/CrIaPrSm/CrIaCtrldSwitchOffCreate.c
new file mode 100644
index 0000000..9af77d8
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaCtrldSwitchOffCreate.c
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaCtrldSwitchOffCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:46
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaCtrldSwitchOff function definitions */
+#include "CrIaCtrldSwitchOffCreate.h"
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaCtrldSwitchOffCreate(void* prData)
+{
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+                        2,	/* N_ANODES - The number of action nodes */
+                        0,	/* N_DNODES - The number of decision nodes */
+                        3,	/* N_FLOWS - The number of control flows */
+                        2,	/* N_ACTIONS - The number of actions */
+                        1	/* N_GUARDS - The number of guards */
+                      );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddActionNode(prDesc, CrIaCtrldSwitchOff_N1, &CrIaCtrldSwitchOffStopSem);
+  FwPrAddActionNode(prDesc, CrIaCtrldSwitchOff_N2, &CrIaCtrldSwitchOffDisErrLog);
+  FwPrAddFlowIniToAct(prDesc, CrIaCtrldSwitchOff_N1, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaCtrldSwitchOff_N1, CrIaCtrldSwitchOff_N2, NULL);
+  FwPrAddFlowActToFin(prDesc, CrIaCtrldSwitchOff_N2, &CrIaCtrldSwitchOffWaitT1);
+
+  return prDesc;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaCtrldSwitchOffCreate.h b/CrIa/src/CrIaPrSm/CrIaCtrldSwitchOffCreate.h
new file mode 100644
index 0000000..f6f8aca
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaCtrldSwitchOffCreate.h
@@ -0,0 +1,67 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaCtrldSwitchOff procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ * @image html CrIaCtrldSwitchOff.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:46
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaCtrldSwitchOffCreate_H_
+#define CrIaCtrldSwitchOffCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaCtrldSwitchOff_N1 1		/* The identifier of action node N1 in procedure CrIaCtrldSwitchOff */
+#define CrIaCtrldSwitchOff_N2 2		/* The identifier of action node N2 in procedure CrIaCtrldSwitchOff */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaCtrldSwitchOffCreate(void* prData);
+
+/**
+ * Action for node N1.
+ * <pre>
+ * Send StopSem Command
+ * to IASW State Machine
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaCtrldSwitchOffStopSem(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N2.
+ * <pre>
+ * Disable Error Log by
+ * setting ERR_LOG_ENB to false
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaCtrldSwitchOffDisErrLog(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N2 to Final Node.
+ *  Wait CTRLD_SWITCH_OFF_T1 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaCtrldSwitchOffWaitT1(FwPrDesc_t prDesc);
+
+#endif /* CrIaCtrldSwitchOffCreate_H_ */
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaCtrldSwitchOffFunc.c b/CrIa/src/CrIaPrSm/CrIaCtrldSwitchOffFunc.c
new file mode 100644
index 0000000..5e431e1
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaCtrldSwitchOffFunc.c
@@ -0,0 +1,72 @@
+/**
+ * @file CrIaCtrldSwitchOffFunc.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:46
+ */
+
+/** CrIaCtrldSwitchOff function definitions */
+#include "CrIaCtrldSwitchOffCreate.h"
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+#include "FwProfile/FwPrCore.h"
+
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaIasw.h>
+#include <CrIaPrSm/CrIaIaswCreate.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <stdlib.h>
+
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N1. */
+void CrIaCtrldSwitchOffStopSem(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Send StopSem Command to IASW State Machine */
+
+  FwSmMakeTrans(smDescIasw, StopSem);
+
+  return;
+}
+
+/** Action for node N2. */
+void CrIaCtrldSwitchOffDisErrLog(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char Enabled;
+
+  /* Disable Error Log by setting ERR_LOG_ENB to false  */
+
+  Enabled = 0;
+  CrIaPaste(ERR_LOG_ENB_ID, &Enabled);
+
+  return;
+}
+
+/** Guard on the Control Flow from N2 to Final Node. */
+FwPrBool_t CrIaCtrldSwitchOffWaitT1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short ctrldSwitchOffT1;
+
+  CrIaCopy(CTRLD_SWITCH_OFF_T1_ID, &ctrldSwitchOffT1);
+
+  /* [ Wait CTRLD_SWITCH_OFF_T1 ] */
+  if (FwPrGetNodeExecCnt(prDesc) < ctrldSwitchOffT1)
+    {
+      return 0;
+    }
+  else
+    {
+      return 1;
+    }
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaCtrldSwitchOffInit.txt b/CrIa/src/CrIaPrSm/CrIaCtrldSwitchOffInit.txt
new file mode 100644
index 0000000..5f2a147
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaCtrldSwitchOffInit.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaCtrldSwitchOffCreate(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaCtrldSwitchOff is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaCtrldSwitchOff is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaFbfLoadCreate.c b/CrIa/src/CrIaPrSm/CrIaFbfLoadCreate.c
new file mode 100644
index 0000000..2da72d5
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaFbfLoadCreate.c
@@ -0,0 +1,76 @@
+/**
+ * @file CrIaFbfLoadCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: May 4 2016 8:24:50
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaFbfLoad function definitions */
+#include "CrIaFbfLoadCreate.h"
+
+/**
+ * Guard on the Control Flow from DECISION1 to N2.
+ * <pre>
+ *  Not all requested blocks
+ * have been read
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code42261(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/**
+ * Guard on the Control Flow from DECISION2 to N3.
+ *  Flag_1
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code97591(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaFbfLoadCreate(void* prData)
+{
+  const FwPrCounterU2_t DECISION1 = 1;		/* The identifier of decision node DECISION1 in procedure CrIaFbfLoad */
+  const FwPrCounterU2_t N_OUT_OF_DECISION1 = 2;	/* The number of control flows out of decision node DECISION1 in procedure CrIaFbfLoad */
+  const FwPrCounterU2_t DECISION2 = 2;		/* The identifier of decision node DECISION2 in procedure CrIaFbfLoad */
+  const FwPrCounterU2_t N_OUT_OF_DECISION2 = 2;	/* The number of control flows out of decision node DECISION2 in procedure CrIaFbfLoad */
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+                        3,	/* N_ANODES - The number of action nodes */
+                        2,	/* N_DNODES - The number of decision nodes */
+                        8,	/* N_FLOWS - The number of control flows */
+                        3,	/* N_ACTIONS - The number of actions */
+                        5	/* N_GUARDS - The number of guards */
+                      );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddActionNode(prDesc, CrIaFbfLoad_N1, &CrIaFbfLoadN1);
+  FwPrAddActionNode(prDesc, CrIaFbfLoad_N2, &CrIaFbfLoadN2);
+  FwPrAddDecisionNode(prDesc, DECISION1, N_OUT_OF_DECISION1);
+  FwPrAddDecisionNode(prDesc, DECISION2, N_OUT_OF_DECISION2);
+  FwPrAddActionNode(prDesc, CrIaFbfLoad_N3, &CrIaFbfLoadN3);
+  FwPrAddFlowIniToDec(prDesc, DECISION2, NULL);
+  FwPrAddFlowActToDec(prDesc, CrIaFbfLoad_N1, DECISION1, NULL);
+  FwPrAddFlowActToDec(prDesc, CrIaFbfLoad_N2, DECISION1, &CrIaWaitFbfBlckRdDur);
+  FwPrAddFlowDecToFin(prDesc, DECISION1, &CrIaFbfLoadAreAllBlocksRead);
+  FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaFbfLoad_N2, &code42261);
+  FwPrAddFlowDecToAct(prDesc, DECISION2, CrIaFbfLoad_N1, &CrIaFbfLoadFlag1);
+  FwPrAddFlowDecToAct(prDesc, DECISION2, CrIaFbfLoad_N3, &code97591);
+  FwPrAddFlowActToAct(prDesc, CrIaFbfLoad_N3, CrIaFbfLoad_N1, NULL);
+
+  return prDesc;
+}
diff --git a/CrIa/src/CrIaPrSm/CrIaFbfLoadCreate.h b/CrIa/src/CrIaPrSm/CrIaFbfLoadCreate.h
new file mode 100644
index 0000000..af3581d
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaFbfLoadCreate.h
@@ -0,0 +1,99 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaFbfLoad procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ * @image html CrIaFbfLoad.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: May 4 2016 8:24:50
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaFbfLoadCreate_H_
+#define CrIaFbfLoadCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaFbfLoad_N1 1		/* The identifier of action node N1 in procedure CrIaFbfLoad */
+#define CrIaFbfLoad_N2 2		/* The identifier of action node N2 in procedure CrIaFbfLoad */
+#define CrIaFbfLoad_N3 3		/* The identifier of action node N3 in procedure CrIaFbfLoad */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaFbfLoadCreate(void* prData);
+
+/**
+ * Action for node N1.
+ * <pre>
+ * Call IBSW operation to read 
+ * the first block from the Target FBF
+ * and write it to the RAM Data Area
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaFbfLoadN1(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N2.
+ * <pre>
+ * Call IBSW operation to read 
+ * the next block from the Target FBF
+ * and write it to the RAM Data Area
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaFbfLoadN2(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N3.
+ * <pre>
+ * Load EVT_FBF_LOAD_RISK
+ * with FBF identifier as parameter
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaFbfLoadN3(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N1 to DECISION1.
+ *  Wait FBF_BLCK_RD_DUR Cycles 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaWaitFbfBlckRdDur(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION1 to Final Node.
+ * <pre>
+ *  All requested blocks 
+ * have been read 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaFbfLoadAreAllBlocksRead(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION2 to N1.
+ *  ! Flag_1 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaFbfLoadFlag1(FwPrDesc_t prDesc);
+
+#endif /* CrIaFbfLoadCreate_H_ */
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaFbfLoadFunc.c b/CrIa/src/CrIaPrSm/CrIaFbfLoadFunc.c
new file mode 100644
index 0000000..94b883f
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaFbfLoadFunc.c
@@ -0,0 +1,196 @@
+/**
+ * @file CrIaFbfLoadFunc.c
+ * @ingroup CrIaPr
+ * @authors FW Profile code generator version 4.63; Institute for Astrophysics, 2015-2016
+ * @date Created on: May 4 2016 8:24:50
+ *
+ * @brief Implementation of the FBF Load Procedure
+ *
+ * Load number of blocks from a FBF into a RAM data area.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+#include "FwProfile/FwPrCore.h"
+
+/** CrIaFbfSave function definitions */
+#include "CrIaFbfSaveCreate.h"
+
+#include <CrIaIasw.h>
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+
+#if (__sparc__)
+#include <ibsw_interface.h>
+#endif
+
+#if (__sparc__)
+#include <wrap_malloc.h> /* for SRAM1_FLASH_ADDR */
+#include <iwf_flash.h>
+#else
+#define SRAM1_FLASH_ADDR 0
+#define FLASH_BLOCKSIZE 0
+#endif
+
+#include <IfswDebug.h>
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/**
+ * @brief Node 1 of the FBF Load Procedure
+ *
+ * @note Deviations from the specifications are given due to differing FLASH handling. Therefore reading a first block
+ * do not need a different handling as consecutive blocks.
+ *
+ */
+
+/** Action for node N1. */
+void CrIaFbfLoadN1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char readblocks = 0;
+
+  CrIaPaste(FBFLOADBLOCKCOUNTER_ID, &readblocks);
+  
+  /* NOTE: the first block is read by the loop in N2 */
+    
+  return;
+}
+
+/** Action for node N2. */
+void CrIaFbfLoadN2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char fbfId, fbfIndex, fbfNBlocks, readblocks;
+  unsigned int fbfRamAddr;
+
+  int readStatus;
+
+  CrIaCopy(FBFLOAD_PFBFNBLOCKS_ID, &fbfNBlocks);
+
+  if (fbfNBlocks == 0)
+    return;
+
+  CrIaCopy(FBFLOAD_PFBFID_ID, &fbfId);
+  fbfIndex = fbfId - 1;
+  
+  CrIaCopy(FBFLOAD_PFBFRAMADDR_ID, &fbfRamAddr);
+
+  CrIaCopy(FBFLOADBLOCKCOUNTER_ID, &readblocks);
+  
+  DEBUGP("Trigger Read, file %d blocks left: %d to %x\n", fbfId, fbfNBlocks, (unsigned int)fbfRamAddr);
+
+  fbfRamAddr += FLASH_BLOCKSIZE * readblocks;
+  
+  readStatus = CrIbFlashTriggerRead(fbfIndex, readblocks, (void *) fbfRamAddr);
+
+  if (readStatus != 0)
+    {
+      DEBUGP("Error: CrIbFlashTriggerRead returns a nonzero value!\n");
+    }
+  
+  DEBUGP("read one block to %x\n", (unsigned int)fbfRamAddr);
+
+  readblocks++;
+
+  CrIaPaste(FBFLOADBLOCKCOUNTER_ID, &readblocks);
+    
+  DEBUGP("LF action finished \n");
+
+  return;
+}
+
+
+/** Action for node N3. */
+void CrIaFbfLoadN3(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char fbfId;
+  unsigned short evt_data[2];
+
+  /* Load EVT_FBF_LOAD_RISK with FBF identifier as parameter*/
+  DEBUGP("LF load risk\n");
+
+  CrIaCopy(FBFLOAD_PFBFID_ID, &fbfId);
+  
+  /* Load EVT_SEM_TR */
+  evt_data[0] = fbfId;   /* FbfId */
+  evt_data[1] = 0;       /* NOT USED */
+
+  CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV, CRIA_SERV5_EVT_FBF_LOAD_RISK, evt_data, 4);
+
+  return;
+}
+
+/** Guard on the Control Flow from N1 to DECISION1. */
+FwPrBool_t CrIaWaitFbfBlckRdDur(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned int fbf_blck_rd_dur;
+
+  CrIaCopy(FBF_BLCK_RD_DUR_ID, &fbf_blck_rd_dur);
+  
+  /* Mantis 1581: Wait until FLASH is ready, but at least FBF_BLCK_RD_DUR cycles */
+  if ((FwPrGetNodeExecCnt(prDesc) >= fbf_blck_rd_dur) && CrIbFlashIsReady())
+    return 1;
+
+  return 0;
+}
+
+/** Guard on the Control Flow from DECISION1 to Final Node. */
+FwPrBool_t CrIaFbfLoadAreAllBlocksRead(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char fbfNBlocks, readblocks;
+
+  DEBUGP("CrIaFbfLoadFunc: Check if all requested blocks have been read\n");
+
+  CrIaCopy(FBFLOAD_PFBFNBLOCKS_ID, &fbfNBlocks);
+
+  CrIaCopy(FBFLOADBLOCKCOUNTER_ID, &readblocks);
+  
+  if (fbfNBlocks == readblocks)
+    {
+      return 1; /* done */
+    }
+
+  return 0;
+}
+
+/** Guard on the Control Flow from DECISION2 to N1. */
+FwPrBool_t CrIaFbfLoadFlag1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* raise flag if fbf is invalid or disabled */
+  unsigned char fbfId, fbfIndex, fbfValid, fbfEnb;
+
+  CrIaCopy(FBFLOAD_PFBFID_ID, &fbfId);
+  fbfIndex = fbfId - 1;
+  CrIaCopyArrayItem (ISFBFVALID_ID, &fbfValid, fbfIndex);
+  CrIaCopyArrayItem (FBF_ENB_ID, &fbfEnb, fbfIndex);
+
+  DEBUGP("LF: id %d v %d e %d\n", fbfId, fbfValid, fbfEnb);
+
+  if ((fbfValid == 0) || (fbfEnb == 0))
+    return 0;
+  /*
+     NOTE:
+     0 goes to N3 (risk)
+     1 goes to N1 (go on)
+  */
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaFbfLoadInit.txt b/CrIa/src/CrIaPrSm/CrIaFbfLoadInit.txt
new file mode 100644
index 0000000..2baee6a
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaFbfLoadInit.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaFbfLoadCreate(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaFbfLoad is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaFbfLoad is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaFbfSaveCreate.c b/CrIa/src/CrIaPrSm/CrIaFbfSaveCreate.c
new file mode 100644
index 0000000..dc10a64
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaFbfSaveCreate.c
@@ -0,0 +1,98 @@
+/**
+ * @file CrIaFbfSaveCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: May 4 2016 8:24:50
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaFbfSave function definitions */
+#include "CrIaFbfSaveCreate.h"
+
+/**
+ * Guard on the Control Flow from DECISION1 to DECISION3.
+ * <pre>
+ *  (All requested blocks
+ * have been written)  || Flag_1
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code11311(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/**
+ * Guard on the Control Flow from DECISION2 to N5.
+ *  Flag_1
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code64383(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/**
+ * Guard on the Control Flow from DECISION3 to N6.
+ *  Flag_1
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code2535(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaFbfSaveCreate(void* prData)
+{
+  const FwPrCounterU2_t DECISION1 = 1;		/* The identifier of decision node DECISION1 in procedure CrIaFbfSave */
+  const FwPrCounterU2_t N_OUT_OF_DECISION1 = 2;	/* The number of control flows out of decision node DECISION1 in procedure CrIaFbfSave */
+  const FwPrCounterU2_t DECISION2 = 2;		/* The identifier of decision node DECISION2 in procedure CrIaFbfSave */
+  const FwPrCounterU2_t N_OUT_OF_DECISION2 = 2;	/* The number of control flows out of decision node DECISION2 in procedure CrIaFbfSave */
+  const FwPrCounterU2_t DECISION3 = 3;		/* The identifier of decision node DECISION3 in procedure CrIaFbfSave */
+  const FwPrCounterU2_t N_OUT_OF_DECISION3 = 2;	/* The number of control flows out of decision node DECISION3 in procedure CrIaFbfSave */
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+                        6,	/* N_ANODES - The number of action nodes */
+                        3,	/* N_DNODES - The number of decision nodes */
+                        13,	/* N_FLOWS - The number of control flows */
+                        6,	/* N_ACTIONS - The number of actions */
+                        6	/* N_GUARDS - The number of guards */
+                      );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddActionNode(prDesc, CrIaFbfSave_N2, &CrIaFbfSaveN2);
+  FwPrAddActionNode(prDesc, CrIaFbfSave_N3, &CrIaFbfSaveN3);
+  FwPrAddDecisionNode(prDesc, DECISION1, N_OUT_OF_DECISION1);
+  FwPrAddActionNode(prDesc, CrIaFbfSave_N1, &CrIaFbfSaveN1);
+  FwPrAddActionNode(prDesc, CrIaFbfSave_N4, &CrIaFbfSaveN4);
+  FwPrAddDecisionNode(prDesc, DECISION2, N_OUT_OF_DECISION2);
+  FwPrAddActionNode(prDesc, CrIaFbfSave_N5, &CrIaFbfSaveN5);
+  FwPrAddDecisionNode(prDesc, DECISION3, N_OUT_OF_DECISION3);
+  FwPrAddActionNode(prDesc, CrIaFbfSave_N6, &CrIaFbfSaveN6);
+  FwPrAddFlowIniToDec(prDesc, DECISION2, NULL);
+  FwPrAddFlowActToDec(prDesc, CrIaFbfSave_N2, DECISION1, NULL);
+  FwPrAddFlowActToDec(prDesc, CrIaFbfSave_N3, DECISION1, &CrIaFbfSaveWaitFbfBlckWrDur);
+  FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaFbfSave_N3, &CrIaFbfSaveToN3);
+  FwPrAddFlowDecToDec(prDesc, DECISION1, DECISION3, &code11311);
+  FwPrAddFlowActToAct(prDesc, CrIaFbfSave_N1, CrIaFbfSave_N2, NULL);
+  FwPrAddFlowActToFin(prDesc, CrIaFbfSave_N4, NULL);
+  FwPrAddFlowDecToAct(prDesc, DECISION2, CrIaFbfSave_N1, &CrIaFbfSaveFlag1);
+  FwPrAddFlowDecToAct(prDesc, DECISION2, CrIaFbfSave_N5, &code64383);
+  FwPrAddFlowActToFin(prDesc, CrIaFbfSave_N5, NULL);
+  FwPrAddFlowDecToAct(prDesc, DECISION3, CrIaFbfSave_N4, &CrIaFbfSaveFlag1);
+  FwPrAddFlowDecToAct(prDesc, DECISION3, CrIaFbfSave_N6, &code2535);
+  FwPrAddFlowActToAct(prDesc, CrIaFbfSave_N6, CrIaFbfSave_N4, NULL);
+
+  return prDesc;
+}
diff --git a/CrIa/src/CrIaPrSm/CrIaFbfSaveCreate.h b/CrIa/src/CrIaPrSm/CrIaFbfSaveCreate.h
new file mode 100644
index 0000000..f2a3e64
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaFbfSaveCreate.h
@@ -0,0 +1,133 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaFbfSave procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ * @image html CrIaFbfSave.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: May 4 2016 8:24:50
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaFbfSaveCreate_H_
+#define CrIaFbfSaveCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaFbfSave_N1 1		/* The identifier of action node N1 in procedure CrIaFbfSave */
+#define CrIaFbfSave_N2 2		/* The identifier of action node N2 in procedure CrIaFbfSave */
+#define CrIaFbfSave_N3 3		/* The identifier of action node N3 in procedure CrIaFbfSave */
+#define CrIaFbfSave_N4 4		/* The identifier of action node N4 in procedure CrIaFbfSave */
+#define CrIaFbfSave_N5 5		/* The identifier of action node N5 in procedure CrIaFbfSave */
+#define CrIaFbfSave_N6 6		/* The identifier of action node N6 in procedure CrIaFbfSave */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaFbfSaveCreate(void* prData);
+
+/**
+ * Action for node N2.
+ * <pre>
+ * Call IBSW operation to transfer 
+ * the first block from RAM Data Area
+ * to the Target FBF
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaFbfSaveN2(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N3.
+ * <pre>
+ * Call IBSW operation to transfer 
+ * the next block from RAM Data Area
+ * to the Target FBF
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaFbfSaveN3(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N1.
+ * <pre>
+ * Call IBSW operation
+ * to open the Target FBF
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaFbfSaveN1(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N4.
+ * <pre>
+ * Call IBSW operation
+ * to close the Target FBF
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaFbfSaveN4(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N5.
+ * <pre>
+ * Load EVT_FBF_SAVE_DENIED
+ * with FBF identifier as parameter
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaFbfSaveN5(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N6.
+ * <pre>
+ * Load EVT_FBF_SAVE_ABRT
+ * with FBF identifier and number
+ * of blocks written as parameters
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaFbfSaveN6(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N2 to DECISION1.
+ *  Wait FBF_BLCK_WR_DUR Cycles 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaFbfSaveWaitFbfBlckWrDur(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION1 to N3.
+ * <pre>
+ *  (Not all requested blocks 
+ * have been written) && !Flag_1 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaFbfSaveToN3(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION2 to N1.
+ *  ! Flag_1 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaFbfSaveFlag1(FwPrDesc_t prDesc);
+
+#endif /* CrIaFbfSaveCreate_H_ */
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaFbfSaveFunc.c b/CrIa/src/CrIaPrSm/CrIaFbfSaveFunc.c
new file mode 100644
index 0000000..9961845
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaFbfSaveFunc.c
@@ -0,0 +1,248 @@
+/**
+ * @file CrIaFbfSaveFunc.c
+ * @ingroup CrIaPr
+ * @authors FW Profile code generator version 4.63; Institute for Astrophysics, 2015-2016
+ * @date Created on: May 4 2016 8:24:50
+ *
+ * @brief Implementation of the FBF Save Procedure
+ *
+ * Transfer a number of blocks from a RAM data area to a FBF.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+#include "FwProfile/FwPrCore.h"
+
+/** CrIaFbfSave function definitions */
+#include "CrIaFbfSaveCreate.h"
+
+#include <CrIaIasw.h>
+#include <Services/General/CrIaConstants.h>
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#if (__sparc__)
+#include <ibsw_interface.h>
+#endif
+
+#if (__sparc__)
+#include <wrap_malloc.h> /* for SRAM1_FLASH_ADDR */
+#include <iwf_flash.h>
+#else
+#define FLASH_BLOCKSIZE 0
+#endif
+
+#include <IfswDebug.h>
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/**
+ * @brief Node 1 of the FBF Save Procedure
+ *
+ * @note Deviations from the specifications are given due to differing FLASH handling. Therefore transfering a first block
+ * do not need a different handling as consecutive blocks.
+ *
+ */
+
+/** Action for node N1. */
+void CrIaFbfSaveN1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char fbfId, fbfIndex, writtenblocks;
+ 
+  writtenblocks = 0;
+  CrIaPaste(FBFSAVEBLOCKCOUNTER_ID, &writtenblocks);
+  
+  CrIaCopy(FBFSAVE_PFBFID_ID, &fbfId);
+  fbfIndex = fbfId - 1;
+
+  CrIbFbfOpen ((unsigned int)fbfIndex);
+  
+  return;
+}
+
+/** Action for node N2. */
+void CrIaFbfSaveN2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* No operation */
+  return;
+}
+
+/** Action for node N3. */
+void CrIaFbfSaveN3(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char fbfId, fbfIndex, writtenblocks;
+  unsigned int fbfRamAddr;
+
+  CrIaCopy(FBFSAVE_PFBFID_ID, &fbfId);
+  fbfIndex = fbfId - 1;
+  
+  CrIaCopy(FBFSAVE_PFBFRAMADDR_ID, &fbfRamAddr);
+  CrIaCopy(FBFSAVEBLOCKCOUNTER_ID, &writtenblocks);
+
+  fbfRamAddr += FLASH_BLOCKSIZE * writtenblocks;
+
+  DEBUGP("Trigger Write, file %d to %x\n", fbfId, (unsigned int)fbfRamAddr);
+  
+  CrIbFlashTriggerWrite(fbfIndex, (void *) fbfRamAddr);
+
+  /* Mantis 2127: this instruction was erroneously removed in commit 558472984 */
+  writtenblocks++;
+  CrIaPaste(FBFSAVEBLOCKCOUNTER_ID, &writtenblocks);
+  
+  DEBUGP("SF action finished\n");
+
+  return;
+}
+
+
+/** Action for node N4. */
+void CrIaFbfSaveN4(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Call IBSW operation to close the Target FBF */
+  unsigned char fbfId, fbfIndex;
+
+  DEBUGP("CrIaFbfSaveFunc N4: Call IBSW operation to close the Target FBF ...\n");
+
+  CrIaCopy(FBFSAVE_PFBFID_ID, &fbfId);
+  fbfIndex = fbfId - 1;
+
+  CrIbFbfClose(fbfIndex);
+
+  return;
+}
+
+/** Action for node N5. */
+void CrIaFbfSaveN5(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char fbfId;
+  unsigned short evt_data[2];
+
+  CrIaCopy(FBFSAVE_PFBFID_ID, &fbfId);
+
+  /* Load EVT_FBF_SAVE_DENIED with FBF identifier as parameter */
+  DEBUGP("Save denied for ID %d\n", fbfId);
+
+  /* Load EVT_SEM_TR */
+  evt_data[0] = fbfId;   /* FbfId */
+  evt_data[1] = 0;       /* NOT USED */
+
+  CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV, CRIA_SERV5_EVT_FBF_SAVE_DENIED, evt_data, 4);
+
+  return;
+}
+
+/** Action for node N6. */
+void CrIaFbfSaveN6(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char fbfId, writtenblocks;
+  unsigned short evt_data[2];
+
+  CrIaCopy(FBFSAVE_PFBFID_ID, &fbfId);
+  CrIaCopy(FBFSAVEBLOCKCOUNTER_ID, &writtenblocks);
+  
+  /* Load EVT_FBF_SAVE_ABRT with FBF identifier and number of blocks written as parameter */
+  DEBUGP("Save aborted for ID %d after %d written blocks\n", fbfId, writtenblocks);
+
+  /* Load EVT_SEM_TR */
+  evt_data[0] = fbfId; 
+  evt_data[1] = writtenblocks;      
+
+  CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV, CRIA_SERV5_EVT_FBF_SAVE_ABRT, evt_data, 4);
+
+  return;
+}
+
+/** Guard on the Control Flow from N2 to DECISION1. */
+FwPrBool_t CrIaFbfSaveWaitFbfBlckWrDur(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned int fbf_blck_wr_dur;
+  
+  CrIaCopy(FBF_BLCK_WR_DUR_ID, &fbf_blck_wr_dur);
+
+  /* Mantis 1582: Wait until FLASH is ready, but at least FBF_BLCK_WR_DUR cycles */
+  if ((FwPrGetNodeExecCnt(prDesc) >= fbf_blck_wr_dur) && CrIbFlashIsReady())
+    return 1;
+
+  return 0;
+}
+
+/** Guard on the Control Flow from DECISION1 to N3. */
+FwPrBool_t CrIaFbfSaveToN3(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Check if all requested blocks have been written || Flag_1 */
+
+  unsigned char fbfId, fbfIndex, fbfNBlocks, isSaaActive, fbfValid, fbfEnb, writtenblocks;
+
+  CrIaCopy(FBFSAVE_PFBFNBLOCKS_ID, &fbfNBlocks);
+  
+  CrIaCopy(FBFSAVE_PFBFID_ID, &fbfId);
+  fbfIndex = fbfId - 1;
+
+  CrIaCopyArrayItem (ISFBFVALID_ID, &fbfValid, fbfIndex);
+  CrIaCopyArrayItem (FBF_ENB_ID, &fbfEnb, fbfIndex);
+
+  CrIaCopy(ISSAAACTIVE_ID, &isSaaActive);
+
+  CrIaCopy(FBFSAVEBLOCKCOUNTER_ID, &writtenblocks);
+  
+  if (writtenblocks == fbfNBlocks)
+    return 0; /* done */
+
+  if (isSaaActive == 1)
+    return 0; /* this aborts the transfer */
+
+  if (fbfValid == 0)
+    return 0; /* abort */
+
+  if (fbfEnb == 0)
+    return 0; /* abort */
+
+  /* else move on to N3 */
+  return 1;
+}
+
+/** Guard on the Control Flow from DECISION2 to N1/N4. */
+FwPrBool_t CrIaFbfSaveFlag1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Flag_1 is true if the FBF is disabled, or invalid, or if the spacecraft is crossing the SAA (i.e. isSaaActive is true) */
+
+  unsigned char fbfId, fbfIndex, isSaaActive, fbfValid, fbfEnb;
+
+  CrIaCopy(FBFSAVE_PFBFID_ID, &fbfId);
+  fbfIndex = fbfId - 1;
+
+  CrIaCopyArrayItem (ISFBFVALID_ID, &fbfValid, fbfIndex);
+  CrIaCopyArrayItem (FBF_ENB_ID, &fbfEnb, fbfIndex);
+
+  CrIaCopy(ISSAAACTIVE_ID, &isSaaActive);
+
+  if (isSaaActive == 1)
+    return 0; /* this aborts the transfer */
+
+  if (fbfValid == 0)
+    return 0; /* abort */
+
+  if (fbfEnb == 0)
+    return 0; /* abort */
+
+  /* else move on to N1/N4 */
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaFbfSaveInit.txt b/CrIa/src/CrIaPrSm/CrIaFbfSaveInit.txt
new file mode 100644
index 0000000..054c77a
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaFbfSaveInit.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaFbfSaveCreate(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaFbfSave is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaFbfSave is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaFdCheckCreate.c b/CrIa/src/CrIaPrSm/CrIaFdCheckCreate.c
new file mode 100644
index 0000000..3ed4489
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaFdCheckCreate.c
@@ -0,0 +1,67 @@
+/**
+ * @file CrIaFdCheckCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: May 25 2016 8:50:47
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwSmDCreate.h"
+#include "FwProfile/FwSmConfig.h"
+
+/** CrIaFdCheck function definitions */
+#include "CrIaFdCheckCreate.h"
+
+/**
+ * Guard on the transition from CHOICE1 to FAILED.
+ *  (Anomaly Detected) && (FdCheckCnt == FdCheckCntThr)
+ * @param smDesc the state machine descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwSmBool_t code89795(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwSmDesc_t CrIaFdCheckCreate(void* smData)
+{
+  const FwSmCounterU2_t N_OUT_OF_NOMINAL = 2;	/* The number of transitions out of state NOMINAL */
+  const FwSmCounterU2_t N_OUT_OF_SUSPECTED = 2;	/* The number of transitions out of state SUSPECTED */
+  const FwSmCounterU2_t N_OUT_OF_FAILED = 2;	/* The number of transitions out of state FAILED */
+  const FwSmCounterU2_t N_OUT_OF_DISABLED = 1;	/* The number of transitions out of state DISABLED */
+  const FwSmCounterU2_t CHOICE1 = 1;		/* The identifier of choice pseudo-state CHOICE1 in State Machine CrIaFdCheck */
+  const FwSmCounterU2_t N_OUT_OF_CHOICE1 = 3;	/* The number of transitions out of the choice-pseudo state CHOICE1 */
+
+  /** Create state machine smDesc */
+  FwSmDesc_t smDesc = FwSmCreate(
+                        4,	/* NSTATES - The number of states */
+                        1,	/* NCPS - The number of choice pseudo-states */
+                        11,	/* NTRANS - The number of transitions */
+                        10,	/* NACTIONS - The number of state and transition actions */
+                        6	/* NGUARDS - The number of transition guards */
+                      );
+
+  /** Configure the state machine smDesc */
+  FwSmSetData(smDesc, smData);
+  FwSmAddState(smDesc, CrIaFdCheck_NOMINAL, N_OUT_OF_NOMINAL, &CrIaFdCheckNominalEntry, NULL, &CrIaFdCheckNominalDo, NULL);
+  FwSmAddState(smDesc, CrIaFdCheck_SUSPECTED, N_OUT_OF_SUSPECTED, &CrIaFdCheckSuspectedEntry, NULL, &CrIaFdCheckSuspectedDo, NULL);
+  FwSmAddState(smDesc, CrIaFdCheck_FAILED, N_OUT_OF_FAILED, &CrIaFdCheckFailedEntry, NULL, &CrIaFdCheckFailedDo, NULL);
+  FwSmAddState(smDesc, CrIaFdCheck_DISABLED, N_OUT_OF_DISABLED, NULL, &CrIaFdCheckDisabledExit, NULL, NULL);
+  FwSmAddChoicePseudoState(smDesc, CHOICE1, N_OUT_OF_CHOICE1);
+  FwSmAddTransStaToSta(smDesc, Execute, CrIaFdCheck_NOMINAL, CrIaFdCheck_DISABLED, NULL, &CrIaFdCheckIsNotEnabled);
+  FwSmAddTransStaToCps(smDesc, Execute, CrIaFdCheck_NOMINAL, CHOICE1, NULL, &CrIaFdCheckIsEnabled);
+  FwSmAddTransStaToSta(smDesc, Execute, CrIaFdCheck_SUSPECTED, CrIaFdCheck_DISABLED, NULL, &CrIaFdCheckIsNotEnabled);
+  FwSmAddTransStaToCps(smDesc, Execute, CrIaFdCheck_SUSPECTED, CHOICE1, NULL, &CrIaFdCheckIsEnabled);
+  FwSmAddTransStaToSta(smDesc, Execute, CrIaFdCheck_FAILED, CrIaFdCheck_DISABLED, NULL, &CrIaFdCheckIsNotEnabled);
+  FwSmAddTransStaToCps(smDesc, Execute, CrIaFdCheck_FAILED, CHOICE1, NULL, &CrIaFdCheckIsAnomalyAndEnabled);
+  FwSmAddTransStaToCps(smDesc, Execute, CrIaFdCheck_DISABLED, CHOICE1, &CrIaFdCheckAnomalyDetCheck, &CrIaFdCheckIsEnabled);
+  FwSmAddTransIpsToSta(smDesc, CrIaFdCheck_DISABLED, &CrIaFdCheckResetSpCnt);
+  FwSmAddTransCpsToSta(smDesc, CHOICE1, CrIaFdCheck_SUSPECTED, NULL, &CrIaFdCheckIsAnomalyAndSmallCnt);
+  FwSmAddTransCpsToSta(smDesc, CHOICE1, CrIaFdCheck_NOMINAL, NULL, &CrIaFdCheckIsNoAnomaly);
+  FwSmAddTransCpsToSta(smDesc, CHOICE1, CrIaFdCheck_FAILED, &CrIaFdCheckEvtFailed, &code89795);
+
+  return smDesc;
+}
diff --git a/CrIa/src/CrIaPrSm/CrIaFdCheckCreate.h b/CrIa/src/CrIaPrSm/CrIaFdCheckCreate.h
new file mode 100644
index 0000000..f2fbcef
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaFdCheckCreate.h
@@ -0,0 +1,169 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaFdCheck state machine.
+ * The state machine is configured with a set of function pointers representing the non-default
+ * actions and guards of the state machine. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the state machine in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The state machine created by this file is shown in the figure below.
+ * @image html CrIaFdCheck.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: May 25 2016 8:50:47
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaFdCheckCreate_H_
+#define CrIaFdCheckCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwSmConstants.h"
+
+/** State identifiers */
+#define CrIaFdCheck_DISABLED (1)		/* The identifier of state DISABLED in State Machine CrIaFdCheck */
+#define CrIaFdCheck_FAILED (4)		/* NOTE: wrong identifier! The identifier of state FAILED in State Machine CrIaFdCheck */
+#define CrIaFdCheck_NOMINAL (2)		/* NOTE: wrong identifier! The identifier of state NOMINAL in State Machine CrIaFdCheck */
+#define CrIaFdCheck_SUSPECTED (3)		/* NOTE: wrong identifier! The identifier of state SUSPECTED in State Machine CrIaFdCheck */
+
+/** The identifiers of transition commands (triggers) */
+#define Execute (0)
+
+/**
+ * Create a new state machine descriptor.
+ * This interface creates the state machine descriptor dynamically.
+ * @param smData the pointer to the state machine data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the state machine data when the state machine is created is NULL).
+ * @return the pointer to the state machine descriptor
+ */
+FwSmDesc_t CrIaFdCheckCreate(void* smData);
+
+/**
+ * Entry Action for the state NOMINAL.
+ * Set FdCheckCnt to 1
+ * @param smDesc the state machine descriptor
+ */
+void CrIaFdCheckNominalEntry(FwSmDesc_t smDesc);
+
+/**
+ * Do Action for the state NOMINAL.
+ * Anomaly Detection Check
+ * @param smDesc the state machine descriptor
+ */
+void CrIaFdCheckNominalDo(FwSmDesc_t smDesc);
+
+/**
+ * Entry Action for the state SUSPECTED.
+ * <pre>
+ * Increment FdCheckCnt
+ * Increment FdCheckSpCnt
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaFdCheckSuspectedEntry(FwSmDesc_t smDesc);
+
+/**
+ * Do Action for the state SUSPECTED.
+ * Anomaly Detection Check
+ * @param smDesc the state machine descriptor
+ */
+void CrIaFdCheckSuspectedDo(FwSmDesc_t smDesc);
+
+/**
+ * Entry Action for the state FAILED.
+ * Try Recovery
+ * @param smDesc the state machine descriptor
+ */
+void CrIaFdCheckFailedEntry(FwSmDesc_t smDesc);
+
+/**
+ * Do Action for the state FAILED.
+ * <pre>
+ * Anomaly Detection Check;
+ * if (Anomaly Detected) TryRecovery
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaFdCheckFailedDo(FwSmDesc_t smDesc);
+
+/**
+ * Exit Action for the state DISABLED.
+ * <pre>
+ * FdCheckCounter = 0;
+ * Initialize Anomaly Detection Check
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaFdCheckDisabledExit(FwSmDesc_t smDesc);
+
+/**
+ * Guard on the transition from NOMINAL to DISABLED.
+ * <pre>
+ *  FdCheck is
+ * not Enabled 
+ * </pre>
+ * @param smDesc the state machine descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwSmBool_t CrIaFdCheckIsNotEnabled(FwSmDesc_t smDesc);
+
+/**
+ * Guard on the transition from FAILED to CHOICE1.
+ *  (FdCheck is Enabled) && (No Anomaly) 
+ * @param smDesc the state machine descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwSmBool_t CrIaFdCheckIsAnomalyAndEnabled(FwSmDesc_t smDesc);
+
+/**
+ * Action on the transition from DISABLED to CHOICE1.
+ * Do Anomaly Detection Check
+ * @param smDesc the state machine descriptor
+ */
+void CrIaFdCheckAnomalyDetCheck(FwSmDesc_t smDesc);
+
+/**
+ * Guard on the transition from DISABLED to CHOICE1.
+ *  FdCheck is Enabled 
+ * @param smDesc the state machine descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwSmBool_t CrIaFdCheckIsEnabled(FwSmDesc_t smDesc);
+
+/**
+ * Action on the transition from Initial State to DISABLED.
+ * FdCheckSpCnt = 0
+ * @param smDesc the state machine descriptor
+ */
+void CrIaFdCheckResetSpCnt(FwSmDesc_t smDesc);
+
+/**
+ * Guard on the transition from CHOICE1 to SUSPECTED.
+ * <pre>
+ *  (Anomaly Detected) &&
+ * (FdCheckCnt < FdCheckCntThr) 
+ * </pre>
+ * @param smDesc the state machine descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwSmBool_t CrIaFdCheckIsAnomalyAndSmallCnt(FwSmDesc_t smDesc);
+
+/**
+ * Guard on the transition from CHOICE1 to NOMINAL.
+ *  No Anomaly 
+ * @param smDesc the state machine descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwSmBool_t CrIaFdCheckIsNoAnomaly(FwSmDesc_t smDesc);
+
+/**
+ * Action on the transition from CHOICE1 to FAILED.
+ *  Generate evt rep. EVT_FD_FAILED
+ * @param smDesc the state machine descriptor
+ */
+void CrIaFdCheckEvtFailed(FwSmDesc_t smDesc);
+
+#endif /* CrIaFdCheckCreate_H_ */
diff --git a/CrIa/src/CrIaPrSm/CrIaFdCheckFunc.c b/CrIa/src/CrIaPrSm/CrIaFdCheckFunc.c
new file mode 100644
index 0000000..5937afd
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaFdCheckFunc.c
@@ -0,0 +1,2051 @@
+/**
+ * @file CrIaFdCheckFunc.c
+ * @ingroup CrIaSm
+ * @authors FW Profile code generator version 4.63; Institute for Astrophysics, 2015-2016
+ * @date Created on: May 25 2016 8:50:47
+ *
+ * @brief Implementation of the FdCheck State Machine actions and guards.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwSmConstants.h"
+#include "FwProfile/FwSmDCreate.h"
+#include "FwProfile/FwSmConfig.h"
+#include "FwProfile/FwSmCore.h"
+#include "FwProfile/FwPrConfig.h"
+#include "FwProfile/FwPrCore.h"
+
+/** CrIaFdCheck function definitions */
+#include "CrIaFdCheckCreate.h"
+
+#include <CrIaIasw.h>
+#include <CrIaSemEvents.h> /* for flags of type CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_xxx_SET */
+
+#include <CrIaPrSm/CrIaIaswCreate.h> /* for StopSem transition of the IASW state machine (SEM Alive Check Recovery Procedure) */
+#include <CrIaPrSm/CrIaSemConsCheckCreate.h>
+
+#include <Services/General/CrIaConstants.h>
+#include <Services/CrSemServ3HousekeepingDataReportingService/InRep/CrSemServ3DatHk.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <IfswUtilities.h> /* for sort4float(), convertToTempEngVal() */
+
+#include <EngineeringAlgorithms.h>
+
+#include <IfswDebug.h>
+
+/* local counters for FdCheck SEM Mode Time-Out */
+unsigned int CMD_MODE_TRANSITION_TO_POWERON_Cnt;
+unsigned int CMD_MODE_TRANSITION_TO_SAFE_Cnt;
+unsigned int CMD_MODE_TRANSITION_TO_STAB_Cnt;
+unsigned int CMD_MODE_TRANSITION_TO_TEMP_Cnt;
+unsigned int CMD_MODE_TRANSITION_TO_CCDWIN_Cnt;
+unsigned int CMD_MODE_TRANSITION_TO_CCDFULL_Cnt;
+unsigned int CMD_MODE_TRANSITION_TO_DIAG_Cnt;
+unsigned int CMD_MODE_TRANSITION_TO_STANDBY_Cnt;
+
+/* global handles which signals that the command was sent */
+CrFwBool_t CMD_MODE_TRANSITION_TO_POWERON_Flag;
+CrFwBool_t CMD_MODE_TRANSITION_TO_SAFE_Flag;
+CrFwBool_t CMD_MODE_TRANSITION_TO_STAB_Flag;
+CrFwBool_t CMD_MODE_TRANSITION_TO_TEMP_Flag;
+CrFwBool_t CMD_MODE_TRANSITION_TO_CCDWIN_Flag;
+CrFwBool_t CMD_MODE_TRANSITION_TO_CCDFULL_Flag;
+CrFwBool_t CMD_MODE_TRANSITION_TO_DIAG_Flag;
+CrFwBool_t CMD_MODE_TRANSITION_TO_STANDBY_Flag;
+
+/* set global specific variable to signal other procedures, if an anomaly exist */
+FwSmBool_t AnomalyTelescopeTempMonitorCheck = 0;
+FwSmBool_t AnomalyIncorrectSDSCntrCheck = 0;
+FwSmBool_t AnomalySemCommErrCheck = 0;
+FwSmBool_t AnomalySemModeTimeOutCheck = 0;
+FwSmBool_t AnomalySemSafeModeCheck = 0;
+FwSmBool_t AnomalySemAliveCheck = 0;
+FwSmBool_t AnomalySemAnomalyEventCheck = 0;
+FwSmBool_t AnomalySemLimitCheck = 0;
+FwSmBool_t AnomalyDpuHousekeepingCheck = 0;
+FwSmBool_t AnomalyCentroidConsistencyCheck = 0;
+FwSmBool_t AnomalyResourceCheck = 0;
+FwSmBool_t AnomalySemModeConsistencyCheck = 0;
+
+/* Flag_1 for each FdCheck to signal, if recovery procedure is not already executed in state FAILED */
+FwSmBool_t Flag_1_TTM, Flag_1_SDSC, Flag_1_COMERR, Flag_1_TIMEOUT, Flag_1_SAFEMODE, Flag_1_ALIVE, Flag_1_SEMANOEVT;
+FwSmBool_t Flag_1_SEMLIMIT, Flag_1_DPUHK, Flag_1_CENTCONS, Flag_1_RES, Flag_1_SEMCONS;
+
+/* imported global variables */
+extern unsigned short SemHkIaswStateExecCnt;
+extern FwSmBool_t flagDelayedSemHkPacket;
+extern unsigned int warnLimitDefCnt, alarmLimitDefCnt;
+extern unsigned int warnLimitExtCnt, alarmLimitExtCnt;
+extern unsigned int semAliveStatusDefCnt, semAliveStatusExtCnt;
+extern unsigned short SemAnoEvtId;
+
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/**
+ * Execution of Recovery Procedures
+ * - Procedure 1: Switch Off SEM
+ * - Procedure 2: Do nothing
+ * - Procedure 3: Terminate Science
+ * - Procedure 4: Stop Heartbeat
+ * - Procedure 5: Handle SEM Anomaly Event
+ */
+void executeRecoveryProc(unsigned short recProcId)
+{
+  unsigned char HeartbeatEnabled = 0;
+  unsigned short semShutdownT12;
+
+  switch (recProcId)
+  {
+    case 1: /* Recovery Procedure 1: Switch Off SEM */
+      /* Command the IASW State Machine in state STANDBY (this switches off the SEM) */
+      /* Copy "long" time-out SEM_SHUTDOWN_T12 into SEM_SHUTDOWN_T1 */
+      /* NOTE: will be restored to default time-out SEM_SHUTDOWN_T11 in SEM Shutdown Procedure */
+      CrIaCopy(SEM_SHUTDOWN_T12_ID, &semShutdownT12);
+      CrIaPaste(SEM_SHUTDOWN_T1_ID, &semShutdownT12);
+      FwSmMakeTrans(smDescIasw, StopSem);
+      break;
+    case 2: /* Recovery Procedure 2: Do nothing */
+      break;
+    case 3: /* Recovery Procedure 3: Terminate Science */
+      /* Command the IASW State Machine in state PRE_SCIENCE (this commands the SEM into STABILIZE and
+         terminates science operation.) */
+      FwSmMakeTrans(smDescIasw, StopScience);
+      break;
+    case 4: /* Recovery Procedure 4: Stop Heartbeat */
+      /* Command the IASW in state STANDBY (this switches off the SEM) and 
+         terminate generation of heartbeat report to request a switch off of the DPU itself */
+      FwSmMakeTrans(smDescIasw, StopSem);
+      CrIaPaste(HEARTBEAT_ENABLED_ID, &HeartbeatEnabled);
+      break;
+    case 5: /* Recovery Procedure 5: Handle SEM Anomaly Event */
+      /* Run SEM Anomaly Event Recovery Procedure */
+      FwPrRun(prDescSemAnoEvtRP);    
+      break;
+    default: /* Do nothing */
+      break;
+  }
+
+  return;
+}
+
+/**
+ * @brief Performs the Anomaly Detection Check to check or monitor failure conditions of  ...
+ *
+ * - Telescope Temperature Monitor
+ * - Incorrect Science Data Counter
+ * - SEM Communication Error
+ * - SEM Mode Time-Out
+ * - SEM Safe Mode
+ * - SEM Alive Check
+ * - SEM Anomaly Event
+ * - SEM Limit Check
+ * - DPU Housekeeping Check
+ * - Centroid Consistency Check
+ * - Resource Check
+ * - SEM Mode Consistency Check
+ *
+ * @note The anomaly detection for the SEM Communication Error is realized by implemented through the use of counter 
+ * fdSemCommErrCnt which is maintained in module CrIaIasw according to the following logic:
+ * - The counter is incremented when one of the following events is reported: EVT_SPW_ERR_L, EVT_SPW_ERR_M, EVT_SPW_ERR_H
+ * - The counter is reset at the end of each cycle
+ * An anomaly is declared for the SEM Communication Error FdCheck whenever the value of counter fdSemCommErrCnt is greater than zero.
+ *
+ * @note The SEM Alive Check will be started automatically by the SEM Unit State Machine in the exit action of the INIT state.
+ * The first SEM Housekeeping packets arrive later than the pre-defined default period to be checked and therefore an
+ * additional period is added once.
+ *
+ */
+
+FwSmBool_t AnomalyDetectionCheck(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  /* runs Anomaly Detection Check and gives back result 1 (anomaly detected) or 0 (no anomaly detected) */
+
+  if (smDesc == smDescFdTelescopeTempMonitorCheck) /* =========================== Telescope Temperature Monitor ==== */
+    {
+      float Temp1=0, Temp2=0, Temp3=0, Temp4=0; /* initialize variables with default values */
+      float Temp[4];
+      float median_Temp_Aft_EngVal;
+      float median_Temp_Frt_EngVal;
+      float lowerLevel_Temp, upperLevel_Temp, ttm_lim;
+      float lowerLevel_Temp_Lim, upperLevel_Temp_Lim;
+
+      DEBUGP("FdCheck-AnomalyDetectionCheck: run Anomaly Detection Check for Telescope Temp. Monitor Check ...\n");
+
+      /* Get temperature measurements from data pool */
+      /* AFT Temperatures */
+      CrIaCopy(ADC_TEMPOH1B_ID, &Temp1);
+      CrIaCopy(ADC_TEMPOH2B_ID, &Temp2);
+      CrIaCopy(ADC_TEMPOH3B_ID, &Temp3);
+      CrIaCopy(ADC_TEMPOH4B_ID, &Temp4);
+
+      /* Copy engineering values in array */
+      Temp[0] = Temp1;
+      Temp[1] = Temp2;
+      Temp[2] = Temp3;
+      Temp[3] = Temp4;
+
+      /* Acquire temperature using majority voting mechanism */
+      sort4float (Temp);
+
+      /* Calculate the average of the two middle temperature values */
+      median_Temp_Aft_EngVal = (Temp[1] + Temp[2])*0.5;
+
+      /* Get temperature measurements from data pool */
+      /* FRT Temperatures */
+      CrIaCopy(ADC_TEMPOH1A_ID, &Temp1);
+      CrIaCopy(ADC_TEMPOH2A_ID, &Temp2);
+      CrIaCopy(ADC_TEMPOH3A_ID, &Temp3);
+      CrIaCopy(ADC_TEMPOH4A_ID, &Temp4);
+
+      /* Copy engineering values in array */
+      Temp[0] = Temp1;
+      Temp[1] = Temp2;
+      Temp[2] = Temp3;
+      Temp[3] = Temp4;
+
+      /* Acquire temperature using majority voting mechanism */
+      sort4float (Temp);
+
+      /* Calculate the average of the two middle temperature values */
+      median_Temp_Frt_EngVal = (Temp[1] + Temp[2])*0.5;
+
+      /* Get all temperature limits from data pool */
+      CrIaCopy(TTC_LL_ID, &lowerLevel_Temp);
+      CrIaCopy(TTC_UL_ID, &upperLevel_Temp);
+      CrIaCopy(TTM_LIM_ID, &ttm_lim);
+
+      /* Calculate total upper and lower temperature limit */
+      upperLevel_Temp_Lim = upperLevel_Temp + ttm_lim;
+      lowerLevel_Temp_Lim = lowerLevel_Temp - ttm_lim;
+
+      DEBUGP("FdCheck TTM: median_Temp_Aft_EngVal = %f°C, median_Temp_Frt_EngVal = %f°C\n", median_Temp_Aft_EngVal, median_Temp_Frt_EngVal);
+      DEBUGP("FdCheck TTM: temperature range: %f°C < T < %f°C\n", lowerLevel_Temp_Lim, upperLevel_Temp_Lim);
+
+      /* Check if temperatures are in nominal range [ TTC_LL-TTM_LIM < T < TTC_UL+TTM_LIM ] */
+      if ((median_Temp_Aft_EngVal > upperLevel_Temp_Lim) ||
+          (median_Temp_Frt_EngVal > upperLevel_Temp_Lim) ||
+          (median_Temp_Aft_EngVal < lowerLevel_Temp_Lim) ||
+          (median_Temp_Frt_EngVal < lowerLevel_Temp_Lim))
+        {
+	  AnomalyTelescopeTempMonitorCheck = 1;
+	  return 1;
+        }
+     
+      AnomalyTelescopeTempMonitorCheck = 0;
+      
+      return 0;
+    } /* =========================================================================================================== */
+
+  if (smDesc == smDescFdIncorrectSDSCntrCheck) /* ===================== Incorrect Science Data Sequence Counter ==== */
+    {
+      DEBUGP("FdCheck-AnomalyDetectionCheck: run Anomaly Detection Check for Incorrect Science Data Sequence Counter Check ...\n");
+
+      if (FD_SDSC_ILL_Flag || FD_SDSC_OOS_Flag)
+        {
+          FD_SDSC_ILL_Flag = 0;
+          FD_SDSC_OOS_Flag = 0;
+	  AnomalyIncorrectSDSCntrCheck = 1;
+	  return 1;
+        }
+
+      AnomalyIncorrectSDSCntrCheck = 0;
+
+      return 0;
+    } /* =========================================================================================================== */
+
+  if (smDesc == smDescFdSemCommErrCheck) /* =========================================== SEM Communication Error ==== */
+    {
+      if (fdSemCommErrCnt > 0)
+        {
+	  AnomalySemCommErrCheck = 1;
+          return 1;
+        }
+
+      AnomalySemCommErrCheck = 0;
+
+      return 0;
+    } /* =========================================================================================================== */
+
+  if (smDesc == smDescFdSemModeTimeOutCheck) /* ============================================= SEM Mode Time-Out ==== */
+    {
+      unsigned int semToPoweronThr, semToSafeThr, semToStabThr, semToTempThr, semToCcdThr, semToDiagThr, semToStandbyThr;
+
+      /* Get Counter Thresholds */
+      CrIaCopy(SEM_TO_POWERON_ID, &semToPoweronThr);
+      CrIaCopy(SEM_TO_SAFE_ID, &semToSafeThr);
+      CrIaCopy(SEM_TO_STAB_ID, &semToStabThr);
+      CrIaCopy(SEM_TO_TEMP_ID, &semToTempThr);
+      CrIaCopy(SEM_TO_CCD_ID, &semToCcdThr);
+      CrIaCopy(SEM_TO_DIAG_ID, &semToDiagThr);
+      CrIaCopy(SEM_TO_STANDBY_ID, &semToStandbyThr);
+      
+      /* ### POWERON ### */
+
+      if (CMD_MODE_TRANSITION_TO_POWERON_Flag)
+        {
+          if (CRSEM_SERV5_EVENT_PRG_CFG_LOAD_READY_FD_SET)
+            {
+              /* expected Event was received: reset all counters and flags */
+              CMD_MODE_TRANSITION_TO_POWERON_Cnt = 0;
+              CMD_MODE_TRANSITION_TO_POWERON_Flag = 0;
+              CRSEM_SERV5_EVENT_PRG_CFG_LOAD_READY_FD_SET = 0;
+              AnomalySemModeTimeOutCheck = 0;	                   
+            }
+           else
+            {
+              /* no expected Event was received so far: increment counter */
+              CMD_MODE_TRANSITION_TO_POWERON_Cnt++;
+            }
+
+      if (CMD_MODE_TRANSITION_TO_POWERON_Cnt < semToPoweronThr)
+        {
+          AnomalySemModeTimeOutCheck = 0;	                   
+        }
+      else
+        {
+          /* reset all counters and flags and return Anomaly */         
+          CMD_MODE_TRANSITION_TO_POWERON_Cnt = 0;
+          CMD_MODE_TRANSITION_TO_POWERON_Flag = 0;
+          CRSEM_SERV5_EVENT_PRG_CFG_LOAD_READY_FD_SET = 0;
+          AnomalySemModeTimeOutCheck = 1;
+          return 1;
+        }
+      }
+
+      /* ### SAFE ### */
+
+      if (CMD_MODE_TRANSITION_TO_SAFE_Flag)
+        {
+          if (CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_SAFE_FD_SET)
+            {
+              /* expected Event was received: reset all counters and flags */
+              CMD_MODE_TRANSITION_TO_SAFE_Cnt = 0;
+              CMD_MODE_TRANSITION_TO_SAFE_Flag = 0;
+              CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_SAFE_FD_SET = 0;
+              AnomalySemModeTimeOutCheck = 0;
+            }
+           else
+            {
+              /* no expected Event was received so far: increment counter */
+              CMD_MODE_TRANSITION_TO_SAFE_Cnt++;
+            }
+
+      if (CMD_MODE_TRANSITION_TO_SAFE_Cnt < semToSafeThr)
+        {
+          AnomalySemModeTimeOutCheck = 0;
+        }
+      else
+        {
+          /* reset all counters and flags and return Anomaly */         
+          CMD_MODE_TRANSITION_TO_SAFE_Cnt = 0;
+          CMD_MODE_TRANSITION_TO_SAFE_Flag = 0;
+          CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_SAFE_FD_SET = 0;
+          AnomalySemModeTimeOutCheck = 1;
+          return 1;
+        }
+      }
+
+      /* ### STABILIZE ### */
+
+      if (CMD_MODE_TRANSITION_TO_STAB_Flag)
+        {
+          if (CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_STAB_SET)
+            {
+              /* expected Event was received: reset all counters and flags */
+              CMD_MODE_TRANSITION_TO_STAB_Cnt = 0;
+              CMD_MODE_TRANSITION_TO_STAB_Flag = 0;
+              CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_STAB_SET = 0;
+              AnomalySemModeTimeOutCheck = 0;
+            }
+           else
+            {
+              /* no expected Event was received so far: increment counter */
+              CMD_MODE_TRANSITION_TO_STAB_Cnt++;
+            }
+
+      if (CMD_MODE_TRANSITION_TO_STAB_Cnt < semToStabThr)
+        {
+          AnomalySemModeTimeOutCheck = 0;
+        }
+      else
+        {
+          /* reset all counters and flags and return Anomaly */         
+          CMD_MODE_TRANSITION_TO_STAB_Cnt = 0;
+          CMD_MODE_TRANSITION_TO_STAB_Flag = 0;
+          CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_STAB_SET = 0;
+          AnomalySemModeTimeOutCheck = 1;
+          return 1;
+        }
+      }
+
+      /* ### TEMPERATURE STABLE ### */
+
+      if (CMD_MODE_TRANSITION_TO_TEMP_Flag)
+        {
+          if (CRSEM_SERV5_EVENT_PRG_THERMAL_STABILITY_FD_SET)
+            {
+              /* expected Event was received: reset all counters and flags */
+              CMD_MODE_TRANSITION_TO_TEMP_Cnt = 0;
+              CMD_MODE_TRANSITION_TO_TEMP_Flag = 0;
+              CRSEM_SERV5_EVENT_PRG_THERMAL_STABILITY_FD_SET = 0;
+              AnomalySemModeTimeOutCheck = 0;
+            }
+           else
+            {
+              /* no expected Event was received so far: increment counter */
+              CMD_MODE_TRANSITION_TO_TEMP_Cnt++;
+            }
+
+      if (CMD_MODE_TRANSITION_TO_TEMP_Cnt < semToTempThr)
+        {
+          AnomalySemModeTimeOutCheck = 0;
+        }
+      else
+        {
+          /* reset all counters and flags and return Anomaly */         
+          CMD_MODE_TRANSITION_TO_TEMP_Cnt = 0;
+          CMD_MODE_TRANSITION_TO_TEMP_Flag = 0;
+          CRSEM_SERV5_EVENT_PRG_THERMAL_STABILITY_FD_SET = 0;
+          AnomalySemModeTimeOutCheck = 1;
+          return 1;
+        }
+      }
+
+      /* ### CCD WIN ### */
+
+      if (CMD_MODE_TRANSITION_TO_CCDWIN_Flag)
+        {
+          if (CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_CCDWIN_SET)
+            {
+              /* expected Event was received: reset all counters and flags */
+              CMD_MODE_TRANSITION_TO_CCDWIN_Cnt = 0;
+              CMD_MODE_TRANSITION_TO_CCDWIN_Flag = 0;
+              CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_CCDWIN_SET = 0;
+              AnomalySemModeTimeOutCheck = 0;
+            }
+           else
+            {
+              /* no expected Event was received so far: increment counter */
+              CMD_MODE_TRANSITION_TO_CCDWIN_Cnt++;
+            }
+
+
+      if (CMD_MODE_TRANSITION_TO_CCDWIN_Cnt < semToCcdThr)
+        {       
+          AnomalySemModeTimeOutCheck = 0;
+        }
+      else
+        {    
+          /* reset all counters and flags and return Anomaly */
+          CMD_MODE_TRANSITION_TO_CCDWIN_Cnt = 0;
+          CMD_MODE_TRANSITION_TO_CCDWIN_Flag = 0;
+          CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_CCDWIN_SET = 0;
+          AnomalySemModeTimeOutCheck = 1;
+          return 1;	  
+        }
+      }
+
+      /* ### CCD FULL ### */
+
+      if (CMD_MODE_TRANSITION_TO_CCDFULL_Flag)
+        {
+          if (CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_CCDFULL_SET)
+            {  
+              /* expected Event was received: reset all counters and flags */
+              CMD_MODE_TRANSITION_TO_CCDFULL_Cnt = 0;
+              CMD_MODE_TRANSITION_TO_CCDFULL_Flag = 0;
+              CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_CCDFULL_SET = 0;
+              AnomalySemModeTimeOutCheck = 0;
+            }
+           else
+            {
+              /* no expected Event was received so far: increment counter */
+              CMD_MODE_TRANSITION_TO_CCDFULL_Cnt++;
+            }
+
+      if (CMD_MODE_TRANSITION_TO_CCDFULL_Cnt < semToCcdThr)
+        {
+          AnomalySemModeTimeOutCheck = 0;
+        }
+      else
+        {          
+          /* reset all counters and flags and return Anomaly */         
+          CMD_MODE_TRANSITION_TO_CCDFULL_Cnt = 0;
+          CMD_MODE_TRANSITION_TO_CCDFULL_Flag = 0;
+          CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_CCDFULL_SET = 0;
+          AnomalySemModeTimeOutCheck = 1;
+          return 1;
+        }
+      }
+
+      /* ### DIAG ### */
+
+      if (CMD_MODE_TRANSITION_TO_DIAG_Flag)
+        {
+          if (CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_DIAG_SET)
+            {
+              /* expected Event was received: reset all counters and flags */
+              CMD_MODE_TRANSITION_TO_DIAG_Cnt = 0;
+              CMD_MODE_TRANSITION_TO_DIAG_Flag = 0;
+              CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_DIAG_SET = 0;
+              AnomalySemModeTimeOutCheck = 0;
+            }
+           else
+            {
+              /* no expected Event was received so far: increment counter */
+              CMD_MODE_TRANSITION_TO_DIAG_Cnt++;
+            }
+
+      if (CMD_MODE_TRANSITION_TO_DIAG_Cnt < semToDiagThr)
+        {
+          AnomalySemModeTimeOutCheck = 0;
+        }
+      else
+        {
+          /* reset all counters and flags and return Anomaly */
+          CMD_MODE_TRANSITION_TO_DIAG_Cnt = 0;
+          CMD_MODE_TRANSITION_TO_DIAG_Flag = 0;
+          CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_DIAG_SET = 0;
+          AnomalySemModeTimeOutCheck = 1;
+	  return 1;
+        }
+      }
+
+      /* ### STANDBY ### */
+
+      if (CMD_MODE_TRANSITION_TO_STANDBY_Flag)
+        {
+          if (CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_STANDBY_SET)
+            {
+              /* expected Event was received: reset all counters and flags */
+              CMD_MODE_TRANSITION_TO_STANDBY_Cnt = 0;
+              CMD_MODE_TRANSITION_TO_STANDBY_Flag = 0;
+              CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_STANDBY_SET = 0;
+              AnomalySemModeTimeOutCheck = 0;
+            }
+           else
+            {
+              /* no expected Event was received so far: increment counter */
+              CMD_MODE_TRANSITION_TO_STANDBY_Cnt++;
+            }
+
+      if (CMD_MODE_TRANSITION_TO_STANDBY_Cnt < semToStandbyThr)
+        {
+          AnomalySemModeTimeOutCheck = 0;
+        }
+      else
+        {
+          /* reset all counters and flags and return Anomaly */         
+          CMD_MODE_TRANSITION_TO_STANDBY_Cnt = 0;
+          CMD_MODE_TRANSITION_TO_STANDBY_Flag = 0;
+          CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_STANDBY_SET = 0;
+          AnomalySemModeTimeOutCheck = 1;
+          return 1;
+        }
+      }
+      
+      AnomalySemModeTimeOutCheck = 0;
+
+      return 0;
+    } /* =========================================================================================================== */
+
+  if (smDesc == smDescFdSemSafeModeCheck) /* ============================================== SEM Safe Mode Check ==== */
+    {
+      DEBUGP("FdCheck-AnomalyDetectionCheck: run Anomaly Detection Check for SEM Safe Mode Check ...\n");
+    
+      /* check if event signals the entry of SEM in SAFE mode */
+      if (CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_SAFE_SET != 0)
+        {
+          CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_SAFE_SET = 0;
+          AnomalySemSafeModeCheck = 1;
+          return 1;
+        }
+      
+      AnomalySemSafeModeCheck = 0;
+      
+      return 0;
+    } /* =========================================================================================================== */
+
+  if (smDesc == smDescFdSemAliveCheck) /* ===================================================== SEM Alive Check ==== */
+    {
+      unsigned short SemHkDefPer, SemHkDelay;
+      unsigned short IaswStateExecCnt, IaswStateExecCntDiff = 0;
+
+      DEBUGP("FdCheck-AnomalyDetectionCheck: run Anomaly Detection Check for SEM Alive Check ...\n");
+
+      /* get parameter SEM HK Defined Period */
+      CrIaCopy(SEM_HK_DEF_PER_ID, &SemHkDefPer);
+      if (flagDelayedSemHkPacket)
+        {
+          CrIaCopy(SEMALIVE_DELAYEDSEMHK_ID, &SemHkDelay);
+          SemHkDefPer += SemHkDelay;
+        }
+
+      /* get actual IASW cycle counter information */
+      IaswStateExecCnt = FwSmGetExecCnt(smDescIasw);
+
+      /* check, if counter reset occured in the meantime */
+      if (IaswStateExecCnt >= SemHkIaswStateExecCnt)
+        {
+          IaswStateExecCntDiff = IaswStateExecCnt - SemHkIaswStateExecCnt;
+        }
+      else /* counter reset occured in the meantime ! */
+        {
+          IaswStateExecCntDiff = 65535 - SemHkIaswStateExecCnt + IaswStateExecCnt;
+        }
+
+      if (IaswStateExecCntDiff >= SemHkDefPer)
+        {
+	  AnomalySemAliveCheck = 1;
+          return 1;
+        }
+
+      AnomalySemAliveCheck = 0;
+      
+      return 0;
+    } /* =========================================================================================================== */
+
+  if (smDesc == smDescFdSemAnomalyEventCheck) /* ============================================ SEM Anomaly Event ==== */
+    {
+      DEBUGP("FdCheck-AnomalyDetectionCheck: run Anomaly Detection Check for SEM Anomaly Event ...\n");
+
+      if (SemAnoEvtId > 0)
+        {
+	  AnomalySemAnomalyEventCheck = 1;
+	  return 1;
+        }
+      
+      AnomalySemAnomalyEventCheck = 0;
+      
+      return 0;
+    } /* =========================================================================================================== */
+
+  if (smDesc == smDescFdSemLimitCheck) /* ===================================================== SEM Limit Check ==== */
+    {
+      DEBUGP("FdCheck-AnomalyDetectionCheck: run Anomaly Detection Check for SEM Limit Check ...\n");
+
+      /* Mantis 2182 */
+      if (((semAliveStatusDefCnt == 0) && (alarmLimitDefCnt > 0) && (warnLimitDefCnt > 1)) ||
+          ((semAliveStatusExtCnt == 0) && (alarmLimitExtCnt > 0) && (warnLimitExtCnt > 1)))
+        {
+	  AnomalySemLimitCheck = 1;
+	  return 1;
+        }
+
+      AnomalySemLimitCheck = 0;
+      
+      return 0;
+    } /* =========================================================================================================== */
+
+  if (smDesc == smDescFdDpuHousekeepingCheck) /* ======================================= DPU Housekeeping Check ==== */
+    {
+      unsigned short dpuHkLimits;
+
+      DEBUGP("FdCheck-AnomalyDetectionCheck: run Anomaly Detection Check for DPU Housekeeping Check ...\n");
+
+      dpuHkLimits = checkDpuHkLimits();
+
+      if (dpuHkLimits > 0)
+        {
+	  AnomalyDpuHousekeepingCheck = 1;
+	  return 1;
+        }
+
+      AnomalyDpuHousekeepingCheck = 0;
+
+      return 0;
+    } /* =========================================================================================================== */
+
+  if (smDesc == smDescFdCentroidConsistencyCheck) /* =============================== Centroid Consistency Check ==== */
+    {
+      unsigned short iaswState;
+      unsigned int acqImageCnt;
+      unsigned char validityStatus, centValProcOutput;
+
+      DEBUGP("FdCheck-AnomalyDetectionCheck: run Anomaly Detection Check for Centroid Consistency Check ...\n");
+
+      CrIaCopy(IASWSTATE_ID, &iaswState);
+      CrIaCopy(ACQIMAGECNT_ID, &acqImageCnt);
+      CrIaCopy(VALIDITYSTATUS_ID, &validityStatus);
+      CrIaCopy(CENTVALPROCOUTPUT_ID, &centValProcOutput);
+
+      /* Mantis 2174: only check consistency in valid states */
+      if ((validityStatus == CEN_VAL_WINDOW) || (validityStatus == CEN_VAL_FULL))
+	{
+	  /* NOTE: centValProcOutput is assigned the same value as validityStatus in the CentValProc, 
+	     but if an inconsistency is found it will become 0xEE, thus be != to the validityStatus */
+	  if ((iaswState == CrIaIasw_SCIENCE) && (acqImageCnt > 0) && (validityStatus != centValProcOutput))
+	    {
+	      AnomalyCentroidConsistencyCheck = 1;
+	      return 1;
+	    }
+	}
+
+      AnomalyCentroidConsistencyCheck = 0;
+      return 0;
+    } /* =========================================================================================================== */
+
+  if (smDesc == smDescFdResourceCheck) /* ====================================================== Resource Check ==== */
+    {
+      unsigned short resources;
+
+      DEBUGP("FdCheck-AnomalyDetectionCheck: run Anomaly Detection Check for Resource Check ...\n");
+
+      resources = checkResources();
+
+      if (resources > 0)
+        {
+	  AnomalyResourceCheck = 1;
+          return 1;
+        }
+
+      AnomalyResourceCheck = 0;
+
+      return 0;
+    } /* =========================================================================================================== */
+
+  if (smDesc == smDescFdSemModeConsistencyCheck) /* ================================ SEM Mode Consistency Check ==== */
+    {
+      prDescSemConsFdCheck_t prData;
+      prDescSemConsFdCheck_t* prDataPtr;
+
+      DEBUGP("FdCheck-AnomalyDetectionCheck: run Anomaly Detection Check for Resource Check ...\n");
+
+      /* Set prData of procedure   */
+      /* initial setting of prData */
+      prData.anomaly = 0;
+      FwPrSetData(prDescSemModeConsistencyCheck, &prData);
+
+      FwPrRun(prDescSemModeConsistencyCheck);
+
+      prDataPtr = (prDescSemConsFdCheck_t*)FwPrGetData(prDescSemModeConsistencyCheck);
+      
+      if (prDataPtr->anomaly == 1)
+        {
+          AnomalySemModeConsistencyCheck = 1;
+          return 1;
+        }
+
+      AnomalySemModeConsistencyCheck = 0;
+
+      return 0;
+    } /* =========================================================================================================== */
+
+  DEBUGP("FdCheck-AnomalyDetectionCheck: Anomaly Detection Check can not be done for unknown FdCheckId!\n");
+
+  return 0;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/**
+ * @brief Performs Recovery Procedures associated to the Failure Detection Checks, which are  ...
+ *
+ * - Switch Off SEM
+ * - Terminate Science
+ * - Stop Heartbeat
+ * - Handle SEM Anomaly Event [not implemented yet]
+ *
+ */
+
+void TryRecovery(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned char RecProcGlbEn, RecProcIntEn, RecProcExtEn;
+  unsigned short evt_data[2];
+
+  /* try specific recovery with predefined procedures */
+  /* if (Recovery Procedure associated to FdCheck is enabled) { */
+  /*   Generate event report EVT_RP_STARTED;                    */
+  /*   FdIntEnabled=FALSE; // This disables the FdCheck         */
+  /*   Start Recovery Procedure associated to the FdCheck       */
+  /* }                                                          */
+
+  CrIaCopy(RPGLBENABLE_ID, &RecProcGlbEn);
+
+  if (RecProcGlbEn == 1)
+    {
+
+      if (smDesc == smDescFdTelescopeTempMonitorCheck) /* ======================= Telescope Temperature Monitor ==== */
+        {
+          CrIaCopy(RPTTMINTEN_ID, &RecProcIntEn);
+          CrIaCopy(RPTTMEXTEN_ID, &RecProcExtEn);
+          if ((RecProcIntEn == 1) && (RecProcExtEn == 1) && Flag_1_TTM)
+            {
+
+              DEBUGP("FdCheck-TryRecovery: Try Recovery for Telescope Temp. Monitor Check ...\n");
+
+              /* Generate event report EVT_RP_STARTED */
+              evt_data[0] = FDC_TS_TEMP;    /* FdCheckId   */
+              evt_data[1] = REP_STOP_HB;    /* RecovProcId */
+
+              CrIaEvtRep(4, CRIA_SERV5_EVT_RP_STARTED, evt_data, 4);
+
+              /* Recovery Procedure 4: Stop Heartbeat */
+              /* Command the IASW in state STANDBY (this switches off the SEM) and 
+                 terminate generation of heartbeat report to request a switch off of the DPU itself */
+              executeRecoveryProc(4);
+
+              /* Set Flag_1 to zero */
+              Flag_1_TTM = 0;
+
+            };
+          return;
+        } /* ======================================================================================================= */
+
+      if (smDesc == smDescFdIncorrectSDSCntrCheck) /* ================= Incorrect Science Data Sequence Counter ==== */
+        {
+          CrIaCopy(RPSDSCINTEN_ID, &RecProcIntEn);
+          CrIaCopy(RPSDSCEXTEN_ID, &RecProcExtEn);
+          if ((RecProcIntEn == 1) && (RecProcExtEn == 1) && Flag_1_SDSC)
+            {
+
+              DEBUGP("FdCheck-TryRecovery: Try Recovery for Incorrect Science Data Seqeunce Counter ...\n");
+
+              /* Generate event report EVT_RP_STARTED */
+              evt_data[0] = FDC_ILL_CNT;    /* FdCheckId   */
+              evt_data[1] = REP_TERM_SCI;   /* RecovProcId */
+
+              CrIaEvtRep(4, CRIA_SERV5_EVT_RP_STARTED, evt_data, 4);
+
+              /* Recovery Procedure 3: Terminate Science */
+              /* Command the IASW State Machine in state PRE_SCIENCE (this commands the SEM into STABILIZE and
+                 terminates science operation.) */
+              executeRecoveryProc(3);
+
+              /* Set Flag_1 to zero */
+              Flag_1_SDSC = 0;
+
+            };
+          return;
+        } /* ======================================================================================================= */
+
+      if (smDesc == smDescFdSemCommErrCheck) /* ======================================= SEM Communication Error ==== */
+        {
+          CrIaCopy(RPCOMERRINTEN_ID, &RecProcIntEn);
+          CrIaCopy(RPCOMERREXTEN_ID, &RecProcExtEn);
+          if ((RecProcIntEn == 1) && (RecProcExtEn == 1) && Flag_1_COMERR)
+            {
+
+              DEBUGP("FdCheck-TryRecovery: Try Recovery for SEM Communication Error ...\n");
+
+              /* Generate event report EVT_RP_STARTED */
+              evt_data[0] = FDC_SEM_COMM;     /* FdCheckId   */
+              evt_data[1] = REP_SEM_OFF;      /* RecovProcId */
+
+              CrIaEvtRep(4, CRIA_SERV5_EVT_RP_STARTED, evt_data, 4);
+
+              /* Recovery Procedure 1: Switch Off SEM */
+              /* Command the IASW State Machine in state STANDBY (this switches off the SEM) */
+              executeRecoveryProc(1);
+
+              /* Set Flag_1 to zero */
+              Flag_1_COMERR = 0;
+
+            };
+          return;
+        } /* ======================================================================================================= */
+
+      if (smDesc == smDescFdSemModeTimeOutCheck) /* ========================================= SEM Mode Time-Out ==== */
+        {
+          CrIaCopy(RPTIMEOUTINTEN_ID, &RecProcIntEn);
+          CrIaCopy(RPTIMEOUTEXTEN_ID, &RecProcExtEn);
+          if ((RecProcIntEn == 1) && (RecProcExtEn == 1) && Flag_1_TIMEOUT)
+            {
+
+              DEBUGP("FdCheck-TryRecovery: Try Recovery for SEM Mode Time-Out ...\n");
+
+              /* Generate event report EVT_RP_STARTED */
+              evt_data[0] = FDC_SEM_TO;       /* FdCheckId   */
+              evt_data[1] = REP_SEM_OFF;      /* RecovProcId */
+
+              CrIaEvtRep(4, CRIA_SERV5_EVT_RP_STARTED, evt_data, 4);
+
+              /* Recovery Procedure 1: Switch Off SEM */
+              /* Command the IASW State Machine in state STANDBY (this switches off the SEM) */
+              executeRecoveryProc(1);
+
+              /* Set Flag_1 to zero */
+              Flag_1_TIMEOUT = 0;
+
+            }
+          return;
+        } /* ======================================================================================================= */
+
+      if (smDesc == smDescFdSemSafeModeCheck) /* ========================================== SEM Safe Mode Check ==== */
+        {
+          CrIaCopy(RPSAFEMODEINTEN_ID, &RecProcIntEn);
+          CrIaCopy(RPSAFEMODEEXTEN_ID, &RecProcExtEn);
+          if ((RecProcIntEn == 1) && (RecProcExtEn == 1) && Flag_1_SAFEMODE)
+            {
+
+              DEBUGP("FdCheck-TryRecovery: Try Recovery for SEM Safe Mode Check ...\n");
+
+              /* Generate event report EVT_RP_STARTED */
+              evt_data[0] = FDC_SEM_SM;     /* FdCheckId   */
+              evt_data[1] = REP_TERM_SCI;   /* RecovProcId */
+
+              CrIaEvtRep(4, CRIA_SERV5_EVT_RP_STARTED, evt_data, 4);
+
+              /* Recovery Procedure 3: Terminate Science */
+              /* Command the IASW State Machine in state PRE_SCIENCE (this commands the SEM into STABILIZE and
+                 terminates science operation.) */
+              executeRecoveryProc(3);
+
+              /* Set Flag_1 to zero */
+              Flag_1_SAFEMODE = 0;
+
+            };
+          return;
+        } /* ======================================================================================================= */
+
+      if (smDesc == smDescFdSemAliveCheck) /* ================================================= SEM Alive Check ==== */
+        {
+          CrIaCopy(RPALIVEINTEN_ID, &RecProcIntEn);
+          CrIaCopy(RPALIVEEXTEN_ID, &RecProcExtEn);
+          if ((RecProcIntEn == 1) && (RecProcExtEn == 1) && Flag_1_ALIVE)
+            {
+
+              DEBUGP("FdCheck-TryRecovery: Try Recovery for SEM Alive Check ...\n");
+
+              /* Generate event report EVT_RP_STARTED */
+              evt_data[0] = FDC_SEM_ALIVE;    /* FdCheckId   */
+              evt_data[1] = REP_SEM_OFF;      /* RecovProcId */
+
+              CrIaEvtRep(4, CRIA_SERV5_EVT_RP_STARTED, evt_data, 4);
+
+              /* Recovery Procedure 1: Switch Off SEM */
+              /* Command the IASW State Machine in state STANDBY (this switches off the SEM) */
+              executeRecoveryProc(1);
+
+              /* Set Flag_1 to zero */
+              Flag_1_ALIVE = 0;
+
+            };
+          return;
+        } /* ======================================================================================================= */
+
+      if (smDesc == smDescFdSemAnomalyEventCheck) /* ======================================== SEM Anomaly Event ==== */
+        {
+          CrIaCopy(RPSEMANOEVTINTEN_ID, &RecProcIntEn);
+          CrIaCopy(RPSEMANOEVTEXTEN_ID, &RecProcExtEn);
+          if ((RecProcIntEn == 1) && (RecProcExtEn == 1) && Flag_1_SEMANOEVT)
+            {
+
+              DEBUGP("FdCheck-TryRecovery: Try Recovery for SEM Anomaly Event ...\n");
+
+              /* Generate event report EVT_RP_STARTED */
+              evt_data[0] = FDC_EVT1;         /* FdCheckId   */
+              evt_data[1] = REP_SEM_AE;       /* RecovProcId */
+
+              CrIaEvtRep(4, CRIA_SERV5_EVT_RP_STARTED, evt_data, 4);
+
+              /* Recovery Procedure 5: Handle SEM Anomaly Event */
+              /* Run SEM Anomaly Event Recovery Procedure */
+              executeRecoveryProc(5);
+
+              /* Set Flag_1 to zero */
+              Flag_1_SEMANOEVT = 0;
+
+            };
+          
+          return;
+        } /* ======================================================================================================= */
+
+      if (smDesc == smDescFdSemLimitCheck) /* ================================================= SEM Limit Check ==== */
+        {
+          CrIaCopy(RPSEMLIMITINTEN_ID, &RecProcIntEn);
+          CrIaCopy(RPSEMLIMITEXTEN_ID, &RecProcExtEn);
+          if ((RecProcIntEn == 1) && (RecProcExtEn == 1) && Flag_1_SEMLIMIT)
+            {
+
+              DEBUGP("FdCheck-TryRecovery: Try Recovery for SEM Limit Check ...\n");
+
+              /* Generate event report EVT_RP_STARTED */
+              evt_data[0] = FDC_SEM_OOL;      /* FdCheckId   */
+              evt_data[1] = REP_SEM_OFF;      /* RecovProcId */
+
+              CrIaEvtRep(4, CRIA_SERV5_EVT_RP_STARTED, evt_data, 4);
+
+              /* Recovery Procedure 1: Switch Off SEM */
+              /* Command the IASW State Machine in state STANDBY (this switches off the SEM) */
+              executeRecoveryProc(1);
+
+              /* Set Flag_1 to zero */
+              Flag_1_SEMLIMIT = 0;
+
+            };
+          return;
+        } /* ======================================================================================================= */
+
+      if (smDesc == smDescFdDpuHousekeepingCheck) /* =================================== DPU Housekeeping Check ==== */
+        {
+          CrIaCopy(RPDPUHKINTEN_ID, &RecProcIntEn);
+          CrIaCopy(RPDPUHKEXTEN_ID, &RecProcExtEn);
+          if ((RecProcIntEn == 1) && (RecProcExtEn == 1) && Flag_1_DPUHK)
+            {
+
+              DEBUGP("FdCheck-TryRecovery: Try Recovery for DPU Housekeeping Check ...\n");
+
+              /* Generate event report EVT_RP_STARTED */
+              evt_data[0] = FDC_PSDU_OOL;    /* FdCheckId   */
+              evt_data[1] = REP_STOP_HB;     /* RecovProcId */
+
+              CrIaEvtRep(4, CRIA_SERV5_EVT_RP_STARTED, evt_data, 4);
+
+              /* Recovery Procedure 4: Stop Heartbeat */
+              /* Command the IASW in state STANDBY (this switches off the SEM) and 
+                 terminate generation of heartbeat report to request a switch off of the DPU itself */
+              executeRecoveryProc(4);
+
+              /* Set Flag_1 to zero */
+              Flag_1_DPUHK = 0;
+
+            };
+          return;
+        } /* ======================================================================================================= */
+
+      if (smDesc == smDescFdCentroidConsistencyCheck) /* =========================== Centroid Consistency Check ==== */
+        {
+          CrIaCopy(RPCENTCONSINTEN_ID, &RecProcIntEn);
+          CrIaCopy(RPCENTCONSEXTEN_ID, &RecProcExtEn);
+          if ((RecProcIntEn == 1) && (RecProcExtEn == 1) && Flag_1_CENTCONS)
+            {
+
+              DEBUGP("FdCheck-TryRecovery: Try Recovery for Centroid Consistency Check ...\n");
+
+              /* Generate event report EVT_RP_STARTED */
+              evt_data[0] = FDC_CENT_CONS;   /* FdCheckId   */
+              evt_data[1] = REP_STOP_HB;     /* RecovProcId */
+
+              CrIaEvtRep(4, CRIA_SERV5_EVT_RP_STARTED, evt_data, 4);
+
+              /* Recovery Procedure 4: Stop Heartbeat */
+              /* Command the IASW in state STANDBY (this switches off the SEM) and 
+                 terminate generation of heartbeat report to request a switch off of the DPU itself */
+              executeRecoveryProc(4);
+
+              /* Set Flag_1 to zero */
+              Flag_1_CENTCONS = 0;
+
+            };
+          return;
+        } /* ======================================================================================================= */
+
+      if (smDesc == smDescFdResourceCheck) /* ================================================== Resource Check ==== */
+        {
+          CrIaCopy(RPRESINTEN_ID, &RecProcIntEn);
+          CrIaCopy(RPRESEXTEN_ID, &RecProcExtEn);
+          if ((RecProcIntEn == 1) && (RecProcExtEn == 1) && Flag_1_RES)
+            {
+
+              DEBUGP("FdCheck-TryRecovery: Try Recovery for Centroid Consistency Check ...\n");
+
+              /* Generate event report EVT_RP_STARTED */
+              evt_data[0] = FDC_RES;         /* FdCheckId   */
+              evt_data[1] = REP_STOP_HB;     /* RecovProcId */
+
+              CrIaEvtRep(4, CRIA_SERV5_EVT_RP_STARTED, evt_data, 4);
+
+              /* Recovery Procedure 4: Stop Heartbeat */
+              /* Command the IASW in state STANDBY (this switches off the SEM) and 
+                 terminate generation of heartbeat report to request a switch off of the DPU itself */
+              executeRecoveryProc(4);
+
+              /* Set Flag_1 to zero */
+              Flag_1_RES = 0;
+
+            };
+          return;
+        } /* ======================================================================================================= */
+
+      if (smDesc == smDescFdSemModeConsistencyCheck) /* ============================ SEM Mode Consistency Check ==== */
+        {
+          CrIaCopy(RPSEMCONSINTEN_ID, &RecProcIntEn);
+          CrIaCopy(RPSEMCONSEXTEN_ID, &RecProcExtEn);
+          if ((RecProcIntEn == 1) && (RecProcExtEn == 1) && Flag_1_SEMCONS)
+            {
+
+              DEBUGP("FdCheck-TryRecovery: Try Recovery for SEM Mode Consistency Check ...\n");
+
+           /* Generate event report EVT_RP_STARTED */
+              evt_data[0] = FDC_SEM_CONS;     /* FdCheckId   */
+              evt_data[1] = REP_SEM_OFF;      /* RecovProcId */
+
+              CrIaEvtRep(4, CRIA_SERV5_EVT_RP_STARTED, evt_data, 4);
+
+              /* Recovery Procedure 1: Switch Off SEM */
+              /* Command the IASW State Machine in state STANDBY (this switches off the SEM) */
+              executeRecoveryProc(1);
+
+              /* Set Flag_1 to zero */
+              Flag_1_SEMCONS = 0;
+
+            };
+          return;
+        } /* ======================================================================================================= */
+
+      DEBUGP("FdCheck-TryRecovery: Try Recovery can not be done for unknown FdCheckId!\n");
+
+    }
+
+  return;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Entry Action for the state NOMINAL. */
+void CrIaFdCheckNominalEntry(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short FdCheckCnt = 1;
+
+  /* Set FdCheckCnt to 1 */
+
+  if (smDesc == smDescFdTelescopeTempMonitorCheck)
+    CrIaPaste(FDCHECKTTMCNT_ID, &FdCheckCnt);
+
+  if (smDesc == smDescFdIncorrectSDSCntrCheck)
+    CrIaPaste(FDCHECKSDSCCNT_ID, &FdCheckCnt);
+
+  if (smDesc == smDescFdSemCommErrCheck)
+    CrIaPaste(FDCHECKCOMERRCNT_ID, &FdCheckCnt);
+
+  if (smDesc == smDescFdSemModeTimeOutCheck)
+    CrIaPaste(FDCHECKTIMEOUTCNT_ID, &FdCheckCnt);
+
+  if (smDesc == smDescFdSemSafeModeCheck)
+    CrIaPaste(FDCHECKSAFEMODECNT_ID, &FdCheckCnt);
+
+  if (smDesc == smDescFdSemAliveCheck)
+    CrIaPaste(FDCHECKALIVECNT_ID, &FdCheckCnt);
+
+  if (smDesc == smDescFdSemAnomalyEventCheck)
+    CrIaPaste(FDCHECKSEMANOEVTCNT_ID, &FdCheckCnt);
+
+  if (smDesc == smDescFdSemLimitCheck)
+    CrIaPaste(FDCHECKSEMLIMITCNT_ID, &FdCheckCnt);
+
+  if (smDesc == smDescFdDpuHousekeepingCheck)
+    CrIaPaste(FDCHECKDPUHKCNT_ID, &FdCheckCnt);
+
+  if (smDesc == smDescFdCentroidConsistencyCheck)
+    CrIaPaste(FDCHECKCENTCONSCNT_ID, &FdCheckCnt);
+  
+  if (smDesc == smDescFdResourceCheck)
+    CrIaPaste(FDCHECKRESCNT_ID, &FdCheckCnt);
+
+  if (smDesc == smDescFdSemModeConsistencyCheck)
+    CrIaPaste(FDCHECKSEMCONSCNT_ID, &FdCheckCnt);
+
+  return;
+}
+
+/** Do Action for the state NOMINAL. */
+void CrIaFdCheckNominalDo(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  /* Anomaly Detection Check */
+
+  AnomalyDetectionCheck(smDesc);
+
+  return;
+}
+
+/** Entry Action for the state SUSPECTED. */
+void CrIaFdCheckSuspectedEntry(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short FdCheckCnt, FdCheckSpCnt;
+
+  /* Increment FdCheckCnt */
+  /* Increment FdCheckSpCnt */
+
+  if (smDesc == smDescFdTelescopeTempMonitorCheck)
+    {
+      CrIaCopy(FDCHECKTTMCNT_ID, &FdCheckCnt);
+      FdCheckCnt++;
+      CrIaPaste(FDCHECKTTMCNT_ID, &FdCheckCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckCnt (Telescope Temperature Monitor) = %d\n", FdCheckCnt);
+      CrIaCopy(FDCHECKTTMSPCNT_ID, &FdCheckSpCnt);
+      FdCheckSpCnt++;
+      CrIaPaste(FDCHECKTTMSPCNT_ID, &FdCheckSpCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckSpCnt (Telescope Temperature Monitor) = %d\n", FdCheckSpCnt);
+    };
+
+  if (smDesc == smDescFdIncorrectSDSCntrCheck)
+    {
+      CrIaCopy(FDCHECKSDSCCNT_ID, &FdCheckCnt);
+      FdCheckCnt++;
+      CrIaPaste(FDCHECKSDSCCNT_ID, &FdCheckCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckCnt (Incorrect Science Data Sequence Counter) = %d\n", FdCheckCnt);
+      CrIaCopy(FDCHECKSDSCSPCNT_ID, &FdCheckSpCnt);
+      FdCheckSpCnt++;
+      CrIaPaste(FDCHECKSDSCSPCNT_ID, &FdCheckSpCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckSpCnt (Incorrect Science Data Sequence Counter) = %d\n", FdCheckSpCnt);
+    };
+
+  if (smDesc == smDescFdSemCommErrCheck)
+    {
+      CrIaCopy(FDCHECKCOMERRCNT_ID, &FdCheckCnt);
+      FdCheckCnt++;
+      CrIaPaste(FDCHECKCOMERRCNT_ID, &FdCheckCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckCnt (SEM Communication Error) = %d\n", FdCheckCnt);
+      CrIaCopy(FDCHECKCOMERRSPCNT_ID, &FdCheckSpCnt);
+      FdCheckSpCnt++;
+      CrIaPaste(FDCHECKCOMERRSPCNT_ID, &FdCheckSpCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckSpCnt (SEM Communication Error) = %d\n", FdCheckSpCnt);
+    };
+
+  if (smDesc == smDescFdSemModeTimeOutCheck)
+    {
+      CrIaCopy(FDCHECKTIMEOUTCNT_ID, &FdCheckCnt);
+      FdCheckCnt++;
+      CrIaPaste(FDCHECKTIMEOUTCNT_ID, &FdCheckCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckCnt (SEM Mode Time-Out) = %d\n", FdCheckCnt);
+      CrIaCopy(FDCHECKTIMEOUTSPCNT_ID, &FdCheckSpCnt);
+      FdCheckSpCnt++;
+      CrIaPaste(FDCHECKTIMEOUTSPCNT_ID, &FdCheckSpCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckSpCnt (SEM Mode Time-Out) = %d\n", FdCheckSpCnt);
+    };   
+
+  if (smDesc == smDescFdSemSafeModeCheck)
+    {
+      CrIaCopy(FDCHECKSAFEMODECNT_ID, &FdCheckCnt);
+      FdCheckCnt++;
+      CrIaPaste(FDCHECKSAFEMODECNT_ID, &FdCheckCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckCnt (SEM Safe Mode) = %d\n", FdCheckCnt);
+      CrIaCopy(FDCHECKSAFEMODESPCNT_ID, &FdCheckSpCnt);
+      FdCheckSpCnt++;
+      CrIaPaste(FDCHECKSAFEMODESPCNT_ID, &FdCheckSpCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckSpCnt (SEM Safe Mode) = %d\n", FdCheckSpCnt);
+    };
+
+  if (smDesc == smDescFdSemAliveCheck)
+    {
+      CrIaCopy(FDCHECKALIVECNT_ID, &FdCheckCnt);
+      FdCheckCnt++;
+      CrIaPaste(FDCHECKALIVECNT_ID, &FdCheckCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckCnt (SEM Alive) = %d\n", FdCheckCnt);
+      CrIaCopy(FDCHECKALIVESPCNT_ID, &FdCheckSpCnt);
+      FdCheckSpCnt++;
+      CrIaPaste(FDCHECKALIVESPCNT_ID, &FdCheckSpCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckSpCnt (SEM Alive) = %d\n", FdCheckSpCnt);
+    };
+
+  if (smDesc == smDescFdSemAnomalyEventCheck)
+    {
+      CrIaCopy(FDCHECKSEMANOEVTCNT_ID, &FdCheckCnt);
+      FdCheckCnt++;
+      CrIaPaste(FDCHECKSEMANOEVTCNT_ID, &FdCheckCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckCnt (SEM Anomaly Event) = %d\n", FdCheckCnt);
+      CrIaCopy(FDCHECKSEMANOEVTSPCNT_ID, &FdCheckSpCnt);
+      FdCheckSpCnt++;
+      CrIaPaste(FDCHECKSEMANOEVTSPCNT_ID, &FdCheckSpCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckSpCnt (SEM Anomaly Event) = %d\n", FdCheckSpCnt);
+    };
+
+  if (smDesc == smDescFdSemLimitCheck)
+    {
+      CrIaCopy(FDCHECKSEMLIMITCNT_ID, &FdCheckCnt);
+      FdCheckCnt++;
+      CrIaPaste(FDCHECKSEMLIMITCNT_ID, &FdCheckCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckCnt (SEM Limit) = %d\n", FdCheckCnt);
+      CrIaCopy(FDCHECKSEMLIMITSPCNT_ID, &FdCheckSpCnt);
+      FdCheckSpCnt++;
+      CrIaPaste(FDCHECKSEMLIMITSPCNT_ID, &FdCheckSpCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckSpCnt (SEM Limit) = %d\n", FdCheckSpCnt);
+    };
+
+  if (smDesc == smDescFdDpuHousekeepingCheck)
+    {
+      CrIaCopy(FDCHECKDPUHKCNT_ID, &FdCheckCnt);
+      FdCheckCnt++;
+      CrIaPaste(FDCHECKDPUHKCNT_ID, &FdCheckCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckCnt (DPU Housekeeping) = %d\n", FdCheckCnt);
+      CrIaCopy(FDCHECKDPUHKSPCNT_ID, &FdCheckSpCnt);
+      FdCheckSpCnt++;
+      CrIaPaste(FDCHECKDPUHKSPCNT_ID, &FdCheckSpCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckSpCnt (DPU Housekeeping) = %d\n", FdCheckSpCnt);
+    }; 
+
+    if (smDesc == smDescFdCentroidConsistencyCheck)
+    {
+      CrIaCopy(FDCHECKCENTCONSCNT_ID, &FdCheckCnt);
+      FdCheckCnt++;
+      CrIaPaste(FDCHECKCENTCONSCNT_ID, &FdCheckCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckCnt (Centroid Consistency) = %d\n", FdCheckCnt);
+      CrIaCopy(FDCHECKCENTCONSSPCNT_ID, &FdCheckSpCnt);
+      FdCheckSpCnt++;
+      CrIaPaste(FDCHECKCENTCONSSPCNT_ID, &FdCheckSpCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckSpCnt (Centroid Consistency) = %d\n", FdCheckSpCnt);
+    };
+
+    if (smDesc == smDescFdResourceCheck)
+    {
+      CrIaCopy(FDCHECKRESCNT_ID, &FdCheckCnt);
+      FdCheckCnt++;
+      CrIaPaste(FDCHECKRESCNT_ID, &FdCheckCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckCnt (Resource) = %d\n", FdCheckCnt);
+      CrIaCopy(FDCHECKRESSPCNT_ID, &FdCheckSpCnt);
+      FdCheckSpCnt++;
+      CrIaPaste(FDCHECKRESSPCNT_ID, &FdCheckSpCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckSpCnt (Resource) = %d\n", FdCheckSpCnt);
+    };
+
+    if (smDesc == smDescFdSemModeConsistencyCheck)
+    {
+      CrIaCopy(FDCHECKSEMCONSCNT_ID, &FdCheckCnt);
+      FdCheckCnt++;
+      CrIaPaste(FDCHECKSEMCONSCNT_ID, &FdCheckCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckCnt (Resource) = %d\n", FdCheckCnt);
+      CrIaCopy(FDCHECKSEMCONSSPCNT_ID, &FdCheckSpCnt);
+      FdCheckSpCnt++;
+      CrIaPaste(FDCHECKSEMCONSSPCNT_ID, &FdCheckSpCnt);
+      DEBUGP("FdCheck-CrIaFdCheckSuspectedEntry: FdCheckSpCnt (Resource) = %d\n", FdCheckSpCnt);
+    };    
+
+  return;
+}
+
+/** Do Action for the state SUSPECTED. */
+void CrIaFdCheckSuspectedDo(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  /* Anomaly Detection Check */
+
+  AnomalyDetectionCheck(smDesc);
+
+  return;
+}
+
+/** Entry Action for the state FAILED. */
+void CrIaFdCheckFailedEntry(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  /* Try Recovery */
+
+  Flag_1_TTM = 1;
+  Flag_1_SDSC = 1;
+  Flag_1_COMERR = 1;
+  Flag_1_TIMEOUT = 1;
+  Flag_1_SAFEMODE = 1;
+  Flag_1_ALIVE = 1;
+  Flag_1_SEMANOEVT = 1;
+  Flag_1_SEMLIMIT = 1;
+  Flag_1_DPUHK = 1;
+  Flag_1_CENTCONS = 1;
+  Flag_1_RES = 1;
+  Flag_1_SEMCONS = 1;
+
+  DEBUGP("FdCheck-CrIaFdCheckFailedEntry: Try Recovery\n");
+  TryRecovery(smDesc);
+
+  return;
+}
+
+/** Do Action for the state FAILED. */
+void CrIaFdCheckFailedDo(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  FwSmBool_t Anomaly;
+
+  /* Anomaly Detection Check */
+  /* If (Anomaly Detected) Try Recovery */
+
+  Anomaly = AnomalyDetectionCheck(smDesc);
+
+  if (Anomaly == 1)
+    {
+      DEBUGP("FdCheck-CrIaFdCheckFailedDo: Try Recovery\n");
+      TryRecovery(smDesc);
+    };
+
+  return;
+}
+
+/** Exit Action for the state DISABLED. */
+void CrIaFdCheckDisabledExit(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short FdCheckCnt = 0;
+
+  /* FdCheckCounter = 0 */
+  /* Initialize Anomaly Detection Check */
+
+  if (smDesc == smDescFdTelescopeTempMonitorCheck)
+    {
+      CrIaPaste(FDCHECKTTMCNT_ID, &FdCheckCnt);
+
+      /* Initialization */
+
+    };
+
+  if (smDesc == smDescFdIncorrectSDSCntrCheck)
+    {
+      CrIaPaste(FDCHECKSDSCCNT_ID, &FdCheckCnt);
+
+      /* Initialization */
+
+    };
+
+  if (smDesc == smDescFdSemCommErrCheck)
+    {
+      CrIaPaste(FDCHECKCOMERRCNT_ID, &FdCheckCnt);
+
+      /* Initialization */
+
+    };
+
+  if (smDesc == smDescFdSemModeTimeOutCheck)
+    {
+      CrIaPaste(FDCHECKTIMEOUTCNT_ID, &FdCheckCnt);
+
+      /* Initialization */
+      /* Mantis 2076: Reset all counters for FdCheck SEM Mode Time-Out */
+      CMD_MODE_TRANSITION_TO_POWERON_Cnt = 0;
+      CMD_MODE_TRANSITION_TO_SAFE_Cnt = 0;
+      CMD_MODE_TRANSITION_TO_STAB_Cnt = 0;
+      CMD_MODE_TRANSITION_TO_TEMP_Cnt = 0;
+      CMD_MODE_TRANSITION_TO_CCDWIN_Cnt = 0;
+      CMD_MODE_TRANSITION_TO_CCDFULL_Cnt = 0;
+      CMD_MODE_TRANSITION_TO_DIAG_Cnt = 0;
+      CMD_MODE_TRANSITION_TO_STANDBY_Cnt = 0;      
+    };  
+
+  if (smDesc == smDescFdSemSafeModeCheck)
+    {
+      CrIaPaste(FDCHECKSAFEMODECNT_ID, &FdCheckCnt);
+
+      /* Initialization */
+
+    };
+
+  if (smDesc == smDescFdSemAliveCheck)
+    {
+      CrIaPaste(FDCHECKALIVECNT_ID, &FdCheckCnt);
+
+      /* Initialization */
+
+    };
+
+  if (smDesc == smDescFdSemAnomalyEventCheck)
+    {
+      CrIaPaste(FDCHECKSEMANOEVTCNT_ID, &FdCheckCnt);
+
+      /* Initialization */
+
+    };
+
+  if (smDesc == smDescFdSemLimitCheck)
+    {
+      CrIaPaste(FDCHECKSEMLIMITCNT_ID, &FdCheckCnt);
+
+      /* Initialization */
+      /* Mantis 2182 */
+      ClearWarnLimit();
+      
+      alarmLimitDefCnt = 0;
+      warnLimitDefCnt = 0;
+
+      alarmLimitExtCnt = 0;
+      warnLimitExtCnt = 0;
+
+      ClearAliveLimit();
+      
+      semAliveStatusDefCnt = 0;
+      semAliveStatusExtCnt = 0;
+    };
+    
+  if (smDesc == smDescFdDpuHousekeepingCheck)
+    {
+      CrIaPaste(FDCHECKDPUHKCNT_ID, &FdCheckCnt);
+
+      /* Initialization */
+
+    };
+
+  if (smDesc == smDescFdCentroidConsistencyCheck)
+    {
+      CrIaPaste(FDCHECKCENTCONSCNT_ID, &FdCheckCnt);
+
+      /* Initialization */
+
+    };
+    
+  if (smDesc == smDescFdResourceCheck)
+    {
+      CrIaPaste(FDCHECKRESCNT_ID, &FdCheckCnt);
+
+      /* Initialization */
+
+    };
+
+  if (smDesc == smDescFdSemModeConsistencyCheck)
+    {
+      CrIaPaste(FDCHECKRESCNT_ID, &FdCheckCnt);
+
+      /* Initialization */
+
+    };
+
+  return;
+}
+
+/** Guard on the transition from NOMINAL to DISABLED. */
+FwSmBool_t CrIaFdCheckIsNotEnabled(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned char FdCheckGlbEn, FdCheckIntEn = 0, FdCheckExtEn = 0;
+
+  /* Execute [ FdCheck is not Enabled ] */
+
+  CrIaCopy(FDGLBENABLE_ID, &FdCheckGlbEn);
+
+  if (FdCheckGlbEn == 1)
+    {
+
+      if (smDesc == smDescFdTelescopeTempMonitorCheck)
+        {
+          CrIaCopy(FDCHECKTTMINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKTTMEXTEN_ID, &FdCheckExtEn);
+        };
+
+      if (smDesc == smDescFdIncorrectSDSCntrCheck)
+        {
+          CrIaCopy(FDCHECKSDSCINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKSDSCEXTEN_ID, &FdCheckExtEn);
+        };
+
+      if (smDesc == smDescFdSemCommErrCheck)
+        {
+          CrIaCopy(FDCHECKCOMERRINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKCOMERREXTEN_ID, &FdCheckExtEn);
+        };
+
+      if (smDesc == smDescFdSemModeTimeOutCheck)
+        {
+          CrIaCopy(FDCHECKTIMEOUTINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKTIMEOUTEXTEN_ID, &FdCheckExtEn);
+        };
+
+      if (smDesc == smDescFdSemSafeModeCheck)
+        {
+          CrIaCopy(FDCHECKSAFEMODEINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKSAFEMODEEXTEN_ID, &FdCheckExtEn);
+        };
+
+      if (smDesc == smDescFdSemAliveCheck)
+        {
+          CrIaCopy(FDCHECKALIVEINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKALIVEEXTEN_ID, &FdCheckExtEn);
+        };
+
+      if (smDesc == smDescFdSemAnomalyEventCheck)
+        {
+          CrIaCopy(FDCHECKSEMANOEVTINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKSEMANOEVTEXTEN_ID, &FdCheckExtEn);
+        };
+
+      if (smDesc == smDescFdSemLimitCheck)
+        {
+          CrIaCopy(FDCHECKSEMLIMITINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKSEMLIMITEXTEN_ID, &FdCheckExtEn);
+        };
+
+      if (smDesc == smDescFdDpuHousekeepingCheck)
+        {
+          CrIaCopy(FDCHECKDPUHKINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKDPUHKEXTEN_ID, &FdCheckExtEn);
+        };
+
+      if (smDesc == smDescFdCentroidConsistencyCheck)
+        {
+          CrIaCopy(FDCHECKCENTCONSINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKCENTCONSEXTEN_ID, &FdCheckExtEn);
+        };
+
+      if (smDesc == smDescFdResourceCheck)
+        {
+          CrIaCopy(FDCHECKRESINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKRESEXTEN_ID, &FdCheckExtEn);
+        };
+
+      if (smDesc == smDescFdSemModeConsistencyCheck)
+        {
+          CrIaCopy(FDCHECKSEMCONSINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKSEMCONSEXTEN_ID, &FdCheckExtEn);
+        };
+
+      if ((FdCheckIntEn == 1) && (FdCheckExtEn == 1))
+        return 0;
+
+    };
+
+  return 1;
+}
+
+/** Guard on the transition from FAILED to CHOICE1. */
+FwSmBool_t CrIaFdCheckIsAnomalyAndEnabled(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  FwSmBool_t Anomaly = 0;
+  unsigned char FdCheckGlbEn, FdCheckIntEn = 0, FdCheckExtEn = 0;
+
+  /* Execute [ (FdCheck is Enabled) && (No Anomaly) ] */
+
+  CrIaCopy(FDGLBENABLE_ID, &FdCheckGlbEn);
+
+  if (FdCheckGlbEn == 1)
+    {
+
+      if (smDesc == smDescFdTelescopeTempMonitorCheck)
+        {
+          CrIaCopy(FDCHECKTTMINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKTTMEXTEN_ID, &FdCheckExtEn);
+          Anomaly = AnomalyTelescopeTempMonitorCheck;
+        };
+
+      if (smDesc == smDescFdIncorrectSDSCntrCheck)
+        {
+          CrIaCopy(FDCHECKSDSCINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKSDSCEXTEN_ID, &FdCheckExtEn);
+          Anomaly = AnomalyIncorrectSDSCntrCheck;
+        };
+
+      if (smDesc == smDescFdSemCommErrCheck)
+        {
+          CrIaCopy(FDCHECKCOMERRINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKCOMERREXTEN_ID, &FdCheckExtEn);
+          Anomaly = AnomalySemCommErrCheck;
+        };
+
+      if (smDesc == smDescFdSemModeTimeOutCheck)
+        {
+          CrIaCopy(FDCHECKTIMEOUTINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKTIMEOUTEXTEN_ID, &FdCheckExtEn);
+          Anomaly = AnomalySemModeTimeOutCheck;
+        };
+
+      if (smDesc == smDescFdSemSafeModeCheck)
+        {
+          CrIaCopy(FDCHECKSAFEMODEINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKSAFEMODEEXTEN_ID, &FdCheckExtEn);
+          Anomaly = AnomalySemSafeModeCheck;
+        };
+
+      if (smDesc == smDescFdSemAliveCheck)
+        {
+          CrIaCopy(FDCHECKALIVEINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKALIVEEXTEN_ID, &FdCheckExtEn);
+          Anomaly = AnomalySemAliveCheck;
+        };
+
+      if (smDesc == smDescFdSemAnomalyEventCheck)
+        {
+          CrIaCopy(FDCHECKSEMANOEVTINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKSEMANOEVTEXTEN_ID, &FdCheckExtEn);
+          Anomaly = AnomalySemAnomalyEventCheck;
+        };
+
+      if (smDesc == smDescFdSemLimitCheck)
+        {
+          CrIaCopy(FDCHECKSEMLIMITINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKSEMLIMITEXTEN_ID, &FdCheckExtEn);
+          Anomaly = AnomalySemLimitCheck;
+        };
+
+      if (smDesc == smDescFdDpuHousekeepingCheck)
+        {
+          CrIaCopy(FDCHECKDPUHKINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKDPUHKEXTEN_ID, &FdCheckExtEn);
+          Anomaly = AnomalyDpuHousekeepingCheck;
+        };
+
+      if (smDesc == smDescFdCentroidConsistencyCheck)
+        {
+          CrIaCopy(FDCHECKCENTCONSINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKCENTCONSEXTEN_ID, &FdCheckExtEn);
+          Anomaly = AnomalyCentroidConsistencyCheck;
+        };
+
+      if (smDesc == smDescFdResourceCheck)
+        {
+          CrIaCopy(FDCHECKRESINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKRESEXTEN_ID, &FdCheckExtEn);
+          Anomaly = AnomalyResourceCheck;
+        };
+
+      if (smDesc == smDescFdSemModeConsistencyCheck)
+        {
+          CrIaCopy(FDCHECKSEMCONSINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKSEMCONSEXTEN_ID, &FdCheckExtEn);
+          Anomaly = AnomalySemModeConsistencyCheck;
+        };
+
+      if ((FdCheckIntEn == 1) && (FdCheckExtEn == 1) && (Anomaly == 0))
+        return 1;
+
+    };
+
+  return 0;
+}
+
+/** Action on the transition from DISABLED to CHOICE1. */
+void CrIaFdCheckAnomalyDetCheck(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  /* Do Anomaly Detection Check */
+
+  AnomalyDetectionCheck(smDesc);
+
+  return;
+}
+
+/** Guard on the transition from DISABLED to CHOICE1. */
+FwSmBool_t CrIaFdCheckIsEnabled(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned char FdCheckGlbEn, FdCheckIntEn = 0, FdCheckExtEn = 0;
+
+  /* Execute [ FdCheck is Enabled ] */
+
+  CrIaCopy(FDGLBENABLE_ID, &FdCheckGlbEn);
+
+  if (FdCheckGlbEn == 1)
+    {
+
+      if (smDesc == smDescFdTelescopeTempMonitorCheck)
+        {
+          CrIaCopy(FDCHECKTTMINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKTTMEXTEN_ID, &FdCheckExtEn);
+        };
+
+      if (smDesc == smDescFdIncorrectSDSCntrCheck)
+        {
+          CrIaCopy(FDCHECKSDSCINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKSDSCEXTEN_ID, &FdCheckExtEn);
+        };        
+
+      if (smDesc == smDescFdSemCommErrCheck)
+        {
+          CrIaCopy(FDCHECKCOMERRINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKCOMERREXTEN_ID, &FdCheckExtEn);
+        };
+
+      if (smDesc == smDescFdSemModeTimeOutCheck)
+        {
+          CrIaCopy(FDCHECKTIMEOUTINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKTIMEOUTEXTEN_ID, &FdCheckExtEn);
+        };    
+
+      if (smDesc == smDescFdSemSafeModeCheck)
+        {
+          CrIaCopy(FDCHECKSAFEMODEINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKSAFEMODEEXTEN_ID, &FdCheckExtEn);
+        };
+
+      if (smDesc == smDescFdSemAliveCheck)
+        {
+          CrIaCopy(FDCHECKALIVEINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKALIVEEXTEN_ID, &FdCheckExtEn);
+        };
+
+      if (smDesc == smDescFdSemAnomalyEventCheck)
+        {
+          CrIaCopy(FDCHECKSEMANOEVTINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKSEMANOEVTEXTEN_ID, &FdCheckExtEn);
+        };
+
+      if (smDesc == smDescFdSemLimitCheck)
+        {
+          CrIaCopy(FDCHECKSEMLIMITINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKSEMLIMITEXTEN_ID, &FdCheckExtEn);
+        };
+
+      if (smDesc == smDescFdDpuHousekeepingCheck)
+        {
+          CrIaCopy(FDCHECKDPUHKINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKDPUHKEXTEN_ID, &FdCheckExtEn);
+        };
+
+      if (smDesc == smDescFdCentroidConsistencyCheck)
+        {
+          CrIaCopy(FDCHECKCENTCONSINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKCENTCONSEXTEN_ID, &FdCheckExtEn);
+        };
+
+      if (smDesc == smDescFdResourceCheck)
+        {
+          CrIaCopy(FDCHECKRESINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKRESEXTEN_ID, &FdCheckExtEn);
+        };
+
+      if (smDesc == smDescFdSemModeConsistencyCheck)
+        {
+          CrIaCopy(FDCHECKSEMCONSINTEN_ID, &FdCheckIntEn);
+          CrIaCopy(FDCHECKSEMCONSEXTEN_ID, &FdCheckExtEn);
+        };
+
+      if ((FdCheckIntEn == 1) && (FdCheckExtEn == 1))
+        return 1;
+
+    };
+
+  return 0;
+}
+
+/** Action on the transition from Initial State to DISABLED. */
+void CrIaFdCheckResetSpCnt(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short FdCheckSpCnt = 0;
+
+  /* FdCheckSpCnt = 0 */
+
+  if (smDesc == smDescFdTelescopeTempMonitorCheck)
+    CrIaPaste(FDCHECKTTMSPCNT_ID, &FdCheckSpCnt);
+
+  if (smDesc == smDescFdIncorrectSDSCntrCheck)
+    CrIaPaste(FDCHECKSDSCSPCNT_ID, &FdCheckSpCnt);
+
+  if (smDesc == smDescFdSemCommErrCheck)
+    CrIaPaste(FDCHECKCOMERRSPCNT_ID, &FdCheckSpCnt);
+
+  if (smDesc == smDescFdSemModeTimeOutCheck)
+    CrIaPaste(FDCHECKTIMEOUTSPCNT_ID, &FdCheckSpCnt);
+
+  if (smDesc == smDescFdSemSafeModeCheck)
+    CrIaPaste(FDCHECKSAFEMODESPCNT_ID, &FdCheckSpCnt);
+
+  if (smDesc == smDescFdSemAliveCheck)
+    CrIaPaste(FDCHECKALIVESPCNT_ID, &FdCheckSpCnt);
+
+  if (smDesc == smDescFdSemAnomalyEventCheck)
+    CrIaPaste(FDCHECKSEMANOEVTSPCNT_ID, &FdCheckSpCnt);
+
+  if (smDesc == smDescFdSemLimitCheck)
+    CrIaPaste(FDCHECKSEMLIMITSPCNT_ID, &FdCheckSpCnt);
+
+  if (smDesc == smDescFdDpuHousekeepingCheck)
+    CrIaPaste(FDCHECKDPUHKSPCNT_ID, &FdCheckSpCnt);
+
+  if (smDesc == smDescFdCentroidConsistencyCheck)
+    CrIaPaste(FDCHECKCENTCONSSPCNT_ID, &FdCheckSpCnt);
+
+  if (smDesc == smDescFdResourceCheck)
+    CrIaPaste(FDCHECKRESSPCNT_ID, &FdCheckSpCnt);
+
+  if (smDesc == smDescFdSemModeConsistencyCheck)
+    CrIaPaste(FDCHECKSEMCONSSPCNT_ID, &FdCheckSpCnt);
+
+  return;
+}
+
+/** Guard on the transition from CHOICE1 to SUSPECTED. */
+FwSmBool_t CrIaFdCheckIsAnomalyAndSmallCnt(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  FwSmBool_t Anomaly = 0;
+  unsigned short FdCheckCnt = 0, FdCheckCntThr = 0;
+
+  /* [ (Anomaly Detected) && (FdCheckCnt < FdCheckCntThr) ] */
+
+  if (smDesc == smDescFdTelescopeTempMonitorCheck)
+    {
+      Anomaly = AnomalyTelescopeTempMonitorCheck;
+      CrIaCopy(FDCHECKTTMCNT_ID, &FdCheckCnt);
+      CrIaCopy(FDCHECKTTMCNTTHR_ID, &FdCheckCntThr);
+    }
+
+  if (smDesc == smDescFdIncorrectSDSCntrCheck)
+    {
+      Anomaly = AnomalyIncorrectSDSCntrCheck;
+      CrIaCopy(FDCHECKSDSCCNT_ID, &FdCheckCnt);
+      CrIaCopy(FDCHECKSDSCCNTTHR_ID, &FdCheckCntThr);
+    }
+
+  if (smDesc == smDescFdSemCommErrCheck)
+    {
+      Anomaly = AnomalySemCommErrCheck;
+      CrIaCopy(FDCHECKCOMERRCNT_ID, &FdCheckCnt);
+      CrIaCopy(FDCHECKCOMERRCNTTHR_ID, &FdCheckCntThr);
+    }
+
+  if (smDesc == smDescFdSemModeTimeOutCheck)
+    {
+      Anomaly = AnomalySemModeTimeOutCheck;
+      CrIaCopy(FDCHECKTIMEOUTCNT_ID, &FdCheckCnt);
+      CrIaCopy(FDCHECKTIMEOUTCNTTHR_ID, &FdCheckCntThr);
+    }
+
+  if (smDesc == smDescFdSemSafeModeCheck)
+    {
+      Anomaly = AnomalySemSafeModeCheck;
+      CrIaCopy(FDCHECKSAFEMODECNT_ID, &FdCheckCnt);
+      CrIaCopy(FDCHECKSAFEMODECNTTHR_ID, &FdCheckCntThr);
+    }
+
+  if (smDesc == smDescFdSemAliveCheck)
+    {
+      Anomaly = AnomalySemAliveCheck;
+      CrIaCopy(FDCHECKALIVECNT_ID, &FdCheckCnt);
+      CrIaCopy(FDCHECKALIVECNTTHR_ID, &FdCheckCntThr);
+    }
+
+  if (smDesc == smDescFdSemAnomalyEventCheck)
+    {
+      Anomaly = AnomalySemAnomalyEventCheck;
+      CrIaCopy(FDCHECKSEMANOEVTCNT_ID, &FdCheckCnt);
+      CrIaCopy(FDCHECKSEMANOEVTCNTTHR_ID, &FdCheckCntThr);
+    }
+
+  if (smDesc == smDescFdSemLimitCheck)
+    {
+      Anomaly = AnomalySemLimitCheck;
+      CrIaCopy(FDCHECKSEMLIMITCNT_ID, &FdCheckCnt);
+      CrIaCopy(FDCHECKSEMLIMITCNTTHR_ID, &FdCheckCntThr);
+    }
+
+  if (smDesc == smDescFdDpuHousekeepingCheck)
+    {
+      Anomaly = AnomalyDpuHousekeepingCheck;
+      CrIaCopy(FDCHECKDPUHKCNT_ID, &FdCheckCnt);
+      CrIaCopy(FDCHECKDPUHKCNTTHR_ID, &FdCheckCntThr);
+    }
+
+  if (smDesc == smDescFdCentroidConsistencyCheck)
+    {
+      Anomaly = AnomalyCentroidConsistencyCheck;
+      CrIaCopy(FDCHECKCENTCONSCNT_ID, &FdCheckCnt);
+      CrIaCopy(FDCHECKCENTCONSCNTTHR_ID, &FdCheckCntThr);
+    }
+    
+  if (smDesc == smDescFdResourceCheck)
+    {
+      Anomaly = AnomalyResourceCheck;
+      CrIaCopy(FDCHECKRESCNT_ID, &FdCheckCnt);
+      CrIaCopy(FDCHECKRESCNTTHR_ID, &FdCheckCntThr);
+    }
+
+  if (smDesc == smDescFdSemModeConsistencyCheck)
+    {
+      Anomaly = AnomalySemModeConsistencyCheck;
+      CrIaCopy(FDCHECKSEMCONSCNT_ID, &FdCheckCnt);
+      CrIaCopy(FDCHECKSEMCONSCNTTHR_ID, &FdCheckCntThr);
+    }
+
+  if ((Anomaly == 1) && (FdCheckCnt < FdCheckCntThr))
+    return 1;
+
+  return 0;
+}
+
+/** Guard on the transition from CHOICE1 to NOMINAL. */
+FwSmBool_t CrIaFdCheckIsNoAnomaly(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  FwSmBool_t Anomaly = 0;
+
+  /* [ No Anomaly ] */
+
+  if (smDesc == smDescFdTelescopeTempMonitorCheck)
+    Anomaly = AnomalyTelescopeTempMonitorCheck;
+
+  if (smDesc == smDescFdIncorrectSDSCntrCheck)
+    Anomaly = AnomalyIncorrectSDSCntrCheck;
+
+  if (smDesc == smDescFdSemCommErrCheck)
+    Anomaly = AnomalySemCommErrCheck;
+
+  if (smDesc == smDescFdSemModeTimeOutCheck)
+    Anomaly = AnomalySemModeTimeOutCheck;
+
+  if (smDesc == smDescFdSemSafeModeCheck)
+    Anomaly = AnomalySemSafeModeCheck;
+
+  if (smDesc == smDescFdSemAliveCheck)
+    Anomaly = AnomalySemAliveCheck;
+
+  if (smDesc == smDescFdSemAnomalyEventCheck)
+    Anomaly = AnomalySemAnomalyEventCheck;
+
+  if (smDesc == smDescFdSemLimitCheck)
+    Anomaly = AnomalySemLimitCheck;
+  
+  if (smDesc == smDescFdDpuHousekeepingCheck)
+    Anomaly = AnomalyDpuHousekeepingCheck;
+
+  if (smDesc == smDescFdCentroidConsistencyCheck)
+    Anomaly = AnomalyCentroidConsistencyCheck;  
+
+  if (smDesc == smDescFdResourceCheck)
+    Anomaly = AnomalyResourceCheck;  
+
+  if (smDesc == smDescFdSemModeConsistencyCheck)
+    Anomaly = AnomalySemModeConsistencyCheck;  
+
+  if (Anomaly == 0)
+    return 1;
+
+  return 0;
+}
+
+/** Action on the transition from CHOICE1 to FAILED. */
+void CrIaFdCheckEvtFailed(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short evt_data[2];
+  unsigned short FdCheckId = 0;
+
+  /* Generate event report EVT_FD_FAILED */
+
+  if (smDesc == smDescFdTelescopeTempMonitorCheck)
+    FdCheckId = FDC_TS_TEMP;
+
+  if (smDesc == smDescFdIncorrectSDSCntrCheck)
+    FdCheckId = FDC_ILL_CNT;
+
+  if (smDesc == smDescFdSemCommErrCheck)
+    FdCheckId = FDC_SEM_COMM;
+
+  if (smDesc == smDescFdSemModeTimeOutCheck)
+    FdCheckId = FDC_SEM_TO;
+
+  if (smDesc == smDescFdSemSafeModeCheck)
+    FdCheckId = FDC_SEM_SM;
+
+  if (smDesc == smDescFdSemAliveCheck)
+    FdCheckId = FDC_SEM_ALIVE;
+
+  if (smDesc == smDescFdSemAnomalyEventCheck)
+    FdCheckId = FDC_EVT1;
+  /*
+  FDC EVT2=8
+  */
+  if (smDesc == smDescFdSemLimitCheck)
+    FdCheckId = FDC_SEM_OOL;
+
+  if (smDesc == smDescFdDpuHousekeepingCheck)
+    FdCheckId = FDC_PSDU_OOL;
+
+  if (smDesc == smDescFdCentroidConsistencyCheck)
+    FdCheckId = FDC_CENT_CONS;
+
+  if (smDesc == smDescFdResourceCheck)
+    FdCheckId = FDC_RES;
+
+  if (smDesc == smDescFdSemModeConsistencyCheck)
+    FdCheckId = FDC_SEM_CONS;
+
+  evt_data[0] = FdCheckId;
+  evt_data[1] = 0; /* not used */
+
+  CrIaEvtRep(3, CRIA_SERV5_EVT_FD_FAILED, evt_data, 4);
+
+  return;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
diff --git a/CrIa/src/CrIaPrSm/CrIaFdCheckInit.txt b/CrIa/src/CrIaPrSm/CrIaFdCheckInit.txt
new file mode 100644
index 0000000..c52bdaa
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaFdCheckInit.txt
@@ -0,0 +1,19 @@
+{
+	/** Define the state machine descriptor (SMD) */
+	FwSmDesc_t smDesc = CrIaFdCheckCreate(NULL);
+
+	/** Check that the SM is properly configured */
+	if (FwSmCheckRec(smDesc) != smSuccess) {
+		printf("The state machine CrIaFdCheck is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The state machine CrIaFdCheck is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the SM, send a few transition commands to it, and execute it */
+	FwSmStart(smDesc);
+	FwSmMakeTrans(smDesc, Execute);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaHbSemMonCreate.c b/CrIa/src/CrIaPrSm/CrIaHbSemMonCreate.c
new file mode 100644
index 0000000..a37350f
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaHbSemMonCreate.c
@@ -0,0 +1,125 @@
+/**
+ * @file CrIaHbSemMonCreate.c
+ *
+ * @author FW Profile code generator version 5.01
+ * @date Created on: Sep 22 2017 14:47:10
+ */
+
+#include "CrIaHbSemMonCreate.h"
+
+/** CrFramework function definitions */
+#include "CrFramework/CrFwConstants.h"
+
+/** FW Profile function definitions */
+#include "FwPrDCreate.h"
+#include "FwPrConfig.h"
+
+/** CrIaHbSemMon function definitions */
+#include <stdlib.h>
+
+/**
+ * Guard on the Control Flow from DECISION1 to N3.
+ * Else
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code30324(FwPrDesc_t prDesc)
+{
+  CRFW_UNUSED(prDesc);
+
+  return 1;
+}
+
+/**
+ * Guard on the Control Flow from DECISION2 to DECISION4.
+ * Else
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code41924(FwPrDesc_t prDesc)
+{
+  CRFW_UNUSED(prDesc);
+
+  return 1;
+}
+
+/**
+ * Guard on the Control Flow from DECISION3 to N7.
+ * Else
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code66539(FwPrDesc_t prDesc)
+{
+  CRFW_UNUSED(prDesc);
+
+  return 1;
+}
+
+/**
+ * Guard on the Control Flow from DECISION4 to N2.
+ * Else
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code68683(FwPrDesc_t prDesc)
+{
+  CRFW_UNUSED(prDesc);
+
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaHbSemMonCreate(void* prData)
+{
+	const FwPrCounterU2_t DECISION1 = 1;		/* The identifier of decision node DECISION1 in procedure CrIaHbSemMon */
+	const FwPrCounterU2_t N_OUT_OF_DECISION1 = 2;	/* The number of control flows out of decision node DECISION1 in procedure CrIaHbSemMon */
+	const FwPrCounterU2_t DECISION2 = 2;		/* The identifier of decision node DECISION2 in procedure CrIaHbSemMon */
+	const FwPrCounterU2_t N_OUT_OF_DECISION2 = 3;	/* The number of control flows out of decision node DECISION2 in procedure CrIaHbSemMon */
+	const FwPrCounterU2_t DECISION3 = 3;		/* The identifier of decision node DECISION3 in procedure CrIaHbSemMon */
+	const FwPrCounterU2_t N_OUT_OF_DECISION3 = 2;	/* The number of control flows out of decision node DECISION3 in procedure CrIaHbSemMon */
+	const FwPrCounterU2_t DECISION4 = 4;		/* The identifier of decision node DECISION4 in procedure CrIaHbSemMon */
+	const FwPrCounterU2_t N_OUT_OF_DECISION4 = 2;	/* The number of control flows out of decision node DECISION4 in procedure CrIaHbSemMon */
+
+	/** Create the procedure */
+	FwPrDesc_t prDesc = FwPrCreate(
+		7,	/* N_ANODES - The number of action nodes */
+		4,	/* N_DNODES - The number of decision nodes */
+		17,	/* N_FLOWS - The number of control flows */
+		7,	/* N_ACTIONS - The number of actions */
+		10	/* N_GUARDS - The number of guards */
+	);
+
+	/** Configure the procedure */
+	FwPrSetData(prDesc, prData);
+	FwPrAddActionNode(prDesc, CrIaHbSemMon_N1, &CrIaHbSemMonN1);
+	FwPrAddDecisionNode(prDesc, DECISION1, N_OUT_OF_DECISION1);
+	FwPrAddActionNode(prDesc, CrIaHbSemMon_N2, &CrIaHbSemMonN2);
+	FwPrAddDecisionNode(prDesc, DECISION2, N_OUT_OF_DECISION2);
+	FwPrAddActionNode(prDesc, CrIaHbSemMon_N3, &CrIaHbSemMonN3);
+	FwPrAddActionNode(prDesc, CrIaHbSemMon_N4, &CrIaHbSemMonN4);
+	FwPrAddDecisionNode(prDesc, DECISION3, N_OUT_OF_DECISION3);
+	FwPrAddActionNode(prDesc, CrIaHbSemMon_N7, &CrIaHbSemMonN7);
+	FwPrAddDecisionNode(prDesc, DECISION4, N_OUT_OF_DECISION4);
+	FwPrAddActionNode(prDesc, CrIaHbSemMon_N8, &CrIaHbSemMonN8);
+	FwPrAddActionNode(prDesc, CrIaHbSemMon_N9, &CrIaHbSemMonN9);
+	FwPrAddFlowActToAct(prDesc, CrIaHbSemMon_N1, CrIaHbSemMon_N8, NULL);
+	FwPrAddFlowIniToAct(prDesc, CrIaHbSemMon_N1, NULL);
+	FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaHbSemMon_N2, &CrIaHbSemMonG2);
+	FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaHbSemMon_N3, &code30324);
+	FwPrAddFlowActToAct(prDesc, CrIaHbSemMon_N2, CrIaHbSemMon_N8, NULL);
+	FwPrAddFlowDecToAct(prDesc, DECISION2, CrIaHbSemMon_N4, &CrIaHbSemMonG21);
+	FwPrAddFlowDecToAct(prDesc, DECISION2, CrIaHbSemMon_N2, &CrIaHbSemMonG22);
+	FwPrAddFlowDecToDec(prDesc, DECISION2, DECISION4, &code41924);
+	FwPrAddFlowActToDec(prDesc, CrIaHbSemMon_N3, DECISION2, NULL);
+	FwPrAddFlowActToDec(prDesc, CrIaHbSemMon_N4, DECISION3, NULL);
+	FwPrAddFlowDecToAct(prDesc, DECISION3, CrIaHbSemMon_N8, &CrIaHbSemMonG4);
+	FwPrAddFlowDecToAct(prDesc, DECISION3, CrIaHbSemMon_N7, &code66539);
+	FwPrAddFlowActToAct(prDesc, CrIaHbSemMon_N7, CrIaHbSemMon_N9, NULL);
+	FwPrAddFlowDecToAct(prDesc, DECISION4, CrIaHbSemMon_N4, &CrIaHbSemMonG3);
+	FwPrAddFlowDecToAct(prDesc, DECISION4, CrIaHbSemMon_N2, &code68683);
+	FwPrAddFlowActToDec(prDesc, CrIaHbSemMon_N8, DECISION1, &CrIaHbSemMonG1);
+	FwPrAddFlowActToFin(prDesc, CrIaHbSemMon_N9, NULL);
+
+	return prDesc;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaHbSemMonCreate.h b/CrIa/src/CrIaPrSm/CrIaHbSemMonCreate.h
new file mode 100644
index 0000000..b20d70c
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaHbSemMonCreate.h
@@ -0,0 +1,176 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaHbSemMon procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ * @image html CrIaHbSemMon.png
+ *
+ * @author FW Profile code generator version 5.01
+ * @date Created on: Sep 22 2017 14:47:10
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CRIAHBSEMMON_H_
+#define CRIAHBSEMMON_H_
+
+/** FW Profile function definitions */
+#include "FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaHbSemMon_N1 (1)		/* The identifier of action node N1 in procedure CrIaHbSemMon */
+#define CrIaHbSemMon_N2 (2)		/* The identifier of action node N2 in procedure CrIaHbSemMon */
+#define CrIaHbSemMon_N3 (3)		/* The identifier of action node N3 in procedure CrIaHbSemMon */
+#define CrIaHbSemMon_N4 (4)		/* The identifier of action node N4 in procedure CrIaHbSemMon */
+#define CrIaHbSemMon_N7 (5)		/* The identifier of action node N7 in procedure CrIaHbSemMon */
+#define CrIaHbSemMon_N8 (6)		/* The identifier of action node N8 in procedure CrIaHbSemMon */
+#define CrIaHbSemMon_N9 (7)		/* The identifier of action node N9 in procedure CrIaHbSemMon */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaHbSemMonCreate(void* prData);
+
+/**
+ * Action for node N1.
+ * <pre>
+ * Set hbSemPassword
+ * and hbSemCounter to zero
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaHbSemMonN1(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N2.
+ * <pre>
+ * Set hbSemCounter
+ * to zero
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaHbSemMonN2(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N3.
+ * <pre>
+ * Read SEM ON/OFF status
+ * from DPU Status Register
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaHbSemMonN3(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N4.
+ * <pre>
+ * Increment
+ * hbSemCounter
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaHbSemMonN4(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N7.
+ * <pre>
+ * Make entry
+ * HBSEM_ALARM
+ * in Error Log
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaHbSemMonN7(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N8.
+ * NOP
+ * @param smDesc the procedure descriptor
+ */
+void CrIaHbSemMonN8(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N9.
+ * <pre>
+ * Trigger
+ * DPU Reset
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaHbSemMonN9(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION1 to N2.
+ * <pre>
+ * hbSemPassword is
+ * equal to 0xAA55 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaHbSemMonG2(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION2 to N4.
+ * <pre>
+ * (hbSem is equal to FALSE) &&
+ * (SEM ON/OFF flag is equal to OFF) 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaHbSemMonG21(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION2 to N2.
+ * <pre>
+ * HbSem is
+ * equal to TRUE
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaHbSemMonG22(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION3 to N8.
+ * <pre>
+ * hbSemCounter is
+ * smaller than HBSEM_MON_LIM 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaHbSemMonG4(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION4 to N4.
+ * <pre>
+ * (SEM Mode as given by data pool variables
+ * echoing SEM telemetry is STANDBY or SAFE) &&
+ * (HbSem is equal to FALSE) 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaHbSemMonG3(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N8 to DECISION1.
+ * Wait 1 Cycle  
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaHbSemMonG1(FwPrDesc_t prDesc);
+
+#endif /* CrIaHbSemMonCreate_H_ */
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaHbSemMonFunc.c b/CrIa/src/CrIaPrSm/CrIaHbSemMonFunc.c
new file mode 100644
index 0000000..77fa1fb
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaHbSemMonFunc.c
@@ -0,0 +1,273 @@
+/**
+ * @file CrIaHbSemMonFunc.c
+ *
+ * @author FW Profile code generator version 5.01
+ * @date Created on: Sep 22 2017 14:47:10
+ */
+
+/** CrIaHbSemMon function definitions */
+#include "CrIaHbSemMonCreate.h"
+
+/** CrFramework function definitions */
+#include "CrFramework/CrFwConstants.h"
+
+/** FW Profile function definitions */
+#include "FwPrConstants.h"
+#include "FwPrDCreate.h"
+#include "FwPrConfig.h"
+#include "FwPrCore.h"
+
+#include <CrIaIasw.h>
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+#include <IfswUtilities.h>
+#include <Services/General/CrIaConstants.h>
+#include <Services/General/CrSemConstants.h>
+
+#if (__sparc__)
+#include <error_log.h> /* for ERROR_LOG_INFO_SIZE */
+#include <ibsw_interface.h>
+#include <exchange_area.h>
+#endif /* __sparc__ */	
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+#define HBSEM_ALARM 0xFFAA
+
+CrFwBool_t semStatus;
+
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N1. */
+void CrIaHbSemMonN1(FwPrDesc_t prDesc)
+{
+  unsigned short hbSemPassword;
+  unsigned int hbSemCounter;
+
+  /* Set hbSemPassword and hbSemCounter to zero */
+
+  CRFW_UNUSED(prDesc);
+
+  hbSemPassword = 0;
+  CrIaPaste(HBSEMPASSWORD_ID, &hbSemPassword);
+
+  hbSemCounter = 0;
+  CrIaPaste(HBSEMCOUNTER_ID, &hbSemCounter);
+
+  return;
+}
+
+/** Action for node N2. */
+void CrIaHbSemMonN2(FwPrDesc_t prDesc)
+{
+  unsigned int hbSemCounter;
+
+  /* Set hbSemCounter to zero */
+
+  CRFW_UNUSED(prDesc);
+
+  hbSemCounter = 0;
+  CrIaPaste(HBSEMCOUNTER_ID, &hbSemCounter);
+
+  return;
+}
+
+/** Action for node N3. */
+void CrIaHbSemMonN3(FwPrDesc_t prDesc)
+{
+  /* Read SEM ON/OFF status from DPU Status Register */
+
+  CRFW_UNUSED(prDesc);
+
+#if (__sparc__)
+  semStatus = CrIbSemLowLevelOp(GET_STATUS_ON);
+#else
+  semStatus = 0;
+#endif /* __sparc__ */	 
+
+  return;
+}
+
+/** Action for node N4. */
+void CrIaHbSemMonN4(FwPrDesc_t prDesc)
+{
+  unsigned int hbSemCounter;
+
+  /* Increment hbSemCounter */
+
+  CRFW_UNUSED(prDesc);
+
+  CrIaCopy(HBSEMCOUNTER_ID, &hbSemCounter);
+  hbSemCounter++;
+  CrIaPaste(HBSEMCOUNTER_ID, &hbSemCounter);
+
+  return;
+}
+
+/** Action for node N7. */
+void CrIaHbSemMonN7(FwPrDesc_t prDesc)
+{
+  unsigned short evt_data[2] = {0, 0};
+
+  /* Make entry HBSEM_ALARM in Error Log */
+
+  CRFW_UNUSED(prDesc);
+
+  /* Entry in Error Log with ID HBSEM_ALARM */
+  CrIaErrRep(CRIA_SERV5_EVT_ERR_HIGH_SEV, HBSEM_ALARM, evt_data, 2);
+
+  return;
+}
+
+/** Action for node N8. */
+void CrIaHbSemMonN8(FwPrDesc_t prDesc)
+{
+  /* NOP */
+
+  CRFW_UNUSED(prDesc);
+
+  return;
+}
+
+/** Action for node N9. */
+void CrIaHbSemMonN9(FwPrDesc_t prDesc)
+{
+  /* Trigger DPU Reset */
+
+  CRFW_UNUSED(prDesc);
+
+#if (__sparc__)
+  CrIbResetDPU(DBS_EXCHANGE_RESET_TYPE_UN);
+#endif /* __sparc__ */	 
+
+  return;
+}
+
+/**************/
+/*** GUARDS ***/
+/**************/
+
+/** Guard on the Control Flow from DECISION1 to N2. */
+FwPrBool_t CrIaHbSemMonG2(FwPrDesc_t prDesc)
+{
+  unsigned short hbSemPassword;
+
+  /* [ hbSemPassword is equal to 0xAA55 ] */
+
+  CRFW_UNUSED(prDesc);
+
+  CrIaCopy(HBSEMPASSWORD_ID, &hbSemPassword);
+
+  if (hbSemPassword == 0xAA55)
+    {
+       return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/** Guard on the Control Flow from DECISION2 to N4. */
+FwPrBool_t CrIaHbSemMonG21(FwPrDesc_t prDesc)
+{
+  unsigned char hbSem;
+
+  /* [ (hbSem is equal to FALSE) && (SEM ON/OFF flag is equal to OFF) ] */
+
+  CRFW_UNUSED(prDesc);
+
+  CrIaCopy(HBSEM_ID, &hbSem);
+
+  if ((hbSem == 0) && (semStatus == 0)) /* thermal control is ON && status_OFF */
+    {
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/** Guard on the Control Flow from DECISION2 to N2. */
+FwPrBool_t CrIaHbSemMonG22(FwPrDesc_t prDesc)
+{
+  unsigned char hbSem;
+
+  /* [ hbSem is equal to TRUE ] */
+
+  CRFW_UNUSED(prDesc);
+
+  CrIaCopy(HBSEM_ID, &hbSem);
+
+  if (hbSem == 1) /* thermal control is OFF */
+    {
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/** Guard on the Control Flow from DECISION3 to N8. */
+FwPrBool_t CrIaHbSemMonG4(FwPrDesc_t prDesc)
+{
+  unsigned int hbSemCounter;
+
+  /* [ hbSemCounter is smaller than HBSEM_MON_LIM ] */
+
+  CRFW_UNUSED(prDesc);
+
+  CrIaCopy(HBSEMCOUNTER_ID, &hbSemCounter);
+
+  if (hbSemCounter < HBSEM_MON_LIM)
+    {
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/** Guard on the Control Flow from DECISION4 to N4. */
+FwPrBool_t CrIaHbSemMonG3(FwPrDesc_t prDesc)
+{
+  unsigned char hbSem;
+  unsigned short hkStatMode;
+
+  /* [ (SEM Mode as given by data pool variables echoing SEM telemetry is 
+       STANDBY or SAFE) && (hbSem is equal to FALSE) ] */
+
+  CRFW_UNUSED(prDesc);
+
+  /* Get HK_STAT_MODE from data pool echoing SEM telemetry */ 
+  CrIaCopy(STAT_MODE_ID, &hkStatMode);
+
+  /* Get HbSem Flag from data pool */
+  CrIaCopy(HBSEM_ID, &hbSem);
+
+  if (((hkStatMode == SEM_STATE_STANDBY) || (hkStatMode == SEM_STATE_SAFE)) && (hbSem == 0))
+    {
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/** Guard on the Control Flow from N8 to DECISION1. */
+FwPrBool_t CrIaHbSemMonG1(FwPrDesc_t prDesc)
+{
+  /* [ Wait 1 Cycle ] */
+
+  return (FwPrGetNodeExecCnt(prDesc) == 1);
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaIaswCreate.c b/CrIa/src/CrIaPrSm/CrIaIaswCreate.c
new file mode 100644
index 0000000..d70df40
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaIaswCreate.c
@@ -0,0 +1,55 @@
+/**
+ * @file CrIaIaswCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwSmDCreate.h"
+#include "FwProfile/FwSmConfig.h"
+
+/** CrIaIasw function definitions */
+#include "CrIaIaswCreate.h"
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwSmDesc_t CrIaIaswCreate(void* smData)
+{
+  const FwSmCounterU2_t N_OUT_OF_STANDBY = 2;	/* The number of transitions out of state STANDBY */
+  const FwSmCounterU2_t N_OUT_OF_PRE_SCIENCE = 2;	/* The number of transitions out of state PRE_SCIENCE */
+  const FwSmCounterU2_t N_OUT_OF_SCIENCE = 3;	/* The number of transitions out of state SCIENCE */
+  const FwSmCounterU2_t N_OUT_OF_SEM_OFFLINE = 1;	/* The number of transitions out of state SEM_OFFLINE */
+  const FwSmCounterU2_t CHOICE1 = 1;		/* The identifier of choice pseudo-state CHOICE1 in State Machine CrIaIasw */
+  const FwSmCounterU2_t N_OUT_OF_CHOICE1 = 1;	/* The number of transitions out of the choice-pseudo state CHOICE1 */
+
+  /** Create state machine smDesc */
+  FwSmDesc_t smDesc = FwSmCreate(
+                        4,	/* NSTATES - The number of states */
+                        1,	/* NCPS - The number of choice pseudo-states */
+                        10,	/* NTRANS - The number of transitions */
+                        8,	/* NACTIONS - The number of state and transition actions */
+                        2	/* NGUARDS - The number of transition guards */
+                      );
+
+  /** Configure the state machine smDesc */
+  FwSmSetData(smDesc, smData);
+  FwSmAddState(smDesc, CrIaIasw_STANDBY, N_OUT_OF_STANDBY, &CrIaIaswSwitchOffSem, NULL, NULL, NULL);
+  FwSmAddState(smDesc, CrIaIasw_PRE_SCIENCE, N_OUT_OF_PRE_SCIENCE, &CrIaIaswStartPrepSci, NULL, &CrIaIaswExecPrepSci, NULL);
+  FwSmAddState(smDesc, CrIaIasw_SCIENCE, N_OUT_OF_SCIENCE, &CrIaIaswLoad196s1, &CrIaIaswScienceExit, &CrIaIaswExecAllSciPr, NULL);
+  FwSmAddState(smDesc, CrIaIasw_SEM_OFFLINE, N_OUT_OF_SEM_OFFLINE, &CrIaIaswSwitchOnSem, NULL, NULL, NULL);
+  FwSmAddChoicePseudoState(smDesc, CHOICE1, N_OUT_OF_CHOICE1);
+  FwSmAddTransIpsToSta(smDesc, CrIaIasw_STANDBY, NULL);
+  FwSmAddTransStaToSta(smDesc, PrepareScience, CrIaIasw_STANDBY, CrIaIasw_PRE_SCIENCE, NULL, NULL);
+  FwSmAddTransStaToSta(smDesc, StartOffline, CrIaIasw_STANDBY, CrIaIasw_SEM_OFFLINE, NULL, NULL);
+  FwSmAddTransStaToCps(smDesc, StopSem, CrIaIasw_PRE_SCIENCE, CHOICE1, &CrIaIaswSMAction1, NULL);
+  FwSmAddTransStaToSta(smDesc, StartScience, CrIaIasw_PRE_SCIENCE, CrIaIasw_SCIENCE, NULL, &CrIaIaswFlag1);
+  FwSmAddTransStaToCps(smDesc, StopSem, CrIaIasw_SCIENCE, CHOICE1, NULL, NULL);
+  FwSmAddTransStaToSta(smDesc, Execute, CrIaIasw_SCIENCE, CrIaIasw_PRE_SCIENCE, NULL, &CrIaIaswAreSciPrTerm);
+  FwSmAddTransStaToSta(smDesc, StopScience, CrIaIasw_SCIENCE, CrIaIasw_PRE_SCIENCE, NULL, NULL);
+  FwSmAddTransStaToCps(smDesc, StopSem, CrIaIasw_SEM_OFFLINE, CHOICE1, NULL, NULL);
+  FwSmAddTransCpsToSta(smDesc, CHOICE1, CrIaIasw_STANDBY, NULL, NULL);
+
+  return smDesc;
+}
diff --git a/CrIa/src/CrIaPrSm/CrIaIaswCreate.h b/CrIa/src/CrIaPrSm/CrIaIaswCreate.h
new file mode 100644
index 0000000..97f078d
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaIaswCreate.h
@@ -0,0 +1,151 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaIasw state machine.
+ * The state machine is configured with a set of function pointers representing the non-default
+ * actions and guards of the state machine. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the state machine in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The state machine created by this file is shown in the figure below.
+ * @image html CrIaIasw.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaIaswCreate_H_
+#define CrIaIaswCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwSmConstants.h"
+
+/** State identifiers */
+#define CrIaIasw_STOPPED (0)
+#define CrIaIasw_PRE_SCIENCE (1)		/* The identifier of state PRE_SCIENCE in State Machine CrIaIasw */
+#define CrIaIasw_SCIENCE (2)		/* The identifier of state SCIENCE in State Machine CrIaIasw */
+#define CrIaIasw_SEM_OFFLINE (3)		/* The identifier of state SEM_OFFLINE in State Machine CrIaIasw */
+#define CrIaIasw_STANDBY (4)		/* The identifier of state STANDBY in State Machine CrIaIasw */
+
+/** The identifiers of transition commands (triggers) */
+#define Execute (0)
+#define StopSem (3)
+#define PrepareScience (4)
+#define StartOffline (6)
+#define StartScience (7)
+#define StopScience (5)
+
+/**
+ * Create a new state machine descriptor.
+ * This interface creates the state machine descriptor dynamically.
+ * @param smData the pointer to the state machine data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the state machine data when the state machine is created is NULL).
+ * @return the pointer to the state machine descriptor
+ */
+FwSmDesc_t CrIaIaswCreate(void* smData);
+
+/**
+ * Entry Action for the state STANDBY.
+ * <pre>
+ * Load EVT_IASW_TR
+ * Send SwitchOff command
+ *  to SEM Unit State Machine
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaIaswSwitchOffSem(FwSmDesc_t smDesc);
+
+/**
+ * Entry Action for the state PRE_SCIENCE.
+ * <pre>
+ * Load EVT_IASW_TR
+ * Start Prepare
+ * Science Procedure
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaIaswStartPrepSci(FwSmDesc_t smDesc);
+
+/**
+ * Do Action for the state PRE_SCIENCE.
+ * <pre>
+ * Execute Prepare
+ * Science Procedure
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaIaswExecPrepSci(FwSmDesc_t smDesc);
+
+/**
+ * Entry Action for the state SCIENCE.
+ * <pre>
+ * Load EVT_IASW_TR
+ * Load (196,1) Report
+ * Enable Centroid Cons. FdCheck
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaIaswLoad196s1(FwSmDesc_t smDesc);
+
+/**
+ * Exit Action for the state SCIENCE.
+ * <pre>
+ * Stop all Science Procedures
+ * Stop all Science Algorithms
+ * Disable Centroid Cons. FdCheck
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaIaswScienceExit(FwSmDesc_t smDesc);
+
+/**
+ * Do Action for the state SCIENCE.
+ * Execute all Science Procedures
+ * but the Save Images and Transfer
+ * FBFs to Ground Procedures
+ * @param smDesc the state machine descriptor
+ */
+void CrIaIaswExecAllSciPr(FwSmDesc_t smDesc);
+
+/**
+ * Entry Action for the state SEM_OFFLINE.
+ * <pre>
+ * Load EVT_IASW_TR
+ * Send SwitchOn command
+ * to SEM Unit State Machine
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaIaswSwitchOnSem(FwSmDesc_t smDesc);
+
+/**
+ * Action on the transition from PRE_SCIENCE to CHOICE1.
+ * Action_1
+ * @param smDesc the state machine descriptor
+ */
+void CrIaIaswSMAction1(FwSmDesc_t smDesc);
+
+/**
+ * Guard on the transition from PRE_SCIENCE to SCIENCE.
+ *  Flag_1 
+ * @param smDesc the state machine descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwSmBool_t CrIaIaswFlag1(FwSmDesc_t smDesc);
+
+/**
+ * Guard on the transition from SCIENCE to PRE_SCIENCE.
+ * <pre>
+ *  All Science Procedures controlled
+ * by do-action of SCIENCE have
+ * terminated execution 
+ * </pre>
+ * @param smDesc the state machine descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwSmBool_t CrIaIaswAreSciPrTerm(FwSmDesc_t smDesc);
+
+#endif /* CrIaIaswCreate_H_ */
diff --git a/CrIa/src/CrIaPrSm/CrIaIaswFunc.c b/CrIa/src/CrIaPrSm/CrIaIaswFunc.c
new file mode 100644
index 0000000..2a0c8af
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaIaswFunc.c
@@ -0,0 +1,282 @@
+/**
+ * @file CrIaIaswFunc.c
+ * @ingroup CrIaSm
+ * @authors FW Profile code generator version 4.63; Institute for Astrophysics, 2015-2016
+ * @date Created on: Feb 11 2016 22:56:45
+ *
+ * @brief Implementation of the IASW State Machine actions and guards.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#include <unistd.h> /* sleep() */
+
+/** FW Profile function definitions */
+#include <FwProfile/FwSmConstants.h>
+#include <FwProfile/FwSmDCreate.h>
+#include <FwProfile/FwSmConfig.h>
+#include <FwProfile/FwSmCore.h>
+
+#include <FwProfile/FwPrConstants.h>
+#include <FwProfile/FwPrDCreate.h>
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwPrCore.h>
+
+/** CrIaIasw function definitions */
+#include <CrIaPrSm/CrIaIaswCreate.h>
+
+/** CrIaSem function definitions */
+#include <CrIaPrSm/CrIaSemCreate.h>
+
+#include <CrIaPrSm/CrIaAlgoCreate.h>
+
+#include <CrIaIasw.h>
+
+#include <Services/General/CrIaConstants.h>
+#include <Services/General/CrSemConstants.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <IfswDebug.h>
+
+
+/** Entry Action for the state STANDBY. */
+void CrIaIaswSwitchOffSem(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short iasw_state_prev;
+  unsigned short iasw_state;
+
+  unsigned short evt_data[2];
+
+  /* get current state */
+  iasw_state = FwSmGetCurState(smDescIasw);
+
+  /* get previous state from data pool */
+  CrIaCopy(IASWSTATE_ID,  &iasw_state_prev);
+
+  /* update state in data pool */
+  CrIaPaste(IASWSTATE_ID, &iasw_state);
+
+  DEBUGP("IASW previous state: %d\n", iasw_state_prev);
+  DEBUGP("IASW state: %d\n", iasw_state);
+
+  /* Load EVT_IASW_SM_TRANS */
+  evt_data[0] = iasw_state_prev;
+  evt_data[1] = iasw_state;
+
+  CrIaEvtRep(1, CRIA_SERV5_EVT_IASW_TR, evt_data, 4);
+
+  /* Send SwitchOff command to SEM Unit SM */
+  FwSmMakeTrans(smDescSem, SwitchOff);
+
+  return;
+}
+
+
+/** Entry Action for the state PRE_SCIENCE. */
+void CrIaIaswStartPrepSci(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short iasw_state_prev;
+  unsigned short iasw_state;
+
+  unsigned short evt_data[2];
+
+  /* get current state */
+  iasw_state = FwSmGetCurState(smDescIasw);
+
+  /* get previous state from data pool */
+  CrIaCopy(IASWSTATE_ID,  &iasw_state_prev);
+
+  /* update state in data pool */
+  CrIaPaste(IASWSTATE_ID, &iasw_state);
+
+  /* Load EVT_IASW_SM_TRANS */
+  evt_data[0] = iasw_state_prev;
+  evt_data[1] = iasw_state;
+
+  CrIaEvtRep(1, CRIA_SERV5_EVT_IASW_TR, evt_data, 4);
+
+  /* Start Prepare Science Procedure */
+  FwPrStart(prDescPrepSci);
+
+  return;
+}
+
+
+/** Do Action for the state PRE_SCIENCE. */
+void CrIaIaswExecPrepSci(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  /* Execute Prepare Science Procedure */
+  FwPrExecute(prDescPrepSci);
+
+  return;
+}
+
+
+/** Entry Action for the state SCIENCE. */
+void CrIaIaswLoad196s1(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short iasw_state_prev;
+  unsigned short iasw_state;
+
+  unsigned short evt_data[2];
+
+  unsigned char FdCheckCentConsIntEn;
+
+  /* get current state */
+  iasw_state = FwSmGetCurState(smDescIasw);
+
+  /* get previous state from data pool */
+  CrIaCopy(IASWSTATE_ID, &iasw_state_prev);
+
+  /* update state in data pool */
+  CrIaPaste(IASWSTATE_ID, &iasw_state);
+
+  /* Load EVT_IASW_SM_TRANS */
+  evt_data[0] = iasw_state_prev;
+  evt_data[1] = iasw_state;
+
+  CrIaEvtRep(1, CRIA_SERV5_EVT_IASW_TR, evt_data, 4);
+
+  /* Load (196,1) Report */
+  CrIaLoadAocsReport();
+
+  /* Enable FdCheck Centroid Consistency Check */
+  FdCheckCentConsIntEn = 1;
+  CrIaPaste(FDCHECKCENTCONSINTEN_ID, &FdCheckCentConsIntEn);
+
+  return;
+}
+
+/** Exit Action for the state SCIENCE. */
+void CrIaIaswScienceExit(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned char FdCheckCentConsIntEn;
+
+  /* Stop all Science Procedures */
+  FwPrStop(prDescSaveImages);
+  FwPrStop(prDescNomSci);
+  FwPrStop(prDescAcqFullDrop);
+  FwPrStop(prDescCalFullSnap);
+  FwPrStop(prDescSciStack);
+
+  /* Stop all Science Algorithms */
+  FwSmMakeTrans(smDescAlgoCent0, Stop);  
+  FwSmMakeTrans(smDescAlgoCent1, Stop);
+  FwSmMakeTrans(smDescAlgoCmpr, Stop);
+  FwSmMakeTrans(smDescAlgoAcq1, Stop);
+
+  /* Disable FdCheck Centroid Consistency Check */
+  FdCheckCentConsIntEn = 0;
+  CrIaPaste(FDCHECKCENTCONSINTEN_ID, &FdCheckCentConsIntEn);
+
+  return;
+}
+
+/** Do Action for the state SCIENCE. */
+void CrIaIaswExecAllSciPr(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  /* Execute all Science Procedures */
+  FwPrExecute(prDescNomSci);
+  FwPrExecute(prDescAcqFullDrop);
+  FwPrExecute(prDescCalFullSnap);
+  FwPrExecute(prDescSciStack);
+
+  return;
+}
+
+/** Entry Action for the state SEM_OFFLINE. */
+void CrIaIaswSwitchOnSem(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short iasw_state_prev;
+  unsigned short iasw_state;
+
+  unsigned short evt_data[2];
+
+  /* get current state */
+  iasw_state = FwSmGetCurState(smDescIasw);
+
+  /* get previous state from data pool */
+  CrIaCopy(IASWSTATE_ID,  &iasw_state_prev);
+
+  /* update state in data pool */
+  CrIaPaste(IASWSTATE_ID, &iasw_state);
+
+  /* Load EVT_IASW_SM_TRANS */
+  evt_data[0] = iasw_state_prev;
+  evt_data[1] = iasw_state;
+
+  CrIaEvtRep(1, CRIA_SERV5_EVT_IASW_TR, evt_data, 4);
+
+  /* SEM Switch-on command to SEM unit SM */
+  FwSmMakeTrans(smDescSem, SwitchOn);
+
+  return;
+}
+
+/** Action on the transition from PRE_SCIENCE to CHOICE1. */
+void CrIaIaswSMAction1(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  /* Stop Prepare Science Procedure */
+
+  FwPrStop(prDescPrepSci);
+
+  return;
+}
+
+/** Guard on the transition from PRE_SCIENCE to SCIENCE. */
+FwSmBool_t CrIaIaswFlag1(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned char prep_sci_proc;
+  unsigned short sem_oper_state;
+
+  /* StartScience */
+  /* [ (Prepare Science is not running) && (SEM OPER SM is in STABILIZE) ] */
+
+  /* Get the current state of the Prepare Science Procedure */
+  /* 1 if the procedure is STARTED or 0 if it is STOPPED */
+  prep_sci_proc = FwPrIsStarted(prDescPrepSci);
+
+  /* Check for SEM Unit SM is in STABILIZE */
+  /* get current state */
+  sem_oper_state = FwSmGetCurStateEmb(smDescSem);
+
+  if ((prep_sci_proc == PR_STOPPED) && (sem_oper_state == CrIaSem_STABILIZE))
+    return 1;
+
+  return 0;
+}
+
+/** Guard on the transition from SCIENCE to PRE_SCIENCE. */
+FwSmBool_t CrIaIaswAreSciPrTerm(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short pr_state_NomSci, pr_state_AcqFullDrop, pr_state_CalFullSnap, pr_state_SciStack;
+
+  /* All Science Procedures controlled by do-action of SCIENCE have terminated execution */
+
+  /* Get the status of all Science Procedures, and check if they are terminated */
+  /* 1 if the procedure is STARTED or 0 if it is STOPPED */
+  pr_state_NomSci = FwPrIsStarted(prDescNomSci);
+  pr_state_AcqFullDrop = FwPrIsStarted(prDescAcqFullDrop);
+  pr_state_CalFullSnap = FwPrIsStarted(prDescCalFullSnap);
+  pr_state_SciStack = FwPrIsStarted(prDescSciStack);
+
+  if ((pr_state_NomSci == PR_STOPPED) &&
+      (pr_state_AcqFullDrop == PR_STOPPED) &&
+      (pr_state_CalFullSnap == PR_STOPPED) &&
+      (pr_state_SciStack == PR_STOPPED))
+    return 1;
+
+  return 0;
+}
+
diff --git a/CrIa/src/CrIaPrSm/CrIaIaswInit.txt b/CrIa/src/CrIaPrSm/CrIaIaswInit.txt
new file mode 100644
index 0000000..721f716
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaIaswInit.txt
@@ -0,0 +1,24 @@
+{
+	/** Define the state machine descriptor (SMD) */
+	FwSmDesc_t smDesc = CrIaIaswCreate(NULL);
+
+	/** Check that the SM is properly configured */
+	if (FwSmCheckRec(smDesc) != smSuccess) {
+		printf("The state machine CrIaIasw is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The state machine CrIaIasw is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the SM, send a few transition commands to it, and execute it */
+	FwSmStart(smDesc);
+	FwSmMakeTrans(smDesc, StopSem);
+	FwSmMakeTrans(smDesc, PrepareScience);
+	FwSmMakeTrans(smDesc, Execute);
+	FwSmMakeTrans(smDesc, StartOffline);
+	FwSmMakeTrans(smDesc, StartScience);
+	FwSmMakeTrans(smDesc, StopScience);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaNomSciCreate.c b/CrIa/src/CrIaPrSm/CrIaNomSciCreate.c
new file mode 100644
index 0000000..23da963
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaNomSciCreate.c
@@ -0,0 +1,146 @@
+/**
+ * @file CrIaNomSciCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Jun 3 2016 19:48:5
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaNomSci function definitions */
+#include "CrIaNomSciCreate.h"
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+/**
+ * Action for node N13.
+ * NOP
+ * @param smDesc the procedure descriptor
+ */
+static void code12899(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+	return;
+}
+
+/**
+ * Guard on the Control Flow from DECISION2 to DECISION3.
+ *  pAcqFlag == FALSE 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code2759(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/**
+ * Guard on the Control Flow from DECISION3 to DECISION4.
+ *  pCal1Flag == FALSE
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code44436(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/**
+ * Guard on the Control Flow from DECISION4 to DECISION5.
+ *  pSciFlag == FALSE 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code53213(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/**
+ * Guard on the Control Flow from DECISION5 to N13.
+ *  pCal2Flag == FALSE  
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code10693(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaNomSciCreate(void* prData)
+{
+  const FwPrCounterU2_t DECISION2 = 1;		/* The identifier of decision node DECISION2 in procedure CrIaNomSci */
+  const FwPrCounterU2_t N_OUT_OF_DECISION2 = 2;	/* The number of control flows out of decision node DECISION2 in procedure CrIaNomSci */
+  const FwPrCounterU2_t DECISION3 = 2;		/* The identifier of decision node DECISION3 in procedure CrIaNomSci */
+  const FwPrCounterU2_t N_OUT_OF_DECISION3 = 2;	/* The number of control flows out of decision node DECISION3 in procedure CrIaNomSci */
+  const FwPrCounterU2_t DECISION4 = 3;		/* The identifier of decision node DECISION4 in procedure CrIaNomSci */
+  const FwPrCounterU2_t N_OUT_OF_DECISION4 = 2;	/* The number of control flows out of decision node DECISION4 in procedure CrIaNomSci */
+  const FwPrCounterU2_t DECISION5 = 4;		/* The identifier of decision node DECISION5 in procedure CrIaNomSci */
+  const FwPrCounterU2_t N_OUT_OF_DECISION5 = 2;	/* The number of control flows out of decision node DECISION5 in procedure CrIaNomSci */
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+                        17,	/* N_ANODES - The number of action nodes */
+                        4,	/* N_DNODES - The number of decision nodes */
+                        26,	/* N_FLOWS - The number of control flows */
+                        16,	/* N_ACTIONS - The number of actions */
+                        13	/* N_GUARDS - The number of guards */
+                      );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddActionNode(prDesc, CrIaNomSci_N2, &CrIaNomSciN2);
+  FwPrAddActionNode(prDesc, CrIaNomSci_N3, &CrIaNomSciN3);
+  FwPrAddActionNode(prDesc, CrIaNomSci_N1, &CrIaNomSciN1);
+  FwPrAddDecisionNode(prDesc, DECISION2, N_OUT_OF_DECISION2);
+  FwPrAddActionNode(prDesc, CrIaNomSci_N5, &CrIaNomSciN5);
+  FwPrAddDecisionNode(prDesc, DECISION3, N_OUT_OF_DECISION3);
+  FwPrAddActionNode(prDesc, CrIaNomSci_N6, &CrIaNomSciSdbResetFull);
+  FwPrAddActionNode(prDesc, CrIaNomSci_N7, &CrIaNomSciN7);
+  FwPrAddDecisionNode(prDesc, DECISION4, N_OUT_OF_DECISION4);
+  FwPrAddActionNode(prDesc, CrIaNomSci_N9, &CrIaNomSciN9);
+  FwPrAddActionNode(prDesc, CrIaNomSci_N7_1, &CrIaNomSciN7_1);
+  FwPrAddActionNode(prDesc, CrIaNomSci_N11_1, &CrIaNomSciN11_1);
+  FwPrAddDecisionNode(prDesc, DECISION5, N_OUT_OF_DECISION5);
+  FwPrAddActionNode(prDesc, CrIaNomSci_N9_1, &CrIaNomSciN9_1);
+  FwPrAddActionNode(prDesc, CrIaNomSci_N11, &CrIaNomSciN11);
+  FwPrAddActionNode(prDesc, CrIaNomSci_N4, &CrIaNomSciN4);
+  FwPrAddActionNode(prDesc, CrIaNomSci_N5_1, &CrIaNomSciN5_1);
+  FwPrAddActionNode(prDesc, CrIaNomSci_N8, &CrIaNomSciN8);
+  FwPrAddActionNode(prDesc, CrIaNomSci_N10, &CrIaNomSciSdbResetFull);
+  FwPrAddActionNode(prDesc, CrIaNomSci_N12, &CrIaNomSciN12);
+  FwPrAddActionNode(prDesc, CrIaNomSci_N13, &code12899);
+  FwPrAddFlowIniToAct(prDesc, CrIaNomSci_N1, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaNomSci_N1, CrIaNomSci_N2, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaNomSci_N2, CrIaNomSci_N3, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaNomSci_N3, CrIaNomSci_N4, NULL);
+  FwPrAddFlowActToDec(prDesc, CrIaNomSci_N4, DECISION2, NULL);
+  FwPrAddFlowDecToAct(prDesc, DECISION2, CrIaNomSci_N5, &CrIaNomSciIsAcqFlagTrue);
+  FwPrAddFlowDecToDec(prDesc, DECISION2, DECISION3, &code2759);
+  FwPrAddFlowActToDec(prDesc, CrIaNomSci_N5, DECISION3, &CrIaNomSciIsN5Finished);
+  FwPrAddFlowDecToAct(prDesc, DECISION3, CrIaNomSci_N5_1, &CrIaNomSciIsCal1FlagTrue);
+  FwPrAddFlowDecToDec(prDesc, DECISION3, DECISION4, &code44436);
+  FwPrAddFlowActToAct(prDesc, CrIaNomSci_N5_1, CrIaNomSci_N6, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaNomSci_N6, CrIaNomSci_N7, NULL);
+  FwPrAddFlowActToDec(prDesc, CrIaNomSci_N7, DECISION4, &CrIaNomSciIsN7Finished);
+  FwPrAddFlowDecToAct(prDesc, DECISION4, CrIaNomSci_N7_1, &CrIaNomSciIsSciFlagTrue);
+  FwPrAddFlowDecToDec(prDesc, DECISION4, DECISION5, &code53213);
+  FwPrAddFlowActToAct(prDesc, CrIaNomSci_N7_1, CrIaNomSci_N8, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaNomSci_N8, CrIaNomSci_N9, NULL);
+  FwPrAddFlowActToDec(prDesc, CrIaNomSci_N9, DECISION5, &CrIaNomSciIsN9Finished);
+  FwPrAddFlowDecToAct(prDesc, DECISION5, CrIaNomSci_N9_1, &CrIaNomSciIsCal2FlagTrue);
+  FwPrAddFlowDecToAct(prDesc, DECISION5, CrIaNomSci_N13, &code10693);
+  FwPrAddFlowActToAct(prDesc, CrIaNomSci_N9_1, CrIaNomSci_N10, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaNomSci_N10, CrIaNomSci_N11, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaNomSci_N11, CrIaNomSci_N11_1, &CrIaNomSciIsN11Finished);
+  FwPrAddFlowActToAct(prDesc, CrIaNomSci_N13, CrIaNomSci_N11_1, &CrIaNomSciIsFlag1True);
+  FwPrAddFlowActToAct(prDesc, CrIaNomSci_N11_1, CrIaNomSci_N12, NULL);
+  FwPrAddFlowActToFin(prDesc, CrIaNomSci_N12, NULL);
+
+  return prDesc;
+}
diff --git a/CrIa/src/CrIaPrSm/CrIaNomSciCreate.h b/CrIa/src/CrIaPrSm/CrIaNomSciCreate.h
new file mode 100644
index 0000000..a7023da
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaNomSciCreate.h
@@ -0,0 +1,279 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaNomSci procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ * @image html CrIaNomSci.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Jun 3 2016 19:48:5
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaNomSciCreate_H_
+#define CrIaNomSciCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaNomSci_N1 (1)		/* The identifier of action node N1 in procedure CrIaNomSci */
+#define CrIaNomSci_N2 (2)		/* The identifier of action node N2 in procedure CrIaNomSci */
+#define CrIaNomSci_N3 (3)		/* The identifier of action node N3 in procedure CrIaNomSci */
+#define CrIaNomSci_N4 (4)		/* The identifier of action node N4 in procedure CrIaNomSci */
+#define CrIaNomSci_N5 (5)		/* The identifier of action node N5 in procedure CrIaNomSci */
+#define CrIaNomSci_N5_1 (6)		/* The identifier of action node N5_1 in procedure CrIaNomSci */
+#define CrIaNomSci_N6 (7)		/* The identifier of action node N6 in procedure CrIaNomSci */
+#define CrIaNomSci_N7 (8)		/* The identifier of action node N7 in procedure CrIaNomSci */
+#define CrIaNomSci_N7_1 (9)		/* The identifier of action node N7_1 in procedure CrIaNomSci */
+#define CrIaNomSci_N8 (10)		/* The identifier of action node N8 in procedure CrIaNomSci */
+#define CrIaNomSci_N9 (11)		/* The identifier of action node N9 in procedure CrIaNomSci */
+#define CrIaNomSci_N9_1 (12)		/* The identifier of action node N9_1 in procedure CrIaNomSci */
+#define CrIaNomSci_N10 (13)		/* The identifier of action node N10 in procedure CrIaNomSci */
+#define CrIaNomSci_N11 (14)		/* The identifier of action node N11 in procedure CrIaNomSci */
+#define CrIaNomSci_N11_1 (15)		/* The identifier of action node N11_1 in procedure CrIaNomSci */
+#define CrIaNomSci_N12 (16)		/* The identifier of action node N12 in procedure CrIaNomSci */
+#define CrIaNomSci_N13 (17)		/* The identifier of action node N13 in procedure CrIaNomSci */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaNomSciCreate(void* prData);
+
+/**
+ * Action for node N2.
+ * <pre>
+ * Set SDB parameters according
+ * to procedure parameters
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaNomSciN2(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N3.
+ * <pre>
+ * Configure SDB for
+ * operation in Full CCD Mode
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaNomSciN3(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N1.
+ * <pre>
+ * Generate event report
+ * EVT_SC_PR_STRT
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaNomSciN1(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N5.
+ * <pre>
+ * Start procedure
+ * Acquire Full Drop
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaNomSciN5(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N6.
+ * <pre>
+ * Send ResetFull cmd
+ * to SDB State Machine
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaNomSciSdbResetFull(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N7.
+ * <pre>
+ * Start procedure
+ * Calibrate Full Snap
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaNomSciN7(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N9.
+ * <pre>
+ * Start procedure
+ * Science Window Stack/Snap
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaNomSciN9(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N7_1.
+ * <pre>
+ * Set STCK_ORDER
+ * equal to pStckOrderSci
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaNomSciN7_1(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N11_1.
+ * Stop Save Images Proc.
+ * @param smDesc the procedure descriptor
+ */
+void CrIaNomSciN11_1(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N9_1.
+ * <pre>
+ * Set STCK_ORDER
+ * equal to pStckOrderCal2
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaNomSciN9_1(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N11.
+ * <pre>
+ * Start procedure
+ * Calibrate Full Snap
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaNomSciN11(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N4.
+ * Start Save Images Procedure
+ * @param smDesc the procedure descriptor
+ */
+void CrIaNomSciN4(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N5_1.
+ * <pre>
+ * Set STCK_ORDER
+ * equal to pStckOrderCal1
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaNomSciN5_1(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N8.
+ * <pre>
+ * Send ResetWin cmd
+ * to SDB State Machine
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaNomSciN8(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N12.
+ * Generate event report EVT_SC_PR_END with outcome "success"
+ * @param smDesc the procedure descriptor
+ */
+void CrIaNomSciN12(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION2 to N5.
+ *  pAcqFlag == TRUE 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaNomSciIsAcqFlagTrue(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N5 to DECISION3.
+ * <pre>
+ *  (Acquire Full Drop Proc.
+ * has terminated) 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaNomSciIsN5Finished(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION3 to N5_1.
+ *  pCal1Flag == TRUE 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaNomSciIsCal1FlagTrue(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N7 to DECISION4.
+ * <pre>
+ *  (Calibrate Full Snap Proc.
+ * has terminated) 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaNomSciIsN7Finished(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION4 to N7_1.
+ *  pSciFlag == TRUE 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaNomSciIsSciFlagTrue(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N9 to DECISION5.
+ * <pre>
+ *  (Science Window Stack/Snap
+ * Proc. has terminated) 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaNomSciIsN9Finished(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION5 to N9_1.
+ *  pCal2Flag == TRUE 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaNomSciIsCal2FlagTrue(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N11 to N11_1.
+ * <pre>
+ *  (Calibrate Full Snap Proc.
+ * has terminated) && Flag_1 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaNomSciIsN11Finished(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N13 to N11_1.
+ *  Flag_1 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaNomSciIsFlag1True(FwPrDesc_t prDesc);
+
+#endif /* CrIaNomSciCreate_H_ */
diff --git a/CrIa/src/CrIaPrSm/CrIaNomSciFunc.c b/CrIa/src/CrIaPrSm/CrIaNomSciFunc.c
new file mode 100644
index 0000000..1cce6cf
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaNomSciFunc.c
@@ -0,0 +1,530 @@
+/**
+ * @file CrIaNomSciFunc.c
+ * @ingroup CrIaPrSci
+ * @authors FW Profile code generator version 4.63; Institute for Astrophysics, 2015-2016
+ * @date Created on: Jun 3 2016 19:48:5
+ *
+ * @brief Implementation of the Nominal Science Procedure nodes and guards.
+ * Perform a nominal science sequence (acquisition, calibration, science, and calibration).
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include <FwProfile/FwSmConfig.h>
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwPrCore.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+#include <Services/General/CrIaConstants.h>
+
+/** CrIaNomSci function definitions */
+#include "CrIaNomSciCreate.h"
+
+#include <CrIaIasw.h> /* for Event Reporting and extern sm and prDescriptors */
+#include <CrIaPrSm/CrIaSdbCreate.h> /* for ResetWin etc. */
+
+#include <IfswDebug.h>
+
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N1. */
+void CrIaNomSciN1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short evt_data[2];
+  unsigned short ProcId = CRIA_SERV198_NOM_SCI_PR;
+
+  /* Generate event report EVT_SC_PR_STRT */
+
+  evt_data[0] = ProcId;
+  evt_data[1] = 0; /* NOT USED */
+
+  DEBUGP("Event %d generated to signal start of NOM SCI PR\n", ProcId);
+  CrIaEvtRep(1, CRIA_SERV5_EVT_SC_PR_STRT, evt_data, 4);
+
+  return;
+}
+
+/** Action for node N2. */
+void CrIaNomSciN2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char utemp8;
+  unsigned short utemp16;
+
+  /* N are datatype 8 -> need to be 16 */
+  CrIaCopy(NOMSCI_PSIBNFULL_ID, &utemp8);
+  utemp16 = (unsigned short) utemp8;
+  CrIaPaste(SIBNFULL_ID, &utemp16);
+
+  CrIaCopy(NOMSCI_PSIBNWIN_ID, &utemp8);
+  utemp16 = (unsigned short) utemp8;
+  CrIaPaste(SIBNWIN_ID, &utemp16);
+
+  CrIaCopy(NOMSCI_PCIBNFULL_ID, &utemp8);
+  utemp16 = (unsigned short) utemp8;
+  CrIaPaste(CIBNFULL_ID, &utemp16);
+
+  CrIaCopy(NOMSCI_PCIBNWIN_ID, &utemp8);
+  utemp16 = (unsigned short) utemp8;
+  CrIaPaste(CIBNWIN_ID, &utemp16);
+
+  CrIaCopy(NOMSCI_PGIBNFULL_ID, &utemp8);
+  utemp16 = (unsigned short) utemp8;
+  CrIaPaste(GIBNFULL_ID, &utemp16);
+
+  CrIaCopy(NOMSCI_PGIBNWIN_ID, &utemp8);
+  utemp16 = (unsigned short) utemp8;
+  CrIaPaste(GIBNWIN_ID, &utemp16);
+
+  /* sizes are compatible */
+  CrIaCopy(NOMSCI_PSIBSIZEFULL_ID, &utemp16);
+  CrIaPaste(SIBSIZEFULL_ID, &utemp16);
+
+  CrIaCopy(NOMSCI_PSIBSIZEWIN_ID, &utemp16);
+  CrIaPaste(SIBSIZEWIN_ID, &utemp16);
+
+  CrIaCopy(NOMSCI_PCIBSIZEFULL_ID, &utemp16);
+  CrIaPaste(CIBSIZEFULL_ID, &utemp16);
+
+  CrIaCopy(NOMSCI_PCIBSIZEWIN_ID, &utemp16);
+  CrIaPaste(CIBSIZEWIN_ID, &utemp16);
+
+  CrIaCopy(NOMSCI_PGIBSIZEFULL_ID, &utemp16);
+  CrIaPaste(GIBSIZEFULL_ID, &utemp16);
+
+  CrIaCopy(NOMSCI_PGIBSIZEWIN_ID, &utemp16);
+  CrIaPaste(GIBSIZEWIN_ID, &utemp16);
+
+  return;
+}
+
+/** Action for node N3. */
+void CrIaNomSciN3(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Configure SDB for operation in Full CCD Mode */
+  /* This is done by sending command Reset and then command ConfigFull to SDB State Machine */
+
+  FwSmMakeTrans(smDescSdb, Reset);
+  FwSmMakeTrans(smDescSdb, ConfigFull);
+
+  return;
+}
+
+/** Action for node N4. */
+void CrIaNomSciN4(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Start Save Images Procedure */
+  /* Procedure parameters determine wether the Save Images Procedure sends images to ground or wether it saves */
+  /* them to flash */
+
+  unsigned short saveTarget;
+  unsigned char pFbfInit, pFbfEnd;
+
+  /* Mantis 1988: copy save target from Nominal Science to Save Images data pool entry */
+  CrIaCopy(NOMSCI_PSAVETARGET_ID, &saveTarget);
+  CrIaPaste(SAVEIMAGES_PSAVETARGET_ID, &saveTarget);
+  
+  /* also initialize FbfId to FbfInit if the save target is the FLASH */
+  if (saveTarget == SAVETARGET_FLASH)
+    {
+      CrIaCopy(NOMSCI_PFBFINIT_ID, &pFbfInit);
+      CrIaCopy(NOMSCI_PFBFEND_ID, &pFbfEnd);
+      
+      CrIaPaste(SAVEIMAGES_PFBFINIT_ID, &pFbfInit);      
+      CrIaPaste(SAVEIMAGES_PFBFEND_ID, &pFbfEnd);
+    }
+  
+  FwPrStart(prDescSaveImages);
+
+  return;
+}
+
+/* --------------------------------------------------------------------------------------------------------- Acq --- */
+
+/** Action for node N5. */
+void CrIaNomSciN5(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned int expTimeAcq, imageRepAcq;
+
+  /* Start procedure Acquire Full Drop */
+  PRDEBUGP("NomSci: Start procedure Acquire Full Drop (Acq)\n");
+
+  /* enter parameters relevant for AcqFullDrop */
+  CrIaCopy(NOMSCI_PEXPTIMEACQ_ID, &expTimeAcq);
+  CrIaPaste(ACQFULLDROP_PEXPTIME_ID, &expTimeAcq);
+
+  CrIaCopy(NOMSCI_PIMAGEREPACQ_ID, &imageRepAcq);
+  CrIaPaste(ACQFULLDROP_PIMAGEREP_ID, &imageRepAcq);
+
+  FwPrStart(prDescAcqFullDrop);
+
+  return;
+}
+
+/* -------------------------------------------------------------------------------------------------------- Cal1 --- */
+
+/** Action for node N5_1. */
+void CrIaNomSciN5_1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Set STCK_ORDER equal to pStckOrderCal1 */
+  unsigned short StackingOrder;
+
+  CrIaCopy(NOMSCI_PSTCKORDERCAL1_ID, &StackingOrder);
+  CrIaPaste(STCK_ORDER_ID, &StackingOrder);
+
+  PRDEBUGP("NomSci: Stacking Order (Cal1) is: %d\n", StackingOrder);
+
+  return;
+}
+
+/** Action for node N6 / N10. */
+void CrIaNomSciSdbResetFull(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Send ResetFull command to SDB State Machine */
+
+  FwSmMakeTrans(smDescSdb, ResetFull);
+
+  return;
+}
+
+/** Action for node N7. */
+void CrIaNomSciN7(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short utemp16;
+  unsigned int utemp32;
+
+  /* NOTE: we need to copy the NOMSCI_ stuff to the CALFULLSNAP stuff before */
+
+  CrIaCopy(NOMSCI_PNMBIMAGESCAL1_ID, &utemp32);
+  CrIaPaste(CALFULLSNAP_PNMBIMAGES_ID, &utemp32);
+
+  CrIaCopy(NOMSCI_PEXPTIMECAL1_ID, &utemp32);
+  CrIaPaste(CALFULLSNAP_PEXPTIME_ID, &utemp32);
+
+  CrIaCopy(NOMSCI_PIMAGEREPCAL1_ID, &utemp32);
+  CrIaPaste(CALFULLSNAP_PIMAGEREP_ID, &utemp32);
+
+  CrIaCopy(NOMSCI_PCENTSELCAL1_ID, &utemp16);
+  CrIaPaste(CALFULLSNAP_PCENTSEL_ID, &utemp16);
+
+  /* Start procedure Calibrate Full Snap */
+
+  PRDEBUGP("NomSci: Start procedure Calibrate Full Snap (Cal1)\n");
+
+  FwPrStart(prDescCalFullSnap);
+
+  return;
+}
+
+/* --------------------------------------------------------------------------------------------------------- Sci --- */
+
+/** Action for node N7_1. */
+void CrIaNomSciN7_1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Set STCK_ORDER equal to pStckOrderSci */
+  unsigned short StackingOrder;
+
+  CrIaCopy(NOMSCI_PSTCKORDERSCI_ID, &StackingOrder);
+  CrIaPaste(STCK_ORDER_ID, &StackingOrder);
+
+  PRDEBUGP("Stacking Order (SCI) is: %d\n", StackingOrder);
+
+  return;
+}
+
+/** Action for node N8. */
+void CrIaNomSciN8(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Send ResetWin command to SDB State Machine */
+
+  FwSmMakeTrans(smDescSdb, ResetWin);
+
+  return;
+}
+
+/** Action for node N9. */
+void CrIaNomSciN9(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short utemp16;
+  unsigned int utemp32;
+
+  PRDEBUGP("--> starting compression via stack PR\n");
+
+  /* NOTE: we need to copy the NOMSCI_ stuff to the SCIWIN_ stuff before
+     we enter SciWin (with SciStack). So, for the 100th time, we need to check parameter sizes... */
+
+  CrIaCopy(NOMSCI_PNMBIMAGESSCI_ID, &utemp32);
+  CrIaPaste(SCIWIN_PNMBIMAGES_ID, &utemp32);
+
+  CrIaCopy(NOMSCI_PCCDRDMODESCI_ID, &utemp16);
+  CrIaPaste(SCIWIN_PCCDRDMODE_ID, &utemp16);
+
+  CrIaCopy(NOMSCI_PEXPTIMESCI_ID, &utemp32);
+  CrIaPaste(SCIWIN_PEXPTIME_ID, &utemp32);
+
+  CrIaCopy(NOMSCI_PIMAGEREPSCI_ID, &utemp32);
+  CrIaPaste(SCIWIN_PIMAGEREP_ID, &utemp32);
+
+  CrIaCopy(NOMSCI_PWINPOSXSCI_ID, &utemp16);
+  CrIaPaste(SCIWIN_PWINPOSX_ID, &utemp16);
+
+  CrIaCopy(NOMSCI_PWINPOSYSCI_ID, &utemp16);
+  CrIaPaste(SCIWIN_PWINPOSY_ID, &utemp16);
+
+  CrIaCopy(NOMSCI_PWINSIZEXSCI_ID, &utemp16);
+  CrIaPaste(SCIWIN_PWINSIZEX_ID, &utemp16);
+
+  CrIaCopy(NOMSCI_PWINSIZEYSCI_ID, &utemp16);
+  CrIaPaste(SCIWIN_PWINSIZEY_ID, &utemp16);
+
+  CrIaCopy(NOMSCI_PCENTSELSCI_ID, &utemp16);
+  CrIaPaste(SCIWIN_PCENTSEL_ID, &utemp16);
+
+  /* Start procedure Science Window Stack/Snap */
+
+  FwPrStart(prDescSciStack);
+
+  return;
+}
+
+/* -------------------------------------------------------------------------------------------------------- Cal2 --- */
+
+/** Action for node N9_1. */
+void CrIaNomSciN9_1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Set STCK_ORDER equal to pStckOrderCal2 */
+  unsigned short StackingOrder;
+
+  CrIaCopy(NOMSCI_PSTCKORDERCAL2_ID, &StackingOrder);
+  CrIaPaste(STCK_ORDER_ID, &StackingOrder);
+
+  PRDEBUGP("NomSci: Stacking Order (CAL2) is: %d\n", StackingOrder);
+
+  return;
+}
+
+/** Action for node N11. */
+void CrIaNomSciN11(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short utemp16;
+  unsigned int utemp32;
+
+  /* NOTE: we need to copy the NOMSCI_ stuff to the CALFULLSNAP stuff before */
+
+  CrIaCopy(NOMSCI_PNMBIMAGESCAL2_ID, &utemp32);
+  CrIaPaste(CALFULLSNAP_PNMBIMAGES_ID, &utemp32);
+
+  CrIaCopy(NOMSCI_PEXPTIMECAL2_ID, &utemp32);
+  CrIaPaste(CALFULLSNAP_PEXPTIME_ID, &utemp32);
+
+  CrIaCopy(NOMSCI_PIMAGEREPCAL2_ID, &utemp32);
+  CrIaPaste(CALFULLSNAP_PIMAGEREP_ID, &utemp32);
+
+  CrIaCopy(NOMSCI_PCENTSELCAL2_ID, &utemp16);
+  CrIaPaste(CALFULLSNAP_PCENTSEL_ID, &utemp16);
+
+  /* Start procedure Calibrate Full Snap */
+
+  PRDEBUGP("NomSci: Start procedure Calibrate Full Snap (Cal2)\n");
+
+  FwPrStart(prDescCalFullSnap);
+
+  return;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N11_1. */
+void CrIaNomSciN11_1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Stop Save Images Procedure */
+
+  FwPrStop(prDescSaveImages);
+
+  return;
+}
+
+/** Action for node N12. */
+void CrIaNomSciN12(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short evt_data[2];
+  unsigned short ProcId = CRIA_SERV198_NOM_SCI_PR;
+
+  /* Generate event report EVT_SC_PR_END with outcome "success" */
+
+  evt_data[0] = ProcId;
+  evt_data[1] = 1; /* 1 means success */
+  DEBUGP("Event %d generated to signal end (but not stop) of NOM SCI PR\n", ProcId);
+  CrIaEvtRep(1, CRIA_SERV5_EVT_SC_PR_END, evt_data, 4);
+
+  return;
+}
+
+/**************/
+/*** GUARDS ***/
+/**************/
+
+/** Guard on the Control Flow from DECISION2 to N5. */
+FwPrBool_t CrIaNomSciIsAcqFlagTrue(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char pAcqFlag;
+
+  /* if pAcqFlag is TRUE then proceed to N5 (start procedure Acquire Full Drop) */
+
+  CrIaCopy(NOMSCI_PACQFLAG_ID, &pAcqFlag);
+
+  if (pAcqFlag)
+    return 1;
+
+  return 0;
+}
+
+/** Guard on the Control Flow from N5 to DECISION3. */
+FwPrBool_t CrIaNomSciIsN5Finished(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short status;
+
+  /* Acquire Full Drop Proc. has terminated ? */
+  status = FwPrIsStarted(prDescAcqFullDrop);
+
+  if (status != PR_STOPPED)
+    return 0;
+
+  return 1;
+}
+
+/** Guard on the Control Flow from DECISION3 to N5_1. */
+FwPrBool_t CrIaNomSciIsCal1FlagTrue(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char pCal1Flag;
+
+  /* if pCal1Flag is TRUE then proceed to N5_1 (set STCK_ORDER) */
+
+  CrIaCopy(NOMSCI_PCAL1FLAG_ID, &pCal1Flag);
+
+  PRDEBUGP("Cal Flag is: %d\n", pCal1Flag);
+
+  if (pCal1Flag)
+    return 1;
+
+  return 0;
+}
+
+/** Guard on the Control Flow from N7 to DECISION4. */
+FwPrBool_t CrIaNomSciIsN7Finished(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short status;
+
+  /* Calibrate Full Snap Proc. has terminated ? */
+  status = FwPrIsStarted(prDescCalFullSnap);
+
+  if (status != PR_STOPPED)
+    return 0;
+
+  return 1;
+}
+
+/** Guard on the Control Flow from DECISION4 to N7_1. */
+FwPrBool_t CrIaNomSciIsSciFlagTrue(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char pSciFlag;
+
+  /* if pSciFlag is TRUE then proceed to N7_1 (set STCK_ORDER) */
+
+  CrIaCopy(NOMSCI_PSCIFLAG_ID, &pSciFlag);
+
+  if (pSciFlag)
+    return 1;
+
+  return 0;
+}
+
+/** Guard on the Control Flow from N9 to DECISION5. */
+FwPrBool_t CrIaNomSciIsN9Finished(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short status;
+
+  /* Science Window Stack/Snap Proc. has terminated ? */
+
+  status = FwPrIsStarted(prDescSciStack);
+
+  if (status != PR_STOPPED)
+    return 0;
+
+  return 1;
+}
+
+/** Guard on the Control Flow from DECISION5 to N9_1. */
+FwPrBool_t CrIaNomSciIsCal2FlagTrue(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char pCal2Flag;
+
+  /* if pCal2Flag is TRUE then proceed to N13 (set STCK_ORDER) */
+
+  CrIaCopy(NOMSCI_PCAL2FLAG_ID, &pCal2Flag);
+
+  if (pCal2Flag)
+    return 1;
+
+  return 0;
+}
+
+/** Guard on the Control Flow from N11 to N11_1. */
+FwPrBool_t CrIaNomSciIsN11Finished(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short gibOut, gibIn;
+  unsigned short status;
+
+  PRDEBUGP("xxx CrIaNomSciIsN11Finished xxx\n");
+
+  /* Calibrate Full Snap Proc. has terminated ? */
+  status = FwPrIsStarted(prDescCalFullSnap);
+
+  /* Flag_1 is true if the Save Images Proc. has finished its job (i.e. if gibIn is equal to gibOut) */
+
+  /* get relevant GIB sizes */
+  CrIaCopy(GIBOUT_ID, &gibOut);
+  CrIaCopy(GIBIN_ID, &gibIn);
+
+  if (status == PR_STOPPED)
+    {
+      if (gibOut == gibIn)
+        return 1;
+    }
+
+  return 0;
+}
+
+/** Guard on the Control Flow from N13 to N11_1. */
+FwPrBool_t CrIaNomSciIsFlag1True(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short gibOut, gibIn;
+
+  /* Flag_1 is true if the Save Images Proc. has finished its job (i.e. if gibIn is equal to gibOut) */
+
+  /* get relevant GIB sizes */
+  CrIaCopy(GIBOUT_ID, &gibOut);
+  CrIaCopy(GIBIN_ID, &gibIn);
+
+  if (gibOut == gibIn)
+    return 1;
+
+  return 0;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaNomSciInit.txt b/CrIa/src/CrIaPrSm/CrIaNomSciInit.txt
new file mode 100644
index 0000000..7932775
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaNomSciInit.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaNomSciCreate(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaNomSci is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaNomSci is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaPrepSciCreate.c b/CrIa/src/CrIaPrSm/CrIaPrepSciCreate.c
new file mode 100644
index 0000000..9d1c01f
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaPrepSciCreate.c
@@ -0,0 +1,75 @@
+/**
+ * @file CrIaPrepSciCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:46
+ */
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaPrepSci function definitions */
+#include "CrIaPrepSciCreate.h"
+
+/** CrIaPrepSci function definitions */
+#include <stdlib.h>
+
+/**
+ * Action for node PREPSC4.
+ * Do Nothing
+ * @param smDesc the procedure descriptor
+ */
+static void code34502(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+	return;
+}
+
+/**
+ * Guard on the Control Flow from DECISION1 to PREPSC5.
+ *  Else
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code26134(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaPrepSciCreate(void* prData)
+{
+  const FwPrCounterU2_t DECISION1 = 1;		/* The identifier of decision node DECISION1 in procedure CrIaPrepSci */
+  const FwPrCounterU2_t N_OUT_OF_DECISION1 = 3;	/* The number of control flows out of decision node DECISION1 in procedure CrIaPrepSci */
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+                        6,	/* N_ANODES - The number of action nodes */
+                        1,	/* N_DNODES - The number of decision nodes */
+                        10,	/* N_FLOWS - The number of control flows */
+                        5,	/* N_ACTIONS - The number of actions */
+                        6	/* N_GUARDS - The number of guards */
+                      );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddDecisionNode(prDesc, DECISION1, N_OUT_OF_DECISION1);
+  FwPrAddActionNode(prDesc, CrIaPrepSci_PREPSC1, &CrIaPrepSciSwitchOff);
+  FwPrAddActionNode(prDesc, CrIaPrepSci_PREPSC2, &CrIaPrepSciSwitchOn);
+  FwPrAddActionNode(prDesc, CrIaPrepSci_PREPSC3, &CrIaPrepSciGoToStab);
+  FwPrAddActionNode(prDesc, CrIaPrepSci_PREPSC4, &code34502);
+  FwPrAddActionNode(prDesc, CrIaPrepSci_PREPSC5, &CrIaPrepSciGenEvt);
+  FwPrAddActionNode(prDesc, CrIaPrepSci_PREPSC6, &CrIaPrepSciGoToStab);
+  FwPrAddFlowIniToDec(prDesc, DECISION1, NULL);
+  FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaPrepSci_PREPSC1, &CrIaPrepSciIsOff);
+  FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaPrepSci_PREPSC4, &CrIaPrepSciIsInStabOrHigher);
+  FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaPrepSci_PREPSC5, &code26134);
+  FwPrAddFlowActToAct(prDesc, CrIaPrepSci_PREPSC1, CrIaPrepSci_PREPSC2, &CrIaPrepSciIsOff);
+  FwPrAddFlowActToAct(prDesc, CrIaPrepSci_PREPSC2, CrIaPrepSci_PREPSC3, &CrIaPrepSciIsInStandBy);
+  FwPrAddFlowActToFin(prDesc, CrIaPrepSci_PREPSC3, &CrIaPrepSciIsInStab);
+  FwPrAddFlowActToAct(prDesc, CrIaPrepSci_PREPSC4, CrIaPrepSci_PREPSC6, &CrIsPrepSciIsNonTransState);
+  FwPrAddFlowActToFin(prDesc, CrIaPrepSci_PREPSC5, NULL);
+  FwPrAddFlowActToFin(prDesc, CrIaPrepSci_PREPSC6, &CrIaPrepSciIsInStab);
+
+  return prDesc;
+}
diff --git a/CrIa/src/CrIaPrSm/CrIaPrepSciCreate.h b/CrIa/src/CrIaPrSm/CrIaPrepSciCreate.h
new file mode 100644
index 0000000..34d005e
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaPrepSciCreate.h
@@ -0,0 +1,127 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaPrepSci procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ * @image html CrIaPrepSci.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:46
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaPrepSciCreate_H_
+#define CrIaPrepSciCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaPrepSci_PREPSC1 1		/* The identifier of action node PREPSC1 in procedure CrIaPrepSci */
+#define CrIaPrepSci_PREPSC2 2		/* The identifier of action node PREPSC2 in procedure CrIaPrepSci */
+#define CrIaPrepSci_PREPSC3 3		/* The identifier of action node PREPSC3 in procedure CrIaPrepSci */
+#define CrIaPrepSci_PREPSC4 4		/* The identifier of action node PREPSC4 in procedure CrIaPrepSci */
+#define CrIaPrepSci_PREPSC5 5		/* The identifier of action node PREPSC5 in procedure CrIaPrepSci */
+#define CrIaPrepSci_PREPSC6 6		/* The identifier of action node PREPSC6 in procedure CrIaPrepSci */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaPrepSciCreate(void* prData);
+
+/**
+ * Action for node PREPSC1.
+ * <pre>
+ * Send SwitchOff
+ * Command to SEM Unit SM
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaPrepSciSwitchOff(FwPrDesc_t prDesc);
+
+/**
+ * Action for node PREPSC2.
+ * <pre>
+ * Send SwitchOn
+ * Command to SEM Unit SM
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaPrepSciSwitchOn(FwPrDesc_t prDesc);
+
+/**
+ * Action for node PREPSC3 and PREPSC6.
+ * <pre>
+ * Send GoToStabilize
+ * Command to SEM Unit SM
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaPrepSciGoToStab(FwPrDesc_t prDesc);
+
+/**
+ * Action for node PREPSC5.
+ * Generate EVT_SEM_ILL_ST with SEM
+ * Unit SM and SEM Operational SM states as parameters
+ * @param smDesc the procedure descriptor
+ */
+void CrIaPrepSciGenEvt(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION1 to PREPSC1.
+ *  SEM Unit SM is in OFF  
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaPrepSciIsOff(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION1 to PREPSC4.
+ * <pre>
+ *  SEM Operational SM is in STABILIZE 
+ * or Higher State 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaPrepSciIsInStabOrHigher(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from PREPSC2 to PREPSC3.
+ *  SEM Unit SM is in STANDBY 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaPrepSciIsInStandBy(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from PREPSC3 to Final Node.
+ *  SEM Unit SM is in STABILIZE 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaPrepSciIsInStab(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from PREPSC4 to PREPSC6.
+ * <pre>
+ *  SEM Operational SM is in
+ * non-transitory state 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIsPrepSciIsNonTransState(FwPrDesc_t prDesc);
+
+#endif /* CrIaPrepSciCreate_H_ */
diff --git a/CrIa/src/CrIaPrSm/CrIaPrepSciFunc.c b/CrIa/src/CrIaPrSm/CrIaPrepSciFunc.c
new file mode 100644
index 0000000..30e30bd
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaPrepSciFunc.c
@@ -0,0 +1,208 @@
+/**
+ * @file CrIaPrepSciFunc.c
+ * @ingroup CrIaPr
+ * @authors FW Profile code generator version 4.63; Institute for Astrophysics, 2015-2016
+ * @date Created on: Jun 3 2016 19:48:4
+ *
+ * @brief Implementation of the Prepare Science Procedure nodes and guards.
+ * It belongs to Service 193 (IASW Mode Control Service) which allows the OBC or the
+ * Ground to command mode changes to the IASW.
+ * In state PRE_SCIENCE of the IASW State Machine, the Prepare Science Procedure of is executed.
+ * This procedure is responsible for bringing the SEM into STABILIZE.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include <FwProfile/FwSmConstants.h>
+#include <FwProfile/FwSmDCreate.h>
+#include <FwProfile/FwSmConfig.h>
+#include <FwProfile/FwSmCore.h>
+
+#include <FwProfile/FwPrConstants.h>
+#include <FwProfile/FwPrDCreate.h>
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwPrCore.h>
+
+/** CrIaIasw function definitions */
+#include <CrIaPrSm/CrIaIaswCreate.h>
+
+/** CrIaSem function definitions */
+#include <CrIaPrSm/CrIaSemCreate.h>
+
+#include <Services/General/CrIaConstants.h>
+
+/** CrIaPrepSci function definitions */
+#include "CrIaPrepSciCreate.h"
+
+#include <CrIaIasw.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <IfswDebug.h>
+
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node PREPSC1. */
+void CrIaPrepSciSwitchOff(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Send SwitchOff Command to SEM Unit SM */
+  FwSmMakeTrans(smDescSem, SwitchOff);
+
+  return;
+}
+
+/** Action for node PREPSC2. */
+void CrIaPrepSciSwitchOn(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Send SwitchOn Command to SEM Unit SM */
+  FwSmMakeTrans(smDescSem, SwitchOn);
+
+  return;
+}
+
+/** Action for node PREPSC3 / PREPSC6. */
+void CrIaPrepSciGoToStab(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Send GoToStabilize Command to SEM Unit SM */
+  FwSmMakeTrans(smDescSem, GoToStabilize);
+
+  return;
+}
+
+/** Action for node PREPSC5. */
+void CrIaPrepSciGenEvt(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short evt_data[2];
+
+  /* Generate EVT_SEM_ILL_ST with SEM Unit SM and SEM Operational SM states as parameters */
+  evt_data[0] = FwSmGetCurState(smDescSem); /* report current SEM state */
+  evt_data[1] = FwSmGetCurStateEmb(smDescSem); /* report current SEM OPER state */
+
+  CrIaEvtRep(3, CRIA_SERV5_EVT_SEM_ILL_ST, evt_data, 4);
+
+  return;
+}
+
+/** Guard on the Control Flow from DECISION1 to PREPSC1 / PREPSC1 to PREPSC2. */
+FwPrBool_t CrIaPrepSciIsOff(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short sem_state;
+
+  /* Check for SEM Unit SM is in OFF */
+  /* get current state */
+  sem_state = FwSmGetCurState(smDescSem);
+
+  if (sem_state == CrIaSem_OFF)
+    return 1;
+
+  return 0;
+}
+
+/** Guard on the Control Flow from DECISION1 to PREPSC4. */
+FwPrBool_t CrIaPrepSciIsInStabOrHigher(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short sem_oper_state;
+
+  /* Check for SEM Unit SM is in STABILIZE or Higher State */
+  /* get current state */
+  sem_oper_state = FwSmGetCurStateEmb(smDescSem);
+
+  if ((sem_oper_state == CrIaSem_STABILIZE) | /* Transition states are ignored */
+      (sem_oper_state == CrIaSem_DIAGNOSTICS) |
+      (sem_oper_state == CrIaSem_CCD_WINDOW) |
+      (sem_oper_state == CrIaSem_CCD_FULL))
+    return 1;
+
+  return 0;
+}
+
+#define DELAY_3S 24
+
+/** Guard on the Control Flow from PREPSC2 to PREPSC3. */
+FwPrBool_t CrIaPrepSciIsInStandBy(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short sem_oper_state;
+  static unsigned int delay;
+  
+  /* Check for SEM Unit SM is in STANDBY */
+  /* get current state */
+  sem_oper_state = FwSmGetCurStateEmb(smDescSem);
+
+  if (sem_oper_state == CrIaSem_STANDBY)
+    {
+      /* NOTE: FwPrGetNodeExecCnt(prDesc) does not work here, we have to use a static counter, because this guard is already 
+	 active as soon as SEM is switched on and has a large value when we enter standby */
+      if (delay < DELAY_3S)
+        {
+	  delay++;
+	  /*          PRDEBUGP("delaying GoToStabilize %d\n", FwPrGetNodeExecCnt(prDesc));  */
+          return 0;
+        }
+      else
+        {
+	  /* reset static counter */
+	  delay = 0;
+          return 1;
+        }
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/** Guard on the Control Flow from PREPSC3 to Final Node. */
+FwPrBool_t CrIaPrepSciIsInStab(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short sem_oper_state;
+
+  /* Check for SEM Unit SM is in STABILIZE */
+  /* get current state */
+  sem_oper_state = FwSmGetCurStateEmb(smDescSem);
+
+  if (sem_oper_state == CrIaSem_STABILIZE)
+    return 1;
+
+  return 0;
+}
+
+/** Guard on the Control Flow from PREPSC4 to PREPSC6. */
+FwPrBool_t CrIsPrepSciIsNonTransState(FwPrDesc_t prDesc)
+{
+  unsigned short sem_oper_state;
+
+  CRFW_UNUSED(prDesc);
+
+  /* Check for SEM Operational SM is in non-transitory state */
+
+  /* get current state */
+  sem_oper_state = FwSmGetCurStateEmb(smDescSem);
+
+  if ((sem_oper_state != CrIaSem_TR_CCD_WINDOW) &&
+      (sem_oper_state != CrIaSem_TR_CCD_FULL))
+    { 
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaPrepSciInit.txt b/CrIa/src/CrIaPrSm/CrIaPrepSciInit.txt
new file mode 100644
index 0000000..d996226
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaPrepSciInit.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaPrepSciCreate(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaPrepSci is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaPrepSci is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaPrgAct6s2Create.c b/CrIa/src/CrIaPrSm/CrIaPrgAct6s2Create.c
new file mode 100644
index 0000000..c3f5a8a
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaPrgAct6s2Create.c
@@ -0,0 +1,59 @@
+/**
+ * @file CrIaPrgAct6s2Create.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaPrgAct6s2 function definitions */
+#include "CrIaPrgAct6s2Create.h"
+
+/**
+ * Guard on the Control Flow from DECISION1 to MEMLOAD4.
+ *  Read-Back Data are Incorrect
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code88379(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaPrgAct6s2Create(void* prData)
+{
+  const FwPrCounterU2_t DECISION1 = 1;		/* The identifier of decision node DECISION1 in procedure CrIaPrgAct6s2 */
+  const FwPrCounterU2_t N_OUT_OF_DECISION1 = 2;	/* The number of control flows out of decision node DECISION1 in procedure CrIaPrgAct6s2 */
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+                        4,	/* N_ANODES - The number of action nodes */
+                        1,	/* N_DNODES - The number of decision nodes */
+                        7,	/* N_FLOWS - The number of control flows */
+                        4,	/* N_ACTIONS - The number of actions */
+                        2	/* N_GUARDS - The number of guards */
+                      );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddActionNode(prDesc, CrIaPrgAct6s2_MEMLOAD1, &CrIaPrgAct6s2PatchData);
+  FwPrAddActionNode(prDesc, CrIaPrgAct6s2_MEMLOAD2, &CrIaPrgAct6s2ReadData);
+  FwPrAddDecisionNode(prDesc, DECISION1, N_OUT_OF_DECISION1);
+  FwPrAddActionNode(prDesc, CrIaPrgAct6s2_MEMLOAD3, &CrIaPrgAct6s2Completed);
+  FwPrAddActionNode(prDesc, CrIaPrgAct6s2_MEMLOAD4, &CrIaPrgAct6s2Failed);
+  FwPrAddFlowIniToAct(prDesc, CrIaPrgAct6s2_MEMLOAD1, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaPrgAct6s2_MEMLOAD1, CrIaPrgAct6s2_MEMLOAD2, NULL);
+  FwPrAddFlowActToDec(prDesc, CrIaPrgAct6s2_MEMLOAD2, DECISION1, NULL);
+  FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaPrgAct6s2_MEMLOAD3, &CrIaPrgAct6s2IsReadDataCorrect);
+  FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaPrgAct6s2_MEMLOAD4, &code88379);
+  FwPrAddFlowActToFin(prDesc, CrIaPrgAct6s2_MEMLOAD3, NULL);
+  FwPrAddFlowActToFin(prDesc, CrIaPrgAct6s2_MEMLOAD4, NULL);
+
+  return prDesc;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaPrgAct6s2Create.h b/CrIa/src/CrIaPrSm/CrIaPrgAct6s2Create.h
new file mode 100644
index 0000000..0195783
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaPrgAct6s2Create.h
@@ -0,0 +1,83 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaPrgAct6s2 procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ * @image html CrIaPrgAct6s2.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaPrgAct6s2Create_H_
+#define CrIaPrgAct6s2Create_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaPrgAct6s2_MEMLOAD1 1		/* The identifier of action node MEMLOAD1 in procedure CrIaPrgAct6s2 */
+#define CrIaPrgAct6s2_MEMLOAD2 2		/* The identifier of action node MEMLOAD2 in procedure CrIaPrgAct6s2 */
+#define CrIaPrgAct6s2_MEMLOAD3 3		/* The identifier of action node MEMLOAD3 in procedure CrIaPrgAct6s2 */
+#define CrIaPrgAct6s2_MEMLOAD4 4		/* The identifier of action node MEMLOAD4 in procedure CrIaPrgAct6s2 */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaPrgAct6s2Create(void* prData);
+
+/**
+ * Action for node MEMLOAD1.
+ * Patch data to their destination 
+ * @param smDesc the procedure descriptor
+ */
+void CrIaPrgAct6s2PatchData(FwPrDesc_t prDesc);
+
+/**
+ * Action for node MEMLOAD2.
+ * Read back patched data 
+ * @param smDesc the procedure descriptor
+ */
+void CrIaPrgAct6s2ReadData(FwPrDesc_t prDesc);
+
+/**
+ * Action for node MEMLOAD3.
+ * <pre>
+ * 
+ * Set action outcome to "completed"
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaPrgAct6s2Completed(FwPrDesc_t prDesc);
+
+/**
+ * Action for node MEMLOAD4.
+ * <pre>
+ * 
+ * Set action outcome to "failed"
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaPrgAct6s2Failed(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION1 to MEMLOAD3.
+ *  Read-Back Data are Correct 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaPrgAct6s2IsReadDataCorrect(FwPrDesc_t prDesc);
+
+#endif /* CrIaPrgAct6s2Create_H_ */
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaPrgAct6s2Func.c b/CrIa/src/CrIaPrSm/CrIaPrgAct6s2Func.c
new file mode 100644
index 0000000..16ef372
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaPrgAct6s2Func.c
@@ -0,0 +1,53 @@
+/**
+ * @file CrIaPrgAct6s2Func.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+#include "FwProfile/FwPrCore.h"
+
+/** CrIaPrgAct6s2 function definitions */
+#include "CrIaPrgAct6s2Create.h"
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node MEMLOAD1. */
+void CrIaPrgAct6s2PatchData(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return;
+}
+
+/** Action for node MEMLOAD2. */
+void CrIaPrgAct6s2ReadData(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return;
+}
+
+/** Action for node MEMLOAD3. */
+void CrIaPrgAct6s2Completed(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return;
+}
+
+/** Action for node MEMLOAD4. */
+void CrIaPrgAct6s2Failed(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return;
+}
+
+/** Guard on the Control Flow from DECISION1 to MEMLOAD3. */
+FwPrBool_t CrIaPrgAct6s2IsReadDataCorrect(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaPrgAct6s2Init.txt b/CrIa/src/CrIaPrSm/CrIaPrgAct6s2Init.txt
new file mode 100644
index 0000000..da50522
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaPrgAct6s2Init.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaPrgAct6s2Create(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaPrgAct6s2 is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaPrgAct6s2 is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSaaEvalAlgoExecCreate.c b/CrIa/src/CrIaPrSm/CrIaSaaEvalAlgoExecCreate.c
new file mode 100644
index 0000000..563a2ef
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSaaEvalAlgoExecCreate.c
@@ -0,0 +1,72 @@
+/**
+ * @file CrIaSaaEvalAlgoExecCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaSaaEvalAlgoExec function definitions */
+#include "CrIaSaaEvalAlgoExecCreate.h"
+
+/**
+ * Action for node N5.
+ * NOP
+ * @param smDesc the procedure descriptor
+ */
+static void code63784(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return;
+}
+
+/**
+ * Guard on the Control Flow from DECISION1 to N1.
+ *  saaCounter == 0
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code24409(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaSaaEvalAlgoExecCreate(void* prData)
+{
+  const FwPrCounterU2_t DECISION1 = 1;		/* The identifier of decision node DECISION1 in procedure CrIaSaaEvalAlgoExec */
+  const FwPrCounterU2_t N_OUT_OF_DECISION1 = 3;	/* The number of control flows out of decision node DECISION1 in procedure CrIaSaaEvalAlgoExec */
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+                        5,	/* N_ANODES - The number of action nodes */
+                        1,	/* N_DNODES - The number of decision nodes */
+                        9,	/* N_FLOWS - The number of control flows */
+                        5,	/* N_ACTIONS - The number of actions */
+                        4	/* N_GUARDS - The number of guards */
+                      );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddDecisionNode(prDesc, DECISION1, N_OUT_OF_DECISION1);
+  FwPrAddActionNode(prDesc, CrIaSaaEvalAlgoExec_N1, &CrIaSaaEvalAlgoExecN1);
+  FwPrAddActionNode(prDesc, CrIaSaaEvalAlgoExec_N2, &CrIaSaaEvalAlgoExecN2);
+  FwPrAddActionNode(prDesc, CrIaSaaEvalAlgoExec_N3, &CrIaSaaEvalAlgoExecN3);
+  FwPrAddActionNode(prDesc, CrIaSaaEvalAlgoExec_N4, &CrIaSaaEvalAlgoExecN4);
+  FwPrAddActionNode(prDesc, CrIaSaaEvalAlgoExec_N5, &code63784);
+  FwPrAddFlowIniToDec(prDesc, DECISION1, NULL);
+  FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaSaaEvalAlgoExec_N2, &CrIaSaaEvalAlgoExecIsCntLow);
+  FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaSaaEvalAlgoExec_N3, &CrIaSaaEvalAlgoExecIsCntHigh);
+  FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaSaaEvalAlgoExec_N1, &code24409);
+  FwPrAddFlowActToAct(prDesc, CrIaSaaEvalAlgoExec_N1, CrIaSaaEvalAlgoExec_N5, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaSaaEvalAlgoExec_N2, CrIaSaaEvalAlgoExec_N5, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaSaaEvalAlgoExec_N3, CrIaSaaEvalAlgoExec_N4, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaSaaEvalAlgoExec_N4, CrIaSaaEvalAlgoExec_N5, NULL);
+  FwPrAddFlowActToDec(prDesc, CrIaSaaEvalAlgoExec_N5, DECISION1, &CrIaSaaEvalAlgoExecIsNextExec);
+
+  return prDesc;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSaaEvalAlgoExecCreate.h b/CrIa/src/CrIaPrSm/CrIaSaaEvalAlgoExecCreate.h
new file mode 100644
index 0000000..d554a74
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSaaEvalAlgoExecCreate.h
@@ -0,0 +1,99 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaSaaEvalAlgoExec procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ *
+ * <b>Note for Control Flow from N5 to DECISION1</b>
+ * This guard returns true if the Node Execution Counter (as returned by 
+ * FwPrGetNodeExecCnt) is equal to 1.
+ *
+ * @image html CrIaSaaEvalAlgoExec.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaSaaEvalAlgoExecCreate_H_
+#define CrIaSaaEvalAlgoExecCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaSaaEvalAlgoExec_N1 1		/* The identifier of action node N1 in procedure CrIaSaaEvalAlgoExec */
+#define CrIaSaaEvalAlgoExec_N2 2		/* The identifier of action node N2 in procedure CrIaSaaEvalAlgoExec */
+#define CrIaSaaEvalAlgoExec_N3 3		/* The identifier of action node N3 in procedure CrIaSaaEvalAlgoExec */
+#define CrIaSaaEvalAlgoExec_N4 4		/* The identifier of action node N4 in procedure CrIaSaaEvalAlgoExec */
+#define CrIaSaaEvalAlgoExec_N5 5		/* The identifier of action node N5 in procedure CrIaSaaEvalAlgoExec */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaSaaEvalAlgoExecCreate(void* prData);
+
+/**
+ * Action for node N1.
+ * isSaaActive = TRUE
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSaaEvalAlgoExecN1(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N2.
+ * saaCounter = 0
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSaaEvalAlgoExecN2(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N3.
+ * isSaaActive = FALSE
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSaaEvalAlgoExecN3(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N4.
+ * saaCounter = saaCounter - SAA_EVAL_PER
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSaaEvalAlgoExecN4(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION1 to N2.
+ *   0 < saaCounter < SAA_EVAL_PER 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSaaEvalAlgoExecIsCntLow(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION1 to N3.
+ *  saaCounter >= SAA_EVAL_PER 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSaaEvalAlgoExecIsCntHigh(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N5 to DECISION1.
+ *  Next Execution 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSaaEvalAlgoExecIsNextExec(FwPrDesc_t prDesc);
+
+#endif /* CrIaSaaEvalAlgoExecCreate_H_ */
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSaaEvalAlgoExecFunc.c b/CrIa/src/CrIaPrSm/CrIaSaaEvalAlgoExecFunc.c
new file mode 100644
index 0000000..545c2e3
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSaaEvalAlgoExecFunc.c
@@ -0,0 +1,140 @@
+/**
+ * @file CrIaSaaEvalAlgoExecFunc.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+#include "FwProfile/FwPrCore.h"
+
+/** CrIaSaaEvalAlgoExec function definitions */
+#include "CrIaSaaEvalAlgoExecCreate.h"
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N1. */
+void CrIaSaaEvalAlgoExecN1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char isSaaActive;
+
+  /* isSaaActive = TRUE */
+
+  isSaaActive = 1;
+  CrIaPaste(ISSAAACTIVE_ID, &isSaaActive);
+
+  return;
+}
+
+/** Action for node N2. */
+void CrIaSaaEvalAlgoExecN2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned int saaCounter;
+
+  /* saaCounter = 0 */
+
+  saaCounter = 0;
+  CrIaPaste(SAACOUNTER_ID, &saaCounter);
+
+  return;
+}
+
+/** Action for node N3. */
+void CrIaSaaEvalAlgoExecN3(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char isSaaActive;
+
+  /* isSaaActive = FALSE */
+
+  isSaaActive = 0;
+  CrIaPaste(ISSAAACTIVE_ID, &isSaaActive);
+
+  return;
+}
+
+/** Action for node N4. */
+void CrIaSaaEvalAlgoExecN4(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned int saaCounter;
+  int saaExecPer;
+
+  /* saaCounter = saaCounter - SAA_EVAL_PER */ 
+
+  CrIaCopy(SAACOUNTER_ID, &saaCounter);
+  CrIaCopy(SAA_EXEC_PER_ID, &saaExecPer);
+
+  saaCounter -= saaExecPer;
+
+  CrIaPaste(SAACOUNTER_ID, &saaCounter);
+
+  return;
+}
+
+/** Guard on the Control Flow from DECISION1 to N2. */
+FwPrBool_t CrIaSaaEvalAlgoExecIsCntLow(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned int saaCounter;
+  int saaExecPer;
+
+  /* 0 < saaCounter < SAA_EVAL_PER */
+
+  CrIaCopy(SAACOUNTER_ID, &saaCounter);
+  CrIaCopy(SAA_EXEC_PER_ID, &saaExecPer);
+
+  if ((saaCounter > 0) && (saaCounter < (unsigned int)saaExecPer))
+    {
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/** Guard on the Control Flow from DECISION1 to N3. */
+FwPrBool_t CrIaSaaEvalAlgoExecIsCntHigh(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned int saaCounter;
+  int saaExecPer;
+
+  /* saaCounter >= SAA_EVAL_PER */
+
+  CrIaCopy(SAACOUNTER_ID, &saaCounter);
+  CrIaCopy(SAA_EXEC_PER_ID, &saaExecPer);
+
+  if (saaCounter >= (unsigned int)saaExecPer)
+    {
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/** Guard on the Control Flow from N5 to DECISION1. */
+FwPrBool_t CrIaSaaEvalAlgoExecIsNextExec(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Next Execution */
+
+  if (FwPrGetNodeExecCnt(prDesc))
+    {
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaSaaEvalAlgoExecInit.txt b/CrIa/src/CrIaPrSm/CrIaSaaEvalAlgoExecInit.txt
new file mode 100644
index 0000000..52dbaf3
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSaaEvalAlgoExecInit.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaSaaEvalAlgoExecCreate(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaSaaEvalAlgoExec is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaSaaEvalAlgoExec is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSaveImagesCreate.c b/CrIa/src/CrIaPrSm/CrIaSaveImagesCreate.c
new file mode 100644
index 0000000..43206d4
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSaveImagesCreate.c
@@ -0,0 +1,61 @@
+/**
+ * @file CrIaSaveImagesCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaSaveImages function definitions */
+#include "CrIaSaveImagesCreate.h"
+
+/**
+ * Guard on the Control Flow from DECISION1 to N5.
+ *  pSaveTarget == FLASH
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code66587(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaSaveImagesCreate(void* prData)
+{
+  const FwPrCounterU2_t DECISION1 = 1;		/* The identifier of decision node DECISION1 in procedure CrIaSaveImages */
+  const FwPrCounterU2_t N_OUT_OF_DECISION1 = 2;	/* The number of control flows out of decision node DECISION1 in procedure CrIaSaveImages */
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+                        5,	/* N_ANODES - The number of action nodes */
+                        1,	/* N_DNODES - The number of decision nodes */
+                        8,	/* N_FLOWS - The number of control flows */
+                        5,	/* N_ACTIONS - The number of actions */
+                        5	/* N_GUARDS - The number of guards */
+                      );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddActionNode(prDesc, CrIaSaveImages_N2, &CrIaSaveImagesN2);
+  FwPrAddActionNode(prDesc, CrIaSaveImages_N3, &CrIaSaveImagesN3);
+  FwPrAddActionNode(prDesc, CrIaSaveImages_N4, &CrIaSaveImagesN4);
+  FwPrAddActionNode(prDesc, CrIaSaveImages_N1, &CrIaSaveImagesN1);
+  FwPrAddDecisionNode(prDesc, DECISION1, N_OUT_OF_DECISION1);
+  FwPrAddActionNode(prDesc, CrIaSaveImages_N5, &CrIaSaveImagesN5);
+  FwPrAddFlowIniToAct(prDesc, CrIaSaveImages_N1, NULL);
+  FwPrAddFlowActToDec(prDesc, CrIaSaveImages_N2, DECISION1, &CrIaSaveImageGibInDiffGibOut);
+  FwPrAddFlowActToAct(prDesc, CrIaSaveImages_N3, CrIaSaveImages_N4, &CrIaSaveImagesFlag1);
+  FwPrAddFlowActToDec(prDesc, CrIaSaveImages_N4, DECISION1, &CrIaSaveImageGibInDiffGibOut);
+  FwPrAddFlowActToAct(prDesc, CrIaSaveImages_N1, CrIaSaveImages_N2, NULL);
+  FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaSaveImages_N3, &CrIaSaveImagesTrgIsGrd);
+  FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaSaveImages_N5, &code66587);
+  FwPrAddFlowActToAct(prDesc, CrIaSaveImages_N5, CrIaSaveImages_N4, &CrIaSaveImagesFlag2);
+
+  return prDesc;
+}
diff --git a/CrIa/src/CrIaPrSm/CrIaSaveImagesCreate.h b/CrIa/src/CrIaPrSm/CrIaSaveImagesCreate.h
new file mode 100644
index 0000000..7acc256
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSaveImagesCreate.h
@@ -0,0 +1,116 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaSaveImages procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ * @image html CrIaSaveImages.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaSaveImagesCreate_H_
+#define CrIaSaveImagesCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaSaveImages_N1 1		/* The identifier of action node N1 in procedure CrIaSaveImages */
+#define CrIaSaveImages_N2 2		/* The identifier of action node N2 in procedure CrIaSaveImages */
+#define CrIaSaveImages_N3 3		/* The identifier of action node N3 in procedure CrIaSaveImages */
+#define CrIaSaveImages_N4 4		/* The identifier of action node N4 in procedure CrIaSaveImages */
+#define CrIaSaveImages_N5 5		/* The identifier of action node N5 in procedure CrIaSaveImages */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaSaveImagesCreate(void* prData);
+
+/**
+ * Action for node N2.
+ * Set gibOut to point to oldest GIB
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSaveImagesN2(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N3.
+ * Start Down-Transfer of GIB
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSaveImagesN3(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N4.
+ * Increment gibOut
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSaveImagesN4(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N1.
+ * <pre>
+ * Generate event report
+ * EVT_SC_PR_STRT
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSaveImagesN1(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N5.
+ * <pre>
+ * Start FBF Save Procedure
+ * to transfer GIB pointed at by 
+ * gibOut to flash memory
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSaveImagesN5(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N2 to DECISION1.
+ *  gibIn != gibOut 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSaveImageGibInDiffGibOut(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N3 to N4.
+ *  Flag_1 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSaveImagesFlag1(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION1 to N3.
+ *  pSaveTarget == GROUND 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSaveImagesTrgIsGrd(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N5 to N4.
+ *  Flag_2 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSaveImagesFlag2(FwPrDesc_t prDesc);
+
+#endif /* CrIaSaveImagesCreate_H_ */
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSaveImagesFunc.c b/CrIa/src/CrIaPrSm/CrIaSaveImagesFunc.c
new file mode 100644
index 0000000..40d567e
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSaveImagesFunc.c
@@ -0,0 +1,323 @@
+/**
+ * @file CrIaSaveImagesFunc.c
+ * @ingroup CrIaPrSci
+ * @authors FW Profile code generator version 4.63; Institute for Astrophysics, 2015-2016
+ * @date Created on: Feb 11 2016 22:56:45
+ *
+ * @brief Implementation of the Save Images Procedure nodes and guards.
+ * Transfer a pre-defined number of science images to ground or to flash.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+#include "FwProfile/FwPrCore.h"
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+#include <Services/General/CrIaConstants.h> /* for CRIA_SERV198_SAVE_IMG_PR, SAVETARGET_GROUND/FLASH */
+
+/** CrIaSaveImages function definitions */
+#include "CrIaSaveImagesCreate.h"
+
+#include <CrIaIasw.h> /* for the smDescSdu2 handle */
+#include <CrIaPrSm/CrIaSduCreate.h> /* for StartDownTransfer */
+#include <CrIaPrSm/CrIaSemCreate.h> 
+#include <Services/CrIaServ198ProcedureControlService/InCmd/CrIaServ198ProcStart.h> /* for PR_STOPPED */
+
+#include "IfswDebug.h"
+
+/* Mantis 2131: use flag to check that not all FBFs in range pFbfInit to pFbfEnd have been filled */
+static unsigned char isRunOutOfFbfs; 
+
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N2. */
+void CrIaSaveImagesN2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char fbfId;
+  
+  /* NOTE: This node is required to set gibOut to point to the oldest gib,
+     but this is guaranteed by design and hence the function returns without 
+     doing anything. */
+
+  /* Set flag isRunOutOfFbfs to FALSE */
+  isRunOutOfFbfs = 0;
+
+  /* Mantis 2153 */
+  CrIaCopy(SAVEIMAGES_PFBFINIT_ID, &fbfId);      
+  CrIaPaste(FBFSAVE_PFBFID_ID, &fbfId);
+  
+  return;
+}
+
+/** Action for node N3. */
+void CrIaSaveImagesN3(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short gibOut;
+  unsigned short sdbstate;
+  
+  /* start downtransfer of gib */
+  PRDEBUGP("start downtransfer\n");
+
+  CrIaCopy(GIBOUT_ID, &gibOut);
+  CrIaPaste(GIBTOTRANSFER_ID, &gibOut);
+  CrIaCopy (SDBSTATE_ID, &sdbstate);
+
+  CrIaPaste(TRANSFERMODE_ID, &sdbstate); /* memorize the mode in which the transfer was started */
+  
+  FwSmMakeTrans(smDescSdu2, StartDownTransfer);
+
+  return;
+}
+
+
+unsigned char IncrementFbfId (unsigned char StartId, unsigned char EndId)
+{
+  unsigned char fbfEnb, StartIndex, EndIndex, indices, Index;
+  int k;
+
+  if (StartId == EndId)
+    {
+      return StartId;
+    }
+  
+  StartIndex = StartId - 1; /* Id cannot be 0 */
+  EndIndex = EndId - 1;
+  
+  indices = EndIndex - StartIndex;
+
+  /* also consider the reverse case with wrap around */
+  if (StartIndex > EndIndex)
+    {
+      indices = 250 - StartIndex + EndIndex;
+    }
+  
+  /* Increment FBF Counter skipping disabled FBFs */
+  for (k=0; k < indices; k++)
+    {
+      Index = (StartIndex + k) % 250;
+      
+      /* check if FBF is enabled */
+      CrIaCopyArrayItem(FBF_ENB_ID, &fbfEnb, Index);
+
+      if (fbfEnb == 1)
+        {
+	  /* found an enabled index */
+	  return Index + 1; /* ID is Index + 1 */	  
+        }
+    }
+
+  /* Set flag isRunOutOfFbfs to TRUE, because we have run out of enabled FBFs */
+  isRunOutOfFbfs = 1;
+  
+  /* nothing found */
+  return StartId;
+}
+
+
+/** Action for node N4. */
+void CrIaSaveImagesN4(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* increment gibOut */
+  unsigned short gibOut, newGibOut, gibIn, gibSizeWin, gibNWin, gibSizeFull, gibNFull;
+  unsigned short sdbstate;
+  unsigned short saveTarget;
+  unsigned char fbfId, pFbfEnd;
+  unsigned long int xibOffset;
+  unsigned short transferMode;
+  
+  /* increment by a gibSize, which depends on the mode Win/Full
+
+     NOTE: Here the spec makes me (RO) not extremely happy.
+     In this node we adjust the Gib by the size depending on the *current* mode,
+     which may not be the mode in which the pending data were produced.
+  */
+
+  /* increment FbfId if the save target is the FLASH */
+  CrIaCopy(SAVEIMAGES_PSAVETARGET_ID, &saveTarget);
+
+  if (saveTarget == SAVETARGET_FLASH)
+    {
+      CrIaCopy(FBFSAVE_PFBFID_ID, &fbfId);
+      CrIaCopy(SAVEIMAGES_PFBFEND_ID, &pFbfEnd);
+
+      /* increment index to next possible one */
+      /* Mantis 2153 */
+      if (fbfId != pFbfEnd)
+	{
+	  if ((fbfId == 250) && (pFbfEnd != 250))
+	    fbfId = 1;
+	  else
+	    fbfId += 1;
+	  
+	  fbfId = IncrementFbfId (fbfId, pFbfEnd);
+	}
+
+      CrIaPaste(FBFSAVE_PFBFID_ID, &fbfId);
+    }
+  
+  /* get state of SDB (WIN or FULL) */
+  CrIaCopy (SDBSTATE_ID, &sdbstate);
+
+  /* 
+     NOTE: Between the start of a transfer and its completion, the imaging mode may change
+     and the following scenarios arise:
+     a) mode unchanged: increment GIBOUT using GIBIN and GIBOUT from data pool
+     b) mode changed: do not increment, because it has been reset!
+  */
+  CrIaCopy(TRANSFERMODE_ID, &transferMode);
+  if (sdbstate != transferMode)
+    return;
+  
+  /* get relevant GIB sizes */
+  CrIaCopy(GIBOUT_ID, &gibOut);
+  CrIaCopy(GIBIN_ID, &gibIn);
+  CrIaCopy(GIBSIZEWIN_ID, &gibSizeWin);
+  CrIaCopy(GIBSIZEFULL_ID, &gibSizeFull);
+  CrIaCopy(GIBNWIN_ID, &gibNWin);
+  CrIaCopy(GIBNFULL_ID, &gibNFull);
+
+  /* move to the next gibOut in sequence */
+  if (sdbstate == CrIaSdb_CONFIG_WIN)
+    {
+      xibOffset = GET_RES_OFFSET_FROM_ADDR((unsigned long int)gibAddressWin);
+      newGibOut = updateXibFwd((unsigned int)gibOut, (unsigned int)gibIn, xibOffset, (unsigned int)gibSizeWin, (unsigned int)gibNWin, GIBOUT_WIN_XIB);
+    }
+  else
+    {
+      xibOffset = GET_RES_OFFSET_FROM_ADDR((unsigned long int)gibAddressFull);
+      newGibOut = updateXibFwd((unsigned int)gibOut, (unsigned int)gibIn, xibOffset, (unsigned int)gibSizeFull, (unsigned int)gibNFull, GIBOUT_FULL_XIB);
+    }  
+  
+  gibOut = newGibOut;
+
+  CrIaPaste(GIBOUT_ID, &gibOut);
+
+  return;
+}
+
+/** Action for node N1. */
+void CrIaSaveImagesN1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* generate event report EVT_SC_PR_STRT */
+  unsigned short evt_data[2];
+
+  PRDEBUGP("save images pr start\n");
+  evt_data[0] = CRIA_SERV198_SAVE_IMG_PR; /* proc ID */
+  evt_data[1] = 0; /* NOT USED */
+
+  CrIaEvtRep(1, CRIA_SERV5_EVT_SC_PR_STRT, evt_data, 4);
+
+  return;
+}
+
+/** Action for node N5. */
+void CrIaSaveImagesN5(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* start FBF save procedure to transfer gib pointed at by gibOut to FLASH memory */
+  unsigned short gibOut;
+  unsigned short sdbstate;
+  unsigned int pFbfRamAddr;
+  
+  /* start save to FBF of gib */
+  PRDEBUGP("start save to FBF\n");
+
+  /* address of gib out */
+  CrIaCopy(GIBOUT_ID, &gibOut); 
+  pFbfRamAddr = (unsigned int) GET_ADDR_FROM_RES_OFFSET(gibOut);
+  CrIaPaste(FBFSAVE_PFBFRAMADDR_ID, &pFbfRamAddr);
+  
+  /* 
+     NOTE: FbfID is set to FbfInit by the Nominal Science or by the Start Procedure of Save Images. 
+     The FbfID is then incremented in N4 before the gib is adjusted 
+  */
+
+  /* Memorize the mode in which the transfer was started. This is needed later in N4 */
+  CrIaCopy (SDBSTATE_ID, &sdbstate);
+  CrIaPaste(TRANSFERMODE_ID, &sdbstate);
+
+  /* start FBF save procedure (see Mantis 1548) */
+  FwPrStart(prDescFbfSave);
+  
+  return;
+}
+
+/** Guard on the Control Flow from N2 to DECISION1. */
+FwPrBool_t CrIaSaveImageGibInDiffGibOut(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short gibIn, gibOut;
+
+  CrIaCopy(GIBIN_ID, &gibIn);
+  CrIaCopy(GIBOUT_ID, &gibOut);
+
+  /* if gibIn is ahead of gibOut, then we have sth. to transfer */
+  if (gibIn != gibOut)
+    return 1;
+
+  return 0;
+}
+
+/** Guard on the Control Flow from N3 to N4. */
+FwPrBool_t CrIaSaveImagesFlag1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* flag1 = downtransfer of gib has completed, i.e. SDU2 SM is in state inactive */
+  unsigned short sdu2State;
+
+  sdu2State = FwSmGetCurState(smDescSdu2);
+
+  if (sdu2State == CrIaSdu_INACTIVE)
+    return 1;
+
+  return 0;
+}
+
+/** Guard on the Control Flow from DECISION1 to N3. */
+FwPrBool_t CrIaSaveImagesTrgIsGrd(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* pSaveTarget = ground (or FLASH) */
+  unsigned short saveTarget;
+
+  CrIaCopy(SAVEIMAGES_PSAVETARGET_ID, &saveTarget);
+
+  if (saveTarget == SAVETARGET_GROUND)
+    return 1; /* NOTE: 0 goes to N5, 1 goes to N3 */
+
+  /* else FLASH */
+  return 0;
+}
+
+/** Guard on the Control Flow from N5 to N4. */
+FwPrBool_t CrIaSaveImagesFlag2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* flag2 = fbfSaveProcedure has terminated and not all FBFs in range pFbfInit to pFbfEnd have been filled */
+  unsigned short fbfSaveNode;
+
+  fbfSaveNode = (unsigned short) (FwPrGetCurNode(prDescFbfSave) & 0xffff);  
+  
+  if ((fbfSaveNode == PR_STOPPED) && !isRunOutOfFbfs)
+    {
+      return 1;
+    }
+
+  return 0;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaSaveImagesInit.txt b/CrIa/src/CrIaPrSm/CrIaSaveImagesInit.txt
new file mode 100644
index 0000000..49762dc
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSaveImagesInit.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaSaveImagesCreate(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaSaveImages is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaSaveImages is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSciDataUpdCreate.c b/CrIa/src/CrIaPrSm/CrIaSciDataUpdCreate.c
new file mode 100644
index 0000000..ca8663b
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSciDataUpdCreate.c
@@ -0,0 +1,118 @@
+/**
+ * @file CrIaSciDataUpdCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaSciDataUpd function definitions */
+#include "CrIaSciDataUpdCreate.h"
+
+/**
+ * Guard on the Control Flow from DECISION1 to N2.
+ * <pre>
+ *  SDSC has
+ * illegal value
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code9110(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/**
+ * Guard on the Control Flow from DECISION2 to DECISION3.
+ * <pre>
+ *  SDSC is
+ * in sequence
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code45000(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/**
+ * Guard on the Control Flow from DECISION3 to N5.
+ * <pre>
+ *  SIB is large enough to hold
+ * new bach of science data
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code76599(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/**
+ * Guard on the Control Flow from DECISION4 to DECISION1.
+ *  ! Flag_1
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code94970(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaSciDataUpdCreate(void* prData)
+{
+  const FwPrCounterU2_t DECISION1 = 1;		/* The identifier of decision node DECISION1 in procedure CrIaSciDataUpd */
+  const FwPrCounterU2_t N_OUT_OF_DECISION1 = 2;	/* The number of control flows out of decision node DECISION1 in procedure CrIaSciDataUpd */
+  const FwPrCounterU2_t DECISION2 = 2;		/* The identifier of decision node DECISION2 in procedure CrIaSciDataUpd */
+  const FwPrCounterU2_t N_OUT_OF_DECISION2 = 2;	/* The number of control flows out of decision node DECISION2 in procedure CrIaSciDataUpd */
+  const FwPrCounterU2_t DECISION3 = 3;		/* The identifier of decision node DECISION3 in procedure CrIaSciDataUpd */
+  const FwPrCounterU2_t N_OUT_OF_DECISION3 = 2;	/* The number of control flows out of decision node DECISION3 in procedure CrIaSciDataUpd */
+  const FwPrCounterU2_t DECISION4 = 4;		/* The identifier of decision node DECISION4 in procedure CrIaSciDataUpd */
+  const FwPrCounterU2_t N_OUT_OF_DECISION4 = 2;	/* The number of control flows out of decision node DECISION4 in procedure CrIaSciDataUpd */
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+                        5,	/* N_ANODES - The number of action nodes */
+                        4,	/* N_DNODES - The number of decision nodes */
+                        14,	/* N_FLOWS - The number of control flows */
+                        5,	/* N_ACTIONS - The number of actions */
+                        8	/* N_GUARDS - The number of guards */
+                      );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddActionNode(prDesc, CrIaSciDataUpd_N2, &CrIaSciDataUpdN2);
+  FwPrAddDecisionNode(prDesc, DECISION1, N_OUT_OF_DECISION1);
+  FwPrAddDecisionNode(prDesc, DECISION2, N_OUT_OF_DECISION2);
+  FwPrAddActionNode(prDesc, CrIaSciDataUpd_N3, &CrIaSciDataUpdN3);
+  FwPrAddActionNode(prDesc, CrIaSciDataUpd_N5, &CrIaSciDataUpdN5);
+  FwPrAddDecisionNode(prDesc, DECISION3, N_OUT_OF_DECISION3);
+  FwPrAddActionNode(prDesc, CrIaSciDataUpd_N4, &CrIaSciDataUpdN4);
+  FwPrAddDecisionNode(prDesc, DECISION4, N_OUT_OF_DECISION4);
+  FwPrAddActionNode(prDesc, CrIaSciDataUpd_N1, &CrIaSciDataUpdN1);
+  FwPrAddFlowIniToDec(prDesc, DECISION4, NULL);
+  FwPrAddFlowActToFin(prDesc, CrIaSciDataUpd_N2, NULL);
+  FwPrAddFlowDecToDec(prDesc, DECISION1, DECISION2, &CrIaSciDataUpdHasSdscLegalVal);
+  FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaSciDataUpd_N2, &code9110);
+  FwPrAddFlowDecToAct(prDesc, DECISION2, CrIaSciDataUpd_N3, &CrIaSciDataUpdIsSdscOutOfSeq);
+  FwPrAddFlowDecToDec(prDesc, DECISION2, DECISION3, &code45000);
+  FwPrAddFlowActToDec(prDesc, CrIaSciDataUpd_N3, DECISION3, NULL);
+  FwPrAddFlowActToFin(prDesc, CrIaSciDataUpd_N5, NULL);
+  FwPrAddFlowDecToAct(prDesc, DECISION3, CrIaSciDataUpd_N4, &CrIaSciDataUpdIsSibTooSmall);
+  FwPrAddFlowDecToAct(prDesc, DECISION3, CrIaSciDataUpd_N5, &code76599);
+  FwPrAddFlowActToFin(prDesc, CrIaSciDataUpd_N4, NULL);
+  FwPrAddFlowDecToAct(prDesc, DECISION4, CrIaSciDataUpd_N1, &CrIaSciDataUpdFlag1);
+  FwPrAddFlowDecToDec(prDesc, DECISION4, DECISION1, &code94970);
+  FwPrAddFlowActToDec(prDesc, CrIaSciDataUpd_N1, DECISION1, NULL);
+
+  return prDesc;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSciDataUpdCreate.h b/CrIa/src/CrIaPrSm/CrIaSciDataUpdCreate.h
new file mode 100644
index 0000000..5a1cec3
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSciDataUpdCreate.h
@@ -0,0 +1,119 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaSciDataUpd procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ * @image html CrIaSciDataUpd.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaSciDataUpdCreate_H_
+#define CrIaSciDataUpdCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaSciDataUpd_N1 1		/* The identifier of action node N1 in procedure CrIaSciDataUpd */
+#define CrIaSciDataUpd_N2 2		/* The identifier of action node N2 in procedure CrIaSciDataUpd */
+#define CrIaSciDataUpd_N3 3		/* The identifier of action node N3 in procedure CrIaSciDataUpd */
+#define CrIaSciDataUpd_N4 4		/* The identifier of action node N4 in procedure CrIaSciDataUpd */
+#define CrIaSciDataUpd_N5 5		/* The identifier of action node N5 in procedure CrIaSciDataUpd */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaSciDataUpdCreate(void* prData);
+
+/**
+ * Action for node N2.
+ * Generate Event EVT_SDSC_ILL
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSciDataUpdN2(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N3.
+ * Generate Event EVT_SDSC_OOS
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSciDataUpdN3(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N5.
+ * Store science data in SIB
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSciDataUpdN5(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N4.
+ * Generate Event EVT_SIB_SIZE
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSciDataUpdN4(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N1.
+ * <pre>
+ * Increment sibIn
+ * and initialize header
+ * information for new image
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSciDataUpdN1(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION1 to DECISION2.
+ * <pre>
+ *  SDSC has
+ * legal value 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSciDataUpdHasSdscLegalVal(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION2 to N3.
+ *  SDSC is out-of-sequence 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSciDataUpdIsSdscOutOfSeq(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION3 to N4.
+ * <pre>
+ *  SIB is too small to hold
+ * new batch of science data 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSciDataUpdIsSibTooSmall(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION4 to N1.
+ *  Flag_1 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSciDataUpdFlag1(FwPrDesc_t prDesc);
+
+#endif /* CrIaSciDataUpdCreate_H_ */
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSciDataUpdFunc.c b/CrIa/src/CrIaPrSm/CrIaSciDataUpdFunc.c
new file mode 100644
index 0000000..6d74b91
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSciDataUpdFunc.c
@@ -0,0 +1,794 @@
+/**
+ * @file CrIaSciDataUpdFunc.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdint.h> /* for uint32_t */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h> /* for memcpy */
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+#include "FwProfile/FwPrCore.h"
+
+#include <Services/General/CrSemParamGetter.h>
+#include <CrIaDataPoolId.h>
+#include <CrIaDataPool.h>
+#include <ScienceDataProcessing.h> /* for updateXib */
+#include "Sdp/SdpAlgorithmsImplementation.h" /* for sram1tosram2_shorts */
+#include "EngineeringAlgorithms.h" 
+
+/* event generation */
+#include <CrIaSemEvents.h>
+#include <Services/General/CrIaConstants.h>
+
+/** CrIaSciDataUpd function definitions */
+#include "CrIaSciDataUpdCreate.h"
+
+/* Acquisition Types and max packet numbers */
+#include <Services/General/CrSemConstants.h>
+
+#include <CrIaIasw.h> /* for sibAddressFull and Win and the S21 globasl */
+
+#include "../IfswDebug.h"
+
+unsigned short SibIn, SibOut, SibSize, newSibIn;
+unsigned short SibN; 
+
+/* Flag TransferComplete is used to help identify the last packet of an image acquisition. The flag is managed as follows:
+ * (a) It is initialized to zero at the point of declaration in module CrIaIasw
+ * (b) It is reset to zero in node N1 of the Science Data Update Procedure (i.e. at the start of a new image acquisition)
+ * (c) It is set to non-zero values in node N5 of the Science Data Update Procedure when the last packet of an image or sub-image is received
+ */
+
+CrFwBool_t FD_SDSC_ILL_Flag, FD_SDSC_OOS_Flag; /* for FdCheck Incorrect Science Data Sequence Counter */
+
+static unsigned char S21_Flag0;
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N2. */
+void CrIaSciDataUpdN2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short CurrentPacketNum;
+  unsigned short evt_data[2];
+  CrFwPckt_t     pckt;
+
+  DEBUGP("SciDatUpd N2.\n");
+
+  pckt = S21SemPacket; /* (CrFwPckt_t) FwPrGetData(prDescSciDataUpd); */
+  CrSemServ21DatCcdWindowParamGetHkStatCurrentPacketNum (&CurrentPacketNum, pckt);
+
+  /* generate event EVT_SDSC_ILL */
+  evt_data[0] = CurrentPacketNum;
+  /* evt_data[1] not used */
+
+  CrIaEvtRep(3, CRIA_SERV5_EVT_SDSC_ILL, evt_data, 4);
+
+  /* Set flag for FdCheck Incorrect Science Data Sequence Counter */
+  FD_SDSC_ILL_Flag = 1;
+
+  return;
+}
+
+
+/** Action for node N3. */
+void CrIaSciDataUpdN3(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short CurrentPacketNum;
+  unsigned short evt_data[2];
+  
+  CrFwPckt_t     pckt;
+
+  DEBUGP("SciDatUpd N3.\n");
+
+  pckt = S21SemPacket; /* (CrFwPckt_t) FwPrGetData(prDescSciDataUpd); */
+  CrSemServ21DatCcdWindowParamGetHkStatCurrentPacketNum (&CurrentPacketNum, pckt);
+
+  /* generate event EVT_SDSC_OOS */
+  evt_data[0] = S21LastPacketNum;
+  evt_data[1] = CurrentPacketNum;
+
+  CrIaEvtRep(3, CRIA_SERV5_EVT_SDSC_OOS, evt_data, 4);
+
+  /* Set flag for FdCheck Incorrect Science Data Sequence Counter */
+  FD_SDSC_OOS_Flag = 1;
+
+  return;
+}
+
+
+/** Action for node N5. */
+void CrIaSciDataUpdN5(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  CrFwPckt_t   pckt;
+
+  unsigned short *source;
+  unsigned short *dest = NULL;
+  
+  unsigned char  AcqType, lstpckt, tcompl;
+  unsigned short NumDataWords;
+  unsigned short TotalPacketNum;
+  unsigned short CurrentPacketNum;
+
+  unsigned int SibAddress;
+  unsigned long int xibOffset;
+  unsigned short semWinSizeX, semWinSizeY;
+
+  unsigned short xib_err_id;
+  
+  pckt = S21SemPacket; /* (CrFwPckt_t) FwPrGetData(prDescSciDataUpd); */
+
+  DEBUGP("SciDatUpd N5: S21 STORE.\n");
+
+  CrSemServ21DatCcdWindowParamGetHkStatDataAcqType (&AcqType, pckt);
+  CrSemServ21DatCcdWindowParamGetHkStatNumDataWords (&NumDataWords, pckt);
+
+  /* store science data in sib */
+#ifdef PC_TARGET  
+  { 
+    unsigned int j;
+    unsigned char val0, val1;	
+
+    for (j=0; j<NumDataWords; j++)
+	{	
+		val0 = pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 52 + 2*j];
+                val1 = pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 52 + 2*j+1];
+     	 	pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 52 + 2*j] = val1;
+                pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 52 + 2*j+1] = val0;
+	}
+  }
+#endif
+
+  source = (unsigned short *)(&pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 52]); /* NOTE: int alignment matters here! */
+
+  if ((unsigned long int)source & 0x1L)
+    {
+      PRDEBUGP("WE ARE NOT SHORT ALIGNED!!!!!!!!! 0x%lx\n", (unsigned long int)source);
+    }
+  
+#if (__sparc__)
+  switch (AcqType)
+    {
+    case CCD_FULL_ID :
+    case CCD_WIN_EXPOS_ID :
+
+      dest = &(((unsigned short *)incomingSibInStruct.Expos)[incomingSibInStruct.ExposSamples]);
+      incomingSibInStruct.ExposSamples += NumDataWords;
+      break;
+
+    case CCD_WIN_LSM_ID :
+
+      dest = &(((unsigned short *)incomingSibInStruct.Lsm)[incomingSibInStruct.LsmSamples]);
+      incomingSibInStruct.LsmSamples += NumDataWords;
+      break;
+
+    case CCD_WIN_RSM_ID :
+
+      dest = &(((unsigned short *)incomingSibInStruct.Rsm)[incomingSibInStruct.RsmSamples]);
+      incomingSibInStruct.RsmSamples += NumDataWords;
+      break;
+
+    case CCD_WIN_TM_ID :
+
+      dest = &(((unsigned short *)incomingSibInStruct.Tm)[incomingSibInStruct.TmSamples]);
+      incomingSibInStruct.TmSamples += NumDataWords;
+      break;
+
+    default:
+      /* no other types are possible */
+      return;
+    }
+#else
+  switch (AcqType)
+    {
+    case CCD_FULL_ID :
+    case CCD_WIN_EXPOS_ID :
+
+      dest = &(((unsigned short *)ShmIncomingSibInPTR->Expos)[ShmIncomingSibInPTR->ExposSamples]);
+      ShmIncomingSibInPTR->ExposSamples += NumDataWords;
+      break;
+
+    case CCD_WIN_LSM_ID :
+
+      dest = &(((unsigned short *)ShmIncomingSibInPTR->Lsm)[ShmIncomingSibInPTR->LsmSamples]);
+      ShmIncomingSibInPTR->LsmSamples += NumDataWords;
+      break;
+
+    case CCD_WIN_RSM_ID :
+
+      dest = &(((unsigned short *)ShmIncomingSibInPTR->Rsm)[ShmIncomingSibInPTR->RsmSamples]);
+      ShmIncomingSibInPTR->RsmSamples += NumDataWords;
+      break;
+
+    case CCD_WIN_TM_ID :
+
+      dest = &(((unsigned short *)ShmIncomingSibInPTR->Tm)[ShmIncomingSibInPTR->TmSamples]);
+      ShmIncomingSibInPTR->TmSamples += NumDataWords;
+      break;
+
+    default:
+      /* no other types are possible */
+      DEBUGP("Acq type ERROR!\n");
+      return;
+    }
+#endif /* (__sparc__) */
+
+  /* carry out the actual memcopy from SRAM1 to SRAM2 considering short alignment. */
+  sram1tosram2_shorts (source, NumDataWords, dest);
+
+  /* 
+     evaluate last SEM packet flag 
+  */
+
+  /* get total packets */
+  CrSemServ21DatCcdWindowParamGetHkStatTotalPacketNum (&TotalPacketNum, pckt);
+  
+  /* get current packet number */
+  CrSemServ21DatCcdWindowParamGetHkStatCurrentPacketNum (&CurrentPacketNum, pckt);
+
+  CrIaCopy(TRANSFERCOMPLETE_ID, &tcompl);
+  
+  if (TotalPacketNum == CurrentPacketNum)
+    {
+      switch (AcqType)
+	{	  
+	case ACQ_TYPE_FULL :
+	  tcompl = 0x0F;
+	  break;
+	  
+	case ACQ_TYPE_WIN_EXPOS :
+	  tcompl |= 0x01;
+	  break;
+	  
+	case ACQ_TYPE_WIN_LSM :
+	  tcompl |= 0x02;
+	  break;
+	  
+	case ACQ_TYPE_WIN_RSM :
+	  tcompl |= 0x04;
+	  break;
+	  
+	case ACQ_TYPE_WIN_TM :
+	  tcompl |= 0x08;
+	  break;
+
+	default :
+	  break;
+	}      
+
+      CrIaPaste(TRANSFERCOMPLETE_ID, &tcompl);
+      
+      if (tcompl == 0xf)
+	{
+	  lstpckt = 1;
+	  CrIaPaste(LASTSEMPCKT_ID, &lstpckt);
+	  tcompl = 0;
+	  CrIaPaste(TRANSFERCOMPLETE_ID, &tcompl);
+	  
+	  /* Mantis 1779 */
+	  
+	  /* increment SIBIN assuming the same Acquisition Type */	  
+	  if (AcqType == CCD_FULL_ID)
+	    {
+	      CrIaCopy(SIBIN_ID, &SibIn);
+	      CrIaCopy(SIBOUT_ID, &SibOut);
+	      SibAddress = (unsigned int) sibAddressFull;
+	      xib_err_id = SIBIN_FULL_XIB;
+	      CrIaCopy(SIBNFULL_ID, &SibN);
+	      CrIaCopy(SIBSIZEFULL_ID, &SibSize);
+	    }
+	  else
+	    {
+	      CrIaCopy(SIBIN_ID, &SibIn);
+	      CrIaCopy(SIBOUT_ID, &SibOut);
+	      SibAddress = (unsigned int) sibAddressWin;
+	      xib_err_id = SIBIN_WIN_XIB;
+	      CrIaCopy(SIBNWIN_ID, &SibN);
+	      CrIaCopy(SIBSIZEWIN_ID, &SibSize);
+	    }
+
+	  xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)SibAddress);
+	  newSibIn = updateXib((unsigned int)SibIn, (unsigned int)SibOut, xibOffset, (unsigned int)SibSize, (unsigned int)SibN, xib_err_id); 
+
+	  /* use the new sib, no harm if it is identical */
+	  CrIaPaste(SIBIN_ID, &newSibIn);
+
+	  PRDEBUGP("N5: SibIn(after) = %d\n", newSibIn);
+
+	  /* initialize the incomingSibInStruct structure */
+#if (__sparc__)
+	  if (AcqType == CCD_FULL_ID)
+	    {
+	      CrIaSetupSibFull (&incomingSibInStruct, newSibIn);
+	    }
+	  else
+	    {
+	      CrIaCopy(PWINSIZEX_ID, &semWinSizeX);
+	      CrIaCopy(PWINSIZEY_ID, &semWinSizeY);
+	      
+	      CrIaSetupSibWin (&incomingSibInStruct, newSibIn, semWinSizeX, semWinSizeY);
+	    }
+#else
+	  if (AcqType == CCD_FULL_ID)
+	    {
+	      CrIaSetupSibFull (ShmIncomingSibInPTR, newSibIn);
+	    }
+	  else
+	    {
+	      CrIaCopy(PWINSIZEX_ID, &semWinSizeX);
+	      CrIaCopy(PWINSIZEY_ID, &semWinSizeY);
+	      
+	      CrIaSetupSibWin (ShmIncomingSibInPTR, newSibIn, semWinSizeX, semWinSizeY);
+	    }
+#endif /* (__sparc__) */	  
+	}
+    }
+  
+  return;
+}
+
+
+/** Action for node N4. */
+void CrIaSciDataUpdN4(FwPrDesc_t __attribute__((unused)) __attribute__((unused)) prDesc)
+{
+  CrFwPckt_t   pckt;
+  unsigned char  AcqType;
+  unsigned short size;
+  unsigned short evt_data[2];
+
+  pckt = S21SemPacket;
+
+  CrSemServ21DatCcdWindowParamGetHkStatDataAcqType (&AcqType, pckt);
+
+  if (AcqType == CCD_FULL_ID)
+    {
+      CrIaCopy(SIBSIZEFULL_ID, &size);      
+    }
+  else /* belongs to the set of WINDOW products */
+    {
+      CrIaCopy(SIBSIZEWIN_ID, &size);      
+    }
+  
+  evt_data[0] = size;
+
+  CrIaEvtRep(3, CRIA_SERV5_EVT_SIB_SIZE, evt_data, 4);
+
+  return;
+}
+
+
+/** Action for node N1. */
+void CrIaSciDataUpdN1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  CrFwPckt_t       pckt;
+  
+  /* parameters read from the S21 packet */
+  unsigned int   AcqId, ExposureTime, ImageCycleCnt, AcqImageCnt;
+  unsigned char  AcqType, AcqSrc, CcdTimingScriptId;
+  unsigned short TotalPacketNum, CurrentPacketNum, PixDataOffset, NumDataWords; /* DatScienceBlock;*/
+  CrFwTimeStamp_t AcqTime;
+  unsigned int startTimeCoarse, endTimeCoarse;
+  unsigned short startTimeFine, endTimeFine;
+  union
+  {
+    unsigned int ui;
+    float f;
+  } VoltFeeVod, VoltFeeVrd, VoltFeeVog, VoltFeeVss, TempFeeCcd, TempFeeAdc, TempFeeBias; 
+
+  short TempOh1A, TempOh1B, TempOh2A, TempOh2B, TempOh3A, TempOh3B, TempOh4A, TempOh4B;
+  short AdcN5V, Temp1;
+  unsigned short semWinSizeX, semWinSizeY;
+  
+  struct SibHeader * sibHeader;
+  struct SibPhotometry * sibPhotometry;
+  struct SibCentroid * sibCentroid;
+  unsigned char isSdsActive, isSaaActive, tcompl;
+  
+  PRDEBUGP("Science Data Update Procedure Node N1. Only \"first\" packets enter here.\n");
+
+  pckt = S21SemPacket; /* (CrFwPckt_t) FwPrGetData(prDescSciDataUpd); */
+
+  /* get acquisition ID and other info from packet */
+  CrSemServ21DatCcdWindowParamGetHkStatDataAcqId (&AcqId, pckt);
+  CrSemServ21DatCcdWindowParamGetHkStatDataAcqType (&AcqType, pckt);
+  CrSemServ21DatCcdWindowParamGetHkStatDataAcqSrc (&AcqSrc, pckt);
+  CrSemServ21DatCcdWindowParamGetHkStatCcdTimingScriptId (&CcdTimingScriptId, pckt);
+  CrSemServ21DatCcdWindowParamGetHkStatDataAcqTime (AcqTime.t, pckt);
+  CrSemServ21DatCcdWindowParamGetHkStatExposureTime (&ExposureTime, pckt);
+  CrSemServ21DatCcdWindowParamGetHkStatPixDataOffset (&PixDataOffset, pckt);
+  CrSemServ21DatCcdWindowParamGetHkStatTotalPacketNum (&TotalPacketNum, pckt);
+  CrSemServ21DatCcdWindowParamGetHkStatCurrentPacketNum (&CurrentPacketNum, pckt);
+  CrSemServ21DatCcdWindowParamGetHkStatNumDataWords (&NumDataWords, pckt);
+  /*  CrSemServ21DatCcdWindowParamGetDatScienceBlock (&DatScienceBlock, pckt); */
+
+  /* save Data Acquisition Time in DP as integration start time */
+  startTimeCoarse = ((((unsigned int) AcqTime.t[0]) << 24) & 0xff000000) | ((((unsigned int) AcqTime.t[1]) << 16) & 0x00ff0000) | ((((unsigned int) AcqTime.t[2]) <<  8) & 0x0000ff00) | (((unsigned int) AcqTime.t[3]) & 0x000000ff);
+  startTimeFine   = ((((unsigned short) AcqTime.t[4]) << 8) & 0xff00) | (((unsigned short) AcqTime.t[5]) & 0x00ff);
+  CrIaPaste(INTEGSTARTTIMECRS_ID, &startTimeCoarse);
+  CrIaPaste(INTEGSTARTTIMEFINE_ID, &startTimeFine);
+
+  /* NOTE: End of Integration time is calculated in PrepareCentroid */
+
+  /* get 7 SEM HK data pool varibles */ 
+  /* CrIaCopy(VOLT_FEE_VOD_ID, &VoltFeeVod.f); */
+  CrSemServ21DatCcdWindowParamGetHkVoltFeeVod(&VoltFeeVod.ui, pckt);
+  /* CrIaCopy(VOLT_FEE_VRD_ID, &VoltFeeVrd.f); */
+  CrSemServ21DatCcdWindowParamGetHkVoltFeeVrd(&VoltFeeVrd.ui, pckt);
+  /* CrIaCopy(VOLT_FEE_VOG_ID, &VoltFeeVog.f); */
+  CrSemServ21DatCcdWindowParamGetHkVoltFeeVog(&VoltFeeVog.ui, pckt);
+  /* CrIaCopy(VOLT_FEE_VSS_ID, &VoltFeeVss.f); */
+  CrSemServ21DatCcdWindowParamGetHkVoltFeeVss(&VoltFeeVss.ui, pckt);
+  /* CrIaCopy(TEMP_FEE_CCD_ID, &TempFeeCcd.f); */
+  CrSemServ21DatCcdWindowParamGetHkTempFeeCcd(&TempFeeCcd.ui, pckt);
+  /* CrIaCopy(TEMP_FEE_ADC_ID, &TempFeeAdc.f); */
+  CrSemServ21DatCcdWindowParamGetHkTempFeeAdc(&TempFeeAdc.ui, pckt);
+  /* CrIaCopy(TEMP_FEE_BIAS_ID, &TempFeeBias.f); */
+  CrSemServ21DatCcdWindowParamGetHkTempFeeBias(&TempFeeBias.ui, pckt);
+  
+  CrIaCopy(ADC_N5V_RAW_ID, &AdcN5V);
+  CrIaCopy(ADC_TEMP1_RAW_ID, &Temp1);
+
+  /* get 4 OTA temperatures */
+  CrIaCopy(ADC_TEMPOH1A_RAW_ID, &TempOh1A);
+  CrIaCopy(ADC_TEMPOH1B_RAW_ID, &TempOh1B);
+  CrIaCopy(ADC_TEMPOH2A_RAW_ID, &TempOh2A);
+  CrIaCopy(ADC_TEMPOH2B_RAW_ID, &TempOh2B);
+  CrIaCopy(ADC_TEMPOH3A_RAW_ID, &TempOh3A);
+  CrIaCopy(ADC_TEMPOH3B_RAW_ID, &TempOh3B);
+  CrIaCopy(ADC_TEMPOH4A_RAW_ID, &TempOh4A);
+  CrIaCopy(ADC_TEMPOH4B_RAW_ID, &TempOh4B);
+  
+  /* NOTE: the ImageCycleCnt is initialized to -1 in the Sem Oper SM and also incremented there */
+  CrIaCopy(IMAGECYCLECNT_ID, &ImageCycleCnt);
+  CrIaCopy(ACQIMAGECNT_ID, &AcqImageCnt);
+
+  PRDEBUGP("S21: imagecycle %d acqimages %d AcqType %d AcqID %d S21LastAcqId %d CurrPcktNum %d\n", ImageCycleCnt, AcqImageCnt, AcqType, AcqId, S21LastAcqId, CurrentPacketNum);
+
+  /* 
+     initialize the outgoingSibInStruct structure 
+
+     NOTE: We cannot simply say "outgoingSibInStruct = incomingSibInStruct;",
+     because incomingSibInStruct is not initialized for the very first frame.     
+     Instead, we derive it from SIBIN.
+  */
+ 
+  CrIaCopy(SIBIN_ID, &SibIn);
+  
+  /* initialize the outgoingSibInStruct structure */
+  if (AcqType == CCD_FULL_ID)
+    {
+#ifdef PC_TARGET
+      CrIaSetupSibFull (ShmOutgoingSibInPTR, SibIn);
+#else
+      CrIaSetupSibFull (&outgoingSibInStruct, SibIn);
+#endif
+    }
+  else
+    {
+      CrIaCopy(PWINSIZEX_ID, &semWinSizeX);
+      CrIaCopy(PWINSIZEY_ID, &semWinSizeY);
+#ifdef PC_TARGET
+      CrIaSetupSibWin (ShmOutgoingSibInPTR, SibIn, semWinSizeX, semWinSizeY);
+#else
+      CrIaSetupSibWin (&outgoingSibInStruct, SibIn, semWinSizeX, semWinSizeY);
+#endif
+    }
+
+  /* for the very first image we also have to initialize the incomingSibInStruct */  
+  if (S21_Flag0 == 1) /* very first image */
+    {
+      /* initialize the incomingSibInStruct structure */
+#if (__sparc__)
+      if (AcqType == CCD_FULL_ID)
+	{
+	  CrIaSetupSibFull (&incomingSibInStruct, SibIn);
+	}
+      else
+	{
+	  CrIaCopy(PWINSIZEX_ID, &semWinSizeX);
+	  CrIaCopy(PWINSIZEY_ID, &semWinSizeY);
+	  
+	  CrIaSetupSibWin (&incomingSibInStruct, SibIn, semWinSizeX, semWinSizeY);
+	}
+#else
+      if (AcqType == CCD_FULL_ID)
+	{
+	  CrIaSetupSibFull (ShmIncomingSibInPTR, SibIn);
+	}
+      else
+	{
+	  CrIaCopy(PWINSIZEX_ID, &semWinSizeX);
+	  CrIaCopy(PWINSIZEY_ID, &semWinSizeY);
+	  
+	  CrIaSetupSibWin (ShmIncomingSibInPTR, SibIn, semWinSizeX, semWinSizeY);
+	}
+#endif /* (__sparc__) */
+
+      /* Mantis 2106 */     
+      S21_Flag0 = 0; 
+    }
+  
+  /* copy header entries */
+#if (__sparc__)
+  sibHeader = (struct SibHeader *) incomingSibInStruct.Header;
+#else
+  sibHeader = (struct SibHeader *) ShmIncomingSibInPTR->Header;
+#endif /* (__sparc__) */
+
+  sibHeader->AcqId = AcqId; 
+  sibHeader->AcqType = AcqType;
+  sibHeader->AcqSrc = AcqSrc;
+  sibHeader->CcdTimingScriptId = CcdTimingScriptId;
+  sibHeader->startTimeCoarse = startTimeCoarse;
+  sibHeader->startTimeFine = startTimeFine;
+  sibHeader->ExposureTime = ExposureTime;
+  sibHeader->TotalPacketNum = TotalPacketNum;
+  sibHeader->CurrentPacketNum = CurrentPacketNum;
+  sibHeader->VoltFeeVod = VoltFeeVod.ui;
+  sibHeader->VoltFeeVrd = VoltFeeVrd.ui;
+  sibHeader->VoltFeeVog = VoltFeeVog.ui;
+  sibHeader->VoltFeeVss = VoltFeeVss.ui;
+  sibHeader->TempFeeCcd = TempFeeCcd.ui;
+  sibHeader->TempFeeAdc = TempFeeAdc.ui;
+  sibHeader->TempFeeBias = TempFeeBias.ui;
+  sibHeader->N5V = (unsigned int)AdcN5V;
+  sibHeader->Temp1 = (unsigned int) Temp1;
+  sibHeader->PixDataOffset = PixDataOffset;
+  sibHeader->NumDataWords = NumDataWords;
+  sibHeader->TempOh1A = (unsigned int) TempOh1A;
+  sibHeader->TempOh1B = (unsigned int) TempOh1B;
+  sibHeader->TempOh2A = (unsigned int) TempOh2A;
+  sibHeader->TempOh2B = (unsigned int) TempOh2B;
+  sibHeader->TempOh3A = (unsigned int) TempOh3A;
+  sibHeader->TempOh3B = (unsigned int) TempOh3B;
+  sibHeader->TempOh4A = (unsigned int) TempOh4A;
+  sibHeader->TempOh4B = (unsigned int) TempOh4B;
+
+  PRDEBUGP("INIT SIB HDR S21Upd: Sib=%d, STC=%u, exp=%u\n", SibIn, startTimeCoarse, ExposureTime);
+  
+  /* store AcqId of this packet */
+  S21LastAcqId = AcqId;
+
+  PRDEBUGP("SETTING LAST to %d\n", S21LastAcqId);
+
+  /* reset the SEM image ACQ_TYPE collection flag */   
+  tcompl = 0; 
+  CrIaPaste(TRANSFERCOMPLETE_ID, &tcompl);
+  
+  /* initialize the Centroid structure values */
+#if (__sparc__)
+  sibCentroid = (struct SibCentroid *) incomingSibInStruct.Centroid;
+  PrepareSibCentroid(&incomingSibInStruct, CEN_INV_ALGO, 0.0f, 0.0f);
+#else
+  sibCentroid = (struct SibCentroid *) ShmIncomingSibInPTR->Centroid;
+  PrepareSibCentroid(ShmIncomingSibInPTR, CEN_INV_ALGO, 0.0f, 0.0f);
+#endif /* (__sparc__) */
+  endTimeCoarse = sibCentroid->endIntegCoarse;
+  endTimeFine = sibCentroid->endIntegFine;
+  CrIaPaste(INTEGENDTIMECRS_ID, &endTimeCoarse);
+  CrIaPaste(INTEGENDTIMEFINE_ID, &endTimeFine);
+  
+  /* 
+     store the information of the SDS and SAA flags 
+  */
+#if (__sparc__)
+  sibPhotometry = (struct SibPhotometry *) incomingSibInStruct.Photometry;
+#else
+  sibPhotometry = (struct SibPhotometry *) ShmIncomingSibInPTR->Photometry;
+#endif /* (__sparc__) */
+
+  sibPhotometry->FlagsActive = 0;
+  
+  CrIaCopy(ISSAAACTIVE_ID, &isSaaActive);
+  if (isSaaActive == 1)
+    {
+      sibPhotometry->FlagsActive = DATA_SAA;
+    }
+  
+  CrIaCopy(ISSDSACTIVE_ID, &isSdsActive);
+  if (isSdsActive == 1)
+    {
+      /* SDS overrules the SAA state */
+      sibPhotometry->FlagsActive = DATA_SUSPEND; 
+    }
+
+  /* initialize the other SibPhotometry values */
+  sibPhotometry->centrum = 0.0f;
+  sibPhotometry->annulus1 = 0.0f;
+  sibPhotometry->annulus2 = 0.0f;
+  
+  /* no outcome */
+  
+  return;
+}
+
+
+/** Guard on the Control Flow from DECISION1 to DECISION2. */
+/* this is the first thing that is executed for a new report */
+FwPrBool_t CrIaSciDataUpdHasSdscLegalVal(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short CurrentPacketNum;
+  unsigned short TotalPacketNum;
+  CrFwPckt_t     pckt;
+
+  pckt = S21SemPacket; /* (CrFwPckt_t) FwPrGetData(prDescSciDataUpd); */
+
+  CrSemServ21DatCcdWindowParamGetHkStatCurrentPacketNum (&CurrentPacketNum, pckt);
+  CrSemServ21DatCcdWindowParamGetHkStatTotalPacketNum (&TotalPacketNum, pckt);
+
+  if (CurrentPacketNum == 0)
+    return 0;
+
+  if (CurrentPacketNum > TotalPacketNum)
+    return 0;
+
+  return 1;
+}
+
+/** Guard on the Control Flow from DECISION2 to N3. */
+FwPrBool_t CrIaSciDataUpdIsSdscOutOfSeq(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short CurrentPacketNum;
+  CrFwPckt_t     pckt;
+
+  DEBUGP("Guard D2/N3.\n");
+
+  pckt = S21SemPacket; /* (CrFwPckt_t) FwPrGetData(prDescSciDataUpd); */
+  CrSemServ21DatCcdWindowParamGetHkStatCurrentPacketNum (&CurrentPacketNum, pckt);
+
+  /* sdsc value is out of seq if it differs from 1 and from n+1 (n is last sdsc report) */
+  /* NOTE: in this rule sequences of 1 are valid, but this could also be intentional */
+
+  if (CurrentPacketNum == (S21LastPacketNum + 1))
+    {
+      S21LastPacketNum = CurrentPacketNum;
+      return 0;
+    }
+
+  if (CurrentPacketNum == 1)
+    {
+      S21LastPacketNum = CurrentPacketNum;
+      return 0;
+    }
+
+  return 1; /* 1 means out of sync */
+}
+
+/** Guard on the Control Flow from DECISION3 to N4. */
+FwPrBool_t CrIaSciDataUpdIsSibTooSmall(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  CrFwPckt_t   pckt;
+
+  unsigned char  AcqType;
+  unsigned short NumDataWords;
+  unsigned int end, size;
+
+  pckt = S21SemPacket; /* (CrFwPckt_t) FwPrGetData(prDescSciDataUpd); */
+
+  /* check if sib slot is too small to hold new patch of science data
+     this depends on the acquisition type */
+  CrSemServ21DatCcdWindowParamGetHkStatDataAcqType (&AcqType, pckt);
+  CrSemServ21DatCcdWindowParamGetHkStatNumDataWords (&NumDataWords, pckt);
+
+#if (__sparc__)
+  switch (AcqType)
+    {
+    case CCD_FULL_ID :
+    case CCD_WIN_EXPOS_ID :
+
+      end = (incomingSibInStruct.ExposSamples + NumDataWords) * BPW_PIXEL;
+      size = incomingSibInStruct.ExposSize;
+      break;
+
+    case CCD_WIN_LSM_ID :
+
+      end = (incomingSibInStruct.LsmSamples + NumDataWords) * BPW_PIXEL;
+      size = incomingSibInStruct.LsmSize;
+      break;
+
+    case CCD_WIN_RSM_ID :
+
+      end = (incomingSibInStruct.RsmSamples + NumDataWords) * BPW_PIXEL;
+      size = incomingSibInStruct.RsmSize;
+      break;
+
+    case CCD_WIN_TM_ID :
+
+      end = (incomingSibInStruct.TmSamples + NumDataWords) * BPW_PIXEL;
+      size = incomingSibInStruct.TmSize;
+      break;
+
+    default:
+      /* NOTE: cannot be reached by design */
+      return 1;
+    }
+#else
+  switch (AcqType)
+    {
+    case CCD_FULL_ID :
+    case CCD_WIN_EXPOS_ID :
+
+      end = (ShmIncomingSibInPTR->ExposSamples + NumDataWords) * BPW_PIXEL;
+      size = ShmIncomingSibInPTR->ExposSize;
+      break;
+
+    case CCD_WIN_LSM_ID :
+
+      end = (ShmIncomingSibInPTR->LsmSamples + NumDataWords) * BPW_PIXEL;
+      size = ShmIncomingSibInPTR->LsmSize;
+      break;
+
+    case CCD_WIN_RSM_ID :
+
+      end = (ShmIncomingSibInPTR->RsmSamples + NumDataWords) * BPW_PIXEL;
+      size = ShmIncomingSibInPTR->RsmSize;
+      break;
+
+    case CCD_WIN_TM_ID :
+
+      end = (ShmIncomingSibInPTR->TmSamples + NumDataWords) * BPW_PIXEL;
+      size = ShmIncomingSibInPTR->TmSize;
+      break;
+
+    default:
+      /* NOTE: cannot be reached by design */
+      return 1;
+    }
+#endif /* (__sparc__) */
+
+  if (end > size)
+    {
+      /* int the case of an excess we generate the event in N4 */
+      return 1;
+    }
+
+  return 0;
+}
+
+/** Guard on the Control Flow from DECISION4 to N1. */
+FwPrBool_t CrIaSciDataUpdFlag1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned int   AcqId;
+  CrFwPckt_t     pckt;
+
+  pckt = S21SemPacket; /* (CrFwPckt_t) FwPrGetData(prDescSciDataUpd); */
+  CrSemServ21DatCcdWindowParamGetHkStatDataAcqId (&AcqId, pckt);
+
+  /* flag1 true, when report is the first one of a new image and the curr img is not the first image
+     since science was started (report has new acq id and acq image count not zero) */
+
+  if (AcqId != S21LastAcqId) /* it will be updated in N1 */
+    {
+      if (S21LastAcqId == 0xffffffff) /* equivalent to: if (AcqImageCnt != 0) */
+        {
+          DEBUGP("FIRST REP OF FIRST FRAME\n");
+          S21_Flag0 = 1;
+          /* do not raise the S21_Flag1 */
+        }
+      else
+        {
+          DEBUGP("FIRST REP OF FRAME\n");
+          S21_Flag1 = 1;
+        }
+
+      /* in BOTH cases go to N1 where the incomingSibInStruct will be initialized */
+      DEBUGP("GO to N1!\n");
+
+      return 1;
+    }
+
+  DEBUGP("REP_WITHIN_FRAME\n");
+  DEBUGP("GO to D2/D3!\n");
+  /*  S21_Flag1 = 0; will be cleared in the SEM Oper DO Action */
+
+  return 0;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaSciDataUpdInit.txt b/CrIa/src/CrIaPrSm/CrIaSciDataUpdInit.txt
new file mode 100644
index 0000000..ea60aab
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSciDataUpdInit.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaSciDataUpdCreate(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaSciDataUpd is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaSciDataUpd is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSciWinCreate.c b/CrIa/src/CrIaPrSm/CrIaSciWinCreate.c
new file mode 100644
index 0000000..f86079d
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSciWinCreate.c
@@ -0,0 +1,57 @@
+/**
+ * @file CrIaSciWinCreate.c
+ *
+ * @author FW Profile code generator version 5.01
+ * @date Created on: Jul 16 2018 16:41:56
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaSciWin function definitions */
+#include "CrIaSciWinCreate.h"
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaSciWinCreate(void* prData)
+{
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+    11,	/* N_ANODES - The number of action nodes */
+    0,	/* N_DNODES - The number of decision nodes */
+    12,	/* N_FLOWS - The number of control flows */
+    11,	/* N_ACTIONS - The number of actions */
+    5	/* N_GUARDS - The number of guards */
+  );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddActionNode(prDesc, CrIaSciWin_N4, &CrIaSciWinN4);
+  FwPrAddActionNode(prDesc, CrIaSciWin_N5, &CrIaSciWinN5);
+  FwPrAddActionNode(prDesc, CrIaSciWin_N1, &CrIaSciWinN1);
+  FwPrAddActionNode(prDesc, CrIaSciWin_N9, &CrIaSciWinN9);
+  FwPrAddActionNode(prDesc, CrIaSciWin_N10, &CrIaSciWinN10);
+  FwPrAddActionNode(prDesc, CrIaSciWin_N8, &CrIaSciWinN8);
+  FwPrAddActionNode(prDesc, CrIaSciWin_N2, &CrIaSciWinN2);
+  FwPrAddActionNode(prDesc, CrIaSciWin_N3, &CrIaSciWinN3);
+  FwPrAddActionNode(prDesc, CrIaSciWin_N6, &CrIaSciWinN6);
+  FwPrAddActionNode(prDesc, CrIaSciWin_N5_1, &CrIaSciWinN5_1);
+  FwPrAddActionNode(prDesc, CrIaSciWin_N5_2, &CrIaSciWinN5_2);
+  FwPrAddFlowIniToAct(prDesc, CrIaSciWin_N1, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaSciWin_N4, CrIaSciWin_N5, &CrIaSciWinWaitT2);
+  FwPrAddFlowActToAct(prDesc, CrIaSciWin_N5, CrIaSciWin_N5_1, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaSciWin_N1, CrIaSciWin_N2, &CrIaSciWinIsSemInStab);
+  FwPrAddFlowActToAct(prDesc, CrIaSciWin_N9, CrIaSciWin_N10, NULL);
+  FwPrAddFlowActToFin(prDesc, CrIaSciWin_N10, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaSciWin_N8, CrIaSciWin_N9, &CrIaSciWinIsTerm);
+  FwPrAddFlowActToAct(prDesc, CrIaSciWin_N2, CrIaSciWin_N3, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaSciWin_N3, CrIaSciWin_N4, &CrIaSciWinWaitT1);
+  FwPrAddFlowActToAct(prDesc, CrIaSciWin_N6, CrIaSciWin_N8, &CrIaSciWinFlag1And2);
+  FwPrAddFlowActToAct(prDesc, CrIaSciWin_N5_1, CrIaSciWin_N5_2, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaSciWin_N5_2, CrIaSciWin_N6, NULL);
+
+  return prDesc;
+}
diff --git a/CrIa/src/CrIaPrSm/CrIaSciWinCreate.h b/CrIa/src/CrIaPrSm/CrIaSciWinCreate.h
new file mode 100644
index 0000000..aa86aeb
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSciWinCreate.h
@@ -0,0 +1,193 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaSciWin procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ * @image html CrIaSciWin.png
+ *
+ * @author FW Profile code generator version 5.01
+ * @date Created on: Jul 16 2018 16:41:56
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaSciWinCreate_H_
+#define CrIaSciWinCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaSciWin_N1 (1)		/* The identifier of action node N1 in procedure CrIaSciWin */
+#define CrIaSciWin_N2 (2)		/* The identifier of action node N2 in procedure CrIaSciWin */
+#define CrIaSciWin_N3 (3)		/* The identifier of action node N3 in procedure CrIaSciWin */
+#define CrIaSciWin_N4 (4)		/* The identifier of action node N4 in procedure CrIaSciWin */
+#define CrIaSciWin_N5 (5)		/* The identifier of action node N5 in procedure CrIaSciWin */
+#define CrIaSciWin_N5_1 (6)		/* The identifier of action node N5_1 in procedure CrIaSciWin */
+#define CrIaSciWin_N5_2 (7)		/* The identifier of action node N5_2 in procedure CrIaSciWin */
+#define CrIaSciWin_N6 (8)		/* The identifier of action node N6 in procedure CrIaSciWin */
+#define CrIaSciWin_N8 (9)		/* The identifier of action node N8 in procedure CrIaSciWin */
+#define CrIaSciWin_N9 (10)		/* The identifier of action node N9 in procedure CrIaSciWin */
+#define CrIaSciWin_N10 (11)		/* The identifier of action node N10 in procedure CrIaSciWin */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaSciWinCreate(void* prData);
+
+/**
+ * Action for node N4.
+ * Send cmd (220,11) to SEM
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSciWinN4(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N5.
+ * <pre>
+ * Send command GoToCcdWindow
+ * to SEM Unit State Machine
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSciWinN5(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N1.
+ * <pre>
+ * Generate Event Report
+ * EVT_SC_PR_STRT
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSciWinN1(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N9.
+ * <pre>
+ * Stop Compression/Collection
+ * and Centroiding Algorithms
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSciWinN9(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N10.
+ * <pre>
+ * Generate Event Report
+ * EVT_SC_PR_END with
+ * outcome equal to: "success"
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSciWinN10(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N8.
+ * <pre>
+ * Send command GoToStabilize
+ * to SEM Unit State Machine
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSciWinN8(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N2.
+ * <pre>
+ * Update SEM configuration
+ * parameters in the data pool
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSciWinN2(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N3.
+ * Send cmd (220,3) to SEM
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSciWinN3(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N6.
+ * <pre>
+ * Start Compression/Collection
+ * Algorithm
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSciWinN6(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N5_1.
+ * <pre>
+ * Enable selected
+ * centroiding algorithm
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSciWinN5_1(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N5_2.
+ * Start Centroiding Algorithms
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSciWinN5_2(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N4 to N5.
+ *  Wait sciWinStackT2 cycles 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSciWinWaitT2(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N1 to N2.
+ *  SEM State Machine is in STABILIZE 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSciWinIsSemInStab(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N9 to N10.
+ * <pre>
+ *  (SEM Operational SM is in STABILIZE) &&
+ * (All sporadic activities have terminated) 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSciWinIsTerm(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N3 to N4.
+ * Wait sciWinStackT1 cycles 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSciWinWaitT1(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N6 to N8.
+ *  Flag_1 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSciWinFlag1And2(FwPrDesc_t prDesc);
+
+#endif /* CrIaSciWinCreate_H_ */
diff --git a/CrIa/src/CrIaPrSm/CrIaSciWinFunc.c b/CrIa/src/CrIaPrSm/CrIaSciWinFunc.c
new file mode 100644
index 0000000..1b65b53
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSciWinFunc.c
@@ -0,0 +1,375 @@
+/**
+ * @file CrIaSciWinFunc.c
+ * @ingroup CrIaPrSci
+ * @author FW Profile code generator version 5.01; Institute for Astrophysics, 2015-2016
+ * @date Created on: Jul 16 2018 16:41:56
+ *
+ * @brief Implementation of the Calibration Full Snap Procedure nodes and guards.
+ * Perform an observation of type SCI/WIN/STACK or SCI/WIN/SNAP with 'WIN' being any of the window sub-modes.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include <FwProfile/FwSmConfig.h>
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwPrCore.h>
+
+#include <FwProfile/FwPrCore.h> /* for FwPrGetCurNode() */
+
+/** Cordet FW function definitions */
+#include <CrFramework/OutFactory/CrFwOutFactory.h>
+#include <CrFramework/OutLoader/CrFwOutLoader.h>
+#include <CrFramework/OutCmp/CrFwOutCmp.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+#include <Services/General/CrIaConstants.h>
+#include <Services/General/CrSemConstants.h>
+
+/** CrIaSciWin function definitions */
+#include "CrIaSciWinCreate.h"
+
+#include <CrIaIasw.h> /* for Event Reporting and extern sm and prDescriptors */
+#include <CrIaPrSm/CrIaSemCreate.h> /* for GoToCcdWindow and GoToStabilize */
+#include <CrIaPrSm/CrIaAlgoCreate.h> /* for Start and Stop */
+
+#include <IfswDebug.h>
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N1. */
+void CrIaSciWinN1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short evt_data[2];
+  unsigned short ProcId = CRIA_SERV198_SCI_STACK_PR;
+
+  /* Generate event report EVT_SC_PR_STRT */
+
+  evt_data[0] = ProcId;
+  evt_data[1] = 0; /* NOT USED */
+
+  DEBUGP("SciWin N1: Event %d generated to signal start of SCI STACK PR\n", ProcId);
+  CrIaEvtRep(1, CRIA_SERV5_EVT_SC_PR_STRT, evt_data, 4);
+
+  return;
+}
+
+/** Action for node N2. */
+void CrIaSciWinN2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short utemp16;
+  unsigned int utemp32;
+
+  /* Update SEM configuration parameters in the data pool */
+
+  DEBUGP("SciWin N3: Update SEM configuration parameters in the data pool\n");
+
+  /* needed for TC(220/3) CMD_Operation_Parameter */
+
+  CrIaCopy(SCIWIN_PEXPTIME_ID, &utemp32);
+  CrIaPaste(PEXPTIME_ID, &utemp32);
+
+  CrIaCopy(SCIWIN_PIMAGEREP_ID, &utemp32);
+  CrIaPaste(PIMAGEREP_ID, &utemp32);
+
+  CrIaCopy(SCIWIN_PNMBIMAGES_ID, &utemp32);
+  CrIaPaste(PACQNUM_ID, &utemp32);
+
+  utemp16 = 0; /* means "NO" */
+  CrIaPaste(PDATAOS_ID, &utemp16);
+
+  CrIaCopy(SCIWIN_PCCDRDMODE_ID, &utemp16);
+  CrIaPaste(PCCDRDMODE_ID, &utemp16);
+
+  /* needed for TC(220/11) CMD_Functional_Parameter */
+
+  CrIaCopy(SCIWIN_PWINPOSX_ID, &utemp16);
+  CrIaPaste(PWINPOSX_ID, &utemp16);
+
+  CrIaCopy(SCIWIN_PWINPOSY_ID, &utemp16);
+  CrIaPaste(PWINPOSY_ID, &utemp16);
+
+  CrIaCopy(SCIWIN_PWINSIZEX_ID, &utemp16);
+  CrIaPaste(PWINSIZEX_ID, &utemp16);
+
+  CrIaCopy(SCIWIN_PWINSIZEY_ID, &utemp16);
+  CrIaPaste(PWINSIZEY_ID, &utemp16);
+
+  return;
+}
+
+/** Action for node N3. */
+void CrIaSciWinN3(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  FwSmDesc_t cmd;
+  CrFwBool_t accept=1, start=0, progress=0, term=1;
+
+  /* Send cmd (220,3) to SEM */
+  /* Changes the SEM Operational Parameter */
+
+  DEBUGP("SciWin N3: Send cmd (220,3) to SEM\n");
+
+  cmd = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRSEM_SERV220, CRSEM_SERV220_CMD_OPER_PARAM, 0, 0);
+  if (cmd == NULL)
+    {
+      /* handled by Resource FdCheck */
+      return;
+    }
+
+  /* NOTE: parameters are set in the cmd update action according to the data pool entries */
+
+  CrFwOutCmpSetAckLevel(cmd, accept, start, progress, term);
+  CrFwOutCmpSetDest(cmd, CR_FW_CLIENT_SEM);
+  CrFwOutLoaderLoad(cmd);
+
+  return;
+}
+
+/** Action for node N4. */
+void CrIaSciWinN4(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  FwSmDesc_t cmd;
+  CrFwBool_t accept=1, start=0, progress=0, term=1;
+
+  /* Send cmd (220,11) to SEM */
+  /* Changes the SEM Functional Parameter */
+
+  DEBUGP("SciWin N4: Send cmd (220,11) to SEM\n");
+
+  cmd = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRSEM_SERV220, CRSEM_SERV220_CMD_FUNCT_PARAM, 0, 0);
+  if (cmd == NULL)
+    {
+      /* handled by Resource FdCheck */
+      return;
+    }
+
+  /* NOTE: parameters are set in the cmd update action according to the data pool entries */
+
+  CrFwOutCmpSetAckLevel(cmd, accept, start, progress, term);
+  CrFwOutCmpSetDest(cmd, CR_FW_CLIENT_SEM);
+  CrFwOutLoaderLoad(cmd);
+
+  return;
+}
+
+/** Action for node N5. */
+void CrIaSciWinN5(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Send command GoToCcdWindow to SEM Unit State Machine */
+
+  DEBUGP("SciWin N5: Send command GoToCcdWindow to SEM Unit State Machine\n");
+
+  FwSmMakeTrans(smDescSem, GoToCcdWindow);
+
+  return;
+}
+
+/** Action for node N5_1. */
+void CrIaSciWinN5_1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char defCentEnabled = 0, dumCentEnabled = 0;
+  unsigned short pCentSel;
+
+  /* Enable the selected centroiding algorithm */
+
+  DEBUGP("SciWin N5_1: Enable the selected centroiding algorithm\n");
+
+  CrIaCopy(SCIWIN_PCENTSEL_ID, &pCentSel);
+
+  if (pCentSel != NO_CENT)
+    {
+      if (pCentSel == DUM_CENT)
+        {
+          dumCentEnabled = 1;
+        }
+      else
+        {
+          defCentEnabled = 1;
+        }
+    }
+
+  CrIaPaste(ALGOCENT0ENABLED_ID, &dumCentEnabled);
+  CrIaPaste(ALGOCENT1ENABLED_ID, &defCentEnabled);
+
+  return;
+}
+
+/** Action for node N5_2. */
+void CrIaSciWinN5_2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Start Centroiding Algorithms */
+
+  DEBUGP("SciWin N5_2: Start Centroiding Algorithms\n");
+
+  FwSmMakeTrans(smDescAlgoCent0, Start);
+  FwSmMakeTrans(smDescAlgoCent1, Start);
+
+  return;
+}
+
+/** Action for node N6. */
+void CrIaSciWinN6(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Start Compression/Collection Algorithm */
+
+  PRDEBUGP("SciWin N6: Start Compression/Collection Algorithm\n");
+
+  FwSmMakeTrans(smDescAlgoCmpr, Start);
+
+  return;
+}
+
+/** Action for node N8. */
+void CrIaSciWinN8(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Send command GoToStabilize to SEM Unit State Machine */
+
+  DEBUGP("SciWin N8: Send command GoToStabilize to SEM Unit State Machine\n");
+
+  FwSmMakeTrans(smDescSem, GoToStabilize);
+
+  return;
+}
+
+/** Action for node N9. */
+void CrIaSciWinN9(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Stop Collection, Compression and Centroiding Algorithms */
+
+  DEBUGP("SciWin N9: Stop Collection, Compression and Centroiding Algorithms\n");
+
+  FwSmMakeTrans(smDescAlgoCent0, Stop);
+  FwSmMakeTrans(smDescAlgoCent1, Stop);
+  FwSmMakeTrans(smDescAlgoCmpr, Stop);
+
+  return;
+}
+
+/** Action for node N10. */
+void CrIaSciWinN10(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short evt_data[2];
+  unsigned short ProcId = CRIA_SERV198_SCI_STACK_PR;
+
+  /* Generate event report EVT_SC_PR_END with outcome "success" */
+
+  evt_data[0] = ProcId;
+  evt_data[1] = 1; /* 1 means success */
+
+  DEBUGP("SciWin N10: Event %d generated to signal end (but not stop) of SCI STACK PR\n", ProcId);
+  CrIaEvtRep(1, CRIA_SERV5_EVT_SC_PR_END, evt_data, 4);
+
+  return;
+}
+
+/**************/
+/*** GUARDS ***/
+/**************/
+
+/** Guard on the Control Flow from N1 to N2. */
+FwPrBool_t CrIaSciWinIsSemInStab(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short sem_oper_state;
+
+  /* [ SEM State Machine is in STABILIZE ] */
+
+  /* get current state */
+  sem_oper_state = FwSmGetCurStateEmb(smDescSem);
+
+  if (sem_oper_state == CrIaSem_STABILIZE)
+    return 1;
+
+  return 0;
+}
+
+/** Guard on the Control Flow from N3 to N4. */
+FwPrBool_t CrIaSciWinWaitT1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned int sciWinT1;
+
+  CrIaCopy(SCIWINT1_ID, &sciWinT1);
+
+  /* Wait sciWinStackT1 cycles */
+  if (FwPrGetNodeExecCnt(prDesc) < sciWinT1)
+    {
+      return 0;
+    }
+  else
+    {
+      return 1;
+    }
+}
+
+/** Guard on the Control Flow from N4 to N5. */
+FwPrBool_t CrIaSciWinWaitT2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned int sciWinT2;
+
+  CrIaCopy(SCIWINT2_ID, &sciWinT2);
+
+  /* Wait sciWinStackT2 cycles */
+  if (FwPrGetNodeExecCnt(prDesc) < sciWinT2)
+    {
+      return 0;
+    }
+  else
+    {
+      return 1;
+    }
+}
+
+/** Guard on the Control Flow from N6 to N8. */
+FwPrBool_t CrIaSciWinFlag1And2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned int AcqImageCnt;
+  unsigned int SciWin_pNmbImages;
+  unsigned char lstpckt;
+  
+  /* [ Flag_1 ] */
+  /* Flag_1: is true in cycle in which (acqImageCnt+1) is equal to pNmbImages and LastSemPckt is true */
+
+  CrIaCopy(ACQIMAGECNT_ID, &AcqImageCnt);
+  CrIaCopy(SCIWIN_PNMBIMAGES_ID, &SciWin_pNmbImages);
+  CrIaCopy(LASTSEMPCKT_ID, &lstpckt);
+  
+  DEBUGP("%u %u %u\n", AcqImageCnt, SciWin_pNmbImages, lstpckt);
+  
+  if (((AcqImageCnt+1) == SciWin_pNmbImages) && (lstpckt == 1))
+      return 1;
+  
+  return 0;
+}
+
+/** Guard on the Control Flow from N8 to N9. */
+FwPrBool_t CrIaSciWinIsTerm(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short sem_oper_state, Cpu2ProcStatus;
+
+  /* get current state */
+  sem_oper_state = FwSmGetCurStateEmb(smDescSem);
+
+  /* get state of second CPU */
+  CrIaCopy(CPU2PROCSTATUS_ID, &Cpu2ProcStatus);
+
+  if (sem_oper_state == CrIaSem_STABILIZE) /* SEM Operational SM is in STABILIZE */
+    if (Cpu2ProcStatus == SDP_STATUS_IDLE) /* All sporadic activities have terminated */
+      return 1;
+
+  return 0;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaSciWinInit.txt b/CrIa/src/CrIaPrSm/CrIaSciWinInit.txt
new file mode 100644
index 0000000..c4d6527
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSciWinInit.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaSciWinCreate(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaSciWin is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaSciWin is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSdbCreate.c b/CrIa/src/CrIaPrSm/CrIaSdbCreate.c
new file mode 100644
index 0000000..1b9d832
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSdbCreate.c
@@ -0,0 +1,59 @@
+/**
+ * @file CrIaSdbCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwSmDCreate.h"
+#include "FwProfile/FwSmConfig.h"
+
+/** CrIaSdb function definitions */
+#include "CrIaSdbCreate.h"
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwSmDesc_t CrIaSdbCreate(void* smData)
+{
+  const FwSmCounterU2_t N_OUT_OF_UNCONFIGURED = 2;	/* The number of transitions out of state UNCONFIGURED */
+  const FwSmCounterU2_t N_OUT_OF_CONFIG_FULL = 3;	/* The number of transitions out of state CONFIG_FULL */
+  const FwSmCounterU2_t CHOICE1 = 1;		/* The identifier of choice pseudo-state CHOICE1 in State Machine CrIaSdb */
+  const FwSmCounterU2_t N_OUT_OF_CHOICE1 = 2;	/* The number of transitions out of the choice-pseudo state CHOICE1 */
+  const FwSmCounterU2_t N_OUT_OF_CONFIG_WIN = 3;	/* The number of transitions out of state CONFIG_WIN */
+  const FwSmCounterU2_t CHOICE2 = 2;		/* The identifier of choice pseudo-state CHOICE2 in State Machine CrIaSdb */
+  const FwSmCounterU2_t N_OUT_OF_CHOICE2 = 2;	/* The number of transitions out of the choice-pseudo state CHOICE2 */
+
+  /** Create state machine smDesc */
+  FwSmDesc_t smDesc = FwSmCreate(
+                        3,	/* NSTATES - The number of states */
+                        2,	/* NCPS - The number of choice pseudo-states */
+                        13,	/* NTRANS - The number of transitions */
+                        4,	/* NACTIONS - The number of state and transition actions */
+                        2	/* NGUARDS - The number of transition guards */
+                      );
+
+  /** Configure the state machine smDesc */
+  FwSmSetData(smDesc, smData);
+  FwSmAddState(smDesc, CrIaSdb_UNCONFIGURED, N_OUT_OF_UNCONFIGURED, NULL, NULL, NULL, NULL);
+  FwSmAddState(smDesc, CrIaSdb_CONFIG_FULL, N_OUT_OF_CONFIG_FULL, &CrIaSdbConfigFullEntry, NULL, NULL, NULL);
+  FwSmAddChoicePseudoState(smDesc, CHOICE1, N_OUT_OF_CHOICE1);
+  FwSmAddState(smDesc, CrIaSdb_CONFIG_WIN, N_OUT_OF_CONFIG_WIN, &CrIaSdbConfigWinEntry, NULL, NULL, NULL);
+  FwSmAddChoicePseudoState(smDesc, CHOICE2, N_OUT_OF_CHOICE2);
+  FwSmAddTransStaToCps(smDesc, ConfigFull, CrIaSdb_UNCONFIGURED, CHOICE1, &CrIaSdbAction1, NULL);
+  FwSmAddTransStaToCps(smDesc, ConfigWin, CrIaSdb_UNCONFIGURED, CHOICE2, &CrIaSdbAction1, NULL);
+  FwSmAddTransStaToSta(smDesc, Reset, CrIaSdb_CONFIG_FULL, CrIaSdb_UNCONFIGURED, NULL, NULL);
+  FwSmAddTransStaToSta(smDesc, ResetFull, CrIaSdb_CONFIG_FULL, CrIaSdb_CONFIG_FULL, NULL, NULL);
+  FwSmAddTransStaToSta(smDesc, ResetWin, CrIaSdb_CONFIG_FULL, CrIaSdb_CONFIG_WIN, NULL, NULL);
+  FwSmAddTransIpsToSta(smDesc, CrIaSdb_UNCONFIGURED, NULL);
+  FwSmAddTransCpsToSta(smDesc, CHOICE1, CrIaSdb_CONFIG_FULL, &CrIaSdbAction2, &CrIaSdbIsConfigSuccess);
+  FwSmAddTransCpsToSta(smDesc, CHOICE1, CrIaSdb_UNCONFIGURED, NULL, &CrIaSdbIsConfigFailed);
+  FwSmAddTransStaToSta(smDesc, ResetFull, CrIaSdb_CONFIG_WIN, CrIaSdb_CONFIG_FULL, NULL, NULL);
+  FwSmAddTransStaToSta(smDesc, Reset, CrIaSdb_CONFIG_WIN, CrIaSdb_UNCONFIGURED, NULL, NULL);
+  FwSmAddTransStaToSta(smDesc, ResetWin, CrIaSdb_CONFIG_WIN, CrIaSdb_CONFIG_WIN, NULL, NULL);
+  FwSmAddTransCpsToSta(smDesc, CHOICE2, CrIaSdb_CONFIG_WIN, &CrIaSdbAction2, &CrIaSdbIsConfigSuccess);
+  FwSmAddTransCpsToSta(smDesc, CHOICE2, CrIaSdb_UNCONFIGURED, NULL, &CrIaSdbIsConfigFailed);
+
+  return smDesc;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSdbCreate.h b/CrIa/src/CrIaPrSm/CrIaSdbCreate.h
new file mode 100644
index 0000000..eacd08e
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSdbCreate.h
@@ -0,0 +1,105 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaSdb state machine.
+ * The state machine is configured with a set of function pointers representing the non-default
+ * actions and guards of the state machine. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the state machine in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The state machine created by this file is shown in the figure below.
+ * @image html CrIaSdb.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaSdbCreate_H_
+#define CrIaSdbCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwSmConstants.h"
+
+/** State identifiers */
+#define CrIaSdb_CONFIG_FULL 1		/* The identifier of state CONFIG_FULL in State Machine CrIaSdb */
+#define CrIaSdb_CONFIG_WIN 2		/* The identifier of state CONFIG_WIN in State Machine CrIaSdb */
+#define CrIaSdb_UNCONFIGURED 3		/* The identifier of state UNCONFIGURED in State Machine CrIaSdb */
+
+/** The identifiers of transition commands (triggers) */
+#define ConfigFull 21
+#define ConfigWin 22
+#define ResetFull 23
+#define Reset 2
+#define ResetWin 24
+
+/**
+ * Create a new state machine descriptor.
+ * This interface creates the state machine descriptor dynamically.
+ * @param smData the pointer to the state machine data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the state machine data when the state machine is created is NULL).
+ * @return the pointer to the state machine descriptor
+ */
+FwSmDesc_t CrIaSdbCreate(void* smData);
+
+/**
+ * Entry Action for the state CONFIG_FULL.
+ * <pre>
+ * Initialize sibIn, sibOut, cibIn and 
+ * gibIn to point to first SIB, CIB and 
+ * GIB for CCD Full images.
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSdbConfigFullEntry(FwSmDesc_t smDesc);
+
+/**
+ * Entry Action for the state CONFIG_WIN.
+ * <pre>
+ * Initialize sibIn, sibOut, cibIn and 
+ * gibIn to point to first SIB, CIB and 
+ * GIB for CCD Window images.
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSdbConfigWinEntry(FwSmDesc_t smDesc);
+
+/**
+ * Action on the transition from UNCONFIGURED to CHOICE1.
+ * Action_1
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSdbAction1(FwSmDesc_t smDesc);
+
+/**
+ * Action on the transition from CHOICE2 to CONFIG_WIN.
+ * Action_2
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSdbAction2(FwSmDesc_t smDesc);
+
+/**
+ * Guard on the transition from CHOICE2 to CONFIG_WIN.
+ * <pre>
+ *  SDB Configuration was
+ * successful 
+ * </pre>
+ * @param smDesc the state machine descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwSmBool_t CrIaSdbIsConfigSuccess(FwSmDesc_t smDesc);
+
+/**
+ * Guard on the transition from CHOICE2 to UNCONFIGURED.
+ * <pre>
+ *  SDB Configuration
+ * failed 
+ * </pre>
+ * @param smDesc the state machine descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwSmBool_t CrIaSdbIsConfigFailed(FwSmDesc_t smDesc);
+
+#endif /* CrIaSdbCreate_H_ */
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSdbFunc.c b/CrIa/src/CrIaPrSm/CrIaSdbFunc.c
new file mode 100644
index 0000000..7b94188
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSdbFunc.c
@@ -0,0 +1,304 @@
+/**
+ * @file CrIaSdbFunc.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwSmConstants.h"
+#include "FwProfile/FwSmDCreate.h"
+#include "FwProfile/FwSmConfig.h"
+#include "FwProfile/FwSmCore.h"
+#include "CrFwCmpData.h"
+
+/** CrIaSdb function definitions */
+#include "CrIaSdbCreate.h"
+
+/* access to data pool */
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+#include <Services/General/CrIaParamGetter.h>
+
+#include "IfswDebug.h"
+
+#include "Sdp/SdpBuffers.h"
+
+#include <CrIaIasw.h> /* for *sibAddressFull, ... */
+
+#if (__sparc__)
+#include <wrap_malloc.h> /* for sram2 address */
+#else
+#include "Sdp/SdpBuffers.h"
+#endif
+
+/* needed to tell the guard CrIaSdbIsConfigSuccess about the action1 outcome */
+unsigned int SdbAllocFail = 0;
+
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Entry Action for the state CONFIG_FULL. */
+void CrIaSdbConfigFullEntry(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  /* initialize cibIn and gibIn to point to first CIB and GIB for CCD Full images. */
+  unsigned short SibInFull, SibOutFull, CibInFull, GibInFull, GibOutFull;
+  unsigned short SdbState;
+  unsigned int base = 0;
+  unsigned int gibbase = 0;
+
+  gibbase = GET_ADDR_FROM_RES_OFFSET(0);  
+  base = GET_ADDR_FROM_SDB_OFFSET(0);
+  
+  /* set SDB state to FULL */
+  SdbState = CrIaSdb_CONFIG_FULL;
+  CrIaPaste(SDBSTATE_ID, &SdbState);
+
+  /* assign the addresses, note that they are addresses in kiB */
+  SibInFull  = (unsigned short)(((unsigned int)sibAddressFull - base) >> 10);
+  SibOutFull = (unsigned short)(((unsigned int)sibAddressFull - base) >> 10);
+  CibInFull  = (unsigned short)(((unsigned int)cibAddressFull - base) >> 10);
+  GibInFull  = (unsigned short)(((unsigned int)gibAddressFull - gibbase) >> 10);
+  GibOutFull = (unsigned short)(((unsigned int)gibAddressFull - gibbase) >> 10);
+
+  CrIaPaste(SIBIN_ID, &SibInFull);
+  CrIaPaste(SIBOUT_ID, &SibOutFull);
+  CrIaPaste(CIBIN_ID, &CibInFull);
+  CrIaPaste(GIBIN_ID, &GibInFull);
+  CrIaPaste(GIBOUT_ID, &GibOutFull);
+
+  return;
+}
+
+/** Entry Action for the state CONFIG_WIN. */
+void CrIaSdbConfigWinEntry(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  /* initialize cibIn and gibIn to point to first CIB and GIB for CCD Window images. */
+  unsigned short SibInWin, SibOutWin, CibInWin, GibInWin, GibOutWin;
+  unsigned short SdbState;
+  unsigned int base = 0;
+  unsigned int gibbase = 0;
+
+  gibbase = GET_ADDR_FROM_RES_OFFSET(0);
+  base = GET_ADDR_FROM_SDB_OFFSET(0);
+
+  /* set SDB state to WIN */
+  SdbState = CrIaSdb_CONFIG_WIN;
+  CrIaPaste(SDBSTATE_ID, &SdbState);
+
+  /* assign the addresses, note that they are addresses in kiB */
+  SibInWin  = (unsigned short)(((unsigned int)sibAddressWin - base) >> 10);
+  SibOutWin = (unsigned short)(((unsigned int)sibAddressWin - base) >> 10);
+  CibInWin  = (unsigned short)(((unsigned int)cibAddressFull - base) >> 10);  /* NOTE: the CIB is Full+Win together as one block, it starts with Full */
+  GibInWin  = (unsigned short)(((unsigned int)gibAddressWin - gibbase) >> 10);
+  GibOutWin = (unsigned short)(((unsigned int)gibAddressWin - gibbase) >> 10);
+  
+  CrIaPaste(SIBIN_ID, &SibInWin);
+  CrIaPaste(SIBOUT_ID, &SibOutWin);
+  CrIaPaste(CIBIN_ID, &CibInWin);
+  CrIaPaste(GIBIN_ID, &GibInWin);
+  CrIaPaste(GIBOUT_ID, &GibOutWin);
+
+  DEBUGP("Entry action into CONFIG_WIN\n");
+
+  return;
+}
+
+/** Action on the transition from UNCONFIGURED to CHOICE1. */
+void CrIaSdbAction1(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short CibNFull, SibNFull, GibNFull, SibNWin, CibNWin, GibNWin;
+  unsigned short CibSizeFull, SibSizeFull, GibSizeFull, CibSizeWin, SibSizeWin, GibSizeWin;
+  unsigned int CibSize, SibSize, GibSize;
+  unsigned int size;
+  unsigned short evt_data[2];
+  unsigned short ProcId = CRIA_SERV198_CONFIG_SDB_PR;
+
+  DEBUGP("transition from unconfigured to choice1 started\n");
+
+  /* get the sizes from the data pool,
+     i.e. these have to be overwritten by the caller before */
+  CrIaCopy(CIBNFULL_ID, &CibNFull);
+  CrIaCopy(CIBSIZEFULL_ID, &CibSizeFull);
+  CrIaCopy(SIBNFULL_ID, &SibNFull);
+  CrIaCopy(SIBSIZEFULL_ID, &SibSizeFull);
+  CrIaCopy(GIBNFULL_ID, &GibNFull);
+  CrIaCopy(GIBSIZEFULL_ID, &GibSizeFull);
+  CrIaCopy(SIBNWIN_ID, &SibNWin);
+  CrIaCopy(SIBSIZEWIN_ID, &SibSizeWin);
+  CrIaCopy(CIBNWIN_ID, &CibNWin);
+  CrIaCopy(CIBSIZEWIN_ID, &CibSizeWin);
+  CrIaCopy(GIBNWIN_ID, &GibNWin);
+  CrIaCopy(GIBSIZEWIN_ID, &GibSizeWin);
+
+  /* use the larger of full/win for SIB and CIB */
+  if (SibNFull * SibSizeFull > SibNWin * SibSizeWin)
+    SibSize = SibNFull * SibSizeFull;
+  else
+    SibSize = SibNWin * SibSizeWin;
+
+  if (CibNFull * CibSizeFull > CibNWin * CibSizeWin)
+    CibSize = CibNFull * CibSizeFull;
+  else
+    CibSize = CibNWin * CibSizeWin;
+
+  /* in the gib the two states win/full need to coexist */
+  GibSize = GibNFull * GibSizeFull + GibNWin * GibSizeWin;
+
+  /* now check sizes against the buffer limits */
+  SdbAllocFail = 0;
+  
+  /* check if the gib setting fits */
+  if (GibSize * 1024 > SRAM1_RES_SIZE)
+    {
+      /* error, too much RAM is requested */
+      SdbAllocFail = 1;
+    }
+
+  /* check for SIB + CIB */
+  if ((CibSize + SibSize)*1024 > SDB_SIZE) /* NOTE: count in kiB */
+    {
+      /* error, too much RAM is requested */
+      SdbAllocFail = 1;
+    }
+
+  if (SdbAllocFail == 1)
+    {
+      DEBUGP("transition from unconfigured to choice1 ended with a problem: nothing allocated\n");
+      DEBUGP("CibSize (Win) = %u\n", CibSizeWin);
+      DEBUGP("SibSize (Win) = %u\n", SibSizeWin);
+      DEBUGP("GibSize (Win) = %u\n", GibSizeWin);
+      DEBUGP("CibSize (Full) = %u\n", CibSizeFull);
+      DEBUGP("SibSize (Full) = %u\n", SibSizeFull);
+      DEBUGP("GibSize (Full) = %u\n", GibSizeFull);
+      DEBUGP("CibSize (Win+Full) = %u\n", CibSize);
+      DEBUGP("SibSize (Win+Full) = %u\n", SibSize);
+      DEBUGP("GibSize (Win+Full) = %u\n", GibSize);
+      DEBUGP("SDB_SIZE = %u\n", (unsigned int)SDB_SIZE);
+
+      ERRDEBUGP("ERROR allocating SDB\n");
+
+      evt_data[0] = ProcId;
+      evt_data[1] = 0; /* NOT USED */
+
+      CrIaEvtRep(3, CRIA_SERV5_EVT_SDB_CNF_FAIL, evt_data, 4);
+
+      return;
+    }
+
+  /*
+     configuration of the SDB.
+     Science Data Processing is asking to have the CIBs (win/full) in sequence
+
+     So we make the order:
+     SIB FULL/WIN
+     CIB FULL/WIN
+     GIB FULL (in SRAM1)
+     GIB WIN  (in SRAM1)
+  */
+
+  /* here we free the previously allocated SDB ram */
+#if (__sparc__)
+  release (SDB);
+#else
+  sdballoc (0, 1); /* reset on PC */
+#endif
+
+  /* SIB (shared, size defined by the larger of win or full) */
+  size = SibSize * 1024;
+
+  if (size != 0)
+    {
+      sibAddressFull = SDBALLOC(size, SDB);
+      sibAddressWin = sibAddressFull;
+    }
+  else
+    {
+      sibAddressFull = NULL;
+      sibAddressWin = NULL;      
+    }
+      
+  /* CIB (shared, size defined by the larger of win or full */
+  size = CibSize * 1024;
+
+  if (size != 0)
+    {
+      cibAddressFull = SDBALLOC(size, SDB);
+      cibAddressWin = cibAddressFull;
+    }
+  else
+    {
+      cibAddressFull = NULL;
+      cibAddressWin = NULL;      
+    }
+
+  /* allocate GIB from RES area in SRAM1 */
+
+  /* first reset it */
+#if (__sparc__)
+  release (RES);
+#else
+  resalloc (0, 1); /* reset on PC */
+#endif
+  
+  /* GIB FULL */
+  size = GibNFull * GibSizeFull * 1024;
+  if (size != 0)
+    {
+      gibAddressFull = RESALLOC(size, RES);
+    }
+  else
+    {
+      gibAddressFull = (unsigned int *)(GET_ADDR_FROM_RES_OFFSET(0)); /* NOTE: the GIB has a physical offset, we must not use NULL here */
+    }
+      
+  /* GIB WIN */
+  size = GibNWin * GibSizeWin * 1024; /* NOTE: we count in kiB */
+  if (size != 0)
+    {
+      gibAddressWin = RESALLOC(size, RES);
+    }
+  else
+    {
+      gibAddressWin = (unsigned int *)(GET_ADDR_FROM_RES_OFFSET(0)); /* NOTE: the GIB has a physical offset, we must not use NULL here */
+    }
+
+  DEBUGP("transition from unconfigured to choice1 ended -- stuff has been allocated\n");
+
+  return;
+}
+
+/** Action on the transition from CHOICE2 to CONFIG_WIN. */
+void CrIaSdbAction2(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  /* this is already done in the Serv198 Proc Start CONFIGURE section */
+
+  return;
+}
+
+/** Guard on the transition from CHOICE2 to CONFIG_WIN or FULL. */
+FwSmBool_t CrIaSdbIsConfigSuccess(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  /* configuration succeeded then return 1, else return 0 */
+  if (SdbAllocFail == 1)
+    {
+      return 0;
+    }
+
+  return 1;
+}
+
+/** Guard on the transition from CHOICE2 to UNCONFIGURED. */
+FwSmBool_t CrIaSdbIsConfigFailed(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  return SdbAllocFail;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaSdbInit.txt b/CrIa/src/CrIaPrSm/CrIaSdbInit.txt
new file mode 100644
index 0000000..1f14a38
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSdbInit.txt
@@ -0,0 +1,23 @@
+{
+	/** Define the state machine descriptor (SMD) */
+	FwSmDesc_t smDesc = CrIaSdbCreate(NULL);
+
+	/** Check that the SM is properly configured */
+	if (FwSmCheckRec(smDesc) != smSuccess) {
+		printf("The state machine CrIaSdb is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The state machine CrIaSdb is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the SM, send a few transition commands to it, and execute it */
+	FwSmStart(smDesc);
+	FwSmMakeTrans(smDesc, ConfigFull);
+	FwSmMakeTrans(smDesc, ConfigWin);
+	FwSmMakeTrans(smDesc, ResetFull);
+	FwSmMakeTrans(smDesc, Reset);
+	FwSmMakeTrans(smDesc, ResetWin);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSdsEvalAlgoExecCreate.c b/CrIa/src/CrIaPrSm/CrIaSdsEvalAlgoExecCreate.c
new file mode 100644
index 0000000..7c92b12
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSdsEvalAlgoExecCreate.c
@@ -0,0 +1,72 @@
+/**
+ * @file CrIaSdsEvalAlgoExecCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:46
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaSdsEvalAlgoExec function definitions */
+#include "CrIaSdsEvalAlgoExecCreate.h"
+
+/**
+ * Guard on the Control Flow from DECISION1 to DECISION2.
+ *  Else
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code57081(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/**
+ * Guard on the Control Flow from DECISION2 to N2.
+ *  Else
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code44123(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaSdsEvalAlgoExecCreate(void* prData)
+{
+  const FwPrCounterU2_t DECISION1 = 1;		/* The identifier of decision node DECISION1 in procedure CrIaSdsEvalAlgoExec */
+  const FwPrCounterU2_t N_OUT_OF_DECISION1 = 3;	/* The number of control flows out of decision node DECISION1 in procedure CrIaSdsEvalAlgoExec */
+  const FwPrCounterU2_t DECISION2 = 2;		/* The identifier of decision node DECISION2 in procedure CrIaSdsEvalAlgoExec */
+  const FwPrCounterU2_t N_OUT_OF_DECISION2 = 2;	/* The number of control flows out of decision node DECISION2 in procedure CrIaSdsEvalAlgoExec */
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+                        2,	/* N_ANODES - The number of action nodes */
+                        2,	/* N_DNODES - The number of decision nodes */
+                        8,	/* N_FLOWS - The number of control flows */
+                        2,	/* N_ACTIONS - The number of actions */
+                        6	/* N_GUARDS - The number of guards */
+                      );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddDecisionNode(prDesc, DECISION1, N_OUT_OF_DECISION1);
+  FwPrAddActionNode(prDesc, CrIaSdsEvalAlgoExec_N1, &CrIaSdsEvalAlgoExecSetSdsActive);
+  FwPrAddActionNode(prDesc, CrIaSdsEvalAlgoExec_N2, &CrIaSdsEvalAlgoExecSetSdsInactive);
+  FwPrAddDecisionNode(prDesc, DECISION2, N_OUT_OF_DECISION2);
+  FwPrAddFlowIniToDec(prDesc, DECISION1, NULL);
+  FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaSdsEvalAlgoExec_N1, &CrIaSdsEvalAlgoExecC1);
+  FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaSdsEvalAlgoExec_N2, &CrIaSdsEvalAlgoExecC2);
+  FwPrAddFlowDecToDec(prDesc, DECISION1, DECISION2, &code57081);
+  FwPrAddFlowActToDec(prDesc, CrIaSdsEvalAlgoExec_N1, DECISION1, &CrIaSdsEvalAlgoExecIsNextExec);
+  FwPrAddFlowActToDec(prDesc, CrIaSdsEvalAlgoExec_N2, DECISION1, &CrIaSdsEvalAlgoExecIsNextExec);
+  FwPrAddFlowDecToAct(prDesc, DECISION2, CrIaSdsEvalAlgoExec_N1, &CrIaSdsEvalAlgoExecC3);
+  FwPrAddFlowDecToAct(prDesc, DECISION2, CrIaSdsEvalAlgoExec_N2, &code44123);
+
+  return prDesc;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSdsEvalAlgoExecCreate.h b/CrIa/src/CrIaPrSm/CrIaSdsEvalAlgoExecCreate.h
new file mode 100644
index 0000000..4a19a86
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSdsEvalAlgoExecCreate.h
@@ -0,0 +1,90 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaSdsEvalAlgoExec procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ *
+ * <b>Note for Control Flow from N1 to DECISION1</b>
+ * This guard returns true if the Node Execution Counter 
+ * (as returned by FwPrGetNodeExecCnt) is equal to 1.
+ *
+ * @image html CrIaSdsEvalAlgoExec.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaSdsEvalAlgoExecCreate_H_
+#define CrIaSdsEvalAlgoExecCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaSdsEvalAlgoExec_N1 1		/* The identifier of action node N1 in procedure CrIaSdsEvalAlgoExec */
+#define CrIaSdsEvalAlgoExec_N2 2		/* The identifier of action node N2 in procedure CrIaSdsEvalAlgoExec */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaSdsEvalAlgoExecCreate(void* prData);
+
+/**
+ * Action for node N1.
+ * isSdsActive = TRUE
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSdsEvalAlgoExecSetSdsActive(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N2.
+ * isSdsActive = FALSE
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSdsEvalAlgoExecSetSdsInactive(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION1 to N1.
+ *  SDS_FORCED && !SDS_INHIBITED 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSdsEvalAlgoExecC1(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION1 to N2.
+ *  !SDS_FORCED && SDS_INHIBITED 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSdsEvalAlgoExecC2(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N1 to DECISION1.
+ *  Next Execution 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSdsEvalAlgoExecIsNextExec(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION2 to N1.
+ *  isSaaActive || EARTH_OCCULT_ACTIVE 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSdsEvalAlgoExecC3(FwPrDesc_t prDesc);
+
+#endif /* CrIaSdsEvalAlgoExecCreate_H_ */
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSdsEvalAlgoExecFunc.c b/CrIa/src/CrIaPrSm/CrIaSdsEvalAlgoExecFunc.c
new file mode 100644
index 0000000..b6e14dc
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSdsEvalAlgoExecFunc.c
@@ -0,0 +1,127 @@
+/**
+ * @file CrIaSdsEvalAlgoExecFunc.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:46
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+#include "FwProfile/FwPrCore.h"
+
+/** CrIaSdsEvalAlgoExec function definitions */
+#include "CrIaSdsEvalAlgoExecCreate.h"
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N1. */
+void CrIaSdsEvalAlgoExecSetSdsActive(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char isSdsActive;
+
+  /* isSdsActive = TRUE */
+
+  isSdsActive = 1;
+  CrIaPaste(ISSDSACTIVE_ID, &isSdsActive);
+
+  return;
+}
+
+/** Action for node N2. */
+void CrIaSdsEvalAlgoExecSetSdsInactive(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char isSdsActive;
+
+  /* isSdsActive = FALSE */
+
+  isSdsActive = 0;
+  CrIaPaste(ISSDSACTIVE_ID, &isSdsActive);
+
+  return;
+}
+
+/** Guard on the Control Flow from DECISION1 to N1. */
+FwPrBool_t CrIaSdsEvalAlgoExecC1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char sdsForced, sdsInhibited;
+
+  /* [ SDS_FORCED && !SDS_INHIBITED ] */
+
+  CrIaCopy(SDS_FORCED_ID, &sdsForced);
+  CrIaCopy(SDS_INHIBITED_ID, &sdsInhibited);
+
+  if (sdsForced && !sdsInhibited)
+    {
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/** Guard on the Control Flow from DECISION1 to N2. */
+FwPrBool_t CrIaSdsEvalAlgoExecC2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char sdsForced, sdsInhibited;
+
+  /* [ !SDS_FORCED && SDS_INHIBITED ] */
+
+  CrIaCopy(SDS_FORCED_ID, &sdsForced);
+  CrIaCopy(SDS_INHIBITED_ID, &sdsInhibited);
+
+  if (!sdsForced && sdsInhibited)
+    {
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/** Guard on the Control Flow from N1 to DECISION1. */
+FwPrBool_t CrIaSdsEvalAlgoExecIsNextExec(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* [ Next Execution ] */
+
+  if (FwPrGetNodeExecCnt(prDesc))
+    {
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/** Guard on the Control Flow from DECISION2 to N1. */
+FwPrBool_t CrIaSdsEvalAlgoExecC3(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char isSaaActive, earthOccultActive;
+
+  /* [ isSaaActive || EARTH_OCCULT_ACTIVE ] */
+
+  CrIaCopy(ISSAAACTIVE_ID, &isSaaActive);
+  CrIaCopy(EARTH_OCCULT_ACTIVE_ID, &earthOccultActive);
+
+  if (isSaaActive || earthOccultActive)
+    {
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaSdsEvalAlgoExecInit.txt b/CrIa/src/CrIaPrSm/CrIaSdsEvalAlgoExecInit.txt
new file mode 100644
index 0000000..9c123f7
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSdsEvalAlgoExecInit.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaSdsEvalAlgoExecCreate(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaSdsEvalAlgoExec is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaSdsEvalAlgoExec is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSduCreate.c b/CrIa/src/CrIaPrSm/CrIaSduCreate.c
new file mode 100644
index 0000000..a86395b
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSduCreate.c
@@ -0,0 +1,63 @@
+/**
+ * @file CrIaSduCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwSmDCreate.h"
+#include "FwProfile/FwSmConfig.h"
+
+/** CrIaSdu function definitions */
+#include "CrIaSduCreate.h"
+
+/**
+ * Guard on the transition from CHOICE1 to INACTIVE.
+ *  ! Flag_1 
+ * @param smDesc the state machine descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwSmBool_t code31924(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwSmDesc_t CrIaSduCreate(void* smData)
+{
+  const FwSmCounterU2_t N_OUT_OF_INACTIVE = 2;	/* The number of transitions out of state INACTIVE */
+  const FwSmCounterU2_t N_OUT_OF_DOWN_TRANSFER = 2;	/* The number of transitions out of state DOWN_TRANSFER */
+  const FwSmCounterU2_t N_OUT_OF_UP_TRANSFER = 2;	/* The number of transitions out of state UP_TRANSFER */
+  const FwSmCounterU2_t CHOICE1 = 1;		/* The identifier of choice pseudo-state CHOICE1 in State Machine CrIaSdu */
+  const FwSmCounterU2_t N_OUT_OF_CHOICE1 = 2;	/* The number of transitions out of the choice-pseudo state CHOICE1 */
+
+  /** Create state machine smDesc */
+  FwSmDesc_t smDesc = FwSmCreate(
+                        3,	/* NSTATES - The number of states */
+                        1,	/* NCPS - The number of choice pseudo-states */
+                        9,	/* NTRANS - The number of transitions */
+                        6,	/* NACTIONS - The number of state and transition actions */
+                        3	/* NGUARDS - The number of transition guards */
+                      );
+
+  /** Configure the state machine smDesc */
+  FwSmSetData(smDesc, smData);
+  FwSmAddState(smDesc, CrIaSdu_INACTIVE, N_OUT_OF_INACTIVE, NULL, NULL, NULL, NULL);
+  FwSmAddState(smDesc, CrIaSdu_DOWN_TRANSFER, N_OUT_OF_DOWN_TRANSFER, &CrIaSduDownTransferEntry, NULL, &CrIaSduDownTransferDo, NULL);
+  FwSmAddState(smDesc, CrIaSdu_UP_TRANSFER, N_OUT_OF_UP_TRANSFER, NULL, NULL, NULL, NULL);
+  FwSmAddChoicePseudoState(smDesc, CHOICE1, N_OUT_OF_CHOICE1);
+  FwSmAddTransStaToSta(smDesc, StartUpTransfer, CrIaSdu_INACTIVE, CrIaSdu_UP_TRANSFER, NULL, NULL);
+  FwSmAddTransStaToCps(smDesc, StartDownTransfer, CrIaSdu_INACTIVE, CHOICE1, NULL, NULL);
+  FwSmAddTransStaToSta(smDesc, Abort, CrIaSdu_DOWN_TRANSFER, CrIaSdu_INACTIVE, &CrIaSduLoad13s4Rep, NULL);
+  FwSmAddTransStaToSta(smDesc, Execute, CrIaSdu_DOWN_TRANSFER, CrIaSdu_INACTIVE, NULL, &CrIaSduIsTransferFinished);
+  FwSmAddTransStaToSta(smDesc, Abort, CrIaSdu_UP_TRANSFER, CrIaSdu_INACTIVE, &CrIaSduLoad13s16Rep, NULL);
+  FwSmAddTransStaToSta(smDesc, Execute, CrIaSdu_UP_TRANSFER, CrIaSdu_INACTIVE, NULL, &CrIaSduIsTransferFinished);
+  FwSmAddTransIpsToSta(smDesc, CrIaSdu_INACTIVE, &CrIaSduResetSdsCounter);
+  FwSmAddTransCpsToSta(smDesc, CHOICE1, CrIaSdu_DOWN_TRANSFER, NULL, &CrIaSduIsFlag1);
+  FwSmAddTransCpsToSta(smDesc, CHOICE1, CrIaSdu_INACTIVE, &CrIaSduIncrSdsCounter, &code31924);
+
+  return smDesc;
+}
diff --git a/CrIa/src/CrIaPrSm/CrIaSduCreate.h b/CrIa/src/CrIaPrSm/CrIaSduCreate.h
new file mode 100644
index 0000000..8b49a64
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSduCreate.h
@@ -0,0 +1,135 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaSdu state machine.
+ * The state machine is configured with a set of function pointers representing the non-default
+ * actions and guards of the state machine. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the state machine in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The state machine created by this file is shown in the figure below.
+ * @image html CrIaSdu.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaSduCreate_H_
+#define CrIaSduCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwSmConstants.h"
+
+/** State identifiers */
+#define CrIaSdu_DOWN_TRANSFER (1)		/* The identifier of state DOWN_TRANSFER in State Machine CrIaSdu */
+#define CrIaSdu_INACTIVE (2)		/* The identifier of state INACTIVE in State Machine CrIaSdu */
+#define CrIaSdu_UP_TRANSFER (3)		/* The identifier of state UP_TRANSFER in State Machine CrIaSdu */
+
+/** The identifiers of transition commands (triggers) */
+#define Execute (0)
+#define Abort (18)
+#define StartDownTransfer (19)
+#define StartUpTransfer (20)
+
+/**
+ * Create a new state machine descriptor.
+ * This interface creates the state machine descriptor dynamically.
+ * @param smData the pointer to the state machine data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the state machine data when the state machine is created is NULL).
+ * @return the pointer to the state machine descriptor
+ */
+FwSmDesc_t CrIaSduCreate(void* smData);
+
+/**
+ * Entry Action for the state DOWN_TRANSFER.
+ * <pre>
+ * sduxBlockCnt = 0;
+ * if (down transfer is for SDU2) {
+ *  use as SDU2 the GIB pointed at by gibOut; 
+ *  sdu2DownTransferSize = size of most recently updated GIB; 
+ *  sdu2RemSize = sdu2DownTransferSize; }
+ * if (down-transfer is for SDU3) {
+ *  use as SDU3 the HK Storage;
+ *  sdu3DownTransferSize = size of HK Storage; 
+ *  sdu3RemSize = sdu3DownTransferSize; }
+ * if (down-transfer is for SDU4) && (sdu4DownTransferSize==0xFFFFFFF)
+ *  sdu4DownTransferSize = size of valid data of FBF in SDU4; }
+ * if (down-transfer is for SDU4) && (sdu4DownTransferSize!=0xFFFFFFF)
+ *  sdu4RemSize = sdu4DownTransferSize; }
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSduDownTransferEntry(FwSmDesc_t smDesc);
+
+/**
+ * Do Action for the state DOWN_TRANSFER.
+ * <pre>
+ * dtSize = 0;
+ * Retrieve dtCapacity from IBSW;
+ * if (Flag_2) dtSize = dtCapacity;
+ * If (dtSize > 0) sduxBlockCnt++ 
+ * sduxRemSize = sduxRemSize - dtSize;
+ * if ((dtSize>0) && (sduxBlockCnt == 1)) Load TM(13,1) 
+ * if ((dtSize>0) && (sduxBlockCnt > 1) && (sduxRemSize>0)) {
+ *  Load TM(13,2) }
+ * if ((dtSize>0) && (sduxBlockCnt > 1) && (sduxRemSize<=0)) {
+ *  Load TM(13,3) }
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSduDownTransferDo(FwSmDesc_t smDesc);
+
+/**
+ * Action on the transition from DOWN_TRANSFER to INACTIVE.
+ * <pre>
+ * 
+ * Load (13,4) Report
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSduLoad13s4Rep(FwSmDesc_t smDesc);
+
+/**
+ * Action on the transition from UP_TRANSFER to INACTIVE.
+ * <pre>
+ * 
+ * Load (13,16) Report
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSduLoad13s16Rep(FwSmDesc_t smDesc);
+
+/**
+ * Guard on the transition from UP_TRANSFER to INACTIVE.
+ *  Transfer is finished  
+ * @param smDesc the state machine descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwSmBool_t CrIaSduIsTransferFinished(FwSmDesc_t smDesc);
+
+/**
+ * Action on the transition from Initial State to INACTIVE.
+ * sdsCounter = 0
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSduResetSdsCounter(FwSmDesc_t smDesc);
+
+/**
+ * Guard on the transition from CHOICE1 to DOWN_TRASFER.
+ *  Flag_1 
+ * @param smDesc the state machine descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwSmBool_t CrIaSduIsFlag1(FwSmDesc_t smDesc);
+
+/**
+ * Action on the transition from CHOICE1 to INACTIVE.
+ * sdsCounter++
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSduIncrSdsCounter(FwSmDesc_t smDesc);
+
+#endif /* CrIaSduCreate_H_ */
diff --git a/CrIa/src/CrIaPrSm/CrIaSduFunc.c b/CrIa/src/CrIaPrSm/CrIaSduFunc.c
new file mode 100644
index 0000000..e59affe
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSduFunc.c
@@ -0,0 +1,428 @@
+/**
+ * @file CrIaSduFunc.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwSmConstants.h"
+#include "FwProfile/FwSmDCreate.h"
+#include "FwProfile/FwSmConfig.h"
+#include "FwProfile/FwSmCore.h"
+#include "FwProfile/FwSmPrivate.h" /* for sdu comparisons */
+
+/** Cordet FW function definitions */
+#include <CrFramework/OutFactory/CrFwOutFactory.h>
+#include <CrFramework/OutLoader/CrFwOutLoader.h>
+#include <CrFramework/OutCmp/CrFwOutCmp.h>
+
+/** CrIaSdu function definitions */
+#include "CrIaSduCreate.h"
+
+#include <Services/General/CrIaConstants.h>
+#include <Services/General/CrIaParamSetter.h>
+
+#include <CrIaIasw.h>
+#include <OutStream/CrFwOutStream.h> /* for CrFwOutStreamGetNOfPendingPckts */
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+/* for CrIbMilBusGetLinkCapacity */
+#if (__sparc__)
+#include "ibsw_interface.h"
+#endif
+
+#include <Sdp/SdpAlgorithmsImplementation.h> /* for GetNBits32 */
+#include <Sdp/SdpCompressionEntityStructure.h> /* for STREAMPOS_INTEGRITY */
+
+#include "IfswDebug.h"
+
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Entry Action for the state DOWN_TRANSFER. */
+void CrIaSduDownTransferEntry(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short sduxBlockCnt, GibOut;
+  unsigned int sduxRemSize, sdu2DownTransferSize, sdu4DownTransferSize;
+
+  DEBUGP(" We are now in the DownTransferEntry\n");
+  DEBUGP("                    SO, SMDESC pointer is %08x!\n", (unsigned int)smDesc);
+  DEBUGP("                    SO, SDU2 pointer is %08x!\n", (unsigned int)smDescSdu2);
+  DEBUGP("                    SO, SDU4 pointer is %08x!\n", (unsigned int)smDescSdu4);
+  DEBUGP("                    SO, SMDESC Data is %08x!\n", (unsigned int)(smDesc->smData));
+
+  sduxBlockCnt = 0;
+
+  if (smDesc == smDescSdu2)
+    {
+      DEBUGP("                    YES, SDU2 identified %08x!\n", (unsigned int)(smDescSdu2));
+      CrIaPaste(SDU2BLOCKCNT_ID, &sduxBlockCnt);
+
+      /* Mantis 1421 / 1626 */
+      CrIaCopy(SDU2DOWNTRANSFERSIZE_ID, &sdu2DownTransferSize);
+
+      if (sdu2DownTransferSize == DTSIZE_FROM_HEADER)
+	{
+	  /* overwrite transfer size from header of data in sdu 2 */
+          CrIaCopy(GIBTOTRANSFER_ID, &GibOut);
+	  GetNBits32 (&sdu2DownTransferSize, BITOFFSET_SIZE, 32, (unsigned int *)GET_ADDR_FROM_RES_OFFSET(GibOut));
+	}
+     
+      /* saturate the downtransfer size at the maximum GIB size */
+      if (sdu2DownTransferSize > SRAM1_RES_SIZE)
+	{
+	  sdu2DownTransferSize = SRAM1_RES_SIZE;
+	}
+      
+      DEBUGP("HERE, the down transfer size is: %d\n", sdu2DownTransferSize);
+      sduxRemSize = sdu2DownTransferSize;
+
+      /* since SDU2DOWNTRANSFERSIZE can be modified by a compression during the ongoing transfer, 
+	 we need to freeze the size here at the beginning */
+      CrIaPaste(S2TOTRANSFERSIZE_ID, &sdu2DownTransferSize);
+      
+      CrIaPaste(SDU2REMSIZE_ID, &sduxRemSize);
+
+#ifdef PC_TARGET
+      /* on the PC, the endianess of the CE in the GIB is wrong, we have to swap it before down transfer */
+      {
+  unsigned int j;
+  unsigned int *inbuffer;
+  unsigned char *outbuffer;
+  unsigned char mybyte1, mybyte2, mybyte3, mybyte4;
+
+  CrIaCopy(GIBTOTRANSFER_ID, &GibOut);
+  inbuffer = (unsigned int *)GET_ADDR_FROM_RES_OFFSET(GibOut);
+  outbuffer = (unsigned char *)GET_ADDR_FROM_RES_OFFSET(GibOut);
+  
+  for (j=0; j<sdu2DownTransferSize; )
+    {     
+      GETBYTE (mybyte1, j*8, inbuffer);
+      GETBYTE (mybyte2, (j+1)*8, inbuffer);
+      GETBYTE (mybyte3, (j+2)*8, inbuffer);
+      GETBYTE (mybyte4, (j+3)*8, inbuffer);
+        
+      outbuffer[j] = mybyte1;
+      outbuffer[j+1] = mybyte2;
+      outbuffer[j+2] = mybyte3;
+      outbuffer[j+3] = mybyte4;
+
+      j+=4;
+    }
+      }
+#endif
+
+    }
+
+#if (__sparc__)
+  else /* (smDesc == smDescSdu4) */
+    {
+      DEBUGP("                    YES, SDU4 identified! %08x!\n", (unsigned int)(smDescSdu4));
+      CrIaPaste(SDU4BLOCKCNT_ID, &sduxBlockCnt);
+
+      /* Mantis 1421 / 1626 */
+      CrIaCopy(SDU4DOWNTRANSFERSIZE_ID, &sdu4DownTransferSize);
+
+      if (sdu4DownTransferSize == DTSIZE_FROM_HEADER)
+	{
+	  /* overwrite transfer size from header of data in sdu 4 */
+	  GetNBits32 (&sdu4DownTransferSize, BITOFFSET_SIZE, 32, (unsigned int *)SRAM1_FLASH_ADDR);
+	}
+
+      /* saturate the downtransfer size at the SDU4 size */
+      if (sdu4DownTransferSize > SRAM1_FLASH_SIZE)
+	{
+	  sdu4DownTransferSize = SRAM1_FLASH_SIZE;
+	}
+      
+      sduxRemSize = sdu4DownTransferSize;
+
+      /* freeze the size */
+      CrIaPaste(S4TOTRANSFERSIZE_ID, &sdu4DownTransferSize);
+
+      CrIaPaste(SDU4REMSIZE_ID, &sduxRemSize);
+    }
+#else
+  (void) sdu4DownTransferSize; 
+#endif  
+  
+  DEBUGP("We have completed the DownTransferEntry\n");
+
+  return;
+}
+
+
+/** Do Action for the state DOWN_TRANSFER. */
+void CrIaSduDownTransferDo(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  FwSmDesc_t rep;
+  CrFwGroup_t group = 3; /* PCAT = 4 */ 
+
+  unsigned char SduId = 0;
+
+  unsigned short sduxBlockCnt = 0;
+  unsigned int dtSize;
+  int dtCapacity;
+  unsigned int sduxRemSize;
+
+  DEBUGP("We are now in the DownTransferDo\n");
+
+  dtSize = 0;
+
+  /* Retrieve dtCapacity from IBSW */
+#if (__sparc__)
+  dtCapacity = CrIbMilBusGetLinkCapacity() - S13_OVERHEAD;
+#else
+  dtCapacity = 1024 - S13_OVERHEAD; /* always report 1 free slot for PC */
+#endif
+
+  /* Flag_2 is true if there are no pending reports for the ground and if the remaining capacity on the 1553 (as given 
+     by dtCapacity) is greater than S13_MIN_BLOCK_SIZE. Only proceed for slots where more than S13_MIN_BLOCK_SIZE bytes 
+     are available */
+  if (dtCapacity > S13_MIN_BLOCK_SIZE)
+    if (CrFwOutStreamGetNOfPendingPckts(outStreamGrd) == 0) /* prevent S13 packets from going in the outStreamGrd */
+      dtSize = dtCapacity;
+
+  if (dtSize == 0)
+    return;
+
+  /* Identify SDU2 or 4 */
+  if (smDesc == smDescSdu2)
+    {
+      SduId = 2;
+
+      CrIaCopy(SDU2BLOCKCNT_ID, &sduxBlockCnt);
+      sduxBlockCnt++;
+      CrIaPaste(SDU2BLOCKCNT_ID, &sduxBlockCnt);
+
+      CrIaCopy(SDU2REMSIZE_ID, &sduxRemSize);
+      if (sduxRemSize >= dtSize)
+        sduxRemSize = sduxRemSize - dtSize;
+      else
+        {
+          dtSize = sduxRemSize;
+          sduxRemSize = 0;
+        }
+      CrIaPaste(SDU2REMSIZE_ID, &sduxRemSize);
+    }
+  else /* (smDesc == smDescSdu4) */
+    {
+      SduId = 4;
+
+      CrIaCopy(SDU4BLOCKCNT_ID, &sduxBlockCnt);
+      sduxBlockCnt++;
+      CrIaPaste(SDU4BLOCKCNT_ID, &sduxBlockCnt);
+
+      CrIaCopy(SDU4REMSIZE_ID, &sduxRemSize);
+      if (sduxRemSize >= dtSize)
+        sduxRemSize = sduxRemSize - dtSize;
+      else
+        {
+          dtSize = sduxRemSize;
+          sduxRemSize = 0;
+        }
+      CrIaPaste(SDU4REMSIZE_ID, &sduxRemSize);
+    }
+
+  /* Load (13,1), (13,2) and (13,3) Reports */
+  rep = NULL;
+
+  if (sduxBlockCnt == 1) /* FIRST packet */
+    {
+      DEBUGP("FIRST\n");
+      rep = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRIA_SERV13, CRIA_SERV13_FST_DWLK, 0, dtSize + S13_OVERHEAD);
+      if (rep == NULL)
+        {
+          /* handled by Resource FdCheck */
+          return;
+        }
+      /* Set the sduId in the packet, in order that the reports can get the info about the kind of SDU */
+      CrIaServ13FstDwlkParamSetSduId(rep, SduId);
+    }
+
+  if (sduxBlockCnt > 1)
+    {
+      if (sduxRemSize > 0) /* INTERMEDIATE packet */
+        {
+          DEBUGP("INTERMEDIATE\n");
+          rep = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRIA_SERV13, CRIA_SERV13_INTM_DWLK, 0, dtSize + S13_OVERHEAD);
+          if (rep == NULL)
+            {
+              /* handled by Resource FdCheck */
+              return;
+            }
+          /* Set the sduId in the packet, in order that the reports can get the info about the kind of SDU */
+          CrIaServ13IntmDwlkParamSetSduId(rep, SduId);
+        }
+      else /* sduxRemSize == 0 -> LAST packet */
+        {
+          DEBUGP("LAST\n");
+          rep = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRIA_SERV13, CRIA_SERV13_LAST_DWLK, 0, dtSize + S13_OVERHEAD); /* uses the changed dtSize = sduxRemSize */
+          if (rep == NULL)
+            {
+              DEBUGP("ERROR: S(13,3) cannot make an outgoing packet\n");
+              /* handled by Resource FdCheck */
+              return;
+            }
+          /* Set the sduId in the packet, in order that the reports can get the info about the kind of SDU */
+          CrIaServ13LastDwlkParamSetSduId(rep, SduId);
+        }
+    }
+
+  /* set APID and destination */
+  CrFwOutCmpSetGroup(rep, group);
+
+  CrFwOutCmpSetDest(rep, CR_FW_CLIENT_GRD);
+
+  CrFwOutLoaderLoad(rep);
+
+  DEBUGP("We have completed the DownTransferDo and created a packet with data size %d rem size %d block cnt %d\n", dtSize, sduxRemSize, sduxBlockCnt);
+
+  return;
+}
+
+/** Guard on the transition from CHOICE1 to DOWN_TRANSFER. */
+FwSmBool_t CrIaSduIsFlag1(FwSmDesc_t __attribute__((unused)) smDesc)
+{  
+  unsigned short GibOut;
+  unsigned int *cestream;
+  unsigned int integrity;
+    
+  if (smDesc == smDescSdu2)
+    {
+      /* get SDS flag from CE.Integrity */
+      CrIaCopy(GIBOUT_ID, &GibOut);
+      cestream = (unsigned int *) GET_ADDR_FROM_RES_OFFSET(GibOut);
+      GETNBITS (integrity, STREAMPOS_INTEGRITY, 2, cestream);
+
+      if (integrity == DATA_SUSPEND)
+	{
+	  return 0;
+	}
+      else
+	{
+	  /* if the Science Data Suspend flag in the header of the image in the GIB is false, return 1 */
+	  return 1;
+	}
+    }
+
+  /* if we come here, smDesc is SDU4 and we want to move on */
+  return 1;
+}
+
+/** Action on the transition from DOWN_TRANSFER to INACTIVE. */
+void CrIaSduLoad13s4Rep(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  FwSmDesc_t rep;
+  unsigned char SduId = 2; /* smDesc == smDescSdu2 */
+
+  if (smDesc == smDescSdu4)
+    {
+      SduId = 4;
+    }
+  
+  /* Abort / Load (13,4) Report */
+  rep = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRIA_SERV13, CRIA_SERV13_DWLK_ABRT, 0, 0);
+  if (rep == NULL)
+    {
+      /* handled by Resource FdCheck */
+      return;
+    }
+
+  /* Set the sduId in the packet */
+  CrIaServ13DwlkAbrtParamSetSduId(rep, SduId);
+
+  /* set destination */
+  CrFwOutCmpSetDest(rep, CR_FW_CLIENT_GRD);
+
+  CrFwOutLoaderLoad(rep);
+
+  DEBUGP("We have aborted the DownTransfer and created a report TM(13,4).\n");
+
+  return;
+}
+
+/** Action on the transition from UP_TRANSFER to INACTIVE. */
+void CrIaSduLoad13s16Rep(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  /* Abort / Load (13,16) Report */
+
+  return;
+}
+
+/** Action on the transition from UP_TRANSFER to INACTIVE. */
+void CrIaSduLoadConfigFile(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  /* Update IFSW Configuration with newly uplinked data */
+
+  return;
+}
+
+/** Guard on the transition from DOWN/UP_TRANSFER to INACTIVE. */
+FwSmBool_t CrIaSduIsTransferFinished(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned int sduxRemSize;
+
+  /* Execute [ Transfer is finished ] */
+  /* Up-transfer is finished if command (13,11) was executed in current cycle */
+  /* Down-transfer is finished when all data in SDUx have been transferred (sduxRemSize is zero or negative) */
+
+  /* Mantis 1947: corrected to get rid of unreachable code */
+
+  /* Identify SDU2 ..4 */
+  if (smDesc == smDescSdu2)
+    {
+      CrIaCopy(SDU2REMSIZE_ID, &sduxRemSize);
+      if (sduxRemSize == 0)
+        {
+          return 1;
+        }
+    }
+  else /* (smDesc == smDescSdu4) */
+    {
+      CrIaCopy(SDU4REMSIZE_ID, &sduxRemSize);
+      if (sduxRemSize == 0)
+        {
+          return 1;
+        }
+    }
+
+  return 0;
+}
+
+/** Action on the transition from Initial State to INACTIVE. */
+void CrIaSduResetSdsCounter(FwSmDesc_t smDesc)
+{
+  unsigned int sdsCounter;
+
+  CRFW_UNUSED(smDesc);
+  
+  sdsCounter = 0;
+  CrIaPaste(SDSCOUNTER_ID, &sdsCounter);
+
+  return;
+}
+
+
+/** Action on the transition from CHOICE1 to INACTIVE. */
+void CrIaSduIncrSdsCounter(FwSmDesc_t smDesc)
+{
+  unsigned int sdsCounter;
+
+  CRFW_UNUSED(smDesc);
+
+  CrIaCopy(SDSCOUNTER_ID, &sdsCounter);
+  sdsCounter++;
+  CrIaPaste(SDSCOUNTER_ID, &sdsCounter);
+
+  return;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaSduInit.txt b/CrIa/src/CrIaPrSm/CrIaSduInit.txt
new file mode 100644
index 0000000..ee19d08
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSduInit.txt
@@ -0,0 +1,22 @@
+{
+	/** Define the state machine descriptor (SMD) */
+	FwSmDesc_t smDesc = CrIaSduCreate(NULL);
+
+	/** Check that the SM is properly configured */
+	if (FwSmCheckRec(smDesc) != smSuccess) {
+		printf("The state machine CrIaSdu is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The state machine CrIaSdu is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the SM, send a few transition commands to it, and execute it */
+	FwSmStart(smDesc);
+	FwSmMakeTrans(smDesc, Abort);
+	FwSmMakeTrans(smDesc, StartDownTransfer);
+	FwSmMakeTrans(smDesc, StartUpTransfer);
+	FwSmMakeTrans(smDesc, Execute);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSemAnoEvtRPCreate.c b/CrIa/src/CrIaPrSm/CrIaSemAnoEvtRPCreate.c
new file mode 100644
index 0000000..aeedc7d
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemAnoEvtRPCreate.c
@@ -0,0 +1,72 @@
+/**
+ * @file CrIaSemAnoEvtRPCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Jun 3 2016 19:48:5
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+#include "CrFramework/CrFwConstants.h"
+
+/** CrIaSemAnoEvtRP function definitions */
+#include "CrIaSemAnoEvtRPCreate.h"
+
+/** Action for node N1. */
+void CrIaSemEvtAnoRP1(FwPrDesc_t prDesc)
+{
+  /* Do Nothing */
+
+  CRFW_UNUSED(prDesc);
+
+  return;
+}
+
+/**
+ * Guard on the Control Flow from DECISION1 to N3.
+ *  Else 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code68320(FwPrDesc_t prDesc)
+{
+  CRFW_UNUSED(prDesc);
+
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaSemAnoEvtRPCreate(void* prData)
+{
+	const FwPrCounterU2_t DECISION1 = 1;		/* The identifier of decision node DECISION1 in procedure CrIaSemAnoEvtRP */
+	const FwPrCounterU2_t N_OUT_OF_DECISION1 = 3;	/* The number of control flows out of decision node DECISION1 in procedure CrIaSemAnoEvtRP */
+
+	/** Create the procedure */
+	FwPrDesc_t prDesc = FwPrCreate(
+		3,	/* N_ANODES - The number of action nodes */
+		1,	/* N_DNODES - The number of decision nodes */
+		7,	/* N_FLOWS - The number of control flows */
+		3,	/* N_ACTIONS - The number of actions */
+		3	/* N_GUARDS - The number of guards */
+	);
+
+	/** Configure the procedure */
+	FwPrSetData(prDesc, prData);
+	FwPrAddDecisionNode(prDesc, DECISION1, N_OUT_OF_DECISION1);
+	FwPrAddActionNode(prDesc, CrIaSemAnoEvtRP_N1, &CrIaSemEvtAnoRP1);
+	FwPrAddActionNode(prDesc, CrIaSemAnoEvtRP_N2, &CrIaSemEvtAnoRP2);
+	FwPrAddActionNode(prDesc, CrIaSemAnoEvtRP_N3, &CrIaSemEvtAnoRP3);
+	FwPrAddFlowIniToDec(prDesc, DECISION1, NULL);
+	FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaSemAnoEvtRP_N1, &CrIaSemAnoEvtRPG1);
+	FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaSemAnoEvtRP_N2, &CrIaSemAnoEvtRPG2);
+	FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaSemAnoEvtRP_N3, &code68320);
+	FwPrAddFlowActToFin(prDesc, CrIaSemAnoEvtRP_N1, NULL);
+	FwPrAddFlowActToFin(prDesc, CrIaSemAnoEvtRP_N2, NULL);
+	FwPrAddFlowActToFin(prDesc, CrIaSemAnoEvtRP_N3, NULL);
+
+	return prDesc;
+}
diff --git a/CrIa/src/CrIaPrSm/CrIaSemAnoEvtRPCreate.h b/CrIa/src/CrIaPrSm/CrIaSemAnoEvtRPCreate.h
new file mode 100644
index 0000000..8bfb129
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemAnoEvtRPCreate.h
@@ -0,0 +1,86 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaSemAnoEvtRP procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ * @image html CrIaSemAnoEvtRP.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Jun 3 2016 19:48:5
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaSemAnoEvtRPCreate_H_
+#define CrIaSemAnoEvtRPCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaSemAnoEvtRP_N1 1		/* The identifier of action node N1 in procedure CrIaSemAnoEvtRP */
+#define CrIaSemAnoEvtRP_N2 2		/* The identifier of action node N2 in procedure CrIaSemAnoEvtRP */
+#define CrIaSemAnoEvtRP_N3 3		/* The identifier of action node N3 in procedure CrIaSemAnoEvtRP */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaSemAnoEvtRPCreate(void* prData);
+
+/**
+ * Action for node N1.
+ * Do Nothing
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSemEvtAnoRP1(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N2.
+ * <pre>
+ * Send command
+ * StopSem to IASW SM
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSemEvtAnoRP2(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N3.
+ * <pre>
+ * Send command
+ * StopScience to IASW SM
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSemEvtAnoRP3(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION1 to N1.
+ *  semAnoEvtResp_x == NO_ACT 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSemAnoEvtRPG1(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION1 to N2.
+ * <pre>
+ *  semAnoEvtResp_x == 
+ * SEM_OFF 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSemAnoEvtRPG2(FwPrDesc_t prDesc);
+
+#endif /* CrIaSemAnoEvtRPCreate_H_ */
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSemAnoEvtRPFunc.c b/CrIa/src/CrIaPrSm/CrIaSemAnoEvtRPFunc.c
new file mode 100644
index 0000000..0455ac7
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemAnoEvtRPFunc.c
@@ -0,0 +1,196 @@
+/**
+ * @file CrIaSemAnoEvtRPFunc.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Jun 3 2016 19:48:5
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+#include "FwProfile/FwPrCore.h"
+
+#include <FwProfile/FwSmConfig.h>
+
+/** CrIaSemAnoEvtRP function definitions */
+#include "CrIaSemAnoEvtRPCreate.h"
+
+#include <CrIaIasw.h>
+#include <Services/General/CrIaConstants.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <CrIaPrSm/CrIaIaswCreate.h> /* for StopSem and StopScience transition of the IASW state machine */
+
+extern unsigned short SemAnoEvtId;
+
+
+unsigned short getSemAnoEvtResp(unsigned short evtId)
+{
+  unsigned short response;
+
+  switch (evtId)
+  {
+    case 1:
+      CrIaCopy(SEMANOEVTRESP_1_ID, &response);
+      break;
+    case 2:
+      CrIaCopy(SEMANOEVTRESP_2_ID, &response);
+      break;
+    case 3:
+      CrIaCopy(SEMANOEVTRESP_3_ID, &response);
+      break;
+    case 4:
+      CrIaCopy(SEMANOEVTRESP_4_ID, &response);
+      break;
+    case 5:
+      CrIaCopy(SEMANOEVTRESP_5_ID, &response);
+      break;
+    case 6:
+      CrIaCopy(SEMANOEVTRESP_6_ID, &response);
+      break;
+    case 7:
+      CrIaCopy(SEMANOEVTRESP_7_ID, &response);
+      break;
+    case 8:
+      CrIaCopy(SEMANOEVTRESP_8_ID, &response);
+      break;
+    case 9:
+      CrIaCopy(SEMANOEVTRESP_9_ID, &response);
+      break;
+    case 10:
+      CrIaCopy(SEMANOEVTRESP_10_ID, &response);
+      break;
+    case 11:
+      CrIaCopy(SEMANOEVTRESP_11_ID, &response);
+      break;
+    case 12:
+      CrIaCopy(SEMANOEVTRESP_12_ID, &response);
+      break;
+    case 13:
+      CrIaCopy(SEMANOEVTRESP_13_ID, &response);
+      break;
+    case 14:
+      CrIaCopy(SEMANOEVTRESP_14_ID, &response);
+      break;
+    case 15:
+      CrIaCopy(SEMANOEVTRESP_15_ID, &response);
+      break;
+    case 16:
+      CrIaCopy(SEMANOEVTRESP_16_ID, &response);
+      break;
+    case 17:
+      CrIaCopy(SEMANOEVTRESP_17_ID, &response);
+      break;
+    case 18:
+      CrIaCopy(SEMANOEVTRESP_18_ID, &response);
+      break;
+    case 19:
+      CrIaCopy(SEMANOEVTRESP_19_ID, &response);
+      break;
+    case 20:
+      CrIaCopy(SEMANOEVTRESP_20_ID, &response);
+      break;
+    case 21:
+      CrIaCopy(SEMANOEVTRESP_21_ID, &response);
+      break;
+    case 22:
+      CrIaCopy(SEMANOEVTRESP_22_ID, &response);
+      break;
+    case 23:
+      CrIaCopy(SEMANOEVTRESP_23_ID, &response);
+      break;
+    case 24:
+      CrIaCopy(SEMANOEVTRESP_24_ID, &response);
+      break;
+    case 25:
+      CrIaCopy(SEMANOEVTRESP_25_ID, &response);
+      break;
+    case 26:
+      CrIaCopy(SEMANOEVTRESP_26_ID, &response);
+      break;
+    case 27:
+      CrIaCopy(SEMANOEVTRESP_27_ID, &response);
+      break;
+    case 28:
+      CrIaCopy(SEMANOEVTRESP_28_ID, &response);
+      break;
+    case 29:
+      CrIaCopy(SEMANOEVTRESP_29_ID, &response);
+      break;
+    default:
+      return 0;
+      break;
+  }
+
+  return response;
+}
+
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N2. */
+void CrIaSemEvtAnoRP2(FwPrDesc_t prDesc)
+{
+  /* Send command StopSem to IASW SM */
+
+  CRFW_UNUSED(prDesc);
+
+  FwSmMakeTrans(smDescIasw, StopSem);
+
+  return;
+}
+
+/** Action for node N3. */
+void CrIaSemEvtAnoRP3(FwPrDesc_t prDesc)
+{
+  /* Send command StopScience to IASW SM */
+
+  CRFW_UNUSED(prDesc);
+
+  FwSmMakeTrans(smDescIasw, StopScience);
+
+  return;
+}
+
+/** Guard on the Control Flow from DECISION1 to N1. */
+FwPrBool_t CrIaSemAnoEvtRPG1(FwPrDesc_t prDesc)
+{
+  /* semAnoEvtResp_x == NO_ACT */
+
+  CRFW_UNUSED(prDesc);
+
+  if (getSemAnoEvtResp(SemAnoEvtId) == SEMANOEVT_NO_ACT)
+    {
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/** Guard on the Control Flow from DECISION1 to N2. */
+FwPrBool_t CrIaSemAnoEvtRPG2(FwPrDesc_t prDesc)
+{
+  /* semAnoEvtResp_x == SEM_OFF */
+
+  CRFW_UNUSED(prDesc);
+
+  if (getSemAnoEvtResp(SemAnoEvtId) == SEMANOEVT_SEM_OFF)
+    {
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaSemAnoEvtRPInit.txt b/CrIa/src/CrIaPrSm/CrIaSemAnoEvtRPInit.txt
new file mode 100644
index 0000000..14fe831
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemAnoEvtRPInit.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaSemAnoEvtRPCreate(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaSemAnoEvtRP is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaSemAnoEvtRP is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSemConsCheckCreate.c b/CrIa/src/CrIaPrSm/CrIaSemConsCheckCreate.c
new file mode 100644
index 0000000..64ebb96
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemConsCheckCreate.c
@@ -0,0 +1,74 @@
+/**
+ * @file CrIaSemConsCheckCreate.c
+ *
+ * @author FW Profile code generator version 5.01
+ * @date Created on: Dec 7 2017 0:24:42
+ */
+
+#include "CrIaSemConsCheckCreate.h"
+
+/** FW Profile function definitions */
+#include "FwPrSCreate.h"
+#include "FwPrConfig.h"
+
+/** CrIaSemConsCheck function definitions */
+#include <stdlib.h>
+
+/**
+ * Guard on the Control Flow from DECISION2 to DECISION3.
+ * Else
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code73407(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/**
+ * Guard on the Control Flow from DECISION3 to N2.
+ * Else
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code71767(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaSemConsCheckCreate(void* prData)
+{
+	const FwPrCounterU2_t DECISION2 = 1;		/* The identifier of decision node DECISION2 in procedure CrIaSemConsCheck */
+	const FwPrCounterU2_t N_OUT_OF_DECISION2 = 2;	/* The number of control flows out of decision node DECISION2 in procedure CrIaSemConsCheck */
+	const FwPrCounterU2_t DECISION3 = 2;		/* The identifier of decision node DECISION3 in procedure CrIaSemConsCheck */
+	const FwPrCounterU2_t N_OUT_OF_DECISION3 = 2;	/* The number of control flows out of decision node DECISION3 in procedure CrIaSemConsCheck */
+
+	/** Create the procedure */
+	FW_PR_INST(prDesc,
+		3,	/* N_ANODES - The number of action nodes */
+		2,	/* N_DNODES - The number of decision nodes */
+		8,	/* N_FLOWS - The number of control flows */
+		3,	/* N_ACTIONS - The number of actions */
+		4	/* N_GUARDS - The number of guards */
+	);
+	FwPrInit(&prDesc);
+
+	/** Configure the procedure */
+	FwPrSetData(&prDesc, prData);
+	FwPrAddActionNode(&prDesc, CrIaSemConsCheck_N1, &CrIaSemConsCheckN1);
+	FwPrAddActionNode(&prDesc, CrIaSemConsCheck_N3, &CrIaSemConsCheckN3);
+	FwPrAddDecisionNode(&prDesc, DECISION2, N_OUT_OF_DECISION2);
+	FwPrAddDecisionNode(&prDesc, DECISION3, N_OUT_OF_DECISION3);
+	FwPrAddActionNode(&prDesc, CrIaSemConsCheck_N2, &CrIaSemConsCheckN2);
+	FwPrAddFlowIniToAct(&prDesc, CrIaSemConsCheck_N1, NULL);
+	FwPrAddFlowActToDec(&prDesc, CrIaSemConsCheck_N1, DECISION2, NULL);
+	FwPrAddFlowActToFin(&prDesc, CrIaSemConsCheck_N3, NULL);
+	FwPrAddFlowDecToAct(&prDesc, DECISION2, CrIaSemConsCheck_N3, &CrIaSemConsCheckTrState);
+	FwPrAddFlowDecToDec(&prDesc, DECISION2, DECISION3, &code73407);
+	FwPrAddFlowDecToAct(&prDesc, DECISION3, CrIaSemConsCheck_N3, &CrIaSemConsCheckSemState);
+	FwPrAddFlowDecToAct(&prDesc, DECISION3, CrIaSemConsCheck_N2, &code71767);
+	FwPrAddFlowActToFin(&prDesc, CrIaSemConsCheck_N2, NULL);
+
+	return &prDesc;
+}
diff --git a/CrIa/src/CrIaPrSm/CrIaSemConsCheckCreate.h b/CrIa/src/CrIaPrSm/CrIaSemConsCheckCreate.h
new file mode 100644
index 0000000..4098eaa
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemConsCheckCreate.h
@@ -0,0 +1,93 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaSemConsCheck procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ * @image html CrIaSemConsCheck.png
+ *
+ * @author FW Profile code generator version 5.01
+ * @date Created on: Dec 7 2017 0:24:42
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CRIASEMCONSCHECK_H_
+#define CRIASEMCONSCHECK_H_
+
+/** FW Profile function definitions */
+#include "FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaSemConsCheck_N1 (1)		/* The identifier of action node N1 in procedure CrIaSemConsCheck */
+#define CrIaSemConsCheck_N2 (2)		/* The identifier of action node N2 in procedure CrIaSemConsCheck */
+#define CrIaSemConsCheck_N3 (3)		/* The identifier of action node N3 in procedure CrIaSemConsCheck */
+
+typedef struct {
+  unsigned char anomaly;
+} prDescSemConsFdCheck_t;
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor statically.
+ * It creates a single static instance of the procedure.
+ * The function should only be called once.
+ * If it is called several times, it always reconfigures and returns the same instance.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaSemConsCheckCreate(void* prData);
+
+/**
+ * Action for node N1.
+ * <pre>
+ * semMode = SEM mode as given in the
+ * latest SEM Default Housekeeping Packet
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSemConsCheckN1(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N3.
+ * Return No Anomaly
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSemConsCheckN3(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N2.
+ * Return Anomaly Detected
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSemConsCheckN2(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION2 to N3.
+ * <pre>
+ * SEM Operational State Machine
+ * is in a TR_* State 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSemConsCheckTrState(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION3 to N3.
+ * <pre>
+ * State of SEM Operational State
+ * Machine is the same as semState 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSemConsCheckSemState(FwPrDesc_t prDesc);
+
+#endif /* CrIaSemConsCheckCreate_H_ */
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSemConsCheckFunc.c b/CrIa/src/CrIaPrSm/CrIaSemConsCheckFunc.c
new file mode 100644
index 0000000..8ed94f4
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemConsCheckFunc.c
@@ -0,0 +1,197 @@
+/**
+ * @file CrIaSemConsCheckFunc.c
+ *
+ * @author FW Profile code generator version 5.01
+ * @date Created on: Dec 7 2017 0:24:42
+ */
+
+/** CrIaSemConsCheck function definitions */
+#include "CrIaSemConsCheckCreate.h"
+
+#include <CrFramework/CrFwConstants.h>
+
+/** FW Profile function definitions */
+#include <FwProfile/FwSmConstants.h>
+#include <FwProfile/FwSmDCreate.h>
+#include <FwProfile/FwSmConfig.h>
+#include <FwProfile/FwSmCore.h>
+#include "FwPrDCreate.h"
+#include "FwPrConfig.h"
+#include "FwPrCore.h"
+#include "FwPrConstants.h"
+
+#include <CrIaIasw.h>
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+#include <CrIaPrSm/CrIaSemCreate.h>
+#include <CrIaPrSm/CrIaSemConsCheckCreate.h>
+#include <Services/General/CrSemConstants.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+#include <IfswDebug.h>
+
+
+unsigned short hkStatMode;
+
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N1. */
+void CrIaSemConsCheckN1(FwPrDesc_t prDesc)
+{
+  CRFW_UNUSED(prDesc);
+
+  /* semMode = SEM mode as given in the latest SEM Default Housekeeping Packet */
+
+  DEBUGP("  Action for node N1.\n");
+
+  CrIaCopy(STAT_MODE_ID, &hkStatMode);
+
+  return;
+}
+
+/** Action for node N2. */
+void CrIaSemConsCheckN2(FwPrDesc_t prDesc)
+{
+  prDescSemConsFdCheck_t* prDataPtr;
+
+  CRFW_UNUSED(prDesc);
+
+  /* Return Anomaly Detected */
+
+  DEBUGP("  Action for node N2.\n");
+
+  prDataPtr = (prDescSemConsFdCheck_t*)FwPrGetData(prDesc);
+  prDataPtr->anomaly = 1;
+
+  return;
+}
+
+/** Action for node N3. */
+void CrIaSemConsCheckN3(FwPrDesc_t prDesc)
+{
+  prDescSemConsFdCheck_t* prDataPtr;
+
+  CRFW_UNUSED(prDesc);
+
+  /* Return No Anomaly */
+
+  DEBUGP("  Action for node N3.\n");
+
+  prDataPtr = (prDescSemConsFdCheck_t*)FwPrGetData(prDesc);
+  prDataPtr->anomaly = 0;
+
+  return;
+}
+
+/** Guard on the Control Flow from DECISION2 to N3. */
+FwPrBool_t CrIaSemConsCheckTrState(FwPrDesc_t prDesc)
+{
+  unsigned short sem_oper_state;
+
+  CRFW_UNUSED(prDesc);
+
+  /* SEM Operational State Machine is in a TR_* State */ 
+
+  DEBUGP("  Guard on the Control Flow from DECISION2 to N3.\n");
+
+  /* get current state */
+  sem_oper_state = FwSmGetCurStateEmb(smDescSem);
+
+  if ((sem_oper_state == CrIaSem_TR_CCD_FULL) ||
+      (sem_oper_state == CrIaSem_TR_CCD_WINDOW) ||
+      (sem_oper_state == CrIaSem_TR_STABILIZE))
+    {
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/** Guard on the Control Flow from DECISION3 to N3. */
+FwPrBool_t CrIaSemConsCheckSemState(FwPrDesc_t prDesc)
+{
+  unsigned short sem_state, sem_oper_state;
+
+  CRFW_UNUSED(prDesc);
+
+  /* State of SEM Operational State Machine is the same as semState */
+
+  DEBUGP("  Guard on the Control Flow from DECISION3 to N3.\n");
+
+  /* get current states */
+  sem_state = FwSmGetCurState(smDescSem);
+  sem_oper_state = FwSmGetCurStateEmb(smDescSem);
+
+  switch(hkStatMode)
+  {
+    case SEM_STATE_SAFE: /* SAFE */
+      if (sem_state == CrIaSem_SAFE)
+        {
+          return 1;
+        }
+      else
+        {
+          return 0;
+        }
+    case SEM_STATE_STANDBY: /* STANDBY */
+      if ((sem_state == CrIaSem_OPER) && (sem_oper_state == CrIaSem_STANDBY))
+        {
+          return 1;
+        }
+      else
+        {
+          return 0;
+        }
+    case SEM_STATE_STABILIZE: /* STABILIZE */
+      if ((sem_state == CrIaSem_OPER) && (sem_oper_state == CrIaSem_STABILIZE))
+        {
+          return 1;
+        }
+      else
+        {
+          return 0;
+        }
+    case SEM_STATE_SC_STAR_FAINT: /* SC_STAR_FAINT */
+    case SEM_STATE_SC_STAR_BRIGHT: /* SC_STAR_BRIGHT */
+    case SEM_STATE_SC_STAR_ULTBRT: /* SC_STAR_ULTRBR */
+      if ((sem_state == CrIaSem_OPER) && (sem_oper_state == CrIaSem_CCD_WINDOW))
+        {
+          return 1;
+        }
+      else
+        {
+          return 0;
+        }
+    case SEM_STATE_CCD_FULL: /* CCD_FULL */
+      if ((sem_state == CrIaSem_OPER) && (sem_oper_state == CrIaSem_CCD_FULL))
+        {
+          return 1;
+        }
+      else
+        {
+          return 0;
+        }
+    case SEM_STATE_DIAGNOSTIC: /* DIAGNOSTIC */
+      if ((sem_state == CrIaSem_OPER) && (sem_oper_state == CrIaSem_DIAGNOSTICS))
+        {
+          return 1;
+        }
+      else
+        {
+          return 0;
+        }
+  }
+
+  /* NOTE: SEM state USER_DEFINED can not be checked */
+
+  return 0;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaSemCreate.c b/CrIa/src/CrIaPrSm/CrIaSemCreate.c
new file mode 100644
index 0000000..789854e
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemCreate.c
@@ -0,0 +1,102 @@
+/**
+ * @file CrIaSemCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwSmDCreate.h"
+#include "FwProfile/FwSmConfig.h"
+
+/** CrIaSem function definitions */
+#include "CrIaSemCreate.h"
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwSmDesc_t CrIaSemCreate(void* smData)
+{
+  const FwSmCounterU2_t N_OUT_OF_STANDBY = 1;	/* The number of transitions out of state STANDBY */
+  const FwSmCounterU2_t N_OUT_OF_TR_STABILIZE = 1;	/* The number of transitions out of state TR_STABILIZE */
+  const FwSmCounterU2_t N_OUT_OF_STABILIZE = 3;	/* The number of transitions out of state STABILIZE */
+  const FwSmCounterU2_t N_OUT_OF_TR_CCD_WINDOW = 2;	/* The number of transitions out of state TR_CCD_WINDOW */
+  const FwSmCounterU2_t N_OUT_OF_TR_CCD_FULL = 2;	/* The number of transitions out of state TR_CCD_FULL */
+  const FwSmCounterU2_t N_OUT_OF_DIAGNOSTICS = 1;	/* The number of transitions out of state DIAGNOSTICS */
+  const FwSmCounterU2_t N_OUT_OF_CCD_WINDOW = 2;	/* The number of transitions out of state CCD_WINDOW */
+  const FwSmCounterU2_t N_OUT_OF_CCD_FULL = 2;	/* The number of transitions out of state CCD_FULL */
+
+  /** Create state machine EsmDesc1, which is embedded in OPER */
+  FwSmDesc_t EsmDesc1 = FwSmCreate(
+                          8,	/* NSTATES - The number of states */
+                          0,	/* NCPS - The number of choice pseudo-states */
+                          15,	/* NTRANS - The number of transitions */
+                          15,	/* NACTIONS - The number of state and transition actions */
+                          4	/* NGUARDS - The number of transition guards */
+                        );
+
+  /* unit sm */
+  const FwSmCounterU2_t N_OUT_OF_OFF = 2;		/* The number of transitions out of state OFF */
+  const FwSmCounterU2_t N_OUT_OF_INIT = 2;	/* The number of transitions out of state INIT */
+  const FwSmCounterU2_t N_OUT_OF_SAFE = 2;	/* The number of transitions out of state SAFE */
+  const FwSmCounterU2_t N_OUT_OF_SHUTDOWN = 1;	/* The number of transitions out of state SHUTDOWN */
+  const FwSmCounterU2_t N_OUT_OF_OPER = 4;	/* The number of transitions out of state OPER */
+
+  /** Create state machine smDesc */
+  FwSmDesc_t smDesc = FwSmCreate(
+                        5,	/* NSTATES - The number of states */
+                        0,	/* NCPS - The number of choice pseudo-states */
+                        12,	/* NTRANS - The number of transitions */
+                        10,	/* NACTIONS - The number of state and transition actions */
+                        3	/* NGUARDS - The number of transition guards */
+                      );
+
+  /** Configure the state machine EsmDesc1, which is embedded in OPER */
+  FwSmSetData(EsmDesc1, smData);
+  FwSmAddState(EsmDesc1, CrIaSem_STANDBY, N_OUT_OF_STANDBY, &CrIaSemOperLdTransEvt, NULL, NULL, NULL);
+  FwSmAddState(EsmDesc1, CrIaSem_TR_STABILIZE, N_OUT_OF_TR_STABILIZE, &CrIaSemOperLdTransEvt, NULL, &CrIaSemOperTrStabilizeDo, NULL);
+  FwSmAddState(EsmDesc1, CrIaSem_STABILIZE, N_OUT_OF_STABILIZE, &CrIaSemOperStabilizeEntry, NULL, NULL, NULL);
+  FwSmAddState(EsmDesc1, CrIaSem_TR_CCD_WINDOW, N_OUT_OF_TR_CCD_WINDOW, &CrIaSemOperTrCcdWindowEntry, NULL, NULL, NULL);
+  FwSmAddState(EsmDesc1, CrIaSem_TR_CCD_FULL, N_OUT_OF_TR_CCD_FULL, &CrIaSemOperTrCcdFullEntry, NULL, NULL, NULL);
+  FwSmAddState(EsmDesc1, CrIaSem_DIAGNOSTICS, N_OUT_OF_DIAGNOSTICS, &CrIaSemOperLdTransEvt, NULL, NULL, NULL);
+  FwSmAddState(EsmDesc1, CrIaSem_CCD_WINDOW, N_OUT_OF_CCD_WINDOW, &CrIaSemOperCcdWindowEntry, &CrIaSemOperCcdWindowExit, &CrIaSemOperCcdWindowDo, NULL);
+  FwSmAddState(EsmDesc1, CrIaSem_CCD_FULL, N_OUT_OF_CCD_FULL, &CrIaSemOperCcdFullEntry, &CrIaSemOperCcdFullExit, &CrIaSemOperCcdFullDo, NULL);
+  FwSmAddTransIpsToSta(EsmDesc1, CrIaSem_STANDBY, NULL);
+  FwSmAddTransStaToSta(EsmDesc1, GoToStabilize, CrIaSem_STANDBY, CrIaSem_TR_STABILIZE, &CrIaSemOperCmdTempControlEnable, NULL);
+  FwSmAddTransStaToSta(EsmDesc1, Execute, CrIaSem_TR_STABILIZE, CrIaSem_STABILIZE, NULL, &CrIaSemOperIsTempStabilized);
+  FwSmAddTransStaToSta(EsmDesc1, GoToCcdWindow, CrIaSem_STABILIZE, CrIaSem_TR_CCD_WINDOW, &CrIaSemOperCmdCcdDataEnable, NULL);
+  FwSmAddTransStaToSta(EsmDesc1, GoToCcdFull, CrIaSem_STABILIZE, CrIaSem_TR_CCD_FULL, &CrIaSemOperCmdCcdDataEnable, NULL);
+  FwSmAddTransStaToSta(EsmDesc1, GoToDiagnostics, CrIaSem_STABILIZE, CrIaSem_DIAGNOSTICS, &CrIaSemOperCmdDiagEnable, NULL);
+  FwSmAddTransStaToSta(EsmDesc1, Execute, CrIaSem_TR_CCD_WINDOW, CrIaSem_STABILIZE, NULL, &CrIaSemOperIsInStabilize);
+  FwSmAddTransStaToSta(EsmDesc1, Execute, CrIaSem_TR_CCD_WINDOW, CrIaSem_CCD_WINDOW, NULL, &CrIaSemOperIsInScience);
+  FwSmAddTransStaToSta(EsmDesc1, Execute, CrIaSem_TR_CCD_FULL, CrIaSem_STABILIZE, NULL, &CrIaSemOperIsInStabilize);
+  FwSmAddTransStaToSta(EsmDesc1, Execute, CrIaSem_TR_CCD_FULL, CrIaSem_CCD_FULL, NULL, &CrIaSemOperIsInCcdFull);
+  FwSmAddTransStaToSta(EsmDesc1, Execute, CrIaSem_DIAGNOSTICS, CrIaSem_STABILIZE, NULL, &CrIaSemOperIsInStabilize);
+  FwSmAddTransStaToSta(EsmDesc1, Execute, CrIaSem_CCD_WINDOW, CrIaSem_STABILIZE, NULL, &CrIaSemOperIsInStabilize);
+  FwSmAddTransStaToSta(EsmDesc1, GoToStabilize, CrIaSem_CCD_WINDOW, CrIaSem_TR_CCD_WINDOW, &CrIaSemOperCmdCcdDataDisable, NULL);
+  FwSmAddTransStaToSta(EsmDesc1, Execute, CrIaSem_CCD_FULL, CrIaSem_STABILIZE, NULL, &CrIaSemOperIsInStabilize);
+  FwSmAddTransStaToSta(EsmDesc1, GoToStabilize, CrIaSem_CCD_FULL, CrIaSem_TR_CCD_FULL, &CrIaSemOperCmdCcdDataDisable, NULL);
+
+
+  /** Configure the state machine smDesc */
+  FwSmSetData(smDesc, smData);
+  FwSmAddState(smDesc, CrIaSem_OFF, N_OUT_OF_OFF, &CrIaSemLdTransEvt, NULL, NULL, NULL);
+  FwSmAddState(smDesc, CrIaSem_INIT, N_OUT_OF_INIT, &CrIaSemInitEntry, &CrIaSemInitExit, &CrIaSemInitDo, NULL);
+  FwSmAddState(smDesc, CrIaSem_SAFE, N_OUT_OF_SAFE, &CrIaSemLdTransEvt, NULL, NULL, NULL);
+  FwSmAddState(smDesc, CrIaSem_SHUTDOWN, N_OUT_OF_SHUTDOWN, &CrIaSemShutdownEntry, NULL, &CrIaSemShutdownDo, NULL);
+  FwSmAddState(smDesc, CrIaSem_OPER, N_OUT_OF_OPER, &CrIaSemLdTransEvt, &CrIaSemOperExit, NULL, EsmDesc1);
+  FwSmAddTransIpsToSta(smDesc, CrIaSem_OFF, NULL);
+  FwSmAddTransStaToSta(smDesc, SwitchOn, CrIaSem_OFF, CrIaSem_INIT, &CrIaSemStartSemInitPr, NULL);
+  FwSmAddTransStaToSta(smDesc, SwitchOff, CrIaSem_OFF, CrIaSem_SHUTDOWN, NULL, NULL);
+  FwSmAddTransStaToSta(smDesc, SwitchOff, CrIaSem_INIT, CrIaSem_SHUTDOWN, NULL, NULL);
+  FwSmAddTransStaToSta(smDesc, Execute, CrIaSem_INIT, CrIaSem_OPER, NULL, &CrIaSemIsSemInStandby);
+   FwSmAddTransStaToSta(smDesc, SwitchOff, CrIaSem_SAFE, CrIaSem_SHUTDOWN, NULL, NULL);
+  FwSmAddTransStaToSta(smDesc, GoToStandby, CrIaSem_SAFE, CrIaSem_INIT, &CrIaSemGoToStandby, NULL);
+  FwSmAddTransStaToSta(smDesc, Execute, CrIaSem_SHUTDOWN, CrIaSem_OFF, NULL, &CrIaSemIsShutdownTerm);
+  FwSmAddTransStaToSta(smDesc, SwitchOff, CrIaSem_OPER, CrIaSem_SHUTDOWN, NULL, NULL);
+  FwSmAddTransStaToSta(smDesc, Execute, CrIaSem_OPER, CrIaSem_SAFE, NULL, &CrIaSemIsSemInSafe);
+  FwSmAddTransStaToSta(smDesc, GoToSafe, CrIaSem_OPER, CrIaSem_SAFE, &CrIaSemGoToSafe, NULL);
+  FwSmAddTransStaToSta(smDesc, GoToStandby, CrIaSem_OPER, CrIaSem_INIT, &CrIaSemGoToStandby, NULL);
+
+  return smDesc;
+}
diff --git a/CrIa/src/CrIaPrSm/CrIaSemCreate.h b/CrIa/src/CrIaPrSm/CrIaSemCreate.h
new file mode 100644
index 0000000..4531e9f
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemCreate.h
@@ -0,0 +1,381 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaSem state machine.
+ * The state machine is configured with a set of function pointers representing the non-default
+ * actions and guards of the state machine. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the state machine in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The state machine created by this file is shown in the figure below.
+ *
+ * <b>Note for state OPER</b>
+ * State OPER contains an embedded state 
+ * machine (the SEM Operation State Machine).
+ *
+ * @image html CrIaSem.png
+ *
+ * @author FW Profile code generator version 5.01
+ * @date Created on: Aug 13 2018 18:55:30
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaSemCreate_H_
+#define CrIaSemCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwSmConstants.h"
+
+/** State identifiers */
+#define CrIaSem_STOPPED (0)
+#define CrIaSem_CCD_FULL (1)		/* The identifier of state CCD_FULL in State Machine CrIaSem */
+#define CrIaSem_CCD_WINDOW (2)		/* The identifier of state CCD_WINDOW in State Machine CrIaSem */
+#define CrIaSem_DIAGNOSTICS (3)		/* The identifier of state DIAGNOSTICS in State Machine CrIaSem */
+#define CrIaSem_STABILIZE (4)		/* The identifier of state STABILIZE in State Machine CrIaSem */
+#define CrIaSem_STANDBY (5)		/* The identifier of state STANDBY in State Machine CrIaSem */
+#define CrIaSem_TR_CCD_FULL (6)		/* The identifier of state TR_CCD_FULL in State Machine CrIaSem */
+#define CrIaSem_TR_CCD_WINDOW (7)		/* The identifier of state TR_CCD_WINDOW in State Machine CrIaSem */
+#define CrIaSem_TR_STABILIZE (8)		/* The identifier of state TR_STABILIZE in State Machine CrIaSem */
+#define CrIaSem_INIT (1)		/* The identifier of state INIT in State Machine CrIaSem */
+#define CrIaSem_OFF (2)		/* The identifier of state OFF in State Machine CrIaSem */
+#define CrIaSem_OPER (3)		/* The identifier of state OPER in State Machine CrIaSem */
+#define CrIaSem_SAFE (4)		/* The identifier of state SAFE in State Machine CrIaSem */
+#define CrIaSem_SHUTDOWN (5)		/* The identifier of state SHUTDOWN in State Machine CrIaSem */
+
+/** The identifiers of transition commands (triggers) */
+#define Execute (0)
+#define SwitchOn (6)
+#define SwitchOff (7)
+#define GoToSafe (8)
+#define GoToStandby (9)
+#define GoToStabilize (10)
+#define GoToCcdWindow (11)
+#define GoToCcdFull (12)
+#define GoToDiagnostics (13)
+
+/**
+ * Create a new state machine descriptor.
+ * This interface creates the state machine descriptor dynamically.
+ * @param smData the pointer to the state machine data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the state machine data when the state machine is created is NULL).
+ * @return the pointer to the state machine descriptor
+ */
+FwSmDesc_t CrIaSemCreate(void* smData);
+
+/**
+ * Entry Action for the state STANDBY.
+ * Load EVT_SEMOP_TR
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemOperLdTransEvt(FwSmDesc_t smDesc);
+
+/**
+ * Do Action for the state TR_STABILIZE.
+ * <pre>
+ * if (Flag_3) { Send command 
+ *  FPM_Power_Enable to SEM;
+ *  Send cmd(220,11) to SEM }
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemOperTrStabilizeDo(FwSmDesc_t smDesc);
+
+/**
+ * Entry Action for the state STABILIZE.
+ * <pre>
+ * Load EVT_SEMOP_TR;
+ * Disable TTM FdCheck;
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemOperStabilizeEntry(FwSmDesc_t smDesc);
+
+/**
+ * Entry Action for the state TR_CCD_WINDOW.
+ * <pre>
+ * Load EVT_SEMOP_TR
+ * Enable TTM FdCheck;
+ * acqImageCnt = 0;
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemOperTrCcdWindowEntry(FwSmDesc_t smDesc);
+
+/**
+ * Entry Action for the state TR_CCD_FULL.
+ * <pre>
+ * Load EVT_SEMOP_TR
+ * Enable TTM FdCheck;
+ * acqImageCnt = 0;
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemOperTrCcdFullEntry(FwSmDesc_t smDesc);
+
+/**
+ * Entry Action for the state CCD_WINDOW.
+ * <pre>
+ * Load EVT_SEMOP_TR;
+ * imageCycleCnt = -1;
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemOperCcdWindowEntry(FwSmDesc_t smDesc);
+
+/**
+ * Exit Action for the state CCD_WINDOW.
+ * ImageCycleCnt = -1
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemOperCcdWindowExit(FwSmDesc_t smDesc);
+
+/**
+ * Do Action for the state CCD_WINDOW.
+ * <pre>
+ * if (Flag_4) imageCycleCnt++;
+ * if (Flag_1) {
+ *   acqImageCnt++;
+ *    imageCycleCnt = 0 };
+ * if (Flag_2)
+ *    notify Sporadic Activity 2;
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemOperCcdWindowDo(FwSmDesc_t smDesc);
+
+/**
+ * Entry Action for the state CCD_FULL.
+ * <pre>
+ * Load EVT_SEMOP_TR;
+ * imageCycleCnt = -1;
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemOperCcdFullEntry(FwSmDesc_t smDesc);
+
+/**
+ * Exit Action for the state CCD_FULL.
+ * ImageCycleCnt = -1
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemOperCcdFullExit(FwSmDesc_t smDesc);
+
+/**
+ * Do Action for the state CCD_FULL.
+ * <pre>
+ * if (Flag_4) imageCycleCnt++;
+ * if (Flag_1) {
+ *    acqImageCnt++;
+ *    imageCycleCnt = 0 };
+ * if (imageCycleCnt == ACQ_PH)
+ *    notify Sporadic Activity 1;
+ * if (Flag_2)
+ *    notify Sporadic Activity 2;
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemOperCcdFullDo(FwSmDesc_t smDesc);
+
+/**
+ * Action on the transition from STANDBY to TR_STABILIZE.
+ * CMD_Temp_Control_Enable
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemOperCmdTempControlEnable(FwSmDesc_t smDesc);
+
+/**
+ * Guard on the transition from TR_STABILIZE to STABILIZE.
+ *  Flag_4 
+ * @param smDesc the state machine descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwSmBool_t CrIaSemOperIsTempStabilized(FwSmDesc_t smDesc);
+
+/**
+ * Action on the transition from STABILIZE to TR_CCD_WINDOW.
+ * CMD_CCD_Data_Enable
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemOperCmdCcdDataEnable(FwSmDesc_t smDesc);
+
+/**
+ * Action on the transition from STABILIZE to DIAGNOSTICS.
+ * CMD_Diagnostics_Enable
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemOperCmdDiagEnable(FwSmDesc_t smDesc);
+
+/**
+ * Guard on the transition from TR_CCD_WINDOW to STABILIZE.
+ * <pre>
+ *  SEM Evt
+ * Confirms
+ * STABILIZE 
+ * </pre>
+ * @param smDesc the state machine descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwSmBool_t CrIaSemOperIsInStabilize(FwSmDesc_t smDesc);
+
+/**
+ * Guard on the transition from TR_CCD_WINDOW to CCD_WINDOW.
+ * <pre>
+ *  SEM
+ * Evt Confirms
+ * SCIENCE 
+ * </pre>
+ * @param smDesc the state machine descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwSmBool_t CrIaSemOperIsInScience(FwSmDesc_t smDesc);
+
+/**
+ * Guard on the transition from TR_CCD_FULL to CCD_FULL.
+ * <pre>
+ *  SEM
+ * Evt Confirms
+ * CCD_FULL 
+ * </pre>
+ * @param smDesc the state machine descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwSmBool_t CrIaSemOperIsInCcdFull(FwSmDesc_t smDesc);
+
+/**
+ * Action on the transition from CCD_WINDOW to TR_CCD_WINDOW.
+ * <pre>
+ * 
+ * CMD_CCD_Data_Disable
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemOperCmdCcdDataDisable(FwSmDesc_t smDesc);
+
+/**
+ * Entry Action for the state OFF.
+ * <pre>
+ * if (Entry in OFF is not part of Starting
+ *  the SM) then  Load EVT_SEM_TR
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemLdTransEvt(FwSmDesc_t smDesc);
+
+/**
+ * Entry Action for the state INIT.
+ * <pre>
+ * Load EVT_SEM_TR;
+ * Reset Source Seq. Counter for SEM
+ * Enable SEM Comm. Error FdCheck;
+ * Enable SEM Mode Time-Out FdCheck;
+ * Enable SEM Safe Mode FdCheck;
+ * Enable SEM Anomaly Event FdCheck;
+ * Enable TM Packet SEM_ABS_HK;
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemInitEntry(FwSmDesc_t smDesc);
+
+/**
+ * Exit Action for the state INIT.
+ * <pre>
+ * Stop SEM Initialization Procedure;
+ * Enable SEM Alive FdCheck;
+ * Enable SEM Limit FdCheck;
+ * Load TC(9,129) to SEM;
+ * Enable SEM Mode Cons. FdCheck
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemInitExit(FwSmDesc_t smDesc);
+
+/**
+ * Do Action for the state INIT.
+ * Execute SEM Initialization Procedure
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemInitDo(FwSmDesc_t smDesc);
+
+/**
+ * Entry Action for the state SHUTDOWN.
+ * <pre>
+ * Load EVT_SEM_TR;
+ * Start SEM ShutdownProcedure;
+ * Disable SEM-related FdChecks;
+ * Disable TM Packet SEM_ABS_HK;
+ * </pre>
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemShutdownEntry(FwSmDesc_t smDesc);
+
+/**
+ * Do Action for the state SHUTDOWN.
+ * Execute SEM Shutdown Procedure
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemShutdownDo(FwSmDesc_t smDesc);
+
+/**
+ * Exit Action for the state OPER.
+ * Disable TTM FdCheck
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemOperExit(FwSmDesc_t smDesc);
+
+/**
+ * Action on the transition from OFF to INIT.
+ * Start SEM Initialization Proc.
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemStartSemInitPr(FwSmDesc_t smDesc);
+
+/**
+ * Guard on the transition from INIT to OPER.
+ * <pre>
+ *  SEM Evnt Confirms 
+ * Entry into STANDBY 
+ * </pre>
+ * @param smDesc the state machine descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwSmBool_t CrIaSemIsSemInStandby(FwSmDesc_t smDesc);
+
+/**
+ * Guard on the transition from SHUTDOWN to OFF.
+ * <pre>
+ *  SEM Shutdown
+ * Proc. Terminated 
+ * </pre>
+ * @param smDesc the state machine descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwSmBool_t CrIaSemIsShutdownTerm(FwSmDesc_t smDesc);
+
+/**
+ * Guard on the transition from OPER to SAFE.
+ * <pre>
+ *  SEM Evt Confirms
+ * Entry into SAFE 
+ * </pre>
+ * @param smDesc the state machine descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwSmBool_t CrIaSemIsSemInSafe(FwSmDesc_t smDesc);
+
+/**
+ * Action on the transition from OPER to SAFE.
+ * CMD_Safe_Enter
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemGoToSafe(FwSmDesc_t smDesc);
+
+/**
+ * Action on the transition from OPER to INIT.
+ * CMD_Standby_Enter
+ * @param smDesc the state machine descriptor
+ */
+void CrIaSemGoToStandby(FwSmDesc_t smDesc);
+
+#endif /* CrIaSemCreate_H_ */
diff --git a/CrIa/src/CrIaPrSm/CrIaSemEvtUpdPrCreate.c b/CrIa/src/CrIaPrSm/CrIaSemEvtUpdPrCreate.c
new file mode 100644
index 0000000..74c2340
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemEvtUpdPrCreate.c
@@ -0,0 +1,55 @@
+/**
+ * @file CrIaSemEvtUpdPrCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaSemEvtUpdPr function definitions */
+#include "CrIaSemEvtUpdPrCreate.h"
+
+/**
+ * Guard on the Control Flow from DECISION1 to Final Node.
+ *  ! Flag_1
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code30022(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaSemEvtUpdPrCreate(void* prData)
+{
+  const FwPrCounterU2_t DECISION1 = 1;		/* The identifier of decision node DECISION1 in procedure CrIaSemEvtUpdPr */
+  const FwPrCounterU2_t N_OUT_OF_DECISION1 = 2;	/* The number of control flows out of decision node DECISION1 in procedure CrIaSemEvtUpdPr */
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+                        2,	/* N_ANODES - The number of action nodes */
+                        1,	/* N_DNODES - The number of decision nodes */
+                        5,	/* N_FLOWS - The number of control flows */
+                        2,	/* N_ACTIONS - The number of actions */
+                        2	/* N_GUARDS - The number of guards */
+                      );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddActionNode(prDesc, CrIaSemEvtUpdPr_N1, &CrIaSemEvtUpdPrPush);
+  FwPrAddActionNode(prDesc, CrIaSemEvtUpdPr_N2, &CrIaSemEvtUpdPrForward);
+  FwPrAddDecisionNode(prDesc, DECISION1, N_OUT_OF_DECISION1);
+  FwPrAddFlowIniToAct(prDesc, CrIaSemEvtUpdPr_N1, NULL);
+  FwPrAddFlowActToDec(prDesc, CrIaSemEvtUpdPr_N1, DECISION1, NULL);
+  FwPrAddFlowActToFin(prDesc, CrIaSemEvtUpdPr_N2, NULL);
+  FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaSemEvtUpdPr_N2, &CrIaSemEvtUpdPrFlag1);
+  FwPrAddFlowDecToFin(prDesc, DECISION1, &code30022);
+
+  return prDesc;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSemEvtUpdPrCreate.h b/CrIa/src/CrIaPrSm/CrIaSemEvtUpdPrCreate.h
new file mode 100644
index 0000000..8e45d07
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemEvtUpdPrCreate.h
@@ -0,0 +1,69 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaSemEvtUpdPr procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ *
+ * <b>Note for node N2</b>
+ * If <code>pckt</code> is the packet holding the report 
+ * to be forwarded, then this function uses function 
+ * <code>CrFwOutStreamSend</code> on <code>OutStreamGrd</code> 
+ * (the OutStream managing packets going to the ground) 
+ * to re-route the packet to the ground.
+ *
+ * @image html CrIaSemEvtUpdPr.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaSemEvtUpdPrCreate_H_
+#define CrIaSemEvtUpdPrCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaSemEvtUpdPr_N1 1		/* The identifier of action node N1 in procedure CrIaSemEvtUpdPr */
+#define CrIaSemEvtUpdPr_N2 2		/* The identifier of action node N2 in procedure CrIaSemEvtUpdPr */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaSemEvtUpdPrCreate(void* prData);
+
+/**
+ * Action for node N1.
+ * Push event report onto SEM Event Store
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSemEvtUpdPrPush(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N2.
+ * Forward event report to Ground
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSemEvtUpdPrForward(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION1 to N2.
+ *  Flag_1 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSemEvtUpdPrFlag1(FwPrDesc_t prDesc);
+
+#endif /* CrIaSemEvtUpdPrCreate_H_ */
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSemEvtUpdPrFunc.c b/CrIa/src/CrIaPrSm/CrIaSemEvtUpdPrFunc.c
new file mode 100644
index 0000000..2bad181
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemEvtUpdPrFunc.c
@@ -0,0 +1,41 @@
+/**
+ * @file CrIaSemEvtUpdPrFunc.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+#include "FwProfile/FwPrCore.h"
+
+/** CrIaSemEvtUpdPr function definitions */
+#include "CrIaSemEvtUpdPrCreate.h"
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N1. */
+void CrIaSemEvtUpdPrPush(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return;
+}
+
+/** Action for node N2. */
+void CrIaSemEvtUpdPrForward(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return;
+}
+
+/** Guard on the Control Flow from DECISION1 to N2. */
+FwPrBool_t CrIaSemEvtUpdPrFlag1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaSemEvtUpdPrInit.txt b/CrIa/src/CrIaPrSm/CrIaSemEvtUpdPrInit.txt
new file mode 100644
index 0000000..6d8b127
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemEvtUpdPrInit.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaSemEvtUpdPrCreate(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaSemEvtUpdPr is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaSemEvtUpdPr is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSemFunc.c b/CrIa/src/CrIaPrSm/CrIaSemFunc.c
new file mode 100644
index 0000000..a971858
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemFunc.c
@@ -0,0 +1,480 @@
+/**
+ * @file CrIaSemFunc.c
+ * @ingroup CrIaSm
+ * @authors FW Profile code generator version 4.63; Institute for Astrophysics, 2015-2016
+ * @date Created on: Feb 11 2016 22:56:45
+ *
+ * @brief Implementation of the SEM Unit State Machine actions and guards.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include <FwProfile/FwSmConstants.h>
+#include <FwProfile/FwSmDCreate.h>
+#include <FwProfile/FwSmConfig.h>
+#include <FwProfile/FwSmCore.h>
+
+#include <FwProfile/FwPrCore.h> /* for FwPrGetCurNode() */
+
+/** Cordet FW function definitions */
+#include <CrFramework/InStream/CrFwInStream.h>
+#include <CrFramework/OutFactory/CrFwOutFactory.h>
+#include <CrFramework/OutLoader/CrFwOutLoader.h>
+#include <CrFramework/OutCmp/CrFwOutCmp.h>
+
+/** CrIaSem + Oper function definitions */
+#include <CrIaPrSm/CrIaSemCreate.h>
+
+#include <CrIaIasw.h>
+
+#include <IfswDebug.h>
+
+#if(__sparc__)
+#include <ibsw_interface.h>
+#endif
+
+#include <Services/General/CrIaConstants.h>
+#include <Services/General/CrSemParamSetter.h>
+#include <Services/General/CrSemConstants.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <CrIaSemEvents.h>
+
+#define SID_SEM_ABS_HK  6
+#define SEM_UNIT_SM_STATE_OFF 2
+
+/* imported global variables */
+extern unsigned short SemTransition;
+extern unsigned short SemHkIaswStateExecCnt;
+extern FwSmBool_t semShutdownProcTerminated;
+extern FwSmBool_t flagDelayedSemHkPacket;
+extern CrFwBool_t signalSemStateStandby;
+
+
+/****************************************************************************************/
+/******************************** SEM Unit State Machine ********************************/
+/****************************************************************************************/
+
+/** Entry Action for the state OFF / OPER / SAFE. */
+void CrIaSemLdTransEvt(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short sem_state_prev;
+  unsigned short sem_state;
+
+  unsigned short evt_data[2];
+  unsigned int timestamp;
+  
+  sem_state = FwSmGetCurState(smDescSem);
+
+
+  CrIaCopy(SEMSTATE_ID,  &sem_state_prev);
+  CrIaPaste(SEMSTATE_ID, &sem_state);
+
+
+  if (sem_state_prev != CrIaSem_STOPPED)
+    {
+      evt_data[0] = sem_state_prev;
+      evt_data[1] = sem_state;
+
+      DEBUGP("HERE COMES THE EVENT THAT YOU WANTED TO SEE!\n");
+      CrIaEvtRep(1, CRIA_SERV5_EVT_SEM_TR, evt_data, 4);
+    }
+
+  /* Reset variable SemTransition */
+  SemTransition = 0;
+
+  if (sem_state == CrIaSem_OFF)
+    {
+      /* Reset variable SemPowerOnTimeStamp */
+      timestamp = 0;
+      CrIaPaste(SEMPWRONTIMESTAMP_ID, &timestamp);     
+    }
+
+  return;
+}
+
+/** Entry Action for the state INIT. */
+void CrIaSemInitEntry(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short sem_state_prev;
+  unsigned short sem_state;
+
+  unsigned short evt_data[2];
+
+  unsigned char FdCheckComErrIntEn, FdCheckTimeOutIntEn, FdCheckSafeModeIntEn, FdCheckSemAnoEvtIntEn;
+
+  unsigned char sid, rdlSid, rdlSlot, rdlEnabled;
+  unsigned int rdlCycCnt;
+
+  FwSmDesc_t smDescInStreamSem;
+  CrFwGroup_t group;
+  CrFwSeqCnt_t seqCnt;
+
+  sem_state = FwSmGetCurState(smDescSem);
+
+  CrIaCopy(SEMSTATE_ID,  &sem_state_prev);
+  CrIaPaste(SEMSTATE_ID, &sem_state);
+
+  evt_data[0] = sem_state_prev;
+  evt_data[1] = sem_state;
+
+  CrIaEvtRep(1, CRIA_SERV5_EVT_SEM_TR, evt_data, 4);
+
+  /* Reset Source Seq. Counter for SEM */
+  smDescInStreamSem = inStreamSem;
+  group = 0; /* All reports from the SEM have PCAT = 0x1 and group = PCAT - 1 = 0x0 */
+  seqCnt = 0; /* Reset value of the Sequence Counter */
+  CrFwInStreamSetSeqCnt(smDescInStreamSem, group, seqCnt);
+
+  /* Enable SEM communication error FdCheck */
+  FdCheckComErrIntEn = 1;
+  CrIaPaste(FDCHECKCOMERRINTEN_ID, &FdCheckComErrIntEn);
+
+  /* Enable SEM mode timeout FdCheck */
+  FdCheckTimeOutIntEn = 1;
+  CrIaPaste(FDCHECKTIMEOUTINTEN_ID, &FdCheckTimeOutIntEn); 
+
+  /* Reset variable SemTransition */
+  SemTransition = 0;
+  /* Reset CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_STANDBY_SET */
+  CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_STANDBY_SET = 0;
+
+  /* Enable SEM safe mode FdCheck */
+  FdCheckSafeModeIntEn = 1;
+  CrIaPaste(FDCHECKSAFEMODEINTEN_ID, &FdCheckSafeModeIntEn);
+
+  /* Enable SEM anomaly event FdCheck */
+  FdCheckSemAnoEvtIntEn = 1;
+  CrIaPaste(FDCHECKSEMANOEVTINTEN_ID, &FdCheckSemAnoEvtIntEn);
+
+  /* Enable TM Packet SEM_ABS_HK */
+
+  sid = SID_SEM_ABS_HK;
+
+  /* look for the slot */
+  for (rdlSlot = 0; rdlSlot < RDL_SIZE; rdlSlot++)
+    {
+      CrIaCopyArrayItem(RDLSIDLIST_ID, &rdlSid, rdlSlot);
+      if (sid == rdlSid)
+        break;
+    }
+
+  /* sid not found in list */
+  if (rdlSlot == RDL_SIZE)
+    {
+      DEBUGP("SID %d not found!\n", sid);
+      return;
+    }
+
+  rdlEnabled = 1;
+  CrIaPasteArrayItem(RDLENABLEDLIST_ID, &rdlEnabled, rdlSlot);
+
+  rdlCycCnt = 0;
+  CrIaPasteArrayItem(RDLCYCCNTLIST_ID, &rdlCycCnt, rdlSlot);
+
+  return;
+}
+
+/** Exit Action for the state INIT. */
+void CrIaSemInitExit(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned char FdCheckAliveIntEn, FdCheckSemLimitIntEn, FdCheckSemConsIntEn;
+  unsigned char SemTick;
+
+  /* Stop SEM Initialization procedure */
+  FwPrStop(prDescSemInit);
+
+  /* Enable SEM alive FdCheck */
+  FdCheckAliveIntEn = 1;
+  CrIaPaste(FDCHECKALIVEINTEN_ID, &FdCheckAliveIntEn);
+  /* Set flag for FdCheck to increase the margin for number of cycles to handle delayed first SEM HK packet */
+  flagDelayedSemHkPacket = 1;
+  /* Reset IASW cycle counter information when last SEM HK was received */
+  SemHkIaswStateExecCnt = FwSmGetExecCnt(smDescIasw);
+
+  /* Enable SEM Limit FdCheck */
+  FdCheckSemLimitIntEn = 1;
+  CrIaPaste(FDCHECKSEMLIMITINTEN_ID, &FdCheckSemLimitIntEn);
+
+  /* Enable SEM Mode Consistency FdCheck */
+  FdCheckSemConsIntEn = 1;
+  CrIaPaste(FDCHECKSEMCONSINTEN_ID, &FdCheckSemConsIntEn);
+
+  /* Load TC(9,129) to SEM, see Mantis 1193 */
+  /* NOTE: the time is set in the update action of serv 9 outCmd */
+  CrIaLoadSemTimeCmd();
+
+  /* enable time propagation */
+  SemTick = 1;
+  CrIaPaste(SEMTICK_ID, &SemTick);
+
+  return;
+}
+
+/** Do Action for the state INIT. */
+void CrIaSemInitDo(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  DEBUGP("SEM SM: Execute SEM Init Procedure\n");
+
+  /* Execute SEM Init Procedure */
+  FwPrExecute(prDescSemInit);
+
+  return;
+}
+
+/** Entry Action for the state SHUTDOWN. */
+void CrIaSemShutdownEntry(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short sem_state_prev;
+  unsigned short sem_state;
+
+  unsigned short evt_data[2];
+
+  unsigned char FdCheckComErrIntEn, FdCheckTimeOutIntEn, FdCheckAliveIntEn, FdCheckSafeModeIntEn, FdCheckSemLimitIntEn, FdCheckSemAnoEvtIntEn, FdCheckSemConsIntEn;
+
+  unsigned char sid, rdlSid, rdlSlot, rdlEnabled;
+  unsigned int rdlCycCnt;
+
+  /* Get the current state of the SEM Unit SM */
+  sem_state = FwSmGetCurState(smDescSem);
+
+  /* Get the previous state of the SEM Unit SM */
+  CrIaCopy(SEMSTATE_ID,  &sem_state_prev);
+
+  /* update current state of SEM Unit SM in data pool */
+  CrIaPaste(SEMSTATE_ID, &sem_state);
+
+  /* Load EVT_SEM_TR */
+  evt_data[0] = sem_state_prev;
+  evt_data[1] = sem_state;
+
+  CrIaEvtRep(1,CRIA_SERV5_EVT_SEM_TR, evt_data, 4);
+
+  /* Start SEM Shutdown Procedure */
+  FwPrStart(prDescSemShutdown);
+
+  /* Disable SEM-related FdChecks */
+  /* SEM_COM_ERR */
+  FdCheckComErrIntEn = 0;
+  CrIaPaste(FDCHECKCOMERRINTEN_ID, &FdCheckComErrIntEn);
+  /* SEM_MODE_TIMEOUT */
+  FdCheckTimeOutIntEn = 0;
+  CrIaPaste(FDCHECKTIMEOUTINTEN_ID, &FdCheckTimeOutIntEn); 
+  /* SEM_ALIVE */
+  FdCheckAliveIntEn = 0;
+  CrIaPaste(FDCHECKALIVEINTEN_ID, &FdCheckAliveIntEn);
+  /* SEM_SM */
+  FdCheckSafeModeIntEn = 0;
+  CrIaPaste(FDCHECKSAFEMODEINTEN_ID, &FdCheckSafeModeIntEn);
+  /* SEM_LIMIT */
+  FdCheckSemLimitIntEn = 0;
+  CrIaPaste(FDCHECKSEMLIMITINTEN_ID, &FdCheckSemLimitIntEn);
+  /* SEM_ANO_EVT */
+  FdCheckSemAnoEvtIntEn = 0;
+  CrIaPaste(FDCHECKSEMANOEVTINTEN_ID, &FdCheckSemAnoEvtIntEn);
+  /* SEM_CONS */
+  FdCheckSemConsIntEn = 0;
+  CrIaPaste(FDCHECKSEMCONSINTEN_ID, &FdCheckSemConsIntEn);
+
+  DEBUGP("***** Power off SEM. ENTRY *****\n");
+
+  /* Disable TM Packet SEM_ABS_HK */
+
+  sid = SID_SEM_ABS_HK;
+
+  /* look for the slot */
+  for (rdlSlot = 0; rdlSlot < RDL_SIZE; rdlSlot++)
+    {
+      CrIaCopyArrayItem(RDLSIDLIST_ID, &rdlSid, rdlSlot);
+      if (sid == rdlSid)
+        break;
+    }
+
+  /* sid not found in list */
+  if (rdlSlot == RDL_SIZE)
+    {
+      DEBUGP("SID %d not found!\n", sid);
+      return;
+    }
+
+  rdlEnabled = 0;
+  CrIaPasteArrayItem(RDLENABLEDLIST_ID, &rdlEnabled, rdlSlot);
+
+  rdlCycCnt = 0;
+  CrIaPasteArrayItem(RDLCYCCNTLIST_ID, &rdlCycCnt, rdlSlot);
+
+  return;
+}
+
+/** Do Action for the state SHUTDOWN. */
+void CrIaSemShutdownDo(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  /* Execute SEM Shutdown Procedure */
+  FwPrExecute(prDescSemShutdown);
+
+  return;
+}
+
+/** Exit Action for the state OPER. */
+void CrIaSemOperExit(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned char FdCheckTtmIntEn;
+
+  /* Disable TTM FdCheck */
+  FdCheckTtmIntEn = 0;
+  CrIaPaste(FDCHECKTTMINTEN_ID, &FdCheckTtmIntEn);
+
+  return;
+}
+
+/** Action on the transition from OFF to INIT. */
+void CrIaSemStartSemInitPr(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned int timestamp;
+  CrFwTimeStamp_t time;
+
+  /* Start SEM Initialization Procedure */
+  FwPrStart(prDescSemInit);
+
+  /* save timestamp */
+  time = CrIbGetCurrentTime();
+  timestamp = ((uint32_t)time.t[0] << 24) | ((uint32_t)time.t[1] << 16) | ((uint32_t)time.t[2] << 8) | (uint32_t)time.t[3];
+  CrIaPaste(SEMPWRONTIMESTAMP_ID, &timestamp);
+
+  /* PRDEBUGP("SEM power on: %d\n", SemPowerOnTimeStamp); */
+
+  /* prevent to signal SEM State Transition to STANDBY at boot up */
+  signalSemStateStandby = 0;
+
+  return;
+}
+
+
+/** Guard on the transition from INIT to OPER. */
+FwSmBool_t CrIaSemIsSemInStandby(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  /*  if (CRSEM_SERV5_EVENT_PRG_APS_BOOT_READY_SET) not necessary, see mantis 1179 */
+
+  DEBUGP("Guard on the transition from INIT to OPER.\n");
+
+  /* SEM Event Confirms Entry into STANDBY */
+  if (CRSEM_SERV5_EVENT_PRG_CFG_LOAD_READY_SET || (SemTransition == SEM_STATE_STANDBY))
+    {
+      DEBUGP("*** STARTUP: received event! CRSEM_SERV5_EVENT_PRG_CFG_LOAD_READY_SET = %d, SemTransition = %d\n", CRSEM_SERV5_EVENT_PRG_CFG_LOAD_READY_SET, SemTransition);
+
+      /* clear events here, see Mantis 1178 */
+      /* CRSEM_SERV5_EVENT_PRG_APS_BOOT_READY_SET = 0; */
+      /* CRSEM_SERV5_EVENT_PRG_CFG_LOAD_READY_SET = 0; */
+
+      /* Reset variable SemTransition */
+      SemTransition = 0;
+
+      return 1;
+    }
+
+  return 0;
+}
+
+/** Guard on the transition from SHUTDOWN to OFF. */
+FwSmBool_t CrIaSemIsShutdownTerm(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  DEBUGP("***** Power OFF GUARD. *****\n");
+
+  return (FwPrGetCurNode(prDescSemShutdown) == PR_STOPPED);
+}
+
+/** Guard on the transition from OPER to SAFE. */
+FwSmBool_t CrIaSemIsSemInSafe(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  DEBUGP("Guard on the transition from INIT/OPER to SAFE.\n");
+
+  /* SEM Event Confirms Entry into SAFE */
+  if (SemTransition == SEM_STATE_SAFE)
+    {
+      DEBUGP("*** SAFE: received event!\n");
+
+      return 1;
+    }
+
+  return 0;
+}
+
+/** Action on the transition from OPER to SAFE. */
+void CrIaSemGoToSafe(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  FwSmDesc_t cmd;
+  CrFwBool_t accept=1, start=0, progress=0, term=1;
+
+  /* GoToSafe / CMD_Safe_Enter */
+
+  DEBUGP("SEM SM from OPER to SAFE\n");
+
+  /* reset variable SemTransition */
+  SemTransition = 0;
+
+  /* send CMD_Safe_Enter */
+  cmd = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRSEM_SERV221, CRSEM_SERV221_CMD_SAFE_ENTER, 0, 0);
+  if (cmd == NULL)
+    {
+      /* handled by Resource FdCheck */
+      return;
+    }
+
+  CrFwOutCmpSetAckLevel(cmd, accept, start, progress, term);
+  CrFwOutCmpSetDest(cmd, CR_FW_CLIENT_SEM);
+  CrFwOutLoaderLoad(cmd);
+
+  /* Signal FdCheck SEM Mode Time-Out that CMD_Safe_enter was sent */
+  CMD_MODE_TRANSITION_TO_SAFE_Flag = 1;
+
+  return;
+}
+
+/** Action on the transition from OPER to INIT. */
+void CrIaSemGoToStandby(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  FwSmDesc_t cmd;
+  CrFwBool_t accept=1, start=0, progress=0, term=1;
+
+  /* GoToStandby / CMD_Standby_Enter */
+
+  DEBUGP("SEM SM from OPER to INIT\n");
+
+  /* reset variable SemTransition */
+  SemTransition = 0;
+
+  /* send CMD_Standby_Enter */
+  cmd = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRSEM_SERV221, CRSEM_SERV221_CMD_STANDBY_ENTER, 0, 0);
+  if (cmd == NULL)
+    {
+      /* handled by Resource FdCheck */
+      return;
+    }
+
+  CrFwOutCmpSetAckLevel(cmd, accept, start, progress, term);
+  CrFwOutCmpSetDest(cmd, CR_FW_CLIENT_SEM);
+  CrFwOutLoaderLoad(cmd);
+
+  /* Signal FdCheck SEM Mode Time-Out that CMD_Standby_enter was sent */
+  CMD_MODE_TRANSITION_TO_STANDBY_Flag = 1;
+
+  return;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaSemHkUpdPrCreate.c b/CrIa/src/CrIaPrSm/CrIaSemHkUpdPrCreate.c
new file mode 100644
index 0000000..a505f06
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemHkUpdPrCreate.c
@@ -0,0 +1,55 @@
+/**
+ * @file CrIaSemHkUpdPrCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaSemHkUpdPr function definitions */
+#include "CrIaSemHkUpdPrCreate.h"
+
+/**
+ * Guard on the Control Flow from DECISION1 to Final Node.
+ *  ! Flag_1
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code7325(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaSemHkUpdPrCreate(void* prData)
+{
+  const FwPrCounterU2_t DECISION1 = 1;		/* The identifier of decision node DECISION1 in procedure CrIaSemHkUpdPr */
+  const FwPrCounterU2_t N_OUT_OF_DECISION1 = 2;	/* The number of control flows out of decision node DECISION1 in procedure CrIaSemHkUpdPr */
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+                        2,	/* N_ANODES - The number of action nodes */
+                        1,	/* N_DNODES - The number of decision nodes */
+                        5,	/* N_FLOWS - The number of control flows */
+                        2,	/* N_ACTIONS - The number of actions */
+                        2	/* N_GUARDS - The number of guards */
+                      );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddActionNode(prDesc, CrIaSemHkUpdPr_N1, &CrIaSemHkUpdPrCopy);
+  FwPrAddActionNode(prDesc, CrIaSemHkUpdPr_N2, &CrIaSemHkUpdPrForward);
+  FwPrAddDecisionNode(prDesc, DECISION1, N_OUT_OF_DECISION1);
+  FwPrAddFlowIniToAct(prDesc, CrIaSemHkUpdPr_N1, NULL);
+  FwPrAddFlowActToDec(prDesc, CrIaSemHkUpdPr_N1, DECISION1, NULL);
+  FwPrAddFlowActToFin(prDesc, CrIaSemHkUpdPr_N2, NULL);
+  FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaSemHkUpdPr_N2, &CrIaSemHkUpdPrFlag1);
+  FwPrAddFlowDecToFin(prDesc, DECISION1, &code7325);
+
+  return prDesc;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSemHkUpdPrCreate.h b/CrIa/src/CrIaPrSm/CrIaSemHkUpdPrCreate.h
new file mode 100644
index 0000000..c0949fe
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemHkUpdPrCreate.h
@@ -0,0 +1,75 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaSemHkUpdPr procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ *
+ * <b>Note for node N1</b>
+ * This function knows the mapping of the 
+ * parameters in the two SEM housekeeping 
+ * reports to parameters in the data pool. 
+ * The report's time-stamp is also copied to the 
+ * data pool.
+ *
+ * <b>Note for node N2</b>
+ * If pckt is the packet holding the report to be forwarded,
+ * this function uses function CrFwOutStreamSend on 
+ * OutStreamGrd (the OutStream managing packets 
+ * going to the ground) to re-route the packet to the ground.
+ *
+ * @image html CrIaSemHkUpdPr.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaSemHkUpdPrCreate_H_
+#define CrIaSemHkUpdPrCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaSemHkUpdPr_N1 1		/* The identifier of action node N1 in procedure CrIaSemHkUpdPr */
+#define CrIaSemHkUpdPr_N2 2		/* The identifier of action node N2 in procedure CrIaSemHkUpdPr */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaSemHkUpdPrCreate(void* prData);
+
+/**
+ * Action for node N1.
+ * Copy HK report to Data Pool
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSemHkUpdPrCopy(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N2.
+ * Forward HK report to Ground
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSemHkUpdPrForward(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION1 to N2.
+ *  Flag_1 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSemHkUpdPrFlag1(FwPrDesc_t prDesc);
+
+#endif /* CrIaSemHkUpdPrCreate_H_ */
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSemHkUpdPrFunc.c b/CrIa/src/CrIaPrSm/CrIaSemHkUpdPrFunc.c
new file mode 100644
index 0000000..f2ec109
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemHkUpdPrFunc.c
@@ -0,0 +1,41 @@
+/**
+ * @file CrIaSemHkUpdPrFunc.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+#include "FwProfile/FwPrCore.h"
+
+/** CrIaSemHkUpdPr function definitions */
+#include "CrIaSemHkUpdPrCreate.h"
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N1. */
+void CrIaSemHkUpdPrCopy(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return;
+}
+
+/** Action for node N2. */
+void CrIaSemHkUpdPrForward(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return;
+}
+
+/** Guard on the Control Flow from DECISION1 to N2. */
+FwPrBool_t CrIaSemHkUpdPrFlag1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaSemHkUpdPrInit.txt b/CrIa/src/CrIaPrSm/CrIaSemHkUpdPrInit.txt
new file mode 100644
index 0000000..f7ecde0
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemHkUpdPrInit.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaSemHkUpdPrCreate(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaSemHkUpdPr is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaSemHkUpdPr is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSemInit.txt b/CrIa/src/CrIaPrSm/CrIaSemInit.txt
new file mode 100644
index 0000000..53a35b7
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemInit.txt
@@ -0,0 +1,27 @@
+{
+	/** Define the state machine descriptor (SMD) */
+	FwSmDesc_t smDesc = CrIaSemCreate(NULL);
+
+	/** Check that the SM is properly configured */
+	if (FwSmCheckRec(smDesc) != smSuccess) {
+		printf("The state machine CrIaSem is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The state machine CrIaSem is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the SM, send a few transition commands to it, and execute it */
+	FwSmStart(smDesc);
+	FwSmMakeTrans(smDesc, SwitchOn);
+	FwSmMakeTrans(smDesc, SwitchOff);
+	FwSmMakeTrans(smDesc, Execute);
+	FwSmMakeTrans(smDesc, GoToSafe);
+	FwSmMakeTrans(smDesc, GoToStandby);
+	FwSmMakeTrans(smDesc, GoToStabilize);
+	FwSmMakeTrans(smDesc, GoToCcdWindow);
+	FwSmMakeTrans(smDesc, GoToCcdFull);
+	FwSmMakeTrans(smDesc, GoToDiagnostics);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSemInitCreate.c b/CrIa/src/CrIaPrSm/CrIaSemInitCreate.c
new file mode 100644
index 0000000..28feefc
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemInitCreate.c
@@ -0,0 +1,37 @@
+/**
+ * @file CrIaSemInitCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Jun 3 2016 19:48:4
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaSemInit function definitions */
+#include "CrIaSemInitCreate.h"
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaSemInitCreate(void* prData)
+{
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+                        1,	/* N_ANODES - The number of action nodes */
+                        0,	/* N_DNODES - The number of decision nodes */
+                        2,	/* N_FLOWS - The number of control flows */
+                        1,	/* N_ACTIONS - The number of actions */
+                        2	/* N_GUARDS - The number of guards */
+                      );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddActionNode(prDesc, CrIaSemInit_N1, &CrIaSemInitCloseSwitch);
+  FwPrAddFlowIniToAct(prDesc, CrIaSemInit_N1, &CrIaSemInitWaitT1);
+  FwPrAddFlowActToFin(prDesc, CrIaSemInit_N1, &CrIaSemInitWaitT2);
+
+  return prDesc;
+}
diff --git a/CrIa/src/CrIaPrSm/CrIaSemInitCreate.h b/CrIa/src/CrIaPrSm/CrIaSemInitCreate.h
new file mode 100644
index 0000000..515a004
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemInitCreate.h
@@ -0,0 +1,64 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaSemInit procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ * @image html CrIaSemInit.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Jun 3 2016 19:48:4
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaSemInitCreate_H_
+#define CrIaSemInitCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaSemInit_N1 1		/* The identifier of action node N1 in procedure CrIaSemInit */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaSemInitCreate(void* prData);
+
+/**
+ * Action for node N1.
+ * <pre>
+ * Close External SEM Power Switch
+ * and FPM Heater Power Switch
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSemInitCloseSwitch(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from Initial Node to N1.
+ *  Wait SEM_INIT_T1 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSemInitWaitT1(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N1 to Final Node.
+ *  Wait SEM_INIT_T2 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSemInitWaitT2(FwPrDesc_t prDesc);
+
+#endif /* CrIaSemInitCreate_H_ */
diff --git a/CrIa/src/CrIaPrSm/CrIaSemInitFunc.c b/CrIa/src/CrIaPrSm/CrIaSemInitFunc.c
new file mode 100644
index 0000000..3a89bb0
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemInitFunc.c
@@ -0,0 +1,135 @@
+/**
+ * @file CrIaSemInitFunc.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Jun 3 2016 19:48:4
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include <FwProfile/FwPrConstants.h>
+#include <FwProfile/FwPrDCreate.h>
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwPrCore.h> /* for FwPrGetCurNode() */
+
+/** CrIaSemInit function definitions */
+#include "CrIaSemInitCreate.h"
+
+/** Cordet FW function definitions */
+#include <CrFramework/OutFactory/CrFwOutFactory.h>
+#include <CrFramework/OutLoader/CrFwOutLoader.h>
+#include <CrFramework/OutCmp/CrFwOutCmp.h>
+
+#include <CrIaIasw.h>
+
+#if(__sparc__)
+#include <ibsw_interface.h>
+#endif
+
+#include <IfswDebug.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrSemConstants.h>
+
+/* imported global variables */
+extern unsigned short SemTransition;
+
+unsigned short smDescSemInitExecCntOld = 0;
+
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N1. */
+void CrIaSemInitCloseSwitch(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Close External SEM Power Switch and FPM Power Switch */
+
+#if(__sparc__)
+
+  /* Mantis 1983: reset SPW */
+  CrIbResetSEMSpW();
+
+  /* reset variable SemTransition */
+  SemTransition = 0;
+
+  /* NOTE: the power on/off passwords are fetched inside CrIbSemLowLevelOp */
+
+  CrIbSemLowLevelOp (SWITCH_ON);
+  CrIbSemLowLevelOp (HEATER_ON);
+
+#else
+  FwSmDesc_t cmd;
+  CrFwBool_t accept=1, start=0, progress=0, term=1;
+
+  DEBUGP("***** Power on SEM. *****\n");
+
+  /* reset variable SemTransition */
+  SemTransition = 0;
+
+  /* Send CMD_STANDBY_Enter to SEM: TC(221,2) */
+  cmd = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRSEM_SERV221, CRSEM_SERV221_CMD_STANDBY_ENTER, 0, 0);
+  if (cmd == NULL)
+    {
+      /* handled by Resource FdCheck */
+      return;
+    }
+
+  CrFwOutCmpSetAckLevel(cmd, accept, start, progress, term);
+  CrFwOutCmpSetDest(cmd, CR_FW_CLIENT_SEM);
+  CrFwOutLoaderLoad(cmd);
+#endif
+
+  /* Signal FdCheck SEM Mode Time-Out that Power was switched on */
+  CMD_MODE_TRANSITION_TO_POWERON_Flag = 1;
+
+  return;
+}
+
+/** Guard on the Control Flow from Initial Node to N1. */
+FwPrBool_t CrIaSemInitWaitT1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short delay_t1 = 0;
+
+  /* Wait SEM_INIT_T1 */
+
+  CrIaCopy(SEM_INIT_T1_ID, &delay_t1);
+
+  DEBUGP ("SEM_INIT_T1: Guard on the Control Flow from Initial Node to N1. delay_t1_cnt / delay_t1 = %d / %d\n", FwPrGetNodeExecCnt(prDesc), delay_t1);
+
+  if (FwPrGetNodeExecCnt(prDesc) < delay_t1)
+    {
+      return 0;
+    }
+  else
+    {
+      return 1;
+    }
+}
+
+/** Guard on the Control Flow from N1 to Final Node. */
+FwPrBool_t CrIaSemInitWaitT2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short delay_t2 = 0;
+
+  /* Wait SEM_INIT_T2 */
+
+  CrIaCopy(SEM_INIT_T2_ID, &delay_t2);
+
+  DEBUGP ("SEM_INIT_T2: Guard on the Control Flow from N1 to Final Node. delay_t2_cnt / delay_t2 = %d / %d\n", FwPrGetNodeExecCnt(prDesc), delay_t2);
+
+  if (FwPrGetNodeExecCnt(prDesc) < delay_t2)
+    {
+      return 0;
+    }
+  else
+    {
+      return 1;
+    }
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaSemInitInit.txt b/CrIa/src/CrIaPrSm/CrIaSemInitInit.txt
new file mode 100644
index 0000000..f0f1d3b
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemInitInit.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaSemInitCreate(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaSemInit is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaSemInit is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSemOperFunc.c b/CrIa/src/CrIaPrSm/CrIaSemOperFunc.c
new file mode 100644
index 0000000..2f212ef
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemOperFunc.c
@@ -0,0 +1,684 @@
+/**
+ * @file CrIaSemOperFunc.c
+ * @ingroup CrIaSm
+ * @authors FW Profile code generator version 4.63; Institute for Astrophysics, 2015-2016
+ * @date Created on: Feb 11 2016 22:56:45
+ *
+ * @brief Implementation of the SEM Unit State Machine actions and guards.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include <FwProfile/FwSmConstants.h>
+#include <FwProfile/FwSmDCreate.h>
+#include <FwProfile/FwSmConfig.h>
+#include <FwProfile/FwSmCore.h>
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwPrCore.h>
+
+/** Cordet FW function definitions */
+#include <CrFramework/OutFactory/CrFwOutFactory.h>
+#include <CrFramework/OutLoader/CrFwOutLoader.h>
+#include <CrFramework/OutCmp/CrFwOutCmp.h>
+
+/** CrIaSem (Oper) function definitions */
+#include <CrIaPrSm/CrIaSemCreate.h>
+
+#include <CrIaIasw.h>
+
+#include <IfswDebug.h>
+#if(__sparc__)
+#include <ibsw_interface.h>
+#endif
+
+#include <Services/General/CrIaConstants.h>
+#include <Services/General/CrSemParamSetter.h>
+#include <Services/General/CrSemConstants.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <CrIaSemEvents.h>
+
+static unsigned char transitionFromStabFlag;
+
+/* imported global variables */
+extern unsigned short SemTransition;
+
+#ifdef PC_TARGET
+extern unsigned int *ShmRequestAcquisitionPTR; /* shared memory for fork() */
+extern unsigned int *ShmRequestCompressionPTR; /* shared memory for fork() */
+#endif /* PC_TARGET */
+
+
+/****************************************************************************************/
+/******************************** SEM Operational State Machine *************************/
+/****************************************************************************************/
+
+/** Entry Action for the state STANDBY, TR_STABILIZE and DIAGNOSTICS. */
+void CrIaSemOperLdTransEvt(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short sem_oper_state_prev, sem_oper_state;
+  unsigned short evt_data[2];
+
+  sem_oper_state = FwSmGetCurStateEmb(smDescSem);
+
+  CrIaCopy(SEMOPERSTATE_ID, &sem_oper_state_prev);
+  CrIaPaste(SEMOPERSTATE_ID, &sem_oper_state);
+
+  evt_data[0] = sem_oper_state_prev;
+  evt_data[1] = sem_oper_state;
+  CrIaEvtRep(1, CRIA_SERV5_EVT_SEMOP_TR, evt_data, 4);
+}
+
+/** Do Action for the state TR_STABILIZE. */
+void CrIaSemOperTrStabilizeDo(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  FwSmDesc_t cmd;
+  CrFwBool_t accept=1, start=0, progress=0, term=1;
+
+  DEBUGP("TR_STABILIZE Do Action\n");
+
+  /* if (Flag_3) Send command FPM_Power_Enable (221,3) and CMD_FUNCT_PARAM (220,11) to SEM */
+  /* Flag_3 is true if SEM confirming entry into STABILIZE */
+
+  if (SemTransition == SEM_STATE_STABILIZE)
+    {
+      DEBUGP("SEM to STABILIZE received. Send command FPM_Power_Enable (221,3) to SEM . Send command CMD_FUNCT_PARAM (220,11) to SEM. \n");
+
+      /* send TC (221,3) FPM Power Enable to SEM */
+
+      /* Create out component */
+      cmd = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRSEM_SERV221, CRSEM_SERV221_CMD_FPM_POWER_ENABLE, 0, 0);
+      if (cmd == NULL)
+        {
+          /* handled by Resource FdCheck */
+          return;
+        }
+
+      /* Set out component parameters */
+      CrFwOutCmpSetAckLevel(cmd, accept, start, progress, term);
+      CrFwOutCmpSetDest(cmd, CR_FW_CLIENT_SEM);
+
+      CrFwOutLoaderLoad(cmd);
+
+      /* send TC(220,11) SEM Functional Parameter to SEM (see Mantis 2098) */
+
+      /* Create out component */
+      cmd = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRSEM_SERV220, CRSEM_SERV220_CMD_FUNCT_PARAM, 0, 0);
+      if (cmd == NULL)
+        {
+          /* handled by Resource FdCheck */
+          return;
+        }
+
+      /* Set out component parameters */
+      CrFwOutCmpSetAckLevel(cmd, accept, start, progress, term);
+      CrFwOutCmpSetDest(cmd, CR_FW_CLIENT_SEM);
+
+      CrFwOutLoaderLoad(cmd);
+
+      /* reset the SemTransition variable, in order to generate TC(221,3) and TC(220,11) only once */
+      SemTransition = 0;
+
+    }
+  else
+    {
+      DEBUGP("NO event report from SEM received.\n");
+    }
+
+  return;
+}
+
+/** Entry Action for the state STABILIZE. */
+void CrIaSemOperStabilizeEntry(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short sem_oper_state_prev, sem_oper_state;
+  unsigned short evt_data[2];
+
+  sem_oper_state = FwSmGetCurStateEmb(smDescSem);
+
+  CrIaCopy(SEMOPERSTATE_ID, &sem_oper_state_prev);
+  CrIaPaste(SEMOPERSTATE_ID, &sem_oper_state);
+
+  evt_data[0] = sem_oper_state_prev;
+  evt_data[1] = sem_oper_state;
+  CrIaEvtRep(1, CRIA_SERV5_EVT_SEMOP_TR, evt_data, 4);
+
+  return;
+}
+
+/** Entry Action for the state TR_CCD_WINDOW. */
+void CrIaSemOperTrCcdWindowEntry(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short sem_oper_state_prev, sem_oper_state;
+  unsigned short evt_data[2];
+  unsigned char FdCheckTtmIntEn;  
+  unsigned int AcqImageCnt;
+
+  /* Load EVT_SEMOP_TR */
+  sem_oper_state = FwSmGetCurStateEmb(smDescSem);
+
+  CrIaCopy(SEMOPERSTATE_ID, &sem_oper_state_prev);
+  CrIaPaste(SEMOPERSTATE_ID, &sem_oper_state);
+
+  evt_data[0] = sem_oper_state_prev;
+  evt_data[1] = sem_oper_state;
+  CrIaEvtRep(1, CRIA_SERV5_EVT_SEMOP_TR, evt_data, 4);
+
+  /* Enable TTM FdCheck */
+  FdCheckTtmIntEn = 1;
+  CrIaPaste(FDCHECKTTMINTEN_ID, &FdCheckTtmIntEn);
+
+  /* init variable and DP */
+  AcqImageCnt = 0;
+  CrIaPaste(ACQIMAGECNT_ID, &AcqImageCnt);
+
+  S21LastAcqId = 0xffffffff; 
+
+  if (transitionFromStabFlag == 1) /* if coming from STABILIZE ... */
+    {
+      /* Signal FdCheck SEM Mode Time-Out that CMD_CCD_Data_Enable was sent (Mantis 2125) */
+      CMD_MODE_TRANSITION_TO_CCDWIN_Flag = 1;
+
+      transitionFromStabFlag = 0;
+    }
+
+  return;
+}
+
+/** Entry Action for the state TR_CCD_FULL. */
+void CrIaSemOperTrCcdFullEntry(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short sem_oper_state_prev, sem_oper_state;
+  unsigned short evt_data[2];
+  unsigned char FdCheckTtmIntEn;  
+  unsigned int AcqImageCnt;
+
+  PRDEBUGP("HELLO Full Entry!\n");
+
+  /* Load EVT_SEMOP_TR */
+  sem_oper_state = FwSmGetCurStateEmb(smDescSem);
+
+  CrIaCopy(SEMOPERSTATE_ID, &sem_oper_state_prev);
+  CrIaPaste(SEMOPERSTATE_ID, &sem_oper_state);
+
+  evt_data[0] = sem_oper_state_prev;
+  evt_data[1] = sem_oper_state;
+  CrIaEvtRep(1, CRIA_SERV5_EVT_SEMOP_TR, evt_data, 4);
+
+  /* Enable TTM FdCheck */
+  FdCheckTtmIntEn = 1;
+  CrIaPaste(FDCHECKTTMINTEN_ID, &FdCheckTtmIntEn);
+
+  /* init variable and DP */
+  AcqImageCnt = 0;
+  CrIaPaste(ACQIMAGECNT_ID, &AcqImageCnt);
+
+  S21LastAcqId = 0xffffffff; 
+
+  if (transitionFromStabFlag == 1) /* if coming from STABILIZE ... */
+    {
+      /* ... signal FdCheck SEM Mode Time-Out that CMD_CCD_Data_Enable was sent (Mantis 2125) */
+      CMD_MODE_TRANSITION_TO_CCDFULL_Flag = 1;
+
+      transitionFromStabFlag = 0;
+    }
+
+  return;
+}
+
+/** Entry Action for the state CCD_WINDOW. */
+void CrIaSemOperCcdWindowEntry(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short sem_oper_state_prev, sem_oper_state, uint16;
+  unsigned short evt_data[2];
+  unsigned int ImageCycleCnt;
+
+  PRDEBUGP("HELLO Window Entry!\n");
+
+  /* Load EVT_SEMOP_TR */
+  sem_oper_state = FwSmGetCurStateEmb(smDescSem);
+
+  CrIaCopy(SEMOPERSTATE_ID, &sem_oper_state_prev);
+  CrIaPaste(SEMOPERSTATE_ID, &sem_oper_state);
+
+  evt_data[0] = sem_oper_state_prev;
+  evt_data[1] = sem_oper_state;
+  CrIaEvtRep(1, CRIA_SERV5_EVT_SEMOP_TR, evt_data, 4);
+
+  DEBUGP("CCD WIN Entry Action, resetting counters\n");
+
+  /* init variable and DP */
+  CrIaCopy (PWINSIZEX_ID, &uint16);
+  CrIaPaste (CE_SEMWINDOWSIZEX_ID, &uint16);
+
+  CrIaCopy (PWINSIZEY_ID, &uint16);
+  CrIaPaste (CE_SEMWINDOWSIZEY_ID, &uint16);
+
+  CrIaCopy (PWINPOSX_ID, &uint16);
+  CrIaPaste (CE_SEMWINDOWPOSX_ID, &uint16);
+
+  CrIaCopy (PWINPOSY_ID, &uint16);
+  CrIaPaste (CE_SEMWINDOWPOSY_ID, &uint16);
+  
+  ImageCycleCnt = 0xffffffff;
+  CrIaPaste(IMAGECYCLECNT_ID, &ImageCycleCnt);
+
+  S21_Flag1 = 0;
+
+#ifdef PC_TARGET
+  ShmRequestCompressionPTR[0] = 0;
+  ShmRequestAcquisitionPTR[0] = 0;
+#endif /* PC_TARGET */
+
+  return;
+}
+
+/** Exit Action for the state CCD_WINDOW. */
+void CrIaSemOperCcdWindowExit(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned int ImageCycleCnt;
+
+  ImageCycleCnt = 0xffffffff;
+  CrIaPaste(IMAGECYCLECNT_ID, &ImageCycleCnt);
+
+  DEBUGP("CCD WIN Exit Action, reset image cycle cnt\n");
+
+  return;
+}
+
+/** Do Action for the state CCD_WINDOW. */
+void CrIaSemOperCcdWindowDo(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned int ImageCycleCnt, AcqImageCnt;
+  unsigned short StckOrder;
+  unsigned char lstpckt;
+  
+  CrIaCopy(IMAGECYCLECNT_ID, &ImageCycleCnt);
+  CrIaCopy(ACQIMAGECNT_ID, &AcqImageCnt);
+
+  DEBUGP("CcdWinDo, ICC++=%d, AIC=%d, S21 Flag1 = %d\n", ImageCycleCnt, AcqImageCnt, S21_Flag1);
+
+  /* 
+     We only want to increment the ImageCycleCnt as soon as images are coming in. 
+     This situation is established when S21LastAcqId != initial value.
+     S21LastAcqId is updated in the CrIaSciDataUpdFunc with the first packet of an incoming image
+  */
+
+  if (S21LastAcqId != 0xffffffff)
+    {
+      ImageCycleCnt += 1;
+      CrIaPaste(IMAGECYCLECNT_ID, &ImageCycleCnt);
+    }
+
+  /*  wait for the signal from service 21 for a first packet of a new image */
+  if (S21_Flag1 != 0)
+    {
+      AcqImageCnt += 1;
+      ImageCycleCnt = 0;
+
+      CrIaPaste(ACQIMAGECNT_ID, &AcqImageCnt);
+      CrIaPaste(IMAGECYCLECNT_ID, &ImageCycleCnt);
+
+      /* clear Flag1 */
+      S21_Flag1 = 0;
+    }
+  
+  /* COLLECTION = SCIENCE */
+  CrIaCopy(STCK_ORDER_ID, &StckOrder);
+  CrIaCopy(LASTSEMPCKT_ID, &lstpckt);
+  
+  if (lstpckt == 1)
+    {
+      if (((AcqImageCnt + 1) % StckOrder) == 0)
+	{
+	  PRDEBUGP("notify SCIENCE (case b)%d %d %d\n", ImageCycleCnt, AcqImageCnt, StckOrder);
+#ifdef PC_TARGET
+	  ShmRequestCompressionPTR[0]++;
+#else
+	  execute_compression();
+#endif /* PC_TARGET */   
+	  PRDEBUGP("notified\n");
+	}
+    }
+    
+  return;
+}
+
+/** Entry Action for the state CCD_FULL. */
+void CrIaSemOperCcdFullEntry(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short sem_oper_state_prev, sem_oper_state, uint16;
+  unsigned short evt_data[2];
+  unsigned int ImageCycleCnt;
+
+  /* Load EVT_SEMOP_TR */
+  sem_oper_state = FwSmGetCurStateEmb(smDescSem);
+
+  CrIaCopy(SEMOPERSTATE_ID, &sem_oper_state_prev);
+  CrIaPaste(SEMOPERSTATE_ID, &sem_oper_state);
+
+  evt_data[0] = sem_oper_state_prev;
+  evt_data[1] = sem_oper_state;
+  CrIaEvtRep(1, CRIA_SERV5_EVT_SEMOP_TR, evt_data, 4);
+
+  DEBUGP("CCD FULL Entry Action, resetting counters\n");
+
+  /* init variable and DP */
+  uint16 = FULL_SIZE_X;
+  CrIaPaste (CE_SEMWINDOWSIZEX_ID, &uint16);
+
+  uint16 = FULL_SIZE_Y;
+  CrIaPaste (CE_SEMWINDOWSIZEY_ID, &uint16);
+
+  uint16 = 0;
+  CrIaPaste (CE_SEMWINDOWPOSX_ID, &uint16);
+
+  uint16 = 0;
+  CrIaPaste (CE_SEMWINDOWPOSY_ID, &uint16);
+  
+  ImageCycleCnt = 0xffffffff;
+  CrIaPaste(IMAGECYCLECNT_ID, &ImageCycleCnt);
+
+  S21_Flag1 = 0;
+
+#ifdef PC_TARGET
+  ShmRequestCompressionPTR[0] = 0;
+  ShmRequestAcquisitionPTR[0] = 0;
+#endif /* PC_TARGET */
+  
+  return;
+}
+
+/** Exit Action for the state CCD_FULL. */
+void CrIaSemOperCcdFullExit(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned int ImageCycleCnt;
+
+  ImageCycleCnt = 0xffffffff;
+  CrIaPaste(IMAGECYCLECNT_ID, &ImageCycleCnt);
+
+  DEBUGP("CCD FULL Exit Action, reset image cycle cnt\n");
+
+  return;
+}
+
+/** Do Action for the state CCD_FULL. */
+void CrIaSemOperCcdFullDo(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned int ImageCycleCnt, AcqImageCnt;
+  unsigned short acquisitionPhase;
+  unsigned short StckOrder;
+  unsigned char lstpckt;
+ 
+  CrIaCopy(IMAGECYCLECNT_ID, &ImageCycleCnt);
+  CrIaCopy(ACQIMAGECNT_ID, &AcqImageCnt);
+
+  /* 
+     We only want to increment the ImageCycleCnt as soon as images are coming in. 
+     This situation is established when S21LastAcqId != initial value.
+     S21LastAcqId is updated in the CrIaSciDataUpdFunc with the first packet of an incoming image
+  */
+  if (S21LastAcqId != 0xffffffff)
+    {
+      ImageCycleCnt += 1;
+      CrIaPaste(IMAGECYCLECNT_ID, &ImageCycleCnt);
+    }
+
+  PRDEBUGP("CcdFullDo, ICC++=%d, AIC=%d, S21 Flag1 = %d\n", ImageCycleCnt, AcqImageCnt, S21_Flag1);
+
+  /*  wait for the signal from service 21 for a first packet of a new image */
+  if (S21_Flag1 != 0)
+    {
+      AcqImageCnt += 1;
+      ImageCycleCnt = 0;
+
+      CrIaPaste(ACQIMAGECNT_ID, &AcqImageCnt);
+      CrIaPaste(IMAGECYCLECNT_ID, &ImageCycleCnt);
+
+      /* clear Flag1 */
+      S21_Flag1 = 0;
+    }
+
+  /* ACQUISITION */
+  CrIaCopy(ACQ_PH_ID, &acquisitionPhase);
+  
+  if(ImageCycleCnt == (unsigned int)acquisitionPhase)
+    {
+      /* notify acquisition algorithm */
+      DEBUGP("notify Full Frame ACQUISITION\n");
+      
+#ifdef PC_TARGET
+      ShmRequestAcquisitionPTR[0]++;
+#else
+      execute_acquisition();
+#endif /* PC_TARGET */
+      
+      PRDEBUGP("notified\n");
+    }  
+ 
+  /* COLLECTION */  
+  CrIaCopy(STCK_ORDER_ID, &StckOrder);
+  CrIaCopy(LASTSEMPCKT_ID, &lstpckt);
+  
+  if (lstpckt == 1)
+    {
+      if (((AcqImageCnt + 1) % StckOrder) == 0)
+	{
+	  DEBUGP("notify Full Frame SCIENCE (case b)%d %d\n", ImageCycleCnt, AcqImageCnt);
+#ifdef PC_TARGET
+	  ShmRequestCompressionPTR[0]++;
+#else
+	  execute_compression();
+#endif /* PC_TARGET */
+	  DEBUGP("notified\n");
+	}
+    }
+      
+  return;
+}
+
+
+/** Action on the transition from STANDBY to TR_STABILIZE. */
+void CrIaSemOperCmdTempControlEnable(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short sem_oper_state;
+  CrFwBool_t accept=1, start=0, progress=0, term=1;
+
+  FwSmDesc_t cmd;
+
+  /* GoToStabilize */
+
+  sem_oper_state = FwSmGetCurStateEmb(smDescSem);
+  CrIaPaste(SEMOPERSTATE_ID, &sem_oper_state);
+
+  /* create the CMD_Temp_Control_Enable command for SEM: TC(220,4) */
+  cmd = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp (CRSEM_SERV220, CRSEM_SERV220_CMD_TEMP_CTRL_ENABLE, 0, 0);
+  if (cmd == NULL)
+    {
+      /* handled by Resource FdCheck */
+      return;
+    }
+
+  CrFwOutCmpSetAckLevel(cmd, accept, start, progress, term);
+  CrFwOutCmpSetDest(cmd, CR_FW_CLIENT_SEM);
+  CrFwOutLoaderLoad(cmd);
+
+  /* Signal FdCheck SEM Mode Time-Out that CMD_Temp_Control_Enable was sent */
+  CMD_MODE_TRANSITION_TO_STAB_Flag = 1;
+  CMD_MODE_TRANSITION_TO_TEMP_Flag = 1;
+
+  return;
+}
+
+/** Guard on the transition from TR_STABILIZE to STABILIZE. */
+FwSmBool_t CrIaSemOperIsTempStabilized(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short tsCounterUpperLimit; 
+
+  CrIaCopy(SEM_OPER_T1_ID, &tsCounterUpperLimit); /* see Mantis 1625 */
+
+  /* check if SEM Event Report (5,1,CRSEM_SERV5_EVENT_PRG_THERMAL_STABILITY) is received */
+  /* CRSEM_SERV5_EVENT_PRG_THERMAL_STABILITY = 42008 */
+
+  if (CRSEM_SERV5_EVENT_PRG_THERMAL_STABILITY_SET)
+    {
+      DEBUGP("(5,1,42008) event report from SEM received.\n");
+      CRSEM_SERV5_EVENT_PRG_THERMAL_STABILITY_SET = 0;
+      return 1;
+    }
+  else
+    {
+      DEBUGP("NO event report from SEM received.\n");
+      DEBUGP("   faking countdown to thermal stability... %d\n", FwSmGetStateExecCnt(smDesc));
+      if (FwSmGetStateExecCnt(smDesc) >= tsCounterUpperLimit)
+        {
+          return 1;
+        }
+      else
+        {
+          return 0;
+        }
+    }
+}
+
+/** Action on the transition from STABILIZE to TR_CCD_WINDOW / TR_CCD_FULL . */
+void CrIaSemOperCmdCcdDataEnable(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  FwSmDesc_t cmd;
+  CrFwBool_t accept=1, start=0, progress=0, term=1;
+
+  /* GoToCcdWindow / GoToCcdFull */
+
+  /* reset variable SemTransition */
+  SemTransition = 0;
+
+  /* create the CMD_CCD_Data_Enable command for SEM: TC(21,1) */
+  cmd = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp (CRSEM_SERV21, CRSEM_SERV21_CMD_CCD_DATA_ENABLE, 0, 0);
+  if (cmd == NULL)
+    {
+      /* handled by Resource FdCheck */
+      return;
+    }
+
+  CrFwOutCmpSetAckLevel(cmd, accept, start, progress, term);
+  CrFwOutCmpSetDest(cmd, CR_FW_CLIENT_SEM);
+  CrFwOutLoaderLoad(cmd);
+
+  /* signal coming from STABILIZE */
+  transitionFromStabFlag = 1;
+
+  return;
+}
+
+/** Action on the transition from STABILIZE to DIAGNOSTICS. */
+void CrIaSemOperCmdDiagEnable(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  FwSmDesc_t cmd;
+  CrFwBool_t accept=1, start=0, progress=0, term=1;
+
+  /* GoToDiagnostics */
+
+  /* reset variable SemTransition */
+  SemTransition = 0;
+
+  /* create the CMD_Diagnostics_Enable command for SEM: TC(222,3) */
+  cmd = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp (CRSEM_SERV222, CRSEM_SERV222_CMD_DIAG_ENABLE, 0, 0);
+  if (cmd == NULL)
+    {
+      /* handled by Resource FdCheck */
+      return;
+    }
+
+  CrFwOutCmpSetAckLevel(cmd, accept, start, progress, term);
+  CrFwOutCmpSetDest(cmd, CR_FW_CLIENT_SEM);
+  CrFwOutLoaderLoad(cmd);
+
+  /* Signal FdCheck SEM Mode Time-Out that CMD_Diagnostics_Enable was sent */
+  CMD_MODE_TRANSITION_TO_DIAG_Flag = 1;
+
+  return;
+}
+
+/** Guard on the transition from TR_CCD_WINDOW / TR_CCD_FULL / DIAGNOSTICS to STABILIZE. */
+FwSmBool_t CrIaSemOperIsInStabilize(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  /* SEM Evt Confirms STABILIZE */
+  if (SemTransition == SEM_STATE_STABILIZE)
+    return 1;
+
+  return 0;
+}
+
+/** Guard on the transition from TR_CCD_WINDOW to CCD_WINDOW. */
+FwSmBool_t CrIaSemOperIsInScience(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  /* SEM Evt Confirms SCIENCE */
+  /* SEM has no science state, but 4 states that can be seen as such */
+
+  switch (SemTransition)
+    {
+    case SEM_STATE_SC_STAR_FAINT :
+    case SEM_STATE_SC_STAR_BRIGHT :
+    case SEM_STATE_SC_STAR_ULTBRT :
+
+      return 1;
+
+    default:
+      break;
+    }
+
+  return 0;
+}
+
+/** Guard on the transition from TR_CCD_FULL to CCD_FULL. */
+FwSmBool_t CrIaSemOperIsInCcdFull(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  /* SEM Evt Confirms CCD_FULL */
+  if (SemTransition == SEM_STATE_CCD_FULL)
+    return 1;
+
+  return 0;
+}
+
+/** Action on the transition from CCD_WINDOW / CCD_FULL to TR_CCD_WINDOW / TR_CCD_FULL . */
+void CrIaSemOperCmdCcdDataDisable(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  FwSmDesc_t cmd;
+  CrFwBool_t accept=1, start=0, progress=0, term=1;
+
+  /* GoToStabilize */
+
+  /* reset variable SemTransition */
+  SemTransition = 0;
+
+  /* create the CMD_CCD_Data_Disable command for SEM: TC(21,2) */
+  cmd = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp (CRSEM_SERV21, CRSEM_SERV21_CMD_CCD_DATA_DISABLE, 0, 0);
+  if (cmd == NULL)
+    {
+      /* handled by Resource FdCheck */
+      return;
+    }
+
+  CrFwOutCmpSetAckLevel(cmd, accept, start, progress, term);
+  CrFwOutCmpSetDest(cmd, CR_FW_CLIENT_SEM);
+  CrFwOutLoaderLoad(cmd);
+
+  return;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaSemOperInit.txt b/CrIa/src/CrIaPrSm/CrIaSemOperInit.txt
new file mode 100644
index 0000000..7965893
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemOperInit.txt
@@ -0,0 +1,23 @@
+{
+	/** Define the state machine descriptor (SMD) */
+	FwSmDesc_t smDesc = CrIaSemOperCreate(NULL);
+
+	/** Check that the SM is properly configured */
+	if (FwSmCheckRec(smDesc) != smSuccess) {
+		printf("The state machine CrIaSemOper is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The state machine CrIaSemOper is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the SM, send a few transition commands to it, and execute it */
+	FwSmStart(smDesc);
+	FwSmMakeTrans(smDesc, GoToStabilize);
+	FwSmMakeTrans(smDesc, Execute);
+	FwSmMakeTrans(smDesc, GoToCcdWindow);
+	FwSmMakeTrans(smDesc, GoToCcdFull);
+	FwSmMakeTrans(smDesc, GoToDiagnostics);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaSemShutdownCreate.c b/CrIa/src/CrIaPrSm/CrIaSemShutdownCreate.c
new file mode 100644
index 0000000..11285ae
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemShutdownCreate.c
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaSemShutdownCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaSemShutdown function definitions */
+#include "CrIaSemShutdownCreate.h"
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaSemShutdownCreate(void* prData)
+{
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+                        2,	/* N_ANODES - The number of action nodes */
+                        0,	/* N_DNODES - The number of decision nodes */
+                        3,	/* N_FLOWS - The number of control flows */
+                        2,	/* N_ACTIONS - The number of actions */
+                        2	/* N_GUARDS - The number of guards */
+                      );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddActionNode(prDesc, CrIaSemShutdown_N1, &CrIaSemShutdownOpenSwitch);
+  FwPrAddActionNode(prDesc, CrIaSemShutdown_N2, &CrIaSemShutdownN2);
+  FwPrAddFlowIniToAct(prDesc, CrIaSemShutdown_N2, NULL);
+  FwPrAddFlowActToFin(prDesc, CrIaSemShutdown_N1, &CrIaSemShutdownWaitT2);
+  FwPrAddFlowActToAct(prDesc, CrIaSemShutdown_N2, CrIaSemShutdown_N1, &CrIaSemShutdownAfterN2);
+
+  return prDesc;
+}
diff --git a/CrIa/src/CrIaPrSm/CrIaSemShutdownCreate.h b/CrIa/src/CrIaPrSm/CrIaSemShutdownCreate.h
new file mode 100644
index 0000000..8977172
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemShutdownCreate.h
@@ -0,0 +1,72 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaSemShutdown procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ * @image html CrIaSemShutdown.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Jun 3 2016 19:48:4
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaSemShutdownCreate_H_
+#define CrIaSemShutdownCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaSemShutdown_N1 (1)		/* The identifier of action node N1 in procedure CrIaSemShutdown */
+#define CrIaSemShutdown_N2 (2)		/* The identifier of action node N2 in procedure CrIaSemShutdown */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaSemShutdownCreate(void* prData);
+
+/**
+ * Action for node N1.
+ * <pre>
+ * Open External SEM Power Switch
+ * and FPM Heater Power Switch
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSemShutdownOpenSwitch(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N2.
+ * Send CMD_Standby_Enter to SEM
+ * @param smDesc the procedure descriptor
+ */
+void CrIaSemShutdownN2(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N1 to Final Node.
+ *  Wait SEM_SHUTDOWN_T2 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSemShutdownWaitT2(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N2 to N1.
+ *  Flag_1 || Flag_2 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaSemShutdownAfterN2(FwPrDesc_t prDesc);
+
+#endif /* CrIaSemShutdownCreate_H_ */
diff --git a/CrIa/src/CrIaPrSm/CrIaSemShutdownFunc.c b/CrIa/src/CrIaPrSm/CrIaSemShutdownFunc.c
new file mode 100644
index 0000000..6d45eed
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemShutdownFunc.c
@@ -0,0 +1,159 @@
+/**
+ * @file CrIaSemShutdownFunc.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include <FwProfile/FwPrConstants.h>
+#include <FwProfile/FwPrDCreate.h>
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwPrCore.h> /* for FwPrGetCurNode() */
+
+/** CrIaSemShutdown function definitions */
+#include "CrIaSemShutdownCreate.h"
+
+/** Cordet FW function definitions */
+#include <CrFramework/OutFactory/CrFwOutFactory.h>
+#include <CrFramework/OutLoader/CrFwOutLoader.h>
+#include <CrFramework/OutCmp/CrFwOutCmp.h>
+
+#include <CrIaIasw.h>
+
+#if(__sparc__)
+#include <ibsw_interface.h>
+#endif
+
+#include <IfswDebug.h>
+
+#include <Services/General/CrSemConstants.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <CrIaSemEvents.h>
+
+/* imported global variables */
+extern unsigned short SemTransition;
+
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N1. */
+void CrIaSemShutdownOpenSwitch(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned int timestamp;
+  CrFwTimeStamp_t time;
+  unsigned char SemTick;
+  unsigned short semShutdownT11;
+  
+  /* Open external SEM Power Switch and FPM Heater Power Switch */
+  
+#if(__sparc__)
+
+  CrIbSemLowLevelOp (HEATER_OFF);
+  CrIbSemLowLevelOp (SWITCH_OFF); /* note: this also stops the SpW time code signal */ 
+
+#else
+  
+  /* NOTE: signal SEM Simulator that it should be in state OFF (no HK) */
+
+#endif
+
+  /* Mantis 1684: stop time propagation after switch off */  
+  SemTick = 0;
+  CrIaPaste(SEMTICK_ID, &SemTick);
+
+  /* Mantis 2073: we stop the SpW ticking here */
+#if (__sparc__)
+  CrIbDisableSpWTick();
+#endif
+  
+  /* record time of shutdown */
+  time = CrIbGetCurrentTime();
+  timestamp = ((uint32_t)time.t[0] << 24) | ((uint32_t)time.t[1] << 16) | ((uint32_t)time.t[2] << 8) | (uint32_t)time.t[3];
+  CrIaPaste(SEMPWROFFTIMESTAMP_ID, &timestamp);
+
+  /* Set SEM_SHUTDOWN_T1 equal to SEM_SHUTDOWN_T11 */
+  CrIaCopy(SEM_SHUTDOWN_T11_ID, &semShutdownT11);
+  CrIaPaste(SEM_SHUTDOWN_T1_ID, &semShutdownT11);
+
+  DEBUGP("POWER OFF!\n");
+
+  return;
+}
+
+/** Action for node N2. */
+void CrIaSemShutdownN2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  FwSmDesc_t cmd;
+  CrFwBool_t accept=1, start=0, progress=0, term=1;
+
+  DEBUGP("***** Powering off SEM. *****\n");
+
+  /* reset variable SemTransition */
+  SemTransition = 0;
+  
+  /* Send Cmd_STANDBY_Enter to SEM: TC(221,2) */
+  cmd = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRSEM_SERV221, CRSEM_SERV221_CMD_STANDBY_ENTER, 0, 0);
+  if (cmd == NULL)
+    {
+      /* handled by Resource FdCheck */
+      return;
+    }
+
+  CrFwOutCmpSetAckLevel(cmd, accept, start, progress, term);
+  CrFwOutCmpSetDest(cmd, CR_FW_CLIENT_SEM);
+  CrFwOutLoaderLoad(cmd);
+
+  return;
+}
+
+/** Guard on the Control Flow from N1 to Final Node. */
+FwPrBool_t CrIaSemShutdownWaitT2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short delay_t2 = 0;
+
+  /* Wait SEM_SHUTDOWN_T2 */
+
+  CrIaCopy(SEM_SHUTDOWN_T2_ID, &delay_t2);
+
+  DEBUGP ("SEM_SHUTDOWN_T2: Guard on the Control Flow from N1 to Final Node: %d/%d\n", FwPrGetNodeExecCnt(prDesc), delay_t2);
+
+  if (FwPrGetNodeExecCnt(prDesc) < delay_t2)
+    {
+      return 0;
+    }
+  else
+    {
+      return 1;
+    }
+
+}
+
+/** Guard on the Control Flow from N2 to N1. */
+FwPrBool_t CrIaSemShutdownAfterN2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short delay_t1 = 0;
+
+  /* Wait: SEM_SHUTDOWN_T1 cycles after the SEM Shutdown Procedure was startet execution or
+           until an event report from SEM have been received confirming entry into STANDBY */
+
+  CrIaCopy(SEM_SHUTDOWN_T1_ID, &delay_t1);
+
+  DEBUGP ("SEM_SHUTDOWN_T1/3: Guard on the Control Flow from N2 to N1. FwPrGetNodeExecCnt(prDesc) = %d; SemTransition = %d\n", FwPrGetNodeExecCnt(prDesc), SemTransition);
+
+  if ((FwPrGetNodeExecCnt(prDesc) > delay_t1) || (SemTransition == SEM_STATE_STANDBY))
+    {
+      return 1;
+    }
+
+  return 0;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaSemShutdownInit.txt b/CrIa/src/CrIaPrSm/CrIaSemShutdownInit.txt
new file mode 100644
index 0000000..1141bde
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaSemShutdownInit.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaSemShutdownCreate(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaSemShutdown is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaSemShutdown is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaTTC1Create.c b/CrIa/src/CrIaPrSm/CrIaTTC1Create.c
new file mode 100644
index 0000000..e3aadad
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaTTC1Create.c
@@ -0,0 +1,58 @@
+/**
+ * @file CrIaTTC1Create.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:46
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaTTC1 function definitions */
+#include "CrIaTTC1Create.h"
+
+/**
+ * Guard on the Control Flow from DECISION1 to Final Node.
+ *  Else
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code27565(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaTTC1Create(void* prData)
+{
+  const FwPrCounterU2_t DECISION1 = 1;		/* The identifier of decision node DECISION1 in procedure CrIaTTC1 */
+  const FwPrCounterU2_t N_OUT_OF_DECISION1 = 3;	/* The number of control flows out of decision node DECISION1 in procedure CrIaTTC1 */
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+                        3,	/* N_ANODES - The number of action nodes */
+                        1,	/* N_DNODES - The number of decision nodes */
+                        7,	/* N_FLOWS - The number of control flows */
+                        3,	/* N_ACTIONS - The number of actions */
+                        3	/* N_GUARDS - The number of guards */
+                      );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddActionNode(prDesc, CrIaTTC1_N1, &CrIaTTC1ComputeTemp);
+  FwPrAddDecisionNode(prDesc, DECISION1, N_OUT_OF_DECISION1);
+  FwPrAddActionNode(prDesc, CrIaTTC1_N4, &CrIaTTC1SwitchOff);
+  FwPrAddActionNode(prDesc, CrIaTTC1_N3, &CrIaTTC1SwitchOn);
+  FwPrAddFlowIniToAct(prDesc, CrIaTTC1_N1, NULL);
+  FwPrAddFlowActToDec(prDesc, CrIaTTC1_N1, DECISION1, NULL);
+  FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaTTC1_N3, &CrIaTTC1IsTempTooLow);
+  FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaTTC1_N4, &CrIaTTC1IsTempTooHigh);
+  FwPrAddFlowDecToFin(prDesc, DECISION1, &code27565);
+  FwPrAddFlowActToFin(prDesc, CrIaTTC1_N4, NULL);
+  FwPrAddFlowActToFin(prDesc, CrIaTTC1_N3, NULL);
+
+  return prDesc;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaTTC1Create.h b/CrIa/src/CrIaPrSm/CrIaTTC1Create.h
new file mode 100644
index 0000000..96b9d21
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaTTC1Create.h
@@ -0,0 +1,92 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaTTC1 procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ *
+ * <b>Note for Control Flow from DECISION1 to N4</b>
+ * This procedure may run either on the aft 
+ * thermistors and the aft heaters or on the 
+ * front thermistors and the front heaters.
+ *
+ * @image html CrIaTTC1.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:46
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaTTC1Create_H_
+#define CrIaTTC1Create_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaTTC1_N1 1		/* The identifier of action node N1 in procedure CrIaTTC1 */
+#define CrIaTTC1_N3 2		/* The identifier of action node N3 in procedure CrIaTTC1 */
+#define CrIaTTC1_N4 3		/* The identifier of action node N4 in procedure CrIaTTC1 */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaTTC1Create(void* prData);
+
+/**
+ * Action for node N1.
+ * <pre>
+ * T = average of two middle
+ * values of thermistor readings
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaTTC1ComputeTemp(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N4.
+ * <pre>
+ * Ask IBSW to
+ * switch off the heaters
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaTTC1SwitchOff(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N3.
+ * <pre>
+ * Ask IBSW to
+ * switch on the heaters 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaTTC1SwitchOn(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION1 to N3.
+ *  T is below lower limit 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaTTC1IsTempTooLow(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION1 to N4.
+ *  T is above upper limit 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaTTC1IsTempTooHigh(FwPrDesc_t prDesc);
+
+#endif /* CrIaTTC1Create_H_ */
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaTTC1Func.c b/CrIa/src/CrIaPrSm/CrIaTTC1Func.c
new file mode 100644
index 0000000..c1e2707
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaTTC1Func.c
@@ -0,0 +1,377 @@
+/**
+ * @file CrIaTTC1Func.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:46
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+#include "FwProfile/FwPrCore.h"
+
+/** CrIaTTC1 function definitions */
+#include "CrIaTTC1Create.h"
+
+/* DataPool */
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <CrIaIasw.h>
+
+#include <IfswUtilities.h> /* for sort4float() */
+#include <IfswConversions.h> /* for convertToTempEngVal() */
+
+#include <IfswDebug.h>
+
+#if (__sparc__)
+#include <iwf_fpga.h>
+#endif
+
+float median_Temp_EngVal;
+
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N1. */
+void CrIaTTC1ComputeTemp(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  float Temp[4];
+  float Temp1=0, Temp2=0, Temp3=0, Temp4=0; /* initialize variables with default values */
+#ifdef PC_TARGET
+  short Temp1short=0, Temp2short=0, Temp3short=0, Temp4short=0; /* initialize variables with default values */
+#endif
+
+  /* T = average of two middle values of thermistor readings */
+  /* Four temperature measurements are available, the middle two are taken (majority voted) and then averaged */
+
+  /*DEBUGP("TTC1: Calculate T = average of two middle values of thermistor readings\n");*/
+
+  /*********************************/
+  /* TTC1 aft thermistors/heaters  */
+  /*********************************/
+  if (prDesc == prDescTtc1aft)
+    {
+      /* Get temperature measurements from data pool */
+#ifdef PC_TARGET
+      /* NOTE: B=AFT */
+      CrIaCopy(ADC_TEMPOH1B_RAW_ID, &Temp1short);
+      CrIaCopy(ADC_TEMPOH2B_RAW_ID, &Temp2short);
+      CrIaCopy(ADC_TEMPOH3B_RAW_ID, &Temp3short);
+      CrIaCopy(ADC_TEMPOH4B_RAW_ID, &Temp4short);
+
+      /* Convert raw value to engineering value */
+      Temp1 = convertToTempEngVal(Temp1short, ADC_TEMPOH1B_ID) + CONVERT_KTODEGC;
+      Temp2 = convertToTempEngVal(Temp2short, ADC_TEMPOH2B_ID) + CONVERT_KTODEGC;
+      Temp3 = convertToTempEngVal(Temp3short, ADC_TEMPOH3B_ID) + CONVERT_KTODEGC;
+      Temp4 = convertToTempEngVal(Temp4short, ADC_TEMPOH4B_ID) + CONVERT_KTODEGC;
+
+      CrIaPaste(ADC_TEMPOH1B_ID, &Temp1);
+      CrIaPaste(ADC_TEMPOH2B_ID, &Temp2);
+      CrIaPaste(ADC_TEMPOH3B_ID, &Temp3);
+      CrIaPaste(ADC_TEMPOH4B_ID, &Temp4);
+#else
+      /* NOTE: B=AFT */
+      CrIaCopy(ADC_TEMPOH1B_ID, &Temp1);
+      CrIaCopy(ADC_TEMPOH2B_ID, &Temp2);
+      CrIaCopy(ADC_TEMPOH3B_ID, &Temp3);
+      CrIaCopy(ADC_TEMPOH4B_ID, &Temp4);
+#endif
+
+      Temp[0] = Temp1;
+      Temp[1] = Temp2;
+      Temp[2] = Temp3;
+      Temp[3] = Temp4;
+    }
+
+  if (prDesc == prDescTtc1front)
+    {
+      /* Get temperature measurements from data pool */
+#ifdef PC_TARGET
+      /* NOTE: A=FRT */
+      CrIaCopy(ADC_TEMPOH1A_RAW_ID, &Temp1short);
+      CrIaCopy(ADC_TEMPOH2A_RAW_ID, &Temp2short);
+      CrIaCopy(ADC_TEMPOH3A_RAW_ID, &Temp3short);
+      CrIaCopy(ADC_TEMPOH4A_RAW_ID, &Temp4short);
+
+      /* Convert raw value to engineering value */
+      Temp1 = convertToTempEngVal(Temp1short, ADC_TEMPOH1A_ID) + CONVERT_KTODEGC;
+      Temp2 = convertToTempEngVal(Temp2short, ADC_TEMPOH2A_ID) + CONVERT_KTODEGC;
+      Temp3 = convertToTempEngVal(Temp3short, ADC_TEMPOH3A_ID) + CONVERT_KTODEGC;
+      Temp4 = convertToTempEngVal(Temp4short, ADC_TEMPOH4A_ID) + CONVERT_KTODEGC;
+
+      CrIaPaste(ADC_TEMPOH1A_ID, &Temp1);
+      CrIaPaste(ADC_TEMPOH2A_ID, &Temp2);
+      CrIaPaste(ADC_TEMPOH3A_ID, &Temp3);
+      CrIaPaste(ADC_TEMPOH4A_ID, &Temp4);
+#else
+      /* NOTE: A=FRT */
+      CrIaCopy(ADC_TEMPOH1A_ID, &Temp1);
+      CrIaCopy(ADC_TEMPOH2A_ID, &Temp2);
+      CrIaCopy(ADC_TEMPOH3A_ID, &Temp3);
+      CrIaCopy(ADC_TEMPOH4A_ID, &Temp4);
+#endif
+
+      Temp[0] = Temp1;
+      Temp[1] = Temp2;
+      Temp[2] = Temp3;
+      Temp[3] = Temp4;
+    }
+
+  sort4float (Temp);
+
+  /* Calculate the average of the two middle temperature values */
+  median_Temp_EngVal = (Temp[1] + Temp[2])*0.5;
+
+  if (prDesc == prDescTtc1aft)
+    {
+      CrIaPaste(TTC1AVTEMPAFT_ID, &median_Temp_EngVal);
+    }
+  if (prDesc == prDescTtc1front)
+    {
+      CrIaPaste(TTC1AVTEMPFRT_ID, &median_Temp_EngVal);
+    }
+
+  return;
+}
+
+/** Action for node N4. */
+void CrIaTTC1SwitchOff(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Ask IBSW to switch off the heaters */
+
+  /*
+  DEBUGP("TTC1: heaters off\n");
+  */
+
+  if (prDesc == prDescTtc1aft)
+    {
+      /* switch off aft heaters */
+      CrIaHeaterOff(HEATER_3); 
+      CrIaHeaterOff(HEATER_4);
+#ifdef PC_TARGET
+{
+      float Temp1, Temp2, Temp3, Temp4;
+      short Temp1short, Temp2short, Temp3short, Temp4short;
+
+      CrIaCopy(ADC_TEMPOH1B_RAW_ID, &Temp1short);
+      CrIaCopy(ADC_TEMPOH2B_RAW_ID, &Temp2short);
+      CrIaCopy(ADC_TEMPOH3B_RAW_ID, &Temp3short);
+      CrIaCopy(ADC_TEMPOH4B_RAW_ID, &Temp4short);
+
+      Temp1short -= 3;
+      Temp2short -= 3;
+      Temp3short -= 3;
+      Temp4short -= 3;
+
+      CrIaPaste(ADC_TEMPOH1B_RAW_ID, &Temp1short);
+      CrIaPaste(ADC_TEMPOH2B_RAW_ID, &Temp2short);
+      CrIaPaste(ADC_TEMPOH3B_RAW_ID, &Temp3short);
+      CrIaPaste(ADC_TEMPOH4B_RAW_ID, &Temp4short);
+
+      /* Convert raw value to engineering value */
+      Temp1 = convertToTempEngVal(Temp1short, ADC_TEMPOH1B_ID) + CONVERT_KTODEGC;
+      Temp2 = convertToTempEngVal(Temp2short, ADC_TEMPOH2B_ID) + CONVERT_KTODEGC;
+      Temp3 = convertToTempEngVal(Temp3short, ADC_TEMPOH3B_ID) + CONVERT_KTODEGC;
+      Temp4 = convertToTempEngVal(Temp4short, ADC_TEMPOH4B_ID) + CONVERT_KTODEGC;
+
+      CrIaPaste(ADC_TEMPOH1B_ID, &Temp1);
+      CrIaPaste(ADC_TEMPOH2B_ID, &Temp2);
+      CrIaPaste(ADC_TEMPOH3B_ID, &Temp3);
+      CrIaPaste(ADC_TEMPOH4B_ID, &Temp4);
+}
+#endif /* PC_TARGET */
+    }
+
+  if (prDesc == prDescTtc1front)
+    {
+      /* switch off front heaters */
+      CrIaHeaterOff(HEATER_1);
+      CrIaHeaterOff(HEATER_2);
+#ifdef PC_TARGET
+{
+      float Temp1, Temp2, Temp3, Temp4;
+      short Temp1short, Temp2short, Temp3short, Temp4short;
+
+      CrIaCopy(ADC_TEMPOH1A_RAW_ID, &Temp1short);
+      CrIaCopy(ADC_TEMPOH2A_RAW_ID, &Temp2short);
+      CrIaCopy(ADC_TEMPOH3A_RAW_ID, &Temp3short);
+      CrIaCopy(ADC_TEMPOH4A_RAW_ID, &Temp4short);
+
+      Temp1short -= 3;
+      Temp2short -= 3;
+      Temp3short -= 3;
+      Temp4short -= 3;
+
+      CrIaPaste(ADC_TEMPOH1A_RAW_ID, &Temp1short);
+      CrIaPaste(ADC_TEMPOH2A_RAW_ID, &Temp2short);
+      CrIaPaste(ADC_TEMPOH3A_RAW_ID, &Temp3short);
+      CrIaPaste(ADC_TEMPOH4A_RAW_ID, &Temp4short);
+
+      /* Convert raw value to engineering value */
+      Temp1 = convertToTempEngVal(Temp1short, ADC_TEMPOH1A_ID) + CONVERT_KTODEGC;
+      Temp2 = convertToTempEngVal(Temp2short, ADC_TEMPOH2A_ID) + CONVERT_KTODEGC;
+      Temp3 = convertToTempEngVal(Temp3short, ADC_TEMPOH3A_ID) + CONVERT_KTODEGC;
+      Temp4 = convertToTempEngVal(Temp4short, ADC_TEMPOH4A_ID) + CONVERT_KTODEGC;
+
+      CrIaPaste(ADC_TEMPOH1A_ID, &Temp1);
+      CrIaPaste(ADC_TEMPOH2A_ID, &Temp2);
+      CrIaPaste(ADC_TEMPOH3A_ID, &Temp3);
+      CrIaPaste(ADC_TEMPOH4A_ID, &Temp4);
+}
+#endif /* PC_TARGET */
+    }
+
+  return;
+}
+
+/** Action for node N3. */
+void CrIaTTC1SwitchOn(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Ask IBSW to switch on the heaters */
+
+  /*
+  DEBUGP("TTC1: heaters on\n");
+  */
+
+  if (prDesc == prDescTtc1aft)
+    {
+      /* switch on aft heaters */
+      CrIaHeaterOn(HEATER_3);
+      CrIaHeaterOn(HEATER_4);
+#ifdef PC_TARGET
+{
+      float Temp1, Temp2, Temp3, Temp4;
+      short Temp1short, Temp2short, Temp3short, Temp4short;
+
+      CrIaCopy(ADC_TEMPOH1B_RAW_ID, &Temp1short);
+      CrIaCopy(ADC_TEMPOH2B_RAW_ID, &Temp2short);
+      CrIaCopy(ADC_TEMPOH3B_RAW_ID, &Temp3short);
+      CrIaCopy(ADC_TEMPOH4B_RAW_ID, &Temp4short);
+
+      Temp1short += 3;
+      Temp2short += 3;
+      Temp3short += 3;
+      Temp4short += 3;
+
+      CrIaPaste(ADC_TEMPOH1B_RAW_ID, &Temp1short);
+      CrIaPaste(ADC_TEMPOH2B_RAW_ID, &Temp2short);
+      CrIaPaste(ADC_TEMPOH3B_RAW_ID, &Temp3short);
+      CrIaPaste(ADC_TEMPOH4B_RAW_ID, &Temp4short);
+
+      /* Convert raw value to engineering value */
+      Temp1 = convertToTempEngVal(Temp1short, ADC_TEMPOH1B_ID) + CONVERT_KTODEGC;
+      Temp2 = convertToTempEngVal(Temp2short, ADC_TEMPOH2B_ID) + CONVERT_KTODEGC;
+      Temp3 = convertToTempEngVal(Temp3short, ADC_TEMPOH3B_ID) + CONVERT_KTODEGC;
+      Temp4 = convertToTempEngVal(Temp4short, ADC_TEMPOH4B_ID) + CONVERT_KTODEGC;
+
+      CrIaPaste(ADC_TEMPOH1B_ID, &Temp1);
+      CrIaPaste(ADC_TEMPOH2B_ID, &Temp2);
+      CrIaPaste(ADC_TEMPOH3B_ID, &Temp3);
+      CrIaPaste(ADC_TEMPOH4B_ID, &Temp4);
+}
+#endif /* PC_TARGET */
+    }
+
+  if (prDesc == prDescTtc1front)
+    {
+      /* switch on front heaters */
+      CrIaHeaterOn(HEATER_1); 
+      CrIaHeaterOn(HEATER_2);
+#ifdef PC_TARGET
+{
+      float Temp1, Temp2, Temp3, Temp4;
+      short Temp1short, Temp2short, Temp3short, Temp4short;
+
+      CrIaCopy(ADC_TEMPOH1A_RAW_ID, &Temp1short);
+      CrIaCopy(ADC_TEMPOH2A_RAW_ID, &Temp2short);
+      CrIaCopy(ADC_TEMPOH3A_RAW_ID, &Temp3short);
+      CrIaCopy(ADC_TEMPOH4A_RAW_ID, &Temp4short);
+
+      Temp1short += 3;
+      Temp2short += 3;
+      Temp3short += 3;
+      Temp4short += 3;
+
+      CrIaPaste(ADC_TEMPOH1A_RAW_ID, &Temp1short);
+      CrIaPaste(ADC_TEMPOH2A_RAW_ID, &Temp2short);
+      CrIaPaste(ADC_TEMPOH3A_RAW_ID, &Temp3short);
+      CrIaPaste(ADC_TEMPOH4A_RAW_ID, &Temp4short);
+
+      /* Convert raw value to engineering value */
+      Temp1 = convertToTempEngVal(Temp1short, ADC_TEMPOH1A_ID) + CONVERT_KTODEGC;
+      Temp2 = convertToTempEngVal(Temp2short, ADC_TEMPOH2A_ID) + CONVERT_KTODEGC;
+      Temp3 = convertToTempEngVal(Temp3short, ADC_TEMPOH3A_ID) + CONVERT_KTODEGC;
+      Temp4 = convertToTempEngVal(Temp4short, ADC_TEMPOH4A_ID) + CONVERT_KTODEGC;
+
+      CrIaPaste(ADC_TEMPOH1A_ID, &Temp1);
+      CrIaPaste(ADC_TEMPOH2A_ID, &Temp2);
+      CrIaPaste(ADC_TEMPOH3A_ID, &Temp3);
+      CrIaPaste(ADC_TEMPOH4A_ID, &Temp4);
+}
+#endif /* PC_TARGET */
+    }
+
+  return;
+}
+
+/** Guard on the Control Flow from DECISION1 to N3. */
+FwPrBool_t CrIaTTC1IsTempTooLow(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  float lowerLevel_Temp = -100.0f; /* choose a safe (in case of doubt switch off) init value to calm CLANG */
+
+  /* T < TTC1_LL */
+
+  if (prDesc == prDescTtc1aft)
+    {
+      CrIaCopy(TTC1_LL_AFT_ID, &lowerLevel_Temp);
+    }
+
+  if (prDesc == prDescTtc1front)
+    {
+      CrIaCopy(TTC1_LL_FRT_ID, &lowerLevel_Temp);
+    }
+
+  if (median_Temp_EngVal < lowerLevel_Temp)
+    {
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/** Guard on the Control Flow from DECISION1 to N4. */
+FwPrBool_t CrIaTTC1IsTempTooHigh(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  float upperLevel_Temp = -100.0f; /* choose a safe (in case of doubt switch off) init value to calm CLANG */
+
+  /* T > TTC1_UL */
+
+  if (prDesc == prDescTtc1aft)
+    {
+      CrIaCopy(TTC1_UL_AFT_ID, &upperLevel_Temp);
+    }
+
+  if (prDesc == prDescTtc1front)
+    {
+      CrIaCopy(TTC1_UL_FRT_ID, &upperLevel_Temp);
+    }
+
+  if (median_Temp_EngVal > upperLevel_Temp)
+    {
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaTTC1Init.txt b/CrIa/src/CrIaPrSm/CrIaTTC1Init.txt
new file mode 100644
index 0000000..a444e1d
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaTTC1Init.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaTTC1Create(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaTTC1 is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaTTC1 is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaTTC2Create.c b/CrIa/src/CrIaPrSm/CrIaTTC2Create.c
new file mode 100644
index 0000000..a2be7df
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaTTC2Create.c
@@ -0,0 +1,91 @@
+/**
+ * @file CrIaTTC2Create.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaTTC2 function definitions */
+#include "CrIaTTC2Create.h"
+
+/**
+ * Guard on the Control Flow from DECISION1 to Final Node.
+ *  Else
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code31109(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/**
+ * Guard on the Control Flow from DECISION2 to DECISION3.
+ *  Else
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code98960(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/**
+ * Guard on the Control Flow from DECISION3 to Final Node.
+ *  ! Flag_1
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code9404(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaTTC2Create(void* prData)
+{
+  const FwPrCounterU2_t DECISION1 = 1;		/* The identifier of decision node DECISION1 in procedure CrIaTTC2 */
+  const FwPrCounterU2_t N_OUT_OF_DECISION1 = 2;	/* The number of control flows out of decision node DECISION1 in procedure CrIaTTC2 */
+  const FwPrCounterU2_t DECISION2 = 2;		/* The identifier of decision node DECISION2 in procedure CrIaTTC2 */
+  const FwPrCounterU2_t N_OUT_OF_DECISION2 = 2;	/* The number of control flows out of decision node DECISION2 in procedure CrIaTTC2 */
+  const FwPrCounterU2_t DECISION3 = 3;		/* The identifier of decision node DECISION3 in procedure CrIaTTC2 */
+  const FwPrCounterU2_t N_OUT_OF_DECISION3 = 2;	/* The number of control flows out of decision node DECISION3 in procedure CrIaTTC2 */
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+                        4,	/* N_ANODES - The number of action nodes */
+                        3,	/* N_DNODES - The number of decision nodes */
+                        11,	/* N_FLOWS - The number of control flows */
+                        4,	/* N_ACTIONS - The number of actions */
+                        6	/* N_GUARDS - The number of guards */
+                      );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddActionNode(prDesc, CrIaTTC2_N1, &CrIaTTC2ComputeTemp);
+  FwPrAddDecisionNode(prDesc, DECISION1, N_OUT_OF_DECISION1);
+  FwPrAddActionNode(prDesc, CrIaTTC2_N4, &CrIaTTC2SwitchOn);
+  FwPrAddActionNode(prDesc, CrIaTTC2_N3, &CrIaTTC2SwitchOff);
+  FwPrAddDecisionNode(prDesc, DECISION2, N_OUT_OF_DECISION2);
+  FwPrAddActionNode(prDesc, CrIaTTC2_N2, &CrIaTTC2ComputeOnTime);
+  FwPrAddDecisionNode(prDesc, DECISION3, N_OUT_OF_DECISION3);
+  FwPrAddFlowIniToDec(prDesc, DECISION2, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaTTC2_N1, CrIaTTC2_N2, NULL);
+  FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaTTC2_N4, &CrIaTTC2IsOnTimeGreaterThanZero);
+  FwPrAddFlowDecToFin(prDesc, DECISION1, &code31109);
+  FwPrAddFlowActToFin(prDesc, CrIaTTC2_N4, NULL);
+  FwPrAddFlowActToFin(prDesc, CrIaTTC2_N3, NULL);
+  FwPrAddFlowDecToAct(prDesc, DECISION2, CrIaTTC2_N1, &CrIaTTC2IsFirstCycle);
+  FwPrAddFlowDecToDec(prDesc, DECISION2, DECISION3, &code98960);
+  FwPrAddFlowActToDec(prDesc, CrIaTTC2_N2, DECISION1, NULL);
+  FwPrAddFlowDecToAct(prDesc, DECISION3, CrIaTTC2_N3, &CrIaTTC2Flag1);
+  FwPrAddFlowDecToFin(prDesc, DECISION3, &code9404);
+
+  return prDesc;
+}
diff --git a/CrIa/src/CrIaPrSm/CrIaTTC2Create.h b/CrIa/src/CrIaPrSm/CrIaTTC2Create.h
new file mode 100644
index 0000000..54feb13
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaTTC2Create.h
@@ -0,0 +1,105 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaTTC2 procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ * @image html CrIaTTC2.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaTTC2Create_H_
+#define CrIaTTC2Create_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaTTC2_N1 1		/* The identifier of action node N1 in procedure CrIaTTC2 */
+#define CrIaTTC2_N2 2		/* The identifier of action node N2 in procedure CrIaTTC2 */
+#define CrIaTTC2_N3 3		/* The identifier of action node N3 in procedure CrIaTTC2 */
+#define CrIaTTC2_N4 4		/* The identifier of action node N4 in procedure CrIaTTC2 */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaTTC2Create(void* prData);
+
+/**
+ * Action for node N1.
+ * <pre>
+ * T = average of two middle
+ * values of thermistor readings
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaTTC2ComputeTemp(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N4.
+ * <pre>
+ * Ask IBSW to
+ * switch on the heaters
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaTTC2SwitchOn(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N3.
+ * <pre>
+ * Ask IBSW to
+ * switch off the heaters 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaTTC2SwitchOff(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N2.
+ * Compute onTime
+ * @param smDesc the procedure descriptor
+ */
+void CrIaTTC2ComputeOnTime(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION1 to N4.
+ *  onTime > 0
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaTTC2IsOnTimeGreaterThanZero(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION2 to N1.
+ * <pre>
+ *  Current cycle is first cycle in an
+ * acquisition cycle 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaTTC2IsFirstCycle(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION3 to N3.
+ *  Flag_1 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaTTC2Flag1(FwPrDesc_t prDesc);
+
+#endif /* CrIaTTC2Create_H_ */
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaTTC2Func.c b/CrIa/src/CrIaPrSm/CrIaTTC2Func.c
new file mode 100644
index 0000000..1e0753c
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaTTC2Func.c
@@ -0,0 +1,481 @@
+/**
+ * @file CrIaTTC2Func.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Feb 11 2016 22:56:45
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+#include "FwProfile/FwPrCore.h"
+
+/** CrIaTTC2 function definitions */
+#include "CrIaTTC2Create.h"
+
+/* DataPool */
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <CrIaIasw.h>
+
+#include <IfswUtilities.h> /* for sort4float() */
+#include <IfswConversions.h> /* for convertToTempEngVal() */
+#include <IfswDebug.h>
+
+#if (__sparc__)
+#include <iwf_fpga.h>
+#endif
+
+/** CrIaTTC2 global variables for aft temperature */
+float prevDelTemp_Aft, prevIntTemp_Aft, onTime_Aft, curOnTime_Aft;
+/** CrIaTTC2 global variables for front temperature */
+float prevDelTemp_Frt, prevIntTemp_Frt, onTime_Frt, curOnTime_Frt;
+#if PC_TARGET
+CrFwBool_t heater_Aft, heater_Frt;
+#endif /* PC_TARGET */
+
+float median_Temp_Aft_EngVal;
+float median_Temp_Frt_EngVal;
+
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N1. */
+void CrIaTTC2ComputeTemp(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  float Temp[4];
+  float Temp1=0, Temp2=0, Temp3=0, Temp4=0; /* initialize variables with default values */
+#ifdef PC_TARGET
+  short Temp1short=0, Temp2short=0, Temp3short=0, Temp4short=0; /* initialize variables with default values */
+#endif
+
+  /* T = average of two middle values of thermistor readings */
+  /* Four temperature measurements are available, the middle two are taken (majority voted) and then averaged */
+
+
+  /***********************************/
+  /* TTC2 aft thermistors/heaters    */
+  /***********************************/
+  if (prDesc == prDescTtc2aft)
+    {
+      /* Get temperature measurements from data pool */
+#ifdef PC_TARGET      
+      /* B=AFT */
+      CrIaCopy(ADC_TEMPOH1B_RAW_ID, &Temp1short);
+      CrIaCopy(ADC_TEMPOH2B_RAW_ID, &Temp2short);
+      CrIaCopy(ADC_TEMPOH3B_RAW_ID, &Temp3short);
+      CrIaCopy(ADC_TEMPOH4B_RAW_ID, &Temp4short);
+
+      /* convert raw value to engineering value */
+      Temp1 = convertToTempEngVal(Temp1short, ADC_TEMPOH1B_ID) + CONVERT_KTODEGC;
+      Temp2 = convertToTempEngVal(Temp2short, ADC_TEMPOH2B_ID) + CONVERT_KTODEGC;
+      Temp3 = convertToTempEngVal(Temp3short, ADC_TEMPOH3B_ID) + CONVERT_KTODEGC;
+      Temp4 = convertToTempEngVal(Temp4short, ADC_TEMPOH4B_ID) + CONVERT_KTODEGC;
+
+      CrIaPaste(ADC_TEMPOH1B_ID, &Temp1);
+      CrIaPaste(ADC_TEMPOH2B_ID, &Temp2);
+      CrIaPaste(ADC_TEMPOH3B_ID, &Temp3);
+      CrIaPaste(ADC_TEMPOH4B_ID, &Temp4);
+#else
+      /* B=AFT */
+      CrIaCopy(ADC_TEMPOH1B_ID, &Temp1);
+      CrIaCopy(ADC_TEMPOH2B_ID, &Temp2);
+      CrIaCopy(ADC_TEMPOH3B_ID, &Temp3);
+      CrIaCopy(ADC_TEMPOH4B_ID, &Temp4);
+#endif
+
+      Temp[0] = Temp1;
+      Temp[1] = Temp2;
+      Temp[2] = Temp3;
+      Temp[3] = Temp4;
+
+      sort4float (Temp);
+
+      /* Calculate the average of the two middle temperature values */
+      median_Temp_Aft_EngVal = (Temp[1] + Temp[2])*0.5;
+
+    }
+
+  /***********************************/
+  /* TTC2 front thermistors/heaters  */
+  /***********************************/
+  if (prDesc == prDescTtc2front)
+    {
+      /* Get temperature measurements from data pool */
+#ifdef PC_TARGET
+      /* A=FRT */
+      CrIaCopy(ADC_TEMPOH1A_RAW_ID, &Temp1short);
+      CrIaCopy(ADC_TEMPOH2A_RAW_ID, &Temp2short);
+      CrIaCopy(ADC_TEMPOH3A_RAW_ID, &Temp3short);
+      CrIaCopy(ADC_TEMPOH4A_RAW_ID, &Temp4short);
+
+      /* convert raw value to engineering value */
+      Temp1 = convertToTempEngVal(Temp1short, ADC_TEMPOH1A_ID) + CONVERT_KTODEGC;
+      Temp2 = convertToTempEngVal(Temp2short, ADC_TEMPOH2A_ID) + CONVERT_KTODEGC;
+      Temp3 = convertToTempEngVal(Temp3short, ADC_TEMPOH3A_ID) + CONVERT_KTODEGC;
+      Temp4 = convertToTempEngVal(Temp4short, ADC_TEMPOH4A_ID) + CONVERT_KTODEGC;
+
+      CrIaPaste(ADC_TEMPOH1A_ID, &Temp1);
+      CrIaPaste(ADC_TEMPOH2A_ID, &Temp2);
+      CrIaPaste(ADC_TEMPOH3A_ID, &Temp3);
+      CrIaPaste(ADC_TEMPOH4A_ID, &Temp4);
+#else
+      /* A=FRT */
+      CrIaCopy(ADC_TEMPOH1A_ID, &Temp1);
+      CrIaCopy(ADC_TEMPOH2A_ID, &Temp2);
+      CrIaCopy(ADC_TEMPOH3A_ID, &Temp3);
+      CrIaCopy(ADC_TEMPOH4A_ID, &Temp4);
+#endif
+
+      Temp[0] = Temp1;
+      Temp[1] = Temp2;
+      Temp[2] = Temp3;
+      Temp[3] = Temp4;
+
+      sort4float (Temp);
+
+      /* Calculate the average of the two middle temperature values */
+      median_Temp_Frt_EngVal = (Temp[1] + Temp[2])*0.5;
+
+    }
+
+  return;
+}
+
+/** Action for node N2. */
+void CrIaTTC2ComputeOnTime(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  float coeffTtc2P = 1.0f, coeffTtc2D = 1.0f, coeffTtc2I = 1.0f;
+  int ttc2ExecPer;
+  float curDelTemp, curIntTemp, refTemp, offset_Aft, offset_Frt;
+
+  /* Compute onTime; onTime is computed by a PID controller */
+
+  /* Get PID coefficients from data pool */
+  if (prDesc == prDescTtc2aft)
+    {
+      CrIaCopy(TTC2_PA_ID, &coeffTtc2P);
+      CrIaCopy(TTC2_DA_ID, &coeffTtc2D);
+      CrIaCopy(TTC2_IA_ID, &coeffTtc2I);
+    }
+  if (prDesc == prDescTtc2front)
+    {
+      CrIaCopy(TTC2_PF_ID, &coeffTtc2P);
+      CrIaCopy(TTC2_DF_ID, &coeffTtc2D);
+      CrIaCopy(TTC2_IF_ID, &coeffTtc2I);
+    }
+
+  /* Get TTC2_EXEC_PER from data pool */
+  CrIaCopy(TTC2_EXEC_PER_ID, &ttc2ExecPer);
+
+  /* Get TTC2_REF_TEMP from data pool */
+  CrIaCopy(TTC2_REF_TEMP_ID, &refTemp);
+
+  if (prDesc == prDescTtc2aft)
+    {
+      curOnTime_Aft = 0.0f; /* reset current onTime, used in Guard out of DECISION3 (Mantis 2108) */
+
+      CrIaCopy(TTC2_OFFSETA_ID, &offset_Aft);
+
+      curDelTemp = refTemp - median_Temp_Aft_EngVal;
+
+      curIntTemp = prevIntTemp_Aft + curDelTemp * ttc2ExecPer * 0.125f;
+
+      onTime_Aft = offset_Aft + coeffTtc2P * curDelTemp + coeffTtc2D * (curDelTemp - prevDelTemp_Aft) / (ttc2ExecPer * 0.125f) + coeffTtc2I * curIntTemp;
+
+      prevIntTemp_Aft = curIntTemp;
+      prevDelTemp_Aft = curDelTemp;
+
+      /* copy new calculated values of onTime and intTemp to data pool */
+      CrIaPaste(ONTIMEAFT_ID, &onTime_Aft);
+      CrIaPaste(INTTIMEAFT_ID, &curIntTemp);
+    }
+
+  if (prDesc == prDescTtc2front)
+    {
+      curOnTime_Frt = 0.0f; /* reset current onTime, used in Guard out of DECISION3 (Mantis 2108) */
+
+      CrIaCopy(TTC2_OFFSETF_ID, &offset_Frt);
+
+      curDelTemp = refTemp - median_Temp_Frt_EngVal;
+
+      curIntTemp = prevIntTemp_Frt + curDelTemp * ttc2ExecPer * 0.125f;
+
+      onTime_Frt = offset_Frt + coeffTtc2P * curDelTemp + coeffTtc2D * (curDelTemp - prevDelTemp_Frt) / (ttc2ExecPer * 0.125f) + coeffTtc2I * curIntTemp;
+
+      prevIntTemp_Frt = curIntTemp;
+      prevDelTemp_Frt = curDelTemp;
+
+      /* copy new calculated values of onTime and intTemp to data pool */
+      CrIaPaste(ONTIMEFRONT_ID, &onTime_Frt);
+      CrIaPaste(INTTIMEFRONT_ID, &curIntTemp);
+
+    }
+
+  return;
+}
+
+/** Action for node N3. */
+void CrIaTTC2SwitchOff(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Ask IBSW to switch off the heaters */
+
+  if (prDesc == prDescTtc2aft)
+    {
+#ifdef PC_TARGET
+      heater_Aft = 0;
+#else
+      /* switch off aft heaters */
+      CrIaHeaterOff(HEATER_3);
+      CrIaHeaterOff(HEATER_4);
+#endif /* PC_TARGET */
+    }
+
+  if (prDesc == prDescTtc2front)
+    {
+#ifdef PC_TARGET
+      heater_Frt = 0;
+#else
+      /* switch off front heaters */
+      CrIaHeaterOff(HEATER_1);
+      CrIaHeaterOff(HEATER_2);
+#endif /* PC_TARGET */
+    }
+
+  return;
+}
+
+/** Action for node N4. */
+void CrIaTTC2SwitchOn(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* Ask IBSW to switch on the heaters */
+
+  if (prDesc == prDescTtc2aft)
+    {
+#ifdef PC_TARGET
+      heater_Aft = 1;
+#else
+      /* switch on aft heaters */
+      CrIaHeaterOn(HEATER_3);
+      CrIaHeaterOn(HEATER_4);
+#endif /* PC_TARGET */
+    }
+
+  if (prDesc == prDescTtc2front)
+    {
+#ifdef PC_TARGET
+      heater_Frt = 1;
+#else
+      /* switch on front heaters */
+      CrIaHeaterOn(HEATER_1); 
+      CrIaHeaterOn(HEATER_2);
+#endif /* PC_TARGET */
+    }
+
+  return;
+}
+
+/**********
+ * GUARDS *
+ **********/
+
+/** Guard on the Control Flow from DECISION2 to N1. */
+FwPrBool_t CrIaTTC2IsFirstCycle(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* [ Current cycle is first cycle in an acquisition cycle ] */
+
+  if (firstCycleAcqCycTtc2)
+    {
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/** Guard on the Control Flow from DECISION1 to N4. */
+FwPrBool_t CrIaTTC2IsOnTimeGreaterThanZero(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  float onTime = 0.0f;
+
+  /* [ onTime > 0 ] */
+
+  /* get onTime */
+  if (prDesc == prDescTtc2aft)
+    {
+      onTime = onTime_Aft;
+    }
+  if (prDesc == prDescTtc2front)
+    {
+      onTime = onTime_Frt;
+    }
+
+  if (onTime > 0.0f)
+    {
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/** Guard on the Control Flow from DECISION3 to N3. */
+FwPrBool_t CrIaTTC2Flag1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  /* [ Flag_1 ] */
+  /* Flag_1: (the heaters are currently on) && (the requested onTime terminates in the current cycle) */
+
+  /* check if heaters are on */
+#ifdef PC_TARGET
+  {
+    float Temp1=0.0f, Temp2=0.0f, Temp3=0.0f, Temp4=0.0f;
+    short Temp1short, Temp2short, Temp3short, Temp4short;
+    float Temp[4];
+
+    (void) Temp;
+    
+    if (prDesc == prDescTtc2aft)
+      {
+        CrIaCopy(ADC_TEMPOH1B_RAW_ID, &Temp1short);
+        CrIaCopy(ADC_TEMPOH2B_RAW_ID, &Temp2short);
+        CrIaCopy(ADC_TEMPOH3B_RAW_ID, &Temp3short);
+        CrIaCopy(ADC_TEMPOH4B_RAW_ID, &Temp4short);
+
+        if (heater_Aft == 0) 
+          {
+            Temp1short -= 3;
+            Temp2short -= 3;
+            Temp3short -= 3;
+            Temp4short -= 3;
+          }
+        else
+          {
+            Temp1short += 3;
+            Temp2short += 3;
+            Temp3short += 3;
+            Temp4short += 3;
+          }
+
+        CrIaPaste(ADC_TEMPOH1B_RAW_ID, &Temp1short);
+        CrIaPaste(ADC_TEMPOH2B_RAW_ID, &Temp2short);
+        CrIaPaste(ADC_TEMPOH3B_RAW_ID, &Temp3short);
+        CrIaPaste(ADC_TEMPOH4B_RAW_ID, &Temp4short);   
+
+        /* convert raw value to engineering value */
+        Temp1 = convertToTempEngVal(Temp1short, ADC_TEMPOH1B_ID) + CONVERT_KTODEGC;
+        Temp2 = convertToTempEngVal(Temp2short, ADC_TEMPOH2B_ID) + CONVERT_KTODEGC;
+        Temp3 = convertToTempEngVal(Temp3short, ADC_TEMPOH3B_ID) + CONVERT_KTODEGC;
+        Temp4 = convertToTempEngVal(Temp4short, ADC_TEMPOH4B_ID) + CONVERT_KTODEGC;
+      }
+
+    if (prDesc == prDescTtc2front)
+      {
+        CrIaCopy(ADC_TEMPOH1A_RAW_ID, &Temp1short);
+        CrIaCopy(ADC_TEMPOH2A_RAW_ID, &Temp2short);
+        CrIaCopy(ADC_TEMPOH3A_RAW_ID, &Temp3short);
+        CrIaCopy(ADC_TEMPOH4A_RAW_ID, &Temp4short);
+
+        if (heater_Frt == 0) 
+          {
+            Temp1short -= 3;
+            Temp2short -= 3;
+            Temp3short -= 3;
+            Temp4short -= 3;
+          }
+        else
+          {
+            Temp1short += 3;
+            Temp2short += 3;
+            Temp3short += 3;
+            Temp4short += 3;
+          }
+
+        CrIaPaste(ADC_TEMPOH1A_RAW_ID, &Temp1short);
+        CrIaPaste(ADC_TEMPOH2A_RAW_ID, &Temp2short);
+        CrIaPaste(ADC_TEMPOH3A_RAW_ID, &Temp3short);
+        CrIaPaste(ADC_TEMPOH4A_RAW_ID, &Temp4short);
+
+        /* convert raw value to engineering value */
+        Temp1 = convertToTempEngVal(Temp1short, ADC_TEMPOH1A_ID) + CONVERT_KTODEGC;
+        Temp2 = convertToTempEngVal(Temp2short, ADC_TEMPOH2A_ID) + CONVERT_KTODEGC;
+        Temp3 = convertToTempEngVal(Temp3short, ADC_TEMPOH3A_ID) + CONVERT_KTODEGC;
+        Temp4 = convertToTempEngVal(Temp4short, ADC_TEMPOH4A_ID) + CONVERT_KTODEGC;
+      }
+
+      Temp[0] = Temp1;
+      Temp[1] = Temp2;
+      Temp[2] = Temp3;
+      Temp[3] = Temp4;
+
+    if (prDesc == prDescTtc2aft)
+      {
+        CrIaPaste(ADC_TEMPOH1B_ID, &Temp1);
+        CrIaPaste(ADC_TEMPOH2B_ID, &Temp2);
+        CrIaPaste(ADC_TEMPOH3B_ID, &Temp3);
+        CrIaPaste(ADC_TEMPOH4B_ID, &Temp4);
+      }
+
+    if (prDesc == prDescTtc2front)
+      {
+        CrIaPaste(ADC_TEMPOH1A_ID, &Temp1);
+        CrIaPaste(ADC_TEMPOH2A_ID, &Temp2);
+        CrIaPaste(ADC_TEMPOH3A_ID, &Temp3);
+        CrIaPaste(ADC_TEMPOH4A_ID, &Temp4);
+      }
+
+  }
+#endif /* PC_TARGET */
+
+
+  if (prDesc == prDescTtc2aft)
+    {
+#ifdef PC_TARGET
+      if (heater_Aft)
+#else
+      if (CrIaHeaterStatus(HEATER_3) && CrIaHeaterStatus(HEATER_4))
+#endif /* PC_TARGET */
+        {
+          if (curOnTime_Aft >= onTime_Aft)
+            {
+              return 1;
+            }
+          else
+            {
+              curOnTime_Aft += 0.125f; /* add one cycle to current onTime */
+              return 0;
+            }
+        }
+    }
+
+  if (prDesc == prDescTtc2front)
+    {
+#ifdef PC_TARGET
+      if (heater_Frt == 1)
+#else
+      if (CrIaHeaterStatus(HEATER_1) && CrIaHeaterStatus(HEATER_2))
+#endif /* PC_TARGET */
+        {
+          if (curOnTime_Frt >= onTime_Frt)
+            {
+              return 1;
+            }
+          else
+            {
+              curOnTime_Frt += 0.125f; /* add one cycle to current onTime */
+              return 0;
+            }
+        }
+    }
+
+  return 0;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaTTC2Init.txt b/CrIa/src/CrIaPrSm/CrIaTTC2Init.txt
new file mode 100644
index 0000000..8851f51
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaTTC2Init.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaTTC2Create(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaTTC2 is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaTTC2 is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/CrIaTransferFbfToGroundCreate.c b/CrIa/src/CrIaPrSm/CrIaTransferFbfToGroundCreate.c
new file mode 100644
index 0000000..2dae2bb
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaTransferFbfToGroundCreate.c
@@ -0,0 +1,59 @@
+/**
+ * @file CrIaTransferFbfToGroundCreate.c
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Jun 3 2016 19:48:4
+ */
+
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrDCreate.h"
+#include "FwProfile/FwPrConfig.h"
+
+/** CrIaTransferFbfToGround function definitions */
+#include "CrIaTransferFbfToGroundCreate.h"
+
+/**
+ * Guard on the Control Flow from DECISION1 to Final Node.
+ *  Else
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+static FwPrBool_t code3618(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t CrIaTransferFbfToGroundCreate(void* __attribute__((unused)) prData)
+{
+  const FwPrCounterU2_t DECISION1 = 1;		/* The identifier of decision node DECISION1 in procedure CrIaTransferFbfToGround */
+  const FwPrCounterU2_t N_OUT_OF_DECISION1 = 2;	/* The number of control flows out of decision node DECISION1 in procedure CrIaTransferFbfToGround */
+
+  /** Create the procedure */
+  FwPrDesc_t prDesc = FwPrCreate(
+                        4,	/* N_ANODES - The number of action nodes */
+                        1,	/* N_DNODES - The number of decision nodes */
+                        7,	/* N_FLOWS - The number of control flows */
+                        4,	/* N_ACTIONS - The number of actions */
+                        4	/* N_GUARDS - The number of guards */
+                      );
+
+  /** Configure the procedure */
+  FwPrSetData(prDesc, prData);
+  FwPrAddActionNode(prDesc, CrIaTransferFbfToGround_N2, &CrIaTransferFbfToGroundN2);
+  FwPrAddActionNode(prDesc, CrIaTransferFbfToGround_N3, &CrIaTransferFbfToGroundN3);
+  FwPrAddDecisionNode(prDesc, DECISION1, N_OUT_OF_DECISION1);
+  FwPrAddActionNode(prDesc, CrIaTransferFbfToGround_N1, &CrIaTransferFbfToGroundN1);
+  FwPrAddActionNode(prDesc, CrIaTransferFbfToGround_N4, &CrIaTransferFbfToGroundN4);
+  FwPrAddFlowIniToAct(prDesc, CrIaTransferFbfToGround_N1, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaTransferFbfToGround_N2, CrIaTransferFbfToGround_N3, &CrIaTransferFbfToGroundIsCompleted);
+  FwPrAddFlowActToDec(prDesc, CrIaTransferFbfToGround_N3, DECISION1, &CrIaTransferFbfToGroundIsFlag1);
+  FwPrAddFlowDecToAct(prDesc, DECISION1, CrIaTransferFbfToGround_N4, &CrIaTransferFbfToGroundIsContinue);
+  FwPrAddFlowDecToFin(prDesc, DECISION1, &code3618);
+  FwPrAddFlowActToAct(prDesc, CrIaTransferFbfToGround_N1, CrIaTransferFbfToGround_N2, NULL);
+  FwPrAddFlowActToAct(prDesc, CrIaTransferFbfToGround_N4, CrIaTransferFbfToGround_N2, NULL);
+
+  return prDesc;
+}
diff --git a/CrIa/src/CrIaPrSm/CrIaTransferFbfToGroundCreate.h b/CrIa/src/CrIaPrSm/CrIaTransferFbfToGroundCreate.h
new file mode 100644
index 0000000..ababb9c
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaTransferFbfToGroundCreate.h
@@ -0,0 +1,107 @@
+/**
+ * @file
+ * This header file declares the function to create one instance of the CrIaTransferFbfToGround procedure.
+ * The procedure is configured with a set of function pointers representing the non-default
+ * actions and guards of the procedure. Some of these functions may also be declared in
+ * this header file in accordance with the configuration of the procedure in the FW Profile
+ * Editor. In the latter case, the user has to provide an implementation for these functions
+ * in a user-supplied body file.
+ *
+ * This header file has been automatically generated by the FW Profile Editor.
+ * The procedure created by this file is shown in the figure below.
+ * @image html CrIaTransferFbfToGround.png
+ *
+ * @author FW Profile code generator version 4.63
+ * @date Created on: Jun 3 2016 19:48:4
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaTransferFbfToGroundCreate_H_
+#define CrIaTransferFbfToGroundCreate_H_
+
+/** FW Profile function definitions */
+#include "FwProfile/FwPrConstants.h"
+
+/** Action node identifiers */
+#define CrIaTransferFbfToGround_N1 1		/* The identifier of action node N1 in procedure CrIaTransferFbfToGround */
+#define CrIaTransferFbfToGround_N2 2		/* The identifier of action node N2 in procedure CrIaTransferFbfToGround */
+#define CrIaTransferFbfToGround_N3 3		/* The identifier of action node N3 in procedure CrIaTransferFbfToGround */
+#define CrIaTransferFbfToGround_N4 4		/* The identifier of action node N4 in procedure CrIaTransferFbfToGround */
+
+/**
+ * Create a new procedure descriptor.
+ * This interface creates the procedure descriptor dynamically.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (note that the default value of the pointer
+ * to the procedure data when the procedure is created is NULL).
+ * @return the pointer to the procedure descriptor
+ */
+FwPrDesc_t CrIaTransferFbfToGroundCreate(void* prData);
+
+/**
+ * Action for node N2.
+ * <pre>
+ * Start FBF Load Proc.
+ * to load FBF identified by
+ * FBF Counter into SDU4
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaTransferFbfToGroundN2(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N3.
+ * Start Down-Transfer of SDU4
+ * @param smDesc the procedure descriptor
+ */
+void CrIaTransferFbfToGroundN3(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N1.
+ * <pre>
+ * Set FBF Counter to identifier of
+ * first FBF to be transferred to ground
+ * </pre>
+ * @param smDesc the procedure descriptor
+ */
+void CrIaTransferFbfToGroundN1(FwPrDesc_t prDesc);
+
+/**
+ * Action for node N4.
+ * Increment FBF Counter
+ * @param smDesc the procedure descriptor
+ */
+void CrIaTransferFbfToGroundN4(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N2 to N3.
+ * <pre>
+ *  FBF Load Procedure
+ * has completed 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaTransferFbfToGroundIsCompleted(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from N3 to DECISION1.
+ *  Flag_1 
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaTransferFbfToGroundIsFlag1(FwPrDesc_t prDesc);
+
+/**
+ * Guard on the Control Flow from DECISION1 to N4.
+ * <pre>
+ *  Number of images
+ * transferred to ground
+ * is smaller than pNmbImages 
+ * </pre>
+ * @param smDesc the procedure descriptor
+ * @return 1 if the guard is fulfilled, otherwise 0.
+ */
+FwPrBool_t CrIaTransferFbfToGroundIsContinue(FwPrDesc_t prDesc);
+
+#endif /* CrIaTransferFbfToGroundCreate_H_ */
diff --git a/CrIa/src/CrIaPrSm/CrIaTransferFbfToGroundFunc.c b/CrIa/src/CrIaPrSm/CrIaTransferFbfToGroundFunc.c
new file mode 100644
index 0000000..427cb5b
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaTransferFbfToGroundFunc.c
@@ -0,0 +1,225 @@
+/**
+ * @file CrIaTransferFbfToGroundFunc.c
+ * @ingroup CrIaPrSci
+ * @authors FW Profile code generator version 4.63; Institute for Astrophysics, 2015-2016
+ * @date Created on: Jun 3 2016 19:48:4
+ *
+ * @brief Implementation of the Transfer FBF To Ground Procedure nodes and guards.
+ * Transfer a pre-defined number of Flash-Based Files to ground.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** FW Profile function definitions */
+#include <FwProfile/FwSmConfig.h>
+#include <FwProfile/FwPrConstants.h>
+#include <FwProfile/FwPrDCreate.h>
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwPrCore.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+#include <Services/General/CrIaConstants.h>
+
+/** CrIaTransferFbfToGround function definitions */
+#include <CrIaPrSm/CrIaTransferFbfToGroundCreate.h>
+
+#include <CrIaPrSm/CrIaSduCreate.h> /* for StartDownTransfer and CrIaSdu_INACTIVE */
+
+#include <CrIaIasw.h> /* for Event Reporting and extern sm and prDescriptors */
+#if (__sparc__)
+#include "wrap_malloc.h"
+#else
+#define FLASH_BLOCKSIZE 0
+#define SRAM1_FLASH_ADDR 0
+#endif
+
+#include <IfswDebug.h>
+
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
+/** Action for node N1. */
+void CrIaTransferFbfToGroundN1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char fbfId, fbfEnb;
+  unsigned char pNmbFbf;
+  unsigned char nmbFbfEnb;
+  int i;
+
+  /* Set FBF Counter to identifier of first FBF to be transfered to ground */
+
+  CrIaCopy(TRANSFBFTOGRND_PFBFINIT_ID, &fbfId);
+  CrIaPaste(FBFLOAD_PFBFID_ID, &fbfId);
+  nmbFbfEnb = 1; /* the initial FBF will be transmitted regardless of its enabled status */
+
+  /* Check how many enabled FBF are available */
+  CrIaCopy(TRANSFBFTOGRND_PNMBFBF_ID, &pNmbFbf);
+  
+  /* get number of enabled FBFs disregarding the initial one */
+  for (i = 0; i<250; i++) /* NOTE: could use GetDataPoolMult(FBF_ENB_ID) */
+    {
+      if (i != fbfId-1) /* do not count the initial one */
+	{	
+	  /* check if FBF is enabled */
+	  CrIaCopyArrayItem(FBF_ENB_ID, &fbfEnb, i);
+	  if (fbfEnb == 1)
+	    {
+	      nmbFbfEnb += 1;
+	    }
+	}
+    }
+  
+  if (nmbFbfEnb < pNmbFbf)
+    {
+      pNmbFbf = nmbFbfEnb;
+    }
+      
+  CrIaPaste(TRANSFBFTOGRND_PNMBFBF_ID, &pNmbFbf);
+
+  
+  return;
+}
+
+
+/** Action for node N2. */
+void CrIaTransferFbfToGroundN2(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned int fbfRamAddr;
+  unsigned char fbfNBlocks;
+
+  fbfRamAddr = SRAM1_FLASH_ADDR; /* this is SDU4 */
+  CrIaPaste(FBFLOAD_PFBFRAMADDR_ID, &fbfRamAddr);
+
+  /* Mantis 2129: this was: fbfNBlocks = FBF_SIZE */
+  CrIaCopy(TRANSFBFTOGRND_PFBFSIZE_ID, &fbfNBlocks);
+
+  CrIaPaste(FBFLOAD_PFBFNBLOCKS_ID, &fbfNBlocks);
+
+  /* Mantis 2239: modification to skip empty FBFs 
+     was reverted. We start the FBF Load Proc unconditionally */
+
+  /* Start FBF Load Proc. to load FBF identified by FBF Counter into SDU4 */
+  FwPrStart(prDescFbfLoad);
+
+  return;
+}
+
+
+/** Action for node N3. */
+void CrIaTransferFbfToGroundN3(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char pNmbFbf;  
+
+  /* due to Mantis 1421 / 1626 we no longer set the size here */ 
+
+  /* Start Down-Transfer of SDU4 */
+  
+  FwSmMakeTrans(smDescSdu4, StartDownTransfer);
+
+  /* reduce number of FBFs to be transfered, which will be checked by the Guard on the */
+  /* Control Flow from DECISION1 to N4. */
+  CrIaCopy(TRANSFBFTOGRND_PNMBFBF_ID, &pNmbFbf);
+  pNmbFbf -= 1;
+  CrIaPaste(TRANSFBFTOGRND_PNMBFBF_ID, &pNmbFbf);
+
+  return;
+}
+
+/** Action for node N4. */
+void CrIaTransferFbfToGroundN4(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char fbfId, fbfEnb;
+  int i, k;
+
+  /* Increment FBF Counter skipping disabled FBFs */
+
+  CrIaCopy(FBFLOAD_PFBFID_ID, &fbfId);
+
+  for (k=0; k<249; k++) /* do not check and/or transfer initial FBF again, therefore use only (250-1) FBFs */
+    {
+
+      if (fbfId == 250) /* NOTE: could use GetDataPoolMult(FBF_ENB_ID) */
+        {
+          i = 0; /* wrap index */
+          fbfId = 1; /* wrap ID */
+        }
+      else
+        {
+          i = fbfId; /* set index to next possible one */
+          fbfId += 1; /* set ID to next possible one */
+        }
+      
+      /* check if FBF is enabled */
+      CrIaCopyArrayItem(FBF_ENB_ID, &fbfEnb, i);
+
+      if (fbfEnb == 1)
+        {
+          CrIaPaste(FBFLOAD_PFBFID_ID, &fbfId);
+          break;
+        }
+
+    }
+
+  return;
+}
+
+/** Guard on the Control Flow from N2 to N3. */
+FwPrBool_t CrIaTransferFbfToGroundIsCompleted(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short status;
+
+  /* [ FBF Load Procedure has completed ] */
+  status = FwPrIsStarted(prDescFbfLoad);
+
+  if (status != PR_STOPPED)
+    return 0;
+
+  return 1;
+}
+
+/** Guard on the Control Flow from N3 to DECISION1. */
+FwPrBool_t CrIaTransferFbfToGroundIsFlag1(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned short sdu4State;
+
+  /* Flag_1 = Down-Transfer of SDU4 has completed (i.e. SDU4 State Machine is in state INACTIVE) */
+
+  sdu4State = FwSmGetCurState(smDescSdu4);
+
+  if (sdu4State == CrIaSdu_INACTIVE)
+    return 1;
+
+  return 0;
+}
+
+/** Guard on the Control Flow from DECISION1 to N4. */
+FwPrBool_t CrIaTransferFbfToGroundIsContinue(FwPrDesc_t __attribute__((unused)) prDesc)
+{
+  unsigned char pNmbFbf;
+
+  /* (Number of FBFs transferred to ground is smaller than pNmbFbf) &&  */
+  /* (There is at least one enabled FBF still to be transferred) ... NOTE: this is already done in N1 by setting pNmbFbf */
+
+  CrIaCopy(TRANSFBFTOGRND_PNMBFBF_ID, &pNmbFbf);
+
+  if (pNmbFbf > 0)
+      return 1;
+
+  return 0;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+
diff --git a/CrIa/src/CrIaPrSm/CrIaTransferFbfToGroundInit.txt b/CrIa/src/CrIaPrSm/CrIaTransferFbfToGroundInit.txt
new file mode 100644
index 0000000..e13ddee
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/CrIaTransferFbfToGroundInit.txt
@@ -0,0 +1,20 @@
+{
+	/** Define the procedure descriptor (PRD) */
+	FwPrDesc_t prDesc = CrIaTransferFbfToGroundCreate(NULL);
+
+	/** Check that the procedure is properly configured */
+	if (FwPrCheck(prDesc) != prSuccess) {
+		printf("The procedure CrIaTransferFbfToGround is NOT properly configured ... FAILURE\n");
+		return EXIT_FAILURE;
+	}
+	else {
+		printf("The procedure CrIaTransferFbfToGround is properly configured ... SUCCESS\n");
+	}
+
+	/** Start the procedure, and execute it */
+	FwPrStart(prDesc);
+	// FwPrExecute(prDesc);
+	// FwPrExecute(prDesc);
+
+	return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/CrIa/src/CrIaPrSm/codeextract.sh b/CrIa/src/CrIaPrSm/codeextract.sh
new file mode 100755
index 0000000..6ce64a7
--- /dev/null
+++ b/CrIa/src/CrIaPrSm/codeextract.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+
+if [[ $# != 1 ]]
+then
+    echo "please give Module name, e.g. CrIaPrepSci"
+    echo
+    echo "or clear all .h .c .txt files and do sth. like:"
+    echo 'for i in `ls | grep CrIa` ; do ./codeextract.sh $i ; done'
+    echo
+    exit 
+fi
+
+# copy the xx part from the procedure or sm
+cat $1/$1.h | sed -e "s/$1_H_/$1Create_H_/" > $1Create.h
+cat $1/$1.c | sed -e "s/$1\.h/$1Create.h/" -e "s/$1\.c/$1Create.c/"  > $1Create.c
+
+# copy the functions from the pr or sm
+cat $1/$1Main.c | sed -n -e "/int main(void)/q;p" | sed -e "s/$1\.h/$1Create.h/" -e "s/$1Main\.c/$1Func.c/" > $1Func.c
+cat $1/$1Main.c | sed -e "1,/int main(void)/d" > $1Init.txt
+
+
diff --git a/CrIa/src/CrIaPrSm/codeextraction.ods b/CrIa/src/CrIaPrSm/codeextraction.ods
new file mode 100644
index 0000000000000000000000000000000000000000..8297e165445f95cdc9674cb39614592d85b3b3cf
GIT binary patch
literal 14709
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
Q&|iw(i~l)h|8@0$0EMk+djJ3c

literal 0
HcmV?d00001

diff --git a/CrIa/src/CrIaSemEvents.c b/CrIa/src/CrIaSemEvents.c
new file mode 100644
index 0000000..7eef73e
--- /dev/null
+++ b/CrIa/src/CrIaSemEvents.c
@@ -0,0 +1,91 @@
+/**
+ * @file CrIaSemEvents.c
+ *
+ * @author UVIE
+ * @date Created on: Nov 18 2015
+ */
+
+#include <CrIaSemEvents.h>
+
+unsigned char CRSEM_SERV5_EVENT_PRG_PBS_BOOT_READY_SET;
+unsigned char CRSEM_SERV5_EVENT_PRG_APS_BOOT_READY_SET;			
+unsigned char CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_SET;		
+unsigned char CRSEM_SERV5_EVENT_PRG_DIAGNOSE_STEP_FINISHED_SET;		
+unsigned char CRSEM_SERV5_EVENT_PRG_THERMAL_STABILITY_SET;		
+unsigned char CRSEM_SERV5_EVENT_PRG_CFG_LOAD_READY_SET;			
+unsigned char CRSEM_SERV5_EVENT_PRG_FPA_TEMP_NOMINAL_SET;		
+unsigned char CRSEM_SERV5_EVENT_WAR_EEPROM_NO_SEGMENT_SET;		
+unsigned char CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_EXE_SET;		
+unsigned char CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_CFG_SET;		
+unsigned char CRSEM_SERV5_EVENT_WAR_EEPROM_NO_PBS_CFG_SET;		
+unsigned char CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_EXE_FLAG_SET;		
+unsigned char CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_CFG_FLAG_SET;		
+unsigned char CRSEM_SERV5_EVENT_WAR_NO_THERMAL_STABILITY_SET;		
+unsigned char CRSEM_SERV5_EVENT_WAR_FPA_TEMP_TOO_HIGH_SET;		
+unsigned char CRSEM_SERV5_EVENT_WAR_WRONG_EXPOSURE_TIME_SET;		
+unsigned char CRSEM_SERV5_EVENT_WAR_WRONG_REPETITION_PERIOD_SET;
+unsigned char CRSEM_SERV5_EVENT_WAR_FPM_OFF_ONLY_PATTERN_SET;
+unsigned char CRSEM_SERV5_EVENT_WAR_PACK_ENCODE_FAILURE_SET;	
+unsigned char CRSEM_SERV5_EVENT_ERR_EEPROM_WRITE_ERROR_SET;		
+unsigned char CRSEM_SERV5_EVENT_ERR_APS_BOOT_FAILURE_SET;		
+unsigned char CRSEM_SERV5_EVENT_ERR_UNEXPECTED_REBOOT_SET;		
+unsigned char CRSEM_SERV5_EVENT_ERR_WATCHDOG_FAILURE_SET;		
+unsigned char CRSEM_SERV5_EVENT_ERR_CMD_SPW_RX_ERROR_SET;		
+unsigned char CRSEM_SERV5_EVENT_ERR_EEPROM_EXE_SEG_COPY_ABORT_SET;	
+unsigned char CRSEM_SERV5_EVENT_ERR_EEPROM_EXE_SEG_CRC_WRONG_SET;	
+unsigned char CRSEM_SERV5_EVENT_ERR_EEPROM_PBS_CFG_SIZE_WRONG_SET;	
+unsigned char CRSEM_SERV5_EVENT_ERR_WRITING_REGISTER_FAILED_SET;	
+unsigned char CRSEM_SERV5_EVENT_ERR_CMD_BUFFER_1_FULL_SET;		
+unsigned char CRSEM_SERV5_EVENT_ERR_CMD_BUFFER_2_FULL_SET;		
+unsigned char CRSEM_SERV5_EVENT_ERR_DMA_DATA_TRANSF_FAIL_SET;
+unsigned char CRSEM_SERV5_EVENT_ERR_DATA_BIAS_VOLT_WRONG_SET;
+unsigned char CRSEM_SERV5_EVENT_ERR_FEESCU_SYNC_FAIL_SET;
+unsigned char CRSEM_SERV5_EVENT_ERR_FEE_SCRIPT_ERROR_SET;
+unsigned char CRSEM_SERV5_EVENT_ERR_SCU_POWER_SWITCH_FAIL_SET;
+unsigned char CRSEM_SERV5_EVENT_ERR_SPW_TIME_CODE_MISS_SET;
+
+
+/**
+ * Clear all SEM event flags
+ */
+void CrIaClearSemEventFlags(void)
+{
+  CRSEM_SERV5_EVENT_PRG_PBS_BOOT_READY_SET = 0;
+  CRSEM_SERV5_EVENT_PRG_APS_BOOT_READY_SET = 0; /* see Mantis 1178 */
+  CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_SET = 0;
+  CRSEM_SERV5_EVENT_PRG_DIAGNOSE_STEP_FINISHED_SET = 0;		
+  CRSEM_SERV5_EVENT_PRG_THERMAL_STABILITY_SET = 0;		
+  CRSEM_SERV5_EVENT_PRG_CFG_LOAD_READY_SET = 0; /* see Mantis 1178 */
+  CRSEM_SERV5_EVENT_PRG_FPA_TEMP_NOMINAL_SET = 0;		
+  CRSEM_SERV5_EVENT_WAR_EEPROM_NO_SEGMENT_SET = 0;		
+  CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_EXE_SET = 0;		
+  CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_CFG_SET = 0;		
+  CRSEM_SERV5_EVENT_WAR_EEPROM_NO_PBS_CFG_SET = 0;		
+  CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_EXE_FLAG_SET = 0;		
+  CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_CFG_FLAG_SET = 0;		
+  CRSEM_SERV5_EVENT_WAR_NO_THERMAL_STABILITY_SET = 0;		
+  CRSEM_SERV5_EVENT_WAR_FPA_TEMP_TOO_HIGH_SET = 0;		
+  CRSEM_SERV5_EVENT_WAR_WRONG_EXPOSURE_TIME_SET = 0;		
+  CRSEM_SERV5_EVENT_WAR_WRONG_REPETITION_PERIOD_SET = 0;
+  CRSEM_SERV5_EVENT_WAR_FPM_OFF_ONLY_PATTERN_SET = 0;
+  CRSEM_SERV5_EVENT_WAR_PACK_ENCODE_FAILURE_SET = 0;
+  CRSEM_SERV5_EVENT_ERR_EEPROM_WRITE_ERROR_SET = 0;		
+  CRSEM_SERV5_EVENT_ERR_APS_BOOT_FAILURE_SET = 0;		
+  CRSEM_SERV5_EVENT_ERR_UNEXPECTED_REBOOT_SET = 0;		
+  CRSEM_SERV5_EVENT_ERR_WATCHDOG_FAILURE_SET = 0;		
+  CRSEM_SERV5_EVENT_ERR_CMD_SPW_RX_ERROR_SET = 0;		
+  CRSEM_SERV5_EVENT_ERR_EEPROM_EXE_SEG_COPY_ABORT_SET = 0;	
+  CRSEM_SERV5_EVENT_ERR_EEPROM_EXE_SEG_CRC_WRONG_SET = 0;	
+  CRSEM_SERV5_EVENT_ERR_EEPROM_PBS_CFG_SIZE_WRONG_SET = 0;	
+  CRSEM_SERV5_EVENT_ERR_WRITING_REGISTER_FAILED_SET = 0;	
+  CRSEM_SERV5_EVENT_ERR_CMD_BUFFER_1_FULL_SET = 0;		
+  CRSEM_SERV5_EVENT_ERR_CMD_BUFFER_2_FULL_SET = 0;		
+  CRSEM_SERV5_EVENT_ERR_DMA_DATA_TRANSF_FAIL_SET = 0;
+  CRSEM_SERV5_EVENT_ERR_DATA_BIAS_VOLT_WRONG_SET = 0;
+  CRSEM_SERV5_EVENT_ERR_FEESCU_SYNC_FAIL_SET = 0;
+  CRSEM_SERV5_EVENT_ERR_FEE_SCRIPT_ERROR_SET = 0;
+  CRSEM_SERV5_EVENT_ERR_SCU_POWER_SWITCH_FAIL_SET = 0;
+  CRSEM_SERV5_EVENT_ERR_SPW_TIME_CODE_MISS_SET = 0;
+  
+  return;
+}
diff --git a/CrIa/src/CrIaSemEvents.h b/CrIa/src/CrIaSemEvents.h
new file mode 100644
index 0000000..895d534
--- /dev/null
+++ b/CrIa/src/CrIaSemEvents.h
@@ -0,0 +1,64 @@
+/**
+ * @file CrIaSemEvents.h
+ *
+ * @author UVIE
+ * @date Created on: Nov 18 2015
+ */
+
+/** Make sure to include this header file only once */
+#ifndef CrIaSemEvents_H_
+#define CrIaSemEvents_H_
+
+extern unsigned char CRSEM_SERV5_EVENT_PRG_PBS_BOOT_READY_SET;
+extern unsigned char CRSEM_SERV5_EVENT_PRG_APS_BOOT_READY_SET;			
+extern unsigned char CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_SET;	
+extern unsigned char CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_SAFE_SET; /* needed for FdCheck SAFE Mode (NOTE: should be not cleared here) */
+extern unsigned char CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_SAFE_FD_SET; /* needed for FdCheck SEM Mode Time-Out (NOTE: should be not cleared here) */
+extern unsigned char CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_STAB_SET; /* needed for FdCheck SEM Mode Time-Out (NOTE: should be not cleared here) */
+extern unsigned char CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_CCDWIN_SET; /* needed for FdCheck SEM Mode Time-Out (NOTE: should be not cleared here) */
+extern unsigned char CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_CCDFULL_SET; /* needed for FdCheck SEM Mode Time-Out (NOTE: should be not cleared here) */
+extern unsigned char CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_DIAG_SET; /* needed for FdCheck SEM Mode Time-Out (NOTE: should be not cleared here) */
+extern unsigned char CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_STANDBY_SET; /* needed for FdCheck SEM Mode Time-Out (NOTE: should be not cleared here) */
+extern unsigned char CRSEM_SERV5_EVENT_PRG_DIAGNOSE_STEP_FINISHED_SET;		
+extern unsigned char CRSEM_SERV5_EVENT_PRG_THERMAL_STABILITY_SET;
+extern unsigned char CRSEM_SERV5_EVENT_PRG_THERMAL_STABILITY_FD_SET; /* needed for FdCheck SEM Mode Time-Out (NOTE: should be not cleared here) */	
+extern unsigned char CRSEM_SERV5_EVENT_PRG_CFG_LOAD_READY_SET;
+extern unsigned char CRSEM_SERV5_EVENT_PRG_CFG_LOAD_READY_FD_SET; /* needed for FdCheck SEM Mode Time-Out (NOTE: should be not cleared here) */
+extern unsigned char CRSEM_SERV5_EVENT_PRG_FPA_TEMP_NOMINAL_SET;		
+extern unsigned char CRSEM_SERV5_EVENT_WAR_EEPROM_NO_SEGMENT_SET;		
+extern unsigned char CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_EXE_SET;		
+extern unsigned char CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_CFG_SET;		
+extern unsigned char CRSEM_SERV5_EVENT_WAR_EEPROM_NO_PBS_CFG_SET;		
+extern unsigned char CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_EXE_FLAG_SET;		
+extern unsigned char CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_CFG_FLAG_SET;		
+extern unsigned char CRSEM_SERV5_EVENT_WAR_NO_THERMAL_STABILITY_SET;		
+extern unsigned char CRSEM_SERV5_EVENT_WAR_FPA_TEMP_TOO_HIGH_SET;		
+extern unsigned char CRSEM_SERV5_EVENT_WAR_WRONG_EXPOSURE_TIME_SET;		
+extern unsigned char CRSEM_SERV5_EVENT_WAR_WRONG_REPETITION_PERIOD_SET;	
+extern unsigned char CRSEM_SERV5_EVENT_WAR_FPM_OFF_ONLY_PATTERN_SET;
+extern unsigned char CRSEM_SERV5_EVENT_WAR_PACK_ENCODE_FAILURE_SET;
+extern unsigned char CRSEM_SERV5_EVENT_ERR_EEPROM_WRITE_ERROR_SET;		
+extern unsigned char CRSEM_SERV5_EVENT_ERR_APS_BOOT_FAILURE_SET;		
+extern unsigned char CRSEM_SERV5_EVENT_ERR_UNEXPECTED_REBOOT_SET;		
+extern unsigned char CRSEM_SERV5_EVENT_ERR_WATCHDOG_FAILURE_SET;		
+extern unsigned char CRSEM_SERV5_EVENT_ERR_CMD_SPW_RX_ERROR_SET;		
+extern unsigned char CRSEM_SERV5_EVENT_ERR_EEPROM_EXE_SEG_COPY_ABORT_SET;	
+extern unsigned char CRSEM_SERV5_EVENT_ERR_EEPROM_EXE_SEG_CRC_WRONG_SET;	
+extern unsigned char CRSEM_SERV5_EVENT_ERR_EEPROM_PBS_CFG_SIZE_WRONG_SET;	
+extern unsigned char CRSEM_SERV5_EVENT_ERR_WRITING_REGISTER_FAILED_SET;	
+extern unsigned char CRSEM_SERV5_EVENT_ERR_CMD_BUFFER_1_FULL_SET;		
+extern unsigned char CRSEM_SERV5_EVENT_ERR_CMD_BUFFER_2_FULL_SET;		
+extern unsigned char CRSEM_SERV5_EVENT_ERR_DMA_DATA_TRANSF_FAIL_SET;
+extern unsigned char CRSEM_SERV5_EVENT_ERR_DATA_BIAS_VOLT_WRONG_SET;
+extern unsigned char CRSEM_SERV5_EVENT_ERR_FEESCU_SYNC_FAIL_SET;
+extern unsigned char CRSEM_SERV5_EVENT_ERR_FEE_SCRIPT_ERROR_SET;
+extern unsigned char CRSEM_SERV5_EVENT_ERR_SCU_POWER_SWITCH_FAIL_SET;
+extern unsigned char CRSEM_SERV5_EVENT_ERR_SPW_TIME_CODE_MISS_SET;
+
+
+/**
+ * Clear all SEM event flags
+ */
+void CrIaClearSemEventFlags(void);
+
+#endif /* CrIaSemEvents_H_ */
diff --git a/CrIa/src/EngineeringAlgorithms.c b/CrIa/src/EngineeringAlgorithms.c
new file mode 100644
index 0000000..bb32864
--- /dev/null
+++ b/CrIa/src/EngineeringAlgorithms.c
@@ -0,0 +1,875 @@
+/**
+* @file    EngineeringAlgorithms.c
+* @ingroup EngineeringAlgorithms
+* @author  Roland Ottensamer (roland.ottensamer@univie.ac.at)
+* @date    May, 2017
+*
+* @copyright
+* This program is free software; you can redistribute it and/or modify it
+* under the terms and conditions of the GNU General Public License,
+* version 2, as published by the Free Software Foundation.
+*
+* This program is distributed in the hope 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.
+*
+*
+* @defgroup EngineeringAlgorithms Engineering algorithms providing a centroid
+* @ingroup EngineeringAlgorithms
+*
+* @brief Engineering algorithms are @ref Centroiding and @ref TargetAcquisition. They are used in different situations and provide a centroid packet to the spacecraft. 
+*
+*
+* ## Overview
+*
+* In CHEOPS, precise pointing information from the instrument telescope is used by the AOCS (Attitude and Orbital Control System). 
+* There are basically two different usage scenarios of that type of information. Number one is when a new star is to be observed.
+* The spacecraft slews to the new target and starts guiding using its star trackers, but the target star may be off in the instrument field of view
+* in the order of up to 100 arcseconds (in CHEOPS, 1" is about 1 pixel) due to thermoelastic deformations. For that reason the instrument has 
+* to tell the spacecraft the @ref Offset between the intended position (the @ref TargetLocation) and the actually measured position.
+* In the described case, full CCD frames are acquired and the @TargetAcquisition algorithm is run to identify the target star and move it to
+* the intedned location on the CCD. This activity, the "Acquisition", is the first part of a nominal science procedure.
+*
+* ### Centroiding
+*
+* As soon as the target star is stably positioned on the CCD, the science measurement can start. The science frames are no longer full CCD images,
+* but smaller windows of ~200x200 pixels, which are centred on the @ref TargetLocation. In this case the @ref Centroiding algorithm is used.
+* It is faster than the @ref TargetAcquisition and it provides a high precision measurement of the offset, but it has no identification capabilities.
+* It assumes that the target is the brightest source in the ROI (region of interest, a small area around the @ref TargetLocation) and that consequently
+* the centre of gravity measurement of that area is the location of the target star. @ref Centroiding is run whenever a new science image 
+* has been acquired. 
+*
+* Assume that we are in nominal science and science windows are coming in. We also assume that the Centroiding algorithm has been enabled in the data pool 
+* and the corresponding top-level framework algorithm has been started. Then, the first service 21 packet of a new window from the @ref SEM will trigger a 
+* countdown for the @ref Centroiding to run. This counts in IASW cycles up to the phase of the centroiding algorithm. The transfer of a SEM window 
+* takes 1-2 IASW cycles, thus Centroiding should not run until the transfer is complete. This top-level control algorithm is described in the IASW Spec.
+* As soon as the @ref Centroiding function is called, the order of events and steps is the following:
+*
+*   1. Several parameters are fetched from the data pool.
+*      - CENT_DIM_X and CENT_DIM_Y define the size of the ROI (default = 51x51)
+*      - CENT_CHECKS is a boolean to switch the validity checks of the algorithm on/off (default = 1)
+*      - CENT_MEDIANFILTER is a flag to switch the 2D median filter on the ROI on/off (default = 1)
+*      - TARGETLOCATIONX and ...Y are needed to center the ROI. (set by the StarMap command)
+*      - CE_SEMWINDOWPOSX and ...Y are needed to know where to cut out the ROI from (set by the @ref CrIaSemOperCcdFullEntry and @ref CrIaSemOperCcdWindowEntry functions).
+*   2. The AUX buffer located in SRAM1 is released and the work buffers (for the ROI and the median filter) are allocated.
+*      Note that AUX buffer is only used by the EngineeringAlgorithms, which never run simultaneously. 
+*   3. the coordinates needed to crop the ROI from the image are calculated using the @ref getStartCoord function.
+*   4. the ROI is copied accordingly from the @ref SIB.
+*   5. the ROI is checked using @ref CheckRoiForStar.
+*   6. the ROI is filtered using @ref MedFilter3x3.
+*   7. the minimum pixel value is found in the ROI and subtracted from all pixels
+*   8. @ref IntensityWeightedCenterOfGravity2D is called to calculate the center of gravity
+*   9. @ref PrepareSibCentroid is called to copy the results into the data pool.
+*
+* The results are then picked up by the top-level centroiding algorithm in the framework and output via a Centroid packet.
+*/
+
+
+#include "EngineeringAlgorithms.h"
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include "SdpAlgorithmsImplementation.h"
+#include "SdpAlgorithmsImplementationLlc.h" /* for bits_used */
+
+#ifndef GROUNDSW
+#include <CrIaIasw.h> /* for sibAddressFull and Win */
+#include <CrIaPrSm/CrIaSdbCreate.h> /* for CONFIG_FULL etc. */
+#include "IfswDebug.h"
+#endif
+
+#if (__sparc__)
+#include <wrap_malloc.h>
+#endif
+
+#include "IfswMath.h" /* for roundf */
+
+#ifdef DEBUGFILES
+/* used to save the intermediate debug images on PC */
+#include <stdio.h> /* for sprintf */
+#endif
+
+#ifdef PC_TARGET
+unsigned int pc_roi[256*256];
+unsigned int pc_filtered[256*256];
+#include <stdio.h>
+#endif
+
+
+/**
+ * @brief    get minimum and maximum value of an unsigned int buffer
+ * @param    data     array of input samples
+ * @param    len      number of samples
+ * @param    min[out] calculated minimum
+ * @param    max[out] calculated maximum
+ *
+ * @note     If len is 0 then min = 0 and max = 0xffffffff.
+ */
+
+void MinMaxU32 (unsigned int *data, unsigned int len, unsigned int *min, unsigned int *max)
+{
+  unsigned int i;
+
+  *min = 0xffffffffu;
+  *max = 0x0u;
+  
+  for (i=0; i < len; i++)
+    {
+      *min = *min > data[i] ? data[i] : *min;
+      *max = *max < data[i] ? data[i] : *max;
+    }
+
+  return;
+}
+
+
+/**
+ * @brief    make basic checks on the ROI to predict the validity of the centroid
+ * 
+ * Function to analyze an image and return a code carrying the validity of the centroid that will be calculated from this image.
+ * The image is binned to 3x3 pixels, then the following checks are carried out:
+ *
+ *   1. Check for constant image (is the minumum equal to the maximum?)
+ *   2. Check for a star (the mean must be larger than the median)
+ *   3. The star must be a distinct feature (the maximum should be larger than median + 2 sigma)
+ *   4. The range of values must be larger than a certain span
+ *   5. The sigma must be larger than a certain span 
+ *
+ * @param    data    array of input samples
+ * @param    xdim    size in x
+ * @param    ydim    size in y
+ *
+ * @returns  validity code of centroid
+ */
+
+int CheckRoiForStar (unsigned int *data, unsigned int xdim, unsigned int ydim)
+{
+  unsigned int i;
+  unsigned int binned[9], median, minimum, maximum;
+  unsigned int binwidth, binheight, binx, biny, x, y, xstart, ystart;
+  float mean, sigma;
+  unsigned int CenSignalLimit, CenSigmaLimit;
+
+  CrIaCopy(CEN_SIGNALLIMIT_ID, &CenSignalLimit);
+  CrIaCopy(CEN_SIGMALIMIT_ID, &CenSigmaLimit);
+  
+  if ((xdim >= 3) && (xdim >= 3)) /* 3x3 bins make no sense for images < 3x3 */
+    {
+      binwidth = xdim / 3;
+      binheight = ydim / 3;
+    }
+  else
+    {
+      return (int)CEN_INV_INPUT;
+    }
+
+  /* Note: For dimensions which are not divisible by 3, the remainder is ignored.
+     Example: in a 15 by 14 image each of the bins will sample 5 pixels in x * 4 pixels in y
+     and the rest is ignored */
+
+  /* clear the binned array first */
+  for (i=0; i < 9; i++)
+    {
+      binned[i] = 0;
+    }
+  
+  /* bin to 3x3 */
+  for (biny = 0; biny < 3; biny++)
+    {
+      for (y = 0; y < binheight; y++)
+	{
+	  for (binx = 0; binx < 3; binx++)
+	    {
+	      for (x = 0; x < binwidth; x++)
+		{
+		  xstart = x + binx*binwidth;
+		  ystart = (y + biny*binheight) * xdim;
+		  binned[binx + 3*biny] += data[xstart + ystart];
+		}
+	    }
+	}      
+    }  
+
+  /* convert the sums to averages */
+  for (i=0; i < 9; i++)
+    {
+      binned[i] /= (binwidth * binheight);
+    }
+    
+  MeanSigma ((int *)binned, 9, &mean, &sigma);
+
+  median = Median ((int *)binned, 9);
+
+  MinMaxU32 (binned, 9, &minimum, &maximum);
+
+  /* DEBUGP("CEN: Mean %f Sig: %f Med: %u Min: %u Max: %u\n", mean, sigma, median, minimum, maximum); */
+  
+  /* rule 1: the image must not be constant */
+  if (minimum == maximum)
+    {
+      return (int)CEN_INV_TARGET;
+    }
+    
+  /* rule 2: there must be a star */
+  if (mean < median)
+    {
+      return (int)CEN_INV_TARGET;
+    }
+  
+  /* rule 3: the star must be sharp */
+  if ((median + 2*sigma) > maximum)
+    {
+      return (int)CEN_INV_SMEAR;
+    }
+
+  /* rule 4: there must be a signal */
+  if ((maximum - minimum) < CenSignalLimit)
+    {
+      return (int)CEN_INV_TARGET;
+    }
+
+  /* rule 5: the sigma must be large */
+  if (sigma < CenSigmaLimit)
+    {
+      return (int)CEN_INV_SMEAR;
+    }
+  
+  return 0;
+}
+
+
+/**
+ * @brief    calculates the start coordinates of the ROI
+ * 
+ * given the size of the input window, the SEM window offsets,
+ * the target location and the dimensions of the sub-window,
+ * the start coordinates of the sub-window are calculated.
+ *
+ * @param    coord[inout]   structure describing the input dimensions. Here the resulting start location coordinates are also entered.
+ * @returns  0 if the coordinates are plausible
+ *
+ * @note   We have to convert between SEM local coordinates and IFSW coordinates here. Looking at the 
+ *   real use case, we only pass the image section (window) without margin, otherwise the coordinates must be modified before.
+ *   It also means, that we always assume the conversion between IFSW (=I, used for the TargetLocation) 
+ *   and SEM local system L(X,Y) = (I(X,Y) – (50,50))*0.01 regardless of the SEM readout circuit (NOM/RED). 
+ *   (Originally, this was L(X,Y) = (I(X,Y) – (2850,50))*0.01, but this was changed upon request by the platform.)
+ *   This is intended, because the platform does not care which circuit we use, so we always use the NOM offset.
+ *   In case of doubt, consult the IFSW-SOC ICD, section 5.3.2
+ *
+ * @warning  Do not use on full frame dimensions which include margins (1076x1033)
+ */
+
+int getStartCoord (struct Coordinates *coord)
+{
+  float TargetLocX, TargetLocY;
+  int StartLocX_L, StartLocY_L;
+  
+  /* convert the target location to L system assuming nominal margins */
+  TargetLocX = (coord->TargetLocX_I - LTOI_X)*0.01f;
+  TargetLocY = (coord->TargetLocY_I - LTOI_Y)*0.01f;
+  
+  StartLocX_L = roundf(TargetLocX - 0.5f * coord->SubWinSizeX_L);
+  StartLocY_L = roundf(TargetLocY - 0.5f * coord->SubWinSizeY_L);
+ 
+  /* The start loc from above assumes an (up to) 1024x1024 image. 
+     We have to modify it by the actual SEM window position */
+  StartLocX_L -= coord->SemWinPosX_L;
+  StartLocY_L -= coord->SemWinPosY_L;
+
+  /* now check if the sub-window area is actually within the window */
+  if (StartLocX_L < 0)    
+    return -1;
+  if (StartLocY_L < 0)
+    return -2;
+  if ((StartLocX_L + coord->SubWinSizeX_L) > coord->SemWinSizeX_L)
+    return -3;
+  if ((StartLocY_L + coord->SubWinSizeY_L) > coord->SemWinSizeY_L)
+    return -4;
+
+  /* enter the result */
+  coord->StartLocationX_L = (unsigned int) StartLocX_L;
+  coord->StartLocationY_L = (unsigned int) StartLocY_L;
+
+  return 0;
+}
+
+
+/**
+ * @brief    get median of 9 unsigned ints, messing up the order of the input array
+ * @param    data     array of input samples
+ *
+ * @returns  median of the 9 samples
+ */
+
+unsigned int Med9USpoil (unsigned int *data)
+{
+  SWAP_SORTU (data[1], data[2]);
+  SWAP_SORTU (data[4], data[5]);
+  SWAP_SORTU (data[7], data[8]);
+  SWAP_SORTU (data[0], data[1]);
+  SWAP_SORTU (data[3], data[4]);
+  SWAP_SORTU (data[6], data[7]);
+  SWAP_SORTU (data[1], data[2]);
+  SWAP_SORTU (data[4], data[5]);
+  SWAP_SORTU (data[7], data[8]);
+  SWAP_SORTU (data[0], data[3]);
+  SWAP_SORTU (data[5], data[8]);
+  SWAP_SORTU (data[4], data[7]);
+  SWAP_SORTU (data[3], data[6]);
+  SWAP_SORTU (data[1], data[4]);
+  SWAP_SORTU (data[2], data[5]);
+  SWAP_SORTU (data[4], data[7]);
+  SWAP_SORTU (data[4], data[2]);
+  SWAP_SORTU (data[6], data[4]);
+  SWAP_SORTU (data[4], data[2]);
+
+  return(data[4]);
+}
+
+
+/**
+ * @brief    3x3 median filter with threshold
+ * 
+ * This algorithm takes an image as input and applies 2D median filtering.
+ * For each pixel which is not on one of the four borders, it takes a copy of the 3x3 sub-array
+ * and calculates the median. If the absolute difference between pixel value and calculated median 
+ * is larger than the threshold, then the sample is replaced by the median.
+ *
+ * @param    data      array of input samples
+ * @param    xdim      size of image in x
+ * @param    ydim      size in y
+ * @param    threshold the threshold value to compare against
+ * @param    filtered  the filtered output image
+ *
+ * @returns  median of the 9 samples
+ */
+
+int MedFilter3x3 (unsigned int *data, unsigned int xdim, unsigned int ydim, unsigned int threshold, unsigned int *filtered)
+{
+  unsigned int x, y, off;
+  unsigned int medwin[9];
+  unsigned int pixval, median, diff;
+ 
+  /* we start at 1,1 and run to xdim-1, ydim-1 so that a 1 pixel border is not processed */
+  if (xdim < 3)
+    return -1;
+  if (ydim < 3)
+    return -1;
+  
+  for (y=1; y < (ydim-1); y++)
+    {
+      for (x=1; x < (xdim-1); x++) 
+	{
+	  /* first row */
+	  off = (y-1)*xdim;
+	  medwin[0] = data[off + x-1];
+	  medwin[1] = data[off + x];
+	  medwin[2] = data[off + x+1];
+
+	  /* last row */
+	  off = (y+1)*xdim;
+	  medwin[6] = data[off + x-1];
+	  medwin[7] = data[off + x];
+	  medwin[8] = data[off + x+1];
+
+	  /* middle row */
+	  off = y*xdim;
+	  medwin[3] = data[off + x-1];
+	  pixval = data[off + x];
+	  medwin[4] = pixval;
+	  medwin[5] = data[off + x+1];
+	  
+	  median = Med9USpoil(medwin);
+
+	  if (pixval > median)
+	    {
+	      diff = pixval - median;
+	    }
+	  else
+	    {
+	      diff = median - pixval;
+	    }
+	    
+	  if (diff > threshold)
+	    {
+	      filtered[off + x] = median; /* reuse off from middle row */
+	    }
+	  else
+	    {
+	      filtered[off +x] = pixval;
+	    }
+	}
+    }
+
+  /* now copy the borders */
+  for (x=0; x < xdim; x++)
+    {
+      filtered[x] = data[x];
+    }
+  for (x=(ydim-1)*xdim; x < ydim*xdim; x++)
+    {
+      filtered[x] = data[x];
+    }
+  for (y=1; y < (ydim-1); y++)
+    {
+      filtered[y*xdim] = data[y*xdim];
+      filtered[y*xdim + (xdim-1)] = data[y*xdim + (xdim-1)];
+    }  
+  
+  return 0;
+}
+
+  
+/**
+ * @brief Calculates Center of Gravity for a given 1d array in sub-element accuracy
+ *
+ * @param       img	a buffer holding the image
+ * @param	rows	the number of rows in the image
+ * @param	cols	the number of columns in the image
+ * @param[out]	x	x position
+ * @param[out]	y	y position
+ *
+ */
+
+void CenterOfGravity2D (unsigned int *img, unsigned int rows, unsigned int cols, float *x, float *y)
+{
+  unsigned int i, j;
+  unsigned int tmp; /* was: double */ 
+  
+  double pos;
+  double sum = 0.0; 
+  
+  /* 
+     start by iterating columns, i.e. contiguous sections of memory,
+     so the cache will be primed at least for small images for
+     the random access of rows afterwards.
+     Large images should be transposed beforehand, the overhead is a lot
+     smaller that a series of cache misses for every single datum.
+   */
+
+  /* for the y axis */
+  pos = 0.0;  
+  for (i = 0; i < rows; i++)
+    {      
+      tmp = 0;
+
+      for (j = 0; j < cols; j++)
+	tmp += GET_PIXEL(img, cols, j, i);
+    
+      pos += tmp * (i + 1);
+      sum += tmp;
+    }
+
+  if (sum != 0.0)
+    (*y) = (float)(pos / sum) - 1.0f;
+
+  /* for the x axis */
+  pos = 0.0;  
+  for (j = 0; j < cols; j++)
+    {
+      tmp = 0;
+
+      for (i = 0; i < rows; i++)
+	tmp += GET_PIXEL(img, cols, j, i); /* yes, cols is correct */
+			
+      pos += tmp * (j + 1);
+    }
+
+  if (sum != 0.0)
+    (*x) = (float)(pos / sum) - 1.0f;
+
+  return;
+}
+
+
+/**
+ * @brief Calculates Weighted Center of Gravity for a 2d image 
+ *
+ * In this algorithm, the inner product of img and weights goes into the 
+ * @ref CenterOfGravity2D algorithm. That algorithm sums up the pixel values in an unsigned int, 
+ * so the data and the dimensions that we pass must account for that. Consequently, the range of 
+ * values in our data array needs to be reduced if they are too large. For this purpose, the
+ * maximum value of the products is taken, its number of bits determined and checked against a user-define number
+ * (CogBits, default = 16). If that exceeds the CogBits, all pixels are right shifted to fit into the range of values. 
+ * Remember, we will find the center of gravity (position) from that data set, so multiplicative factors can be ignored.
+ *
+ * @param       img	 a buffer holding the image
+ * @param       weights  a buffer holding the weights
+ * @param	rows	 the number of rows in the image
+ * @param	cols	 the number of columns in the image
+ * @param[out]	x	 x position
+ * @param[out]	y	 y position
+ *
+ * @note   It is fine to work in place, i.e. img and weights can be identical.
+ */
+
+void WeightedCenterOfGravity2D (unsigned int *img, unsigned int *weights, unsigned int rows, unsigned int cols, float *x, float *y)
+{
+  unsigned int i;
+  unsigned int max = 0;
+  unsigned int bu;
+  unsigned int rsh = 0;
+  unsigned char CoGBits;
+
+  CrIaCopy(COGBITS_ID, &CoGBits);
+  
+  for (i = 0; i < rows * cols; i++)
+    {
+      /* multiply image with weights */ 
+      weights[i] *= img[i]; 
+
+      /* and find max value */
+      max = weights[i] > max ? img[i] : max;
+    }
+
+  /* determine size of datatype and shift so that it is back within CogBits (e.g. 16) bits */
+  bu = bits_used(max);
+  if (bu > CoGBits)
+    {
+      rsh = bu - CoGBits;       
+      /* and shift back to CoGBits bits datatype (no rounding) */
+      for (i = 0; i < rows * cols; i++)
+	weights[i] >>= rsh;
+    }
+  
+  CenterOfGravity2D (weights, rows, cols, x, y);
+  
+  return;
+}
+
+
+/**
+ * @brief Calculates Intensity Weighted Center of Gravity for a 2d image 
+ *
+ * In the IWCoG algorithm, the image is basically squared, before it goes into the @ref CenterOfGravity2D.
+ * This is achieved by calling @ref WeightedCenterOfGravity2D with img as data and weights parameter.
+ *
+ * @param       img	 a buffer holding the image
+ * @param	rows	 the number of rows in the image
+ * @param	cols	 the number of columns in the image
+ * @param[out]	x	 x position
+ * @param[out]	y	 y position
+ *
+ */
+
+void IntensityWeightedCenterOfGravity2D (unsigned int *img, unsigned int rows, unsigned int cols, float *x, float *y)
+{
+  /* the IWC just works on the square of the image */
+  WeightedCenterOfGravity2D (img, img, rows, cols, x, y);
+
+  return;
+}
+
+
+/**
+ * @brief enter centroid results in the Centroid of the SIB
+ *
+ * The results of e.g. @ref CenterOfGravity2D are written back into the @ref SIB. A SIB has a layout according
+ * to the @ref CrIaSib structure. Within that structure is a @ref SibHeader, which itself carries a @ref SibCentroid.
+ * We are writing the calculated offsets and validity there.
+ *
+ * @note This function uses CENT_OFFSET_X and CENT_MULT_X (and their counterparts in Y) to calculate the final result:
+ *       OffsetX = (int) roundf(100.*(CentMultX*foffsetX + CentOffsetX)). This allows us to flip the axis and add a shift.
+ *
+ * @param       Sib	  the SIB to use, which is the one used to calculate the Centroid
+ * @param	validity  the validity to enter
+ * @param	foffsetX  the offset in X to enter
+ * @param	foffsetY  the offset in Y to enter
+ *
+ */
+
+void PrepareSibCentroid (struct CrIaSib *Sib, unsigned char validity, float foffsetX, float foffsetY)
+{
+  struct SibCentroid *Centroid;
+  struct SibHeader *Header;
+
+  unsigned int TargetLocationX, TargetLocationY;
+
+  unsigned short DataCadence;
+  unsigned int PImageRep; 
+  unsigned int ExpCoarse, ExpFine;
+  
+  float CentMultX, CentMultY; /* float, can be used to invert the axis -1 */
+  float CentOffsetX, CentOffsetY;
+
+  int offsetX, offsetY;
+
+  /* 
+     The results are stored in the Centroid structure of the SIB header. 
+     Pasting the values into the datapool is done one level up (in the CrIaCentAlgoFunc).
+     Several values can already be copied there, because they are independent of the 
+     centroid calculation, such as the timestamps and the target location.
+  */
+  
+  Header = (struct SibHeader *) Sib->Header;
+  Centroid = (struct SibCentroid *) Sib->Centroid;
+  
+  Centroid->startIntegCoarse = Header->startTimeCoarse;
+  Centroid->startIntegFine = Header->startTimeFine;
+
+  ExpFine = Header->startTimeFine + (Header->ExposureTime * 65536) / 1000;
+  ExpCoarse = ExpFine / 65536;
+  ExpFine = ExpFine - 65536 * ExpCoarse;
+  Centroid->endIntegCoarse = Header->startTimeCoarse + ExpCoarse;
+  Centroid->endIntegFine = ExpFine;
+  
+  /* for the Data Cadence [centisec] we use the SEM Repetition Period [millisec]. */
+  CrIaCopy (PIMAGEREP_ID, &PImageRep); 
+  /* saturate at 600s */
+  if (PImageRep > 600000)
+    {
+      PImageRep = 600000;
+    }
+  
+  DataCadence = PImageRep / 10; /* [ms] -> [cs] */        
+  Centroid->dataCadence = DataCadence; /* DataCadence is ushort */
+  
+  CrIaCopy(TARGETLOCATIONX_ID, &TargetLocationX);
+  CrIaCopy(TARGETLOCATIONY_ID, &TargetLocationY);
+  
+  Centroid->targetLocX = TargetLocationX;
+  Centroid->targetLocY = TargetLocationY;
+
+  /* Patch and copy the OFFSET values back to the SIB */
+  CrIaCopy(CENT_OFFSET_X_ID, &CentOffsetX);
+  CrIaCopy(CENT_OFFSET_Y_ID, &CentOffsetY);
+  CrIaCopy(CENT_MULT_X_ID, &CentMultX);
+  CrIaCopy(CENT_MULT_Y_ID, &CentMultY);
+
+  offsetX = (int) roundf(100.*(CentMultX*foffsetX + CentOffsetX));
+  offsetY = (int) roundf(100.*(CentMultY*foffsetY + CentOffsetY));
+  
+  Centroid->offsetX = offsetX;
+  Centroid->offsetY = offsetY;
+  
+  Centroid->validityStatus = validity;
+    
+  return;
+}
+
+
+/**
+ * @brief Centroid calculation for CHEOPS
+ *
+ * The @ref Centroiding algorithm takes a @ref SIB and calculate the offsets of the star to the @ref TargetLocation
+ * according to the results from an intensity-weighted centre of gravity calculation. The results are stored in the
+ * @ref SibCentroid structure within the @ref SibHeader of the @ref SIB. Whether the result is valid is stored in the
+ * @ref SibCentroid structure.
+ *
+ * @param       Sib	  the SIB to use
+ *
+ */
+
+void Centroiding (struct CrIaSib *Sib)
+{
+  struct Coordinates Coord;
+  struct SibHeader *sibHeader;
+ 
+  unsigned int TargetLocationX, TargetLocationY;
+  unsigned short SemWinPosX, SemWinPosY;
+  
+  int status = 0;
+  int xstart, ystart;
+  float x, y, expected_x, expected_y, foffsetX, foffsetY;  
+
+  unsigned int *roi, *filtered;
+  unsigned int minimum;
+  unsigned int i;
+  
+  unsigned short CentDimX, CentDimY;
+  unsigned char CentMedianfilter, CentChecks, validity;
+  unsigned int CentMedianThrd;
+  
+  CrIaCopy(CENT_DIM_X_ID, &CentDimX);
+  CrIaCopy(CENT_DIM_Y_ID, &CentDimY);
+  CrIaCopy(CENT_CHECKS_ID, &CentChecks);
+  
+  CrIaCopy(CENT_MEDIANFILTER_ID, &CentMedianfilter);
+
+  CrIaCopy(TARGETLOCATIONX_ID, &TargetLocationX);
+  CrIaCopy(TARGETLOCATIONY_ID, &TargetLocationY);
+
+  sibHeader = (struct SibHeader *) Sib->Header;
+  
+  /* we set the validity to success before calculation */
+  validity = CEN_VAL_WINDOW;  
+  if (sibHeader->AcqType == ACQ_TYPE_FULL)
+    {
+      validity = CEN_VAL_FULL;
+    }
+  
+#if (__sparc__)
+  /* first we release the AUX heap */
+  release(AUX);
+
+  /* then we allocate new areas for the work buffers */
+  roi = (unsigned int *) alloc(CentDimX * CentDimY * 4, AUX);
+  filtered = (unsigned int *) alloc(CentDimX * CentDimY * 4, AUX);
+#else
+  roi = pc_roi;
+  filtered = pc_filtered;
+#endif
+
+  /* use target location and sem offsets to calculate the ROI 
+     the SEM window size is taken from the SIB, the POS is taken from the DP */
+
+  CrIaCopy(CE_SEMWINDOWPOSX_ID, &SemWinPosX);
+  CrIaCopy(CE_SEMWINDOWPOSY_ID, &SemWinPosY);
+
+  Coord.TargetLocX_I = TargetLocationX;
+  Coord.TargetLocY_I = TargetLocationY;  
+  Coord.SemWinSizeX_L = Sib->Xdim;
+  Coord.SemWinSizeY_L = Sib->Ydim;
+  Coord.SemWinPosX_L = (unsigned int) SemWinPosX;
+  Coord.SemWinPosY_L = (unsigned int) SemWinPosY;
+  Coord.SubWinSizeX_L = CentDimX;
+  Coord.SubWinSizeY_L = CentDimY;
+  Coord.StartLocationX_L = 0;
+  Coord.StartLocationY_L = 0;
+
+  status = getStartCoord (&Coord);
+
+  if (status != 0)
+    {
+      /* 
+	 We come here if the start coordinates could not be calculated.
+	 In this case, we have to set the validity to invalid.
+	 The x and y start coordinates do not matter much in this case,
+	 because the CropCopy and the CoG are robust against stupid coordinates.
+	 However, (0,0) is the safest.
+       */
+      validity = CEN_INV_INPUT;
+    }
+
+  xstart = Coord.StartLocationX_L;
+  ystart = Coord.StartLocationY_L;
+
+  /* Mantis 2181: in FF mode adjust the xstart and ystart for the margin */
+  if (sibHeader->AcqType == ACQ_TYPE_FULL) 
+    {
+      if (GetFpmSide(sibHeader->CcdTimingScriptId) == FPM_SIDE_B)
+	{      
+	  xstart += RSM_XDIM; /* RED: 24 */
+	}
+      else
+	{
+	  xstart += LSM_XDIM; /* NOM: 28 */
+	}
+    }
+	
+  status = CropCopyFromSibAndUnpack (Sib->Expos, Sib->Xdim, Sib->Ydim, CentDimX, CentDimY, xstart, ystart, roi);
+  
+  if (status != 0)
+    {
+      /* 
+	 Wrong dimensions. We come here most likely because the 
+	 given coordinates do not work with the SIB. 
+      */
+      validity = CEN_INV_INPUT;
+    }   
+
+  /* simple checks on image */
+  status = 0;
+  if (CentChecks != 0)
+    {
+      status = CheckRoiForStar (roi, CentDimX, CentDimY);
+    }
+  
+  if (status != 0)
+    {
+      /* 
+	 If CheckRoiForStar returns an error, it does this 
+	 using the Centroid error codes, so we can pass it on. 
+      */
+      validity = (unsigned char)(status & 0xff);
+    }   
+
+#ifdef DEBUGFILES      
+      {
+	/* save fits file for debug purposes */
+	static int roictr;
+	struct ScienceBuf myfile;
+
+	myfile.xelements = CentDimX;
+	myfile.yelements = CentDimY;
+	myfile.zelements = 1;
+	myfile.nelements = CentDimX * CentDimY;
+	
+	/* ROI */
+	myfile.data = (void *) roi;
+	sprintf (debugfilename, "!Debug_ROI%03u.fits", roictr); /* ! means overwrite */
+	saveFitsImage (debugfilename, &myfile);      
+	roictr++;
+      }
+#endif
+  
+  /* optional median filter */
+  if (CentMedianfilter == 1)
+    {
+      CrIaCopy(CEN_MEDIAN_THRD_ID, &CentMedianThrd);
+      /* create filtered image */
+      status = MedFilter3x3 (roi, CentDimX, CentDimY, CentMedianThrd, filtered);
+      if (status == 0)
+	{
+	  for (i=0; i < ((unsigned int)CentDimX * (unsigned int)CentDimY); i++)
+	    roi[i] = filtered[i];	  
+	}
+    }
+
+#ifdef DEBUGFILES      
+      {
+	/* save fits file for debug purposes */
+	static int medctr;
+	struct ScienceBuf myfile;
+
+	myfile.xelements = CentDimX;
+	myfile.yelements = CentDimY;
+	myfile.zelements = 1;
+	myfile.nelements = CentDimX * CentDimY;
+	
+	/* ROI */
+	myfile.data = (void *) roi;
+	sprintf (debugfilename, "!Debug_MED%03u.fits", medctr); /* ! means overwrite */
+	saveFitsImage (debugfilename, &myfile);      
+	medctr++;
+      }
+#endif
+
+  /* 
+     calculate centroid 
+  */
+  
+  /* set initial positions */
+  expected_x = 0.5f * CentDimX;
+  expected_y = 0.5f * CentDimY;
+  x = expected_x;
+  y = expected_y;
+
+  /* remove background by subtracting the minimum */
+  minimum = 0xffffffff;
+
+  for (i=0; i < ((unsigned int)CentDimY * CentDimX); i++)
+    {
+      if (roi[i] < minimum)
+	{
+	  minimum = roi[i];
+	}
+    }
+  /* then subtract from roi */
+  for (i=0; i < ((unsigned int)CentDimY * CentDimX); i++)
+    {
+      roi[i] -= minimum;
+    } 
+
+  /* call centroiding algorithm */
+  IntensityWeightedCenterOfGravity2D (roi, CentDimY, CentDimX, &x, &y);
+
+  foffsetX = expected_x - x;
+  foffsetY = expected_y - y;
+  
+  PrepareSibCentroid (Sib, validity, foffsetX, foffsetY);
+  
+  return;
+}
diff --git a/CrIa/src/EngineeringAlgorithms.h b/CrIa/src/EngineeringAlgorithms.h
new file mode 100644
index 0000000..7690221
--- /dev/null
+++ b/CrIa/src/EngineeringAlgorithms.h
@@ -0,0 +1,67 @@
+/**
+ * 
+ */
+
+#ifndef ENGINEERINGALGORITHMS_H
+#define ENGINEERINGALGORITHMS_H
+
+/* Includes */
+/* #include <CrFwConstants.h> */
+#include <stdint.h>
+
+#include "SdpBuffers.h"
+
+struct Coordinates {
+  unsigned int SemWinSizeX_L;
+  unsigned int SemWinSizeY_L;
+  unsigned int SemWinPosX_L;
+  unsigned int SemWinPosY_L;
+  unsigned int TargetLocX_I;
+  unsigned int TargetLocY_I;
+  unsigned int SubWinSizeX_L;
+  unsigned int SubWinSizeY_L;
+  unsigned int StartLocationX_L;
+  unsigned int StartLocationY_L;
+} ;
+
+#define LTOI_X 50 /* was: 2850, but changed to 50 upon request by CASA */
+#define LTOI_Y 50
+
+#define CEN_VAL_WINDOW 0      /* no error, CCD window mode     */
+#define CEN_VAL_FULL   1      /* no error, full frame mode     */
+#define CEN_INV_INPUT  0xFF   /* invalid input data            */
+#define CEN_INV_TARGET 0xFE   /* invalid - no target           */
+#define CEN_INV_SMEAR  0xFD   /* invalid - too large smearing  */
+#define CEN_INV_ALGO   0xFC   /* invalid - algorithm fails     */
+#define CEN_INV_SYNC   0xFB   /* invalid - CIS-OBT not in sync */
+
+#define SET_PIXEL(img,cols,x,y,val) { img[x + cols * y] = val; }
+#define GET_PIXEL(img,cols,x,y) ( img[x + cols * y] )
+
+
+#define SWAP_SORTU(a,b) { if ((a) > (b)) { unsigned int temp = (a); (a) = (b); (b) = temp; } }
+
+
+
+void MinMaxU32 (unsigned int *data, unsigned int len, unsigned int *min, unsigned int *max);
+
+int CheckRoiForStar (unsigned int *data, unsigned int xdim, unsigned int ydim);
+
+int getStartCoord (struct Coordinates *coord);
+
+unsigned int Med9USpoil (unsigned int *data);
+
+int MedFilter3x3 (unsigned int *data, unsigned int xdim, unsigned int ydim, unsigned int threshold, unsigned int *filtered);
+
+void CenterOfGravity2D (unsigned int *img, unsigned int rows, unsigned int cols, float *x, float *y);
+
+void WeightedCenterOfGravity2D (unsigned int *img, unsigned int *weights, unsigned int rows, unsigned int cols, float *x, float *y);
+
+void IntensityWeightedCenterOfGravity2D (unsigned int *img, unsigned int rows, unsigned int cols, float *x, float *y);
+
+void PrepareSibCentroid (struct CrIaSib *Sib, unsigned char validity, float foffsetX, float foffsetY);
+
+void Centroiding (struct CrIaSib *Sib);
+
+
+#endif /* ENGINEERINGALGORITHMS_H */
diff --git a/CrIa/src/IfswConversions.c b/CrIa/src/IfswConversions.c
new file mode 100644
index 0000000..5ac60c2
--- /dev/null
+++ b/CrIa/src/IfswConversions.c
@@ -0,0 +1,313 @@
+/**
+ * @file IfswConversions.c
+ * @ingroup CrIaIasw
+ * @authors C. Reimers, Institute for Astrophysics, 2017
+ * @date    December, 2017
+ *
+ * @brief Implementation of conversion functions (RAW/ENGINEERING values) used by the IASW.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "IfswMath.h"
+#include "IfswConversions.h"
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+/* for fpga_dpu_get_rt_addr */
+#if (__sparc__)
+#include <iwf_fpga.h>
+#include <ibsw_interface.h>
+#else
+#define EQM_BOARD_NOM 0x00005000
+#define EQM_BOARD_RED 0x00006000
+#endif /* __sparc__ */
+
+
+/* 
+ * Divider K_PSU as given in document CHEOPS-IFW-INST-UM-070, issue 1.1, 01.09.2017, page 37
+ */ 
+float getDividerK_PSU(unsigned int voltId)
+{
+  float K;
+
+  switch (voltId)
+  {
+    case SEM_P7V0_ID:
+      K = 4.0949f;
+      break;
+    case SEM_P5V0_ID:
+      K = 3.6239f;
+      break;
+    case SEM_N5V0_ID:
+      K = 3.6239f;
+      break;
+    case SEM_P15V_ID:
+      K = 7.68f;
+      break;
+    case SEM_P30V_ID:
+      K = 16.1094f;
+      break;
+    default:
+      K = 0.0f;
+      break;
+  }
+
+  return K;
+}
+
+/* 
+ * Divider K_DPU as given in document CHEOPS-IFW-INST-UM-070, issue 1.1, 01.09.2017, page 37
+ */ 
+float getDividerK_DPU(unsigned int voltId)
+{
+  float K;
+
+  switch (voltId)
+  {
+    case ADC_P5V_ID: /* fallthrough */
+    case ADC_N5V_ID: 
+      K = -4.0f;
+      break;
+    case ADC_P3V3_ID: /* fallthrough */
+    case ADC_P2V5_ID: /* fallthrough */
+    case ADC_P1V8_ID: /* fallthrough */
+    case ADC_PGND_ID:
+      K = -2.0f;
+      break;
+    default:
+      K = 0.0f;
+      break;
+  }
+
+  return K;
+}
+
+
+/* 
+ * Thermistor currents I_therm as given in document CHEOPS-IFW-INST-UM-070, issue 1.1, 01.09.2017, page 39
+ */ 
+float getIthermFor(unsigned int thermId)
+{
+  float Itherm;
+  unsigned short dpuVer;
+  unsigned int boardId;
+  
+  /* Get DPU version (NOMINAL or REDUNDANT) */
+#if (__sparc__)
+  dpuVer = fpga_dpu_get_rt_addr();
+  boardId = CrIbGetDpuBoardId();
+#else
+  dpuVer = 9; /* NOMINAL */
+  boardId = 9; /* FM nom */
+#endif /* __sparc__ */
+
+  if ((boardId == EQM_BOARD_NOM) || (boardId == EQM_BOARD_RED))
+    {
+      Itherm = 100.4;
+    }
+  else /* all other models use the FM values */
+    {
+      if (dpuVer == 9) /* FM NOMINAL */
+	{
+	  switch (thermId) 
+	    {
+	    case ADC_TEMPOH1A_ID:
+	      CrIaCopy(OTA_TM1A_NOM_ID, &Itherm);
+	      break;
+	    case ADC_TEMPOH2A_ID:
+	      CrIaCopy(OTA_TM2A_NOM_ID, &Itherm);
+	      break;
+	    case ADC_TEMPOH3A_ID:
+	      CrIaCopy(OTA_TM3A_NOM_ID, &Itherm);
+	      break;
+	    case ADC_TEMPOH4A_ID:
+	      CrIaCopy(OTA_TM4A_NOM_ID, &Itherm);
+	      break;
+	    case ADC_TEMPOH1B_ID:
+	      CrIaCopy(OTA_TM1B_NOM_ID, &Itherm);
+	      break;
+	    case ADC_TEMPOH2B_ID:
+	      CrIaCopy(OTA_TM2B_NOM_ID, &Itherm);
+	      break;
+	    case ADC_TEMPOH3B_ID:
+	      CrIaCopy(OTA_TM3B_NOM_ID, &Itherm);
+	      break;
+	    case ADC_TEMPOH4B_ID:
+	      CrIaCopy(OTA_TM4B_NOM_ID, &Itherm);
+	      break;
+	    default:
+	      Itherm = 99.00;
+	      break;
+	    }
+	}
+      else if (dpuVer == 10) /* FM REDUNDANT */
+	{
+	  switch (thermId) 
+	    {
+	    case ADC_TEMPOH1A_ID:
+	      CrIaCopy(OTA_TM1A_RED_ID, &Itherm);
+	      break;
+	    case ADC_TEMPOH2A_ID:
+	      CrIaCopy(OTA_TM2A_RED_ID, &Itherm);
+	      break;
+	    case ADC_TEMPOH3A_ID:
+	      CrIaCopy(OTA_TM3A_RED_ID, &Itherm);
+	      break;
+	    case ADC_TEMPOH4A_ID:
+	      CrIaCopy(OTA_TM4A_RED_ID, &Itherm);
+	      break;
+	    case ADC_TEMPOH1B_ID:
+	      CrIaCopy(OTA_TM1B_RED_ID, &Itherm);
+	      break;
+	    case ADC_TEMPOH2B_ID:
+	      CrIaCopy(OTA_TM2B_RED_ID, &Itherm);
+	      break;
+	    case ADC_TEMPOH3B_ID:
+	      CrIaCopy(OTA_TM3B_RED_ID, &Itherm);
+	      break;
+	    case ADC_TEMPOH4B_ID:
+	      CrIaCopy(OTA_TM4B_RED_ID, &Itherm);
+	      break;
+	    default:
+	      Itherm = 99.00;
+	      break;
+	    }
+	} 
+      else 
+	{
+	  Itherm = 99.00;
+	}
+      
+    }
+  
+  return Itherm*1e-6;
+}
+
+
+/**
+ * Convert voltage from raw values (ADC) of DPU to engineering values (Volt)
+ */
+float convertToVoltEngVal_DPU(short Volt_ADC, unsigned int voltId)
+{
+  float X, K_DPU;
+
+  X = (float)Volt_ADC;
+
+  K_DPU = getDividerK_DPU(voltId);
+  
+  return (X * 2.995f * K_DPU) / 8191.0f;
+}
+
+
+/**
+ * Convert voltage from raw values (ADC) of PSU to engineering values (Volt)
+ */
+float convertToVoltEngVal_PSU(short Volt_ADC, unsigned int voltId)
+{
+  float X, K_PSU, K_DPU = -2.0f;
+
+  X = (float)Volt_ADC;
+
+  K_PSU = getDividerK_PSU(voltId);
+
+  return (X * 2.995f * K_PSU * K_DPU) / 8191.0f;
+}
+
+/**
+ * Convert DPU temperature from raw values (ADC) to engineering values (K or degree C)
+ * @note used for ADC_TEMP1
+ */
+float convertToTempEngVal_DPU(short Temp_ADC)
+{
+  float X, R, T;
+  float DPU_N5V = -5.0f;
+  float I_const = 5.519e-5;
+  float B = 3418.0f;
+  float R_ref = 10000.0f;
+  float T_ref = 298.15f;
+  
+  X = (float)Temp_ADC;
+
+  /* Get ADC_N5V voltage from Data Pool and convert it to engineering values */
+#ifdef PC_TARGET
+  {
+    short DPU_N5V_RAW;
+    
+    CrIaCopy(ADC_N5V_RAW_ID, &DPU_N5V_RAW);
+    DPU_N5V = convertToVoltEngVal_DPU(DPU_N5V_RAW, ADC_N5V_ID);
+    CrIaPaste(ADC_N5V_ID, &DPU_N5V);
+  }
+#else
+  CrIaCopy(ADC_N5V_ID, &DPU_N5V);
+#endif
+
+  /* Calculate value for resistor R */
+  R = ((((-1)*(2.0f * X * 2.995f) / 8191.0f) - DPU_N5V) / I_const) - 18200.0f;
+
+  /* Check, if R is too small */
+  if (R < 998.413465f)
+    return 373.15f;
+
+  /*DEBUGP("R = %f, R/R_ref = %f, log(R/R_ref) = %f\n", R, R/R_ref, ln(R/R_ref));*/
+
+  /* Calculate temperature T in Kelvin */
+  T = 1 / ((1/B) * logf(R/R_ref) + (1/T_ref));
+
+  return T; /* in Kelvin */
+}
+
+/**
+ * Convert OTA temperature from raw values (ADC) to engineering values (K or degree C)
+ * @note used for ADC_TEMPOH1A ... ADC_TEMPOH4B
+ */
+float convertToTempEngVal(short Temp_ADC, unsigned int thermId)
+{
+  float X, R, T;
+  float DPU_N5V = -5.0f;
+  float I_therm;
+  float B = 3775.0f;
+  float R_ref = 2252.0f;
+  float T_ref = 298.15f;
+  
+  X = (float)Temp_ADC;
+
+  /* Get ADC_N5V voltage from Data Pool and convert it to engineering values */
+#ifdef PC_TARGET  
+  {
+    short DPU_N5V_RAW;
+    
+    CrIaCopy(ADC_N5V_RAW_ID, &DPU_N5V_RAW);
+    DPU_N5V = convertToVoltEngVal_DPU(DPU_N5V_RAW, ADC_N5V_ID);
+    CrIaPaste(ADC_N5V_ID, &DPU_N5V);
+  }
+#else
+  CrIaCopy(ADC_N5V_ID, &DPU_N5V);
+#endif
+  
+  /* Get current I_therm from specific thermistors */
+  I_therm = getIthermFor(thermId);
+
+  /* Calculate value for resistor R */
+  R = ((((-1)*(2.0f * X * 2.995f) / 8191.0f) - DPU_N5V) / I_therm) - 10000.0f;
+
+  /* Check, if R is too small */
+  if (R < 176.750132f)
+    return 373.15f;
+
+  /*DEBUGP("R = %f, R/R_ref = %f, log(R/R_ref) = %f\n", R, R/R_ref, ln(R/R_ref));*/
+
+  /* Calculate temperature T in Kelvin */
+  T = 1 / ((1/B) * logf(R/R_ref) + (1/T_ref));
+
+  return T; /* in Kelvin */
+}
diff --git a/CrIa/src/IfswConversions.h b/CrIa/src/IfswConversions.h
new file mode 100644
index 0000000..791a6e1
--- /dev/null
+++ b/CrIa/src/IfswConversions.h
@@ -0,0 +1,20 @@
+/**
+ * @file IfswConversions.h
+ */
+
+#ifndef IFSWCONVERSIONS_H
+#define IFSWCONVERSIONS_H
+
+#define CONVERT_KTODEGC -273.15f
+
+
+float convertToVoltEngVal_DPU(short Volt_ADC, unsigned int voltId);
+
+float convertToVoltEngVal_PSU(short Volt_ADC, unsigned int voltId);
+
+float convertToTempEngVal_DPU(short Temp_ADC);
+
+float convertToTempEngVal(short Temp_ADC, unsigned int thermId);
+
+
+#endif /* IFSWCONVERSIONS_H */
diff --git a/CrIa/src/IfswDebug.c b/CrIa/src/IfswDebug.c
new file mode 100644
index 0000000..8cf8ca9
--- /dev/null
+++ b/CrIa/src/IfswDebug.c
@@ -0,0 +1,312 @@
+/**
+ * @file IfswDebug.c
+ */
+
+#include "IfswDebug.h"
+
+
+#if (__sparc__)
+
+/**
+ * @file   xen_printf.c
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   November, 2013
+ * @brief  a printf function suitable for use in xentium programs
+ * @brief  There are many like it, but this one is mine!
+ * @note the lack of a cross-processor locking mechanism obviously implies that x_printf and leon printf writes might interfere
+ *
+ * @version 0.0
+ *
+ * @copyright 
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+
+#include <io.h>
+
+#define TSE 0x2
+#define THE 0x4
+
+volatile char *uart1_data  	   = (char *)        0x80000100;
+volatile unsigned int *uart1_stat  = (unsigned int*) 0x80000104;
+static unsigned int writelock;
+
+static void x_putchar(int c)
+{
+
+	/* wait for last byte to be written */
+	while (! ((*uart1_stat) & THE));
+	(*uart1_data) = (0xff & c);
+	/* wait until byte is sent */
+	while (! ((*uart1_stat) & TSE));
+}
+
+static void x_sprintc(int c, char **str)
+{
+	if (str) {
+		(**str) = c;
+		(*str)++;
+	} else {
+		x_putchar(c);
+	}
+}
+
+static unsigned int prints(char **str, const char *p_string, const unsigned int pad_flag, unsigned int pad_width)
+{
+	unsigned int pad_char = ' ';
+
+	unsigned int print_counter = 0;
+	unsigned int string_length = 0;
+
+	const char *p_tmp;
+
+
+	if (pad_width != 0) {
+
+		p_tmp = p_string;
+
+		while (*p_tmp != 0) {
+			string_length++;
+			p_tmp++;
+		}
+
+		if (string_length >= pad_width)
+			pad_width = 0;
+		else
+			pad_width -= string_length;
+
+		if (pad_flag & PAD_ZERO)
+			pad_char = '0';
+	}
+
+	if (!(pad_flag & PAD_RIGHT)) {
+
+		while(pad_width > 0) {
+			x_sprintc(pad_char, str);
+			pad_width--;
+			print_counter++;
+		}
+	}
+
+	while (*p_string != 0) {
+		x_sprintc(*p_string, str);
+		print_counter++;
+	       	p_string++;
+	}
+
+	while (pad_width > 0) {
+		x_sprintc(pad_char, str);
+		print_counter++;
+		pad_width--;
+	}
+
+	return print_counter;
+}
+
+
+#define FIELDSIZE  12 /* fits sign + 32 bit int as char + '\0' */
+
+static int printi(char **str, int input, int base, int sign,
+		  const unsigned int pad_flag, unsigned int pad_width,
+		  int base_letter)
+{
+	int digit;
+	unsigned int print_counter = 0;
+	unsigned int unsigned_input = input;
+	
+	
+	char *p_buffer;
+	char char_buffer[FIELDSIZE];
+
+	
+	/* the integer is zero */
+	if(!input) {
+		char_buffer[0] =  '0';
+		char_buffer[1] = '\0';
+		return prints(str, char_buffer, pad_flag, pad_width);
+	}
+
+	/* point to end of buffer and terminate string */
+	p_buffer = char_buffer + FIELDSIZE-1;
+	*p_buffer = '\0';
+
+
+	/* signed AND negative? */
+	if (sign && (base == 10) && (input < 0)) {
+		unsigned_input = -input;
+	}
+
+	/* shift throught digits and convert to ascii */
+	while (unsigned_input) {
+		p_buffer--;
+		digit       = unsigned_input % base;
+		(*p_buffer) = digit + (digit < 10 ? '0' : base_letter - 10);
+		unsigned_input    /= base;
+	}
+
+	if (sign && (input < 0)) {
+		if (pad_width && (pad_flag & PAD_ZERO)) {
+			x_sprintc('-', str);
+			print_counter++;
+			pad_width--;
+		} else {
+			p_buffer--;
+			(*p_buffer) = '-';
+		}
+	}
+
+	return print_counter + prints(str, p_buffer, pad_flag, pad_width);
+}
+
+static int print(char **str, const char *format, va_list args )
+{
+	unsigned int pad_width;
+	unsigned int pad_flag;
+	unsigned int print_counter = 0;
+
+	char fmt;
+	char *p_tmp;
+	char tmp[2];
+
+	/* parse format string */
+	while ((fmt=*(format++))) {
+		
+		/* normal character */
+		if (fmt != '%') {
+		     if(fmt == 0xa)
+			x_sprintc(0xd, str);
+		     x_sprintc(fmt, str);
+		     print_counter++;
+		} else {
+		/* format specifier found */
+
+			fmt = *(format++);
+			pad_width = pad_flag = 0;
+
+			/* string terminated */
+			if (fmt == '\0')
+				break;
+
+			/* percent sign escaped */
+			if (fmt == '%')	{
+				x_sprintc(fmt, str);
+				print_counter++;
+				continue;
+			}
+
+			if(fmt == '-') {
+				pad_flag = PAD_RIGHT;
+				fmt = *(format++);
+			}
+
+			while (fmt == '0') {
+				pad_flag |= PAD_ZERO;
+				fmt = *(format++);
+			}
+
+			while ((fmt >= '0') && (fmt <= '9')) {
+				pad_width *= 10;
+				pad_width += fmt - '0';
+				fmt = *(format++);
+			}
+
+			switch (fmt) {
+
+				case 's' :
+					p_tmp = va_arg(args, char *);
+					print_counter += prints(str, p_tmp ? p_tmp :"(null)", pad_flag, pad_width);
+					break;
+
+				case 'd' :
+					print_counter += printi(str, va_arg(args, int),   10, 1, pad_flag, pad_width, 'a');
+					break;
+
+				case 'x':
+					print_counter += printi(str, va_arg(args, int), 0x10, 0, pad_flag, pad_width, 'a');
+					break;
+
+				case 'X':
+					print_counter += printi(str, va_arg(args, int), 0x10, 0, pad_flag, pad_width, 'A');
+					break;
+
+				case 'u':
+					print_counter += printi(str, va_arg(args, int),   10, 0, pad_flag, pad_width, 'a');
+					break;
+
+				case 'c':
+					tmp[0] = (char) va_arg(args, int);
+					tmp[1] = '\0';
+					print_counter += prints(str, tmp, pad_flag, pad_width);
+					break;
+				default:
+					/* ignore all invalid */
+					break;
+
+			}
+		}
+	}
+	
+	if (str != 0)
+		**str = '\0';
+
+	va_end(args);
+
+	return print_counter;
+}
+
+
+/**
+ * @brief 'man printf' (mostly)
+ */
+
+int x_printf(const char *format, ...)
+{
+        va_list args;
+        
+        va_start( args, format );
+        return print( 0, format, args );
+}
+
+#define PRINT_TIMEOUT 1000000
+
+int l_printf(const char *format, ...)
+{
+  va_list args;
+  int retval = 0;
+  volatile unsigned int timeout = 0;
+  
+  for (timeout = 0; (ioread32be(&writelock) != 0) && (timeout < PRINT_TIMEOUT); timeout++);
+    
+  if (ioread32be(&writelock) == 0)
+    {
+      iowrite32be(1, &writelock);
+      va_start( args, format );
+      retval = print( 0, format, args );
+      iowrite32be(0, &writelock);
+    }
+  
+  return retval;
+}
+
+
+/**
+ * @brief 'man sprintf' (mostly)
+ */
+
+int x_sprintf(char *str, const char *format, ...)
+{
+        va_list args;
+        
+        va_start( args, format );
+        return print( &str, format, args );
+}
+
+#endif /* sparc */
diff --git a/CrIa/src/IfswDebug.h b/CrIa/src/IfswDebug.h
new file mode 100644
index 0000000..99f02b2
--- /dev/null
+++ b/CrIa/src/IfswDebug.h
@@ -0,0 +1,61 @@
+/**
+ *  @file IfswDebug.h
+ */
+
+#ifndef IFSWDEBUG_H
+#define IFSWDEBUG_H
+
+#if (__sparc__)
+
+#include <stdarg.h>
+
+#define PAD_RIGHT 0x1
+#define PAD_ZERO  0x2
+
+
+int x_printf(const char *format, ...);
+int l_printf(const char *format, ...);
+int x_sprintf(char *str, const char *format, ...);
+
+#else
+#include <stdio.h>
+#define x_printf printf
+#define l_printf printf
+#endif /* __sparc__ */
+
+#ifdef DEBUG
+/* #define DEBUGP(...) l_printf(__VA_ARGS__) */
+#define DEBUGP l_printf
+#else
+/* void DEBUGP(__attribute__ ((unused)) char *a, ...); */
+#define DEBUGP {}if(0)l_printf
+#endif /* DEBUG */
+
+#ifdef PR_DEBUG
+#define PRDEBUGP l_printf
+#else
+#define PRDEBUGP {}if(0)l_printf
+#endif /* PR_DEBUG */
+
+#ifdef MP_DEBUG
+#define MPDEBUGP l_printf
+#else
+#define MPDEBUGP {}if(0)l_printf
+#endif /* MP_DEBUG */
+
+#ifdef ERR_DEBUG
+#define ERRDEBUGP l_printf
+#else
+#define ERRDEBUGP {}if(0)l_printf
+#endif /* ERR_DEBUG */
+
+#ifdef SD_DEBUG
+#define SDDEBUGP l_printf
+#else
+#define SDDEBUGP {}if(0)l_printf
+#endif /* SD_DEBUG */
+
+
+#endif /* IFSWDEBUG_H */
+
+
diff --git a/CrIa/src/IfswMath.c b/CrIa/src/IfswMath.c
new file mode 100644
index 0000000..c54703a
--- /dev/null
+++ b/CrIa/src/IfswMath.c
@@ -0,0 +1,317 @@
+#include "IfswMath.h"
+
+
+#if (__sparc__)
+
+/**
+ * @brief    calculate the square root of a single precision float using the processor-built-in instruction
+ * @param    x the radicand
+ * @returns  the principal square root
+ */
+
+float fsqrts(float x)
+{
+  float y;
+  __asm__("fsqrts %1, %0 \n\t"
+          : "=f" (y)
+          : "f" (x));
+  return y;
+}
+
+
+/**
+ * @brief    calculate the square root of a double precision float using the processor-built-in instruction
+ * @param    x the radicand
+ * @returns  the principal square root
+ */
+
+double fsqrtd(double x)
+{
+  double y;
+  __asm__("fsqrtd %1, %0 \n\t"
+          : "=f" (y)
+          : "f" (x));
+  return y;
+}
+
+/* 
+   from newlib/libm/common/sf_round.c 
+   
+   NOTE: this funny implementation does not make use of the sign bit, but works with signed data
+*/
+
+float roundf(float x)
+{
+  int w;
+  /* Most significant word, least significant word. */
+  int exponent_less_127;
+
+  GET_FLOAT_WORD(w, x);
+  
+  /* Extract exponent field. */
+  exponent_less_127 = ((w & 0x7f800000) >> 23) - 127;
+
+  if (exponent_less_127 < 23)
+    {
+      if (exponent_less_127 < 0)
+        {
+          w &= 0x80000000;
+          if (exponent_less_127 == -1)
+            /* Result is +1.0 or -1.0. */
+            w |= (127 << 23);
+        }
+      else
+        {
+          unsigned int exponent_mask = 0x007fffff >> exponent_less_127;
+          if ((w & exponent_mask) == 0)
+            /* x has an integral value. */
+            return x;
+
+          w += 0x00400000 >> exponent_less_127;
+          w &= ~exponent_mask;
+        }
+    }
+  else
+    {
+      if (exponent_less_127 == 128)
+        /* x is NaN or infinite. */
+        return x + x;
+      else
+        return x;
+    }
+
+  SET_FLOAT_WORD(x, w);
+  return x;
+}
+
+
+
+
+/* from newlib sf_numtest.c */
+int numtestf (float x)
+{
+  int wx; /* was: __int32_t wx; */
+  int exp;
+
+  GET_FLOAT_WORD (wx, x);
+
+  exp = (wx & 0x7f800000) >> 23;
+
+  /* Check for a zero input. */
+  if (x == 0.0)
+    {
+      return (0);
+    }
+
+  /* Check for not a number or infinity. */
+  if (exp == 0x7f8)
+    {
+      if(wx & 0x7fffff)
+        return (NAN);
+      else
+        return (INF);
+    }
+     
+  /* Otherwise it's a finite value. */ 
+  else
+    return (NUM);
+}
+
+
+/* from newlib sf_fabs.c */
+float fabsf (float x)
+{
+  switch (numtestf (x))
+    {
+      case NAN:
+        /* errno = EDOM; */ /* no ERRNO support */
+        return (x);
+      case INF:
+        /* errno = ERANGE; */ /* no ERRNO support */
+        return (x);
+      case 0:
+        return (0.0);
+      default:
+        return (x < 0.0 ? -x : x);
+    }
+}
+
+
+/* from newlib mathcnst.h */
+float  z_rooteps_f = 1.7263349182589107e-4;
+ufloat z_infinity_f = { 0x7f800000 };
+ufloat z_notanum_f  = { 0xffd00000 };
+
+
+/* from newlib sf_asine.c */
+static const float p[] = { 0.933935835, -0.504400557 };
+static const float q[] = { 0.560363004e+1, -0.554846723e+1 };
+static const float a[] = { 0.0, 0.785398163 };
+static const float b[] = { 1.570796326, 0.785398163 };
+
+float asinef (float x, int acosine)
+{
+  int flag, i;
+  int branch = 0;
+  float g, res, R, P, Q, y;
+ 
+  /* Check for special values. */
+  i = numtestf (x);
+  if (i == NAN || i == INF)
+    {
+      /* errno = EDOM; */ /* no ERRNO support */
+      if (i == NAN)
+        return (x);
+      else
+        return (z_infinity_f.f);
+    }
+
+  y = fabsf (x);
+  flag = acosine;
+
+  g = y * y; /* added to calm compiler */
+  res = y; /* added to calm compiler */
+  
+  if (y > 0.5)
+    {
+      i = 1 - flag;
+
+      /* Check for range error. */
+      if (y > 1.0)
+        {
+          /* errno = ERANGE; */ /* no ERRNO support */
+          return (z_notanum_f.f);
+        }
+
+      g = (1 - y) / 2.0;
+      y = -2 * fsqrts (g);
+      branch = 1;
+    }
+  else
+    {
+      i = flag;
+      if (y < z_rooteps_f)
+        res = y;
+      else
+        g = y * y;
+    }
+
+  if (y >= z_rooteps_f || branch == 1)
+    {
+      /* Calculate the Taylor series. */
+      P = (p[1] * g + p[0]) * g;
+      Q = (g + q[1]) * g + q[0];
+      R = P / Q;
+
+      res = y + y * R;
+    }
+
+  /* Calculate asine or acose. */
+  if (flag == 0)
+    {
+      res = (a[i] + res) + a[i];
+      if (x < 0.0)
+        res = -res;
+    }
+  else
+    {
+      if (x < 0.0)
+        res = (b[i] + res) + b[i];
+      else
+        res = (a[i] - res) + a[i];
+    }
+
+  return (res);
+}
+
+
+
+float acosf (float x)
+{
+  return asinef (x, 1);
+}
+
+
+
+static const float la[] = { -0.5527074855 };
+static const float lb[] = { -0.6632718214e+1 };
+static const float lC1 = 0.693145752;
+static const float lC2 = 1.428606820e-06;
+static const float lC3 = 0.4342944819;
+
+float logarithmf (float x, int ten)
+{
+  int N;
+  float f, w, z;
+
+  /* Check for domain error here. */
+  if (x <= 0.0)
+    {
+      /* errno = ERANGE; */ /* no ERRNO support */
+      return (z_notanum_f.f);
+    }
+
+  /* Get the exponent and mantissa where x = f * 2^N. */
+  f = frexpf (x, &N);
+
+  z = f - 0.5;
+
+  if (f > __SQRT_HALF)
+    z = (z - 0.5) / (f * 0.5 + 0.5);
+  else
+    {
+      N--;
+      z /= (z * 0.5 + 0.5);
+    }
+  w = z * z;
+
+  /* Use Newton's method with 4 terms. */
+  z += z * w * (la[0]) / ((w + 1.0) * w + lb[0]);
+
+  if (N != 0)
+    z = (N * lC2 + z) + N * lC1;
+
+  if (ten)
+    z *= lC3;
+
+  return (z);
+}
+
+
+float logf (float x)
+{
+  return logarithmf (x, 0);
+}
+
+
+float frexpf (float d, int *exp)
+{
+  float f;
+  int wf, wd;
+
+  GET_FLOAT_WORD (wd, d);
+
+  /* Get the exponent. */
+  *exp = ((wd & 0x7f800000) >> 23) - 126;
+
+  /* Get the mantissa. */ 
+  wf = wd & 0x7fffff;  
+  wf |= 0x3f000000;
+
+  SET_FLOAT_WORD (f, wf);
+
+  /* Check for special values. */
+  switch (numtestf (f))
+    {
+      case NAN:
+      case INF:
+        /* errno = EDOM; */ /* no ERRNO support */
+        *exp = 0;
+        return (f);
+    }
+
+  return (f);
+}
+
+
+#endif
diff --git a/CrIa/src/IfswMath.h b/CrIa/src/IfswMath.h
new file mode 100644
index 0000000..f62bec5
--- /dev/null
+++ b/CrIa/src/IfswMath.h
@@ -0,0 +1,91 @@
+/**
+ * 
+ */
+
+#ifndef IFSWMATH_H
+#define IFSWMATH_H
+
+
+#if !(__sparc__)
+#include <math.h>
+#endif
+
+
+
+#if (__sparc__)
+
+/* 
+   from newlib/libc/sys/linux/cmath/math_private.h 
+*/
+
+/* A union which permits us to convert between a float and a 32 bit
+   int.  */
+
+typedef union
+{
+  float value;
+  unsigned int word;
+} ieee_float_shape_type;
+
+/* Get a 32 bit int from a float.  */
+
+#define GET_FLOAT_WORD(i,d)                                     \
+do {                                                            \
+  ieee_float_shape_type gf_u;                                   \
+  gf_u.value = (d);                                             \
+  (i) = gf_u.word;                                              \
+} while (0)
+
+/* Set a float from a 32 bit int.  */
+
+#define SET_FLOAT_WORD(d,i)                                     \
+do {                                                            \
+  ieee_float_shape_type sf_u;                                   \
+  sf_u.word = (i);                                              \
+  (d) = sf_u.value;                                             \
+} while (0)
+
+
+
+/* from newlib zmath.h */
+#define NUM 3
+#define NAN 2
+#define INF 1
+#define __SQRT_HALF 0.70710678118654752440
+
+typedef const union
+{
+  long l;
+  float f;
+} ufloat;
+
+
+float fsqrts(float x);
+
+double fsqrtd(double x);
+
+float roundf(float x);
+
+int numtestf (float x);
+
+float fabsf (float x);
+
+float asinef (float x, int acosine);
+
+float acosf (float x);
+
+float logarithmf (float x, int ten);
+
+float logf (float x);
+
+float frexpf (float d, int *exp);
+  
+#else
+#include <math.h>
+#define fsqrts(f) ((float)sqrt(f))
+#define fsqrtd(lf) sqrt(lf)
+#define fln(f) logf(f)
+#endif
+
+
+#endif /* IFSWMATH_H */
diff --git a/CrIa/src/IfswUtilities.c b/CrIa/src/IfswUtilities.c
new file mode 100644
index 0000000..1b4cc7f
--- /dev/null
+++ b/CrIa/src/IfswUtilities.c
@@ -0,0 +1,1197 @@
+/**
+ * @file IfswUtilities.c
+ * @ingroup CrIaIasw
+ * @authors R. Ottensamer and C. Reimers, Institute for Astrophysics, 2015-2016
+ * @date    September, 2016
+ *
+ * @brief Implementation of utility functions used by the IASW.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "IfswDebug.h"
+#include "IfswMath.h"
+#include "IfswUtilities.h"
+#include "IfswConversions.h"
+
+#include "CrIaIasw.h"
+#include "CrFwCmpData.h"
+
+#include <Pckt/CrFwPckt.h>
+#include <OutFactory/CrFwOutFactory.h>
+#include <OutCmp/CrFwOutCmp.h>
+#include <OutLoader/CrFwOutLoader.h>
+#include <CrIaPckt.h>
+#include <Services/General/CrIaParamSetter.h>
+#include <Services/General/CrSemConstants.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <byteorder.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <CrIaPrSm/CrIaSemCreate.h>
+
+/* for fpga_dpu_get_rt_addr */
+#if (__sparc__)
+#include <iwf_fpga.h>
+#endif /* __sparc__ */
+
+/* for verifyAddress */
+#if (__sparc__)
+#include <wrap_malloc.h>
+#else
+unsigned int dummyram[1024*8];
+#define SRAM1_ADDR ((unsigned int) dummyram)
+#define SRAM1_SIZE 0x0
+#define SRAM2_ADDR (((unsigned int)dummyram)+SRAM1_SIZE)
+#define SRAM2_SIZE 0x0
+#define AHBRAM_ADDR (((unsigned int)dummyram)+SRAM2_SIZE)
+#define AHBRAM_SIZE 0x0
+#define FPGA_ADDR (((unsigned int)dummyram)+AHBRAM_SIZE)
+#define FPGA_SIZE 0x0
+#define REG1_ADDR (((unsigned int)dummyram)+FPGA_SIZE)
+#define REG1_SIZE 0x0
+#define REG2_ADDR (((unsigned int)dummyram)+REG1_SIZE)
+#define REG2_SIZE 0x0
+#define SRAM1_FLASH_ADDR 0
+#endif /* __sparc__ */
+
+
+
+#define SWAPABFLOAT(A,B) { if (A > B) { float swaptmp = A; A = B; B = swaptmp; } }
+
+/* NOTE: The caller must make sure that the passed array contains 4 floats */
+void sort4float (float *data)
+{
+  SWAPABFLOAT(data[0], data[1]);
+  SWAPABFLOAT(data[2], data[3]);
+  SWAPABFLOAT(data[0], data[2]);
+  SWAPABFLOAT(data[1], data[3]);
+  SWAPABFLOAT(data[1], data[2]);
+  return;
+}
+
+
+int LTblInit; /* set in CrIaInit to 0 */
+CrIaPcktCrc_t LTbl[256];
+
+CrFwBool_t GetCalculatedCrcFrom(CrFwPckt_t pckt) 
+{
+  CrIaPcktCrc_t CrcCheck;
+  CrFwPcktLength_t len, i;
+  
+  /* Calculate CRC from packet */
+  CrcCheck = 0xFFFF;
+  if (!LTblInit)
+    {
+      InitLtbl(LTbl);
+      LTblInit = 1;
+    }	
+  len = CrFwPcktGetLength(pckt) - sizeof(CrIaPcktCrc_t);
+  for (i=0; i<len; ++i) 
+    {
+      CrcCheck = Crc(pckt[i], CrcCheck, LTbl);
+    }
+  CrcCheck = be16_to_cpu(CrcCheck);
+
+  DEBUGP("CRC calculated from package: %d \n", CrcCheck);
+	
+  return CrcCheck;
+}
+
+/* wrappers for Mantis 1870 */
+unsigned char heater_stat[4] = {0,0,0,0};
+
+/* Mantis 2107: patch the assignment of heaters */
+unsigned char PatchHtr[4] = {HEATER_3,HEATER_4,HEATER_1,HEATER_2};
+
+void CrIaHeaterOn (enum heater htr)
+{
+  heater_stat[htr] = 1;
+
+  fpga_heater_on(PatchHtr[htr]);    
+}
+
+void CrIaHeaterOff (enum heater htr)
+{
+  heater_stat[htr] = 0;
+
+  fpga_heater_off(PatchHtr[htr]);    
+}
+
+unsigned char CrIaHeaterStatus (enum heater htr)
+{
+  /* NOTE: this function reports the software state, not the true hardware state */
+  return heater_stat[htr];
+}
+
+
+unsigned char getHbSem()
+{
+  unsigned char hbSem = 1;
+  unsigned short smState;
+  unsigned short smOperState;
+
+  smOperState = FwSmGetCurStateEmb(smDescSem);
+  smState     = FwSmGetCurState(smDescSem);
+
+  if (smState == CrIaSem_OPER)
+    {
+      if (smOperState != CrIaSem_STANDBY)
+        hbSem = 0;
+    }
+
+  return hbSem;
+}    
+
+
+void PutBit8 (unsigned char value, unsigned int bitOffset, unsigned char *dest)
+{
+  unsigned int bytepos, bitpos;
+  unsigned char destval, mask;
+
+  bytepos = bitOffset >> 3; /* division by 8 */
+  bitpos = bitOffset - 8*bytepos;
+
+  /* shape a mask with the required bit set true */
+  mask = 1 << (7-bitpos);
+
+  /* get the destination byte and clear the bit */
+  destval = dest[bytepos];
+  destval &= ~mask;
+
+  /* set bit if the value was true */
+  if (value)
+    destval |= mask;
+
+  /* write it back */
+  dest[bytepos] = destval;
+
+  return;
+}
+
+/* NOTE: this is very slow. better use PutNBits32 */
+void PutNBits8 (unsigned int value, unsigned int bitOffset, unsigned int nbits, unsigned char *dest)
+{
+  unsigned int i;
+  unsigned char bitvalue;
+
+  for (i=0; i<nbits; i++)
+    {
+      bitvalue = (unsigned char)((value >> (nbits - 1 - i)) & 1);
+      PutBit8 (bitvalue, bitOffset + i, dest);
+    }
+
+  return;
+}
+
+
+unsigned int getHkDataSize (unsigned char sid)
+{
+  unsigned char rdlSid, rdlSlot;
+  unsigned int rdlListId;
+  unsigned short RdlDataItemList[250];
+  unsigned int i, hkPacketSize;
+  
+  /* look for the slot */
+  for (rdlSlot = 0; rdlSlot < RDL_SIZE; rdlSlot++)
+    {
+      CrIaCopyArrayItem(RDLSIDLIST_ID, &rdlSid, rdlSlot);
+      if (sid == rdlSid)
+	break;
+    }
+
+  /* sid not found in list */
+  if (rdlSlot == RDL_SIZE)
+    {
+      DEBUGP("SID %d not found!\n", sid);
+      return 0;
+    }
+  
+  /* get the data pool handle of the list */ 
+  switch (rdlSlot)
+    {
+    case 0:
+      rdlListId = RDLDATAITEMLIST_0_ID;
+      break;
+    case 1:
+      rdlListId = RDLDATAITEMLIST_1_ID;
+      break;
+    case 2:
+      rdlListId = RDLDATAITEMLIST_2_ID;
+      break;
+    case 3:
+      rdlListId = RDLDATAITEMLIST_3_ID;
+      break;
+    case 4:
+      rdlListId = RDLDATAITEMLIST_4_ID;
+      break;
+    case 5:
+      rdlListId = RDLDATAITEMLIST_5_ID;
+      break;
+    case 6:
+      rdlListId = RDLDATAITEMLIST_6_ID;
+      break;
+    case 7:
+      rdlListId = RDLDATAITEMLIST_7_ID;
+      break;
+    case 8:
+      rdlListId = RDLDATAITEMLIST_8_ID;
+      break;
+    case 9:
+      rdlListId = RDLDATAITEMLIST_9_ID;
+      break;
+    default :
+      /* cannot be reached, because we have only 10 RDLs */
+      return 0;
+    }      
+  
+  /* get list */
+  CrIaCopy(rdlListId, RdlDataItemList);
+  
+  /* add up size of that list items */
+  hkPacketSize = OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1 + 2; /* PUS header, SID and CRC */
+  
+  for (i=0; i < RD_MAX_ITEMS; i++)
+    {
+      if (RdlDataItemList[i] == 0)
+	break;
+      
+      hkPacketSize += (GetDataPoolMult((unsigned int)RdlDataItemList[i]) * GetDataPoolSize((unsigned int)RdlDataItemList[i]));
+    }
+
+  return hkPacketSize;
+}
+
+
+unsigned short getSemAnoEvtId(unsigned short eventId)
+{
+  switch (eventId)
+    {
+    case CRSEM_SERV5_EVENT_WAR_EEPROM_NO_SEGMENT: /* 42204 */
+      return 1;
+    case CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_EXE: /* 42205 */
+      return 2;
+    case CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_CFG: /* 42206 */
+      return 3;
+    case CRSEM_SERV5_EVENT_WAR_EEPROM_NO_PBS_CFG: /* 42207 */
+      return 4;
+    case CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_EXE_FLAG: /* 42208 */
+      return 5;
+    case CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_CFG_FLAG: /* 42209 */
+      return 6;
+    case CRSEM_SERV5_EVENT_WAR_NO_THERMAL_STABILITY: /* 42214 */
+      return 7;
+    case CRSEM_SERV5_EVENT_WAR_FPA_TEMP_TOO_HIGH: /* 42215 */
+      return 8;
+    case CRSEM_SERV5_EVENT_WAR_WRONG_EXPOSURE_TIME: /* 42216 */
+      return 9;
+    case CRSEM_SERV5_EVENT_WAR_WRONG_REPETITION_PERIOD: /* 42217 */
+      return 10;
+    case CRSEM_SERV5_EVENT_ERR_EEPROM_WRITE_ERROR: /* 43800 */
+      return 11;
+    case CRSEM_SERV5_EVENT_ERR_APS_BOOT_FAILURE: /* 43801 */
+      return 12;
+    case CRSEM_SERV5_EVENT_ERR_UNEXPECTED_REBOOT: /* 43802 */
+      return 13;
+    case CRSEM_SERV5_EVENT_ERR_WATCHDOG_FAILURE: /* 43813 */
+      return 14;
+    case CRSEM_SERV5_EVENT_ERR_CMD_SPW_RX_ERROR: /* 43814 */
+      return 15;
+    case CRSEM_SERV5_EVENT_ERR_EEPROM_EXE_SEG_COPY_ABORT: /* 43815 */
+      return 16;
+    case CRSEM_SERV5_EVENT_ERR_EEPROM_EXE_SEG_CRC_WRONG: /* 43816 */
+      return 17;
+    case CRSEM_SERV5_EVENT_ERR_EEPROM_PBS_CFG_SIZE_WRONG: /* 43817 */
+      return 18;
+    case CRSEM_SERV5_EVENT_ERR_WRITING_REGISTER_FAILED: /* 43818 */
+      return 19;
+    case CRSEM_SERV5_EVENT_ERR_CMD_BUFFER_1_FULL: /* 43819 */
+      return 20;
+    case CRSEM_SERV5_EVENT_ERR_CMD_BUFFER_2_FULL: /* 43820 */
+      return 21;
+    case CRSEM_SERV5_EVT_ERR_DAT_DMA: /* 43821 */
+      return 22;
+    case CRSEM_SERV5_EVT_WAR_PATTER: /* 42218 */
+      return 23;
+    case CRSEM_SERV5_EVT_WAR_PACKWR: /* 42219 */
+      return 24;
+    case CRSEM_SERV5_EVT_ERR_BIAS_SET: /* 43822 */
+      return 25;
+    case CRSEM_SERV5_EVT_ERR_SYNC: /* 43823 */
+      return 26;
+    case CRSEM_SERV5_EVT_ERR_SCRIPT: /* 43824 */
+      return 27;
+    case CRSEM_SERV5_EVT_ERR_PWR: /* 43825 */
+      return 28;
+    case CRSEM_SERV5_EVT_ERR_SPW_TC: /* 43826 */
+      return 29;
+    default:
+      DEBUGP("ERR: Event %d has not been in the list, using 0!\n", eventId);
+      break;
+    }
+
+  return 0; /* all unknown events have index 0 */
+}
+
+
+unsigned short checkDpuHkLimits()
+{
+  float lowerLimitFloat, upperLimitFloat;
+  float valueFloat;
+  short valueShort;
+  unsigned short limitCnt = 0;
+  unsigned short evt_data[2];
+  
+  /* get ADC_P3V3 limit */
+  CrIaCopy(ADC_P3V3_U_ID, &upperLimitFloat);
+  /* get ADC_P3V3 value */
+  CrIaCopy(ADC_P3V3_ID, &valueFloat);
+  if (valueFloat > upperLimitFloat)
+    {
+      limitCnt += 1;  
+      /* send event report OOL */
+      evt_data[0] = 0; /* IDs fit in 16 bit */
+      evt_data[1] = ADC_P3V3_ID;
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OOL_PARAM, evt_data, 4);       
+    }
+
+  /* get ADC_P5V limit */
+  CrIaCopy(ADC_P5V_U_ID, &upperLimitFloat);
+  /* get ADC_P5V value */
+  CrIaCopy(ADC_P5V_ID, &valueFloat);
+  if (valueFloat > upperLimitFloat)
+    {
+      limitCnt += 1;
+      /* send event report OOL */
+      evt_data[0] = 0; /* IDs fit in 16 bit */
+      evt_data[1] = ADC_P5V_ID;
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OOL_PARAM, evt_data, 4); 
+    }
+
+  /* get ADC_P1V8 limit */
+  CrIaCopy(ADC_P1V8_U_ID, &upperLimitFloat);
+  /* get ADC_P1V8 value */
+  CrIaCopy(ADC_P1V8_ID, &valueFloat);
+  if (valueFloat > upperLimitFloat)
+    {
+      limitCnt += 1;
+      /* send event report OOL */
+      evt_data[0] = 0; /* IDs fit in 16 bit */
+      evt_data[1] = ADC_P1V8_ID;
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OOL_PARAM, evt_data, 4); 
+    }
+
+  /* get ADC_P2V5 limit */
+  CrIaCopy(ADC_P2V5_U_ID, &upperLimitFloat);
+  /* get ADC_P2V5 value */
+  CrIaCopy(ADC_P2V5_ID, &valueFloat);
+  if (valueFloat > upperLimitFloat)
+    {
+      limitCnt += 1;
+      /* send event report OOL */
+      evt_data[0] = 0; /* IDs fit in 16 bit */
+      evt_data[1] = ADC_P2V5_ID;
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OOL_PARAM, evt_data, 4); 
+    }
+
+  /* get ADC_N5V limit */
+  CrIaCopy(ADC_N5V_L_ID, &lowerLimitFloat);
+  /* get ADC_N5V value */
+  CrIaCopy(ADC_N5V_ID, &valueFloat);
+  if (valueFloat < lowerLimitFloat)
+    {
+      limitCnt += 1;
+      /* send event report OOL */
+      evt_data[0] = 0; /* IDs fit in 16 bit */
+      evt_data[1] = ADC_N5V_ID;
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OOL_PARAM, evt_data, 4); 
+    }
+
+  /* get ADC_PGND limits */
+  CrIaCopy(ADC_PGND_U_ID, &upperLimitFloat);
+  /* Mantis 2206: Missing Lower Limit Check for ADC_PGND */
+  CrIaCopy(ADC_PGND_L_ID, &lowerLimitFloat);
+  /* get ADC_PGND value */
+  CrIaCopy(ADC_PGND_ID, &valueFloat);
+  if (valueFloat > upperLimitFloat)
+    {
+      limitCnt += 1;
+      /* send event report OOL */
+      evt_data[0] = 0; /* IDs fit in 16 bit */
+      evt_data[1] = ADC_PGND_ID;
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OOL_PARAM, evt_data, 4); 
+    }
+  if (valueFloat < lowerLimitFloat)
+    {
+      limitCnt += 1;
+      /* send event report OOL */
+      evt_data[0] = 0; /* IDs fit in 16 bit */
+      evt_data[1] = ADC_PGND_ID;
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OOL_PARAM, evt_data, 4); 
+    }
+
+  /* get ADC_TEMPOH1A limit */
+  CrIaCopy(ADC_TEMPOH1A_U_ID, &upperLimitFloat); /* engineering value */
+  /* get ADC_TEMPOH1A value */
+  CrIaCopy(ADC_TEMPOH1A_RAW_ID, &valueShort); /* raw value */
+  if (convertToTempEngVal(valueShort, ADC_TEMPOH1A_ID) + CONVERT_KTODEGC > upperLimitFloat)
+    {
+      limitCnt += 1;
+      /* send event report OOL */
+      evt_data[0] = 0; /* IDs fit in 16 bit */
+      evt_data[1] = ADC_TEMPOH1A_ID;
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OOL_PARAM, evt_data, 4); 
+    }
+
+  /* get ADC_TEMP1 limit */
+  CrIaCopy(ADC_TEMP1_U_ID, &upperLimitFloat); /* engineering value */
+  /* get ADC_TEMP1 value */
+  CrIaCopy(ADC_TEMP1_RAW_ID, &valueShort); /* raw value */
+  if (convertToTempEngVal_DPU(valueShort) + CONVERT_KTODEGC > upperLimitFloat)
+    {
+      limitCnt += 1;
+      /* send event report OOL */
+      evt_data[0] = 0; /* IDs fit in 16 bit */
+      evt_data[1] = ADC_TEMP1_ID;
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OOL_PARAM, evt_data, 4); 
+    }
+
+  /* get ADC_TEMPOH2A limit */
+  CrIaCopy(ADC_TEMPOH2A_U_ID, &upperLimitFloat); /* engineering value */
+  /* get ADC_TEMPOH2A value */
+  CrIaCopy(ADC_TEMPOH2A_RAW_ID, &valueShort); /* raw value */
+  if (convertToTempEngVal(valueShort, ADC_TEMPOH2A_ID) + CONVERT_KTODEGC > upperLimitFloat)
+    {
+      limitCnt += 1;
+      /* send event report OOL */
+      evt_data[0] = 0; /* IDs fit in 16 bit */
+      evt_data[1] = ADC_TEMPOH2A_ID;
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OOL_PARAM, evt_data, 4); 
+    }
+
+  /* get ADC_TEMPOH1B limit */
+  CrIaCopy(ADC_TEMPOH1B_U_ID, &upperLimitFloat); /* engineering value */
+  /* get ADC_TEMPOH1B value */
+  CrIaCopy(ADC_TEMPOH1B_RAW_ID, &valueShort); /* raw value */
+  if (convertToTempEngVal(valueShort, ADC_TEMPOH1B_ID) + CONVERT_KTODEGC > upperLimitFloat)
+    {
+      limitCnt += 1;
+      /* send event report OOL */
+      evt_data[0] = 0; /* IDs fit in 16 bit */
+      evt_data[1] = ADC_TEMPOH1B_ID;
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OOL_PARAM, evt_data, 4); 
+    }
+
+  /* get ADC_TEMPOH3A limit */
+  CrIaCopy(ADC_TEMPOH3A_U_ID, &upperLimitFloat); /* engineering value */
+  /* get ADC_TEMPOH3A value */
+  CrIaCopy(ADC_TEMPOH3A_RAW_ID, &valueShort); /* raw value */
+  if (convertToTempEngVal(valueShort, ADC_TEMPOH3A_ID) + CONVERT_KTODEGC > upperLimitFloat)
+    {
+      limitCnt += 1;
+      /* send event report OOL */
+      evt_data[0] = 0; /* IDs fit in 16 bit */
+      evt_data[1] = ADC_TEMPOH3A_ID;
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OOL_PARAM, evt_data, 4); 
+    }
+
+  /* get ADC_TEMPOH2B limit */
+  CrIaCopy(ADC_TEMPOH2B_U_ID, &upperLimitFloat); /* engineering value */
+  /* get ADC_TEMPOH2B value */
+  CrIaCopy(ADC_TEMPOH2B_RAW_ID, &valueShort); /* raw value */
+  if (convertToTempEngVal(valueShort, ADC_TEMPOH2B_ID) + CONVERT_KTODEGC > upperLimitFloat)
+    {
+      limitCnt += 1;
+      /* send event report OOL */
+      evt_data[0] = 0; /* IDs fit in 16 bit */
+      evt_data[1] = ADC_TEMPOH2B_ID;
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OOL_PARAM, evt_data, 4); 
+    }
+
+  /* get ADC_TEMPOH4A limit */
+  CrIaCopy(ADC_TEMPOH4A_U_ID, &upperLimitFloat); /* engineering value */
+  /* get ADC_TEMPOH4A value */
+  CrIaCopy(ADC_TEMPOH4A_RAW_ID, &valueShort); /* raw value */
+  if (convertToTempEngVal(valueShort, ADC_TEMPOH4A_ID) + CONVERT_KTODEGC > upperLimitFloat)
+    {
+      limitCnt += 1;
+      /* send event report OOL */
+      evt_data[0] = 0; /* IDs fit in 16 bit */
+      evt_data[1] = ADC_TEMPOH4A_ID;
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OOL_PARAM, evt_data, 4); 
+    }
+
+  /* get ADC_TEMPOH3B limit */
+  CrIaCopy(ADC_TEMPOH3B_U_ID, &upperLimitFloat); /* engineering value */
+  /* get ADC_TEMPOH3B value */
+  CrIaCopy(ADC_TEMPOH3B_RAW_ID, &valueShort); /* raw value */
+  if (convertToTempEngVal(valueShort, ADC_TEMPOH3B_ID) + CONVERT_KTODEGC > upperLimitFloat)
+    {
+      limitCnt += 1;
+      /* send event report OOL */
+      evt_data[0] = 0; /* IDs fit in 16 bit */
+      evt_data[1] = ADC_TEMPOH3B_ID;
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OOL_PARAM, evt_data, 4); 
+    }
+
+  /* get ADC_TEMPOH4B limit */
+  CrIaCopy(ADC_TEMPOH4B_U_ID, &upperLimitFloat); /* engineering value */
+  /* get ADC_TEMPOH4B value */
+  CrIaCopy(ADC_TEMPOH4B_RAW_ID, &valueShort); /* raw value */
+  if (convertToTempEngVal(valueShort, ADC_TEMPOH4B_ID) + CONVERT_KTODEGC > upperLimitFloat)
+    {
+      limitCnt += 1;
+      /* send event report OOL */
+      evt_data[0] = 0; /* IDs fit in 16 bit */
+      evt_data[1] = ADC_TEMPOH4B_ID;
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OOL_PARAM, evt_data, 4); 
+    }
+
+  /* get SEM_P15V limit */
+  CrIaCopy(SEM_P15V_U_ID, &upperLimitFloat);
+  /* get SEM_P15V value */
+  CrIaCopy(SEM_P15V_ID, &valueFloat);
+  if (valueFloat > upperLimitFloat)
+    {
+      limitCnt += 1;
+      /* send event report OOL */
+      evt_data[0] = 0; /* IDs fit in 16 bit */
+      evt_data[1] = SEM_P15V_ID;
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OOL_PARAM, evt_data, 4); 
+    }
+
+  /* get SEM_P30V limit */
+  CrIaCopy(SEM_P30V_U_ID, &upperLimitFloat);
+  /* get SEM_P30V value */
+  CrIaCopy(SEM_P30V_ID, &valueFloat);
+  if (valueFloat > upperLimitFloat)
+    {
+      limitCnt += 1;
+      /* send event report OOL */
+      evt_data[0] = 0; /* IDs fit in 16 bit */
+      evt_data[1] = SEM_P30V_ID;
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OOL_PARAM, evt_data, 4); 
+    }
+
+  /* get SEM_P5V0 limit */
+  CrIaCopy(SEM_P5V0_U_ID, &upperLimitFloat);
+  /* get SEM_P5V0 value */
+  CrIaCopy(SEM_P5V0_ID, &valueFloat);
+  if (valueFloat > upperLimitFloat)
+    {
+      limitCnt += 1;
+      /* send event report OOL */
+      evt_data[0] = 0; /* IDs fit in 16 bit */
+      evt_data[1] = SEM_P5V0_ID;
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OOL_PARAM, evt_data, 4); 
+    }
+
+  /* get SEM_P7V0 limit */
+  CrIaCopy(SEM_P7V0_U_ID, &upperLimitFloat);
+  /* get SEM_P7V0 value */
+  CrIaCopy(SEM_P7V0_ID, &valueFloat);
+  if (valueFloat > upperLimitFloat)
+    {
+      limitCnt += 1;
+      /* send event report OOL */
+      evt_data[0] = 0; /* IDs fit in 16 bit */
+      evt_data[1] = SEM_P7V0_ID;
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OOL_PARAM, evt_data, 4); 
+    }
+
+  /* get SEM_N5V0 limit */
+  CrIaCopy(SEM_N5V0_L_ID, &lowerLimitFloat);
+  /* get SEM_N5V0 value */
+  CrIaCopy(SEM_N5V0_ID, &valueFloat);
+  if (valueFloat < lowerLimitFloat)
+    {
+      limitCnt += 1;
+      /* send event report OOL */
+      evt_data[0] = 0; /* IDs fit in 16 bit */
+      evt_data[1] = SEM_N5V0_ID;
+      CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OOL_PARAM, evt_data, 4); 
+    }
+
+  return limitCnt;
+}
+
+
+unsigned short checkResources()
+{
+  float maxLoad;
+  float wcet_1, wcet_2, wcet_3;
+  float maxMem;
+  unsigned char NofAllocatedInCmd, MaxNOfInCmd, NofAllocatedInRep, MaxNOfInRep, NOfAllocatedOutCmp, MaxNOfOutCmp;
+  unsigned char Sem_NOfPendingInCmp, Sem_PCRLSize, GrdObc_NOfPendingInCmp, GrdObc_PCRLSize;
+  unsigned char OutMg1_NOfPendingOutCmp, OutMg1_POCLSize, OutMg2_NOfPendingOutCmp, OutMg2_POCLSize;
+  unsigned char OutMg3_NOfPendingOutCmp, OutMg3_POCLSize;
+  unsigned short InSem_NOfPendingPckts;
+  unsigned char InSem_PcktQueueSize;
+  unsigned char InObc_NOfPendingPckts, InObc_PcktQueueSize, InGrd_NOfPendingPckts, InGrd_PcktQueueSize;
+  unsigned char OutSem_NOfPendingPckts, OutSem_PcktQueueSize, OutObc_NOfPendingPckts, OutObc_PcktQueueSize;
+  unsigned char OutGrd_NOfPendingPckts, OutGrd_PcktQueueSize;
+
+  /* check, if CPU usage on core 1 exceeds CPU1_USAGE_MAX of available CPU */
+  CrIaCopy(CPU1_USAGE_MAX_ID, &maxLoad);
+
+  CrIaCopy(WCET_1_ID, &wcet_1);
+  CrIaCopy(WCET_2_ID, &wcet_2);
+  CrIaCopy(WCET_3_ID, &wcet_3);
+
+  if ((wcet_1 + wcet_2 + wcet_3) > maxLoad * 0.125f)
+    return 1;
+  
+  /* check, if dynamically allocated memory exceeds MEM_USAGE_MAX of available memory */  
+
+  /* NOTE: with our malloc wrapper we cannot allocate more memory than the size of the heaps, so this check will never fail */
+
+  CrIaCopy(MEM_USAGE_MAX_ID, &maxMem);
+
+  CrIaCopy(NOFALLOCATEDINCMD_ID, &NofAllocatedInCmd);
+  CrIaCopy(MAXNOFINCMD_ID, &MaxNOfInCmd);
+  CrIaCopy(NOFALLOCATEDINCMD_ID, &NofAllocatedInRep);
+  CrIaCopy(MAXNOFINCMD_ID, &MaxNOfInRep);
+  CrIaCopy(NOFALLOCATEDOUTCMP_ID, &NOfAllocatedOutCmp);
+  CrIaCopy(MAXNOFOUTCMP_ID, &MaxNOfOutCmp);
+  CrIaCopy(SEM_NOFPENDINGINCMP_ID, &Sem_NOfPendingInCmp);
+  CrIaCopy(SEM_PCRLSIZE_ID, &Sem_PCRLSize);
+  CrIaCopy(GRDOBC_NOFPENDINGINCMP_ID, &GrdObc_NOfPendingInCmp);
+  CrIaCopy(GRDOBC_PCRLSIZE_ID, &GrdObc_PCRLSize);
+  CrIaCopy(OUTMG1_NOFPENDINGOUTCMP_ID, &OutMg1_NOfPendingOutCmp);
+  CrIaCopy(OUTMG1_POCLSIZE_ID, &OutMg1_POCLSize);
+  CrIaCopy(OUTMG2_NOFPENDINGOUTCMP_ID, &OutMg2_NOfPendingOutCmp);
+  CrIaCopy(OUTMG2_POCLSIZE_ID, &OutMg2_POCLSize);
+  CrIaCopy(OUTMG3_NOFPENDINGOUTCMP_ID, &OutMg3_NOfPendingOutCmp);
+  CrIaCopy(OUTMG3_POCLSIZE_ID, &OutMg3_POCLSize);
+  CrIaCopy(INSEM_NOFPENDINGPCKTS_ID, &InSem_NOfPendingPckts);
+  CrIaCopy(INSEM_PCKTQUEUESIZE_ID, &InSem_PcktQueueSize);
+  CrIaCopy(INOBC_NOFPENDINGPCKTS_ID, &InObc_NOfPendingPckts);
+  CrIaCopy(INOBC_PCKTQUEUESIZE_ID, &InObc_PcktQueueSize);
+  CrIaCopy(INGRD_NOFPENDINGPCKTS_ID, &InGrd_NOfPendingPckts);
+  CrIaCopy(INGRD_PCKTQUEUESIZE_ID, &InGrd_PcktQueueSize);
+  CrIaCopy(OUTSEM_NOFPENDINGPCKTS_ID, &OutSem_NOfPendingPckts);
+  CrIaCopy(OUTSEM_PCKTQUEUESIZE_ID, &OutSem_PcktQueueSize);
+  CrIaCopy(OUTOBC_NOFPENDINGPCKTS_ID, &OutObc_NOfPendingPckts);
+  CrIaCopy(OUTOBC_PCKTQUEUESIZE_ID, &OutObc_PcktQueueSize);
+  CrIaCopy(OUTGRD_NOFPENDINGPCKTS_ID, &OutGrd_NOfPendingPckts);
+  CrIaCopy(OUTGRD_PCKTQUEUESIZE_ID, &OutGrd_PcktQueueSize);
+
+  if (((float)NofAllocatedInCmd / (float)MaxNOfInCmd > maxMem) || /* Check number of command packets allocated by InFactory */
+      ((float)NofAllocatedInRep / (float)MaxNOfInRep > maxMem) || /* Check number of report packets allocated by InFactory */
+      ((float)NOfAllocatedOutCmp / (float)MaxNOfOutCmp > maxMem) || /* Check number of command and report packets allocated by OutFactory */
+      ((float)Sem_NOfPendingInCmp / (float)Sem_PCRLSize > maxMem) || /* Check number of pending commands in InManagerSem */
+      ((float)GrdObc_NOfPendingInCmp / (float)GrdObc_PCRLSize > maxMem) || /* Check number of pending commands in InManagerGrdObc */
+      ((float)OutMg1_NOfPendingOutCmp / (float)OutMg1_POCLSize > maxMem) || /* Check number of pending out-going reports in OutManager1 */
+      ((float)OutMg2_NOfPendingOutCmp / (float)OutMg2_POCLSize > maxMem) || /* Check number of pending out-going reports in OutManager2 */
+      ((float)OutMg3_NOfPendingOutCmp / (float)OutMg3_POCLSize > maxMem) || /* Check number of pending out-going reports in OutManager3 */
+      ((float)InSem_NOfPendingPckts / (float)InSem_PcktQueueSize > maxMem) || /* Check number of pending packets in InStreamSem */
+      ((float)InObc_NOfPendingPckts / (float)InObc_PcktQueueSize > maxMem) || /* Check number of pending packets in InStreamObc */
+      ((float)InGrd_NOfPendingPckts / (float)InGrd_PcktQueueSize > maxMem) || /* Check number of pending packets in InStreamSem */
+      ((float)OutSem_NOfPendingPckts / (float)OutSem_PcktQueueSize > maxMem) || /* Check number of pending packets in OutStreamSem */
+      ((float)OutObc_NOfPendingPckts / (float)OutObc_PcktQueueSize > maxMem) || /* Check number of pending packets in OutStreamObc */
+      ((float)OutGrd_NOfPendingPckts / (float)OutGrd_PcktQueueSize > maxMem)) /* Check number of pending packets in OutStreamGrd */
+    return 1;
+
+  return 0;
+}
+
+
+unsigned long areaIdToAddress (unsigned short fbfRamAreaId, unsigned int fbfRamAddr)
+{
+  unsigned short sdbstate;
+  unsigned short group, member;
+  unsigned short nfull, nwin, sizefull, sizewin;
+  
+  if (fbfRamAreaId == AREAID_RAMADDR)
+    {
+      return fbfRamAddr;
+    }
+
+ if (fbfRamAreaId == AREAID_SDU4)
+   {
+     return (unsigned long)SRAM1_FLASH_ADDR;
+   }
+
+ /* the remaining possible IDs are in ranges 100.. , 200.. , 300.. */
+ group = fbfRamAreaId / 100;
+ group *= 100;
+ member = fbfRamAreaId - group;
+
+ CrIaCopy(SDBSTATE_ID, &sdbstate);
+ 
+ if (group == AREAID_SIB)
+   {
+     if (sdbstate == CrIaSdb_CONFIG_FULL)
+       {
+	 CrIaCopy(SIBNFULL_ID, &nfull);
+	 CrIaCopy(SIBSIZEFULL_ID, &sizefull);
+
+	 if (member < nfull)
+	   {
+	     return (unsigned long)((unsigned int)sibAddressFull + (member * sizefull * 1024));
+	   }
+	 else
+	   {
+	     return 0;
+	   }	 	 
+       }
+
+     if (sdbstate == CrIaSdb_CONFIG_WIN)
+       {
+	 CrIaCopy(SIBNWIN_ID, &nwin);
+	 CrIaCopy(SIBSIZEWIN_ID, &sizewin);
+
+	 if (member < nwin)
+	   {
+	     return (unsigned long)((unsigned int)sibAddressWin + (member * sizewin * 1024));
+	   }
+	 else
+	   {
+	     return 0;
+	   }	 	 
+       }     
+   }
+
+ if (group == AREAID_CIB)
+   {
+     if (sdbstate == CrIaSdb_CONFIG_FULL)
+       {
+	 CrIaCopy(CIBNFULL_ID, &nfull);
+	 CrIaCopy(CIBSIZEFULL_ID, &sizefull);
+
+	 if (member < nfull)
+	   {
+	     return (unsigned long)((unsigned int)cibAddressFull + (member * sizefull * 1024));
+	   }
+	 else
+	   {
+	     return 0;
+	   }	 	 
+       }
+
+     if (sdbstate == CrIaSdb_CONFIG_WIN)
+       {
+	 CrIaCopy(CIBNWIN_ID, &nwin);
+	 CrIaCopy(CIBSIZEWIN_ID, &sizewin);
+
+	 if (member < nwin)
+	   {
+	     return (unsigned long)((unsigned int)cibAddressWin + (member * sizewin * 1024));
+	   }
+	 else
+	   {
+	     return 0;
+	   }	 	 
+       }     
+   }
+ 
+   if (group == AREAID_GIB)
+   {
+     CrIaCopy(GIBNFULL_ID, &nfull);
+     CrIaCopy(GIBSIZEFULL_ID, &sizefull);
+     CrIaCopy(GIBNWIN_ID, &nwin);
+     CrIaCopy(GIBSIZEWIN_ID, &sizewin);
+
+     /* the ith GIB is a full frame */
+     if (member < nfull)
+       {
+	 return (unsigned long)((unsigned int)gibAddressFull + (member * sizefull * 1024));
+       }
+     
+     /* the ith GIB is a window */
+     if (member < nfull + nwin)
+       {
+	 return (unsigned long)((unsigned int)gibAddressWin + ((member-nfull) * sizewin * 1024));
+       }
+     else
+       {
+	 return 0;
+       }
+   }
+   
+   return 0;
+}
+
+
+unsigned short verifyAddress (unsigned int addrVal)
+{
+  /* within SRAM_1 */
+  if ((addrVal >= SRAM1_ADDR) && (addrVal < SRAM1_ADDR + SRAM1_SIZE))
+    return ADDRID_SRAM1; 
+
+  /* within SRAM_2 */
+  if ((addrVal >= SRAM2_ADDR) && (addrVal < SRAM2_ADDR + SRAM2_SIZE))
+    return ADDRID_SRAM2; 
+  
+  /* within SRAM_2, but alternate addressing */
+  if (addrVal <= SRAM2_SIZE)
+    return ADDRID_SRAM2ALT; 
+  
+  /* within AHB_RAM */
+  if ((addrVal >= AHBRAM_ADDR) && (addrVal < AHBRAM_ADDR + AHBRAM_SIZE))
+    return ADDRID_AHBRAM; 
+
+  /* within FPGA */
+  if ((addrVal >= FPGA_ADDR) && (addrVal < FPGA_ADDR + FPGA_SIZE))
+    return ADDRID_FPGA; 
+
+  /* within REGISTERS */
+  if ((addrVal >= REG1_ADDR) && (addrVal < REG1_ADDR + REG1_SIZE))
+    return ADDRID_REG1;
+  
+  if ((addrVal >= REG2_ADDR) && (addrVal < REG2_ADDR + REG2_SIZE))
+    return ADDRID_REG2;     
+
+  /* invalid address */
+  return ADDRID_INVALID; 
+}
+
+
+unsigned short cvtAddrIdToRamId (unsigned short addr_id)
+{
+  switch (addr_id)
+    {
+    case ADDRID_SRAM1 :
+    case ADDRID_SRAM2 :
+    case ADDRID_SRAM2ALT :
+      return DPU_RAM;
+
+    case ADDRID_AHBRAM :
+      return DPU_INTERNAL;
+      
+    case ADDRID_FPGA : 
+    case ADDRID_REG1 :
+    case ADDRID_REG2 :
+      return DPU_REGISTER; 
+      
+    case ADDRID_INVALID :
+    default :
+      break;
+    }
+  
+  return 0;
+}
+
+
+void SendTcAccRepSucc(CrFwPckt_t pckt)
+{
+  FwSmDesc_t rep;
+  CrFwDestSrc_t source;
+  CrFwBool_t isAcceptAck;
+  unsigned char sid, tcType, tcSubtype;
+  unsigned short tcPacketId, tcPacketSeqCtrl, tcLength, tcReceivedBytes, tcReceivedCrc, tcCalculatedCrc, tcFailureCode, nofTcAcc, seqCntLastAccTc;
+  
+  CRIA_UNUSED(tcFailureCode);
+  CRIA_UNUSED(tcCalculatedCrc);
+  CRIA_UNUSED(tcReceivedCrc);
+  CRIA_UNUSED(tcReceivedBytes);
+  CRIA_UNUSED(tcLength);
+  CRIA_UNUSED(tcSubtype);
+  CRIA_UNUSED(tcType);
+  CRIA_UNUSED(sid);
+  CRIA_UNUSED(sid);
+  CRIA_UNUSED(tcSubtype);
+  CRIA_UNUSED(tcType);
+  CRIA_UNUSED(tcSubtype);
+  CRIA_UNUSED(tcType);
+  CRIA_UNUSED(sid);
+
+  source = CrFwPcktGetSrc(pckt);
+  DEBUGP("SendTcAccRepSucc: source = %d\n", source);
+
+  CrIaCopy(NOFTCACC_ID, &nofTcAcc);
+  nofTcAcc += 1;
+  CrIaPaste(NOFTCACC_ID, &nofTcAcc);
+
+  seqCntLastAccTc = CrFwPcktGetSeqCnt(pckt);
+
+  if (source==CR_FW_CLIENT_GRD)
+    {
+      CrIaPaste(SEQCNTLASTACCTCFROMGRD_ID, &seqCntLastAccTc);
+      DEBUGP("SendTcAccRepSucc: set SeqCntLastAccTcFromGrd = %d\n", seqCntLastAccTc);
+    }
+  else if (source==CR_FW_CLIENT_OBC)
+    {
+      CrIaPaste(SEQCNTLASTACCTCFROMOBC_ID, &seqCntLastAccTc);
+      DEBUGP("SendTcAccRepSucc: set SeqCntLastAccTcFromObc = %d\n", seqCntLastAccTc);
+    }
+    
+  isAcceptAck = CrFwPcktIsAcceptAck(pckt);
+  
+  if (isAcceptAck==1)
+    {
+      /* send (1,1) TC acceptance report - success */
+      /* Create out component */
+      rep = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRIA_SERV1, CRIA_SERV1_ACC_SUCC, 0, 0);
+      if (rep == NULL) 
+	{
+          /* handled by Resource FdCheck */
+	  return;
+	}
+      
+      /* Set out component parameters */
+      tcPacketId = CrIaPcktGetPacketId(pckt);
+      CrIaServ1AccSuccParamSetTcPacketId(rep, tcPacketId);
+      tcPacketSeqCtrl = CrFwPcktGetSeqCtrl(pckt);
+      CrIaServ1AccSuccParamSetTcPacketSeqCtrl(rep, tcPacketSeqCtrl);
+      
+      CrFwOutCmpSetDest(rep, source);
+      
+      CrFwOutLoaderLoad(rep);
+    }
+  
+  return;
+}
+
+void SendTcAccRepFail(CrFwPckt_t pckt, unsigned short tcFailureCode)
+{
+  FwSmDesc_t rep;
+  CrFwDestSrc_t source;
+  unsigned char tcType, tcSubtype;
+  unsigned short tcPacketId, tcPacketSeqCtrl, tcLength, tcReceivedBytes, tcReceivedCrc, tcCalculatedCrc, nofAccFailedTc, seqCntLastAccFailTc;
+
+  if (pckt != NULL)
+    {
+      CrIaCopy(NOFACCFAILEDTC_ID, &nofAccFailedTc);
+      nofAccFailedTc += 1;
+      CrIaPaste(NOFACCFAILEDTC_ID, &nofAccFailedTc);
+
+      seqCntLastAccFailTc = CrFwPcktGetSeqCnt(pckt);
+      CrIaPaste(SEQCNTLASTACCFAILTC_ID, &seqCntLastAccFailTc);
+      DEBUGP("SendTcAccRepFail: set SeqCntLastAccFailTc = %d\n", seqCntLastAccFailTc);
+    }
+
+  /* send (1,2) TC acceptance report - failure */
+  /* Create out component */
+  rep = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRIA_SERV1, CRIA_SERV1_ACC_FAIL, 0, 0);
+  if (rep == NULL) 
+    {
+      /* handled by Resource FdCheck */
+      return;
+    }
+
+  if (pckt != NULL)
+    {
+      /* Set out component parameters */
+      tcPacketId = CrIaPcktGetPacketId(pckt);
+      CrIaServ1AccFailParamSetTcPacketId(rep, tcPacketId);
+      tcPacketSeqCtrl = CrFwPcktGetSeqCtrl(pckt);
+      CrIaServ1AccFailParamSetTcPacketSeqCtrl(rep, tcPacketSeqCtrl);
+      tcType = CrFwPcktGetServType(pckt);
+      CrIaServ1AccFailParamSetTcType(rep, tcType);
+      tcSubtype = CrFwPcktGetServSubType(pckt);
+      CrIaServ1AccFailParamSetTcSubtype(rep, tcSubtype);
+      tcLength = CrFwPcktGetLength(pckt);
+      CrIaServ1AccFailParamSetTcLength(rep, tcLength);
+      tcReceivedBytes = CrFwPcktGetParLength(pckt) + OFFSET_PAR_LENGTH_TC + CRC_LENGTH;
+      CrIaServ1AccFailParamSetTcReceivedBytes(rep, tcReceivedBytes);
+      tcReceivedCrc = CrIaPcktGetCrc(pckt);
+      CrIaServ1AccFailParamSetTcReceivedCrc(rep, tcReceivedCrc);
+      tcCalculatedCrc = GetCalculatedCrcFrom(pckt);
+      CrIaServ1AccFailParamSetTcCalculatedCrc(rep, tcCalculatedCrc);
+      
+      source = CrFwPcktGetSrc(pckt);
+      CrFwOutCmpSetDest(rep, source);
+    }
+  else
+    {
+      source = 0;
+      CrFwOutCmpSetDest(rep, source);
+    }
+
+  CrIaServ1AccFailParamSetTcFailureCode(rep, tcFailureCode);
+
+  CrFwOutLoaderLoad(rep);
+
+  return;
+}
+
+void SendTcStartRepSucc(CrFwPckt_t pckt)
+{
+  FwSmDesc_t rep;
+  CrFwDestSrc_t source;
+  CrFwBool_t isStartAck;
+  unsigned char tcType, tcSubtype;
+  unsigned short tcPacketId, tcPacketSeqCtrl;
+  
+  CRIA_UNUSED(tcSubtype);
+  CRIA_UNUSED(tcType);
+  
+  isStartAck = CrFwPcktIsStartAck(pckt);
+  
+  if (isStartAck==1)
+    {
+      /* send (1,3) TC start report - success */
+      /* Create out component */
+      rep = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRIA_SERV1, CRIA_SERV1_START_SUCC, 0, 0);
+      if (rep == NULL) 
+	{
+          /* handled by Resource FdCheck */
+	  return;
+	}
+      
+      /* Set out component parameters */
+      tcPacketId = CrIaPcktGetPacketId(pckt);
+      CrIaServ1StartSuccParamSetTcPacketId(rep, tcPacketId);
+      tcPacketSeqCtrl = CrFwPcktGetSeqCtrl(pckt);
+      CrIaServ1StartSuccParamSetTcPacketSeqCtrl(rep, tcPacketSeqCtrl);
+      
+      source = CrFwPcktGetSrc(pckt);
+      CrFwOutCmpSetDest(rep, source);
+      
+      CrFwOutLoaderLoad(rep);
+    }
+  
+  return;
+}
+
+void SendTcStartRepFail(CrFwPckt_t pckt, unsigned short tcFailureCode, unsigned short wrongParamPosition, unsigned short wrongParamValue) 
+{
+  FwSmDesc_t rep;
+  CrFwDestSrc_t source;
+  unsigned char tcType, tcSubtype;
+  unsigned short tcPacketId, tcPacketSeqCtrl, nofStartFailedTc, seqCntLastStartFailTc;
+
+  CRIA_UNUSED(wrongParamPosition);
+  CRIA_UNUSED(wrongParamValue);
+
+  CrIaCopy(NOFSTARTFAILEDTC_ID, &nofStartFailedTc);
+  nofStartFailedTc += 1;
+  CrIaPaste(NOFSTARTFAILEDTC_ID, &nofStartFailedTc);
+
+  seqCntLastStartFailTc = CrFwPcktGetSeqCtrl(pckt);
+  CrIaPaste(SEQCNTLASTSTARTFAILTC_ID, &seqCntLastStartFailTc);
+  DEBUGP("SendTcStartRepFail: set SeqCntLastStartFailTc = %d\n", seqCntLastStartFailTc);
+
+  /* send (1,4) TC start report - failure */
+  /* Create out component */
+  rep = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRIA_SERV1, CRIA_SERV1_START_FAIL, 0, 0);
+  if (rep == NULL) 
+    {
+       /* handled by Resource FdCheck */
+       return;
+    }    
+      
+  /* Set out component parameters */
+  tcPacketId = CrIaPcktGetPacketId(pckt);
+  CrIaServ1StartFailParamSetTcPacketId(rep, tcPacketId);
+  tcPacketSeqCtrl = CrFwPcktGetSeqCtrl(pckt);
+  CrIaServ1StartFailParamSetTcPacketSeqCtrl(rep, tcPacketSeqCtrl);
+  tcType = CrFwPcktGetServType(pckt);
+  CrIaServ1StartFailParamSetTcType(rep, tcType);
+  tcSubtype = CrFwPcktGetServSubType(pckt);
+  CrIaServ1StartFailParamSetTcSubtype(rep, tcSubtype);
+  CrIaServ1StartFailParamSetWrongParamPosition(rep, wrongParamPosition);
+  CrIaServ1StartFailParamSetWrongParamValue(rep, wrongParamValue);
+  CrIaServ1StartFailParamSetTcFailureCode(rep, tcFailureCode);
+      
+  source = CrFwPcktGetSrc(pckt);
+  CrFwOutCmpSetDest(rep, source);
+      
+  CrFwOutLoaderLoad(rep);
+  
+  return;
+}
+
+void SendTcTermRepSucc(CrFwPckt_t pckt)
+{
+  FwSmDesc_t rep;
+  CrFwDestSrc_t source;
+  CrFwBool_t isTermAck;
+  unsigned char tcType, tcSubtype;
+  unsigned short tcPacketId, tcPacketSeqCtrl, nofTcTerm;
+
+  CRIA_UNUSED(tcSubtype);
+  CRIA_UNUSED(tcType);
+
+  CrIaCopy(NOFTCTERM_ID, &nofTcTerm);
+  nofTcTerm += 1;
+  CrIaPaste(NOFTCTERM_ID, &nofTcTerm);
+
+  isTermAck = CrFwPcktIsTermAck(pckt);
+
+  if (isTermAck==1)
+    {
+      /* send (1,7) TC termination report - success */
+      /* Create out component */
+      rep = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRIA_SERV1, CRIA_SERV1_TERM_SUCC, 0, 0);
+      if (rep == NULL) 
+	{
+          /* handled by Resource FdCheck */
+	  return;
+	}
+      
+      /* Set out component parameters */
+      tcPacketId = CrIaPcktGetPacketId(pckt);
+      CrIaServ1TermSuccParamSetTcPacketId(rep, tcPacketId);
+      tcPacketSeqCtrl = CrFwPcktGetSeqCtrl(pckt);
+      
+      CrIaServ1TermSuccParamSetTcPacketSeqCtrl(rep, tcPacketSeqCtrl);
+      
+      source = CrFwPcktGetSrc(pckt);
+      CrFwOutCmpSetDest(rep, source);
+      
+      CrFwOutLoaderLoad(rep);
+    }
+  
+  return;
+}
+
+void SendTcTermRepFail(CrFwPckt_t pckt, unsigned short tcFailureCode, unsigned short wrongParamPosition, unsigned short wrongParamValue) 
+{
+  FwSmDesc_t rep;
+  CrFwDestSrc_t source;
+  unsigned char tcType, tcSubtype;
+  unsigned short tcPacketId, tcPacketSeqCtrl, nofTermFailedTc, seqCntLastTermFailTc;
+
+  CRIA_UNUSED(wrongParamPosition);
+  CRIA_UNUSED(wrongParamValue);
+
+  CrIaCopy(NOFTERMFAILEDTC_ID, &nofTermFailedTc);
+  nofTermFailedTc += 1;
+  CrIaPaste(NOFTERMFAILEDTC_ID, &nofTermFailedTc);
+
+  seqCntLastTermFailTc = CrFwPcktGetSeqCtrl(pckt);
+  CrIaPaste(SEQCNTLASTTERMFAILTC_ID, &seqCntLastTermFailTc);
+  DEBUGP("SendTcTermRepFail: set SeqCntLastTermFailTc = %d\n", seqCntLastTermFailTc);
+
+  /* send (1,4) TC start report - failure */
+  /* Create out component */
+  rep = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRIA_SERV1, CRIA_SERV1_TERM_FAIL, 0, 0);
+  if (rep == NULL) 
+    {
+      /* handled by Resource FdCheck */
+      return;
+    }
+      
+  /* Set out component parameters */
+  tcPacketId = CrIaPcktGetPacketId(pckt);
+  CrIaServ1TermFailParamSetTcPacketId(rep, tcPacketId);
+  tcPacketSeqCtrl = CrFwPcktGetSeqCtrl(pckt);
+  CrIaServ1TermFailParamSetTcPacketSeqCtrl(rep, tcPacketSeqCtrl);
+  tcType = CrFwPcktGetServType(pckt);
+  CrIaServ1TermFailParamSetTcType(rep, tcType);
+  tcSubtype = CrFwPcktGetServSubType(pckt);
+  CrIaServ1TermFailParamSetTcSubtype(rep, tcSubtype);
+  CrIaServ1TermFailParamSetWrongParamPosition(rep, wrongParamPosition);
+  CrIaServ1TermFailParamSetWrongParamValue(rep, wrongParamValue);
+  CrIaServ1TermFailParamSetTcFailureCode(rep, tcFailureCode);
+      
+  source = CrFwPcktGetSrc(pckt);
+  CrFwOutCmpSetDest(rep, source);
+      
+  CrFwOutLoaderLoad(rep);
+  
+  return;
+}
diff --git a/CrIa/src/IfswUtilities.h b/CrIa/src/IfswUtilities.h
new file mode 100644
index 0000000..8050918
--- /dev/null
+++ b/CrIa/src/IfswUtilities.h
@@ -0,0 +1,103 @@
+/**
+ * @file IfswUtilities.h
+ */
+
+#ifndef IFSWUTILITIES_H
+#define IFSWUTILITIES_H
+
+/* Includes */
+#include <CrFwConstants.h>
+
+#if (__sparc__)
+#include <iwf_fpga.h> /* heater enums */
+#else
+#include "CrIaIasw.h"
+#endif
+
+/* AREA IDs */
+#define AREAID_RAMADDR 0
+#define AREAID_SDU4 3
+#define AREAID_SIB 100
+#define AREAID_CIB 200
+#define AREAID_GIB 300
+
+/* memory area IDs, have a finer grade than IDs from the ICD */
+#define ADDRID_SRAM1     1
+#define ADDRID_SRAM2     2
+#define ADDRID_SRAM2ALT  3
+#define ADDRID_AHBRAM    4
+#define ADDRID_FPGA      5
+#define ADDRID_REG1      6
+#define ADDRID_REG2      7
+#define ADDRID_INVALID   0
+
+/* IDs from the ICD */
+#define DPU_RAM		0x0002
+#define DPU_REGISTER	0x0003
+#define DPU_INTERNAL	0x0004
+#define DPU_FLASH1	0x1100
+#define DPU_FLASH2	0x1200
+#define DPU_FLASH3	0x1300
+#define DPU_FLASH4	0x1400
+
+
+struct SdbLayout {
+  unsigned short mode; 
+  unsigned short CibNFull;
+  unsigned short SibNFull;
+  unsigned short GibNFull;
+  unsigned short CibNWin;
+  unsigned short SibNWin;
+  unsigned short GibNWin;
+  unsigned short CibSizeFull;
+  unsigned short SibSizeFull;
+  unsigned short GibSizeFull;
+  unsigned short CibSizeWin;
+  unsigned short SibSizeWin;
+  unsigned short GibSizeWin;
+} ;
+
+
+extern unsigned char heater_stat[4];
+
+void sort4float (float *data);
+
+unsigned char getHbSem();
+
+void CrIaHeaterOn (enum heater htr);
+
+void CrIaHeaterOff (enum heater htr);
+
+unsigned char CrIaHeaterStatus (enum heater htr);
+
+void PutBit8 (unsigned char value, unsigned int bitOffset, unsigned char *dest);
+
+void PutNBits8 (unsigned int value, unsigned int bitOffset, unsigned int nbits, unsigned char *dest);
+
+unsigned int getHkDataSize(unsigned char sid);
+
+unsigned short getSemAnoEvtId(unsigned short eventId);
+
+unsigned short checkDpuHkLimits();
+
+unsigned short checkResources();
+
+unsigned long areaIdToAddress (unsigned short fbfRamAreaId, unsigned int fbfRamAddr);
+
+unsigned short verifyAddress (unsigned int addrVal);
+
+unsigned short cvtAddrIdToRamId (unsigned short addr_id);
+
+void SendTcAccRepSucc(CrFwPckt_t pckt);
+
+void SendTcAccRepFail(CrFwPckt_t pckt, unsigned short tcFailureCode);
+
+void SendTcStartRepSucc(CrFwPckt_t pckt);
+
+void SendTcStartRepFail(CrFwPckt_t pckt, unsigned short tcFailureCode, unsigned short wrongParamPosition, unsigned short wrongParamValue);
+
+void SendTcTermRepSucc(CrFwPckt_t pckt);
+
+void SendTcTermRepFail(CrFwPckt_t pckt, unsigned short tcFailureCode, unsigned short wrongParamPosition, unsigned short wrongParamValue);
+
+#endif /* IFSWUTILITIES_H */
diff --git a/CrIa/src/ScienceDataProcessing.c b/CrIa/src/ScienceDataProcessing.c
new file mode 100644
index 0000000..66868b0
--- /dev/null
+++ b/CrIa/src/ScienceDataProcessing.c
@@ -0,0 +1,331 @@
+/**
+ * @file    ScienceDataProcessing.c
+ * @ingroup Sdp
+ * @author  Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @date    August, 2016
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ *
+ * @defgroup Sdp Science Data Processing
+ *
+ * @brief high level calling function to the science data processing
+ * 
+ * This module contains the high level call, @ref ScienceProcessing to the @ref Compression.
+ * In order to get started with the concept of the data processing chain, read "Cheops On-Board Data Processing Steps", CHEOPS-UVIE-INST-TN-001.
+ * The concept of the @ref CompressionEntity is described well in the "IFSW-SOC ICD", CHEOPS-UVIE-ICD-003.
+ * The architectural overview of the @ref Sdp for CHEOPS is given by "On-Board Science Data Processing Architectural Design",
+ * CHEOPS-UVIE-DD-003. When it comes to algorithms, the best possible introduction is "Intelligent Detectors", http://othes.univie.ac.at/8223/.
+ *
+ *
+ */
+
+
+#include <stdint.h>
+
+#include <FwSmConfig.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+#include <Services/General/CrIaConstants.h>
+
+#include <CrIaIasw.h> /* for sibAddressFull and Win */
+#include <CrIaPrSm/CrIaSdbCreate.h> /* for CONFIG_FULL etc. */
+#if (__sparc__)
+#include <wrap_malloc.h>
+#endif
+
+#include "IfswDebug.h"
+
+#include "ScienceDataProcessing.h"
+
+#include "Sdp/SdpAlgorithmsImplementation.h"
+#include "Sdp/SdpAlgorithmsImplementationLlc.h"
+#include "Sdp/SdpBuffers.h"
+#include "Sdp/SdpCeDefinitions.h"
+#include "Sdp/SdpCollect.h"
+#include "Sdp/SdpCompress.h"
+#include "Sdp/SdpCompressionEntityStructure.h"
+
+
+
+/* science dummy processing for the second core */
+#if (__sparc__)
+#include <ibsw_interface.h>
+#include <timing.h>
+#endif
+extern struct ibsw_config ibsw_cfg;
+#include <EngineeringAlgorithms.h>
+
+
+/**
+ * @brief	top-level function to create the compression output in the @ref GIB 
+ * @param	mycestruct pointer to the @ref ComprEntStructure
+ *
+ * This function calls @ref SdpCollect to create the binary Compression Entity from the @ref ComprEntStructure and then increments the @ref GIB in pointer in the data pool accordingly.
+ *
+ */
+
+void Collect (struct ComprEntStructure *mycestruct)
+{
+  unsigned int gibSize = 0;
+  unsigned short gibIn, newGibIn, gibOut, gibSizeWin, gibNWin, gibSizeFull, gibNFull, sdbstate;
+  unsigned long int xibOffset;
+  unsigned short evt_data[2];
+  
+  /* call the actual collect function */
+  SdpCollect(mycestruct);
+
+  /* check size of compression entity */
+  CrIaCopy (GIBIN_ID, &gibIn);
+  CrIaCopy (GIBOUT_ID, &gibOut);
+  CrIaCopy (GIBSIZEWIN_ID, &gibSizeWin);
+  CrIaCopy (GIBNWIN_ID, &gibNWin);  
+  CrIaCopy (GIBSIZEFULL_ID, &gibSizeFull);
+  CrIaCopy (GIBNFULL_ID, &gibNFull);  
+  CrIaCopy (SDBSTATE_ID, &sdbstate);
+  
+  /* check size of compressed product */
+  if (sdbstate == CrIaSdb_CONFIG_WIN)
+    gibSize = gibSizeWin * 1024;
+
+  if (sdbstate == CrIaSdb_CONFIG_FULL)
+    gibSize = gibSizeFull * 1024;    
+
+  if (mycestruct->Size > gibSize)
+    {
+#ifdef ISOLATED
+      (void) evt_data;
+      SDPRINT("ERROR: the GIB size of %u is too small for the CE of size %u!\n", gibSize, mycestruct->Size);
+#else
+      evt_data[0] = (unsigned short)((mycestruct->Size + 1023) / 1024); /* requested gibSize in kiB rounded up */
+      evt_data[1] = 0;
+      SdpEvtRaise(3, CRIA_SERV5_EVT_CLCT_SIZE, evt_data, 4);
+#endif          
+    }
+
+  /* increment GIBIN */
+  if (sdbstate == CrIaSdb_CONFIG_WIN)
+    {
+      xibOffset = GET_RES_OFFSET_FROM_ADDR((unsigned long int)gibAddressWin);
+      newGibIn = updateXib((unsigned int)gibIn, (unsigned int)gibOut, xibOffset, (unsigned int)gibSizeWin, (unsigned int)gibNWin, GIBIN_WIN_XIB);
+    }
+  else
+    {
+      xibOffset = GET_RES_OFFSET_FROM_ADDR((unsigned long int)gibAddressFull);
+      newGibIn = updateXib((unsigned int)gibIn, (unsigned int)gibOut, xibOffset, (unsigned int)gibSizeFull, (unsigned int)gibNFull, GIBIN_FULL_XIB);
+    }
+    
+  /* NOTE: in the case that GIBIN couldn't be incremented, we stay on the last frame */
+      
+  gibIn = newGibIn;	    
+  CrIaPaste (GIBIN_ID, &gibIn);
+  
+  return;
+}
+
+/**
+ * @brief	get combined information for SAA and SDS flags from a set of SIBs
+ *
+ * @param       nframes    number of frames to process as a CE. In other words, the stacking number
+ * @param       Xdim       width of the imaging area
+ * @param       Ydim       height of the imaging area
+ *
+ * @returns     The combined flag information.
+ *
+ * This function looks at the SDB/SAA flags stored in the SIBs by the SciDataUpdFunc (see IFSW-SOC ICD).
+ * 0...OK, 1...SAA, 2...NOK (in this case, do not set SAA), 3...SDS
+ * The highest priority has the SDS state. It overrules a NOK. SAA has low priority, it is ignored if NOK is set.
+ * NOK is set by SdpCompress.
+ */ 
+
+unsigned char GetSibFlags (unsigned int nframes, unsigned int Xdim, unsigned int Ydim)
+{
+    struct CrIaSib sib;
+    struct SibPhotometry *sibPhotometry;
+    int status;
+    unsigned int i;
+    unsigned short sibIn, sibOut, newSibOut, sibSizeWin, sibNWin, sibSizeFull, sibNFull, sdbstate;
+    unsigned long int xibOffset;
+
+    unsigned int flags;
+    
+    /* get Sib parameters and state of SDB (WIN or FULL) */
+    CrIaCopy (SIBIN_ID, &sibIn);
+    CrIaCopy (SIBOUT_ID, &sibOut);
+    CrIaCopy (SIBSIZEWIN_ID, &sibSizeWin);
+    CrIaCopy (SIBNWIN_ID, &sibNWin);
+    CrIaCopy (SIBSIZEFULL_ID, &sibSizeFull);
+    CrIaCopy (SIBNFULL_ID, &sibNFull);
+    CrIaCopy (SDBSTATE_ID, &sdbstate);
+
+    flags = 0xffffffff; /* in the loop, the flags are combined with &, so we start with all on here */
+    
+    for (i=0; i < nframes; i++)
+      {
+	/* setup SIB structure using current sibOut (the compression is the SIB consumer, thus it reads from "out") */
+	status = 0;
+	if (sdbstate == CrIaSdb_CONFIG_WIN)
+	  status = CrIaSetupSibWin (&sib, sibOut, Xdim, Ydim);
+	
+	if (sdbstate == CrIaSdb_CONFIG_FULL)
+	  status = CrIaSetupSibFull (&sib, sibOut);
+	
+	if (status == 0)
+	  {
+	    /* error gets reported by setup function */
+	    break;
+	  }
+
+	/* All SIBs must have the same flag to be set for the CE.
+	   The possible SIB flags are either 0 (no flag), 1 (SAA) or 3 (SDS) */
+	sibPhotometry = (struct SibPhotometry *) sib.Photometry;
+	flags &= sibPhotometry->FlagsActive;
+	
+	if (i < nframes - 1) /* don't update for the last frame */
+	  {
+	    /* move to the next sibOut in sequence */
+	    if (sdbstate == CrIaSdb_CONFIG_WIN)
+	      {
+		xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)sibAddressWin);
+		newSibOut = updateXibFwd((unsigned int)sibOut, (unsigned int)sibIn, xibOffset, (unsigned int)sibSizeWin, (unsigned int)sibNWin, SIBOUT_WIN_XIB);
+	      }
+	    else
+	      {
+		xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)sibAddressFull);
+		newSibOut = updateXibFwd((unsigned int)sibOut, (unsigned int)sibIn, xibOffset, (unsigned int)sibSizeFull, (unsigned int)sibNFull, SIBOUT_FULL_XIB);
+	      }
+	    
+	    /* NOTE: in the case that SIBOUT cannot be incremented accordingly, we clone the last frame */
+	    
+	    sibOut = newSibOut;
+	  }
+      }
+
+    return (unsigned char)(flags & 0xff);	
+}
+
+
+/**
+ * @brief	top-level call to the science data processing
+ * 
+ * This function runs the compression. As input it needs the images in the SIBs and as output the @ref CompressionEntity binary object is saved in the @ref GIB.
+ * The flow of actions is:
+ *   - call @ref InitComprEntStructureFromDataPool to copy the data pool parameters in the @ref ComprEntStructure. If they are modified during an active 
+ *     data processing, it has no influence on the current run.
+ *   - call @ref SdpCompress, which is the actual data processing chain. It fills the @ref ComprEntStructure in the @ref CIB with content.
+ *   - update the @ref SIB out pointer by skipping the buffers that have been processed. The function @ref updateXibNTimesFwd is used.
+ *   - call the @ref Collect function to pack the @ref CompressionEntity binary and adjust the @ref GIB in
+ *   - set the SDU2 down transfer size from the size of the @ref CompressionEntity
+ *   - increment the CE counter, which is part of the CE header
+ *
+ * @note  the CE counter is not reset automatically
+ *
+ */
+
+void ScienceProcessing (void)
+{
+  struct ComprEntStructure mycestruct;
+  unsigned int cesize;
+  unsigned short cecounter=0; /* initialize counter with default value */
+
+  unsigned short sibIn, newSibOut, sibOut, sibSizeWin, sibNWin, sibSizeFull, sibNFull;
+  unsigned short sdbstate;
+  unsigned long int xibOffset;  
+  unsigned char sibFlags;
+
+  unsigned short uint16;
+
+  uint16 = CC_PROLOGUE;
+  CrIaPaste(CCPRODUCT_ID, &uint16);
+  uint16 = CC_PROLOGUE;
+  CrIaPaste(CCSTEP_ID, &uint16);
+  
+  /* Init CE structure from DP */
+  InitComprEntStructureFromDataPool (&mycestruct);   
+  
+  /* COMPRESS: compress all the data and fill the CE products */
+  uint16 = CC_COMPR_STARTED;
+  CrIaPaste(CCSTEP_ID, &uint16);
+  SdpCompress(&mycestruct);
+
+  uint16 = CC_MIDPART;
+  CrIaPaste(CCSTEP_ID, &uint16);
+
+    /* enter the Integrity information */
+  sibFlags = GetSibFlags (mycestruct.StackingNumber, mycestruct.SemWindowSizeX, mycestruct.SemWindowSizeY);
+
+
+  if (sibFlags == DATA_SAA)
+    {
+      mycestruct.Integrity = DATA_SAA; /* Mantis 2189 */
+    }
+
+  /* SDS overrules all the other flags */
+  if (sibFlags == DATA_SUSPEND)
+    {
+      mycestruct.Integrity = DATA_SUSPEND;      
+    }
+  
+  /* 
+     Increment sibOut by STCK_ORDER 
+  */  
+  CrIaCopy (SIBIN_ID, &sibIn);
+  CrIaCopy (SIBOUT_ID, &sibOut);
+  CrIaCopy (SIBSIZEWIN_ID, &sibSizeWin);
+  CrIaCopy (SIBNWIN_ID, &sibNWin);  
+  CrIaCopy (SIBSIZEFULL_ID, &sibSizeFull);
+  CrIaCopy (SIBNFULL_ID, &sibNFull);  
+
+  CrIaCopy (SDBSTATE_ID, &sdbstate);
+  PRDEBUGP("want to shift %d times\n", mycestruct.StackingNumber);
+
+  newSibOut = sibOut;
+  
+  if (sdbstate == CrIaSdb_CONFIG_WIN)
+    {
+      xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)sibAddressWin);
+      newSibOut = updateXibNTimesFwd(sibOut, sibIn, xibOffset, sibSizeWin, sibNWin, mycestruct.StackingNumber, SIBOUT_WIN_XIB);  
+    }      
+  if (sdbstate == CrIaSdb_CONFIG_FULL)
+    {
+      xibOffset = GET_SDB_OFFSET_FROM_ADDR((unsigned long int)sibAddressFull);
+      newSibOut = updateXibNTimesFwd(sibOut, sibIn, xibOffset, sibSizeFull, sibNFull, mycestruct.StackingNumber, SIBOUT_FULL_XIB);  
+    }
+  
+  CrIaPaste (SIBOUT_ID, &newSibOut);
+  
+  /* COLLECT: create the bitstream from the CE products */
+  PRDEBUGP("launch collect\n");
+  uint16 = CC_COLLECT;
+  CrIaPaste(CCPRODUCT_ID, &uint16);
+  Collect(&mycestruct); 
+
+  /* set SDU 2 down transfer size */
+
+  PRDEBUGP("CE %d size is: %d\n", cecounter, mycestruct.Size);
+
+  /* Mantis 1421 / 1626 leaves us the choice to either set SDU2DOWNTRANSFERSIZE to 0xffffffff or the actual size */
+  cesize = DTSIZE_FROM_HEADER;
+  CrIaPaste(SDU2DOWNTRANSFERSIZE_ID, &cesize);  
+  
+  /* increment the CE counter */
+  CrIaCopy(CE_COUNTER_ID, &cecounter);
+  cecounter++;
+  CrIaPaste(CE_COUNTER_ID, &cecounter);
+  
+  PRDEBUGP("done!\n");
+
+  uint16 = CC_FINISHED;
+  CrIaPaste(CCSTEP_ID, &uint16);
+  
+  return;
+}
diff --git a/CrIa/src/ScienceDataProcessing.h b/CrIa/src/ScienceDataProcessing.h
new file mode 100644
index 0000000..3ba0ff8
--- /dev/null
+++ b/CrIa/src/ScienceDataProcessing.h
@@ -0,0 +1,23 @@
+/**
+ * @file    SdpAlgorithmsImplementation.h
+ * @author  Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @date    September, 2016
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef SCIENCEDATAPROCESSING_H
+#define SCIENCEDATAPROCESSING_H
+
+void ScienceProcessing (void);
+
+#endif /* SCIENCEDATAPROCESSING_H */
diff --git a/CrIa/src/Sdp/SdpAlgorithmsImplementation.c b/CrIa/src/Sdp/SdpAlgorithmsImplementation.c
new file mode 120000
index 0000000..1808f56
--- /dev/null
+++ b/CrIa/src/Sdp/SdpAlgorithmsImplementation.c
@@ -0,0 +1 @@
+../../../CompressionEntity/src/SdpAlgorithmsImplementation.c
\ No newline at end of file
diff --git a/CrIa/src/Sdp/SdpAlgorithmsImplementation.h b/CrIa/src/Sdp/SdpAlgorithmsImplementation.h
new file mode 120000
index 0000000..789cbda
--- /dev/null
+++ b/CrIa/src/Sdp/SdpAlgorithmsImplementation.h
@@ -0,0 +1 @@
+../../../CompressionEntity/src/SdpAlgorithmsImplementation.h
\ No newline at end of file
diff --git a/CrIa/src/Sdp/SdpAlgorithmsImplementationLlc.c b/CrIa/src/Sdp/SdpAlgorithmsImplementationLlc.c
new file mode 120000
index 0000000..b178ef1
--- /dev/null
+++ b/CrIa/src/Sdp/SdpAlgorithmsImplementationLlc.c
@@ -0,0 +1 @@
+../../../CompressionEntity/src/SdpAlgorithmsImplementationLlc.c
\ No newline at end of file
diff --git a/CrIa/src/Sdp/SdpAlgorithmsImplementationLlc.h b/CrIa/src/Sdp/SdpAlgorithmsImplementationLlc.h
new file mode 120000
index 0000000..001fba1
--- /dev/null
+++ b/CrIa/src/Sdp/SdpAlgorithmsImplementationLlc.h
@@ -0,0 +1 @@
+../../../CompressionEntity/src/SdpAlgorithmsImplementationLlc.h
\ No newline at end of file
diff --git a/CrIa/src/Sdp/SdpBuffers.c b/CrIa/src/Sdp/SdpBuffers.c
new file mode 120000
index 0000000..01834a8
--- /dev/null
+++ b/CrIa/src/Sdp/SdpBuffers.c
@@ -0,0 +1 @@
+../../../CompressionEntity/src/SdpBuffers.c
\ No newline at end of file
diff --git a/CrIa/src/Sdp/SdpBuffers.h b/CrIa/src/Sdp/SdpBuffers.h
new file mode 120000
index 0000000..dbf2c98
--- /dev/null
+++ b/CrIa/src/Sdp/SdpBuffers.h
@@ -0,0 +1 @@
+../../../CompressionEntity/src/SdpBuffers.h
\ No newline at end of file
diff --git a/CrIa/src/Sdp/SdpCeDefinitions.h b/CrIa/src/Sdp/SdpCeDefinitions.h
new file mode 120000
index 0000000..e33a90d
--- /dev/null
+++ b/CrIa/src/Sdp/SdpCeDefinitions.h
@@ -0,0 +1 @@
+../../../CompressionEntity/src/SdpCeDefinitions.h
\ No newline at end of file
diff --git a/CrIa/src/Sdp/SdpCollect.c b/CrIa/src/Sdp/SdpCollect.c
new file mode 120000
index 0000000..91785c5
--- /dev/null
+++ b/CrIa/src/Sdp/SdpCollect.c
@@ -0,0 +1 @@
+../../../CompressionEntity/src/SdpCollect.c
\ No newline at end of file
diff --git a/CrIa/src/Sdp/SdpCollect.h b/CrIa/src/Sdp/SdpCollect.h
new file mode 120000
index 0000000..7b5998c
--- /dev/null
+++ b/CrIa/src/Sdp/SdpCollect.h
@@ -0,0 +1 @@
+../../../CompressionEntity/src/SdpCollect.h
\ No newline at end of file
diff --git a/CrIa/src/Sdp/SdpCompress.c b/CrIa/src/Sdp/SdpCompress.c
new file mode 120000
index 0000000..9526bf1
--- /dev/null
+++ b/CrIa/src/Sdp/SdpCompress.c
@@ -0,0 +1 @@
+../../../CompressionEntity/src/SdpCompress.c
\ No newline at end of file
diff --git a/CrIa/src/Sdp/SdpCompress.h b/CrIa/src/Sdp/SdpCompress.h
new file mode 120000
index 0000000..a8de102
--- /dev/null
+++ b/CrIa/src/Sdp/SdpCompress.h
@@ -0,0 +1 @@
+../../../CompressionEntity/src/SdpCompress.h
\ No newline at end of file
diff --git a/CrIa/src/Sdp/SdpCompressionEntityStructure.h b/CrIa/src/Sdp/SdpCompressionEntityStructure.h
new file mode 120000
index 0000000..4ce9b96
--- /dev/null
+++ b/CrIa/src/Sdp/SdpCompressionEntityStructure.h
@@ -0,0 +1 @@
+../../../CompressionEntity/src/SdpCompressionEntityStructure.h
\ No newline at end of file
diff --git a/CrIa/src/Sdp/SdpNlcPhot.c b/CrIa/src/Sdp/SdpNlcPhot.c
new file mode 120000
index 0000000..0ffd2e8
--- /dev/null
+++ b/CrIa/src/Sdp/SdpNlcPhot.c
@@ -0,0 +1 @@
+../../../CompressionEntity/src/SdpNlcPhot.c
\ No newline at end of file
diff --git a/CrIa/src/Sdp/SdpNlcPhot.h b/CrIa/src/Sdp/SdpNlcPhot.h
new file mode 120000
index 0000000..614436f
--- /dev/null
+++ b/CrIa/src/Sdp/SdpNlcPhot.h
@@ -0,0 +1 @@
+../../../CompressionEntity/src/SdpNlcPhot.h
\ No newline at end of file
diff --git a/CrIa/src/Services/CrIaServ13LargeDataTransferService/InCmd/CrIaServ13AbrtDwlk.c b/CrIa/src/Services/CrIaServ13LargeDataTransferService/InCmd/CrIaServ13AbrtDwlk.c
new file mode 100644
index 0000000..32cbc8d
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ13LargeDataTransferService/InCmd/CrIaServ13AbrtDwlk.c
@@ -0,0 +1,154 @@
+/**
+ * @file CrIaServ13AbrtDwlk.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Abort Downlink in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ13AbrtDwlk.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaIasw.h>
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <Services/General/CrIaParamGetter.h>
+#include <Services/General/CrIaParamSetter.h>
+#include <CrIaPrSm/CrIaSduCreate.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+
+CrFwBool_t CrIaServ13AbrtDwlkValidityCheck(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned char sduId = 0;
+
+  cmpData         = (CrFwCmpData_t   *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* SDUx must be in range 2..SDU_ID_MAX */
+
+  CrIaServ13AbrtDwlkParamGetSduId(&sduId, pckt);
+
+  if ((sduId > 1) && (sduId <= SDU_ID_MAX))
+    {
+      SendTcAccRepSucc(pckt);
+      return 1;
+    }
+
+  SendTcAccRepFail(pckt, ACK_ILL_SDUID);
+  return 0;
+}
+
+void CrIaServ13AbrtDwlkStartAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned char sduId = 0;
+  unsigned short sduxState = 0;
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Set action outcome to 'success' iff the SDUx State Machine is in state DOWN_TRANSFER */
+  cmpData->outcome = 0;
+
+  CrIaServ13AbrtDwlkParamGetSduId(&sduId, pckt);
+
+  switch (sduId)
+    {
+    case 2:
+      sduxState = FwSmGetCurState(smDescSdu2);
+      break;
+    case 4:
+      sduxState = FwSmGetCurState(smDescSdu4);
+      break;
+    default:
+      break;
+    }
+
+  if (sduxState == CrIaSdu_DOWN_TRANSFER)
+    {
+      cmpData->outcome = 1;
+      SendTcStartRepSucc(pckt);
+      return;
+    }
+
+  SendTcStartRepFail(pckt, ACK_WR_SDU_M, 0, (unsigned short)sduxState);
+  return;
+}
+
+void CrIaServ13AbrtDwlkProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned char sduId = 0;
+  unsigned short reasonCode = 1; /* NOTE: the only reason code is SDU_ABRT_GRD_REQ */
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Send command Abort to SDUx State Machine; set Abort Reason Code to SDU_ABRT_GRD_REQ; set the action outcome to 'completed' */
+  cmpData->outcome = 0;
+
+  CrIaServ13AbrtDwlkParamGetSduId(&sduId, pckt);
+
+  switch (sduId)
+    {
+    case 2:
+      FwSmMakeTrans(smDescSdu2, Abort);
+      break;
+    case 4:
+      FwSmMakeTrans(smDescSdu4, Abort);
+      break;
+    default:
+      break;
+    }
+
+  /* Set Abort Reason Code to SDU_ABRT_GRD_REQ */
+  CrIaServ13DwlkAbrtParamSetReasonCode(smDesc, reasonCode);
+
+  /* Set the action outcome to 'completed' */
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ13LargeDataTransferService/InCmd/CrIaServ13AbrtDwlk.h b/CrIa/src/Services/CrIaServ13LargeDataTransferService/InCmd/CrIaServ13AbrtDwlk.h
new file mode 100644
index 0000000..5b99c04
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ13LargeDataTransferService/InCmd/CrIaServ13AbrtDwlk.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ13AbrtDwlk.h
+ *
+ * Declaration of the Abort Downlink in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV13_ABRT_DWLK_H
+#define CRIA_SERV13_ABRT_DWLK_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Abort Downlink in-coming command packet.
+ * SDUx must be in range 2..SDU_ID_MAX
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ13AbrtDwlkValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Abort Downlink in-coming command packet.
+ * Set action outcome to 'success' iff the SDUx State Machine is in state DOWN_TRANSFER
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ13AbrtDwlkStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Abort Downlink in-coming command packet.
+ * Send command Abort to SDUx State Machine; set Abort Reason Code to SDU_ABRT_GRD_REQ; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ13AbrtDwlkProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV13_ABRT_DWLK_H */
+
diff --git a/CrIa/src/Services/CrIaServ13LargeDataTransferService/InCmd/CrIaServ13TrgLrgDataTsfr.c b/CrIa/src/Services/CrIaServ13LargeDataTransferService/InCmd/CrIaServ13TrgLrgDataTsfr.c
new file mode 100644
index 0000000..eca0656
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ13LargeDataTransferService/InCmd/CrIaServ13TrgLrgDataTsfr.c
@@ -0,0 +1,149 @@
+/**
+ * @file CrIaServ13TrgLrgDataTsfr.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Trigger Large Data Transfer in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ13TrgLrgDataTsfr.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaIasw.h>
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <Services/General/CrIaParamGetter.h>
+#include <CrIaPrSm/CrIaSduCreate.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+
+CrFwBool_t CrIaServ13TrgLrgDataTsfrValidityCheck(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned char sduId = 0;
+
+  cmpData         = (CrFwCmpData_t   *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* SDUx must be in range 2..SDU_ID_MAX */
+
+  CrIaServ13TrgLrgDataTsfrParamGetSduId(&sduId, pckt);
+
+  if ((sduId >= 2) && (sduId <= SDU_ID_MAX))
+    {
+      SendTcAccRepSucc(pckt);
+      return 1;
+    }
+
+  SendTcAccRepFail(pckt, ACK_ILL_SDUID);
+  return 0;
+}
+
+void CrIaServ13TrgLrgDataTsfrStartAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned char sduId = 0;
+  unsigned short sduxState = 0;
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Set action outcome to 'success' iff the SDUx State Machine is in state INACTIVE */
+
+  CrIaServ13TrgLrgDataTsfrParamGetSduId(&sduId, pckt);
+
+  switch (sduId)
+    {
+    case 2:
+      sduxState = FwSmGetCurState(smDescSdu2);
+      break;
+    case 4:
+      sduxState = FwSmGetCurState(smDescSdu4);
+      break;
+    default:
+      break;
+    }
+
+  if (sduxState == CrIaSdu_INACTIVE)
+    {
+      cmpData->outcome = 1;
+      SendTcStartRepSucc(pckt);
+      return;
+    }
+
+  cmpData->outcome = 0;
+  SendTcStartRepFail(pckt, ACK_WR_SDU_M, 0, (unsigned short)sduxState);
+
+  return;
+}
+
+void CrIaServ13TrgLrgDataTsfrProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned char sduId = 0;
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Send command StartDownTransfer to SDUx State Machine */
+
+  CrIaServ13TrgLrgDataTsfrParamGetSduId(&sduId, pckt);
+
+  switch (sduId)
+    {
+    case 2:
+      FwSmMakeTrans(smDescSdu2, StartDownTransfer);
+      break;
+    case 4:
+      FwSmMakeTrans(smDescSdu4, StartDownTransfer);
+      break;
+    default:
+      break;
+    }
+
+  /* Set the action outcome to 'completed' */
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ13LargeDataTransferService/InCmd/CrIaServ13TrgLrgDataTsfr.h b/CrIa/src/Services/CrIaServ13LargeDataTransferService/InCmd/CrIaServ13TrgLrgDataTsfr.h
new file mode 100644
index 0000000..0ccb5a9
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ13LargeDataTransferService/InCmd/CrIaServ13TrgLrgDataTsfr.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ13TrgLrgDataTsfr.h
+ *
+ * Declaration of the Trigger Large Data Transfer in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV13_TRG_LRG_DATA_TSFR_H
+#define CRIA_SERV13_TRG_LRG_DATA_TSFR_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Trigger Large Data Transfer in-coming command packet.
+ * SDUx must be in range 2..SDU_ID_MAX
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ13TrgLrgDataTsfrValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Trigger Large Data Transfer in-coming command packet.
+ * Set action outcome to 'success' iff the SDUx State Machine is in state INACTIVE
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ13TrgLrgDataTsfrStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Trigger Large Data Transfer in-coming command packet.
+ * Send command StartDownTransfer to SDUx State Machine; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ13TrgLrgDataTsfrProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV13_TRG_LRG_DATA_TSFR_H */
+
diff --git a/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13DwlkAbrt.c b/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13DwlkAbrt.c
new file mode 100644
index 0000000..7b50797
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13DwlkAbrt.c
@@ -0,0 +1,35 @@
+/**
+ * @file CrIaServ13DwlkAbrt.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Downlink Abort Report out-going report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ13DwlkAbrt.h"
+
+#include <Services/General/CrIaParamSetter.h>
+
+#define SDU_ABRT_GRD_REQ  1
+
+
+void CrIaServ13DwlkAbrtUpdateAction(FwSmDesc_t smDesc)
+{
+  unsigned short reasonCode = SDU_ABRT_GRD_REQ; 
+
+  /* Load the value of Abort Reason Code from the entity which triggered the abort of the SDU transfer */
+  CrIaServ13DwlkAbrtParamSetReasonCode(smDesc, reasonCode);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13DwlkAbrt.h b/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13DwlkAbrt.h
new file mode 100644
index 0000000..0e4059b
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13DwlkAbrt.h
@@ -0,0 +1,24 @@
+/**
+ * @file CrIaServ13DwlkAbrt.h
+ *
+ * Declaration of the Downlink Abort Report out-going report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV13_DWLK_ABRT_H
+#define CRIA_SERV13_DWLK_ABRT_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Update action of the Downlink Abort Report telemetry packet.
+ * Load the value of Abort Reason Code from the entity which triggered the abort of the SDU transfer
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ13DwlkAbrtUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV13_DWLK_ABRT_H */
+
diff --git a/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13FstDwlk.c b/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13FstDwlk.c
new file mode 100644
index 0000000..eca6b25
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13FstDwlk.c
@@ -0,0 +1,178 @@
+/**
+ * @file CrIaServ13FstDwlk.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the First Downlink Part Report out-going report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ13FstDwlk.h"
+
+#include <FwProfile/FwSmConfig.h>
+#include <CrIaPrSm/CrIaSduCreate.h>
+
+#include <Services/General/CrIaConstants.h>
+#include <Services/General/CrIaParamGetter.h>
+#include <Services/General/CrIaParamSetter.h>
+
+#include <CrFwCmpData.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+/* for CrIbMilBusGetLinkCapacity */
+#if (__sparc__)
+#include "ibsw_interface.h"
+#include <wrap_malloc.h>
+#else
+#define SRAM1_FLASH_ADDR 0
+#endif
+
+/* for GetNBits32 */
+#include "Sdp/SdpAlgorithmsImplementation.h"
+
+#include "../../../IfswDebug.h"
+#include "CrIaIasw.h"
+
+
+CrFwBool_t CrIaServ13FstDwlkEnableCheck(FwSmDesc_t smDesc)
+{
+  /* NOTE: empty, because the intended functionality is already contained in the CrIaSduDownTransferDo action */
+
+  CRFW_UNUSED(smDesc);
+  return 1;
+}
+
+CrFwBool_t CrIaServ13FstDwlkReadyCheck(FwSmDesc_t smDesc)
+{
+  /* NOTE: empty, because the intended functionality is already contained in the CrIaSduDownTransferDo action */
+
+  CRFW_UNUSED(smDesc);
+  return 1;
+}
+
+CrFwBool_t CrIaServ13FstDwlkRepeatCheck(FwSmDesc_t smDesc)
+{
+  /* NOTE: empty, because the intended functionality is already contained in the CrIaSduDownTransferDo action */
+
+  CRFW_UNUSED(smDesc);
+  return 0;
+}
+
+void CrIaServ13FstDwlkUpdateAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwOutCmpData_t *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned char sduId = 0;
+  CrFwPcktLength_t PcktLength;
+  unsigned int dtSize;
+  unsigned short sduxBlockCnt, sduxBlockLength, GibOut;
+  /*  const unsigned char * sduxBlockData;*/
+  unsigned int sduxRemSize, SduXReadPos;
+  unsigned int sdu2DownTransferSize;
+  unsigned int sdu4DownTransferSize;
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwOutCmpData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Collect dtSize bytes from SDUx */
+
+  /* SduId was already set */
+  CrIaServ13FstDwlkParamGetSduId(&sduId, pckt);
+
+  switch (sduId)
+    {
+    case 2:
+      /* set SduBlockCnt in packet (should be 1 here) */
+      CrIaCopy(SDU2BLOCKCNT_ID, &sduxBlockCnt);
+      CrIaServ13FstDwlkParamSetSduBlockCount(smDesc, sduxBlockCnt);
+
+      /* we have to retrieve the dtSize and the sduxRemSize
+      to calculate the size and position of the data.
+      However, sduxRemSize was modified in the DownTransferDo action,
+      so we have to restore its old value */
+
+      PcktLength = CrFwPcktGetLength(pckt);
+      dtSize = PcktLength - S13_OVERHEAD;
+
+      CrIaCopy(SDU2REMSIZE_ID, &sduxRemSize);
+
+      if (sduxRemSize == 0)
+        sduxRemSize = dtSize;
+      else
+        sduxRemSize += dtSize;
+
+      /* now calculate the start position in the buffer */
+      CrIaCopy(S2TOTRANSFERSIZE_ID, &sdu2DownTransferSize);
+      DEBUGP("FST: dtSize: %d old RemSize: %d downTranferSize %d\n", dtSize, sduxRemSize, sdu2DownTransferSize);
+
+      /* calculate the already transmitted bytes */
+      SduXReadPos = sdu2DownTransferSize - sduxRemSize; /* read pos is a byte offset to be added to gibOut*1024 */
+
+      sduxBlockLength = (unsigned short)dtSize;
+      CrIaServ13FstDwlkParamSetSduBlockLength(smDesc, sduxBlockLength);
+
+      /* get up to 1 kiB block data from the 32-bit buffer into a local char array */
+      CrIaCopy(GIBTOTRANSFER_ID, &GibOut);
+      
+      /* set SDU blockdata to gib */
+      CrIaServ13FstDwlkParamSetSduBlockData(smDesc, (unsigned char *)GET_ADDR_FROM_RES_OFFSET(GibOut) + SduXReadPos, sduxBlockLength);      
+
+      break;
+
+    case 4:
+      /* set SduBlockCnt in packet (should be 1 here) */
+      CrIaCopy(SDU4BLOCKCNT_ID, &sduxBlockCnt);
+      CrIaServ13FstDwlkParamSetSduBlockCount(smDesc, sduxBlockCnt);
+
+      /* we have to retrieve the dtSize and the sduxRemSize
+      to calculate the size and position of the data.
+      However, sduxRemSize was modified in the DownTransferDo action,
+      so we have to restore its old value */
+
+      PcktLength = CrFwPcktGetLength(pckt);
+      dtSize = PcktLength - S13_OVERHEAD;
+
+      CrIaCopy(SDU4REMSIZE_ID, &sduxRemSize);
+
+      if (sduxRemSize == 0)
+        sduxRemSize = dtSize;
+      else
+        sduxRemSize += dtSize;
+
+
+      /* now calculate the start position in the buffer */
+      CrIaCopy(S4TOTRANSFERSIZE_ID, &sdu4DownTransferSize);
+      DEBUGP("FST: dtSize: %d old RemSize: %d downTranferSize %d\n", dtSize, sduxRemSize, sdu4DownTransferSize);
+
+      /* calculate the already transmitted bytes */
+      SduXReadPos = sdu4DownTransferSize - sduxRemSize; /* read pos is a byte offset */
+
+      sduxBlockLength = (unsigned short)dtSize;
+      CrIaServ13FstDwlkParamSetSduBlockLength(smDesc, sduxBlockLength);
+
+      /* set SDU blockdata */
+      CrIaServ13FstDwlkParamSetSduBlockData(smDesc, (unsigned char *)SRAM1_FLASH_ADDR + SduXReadPos, sduxBlockLength);
+
+      break;
+
+    default:
+      break;
+    }
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13FstDwlk.h b/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13FstDwlk.h
new file mode 100644
index 0000000..f2e7f26
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13FstDwlk.h
@@ -0,0 +1,48 @@
+/**
+ * @file CrIaServ13FstDwlk.h
+ *
+ * Declaration of the First Downlink Part Report out-going report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV13_FST_DWLK_H
+#define CRIA_SERV13_FST_DWLK_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Enable check of the First Downlink Part Report telemetry packet.
+ * isEnabled = (SDUx State Machine is in DOWN_TRANSFER)
+ * @param smDesc the state machine descriptor
+ * @return the enable check result
+ */
+CrFwBool_t CrIaServ13FstDwlkEnableCheck(FwSmDesc_t smDesc);
+
+/**
+ * Ready check of the First Downlink Part Report telemetry packet.
+ * IsReady = (dtCapacity is greater than zero)
+ * @param smDesc the state machine descriptor
+ * @return the ready check result
+ */
+CrFwBool_t CrIaServ13FstDwlkReadyCheck(FwSmDesc_t smDesc);
+
+/**
+ * Repeat check of the First Downlink Part Report telemetry packet.
+ * IsRepeat = (sduxBlockCnt is equal to zero)
+ * @param smDesc the state machine descriptor
+ * @return the repeat check result
+ */
+CrFwBool_t CrIaServ13FstDwlkRepeatCheck(FwSmDesc_t smDesc);
+
+/**
+ * Update action of the First Downlink Part Report telemetry packet.
+ * Collect dtSize bytes from SDUx
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ13FstDwlkUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV13_FST_DWLK_H */
+
diff --git a/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13IntmDwlk.c b/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13IntmDwlk.c
new file mode 100644
index 0000000..2fbf5a3
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13IntmDwlk.c
@@ -0,0 +1,178 @@
+/**
+ * @file CrIaServ13IntmDwlk.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Intermediate Downlink Part Report out-going report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ13IntmDwlk.h"
+
+#include <FwProfile/FwSmConfig.h>
+#include <CrIaPrSm/CrIaSduCreate.h>
+
+#include <Services/General/CrIaConstants.h>
+#include <Services/General/CrIaParamGetter.h>
+#include <Services/General/CrIaParamSetter.h>
+
+#include <CrFwCmpData.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+/* for CrIbMilBusGetLinkCapacity */
+#if (__sparc__)
+#include "ibsw_interface.h"
+#include <wrap_malloc.h>
+#else
+#define SRAM1_FLASH_ADDR 0
+#endif
+
+/* for GetNBits32 */
+#include "Sdp/SdpAlgorithmsImplementation.h"
+
+#include "../../../IfswDebug.h"
+#include "CrIaIasw.h"
+
+
+CrFwBool_t CrIaServ13IntmDwlkEnableCheck(FwSmDesc_t smDesc)
+{
+  /* NOTE: empty, because the intended functionality is already contained in the CrIaSduDownTransferDo action */
+
+  CRFW_UNUSED(smDesc);
+  return 1;
+}
+
+CrFwBool_t CrIaServ13IntmDwlkReadyCheck(FwSmDesc_t smDesc)
+{
+  /* NOTE: empty, because the intended functionality is already contained in the CrIaSduDownTransferDo action */
+
+  CRFW_UNUSED(smDesc);
+  return 1;
+}
+
+CrFwBool_t CrIaServ13IntmDwlkRepeatCheck(FwSmDesc_t smDesc)
+{
+  /* NOTE: empty, because the intended functionality is already contained in the CrIaSduDownTransferDo action */
+
+  CRFW_UNUSED(smDesc);
+  return 0;
+}
+
+void CrIaServ13IntmDwlkUpdateAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwOutCmpData_t *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned char sduId = 0;
+  CrFwPcktLength_t PcktLength;
+  unsigned int dtSize;
+  unsigned short sduxBlockCnt, sduxBlockLength, GibOut;
+  /*  const unsigned char * sduxBlockData;*/
+  unsigned int sduxRemSize, SduXReadPos;
+  unsigned int sdu2DownTransferSize;
+  unsigned int sdu4DownTransferSize;
+
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwOutCmpData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Collect dtSize bytes from SDUx */
+
+  /* SduId was already set */
+  CrIaServ13IntmDwlkParamGetSduId(&sduId, pckt);
+
+  switch (sduId)
+    {
+
+    case 2:
+      /* set SduBlockCnt in packet */
+      CrIaCopy(SDU2BLOCKCNT_ID, &sduxBlockCnt);
+      CrIaServ13IntmDwlkParamSetSduBlockCount(smDesc, sduxBlockCnt);
+
+      /* we have to retrieve the dtSize and the sduxRemSize
+      to calculate the size and position of the data.
+      However, sduxRemSize was modified in the DownTransferDo action,
+      so we have to restore its old value */
+
+      PcktLength = CrFwPcktGetLength(pckt);
+      dtSize = PcktLength - S13_OVERHEAD;
+
+      CrIaCopy(SDU2REMSIZE_ID, &sduxRemSize);
+
+      if (sduxRemSize == 0)
+        sduxRemSize = dtSize;
+      else
+        sduxRemSize += dtSize;
+
+      /* now calculate the start position in the buffer */
+      CrIaCopy(S2TOTRANSFERSIZE_ID, &sdu2DownTransferSize);
+      
+      /* calculate the already transmitted bytes */
+      SduXReadPos = sdu2DownTransferSize - sduxRemSize; /* read pos is a byte offset to be added to gibOut*1024 */
+
+      sduxBlockLength = (unsigned short)dtSize;
+      CrIaServ13IntmDwlkParamSetSduBlockLength(smDesc, sduxBlockLength);
+
+      /* get up to 1 kiB block data from the 32-bit buffer into a local char array */
+      CrIaCopy(GIBTOTRANSFER_ID, &GibOut);
+
+      /* set SDU blockdata to gib */
+      CrIaServ13IntmDwlkParamSetSduBlockData(smDesc, (unsigned char *)GET_ADDR_FROM_RES_OFFSET(GibOut) + SduXReadPos, sduxBlockLength);      
+
+      break;
+
+    case 4:
+      /* set SduBlockCnt in packet */
+      CrIaCopy(SDU4BLOCKCNT_ID, &sduxBlockCnt);
+      CrIaServ13IntmDwlkParamSetSduBlockCount(smDesc, sduxBlockCnt);
+
+      /* we have to retrieve the dtSize and the sduxRemSize
+      to calculate the size and position of the data.
+      However, sduxRemSize was modified in the DownTransferDo action,
+      so we have to restore its old value */
+
+      PcktLength = CrFwPcktGetLength(pckt);
+      dtSize = PcktLength - S13_OVERHEAD;
+
+      CrIaCopy(SDU4REMSIZE_ID, &sduxRemSize);
+
+      if (sduxRemSize == 0)
+        sduxRemSize = dtSize;
+      else
+        sduxRemSize += dtSize;
+
+
+      /* now calculate the start position in the buffer */
+      CrIaCopy(S4TOTRANSFERSIZE_ID, &sdu4DownTransferSize);
+
+      /* calculate the already transmitted bytes */
+      SduXReadPos = sdu4DownTransferSize - sduxRemSize; /* read pos is a byte offset to be added to gibOut*1024 */
+
+      sduxBlockLength = (unsigned short)dtSize;
+      CrIaServ13IntmDwlkParamSetSduBlockLength(smDesc, sduxBlockLength);
+
+      /* set SDU blockdata */
+      CrIaServ13IntmDwlkParamSetSduBlockData(smDesc, (unsigned char *)SRAM1_FLASH_ADDR + SduXReadPos, sduxBlockLength);
+
+      break;
+
+    default:
+      break;
+    }
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13IntmDwlk.h b/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13IntmDwlk.h
new file mode 100644
index 0000000..35695ee
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13IntmDwlk.h
@@ -0,0 +1,40 @@
+/**
+ * @file CrIaServ13IntmDwlk.h
+ *
+ * Declaration of the Intermediate Downlink Part Report out-going report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV13_INTM_DWLK_H
+#define CRIA_SERV13_INTM_DWLK_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Enable check of the Intermediate Downlink Part Report telemetry packet.
+ * isEnabled = (SDUx State Machine is in DOWN_TRANSFER) AND (dtSize is equal to or larger than sduxRemSize)
+ * @param smDesc the state machine descriptor
+ * @return the enable check result
+ */
+CrFwBool_t CrIaServ13IntmDwlkEnableCheck(FwSmDesc_t smDesc);
+
+/**
+ * Ready check of the Intermediate Downlink Part Report telemetry packet.
+ * IsReady = (sduxBlockCnt is greater than zero) AND (dtCapacity is greater than zero) AND (dtSize is smaller than sduxRemSize)
+ * @param smDesc the state machine descriptor
+ * @return the ready check result
+ */
+CrFwBool_t CrIaServ13IntmDwlkReadyCheck(FwSmDesc_t smDesc);
+
+/**
+ * Update action of the Intermediate Downlink Part Report telemetry packet.
+ * Collect dtSize bytes from SDUx
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ13IntmDwlkUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV13_INTM_DWLK_H */
+
diff --git a/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13LastDwlk.c b/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13LastDwlk.c
new file mode 100644
index 0000000..bc62abc
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13LastDwlk.c
@@ -0,0 +1,180 @@
+/**
+ * @file CrIaServ13LastDwlk.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Last Downlink Part Report out-going report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ13LastDwlk.h"
+
+#include <FwProfile/FwSmConfig.h>
+#include <CrIaPrSm/CrIaSduCreate.h>
+
+#include <Services/General/CrIaConstants.h>
+#include <Services/General/CrIaParamGetter.h>
+#include <Services/General/CrIaParamSetter.h>
+
+#include <CrFwCmpData.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+/* for CrIbMilBusGetLinkCapacity */
+#if (__sparc__)
+#include "ibsw_interface.h"
+#include <wrap_malloc.h>
+#else
+#define SRAM1_FLASH_ADDR 0
+#endif
+
+/* for GetNBits32 */
+#include "Sdp/SdpAlgorithmsImplementation.h"
+
+#include "../../../IfswDebug.h"
+#include "CrIaIasw.h"
+
+
+CrFwBool_t CrIaServ13LastDwlkEnableCheck(FwSmDesc_t smDesc)
+{
+  /* NOTE: empty, because the intended functionality is already contained in the CrIaSduDownTransferDo action */
+
+  CRFW_UNUSED(smDesc);
+  return 1;
+}
+
+CrFwBool_t CrIaServ13LastDwlkReadyCheck(FwSmDesc_t smDesc)
+{
+  /* NOTE: empty, because the intended functionality is already contained in the CrIaSduDownTransferDo action */
+
+  CRFW_UNUSED(smDesc);
+  return 1;
+}
+
+CrFwBool_t CrIaServ13LastDwlkRepeatCheck(FwSmDesc_t smDesc)
+{
+  /* NOTE: empty, because the intended functionality is already contained in the CrIaSduDownTransferDo action */
+
+  CRFW_UNUSED(smDesc);
+  return 0;
+}
+
+void CrIaServ13LastDwlkUpdateAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwOutCmpData_t *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned char sduId = 0;
+  CrFwPcktLength_t PcktLength;
+  unsigned int dtSize;
+  unsigned short sduxBlockCnt, sduxBlockLength, GibOut;
+  /*  const unsigned char * sduxBlockData;*/
+  unsigned int sduxRemSize, SduXReadPos;
+  unsigned int sdu2DownTransferSize;
+  unsigned int sdu4DownTransferSize;
+
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwOutCmpData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Collect dtSize or sduxRemSize (whichever is smaller) bytes from SDUx */
+
+  /* SduId was already set */
+  CrIaServ13LastDwlkParamGetSduId(&sduId, pckt);
+
+  switch (sduId)
+    {
+
+    case 2:
+      /* set SduBlockCnt in packet */
+      CrIaCopy(SDU2BLOCKCNT_ID, &sduxBlockCnt);
+      CrIaServ13LastDwlkParamSetSduBlockCount(smDesc, sduxBlockCnt);
+
+      /* we have to retrieve the dtSize and the sduxRemSize
+      to calculate the size and position of the data.
+      However, sduxRemSize was modified in the DownTransferDo action,
+      so we have to restore its old value */
+
+      PcktLength = CrFwPcktGetLength(pckt);
+      dtSize = PcktLength - S13_OVERHEAD;
+
+      CrIaCopy(SDU2REMSIZE_ID, &sduxRemSize);
+
+      if (sduxRemSize == 0)
+        sduxRemSize = dtSize;
+      else
+        sduxRemSize += dtSize;
+
+      /* now calculate the start position in the buffer */
+      CrIaCopy(S2TOTRANSFERSIZE_ID, &sdu2DownTransferSize);
+      DEBUGP("LAST: dtSize: %d old RemSize: %d downTranferSize %d\n", dtSize, sduxRemSize, sdu2DownTransferSize);
+
+      /* calculate the already transmitted bytes */
+      SduXReadPos = sdu2DownTransferSize - sduxRemSize; /* read pos is a byte offset to be added to gibOut*1024 */
+
+      sduxBlockLength = (unsigned short)dtSize;
+      CrIaServ13LastDwlkParamSetSduBlockLength(smDesc, sduxBlockLength);
+
+      /* get up to 1 kiB block data from the 32-bit buffer into a local char array */
+      CrIaCopy(GIBTOTRANSFER_ID, &GibOut);
+      
+      /* set SDU blockdata to gib */
+      CrIaServ13LastDwlkParamSetSduBlockData(smDesc, (unsigned char *)GET_ADDR_FROM_RES_OFFSET(GibOut) + SduXReadPos, sduxBlockLength);      
+
+      break;
+
+    case 4:
+      /* set SduBlockCnt in packet */
+      CrIaCopy(SDU4BLOCKCNT_ID, &sduxBlockCnt);
+      CrIaServ13LastDwlkParamSetSduBlockCount(smDesc, sduxBlockCnt);
+
+      /* we have to retrieve the dtSize and the sduxRemSize
+      to calculate the size and position of the data.
+      However, sduxRemSize was modified in the DownTransferDo action,
+      so we have to restore its old value */
+
+      PcktLength = CrFwPcktGetLength(pckt);
+      dtSize = PcktLength - S13_OVERHEAD;
+
+      CrIaCopy(SDU4REMSIZE_ID, &sduxRemSize);
+
+      if (sduxRemSize == 0)
+        sduxRemSize = dtSize;
+      else
+        sduxRemSize += dtSize;
+
+
+      /* now calculate the start position in the buffer */
+      CrIaCopy(S4TOTRANSFERSIZE_ID, &sdu4DownTransferSize);
+      DEBUGP("LAST: dtSize: %d old RemSize: %d downTranferSize %d\n", dtSize, sduxRemSize, sdu4DownTransferSize);
+
+      /* calculate the already transmitted bytes */
+      SduXReadPos = sdu4DownTransferSize - sduxRemSize; /* read pos is a byte offset */
+
+      sduxBlockLength = (unsigned short)dtSize;
+      CrIaServ13LastDwlkParamSetSduBlockLength(smDesc, sduxBlockLength);
+
+      /* set SDU blockdata */
+      CrIaServ13LastDwlkParamSetSduBlockData(smDesc, (unsigned char *)SRAM1_FLASH_ADDR + SduXReadPos, sduxBlockLength);
+
+      break;
+
+    default:
+      break;
+    }
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13LastDwlk.h b/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13LastDwlk.h
new file mode 100644
index 0000000..5f6d0de
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ13LargeDataTransferService/OutRep/CrIaServ13LastDwlk.h
@@ -0,0 +1,40 @@
+/**
+ * @file CrIaServ13LastDwlk.h
+ *
+ * Declaration of the Last Downlink Part Report out-going report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV13_LAST_DWLK_H
+#define CRIA_SERV13_LAST_DWLK_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Enable check of the Last Downlink Part Report telemetry packet.
+ * isEnabled = (SDUx State Machine is in DOWN_TRANSFER)
+ * @param smDesc the state machine descriptor
+ * @return the enable check result
+ */
+CrFwBool_t CrIaServ13LastDwlkEnableCheck(FwSmDesc_t smDesc);
+
+/**
+ * Ready check of the Last Downlink Part Report telemetry packet.
+ * IsReady = (sduxBlockCnt is greater than zero) AND (dtCapacity is greater than zero) AND (dtSize is equal to or larger than sduxRemSize)
+ * @param smDesc the state machine descriptor
+ * @return the ready check result
+ */
+CrFwBool_t CrIaServ13LastDwlkReadyCheck(FwSmDesc_t smDesc);
+
+/**
+ * Update action of the Last Downlink Part Report telemetry packet.
+ * Collect dtSize or sduxRemSize (whichever is smaller) bytes from SDUx
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ13LastDwlkUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV13_LAST_DWLK_H */
+
diff --git a/CrIa/src/Services/CrIaServ17TestService/InCmd/CrIaServ17PerfConnTest.c b/CrIa/src/Services/CrIaServ17TestService/InCmd/CrIaServ17PerfConnTest.c
new file mode 100644
index 0000000..dd590d3
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ17TestService/InCmd/CrIaServ17PerfConnTest.c
@@ -0,0 +1,91 @@
+/**
+ * @file CrIaServ17PerfConnTest.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Perform Connection Test in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include <stdlib.h>
+
+#include <Pckt/CrFwPckt.h>
+#include <OutCmp/CrFwOutCmp.h>
+
+#include <OutLoader/CrFwOutLoader.h>
+#include <OutFactory/CrFwOutFactory.h>
+
+#include <Services/General/CrIaConstants.h>
+#include <Services/General/CrIaParamSetter.h>
+
+#include <FwSmConfig.h>
+#include <CrFwCmpData.h>
+
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+
+
+void CrIaServ17PerfConnTestStartAction(FwSmDesc_t smDesc)
+{
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData = (CrFwCmpData_t *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		  = cmpSpecificData->pckt;
+
+  cmpData->outcome = 1;
+
+  SendTcAccRepSucc(pckt);
+  SendTcStartRepSucc(pckt);
+
+  return;
+}
+
+
+
+void CrIaServ17PerfConnTestProgressAction(FwSmDesc_t smDesc)
+{
+  FwSmDesc_t       rep;
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *inData;
+  CrFwInCmdData_t *inSpecificData;
+  CrFwDestSrc_t    source;
+  CrFwGroup_t group = 1; /* PCAT = 2 */
+
+  inData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t *) inData->cmpSpecificData;
+  pckt           = inSpecificData->pckt;
+  source         = CrFwPcktGetSrc(pckt);
+
+  rep = CrFwOutFactoryMakeOutCmp(CRIA_SERV17, CRIA_SERV17_LINK_CONN_REP, 0, 0);
+  if (rep == NULL)
+    {
+      /* handled by Resource FdCheck */
+      return;
+    }
+
+  /* Set out component parameters */
+  CrFwOutCmpSetGroup(rep, group);
+  CrFwOutCmpSetDest(rep, source);
+
+  CrFwOutLoaderLoad(rep);
+
+  inData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ17TestService/InCmd/CrIaServ17PerfConnTest.h b/CrIa/src/Services/CrIaServ17TestService/InCmd/CrIaServ17PerfConnTest.h
new file mode 100644
index 0000000..6fa7fd5
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ17TestService/InCmd/CrIaServ17PerfConnTest.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ17PerfConnTest.h
+ *
+ * Declaration of the Perform Connection Test in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV17_PERF_CONN_TEST_H
+#define CRIA_SERV17_PERF_CONN_TEST_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Start action of the Perform Connection Test in-coming command packet.
+ * Set the action outcome to 'success'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ17PerfConnTestStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Perform Connection Test in-coming command packet.
+ * Load report (17,2); set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ17PerfConnTestProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV17_PERF_CONN_TEST_H */
+
diff --git a/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191DisFdChk.c b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191DisFdChk.c
new file mode 100644
index 0000000..c53f44a
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191DisFdChk.c
@@ -0,0 +1,227 @@
+/**
+ * @file CrIaServ191DisFdChk.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Disable FdCheck in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ191DisFdChk.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaIasw.h>
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <Services/General/CrIaParamGetter.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+CrFwBool_t CrIaServ191DisFdChkValidityCheck(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short FdChkId;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* The identifier of the FdCheck is in interval: (1..FID_MAX) */
+
+  CrIaServ191DisFdChkParamGetFdChkId(&FdChkId, pckt);
+
+  if ((FdChkId > 0) && (FdChkId != FDC_EVT2) && (FdChkId <= FID_MAX))
+    {
+      SendTcAccRepSucc(pckt);
+      return 1;
+    }
+
+  SendTcAccRepFail(pckt, ACK_ILL_FID);
+  return 0;
+}
+
+void CrIaServ191DisFdChkStartAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short FdChkId;
+  unsigned char FdExtEnable = 0;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Set the action outcome to 'success' iff the FdExtEnable flag of the argument FdCheck is set to TRUE */
+
+  CrIaServ191DisFdChkParamGetFdChkId(&FdChkId, pckt);
+
+  if (FdChkId == FDC_TS_TEMP)
+    {
+      CrIaCopy(FDCHECKTTMEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_ILL_CNT)
+    {
+      CrIaCopy(FDCHECKSDSCEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_COMM)
+    {
+      CrIaCopy(FDCHECKCOMERREXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_TO)
+    {
+      CrIaCopy(FDCHECKTIMEOUTEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_SM)
+    {
+      CrIaCopy(FDCHECKSAFEMODEEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_ALIVE)
+    {
+      CrIaCopy(FDCHECKALIVEEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_EVT1)
+    {
+      CrIaCopy(FDCHECKSEMANOEVTEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_OOL)
+    {
+      CrIaCopy(FDCHECKSEMLIMITEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_PSDU_OOL)
+    {
+      CrIaCopy(FDCHECKDPUHKEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_CENT_CONS)
+    {
+      CrIaCopy(FDCHECKCENTCONSEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_RES)
+    {
+      CrIaCopy(FDCHECKRESEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_CONS)
+    {
+      CrIaCopy(FDCHECKSEMCONSEXTEN_ID, &FdExtEnable);
+    }
+
+  if (FdExtEnable == 1)
+    {
+      cmpData->outcome = 1;
+      SendTcStartRepSucc(pckt);
+      return;
+    }
+
+  cmpData->outcome = 0;
+  SendTcStartRepFail(pckt, ACK_FID_DIS, 0, (unsigned short)FdExtEnable);
+
+  return;
+}
+
+void CrIaServ191DisFdChkProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short FdChkId;
+  unsigned char FdExtEnable = 0;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Set the FdExtEnable flag of the argument FdCheck to FALSE */
+
+  CrIaServ191DisFdChkParamGetFdChkId(&FdChkId, pckt);
+
+  if (FdChkId == FDC_TS_TEMP)
+    {
+      CrIaPaste(FDCHECKTTMEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_ILL_CNT)
+    {
+      CrIaPaste(FDCHECKSDSCEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_COMM)
+    {
+      CrIaPaste(FDCHECKCOMERREXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_TO)
+    {
+      CrIaPaste(FDCHECKTIMEOUTEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_SM)
+    {
+      CrIaPaste(FDCHECKSAFEMODEEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_ALIVE)
+    {
+      CrIaPaste(FDCHECKALIVEEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_EVT1)
+    {
+      CrIaPaste(FDCHECKSEMANOEVTEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_OOL)
+    {
+      CrIaPaste(FDCHECKSEMLIMITEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_PSDU_OOL)
+    {
+      CrIaPaste(FDCHECKDPUHKEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_CENT_CONS)
+    {
+      CrIaPaste(FDCHECKCENTCONSEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_RES)
+    {
+      CrIaPaste(FDCHECKRESEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_CONS)
+    {
+      CrIaPaste(FDCHECKSEMCONSEXTEN_ID, &FdExtEnable);
+    }
+
+  /* Set the action outcome to 'completed' */
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191DisFdChk.h b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191DisFdChk.h
new file mode 100644
index 0000000..472d0fe
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191DisFdChk.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ191DisFdChk.h
+ *
+ * Declaration of the Disable FdCheck in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV191_DIS_FD_CHK_H
+#define CRIA_SERV191_DIS_FD_CHK_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Disable FdCheck in-coming command packet.
+ * The identifier of the FdCheck is in interval: (1..FID_MAX)
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ191DisFdChkValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Disable FdCheck in-coming command packet.
+ * Set the action outcome to 'success' iff the FdExtEnable flag of the argument FdCheck is set to TRUE
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ191DisFdChkStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Disable FdCheck in-coming command packet.
+ * Set the FdExtEnable flag of the argument FdCheck to FALSE; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ191DisFdChkProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV191_DIS_FD_CHK_H */
+
diff --git a/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191DisRecovProc.c b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191DisRecovProc.c
new file mode 100644
index 0000000..b9d2961
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191DisRecovProc.c
@@ -0,0 +1,227 @@
+/**
+ * @file CrIaServ191DisRecovProc.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Disable Recovery Procedure in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ191DisRecovProc.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaIasw.h>
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <Services/General/CrIaParamGetter.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+CrFwBool_t CrIaServ191DisRecovProcValidityCheck(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short FdChkId;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* The identifier of the FdCheck is in interval: (1..FID_MAX) */
+
+  CrIaServ191DisRecovProcParamGetFdChkId(&FdChkId, pckt);
+
+  if ((FdChkId > 0) && (FdChkId != FDC_EVT2) && (FdChkId <= FID_MAX))
+    {
+      SendTcAccRepSucc(pckt);
+      return 1;
+    }
+
+  SendTcAccRepFail(pckt, ACK_ILL_RID);
+  return 0;
+}
+
+void CrIaServ191DisRecovProcStartAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short FdChkId;
+  unsigned char RpExtEnable = 0;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Set the action outcome to 'success' iff the RpExtEnable flag of the argument FdCheck is set to TRUE */
+
+  CrIaServ191DisRecovProcParamGetFdChkId(&FdChkId, pckt);
+
+  if (FdChkId == FDC_TS_TEMP)
+    {
+      CrIaCopy(RPTTMEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_ILL_CNT)
+    {
+      CrIaCopy(RPSDSCEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_COMM)
+    {
+      CrIaCopy(RPCOMERREXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_TO)
+    {
+      CrIaCopy(RPTIMEOUTEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_SM)
+    {
+      CrIaCopy(RPSAFEMODEEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_ALIVE)
+    {
+      CrIaCopy(RPALIVEEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_EVT1)
+    {
+      CrIaCopy(RPSEMANOEVTEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_OOL)
+    {
+      CrIaCopy(RPSEMLIMITEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_PSDU_OOL)
+    {
+      CrIaCopy(RPDPUHKEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_CENT_CONS)
+    {
+      CrIaCopy(RPCENTCONSEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_RES)
+    {
+      CrIaCopy(RPRESEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_CONS)
+    {
+      CrIaCopy(RPSEMCONSEXTEN_ID, &RpExtEnable);
+    }
+
+  if (RpExtEnable == 1)
+    {
+      cmpData->outcome = 1;
+      SendTcStartRepSucc(pckt);
+      return;
+    }
+
+  cmpData->outcome = 0;
+  SendTcStartRepFail(pckt, ACK_RID_DIS, 0, (unsigned short)RpExtEnable);
+
+  return;
+}
+
+void CrIaServ191DisRecovProcProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short FdChkId;
+  unsigned char RpExtEnable = 0;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Set the RpExtEnable flag of the argument FdCheck to FALSE */
+
+  CrIaServ191DisRecovProcParamGetFdChkId(&FdChkId, pckt);
+
+  if (FdChkId == FDC_TS_TEMP)
+    {
+      CrIaPaste(RPTTMEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_ILL_CNT)
+    {
+      CrIaPaste(RPSDSCEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_COMM)
+    {
+      CrIaPaste(RPCOMERREXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_TO)
+    {
+      CrIaPaste(RPTIMEOUTEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_SM)
+    {
+      CrIaPaste(RPSAFEMODEEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_ALIVE)
+    {
+      CrIaPaste(RPALIVEEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_EVT1)
+    {
+      CrIaPaste(RPSEMANOEVTEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_OOL)
+    {
+      CrIaPaste(RPSEMLIMITEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_PSDU_OOL)
+    {
+      CrIaPaste(RPDPUHKEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_CENT_CONS)
+    {
+      CrIaPaste(RPCENTCONSEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_RES)
+    {
+      CrIaPaste(RPRESEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_CONS)
+    {
+      CrIaPaste(RPSEMCONSEXTEN_ID, &RpExtEnable);
+    }
+
+  /* Set the action outcome to 'completed' */
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191DisRecovProc.h b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191DisRecovProc.h
new file mode 100644
index 0000000..fdb50f4
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191DisRecovProc.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ191DisRecovProc.h
+ *
+ * Declaration of the Disable Recovery Procedure in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV191_DIS_RECOV_PROC_H
+#define CRIA_SERV191_DIS_RECOV_PROC_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Disable Recovery Procedure in-coming command packet.
+ * The identifier of the FdCheck is in interval: (1..FID_MAX)
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ191DisRecovProcValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Disable Recovery Procedure in-coming command packet.
+ * Set the action outcome to 'success' iff the RpExtEnable flag of the argument FdCheck is set to TRUE
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ191DisRecovProcStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Disable Recovery Procedure in-coming command packet.
+ * Set the RpExtEnable flag of the argument FdCheck to FALSE; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ191DisRecovProcProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV191_DIS_RECOV_PROC_H */
+
diff --git a/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191EnbFdChk.c b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191EnbFdChk.c
new file mode 100644
index 0000000..99e6890
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191EnbFdChk.c
@@ -0,0 +1,227 @@
+/**
+ * @file CrIaServ191EnbFdChk.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Enable FdCheck in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ191EnbFdChk.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaIasw.h>
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <Services/General/CrIaParamGetter.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+CrFwBool_t CrIaServ191EnbFdChkValidityCheck(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short FdChkId;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* The identifier of the FdCheck is in interval: (1..FID_MAX) */
+
+  CrIaServ191EnbFdChkParamGetFdChkId(&FdChkId, pckt);
+
+  if ((FdChkId > 0) && (FdChkId != FDC_EVT2) && (FdChkId <= FID_MAX))
+    {
+      SendTcAccRepSucc(pckt);
+      return 1;
+    }
+
+  SendTcAccRepFail(pckt, ACK_ILL_FID);
+  return 0;
+}
+
+void CrIaServ191EnbFdChkStartAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short FdChkId;
+  unsigned char FdExtEnable = 1;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Set the action outcome to 'success' iff the FdExtEnable flag of the argument FdCheck is set to FALSE */
+
+  CrIaServ191EnbFdChkParamGetFdChkId(&FdChkId, pckt);
+
+  if (FdChkId == FDC_TS_TEMP)
+    {
+      CrIaCopy(FDCHECKTTMEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_ILL_CNT)
+    {
+      CrIaCopy(FDCHECKSDSCEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_COMM)
+    {
+      CrIaCopy(FDCHECKCOMERREXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_TO)
+    {
+      CrIaCopy(FDCHECKTIMEOUTEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_SM)
+    {
+      CrIaCopy(FDCHECKSAFEMODEEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_ALIVE)
+    {
+      CrIaCopy(FDCHECKALIVEEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_EVT1)
+    {
+      CrIaCopy(FDCHECKSEMANOEVTEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_OOL)
+    {
+      CrIaCopy(FDCHECKSEMLIMITEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_PSDU_OOL)
+    {
+      CrIaCopy(FDCHECKDPUHKEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_CENT_CONS)
+    {
+      CrIaCopy(FDCHECKCENTCONSEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_RES)
+    {
+      CrIaCopy(FDCHECKRESEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_CONS)
+    {
+      CrIaCopy(FDCHECKSEMCONSEXTEN_ID, &FdExtEnable);
+    }
+
+  if (FdExtEnable == 0)
+    {
+      cmpData->outcome = 1;
+      SendTcStartRepSucc(pckt);
+      return;
+    }
+
+  cmpData->outcome = 0;
+  SendTcStartRepFail(pckt, ACK_FID_ENB, 0, (unsigned short)FdExtEnable);
+
+  return;
+}
+
+void CrIaServ191EnbFdChkProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short FdChkId;
+  unsigned char FdExtEnable = 1;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Set the FdExtEnable flag of the argument FdCheck to TRUE */
+
+  CrIaServ191DisFdChkParamGetFdChkId(&FdChkId, pckt);
+
+  if (FdChkId == FDC_TS_TEMP)
+    {
+      CrIaPaste(FDCHECKTTMEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_ILL_CNT)
+    {
+      CrIaPaste(FDCHECKSDSCEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_COMM)
+    {
+      CrIaPaste(FDCHECKCOMERREXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_TO)
+    {
+      CrIaPaste(FDCHECKTIMEOUTEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_SM)
+    {
+      CrIaPaste(FDCHECKSAFEMODEEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_ALIVE)
+    {
+      CrIaPaste(FDCHECKALIVEEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_EVT1)
+    {
+      CrIaPaste(FDCHECKSEMANOEVTEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_OOL)
+    {
+      CrIaPaste(FDCHECKSEMLIMITEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_PSDU_OOL)
+    {
+      CrIaPaste(FDCHECKDPUHKEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_CENT_CONS)
+    {
+      CrIaPaste(FDCHECKCENTCONSEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_RES)
+    {
+      CrIaPaste(FDCHECKRESEXTEN_ID, &FdExtEnable);
+    }
+  if (FdChkId == FDC_SEM_CONS)
+    {
+      CrIaPaste(FDCHECKSEMCONSEXTEN_ID, &FdExtEnable);
+    }
+
+  /* Set the action outcome to 'completed' */
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191EnbFdChk.h b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191EnbFdChk.h
new file mode 100644
index 0000000..769496c
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191EnbFdChk.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ191EnbFdChk.h
+ *
+ * Declaration of the Enable FdCheck in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV191_ENB_FD_CHK_H
+#define CRIA_SERV191_ENB_FD_CHK_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Enable FdCheck in-coming command packet.
+ * The identifier of the FdCheck is in interval: (1..FID_MAX)
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ191EnbFdChkValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Enable FdCheck in-coming command packet.
+ * Set the action outcome to 'success' iff the FdExtEnable flag of the argument FdCheck is set to FALSE
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ191EnbFdChkStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Enable FdCheck in-coming command packet.
+ * Set the FdExtEnable flag of the argument FdCheck to TRUE; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ191EnbFdChkProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV191_ENB_FD_CHK_H */
+
diff --git a/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191EnbRecovProc.c b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191EnbRecovProc.c
new file mode 100644
index 0000000..55fce76
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191EnbRecovProc.c
@@ -0,0 +1,227 @@
+/**
+ * @file CrIaServ191EnbRecovProc.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Enable Recovery Procedure in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ191EnbRecovProc.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaIasw.h>
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <Services/General/CrIaParamGetter.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+CrFwBool_t CrIaServ191EnbRecovProcValidityCheck(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short FdChkId;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* The identifier of the FdCheck is in interval: (1..FID_MAX) */
+
+  CrIaServ191DisRecovProcParamGetFdChkId(&FdChkId, pckt);
+
+  if ((FdChkId > 0) && (FdChkId != FDC_EVT2) && (FdChkId <= FID_MAX))
+    {
+      SendTcAccRepSucc(pckt);
+      return 1;
+    }
+
+  SendTcAccRepFail(pckt, ACK_ILL_RID);
+  return 0;
+}
+
+void CrIaServ191EnbRecovProcStartAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short FdChkId;
+  unsigned char RpExtEnable = 1;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Set the action outcome to 'success' iff the RpExtEnable flag of the argument FdCheck is set to FALSE */
+
+  CrIaServ191EnbRecovProcParamGetFdChkId(&FdChkId, pckt);
+
+  if (FdChkId == FDC_TS_TEMP)
+    {
+      CrIaCopy(RPTTMEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_ILL_CNT)
+    {
+      CrIaCopy(RPSDSCEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_COMM)
+    {
+      CrIaCopy(RPCOMERREXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_TO)
+    {
+      CrIaCopy(RPTIMEOUTEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_SM)
+    {
+      CrIaCopy(RPSAFEMODEEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_ALIVE)
+    {
+      CrIaCopy(RPALIVEEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_EVT1)
+    {
+      CrIaCopy(RPSEMANOEVTEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_OOL)
+    {
+      CrIaCopy(RPSEMLIMITEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_PSDU_OOL)
+    {
+      CrIaCopy(RPDPUHKEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_CENT_CONS)
+    {
+      CrIaCopy(RPCENTCONSEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_RES)
+    {
+      CrIaCopy(RPRESEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_CONS)
+    {
+      CrIaCopy(RPSEMCONSEXTEN_ID, &RpExtEnable);
+    }
+
+  if (RpExtEnable == 0)
+    {
+      cmpData->outcome = 1;
+      SendTcStartRepSucc(pckt);
+      return;
+    }
+
+  cmpData->outcome = 0;
+  SendTcStartRepFail(pckt, ACK_RID_ENB, 0, (unsigned short)RpExtEnable);
+
+  return;
+}
+
+void CrIaServ191EnbRecovProcProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short FdChkId;
+  unsigned char RpExtEnable = 1;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Set the RpExtEnable flag of the argument FdCheck to TRUE */
+
+  CrIaServ191EnbRecovProcParamGetFdChkId(&FdChkId, pckt);
+
+  if (FdChkId == FDC_TS_TEMP)
+    {
+      CrIaPaste(RPTTMEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_ILL_CNT)
+    {
+      CrIaPaste(RPSDSCEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_COMM)
+    {
+      CrIaPaste(RPCOMERREXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_TO)
+    {
+      CrIaPaste(RPTIMEOUTEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_SM)
+    {
+      CrIaPaste(RPSAFEMODEEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_ALIVE)
+    {
+      CrIaPaste(RPALIVEEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_EVT1)
+    {
+      CrIaPaste(RPSEMANOEVTEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_OOL)
+    {
+      CrIaPaste(RPSEMLIMITEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_PSDU_OOL)
+    {
+      CrIaPaste(RPDPUHKEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_CENT_CONS)
+    {
+      CrIaPaste(RPCENTCONSEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_RES)
+    {
+      CrIaPaste(RPRESEXTEN_ID, &RpExtEnable);
+    }
+  if (FdChkId == FDC_SEM_CONS)
+    {
+      CrIaPaste(RPSEMCONSEXTEN_ID, &RpExtEnable);
+    }
+
+  /* Set the action outcome to 'completed' */
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191EnbRecovProc.h b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191EnbRecovProc.h
new file mode 100644
index 0000000..c35d977
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191EnbRecovProc.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ191EnbRecovProc.h
+ *
+ * Declaration of the Enable Recovery Procedure in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV191_ENB_RECOV_PROC_H
+#define CRIA_SERV191_ENB_RECOV_PROC_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Enable Recovery Procedure in-coming command packet.
+ * The identifier of the FdCheck is in interval: (1..FID_MAX)
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ191EnbRecovProcValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Enable Recovery Procedure in-coming command packet.
+ * Set the action outcome to 'success' iff the RpExtEnable flag of the argument FdCheck is set to FALSE
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ191EnbRecovProcStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Enable Recovery Procedure in-coming command packet.
+ * Set the RpExtEnable flag of the argument FdCheck to TRUE; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ191EnbRecovProcProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV191_ENB_RECOV_PROC_H */
+
diff --git a/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobDisFdChk.c b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobDisFdChk.c
new file mode 100644
index 0000000..b9a6ccf
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobDisFdChk.c
@@ -0,0 +1,90 @@
+/**
+ * @file CrIaServ191GlobDisFdChk.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Globally Disable FdChecks in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ191GlobDisFdChk.h"
+
+#include <CrFwCmpData.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+void CrIaServ191GlobDisFdChkStartAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+
+  unsigned char FdGlbEnable;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  SendTcAccRepSucc(pckt); /* in the case that no validity check is done also a successful acknowledge report will be sent */
+
+  /* Set the action outcome to 'success' iff the FdGlbEnable flag is set to TRUE */
+
+  CrIaCopy(FDGLBENABLE_ID, &FdGlbEnable);
+
+  if (FdGlbEnable == 1)
+    {
+      cmpData->outcome = 1;
+      SendTcStartRepSucc(pckt);
+      return;
+    }
+
+  cmpData->outcome = 0;
+  SendTcStartRepFail(pckt, ACK_FID_DIS, 0, (unsigned short)FdGlbEnable);
+
+  return;
+}
+
+void CrIaServ191GlobDisFdChkProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned char FdGlbEnable = 0;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Set the FdGlbEnable flag to FALSE */
+
+  CrIaPaste(FDGLBENABLE_ID, &FdGlbEnable);
+
+  /* Set the action outcome to 'completed' */
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobDisFdChk.h b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobDisFdChk.h
new file mode 100644
index 0000000..65de506
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobDisFdChk.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ191GlobDisFdChk.h
+ *
+ * Declaration of the Globally Disable FdChecks in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV191_GLOB_DIS_FD_CHK_H
+#define CRIA_SERV191_GLOB_DIS_FD_CHK_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Start action of the Globally Disable FdChecks in-coming command packet.
+ * Set the action outcome to 'success' iff the FdGlbEnable flag is set to TRUE
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ191GlobDisFdChkStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Globally Disable FdChecks in-coming command packet.
+ * Set the FdGlbEnable flag to FALSE; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ191GlobDisFdChkProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV191_GLOB_DIS_FD_CHK_H */
+
diff --git a/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobDisRecovProc.c b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobDisRecovProc.c
new file mode 100644
index 0000000..4745a55
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobDisRecovProc.c
@@ -0,0 +1,90 @@
+/**
+ * @file CrIaServ191GlobDisRecovProc.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Globally Disable Recovery Procedures in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ191GlobDisRecovProc.h"
+
+#include <CrFwCmpData.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+void CrIaServ191GlobDisRecovProcStartAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+
+  unsigned char RpGlbEnable;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  SendTcAccRepSucc(pckt); /* in the case that no validity check is done also a successful acknowledge report will be sent */
+
+  /* Set the action outcome to 'success' iff the RpGlbEnable flag is set to TRUE */
+
+  CrIaCopy(RPGLBENABLE_ID, &RpGlbEnable);
+
+  if (RpGlbEnable == 1)
+    {
+      cmpData->outcome = 1;
+      SendTcStartRepSucc(pckt);
+      return;
+    }
+
+  cmpData->outcome = 0;
+  SendTcStartRepFail(pckt, ACK_RID_DIS, 0, (unsigned short)RpGlbEnable);
+
+  return;
+}
+
+void CrIaServ191GlobDisRecovProcProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned char RpGlbEnable = 0;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Set the RpGlbEnable flag to FALSE */
+
+  CrIaPaste(RPGLBENABLE_ID, &RpGlbEnable);
+
+  /* Set the action outcome to 'completed' */
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobDisRecovProc.h b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobDisRecovProc.h
new file mode 100644
index 0000000..49af703
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobDisRecovProc.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ191GlobDisRecovProc.h
+ *
+ * Declaration of the Globally Disable Recovery Procedures in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV191_GLOB_DIS_RECOV_PROC_H
+#define CRIA_SERV191_GLOB_DIS_RECOV_PROC_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Start action of the Globally Disable Recovery Procedures in-coming command packet.
+ * Set the action outcome to 'success' iff the RpGlbEnable flag is set to TRUE
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ191GlobDisRecovProcStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Globally Disable Recovery Procedures in-coming command packet.
+ * Set the RpGlbEnable flag to FALSE; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ191GlobDisRecovProcProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV191_GLOB_DIS_RECOV_PROC_H */
+
diff --git a/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobEnbFdChk.c b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobEnbFdChk.c
new file mode 100644
index 0000000..7fef861
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobEnbFdChk.c
@@ -0,0 +1,90 @@
+/**
+ * @file CrIaServ191GlobEnbFdChk.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Globally Enable FdChecks in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ191GlobEnbFdChk.h"
+
+#include <CrFwCmpData.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+void CrIaServ191GlobEnbFdChkStartAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+
+  unsigned char FdGlbEnable;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  SendTcAccRepSucc(pckt); /* in the case that no validity check is done also a successful acknowledge report will be sent */
+
+  /* Set the action outcome to 'success' iff the FdGlbEnable flag is set to FALSE */
+
+  CrIaCopy(FDGLBENABLE_ID, &FdGlbEnable);
+
+  if (FdGlbEnable == 0)
+    {
+      cmpData->outcome = 1;
+      SendTcStartRepSucc(pckt);
+      return;
+    }
+
+  cmpData->outcome = 0;
+  SendTcStartRepFail(pckt, ACK_FID_ENB, 0, (unsigned short)FdGlbEnable);
+
+  return;
+}
+
+void CrIaServ191GlobEnbFdChkProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned char FdGlbEnable = 1;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Set the FdGlbEnable flag to TRUE */
+
+  CrIaPaste(FDGLBENABLE_ID, &FdGlbEnable);
+
+  /* Set the action outcome to 'completed' */
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobEnbFdChk.h b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobEnbFdChk.h
new file mode 100644
index 0000000..934a585
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobEnbFdChk.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ191GlobEnbFdChk.h
+ *
+ * Declaration of the Globally Enable FdChecks in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV191_GLOB_ENB_FD_CHK_H
+#define CRIA_SERV191_GLOB_ENB_FD_CHK_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Start action of the Globally Enable FdChecks in-coming command packet.
+ * Set the action outcome to 'success' iff the FdGlbEnable flag is set to FALSE
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ191GlobEnbFdChkStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Globally Enable FdChecks in-coming command packet.
+ * Set the FdGlbEnable flag to TRUE; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ191GlobEnbFdChkProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV191_GLOB_ENB_FD_CHK_H */
+
diff --git a/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobEnbRecovProc.c b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobEnbRecovProc.c
new file mode 100644
index 0000000..954002c
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobEnbRecovProc.c
@@ -0,0 +1,90 @@
+/**
+ * @file CrIaServ191GlobEnbRecovProc.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Globally Enable Recovery Procedures in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ191GlobEnbRecovProc.h"
+
+#include <CrFwCmpData.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+void CrIaServ191GlobEnbRecovProcStartAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+
+  unsigned char RpGlbEnable;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  SendTcAccRepSucc(pckt); /* in the case that no validity check is done also a successful acknowledge report will be sent */
+
+  /* Set the action outcome to 'success' iff the RpGlbEnable flag is set to FALSE */
+
+  CrIaCopy(RPGLBENABLE_ID, &RpGlbEnable);
+
+  if (RpGlbEnable == 0)
+    {
+      cmpData->outcome = 1;
+      SendTcStartRepSucc(pckt);
+      return;
+    }
+
+  cmpData->outcome = 0;
+  SendTcStartRepFail(pckt, ACK_RID_ENB, 0, (unsigned short)RpGlbEnable);
+
+  return;
+}
+
+void CrIaServ191GlobEnbRecovProcProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned char RpGlbEnable = 1;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Set the RpGlbEnable flag to TRUE */
+
+  CrIaPaste(RPGLBENABLE_ID, &RpGlbEnable);
+
+  /* Set the action outcome to 'completed' */
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobEnbRecovProc.h b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobEnbRecovProc.h
new file mode 100644
index 0000000..e657071
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ191FDIRService/InCmd/CrIaServ191GlobEnbRecovProc.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ191GlobEnbRecovProc.h
+ *
+ * Declaration of the Globally Enable Recovery Procedures in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV191_GLOB_ENB_RECOV_PROC_H
+#define CRIA_SERV191_GLOB_ENB_RECOV_PROC_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Start action of the Globally Enable Recovery Procedures in-coming command packet.
+ * Set the action outcome to 'success' iff the RpGlbEnable flag is set to FALSE
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ191GlobEnbRecovProcStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Globally Enable Recovery Procedures in-coming command packet.
+ * Set the RpGlbEnable flag to TRUE; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ191GlobEnbRecovProcProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV191_GLOB_ENB_RECOV_PROC_H */
+
diff --git a/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192AbortDiag.c b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192AbortDiag.c
new file mode 100644
index 0000000..4b780ab
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192AbortDiag.c
@@ -0,0 +1,121 @@
+/**
+ * @file CrIaServ192AbortDiag.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Abort DIAGNOSTICS in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ192AbortDiag.h"
+
+/** FW Profile function definitions */
+#include <FwProfile/FwSmConstants.h>
+#include <FwProfile/FwSmDCreate.h>
+#include <FwProfile/FwSmConfig.h>
+#include <FwProfile/FwSmCore.h>
+
+/** Cordet FW function definitions */
+#include <CrFramework/OutFactory/CrFwOutFactory.h>
+#include <CrFramework/OutLoader/CrFwOutLoader.h>
+#include <CrFramework/OutCmp/CrFwOutCmp.h>
+
+#include <CrIaIasw.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <CrIaPrSm/CrIaIaswCreate.h>
+#include <CrIaPrSm/CrIaSemCreate.h>
+
+#include <Services/General/CrIaConstants.h>
+#include <Services/General/CrSemConstants.h>
+
+
+void CrIaServ192AbortDiagStartAction(FwSmDesc_t smDesc)
+{
+  unsigned short SEMOPER;
+  unsigned short IASW;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  SendTcAccRepSucc(pckt); /* in the case that no validity check is done also a successful acknowledge report will be sent */
+
+  /* Set the action outcome to 'success' iff the IASW State Machine is in SEM_OFFLINE or PRE_SCIENCE and the SEM Operational State Machine is in DIAGNOSTICS */
+
+  SEMOPER = FwSmGetCurStateEmb(smDescSem);
+  IASW    = FwSmGetCurState(smDescIasw);
+
+  if ((IASW == CrIaIasw_SEM_OFFLINE) || (IASW == CrIaIasw_PRE_SCIENCE))
+    {
+
+      switch (SEMOPER)
+        {
+        case CrIaSem_DIAGNOSTICS:
+
+          cmpData->outcome = 1;
+
+          SendTcStartRepSucc(pckt);
+
+          return;
+        }
+    }
+
+  SendTcStartRepFail(pckt, ACK_WR_SEM_M, 0, (unsigned short)IASW);
+
+  return;
+}
+
+void CrIaServ192AbortDiagProgressAction(FwSmDesc_t smDesc)
+{
+  FwSmDesc_t cmd;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Send command CMD_DIAGNOSTIC_Disable to the SEM; set the action outcome to 'completed' */
+
+
+  /* Create the CMD_Diagnostics_Disable command for SEM: TC(222,4) */
+  cmd = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp (CRSEM_SERV222, CRSEM_SERV222_CMD_DIAG_DISABLE, 0, 0);
+  if (cmd == NULL)
+    {
+      /* handled by Resource FdCheck */
+      return;
+    }
+
+  CrFwOutCmpSetDest(cmd, CR_FW_CLIENT_SEM);
+  CrFwOutLoaderLoad(cmd);
+
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192AbortDiag.h b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192AbortDiag.h
new file mode 100644
index 0000000..e7872f8
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192AbortDiag.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ192AbortDiag.h
+ *
+ * Declaration of the Abort DIAGNOSTICS in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV192_ABORT_DIAG_H
+#define CRIA_SERV192_ABORT_DIAG_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Start action of the Abort DIAGNOSTICS in-coming command packet.
+ * Set the action outcome to 'success' iff the IASW State Machine is in SEM_OFFLINE or PRE_SCIENCE and the SEM Operational State Machine is in DIAGNOSTICS
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ192AbortDiagStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Abort DIAGNOSTICS in-coming command packet.
+ * Send command CMD_DIAGNOSTIC_Disable to the SEM; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ192AbortDiagProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV192_ABORT_DIAG_H */
+
diff --git a/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoCcdFull.c b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoCcdFull.c
new file mode 100644
index 0000000..f0add47
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoCcdFull.c
@@ -0,0 +1,99 @@
+/**
+ * @file CrIaServ192GoCcdFull.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Go to CCD FULL in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ192GoCcdFull.h"
+
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaIasw.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <CrIaPrSm/CrIaIaswCreate.h>
+#include <CrIaPrSm/CrIaSemCreate.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+void CrIaServ192GoCcdFullStartAction(FwSmDesc_t smDesc)
+{
+  unsigned short SEMOPER;
+  unsigned short IASW;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  SendTcAccRepSucc(pckt); /* in the case that no validity check is done also a successful acknowledge report will be sent */
+
+  /* Set the action outcome to 'success' iff the IASW State Machine is in SEM_OFFLINE and the SEM Operational State Machine is in STABILIZE */
+
+  SEMOPER = FwSmGetCurStateEmb(smDescSem);
+  IASW    = FwSmGetCurState(smDescIasw);
+
+  if (IASW == CrIaIasw_SEM_OFFLINE)
+    {
+
+      switch (SEMOPER)
+        {
+        case CrIaSem_STABILIZE:
+
+          cmpData->outcome = 1;
+
+          SendTcStartRepSucc(pckt);
+
+          return;
+        }
+    }
+
+  SendTcStartRepFail(pckt, ACK_WR_SEM_M, 0, (unsigned short)IASW);
+
+  return;
+}
+
+void CrIaServ192GoCcdFullProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Send command GoToCcdFull to the SEM Unit State Machine; set the action outcome to 'completed' */
+
+  FwSmMakeTrans(smDescSem, GoToCcdFull);
+
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoCcdFull.h b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoCcdFull.h
new file mode 100644
index 0000000..956ce96
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoCcdFull.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ192GoCcdFull.h
+ *
+ * Declaration of the Go to CCD FULL in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV192_GO_CCD_FULL_H
+#define CRIA_SERV192_GO_CCD_FULL_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Start action of the Go to CCD FULL in-coming command packet.
+ * Set the action outcome to 'success' iff the IASW State Machine is in SEM_OFFLINE and the SEM Operational State Machine is in STABILIZE
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ192GoCcdFullStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Go to CCD FULL in-coming command packet.
+ * Send command GoToCcdFull to the SEM Unit State Machine; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ192GoCcdFullProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV192_GO_CCD_FULL_H */
+
diff --git a/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoCcdWin.c b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoCcdWin.c
new file mode 100644
index 0000000..f6a7520
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoCcdWin.c
@@ -0,0 +1,99 @@
+/**
+ * @file CrIaServ192GoCcdWin.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Go to CCD WINDOW in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ192GoCcdWin.h"
+
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaIasw.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <CrIaPrSm/CrIaIaswCreate.h>
+#include <CrIaPrSm/CrIaSemCreate.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+void CrIaServ192GoCcdWinStartAction(FwSmDesc_t smDesc)
+{
+  unsigned short SEMOPER;
+  unsigned short IASW;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  SendTcAccRepSucc(pckt); /* in the case that no validity check is done also a successful acknowledge report will be sent */
+
+  /* Set the action outcome to 'success' iff the IASW State Machine is in SEM_OFFLINE and the SEM Operational State Machine is in STABILIZE */
+
+  SEMOPER = FwSmGetCurStateEmb(smDescSem);
+  IASW    = FwSmGetCurState(smDescIasw);
+
+  if (IASW == CrIaIasw_SEM_OFFLINE)
+    {
+
+      switch (SEMOPER)
+        {
+        case CrIaSem_STABILIZE:
+
+          cmpData->outcome = 1;
+
+          SendTcStartRepSucc(pckt);
+
+          return;
+        }
+    }
+
+  SendTcStartRepFail(pckt, ACK_WR_SEM_M, 0, (unsigned short)IASW);
+
+  return;
+}
+
+void CrIaServ192GoCcdWinProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Send command GoToScience to the SEM Unit State Machine; set the action outcome to 'completed' */
+
+  FwSmMakeTrans(smDescSem, GoToCcdWindow);
+
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoCcdWin.h b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoCcdWin.h
new file mode 100644
index 0000000..f166ed3
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoCcdWin.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ192GoCcdWin.h
+ *
+ * Declaration of the Go to CCD WINDOW in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV192_GO_CCD_WIN_H
+#define CRIA_SERV192_GO_CCD_WIN_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Start action of the Go to CCD WINDOW in-coming command packet.
+ * Set the action outcome to 'success' iff the IASW State Machine is in SEM_OFFLINE and the SEM Operational State Machine is in STABILIZE
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ192GoCcdWinStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Go to CCD WINDOW in-coming command packet.
+ * Send command GoToScience to the SEM Unit State Machine; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ192GoCcdWinProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV192_GO_CCD_WIN_H */
+
diff --git a/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoDiag.c b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoDiag.c
new file mode 100644
index 0000000..21e48ed
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoDiag.c
@@ -0,0 +1,99 @@
+/**
+ * @file CrIaServ192GoDiag.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Go to DIAGNOSTICS in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ192GoDiag.h"
+
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaIasw.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <CrIaPrSm/CrIaIaswCreate.h>
+#include <CrIaPrSm/CrIaSemCreate.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+void CrIaServ192GoDiagStartAction(FwSmDesc_t smDesc)
+{
+  unsigned short SEMOPER;
+  unsigned short IASW;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  SendTcAccRepSucc(pckt); /* in the case that no validity check is done also a successful acknowledge report will be sent */
+
+  /* Set the action outcome to 'success' iff the IASW State Machine is in SEM_OFFLINE or PRE_SCIENCE and the SEM Operational State Machine is in STABILIZE */
+
+  SEMOPER = FwSmGetCurStateEmb(smDescSem);
+  IASW    = FwSmGetCurState(smDescIasw);
+
+  if ((IASW == CrIaIasw_SEM_OFFLINE) || (IASW == CrIaIasw_PRE_SCIENCE))
+    {
+
+      switch (SEMOPER)
+        {
+        case CrIaSem_STABILIZE:
+
+          cmpData->outcome = 1;
+
+          SendTcStartRepSucc(pckt);
+
+          return;
+        }
+    }
+
+  SendTcStartRepFail(pckt, ACK_WR_SEM_M, 0, (unsigned short)IASW);
+
+  return;
+}
+
+void CrIaServ192GoDiagProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Send command GoToDiagnostics to the SEM Unit State Machine; set the action outcome to 'completed' */
+
+  FwSmMakeTrans(smDescSem, GoToDiagnostics);
+
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoDiag.h b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoDiag.h
new file mode 100644
index 0000000..f0a6da8
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoDiag.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ192GoDiag.h
+ *
+ * Declaration of the Go to DIAGNOSTICS in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV192_GO_DIAG_H
+#define CRIA_SERV192_GO_DIAG_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Start action of the Go to DIAGNOSTICS in-coming command packet.
+ * Set the action outcome to 'success' iff the IASW State Machine is in SEM_OFFLINE or PRE_SCIENCE and the SEM Operational State Machine is in STABILIZE
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ192GoDiagStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Go to DIAGNOSTICS in-coming command packet.
+ * Send command GoToDiagnostics to the SEM Unit State Machine; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ192GoDiagProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV192_GO_DIAG_H */
+
diff --git a/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoSafe.c b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoSafe.c
new file mode 100644
index 0000000..6988add
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoSafe.c
@@ -0,0 +1,99 @@
+/**
+ * @file CrIaServ192GoSafe.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Go to SAFE in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ192GoSafe.h"
+
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaIasw.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <CrIaPrSm/CrIaIaswCreate.h>
+#include <CrIaPrSm/CrIaSemCreate.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+void CrIaServ192GoSafeStartAction(FwSmDesc_t smDesc)
+{
+  unsigned short SEM;
+  unsigned short IASW;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  SendTcAccRepSucc(pckt); /* in the case that no validity check is done also a successful acknowledge report will be sent */
+
+  /* Set the action outcome to 'success' iff the IASW State Machine is in SEM_OFFLINE and the SEM State Machine is in OPER */
+
+  SEM  = FwSmGetCurState(smDescSem);
+  IASW = FwSmGetCurState(smDescIasw);
+
+  if (IASW == CrIaIasw_SEM_OFFLINE)
+    {
+
+      switch (SEM)
+        {
+        case CrIaSem_OPER:
+
+          cmpData->outcome = 1;
+
+          SendTcStartRepSucc(pckt);
+
+          return;
+        }
+    }
+
+  SendTcStartRepFail(pckt, ACK_WR_SEM_M, 0, (unsigned short)IASW);
+
+  return;
+}
+
+void CrIaServ192GoSafeProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Send command GoToSafe to the SEM Unit State Machine; set the action outcome to 'completed' */
+
+  FwSmMakeTrans(smDescSem, GoToSafe);
+
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoSafe.h b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoSafe.h
new file mode 100644
index 0000000..5dc9ce7
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoSafe.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ192GoSafe.h
+ *
+ * Declaration of the Go to SAFE in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV192_GO_SAFE_H
+#define CRIA_SERV192_GO_SAFE_H
+
+#include "FwProfile/FwSmCore.h"
+#include "CrFwConstants.h"
+
+/**
+ * Start action of the Go to SAFE in-coming command packet.
+ * Set the action outcome to 'success' iff the IASW State Machine is in SEM_OFFLINE and the SEM State Machine is in OPER
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ192GoSafeStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Go to SAFE in-coming command packet.
+ * Send command GoToSafe to the SEM Unit State Machine; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ192GoSafeProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV192_GO_SAFE_H */
+
diff --git a/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoStab.c b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoStab.c
new file mode 100644
index 0000000..61af9dd
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoStab.c
@@ -0,0 +1,104 @@
+/**
+ * @file CrIaServ192GoStab.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Go to STABILIZE in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ192GoStab.h"
+
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaIasw.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <CrIaPrSm/CrIaIaswCreate.h>
+#include <CrIaPrSm/CrIaSemCreate.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+void CrIaServ192GoStabStartAction(FwSmDesc_t smDesc)
+{
+  unsigned short SEMOPER;
+  unsigned short IASW;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  SendTcAccRepSucc(pckt); /* in the case that no validity check is done also a successful acknowledge report will be sent */
+
+  /* Set the action outcome to 'success' iff the IASW State Machine is in SEM_OFFLINE and the SEM Operational State Machine is in one of the following states: STANDBY, CCD_WINDOW, CCD_FULL, or DIAGNOSTICS */
+
+  SEMOPER = FwSmGetCurStateEmb(smDescSem);
+  IASW    = FwSmGetCurState(smDescIasw);
+
+  if (IASW == CrIaIasw_SEM_OFFLINE)
+    {
+
+      switch (SEMOPER)
+        {
+        case CrIaSem_STANDBY:
+        case CrIaSem_CCD_WINDOW:
+        case CrIaSem_CCD_FULL:
+        case CrIaSem_DIAGNOSTICS:
+
+          cmpData->outcome = 1;
+
+          SendTcStartRepSucc(pckt);
+
+          return;
+        }
+    }
+
+  SendTcStartRepFail(pckt, ACK_WR_SEM_M, 0, (unsigned short)IASW);
+
+  return;
+}
+
+
+
+void CrIaServ192GoStabProgressAction(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Send command GoToStabilize to the SEM Unit State Machine; set the action outcome to 'completed' */
+
+  FwSmMakeTrans(smDescSem, GoToStabilize);
+
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoStab.h b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoStab.h
new file mode 100644
index 0000000..e25b7d3
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoStab.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ192GoStab.h
+ *
+ * Declaration of the Go to STABILIZE in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV192_GO_STAB_H
+#define CRIA_SERV192_GO_STAB_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Start action of the Go to STABILIZE in-coming command packet.
+ * Set the action outcome to 'success' iff the IASW State Machine is in SEM_OFFLINE and the SEM Operational State Machine is in one of the following states: STANDBY, CCD_WINDOW, CCD_FULL, or DIAGNOSTICS
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ192GoStabStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Go to STABILIZE in-coming command packet.
+ * Send command GoToStabilize to the SEM Unit State Machine; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ192GoStabProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV192_GO_STAB_H */
+
diff --git a/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoStby.c b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoStby.c
new file mode 100644
index 0000000..d67c01a
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoStby.c
@@ -0,0 +1,98 @@
+/**
+ * @file CrIaServ192GoStby.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Go to STANDBY in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ192GoStby.h"
+
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaIasw.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <CrIaPrSm/CrIaIaswCreate.h>
+#include <CrIaPrSm/CrIaSemCreate.h>
+
+#include <Services/General/CrIaConstants.h>
+#include <Services/General/CrSemConstants.h>
+
+
+void CrIaServ192GoStbyStartAction(FwSmDesc_t smDesc)
+{
+  unsigned short SEM, SEMOPER;
+  unsigned short IASW;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  SendTcAccRepSucc(pckt); /* in the case that no validity check is done also a successful acknowledge report will be sent */
+
+  /* Set the action outcome to 'success' iff: (the IASW State Machine is in SEM OFFLINE) && (the SEM State Machine is in OPER or SAFE) */
+  /*    && (the SEM Operational State Machine is not in STANDBY) */
+
+  SEM     = FwSmGetCurState(smDescSem);
+  IASW    = FwSmGetCurState(smDescIasw);
+  SEMOPER = FwSmGetCurStateEmb(smDescSem);
+
+  if (((SEM == CrIaSem_SAFE) || (SEM == CrIaSem_OPER)) && (IASW == CrIaIasw_SEM_OFFLINE) && (SEMOPER != CrIaSem_STANDBY))
+    {
+
+      cmpData->outcome = 1;
+
+      SendTcStartRepSucc(pckt);
+
+      return;
+    }
+
+  SendTcStartRepFail(pckt, ACK_WR_SEM_M, 0, (unsigned short)IASW);
+
+  return;
+}
+
+
+
+void CrIaServ192GoStbyProgressAction(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  /* Send command GoToStandby to the SEM Unit State Machine; set the action outcome to 'completed' */
+
+  FwSmMakeTrans(smDescSem, GoToStandby);
+
+  cmpData->outcome=1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoStby.h b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoStby.h
new file mode 100644
index 0000000..dbdf7e3
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192GoStby.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ192GoStby.h
+ *
+ * Declaration of the Go to STANDBY in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV192_GO_STBY_H
+#define CRIA_SERV192_GO_STBY_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Start action of the Go to STANDBY in-coming command packet.
+ * Set the action outcome to 'success' iff the IASW State Machine is in SEM_OFFLINE and the SEM State Machine is in SAFE or OPER
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ192GoStbyStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Go to STANDBY in-coming command packet.
+ * Send command GoToStandby to the SEM Unit State Machine; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ192GoStbyProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV192_GO_STBY_H */
+
diff --git a/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192SwchOffSem.c b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192SwchOffSem.c
new file mode 100644
index 0000000..b6a808b
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192SwchOffSem.c
@@ -0,0 +1,92 @@
+/**
+ * @file CrIaServ192SwchOffSem.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Switch Off SEM in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ192SwchOffSem.h"
+
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaIasw.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <CrIaPrSm/CrIaIaswCreate.h>
+#include <CrIaPrSm/CrIaSemCreate.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+void CrIaServ192SwchOffSemStartAction(FwSmDesc_t smDesc)
+{
+  unsigned short IASW;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  SendTcAccRepSucc(pckt); /* in the case that no validity check is done also a successful acknowledge report will be sent */
+
+  /* Set the action outcome to 'success' iff the IASW State Machine is in SEM_OFFLINE */
+
+  IASW = FwSmGetCurState(smDescIasw);
+
+  if (IASW == CrIaIasw_SEM_OFFLINE)
+    {
+
+      cmpData->outcome = 1;
+
+      SendTcStartRepSucc(pckt);
+
+      return;
+    }
+
+  SendTcStartRepFail(pckt, ACK_WR_IASW_M, 0, (unsigned short)IASW);
+
+  return;
+}
+
+
+
+void CrIaServ192SwchOffSemProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData		= (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		= cmpSpecificData->pckt;
+
+  /* Send command SwitchOff to the SEM Unit State Machine; set the action outcome to 'completed' */
+
+  FwSmMakeTrans(smDescSem, SwitchOff);
+
+  cmpData->outcome = 1;
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192SwchOffSem.h b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192SwchOffSem.h
new file mode 100644
index 0000000..eed83da
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192SwchOffSem.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ192SwchOffSem.h
+ *
+ * Declaration of the Switch Off SEM in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV192_SWCH_OFF_SEM_H
+#define CRIA_SERV192_SWCH_OFF_SEM_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Start action of the Switch Off SEM in-coming command packet.
+ * Set the action outcome to 'success' iff the IASW State Machine is in SEM_OFFLINE
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ192SwchOffSemStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Switch Off SEM in-coming command packet.
+ * Send command SwitchOff to the SEM Unit State Machine; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ192SwchOffSemProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV192_SWCH_OFF_SEM_H */
+
diff --git a/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192SwchOnSem.c b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192SwchOnSem.c
new file mode 100644
index 0000000..6350962
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192SwchOnSem.c
@@ -0,0 +1,98 @@
+/**
+ * @file CrIaServ192SwchOnSem.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Switch On SEM in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ192SwchOnSem.h"
+
+#include <FwProfile/FwSmCore.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaIasw.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <CrIaPrSm/CrIaIaswCreate.h>
+#include <CrIaPrSm/CrIaSemCreate.h>
+
+#include <Services/General/CrSemConstants.h>
+#include <Services/General/CrIaConstants.h>
+
+extern FwSmDesc_t smDescSem;
+
+
+void CrIaServ192SwchOnSemStartAction(FwSmDesc_t smDesc)
+{
+  unsigned short SEM;
+  unsigned short IASW;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  SendTcAccRepSucc(pckt); /* in the case that no validity check is done also a successful acknowledge report will be sent */
+
+  /* Set the action outcome to 'success' iff the SEM Unit State Machine is in OFF and the IASW State Machine is in SEM_OFFLINE */
+
+  SEM  = FwSmGetCurState(smDescSem);
+  IASW = FwSmGetCurState(smDescIasw);
+
+  if ((SEM == CrIaSem_OFF) && (IASW == CrIaIasw_SEM_OFFLINE))
+    {
+
+      cmpData->outcome = 1;
+
+      SendTcStartRepSucc(pckt);
+
+      return;
+    }
+
+  SendTcStartRepFail(pckt, ACK_WR_SEM_M, 0, (unsigned short)IASW);
+
+  return;
+}
+
+
+void CrIaServ192SwchOnSemProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Send command SwitchOn to the SEM Unit State Machine; set the action outcome to 'completed' */
+
+  FwSmMakeTrans(smDescSem, SwitchOn);
+
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192SwchOnSem.h b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192SwchOnSem.h
new file mode 100644
index 0000000..6a166f6
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ192SEMManagementService/InCmd/CrIaServ192SwchOnSem.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ192SwchOnSem.h
+ *
+ * Declaration of the Switch On SEM in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV192_SWCH_ON_SEM_H
+#define CRIA_SERV192_SWCH_ON_SEM_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Start action of the Switch On SEM in-coming command packet.
+ * Set the action outcome to 'success' iff the SEM Unit State Machine is in OFF and the IASW State Machine is in SEM_OFFLINE
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ192SwchOnSemStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Switch On SEM in-coming command packet.
+ * Send command SwitchOn to the SEM Unit State Machine; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ192SwchOnSemProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV192_SWCH_ON_SEM_H */
+
diff --git a/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193PrepareSci.c b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193PrepareSci.c
new file mode 100644
index 0000000..fa3e679
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193PrepareSci.c
@@ -0,0 +1,92 @@
+/**
+ * @file CrIaServ193PrepareSci.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Prepare Science in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ193PrepareSci.h"
+
+#include "../../../IfswDebug.h"
+
+#include <CrIaIasw.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <CrIaPrSm/CrIaIaswCreate.h>
+
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+void CrIaServ193PrepareSciStartAction(FwSmDesc_t smDesc)
+{
+  unsigned short smState;
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  SendTcAccRepSucc(pckt); /* in the case that no validity check is done also a successful acknowledge report will be sent */
+
+  /* Set the action outcome to 'success' iff IASW State Machine is in STANDBY */
+
+  smState = FwSmGetCurState(smDescIasw);
+
+  if (smState != CrIaIasw_STANDBY)
+    {
+      SendTcStartRepFail(pckt, ACK_WR_IASW_M, 0, (unsigned short)smState);
+
+      cmpData->outcome = 0;
+
+      return;
+    }
+
+  SendTcStartRepSucc(pckt);
+
+  cmpData->outcome = 1;
+
+  return;
+}
+
+void CrIaServ193PrepareSciProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  /* Send command PrepareScience to the IASW State Machine; set the action outcome to 'completed' */
+
+  FwSmMakeTrans(smDescIasw, PrepareScience);
+
+  SendTcTermRepSucc(pckt);
+
+  cmpData->outcome = 1;
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193PrepareSci.h b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193PrepareSci.h
new file mode 100644
index 0000000..01dbf01
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193PrepareSci.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ193PrepareSci.h
+ *
+ * Declaration of the Prepare Science in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV193_PREPARE_SCI_H
+#define CRIA_SERV193_PREPARE_SCI_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Start action of the Prepare Science in-coming command packet.
+ * Set the action outcome to 'success' iff IASW State Machine is in STANDBY
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ193PrepareSciStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Prepare Science in-coming command packet.
+ * Send command PrepareScience to the IASW State Machine; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ193PrepareSciProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV193_PREPARE_SCI_H */
+
diff --git a/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StartOfflineOper.c b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StartOfflineOper.c
new file mode 100644
index 0000000..51dc148
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StartOfflineOper.c
@@ -0,0 +1,96 @@
+/**
+ * @file CrIaServ193StartOfflineOper.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Start Offline Operation in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ193StartOfflineOper.h"
+
+#include "../../../IfswDebug.h"
+
+#include <CrIaIasw.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <CrIaPrSm/CrIaIaswCreate.h>
+
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+#include <CrConfigIa/CrFwUserConstants.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+void CrIaServ193StartOfflineOperStartAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+  unsigned short smState;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  SendTcAccRepSucc(pckt); /* in the case that no validity check is done also a successful acknowledge report will be sent */
+
+  /* Set the action outcome to 'success' iff IASW State Machine is in STANDBY */
+
+  smState = FwSmGetCurState(smDescIasw);
+
+  if (smState == CrIaIasw_STANDBY)
+    {
+
+      SendTcStartRepSucc(pckt);
+
+      cmpData-> outcome = CRIA_SUCCESS;
+
+    }
+  else
+    {
+
+      SendTcStartRepFail(pckt, ACK_WR_IASW_M, 0, (unsigned short)smState);
+
+      cmpData-> outcome = CRIA_FAILURE;
+    }
+
+  return;
+}
+
+void CrIaServ193StartOfflineOperProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  /* Send command StartOffline to the IASW State Machine; set the action outcome to 'completed' */
+
+  FwSmMakeTrans(smDescIasw, StartOffline);
+
+  SendTcTermRepSucc(pckt);
+
+  cmpData-> outcome = CRIA_SUCCESS;
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StartOfflineOper.h b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StartOfflineOper.h
new file mode 100644
index 0000000..87d22de
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StartOfflineOper.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ193StartOfflineOper.h
+ *
+ * Declaration of the Start Offline Operation in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV193_START_OFFLINE_OPER_H
+#define CRIA_SERV193_START_OFFLINE_OPER_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Start action of the Start Offline Operation in-coming command packet.
+ * Set the action outcome to 'success' iff IASW State Machine is in STANDBY
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ193StartOfflineOperStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Start Offline Operation in-coming command packet.
+ * Send command StartOffline to the IASW State Machine; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ193StartOfflineOperProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV193_START_OFFLINE_OPER_H */
+
diff --git a/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StartSci.c b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StartSci.c
new file mode 100644
index 0000000..2d41a1b
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StartSci.c
@@ -0,0 +1,108 @@
+/**
+ * @file CrIaServ193StartSci.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Start Science in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ193StartSci.h"
+
+#include "../../../IfswDebug.h"
+
+#include <CrIaIasw.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaPrSm/CrIaIaswCreate.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+void CrIaServ193StartSciStartAction(FwSmDesc_t smDesc)
+{
+  unsigned short smState;
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  SendTcAccRepSucc(pckt); /* in the case that no validity check is done also a successful acknowledge report will be sent */
+
+  /* Set the action outcome to 'success' iff IASW State Machine is in PRE_SCIENCE */
+
+  smState = FwSmGetCurState(smDescIasw);
+
+  if (smState==CrIaIasw_PRE_SCIENCE)
+    {
+
+      SendTcStartRepSucc(pckt);
+
+      cmpData-> outcome = CRIA_SUCCESS;
+
+    }
+  else
+    {
+
+      SendTcStartRepFail(pckt, ACK_WR_IASW_M, 0, (unsigned short)smState);
+
+      cmpData-> outcome = CRIA_FAILURE;
+    }
+
+  return;
+}
+
+void CrIaServ193StartSciProgressAction(FwSmDesc_t smDesc)
+{
+  unsigned short smState;
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  /* Send command StartScience to the IASW State Machine; set the action outcome to 'completed' if the IASW State Machine goes to SCIENCE and to 'failed' otherwise */
+
+  /* Send Start Science Command to IASW State Machine */
+  FwSmMakeTrans(smDescIasw, StartScience);
+
+  smState = FwSmGetCurState(smDescIasw);
+
+  if (smState==CrIaIasw_SCIENCE)
+    {
+      SendTcTermRepSucc(pckt);
+
+      cmpData-> outcome = CRIA_SUCCESS;
+    }
+  else 
+    {
+      SendTcTermRepFail(pckt, ACK_MODE_CHNG_FAILED, 0, (unsigned short)smState);
+
+      cmpData-> outcome = CRIA_FAILURE;
+    }
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StartSci.h b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StartSci.h
new file mode 100644
index 0000000..43a9303
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StartSci.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ193StartSci.h
+ *
+ * Declaration of the Start Science in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV193_START_SCI_H
+#define CRIA_SERV193_START_SCI_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Start action of the Start Science in-coming command packet.
+ * Set the action outcome to 'success' iff IASW State Machine is in PRE_SCIENCE
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ193StartSciStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Start Science in-coming command packet.
+ * Send command StartScience to the IASW State Machine; set the action outcome to 'completed' if the IASW State Machine goes to SCIENCE and to 'failed' otherwise
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ193StartSciProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV193_START_SCI_H */
+
diff --git a/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StopScience.c b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StopScience.c
new file mode 100644
index 0000000..fe5e991
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StopScience.c
@@ -0,0 +1,92 @@
+/**
+ * @file CrIaServ193StopScience.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Stop Science in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ193StopScience.h"
+
+#include "../../../IfswDebug.h"
+
+#include <CrIaIasw.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaPrSm/CrIaIaswCreate.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+void CrIaServ193StopScienceStartAction(FwSmDesc_t smDesc)
+{
+  unsigned short smState;
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  SendTcAccRepSucc(pckt); /* in the case that no validity check is done also a successful acknowledge report will be sent */
+
+  /* Set the action outcome to 'success' iff IASW State Machine is in SCIENCE */
+
+  smState = FwSmGetCurState(smDescIasw);
+
+  if (smState == CrIaIasw_SCIENCE)
+    {
+      SendTcStartRepSucc(pckt);
+
+      cmpData-> outcome = 1;
+    }
+  else
+    {
+      SendTcStartRepFail(pckt, ACK_WR_IASW_M, 0, (unsigned short)smState);
+
+      cmpData-> outcome = 0;
+    }
+
+  return;
+}
+
+void CrIaServ193StopScienceProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  /* Send command StopScience to the IASW State Machine; set the action outcome to 'completed' */
+
+  FwSmMakeTrans(smDescIasw, StopScience);
+
+  SendTcTermRepSucc(pckt);
+
+  cmpData->outcome = 1;
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StopScience.h b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StopScience.h
new file mode 100644
index 0000000..94b6a1c
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StopScience.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ193StopScience.h
+ *
+ * Declaration of the Stop Science in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV193_STOP_SCIENCE_H
+#define CRIA_SERV193_STOP_SCIENCE_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Start action of the Stop Science in-coming command packet.
+ * Set the action outcome to 'success' iff IASW State Machine is in SCIENCE
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ193StopScienceStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Stop Science in-coming command packet.
+ * Send command StopScience to the IASW State Machine; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ193StopScienceProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV193_STOP_SCIENCE_H */
+
diff --git a/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StopSem.c b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StopSem.c
new file mode 100644
index 0000000..5569d03
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StopSem.c
@@ -0,0 +1,92 @@
+/**
+ * @file CrIaServ193StopSem.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Stop SEM in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ193StopSem.h"
+
+#include "../../../IfswDebug.h"
+
+#include <CrIaIasw.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <CrIaPrSm/CrIaIaswCreate.h>
+
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+void CrIaServ193StopSemStartAction(FwSmDesc_t smDesc)
+{
+  unsigned short smState;
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  SendTcAccRepSucc(pckt); /* in the case that no validity check is done also a successful acknowledge report will be sent */
+
+  /* Set the action outcome to 'success' iff IASW State Machine is not in STANDBY */
+
+  smState = FwSmGetCurState(smDescIasw);
+
+  if (smState != CrIaIasw_STANDBY)
+    {
+      SendTcStartRepSucc(pckt);
+
+      cmpData-> outcome = 1;
+    }
+  else
+    {
+      SendTcStartRepFail(pckt, ACK_WR_IASW_M, 0, (unsigned short)smState);
+
+      cmpData-> outcome = 0;
+    }
+
+  return;
+}
+
+void CrIaServ193StopSemProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  /* Send command StopSEM to the IASW State Machine; set the action outcome to 'completed' */
+
+  FwSmMakeTrans(smDescIasw, StopSem);
+
+  SendTcTermRepSucc(pckt);
+
+  cmpData-> outcome = 1;
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StopSem.h b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StopSem.h
new file mode 100644
index 0000000..f28cbf7
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193StopSem.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ193StopSem.h
+ *
+ * Declaration of the Stop SEM in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV193_STOP_SEM_H
+#define CRIA_SERV193_STOP_SEM_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Start action of the Stop SEM in-coming command packet.
+ * Set the action outcome to 'success' iff IASW State Machine is not in STANDBY
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ193StopSemStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Stop SEM in-coming command packet.
+ * Send command StopSEM to the IASW State Machine; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ193StopSemProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV193_STOP_SEM_H */
+
diff --git a/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193SwitchOffIasw.c b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193SwitchOffIasw.c
new file mode 100644
index 0000000..5f48977
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193SwitchOffIasw.c
@@ -0,0 +1,87 @@
+/**
+ * @file CrIaServ193SwitchOffIasw.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Controlled Switch-Off IASW in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ193SwitchOffIasw.h"
+
+#include <CrFwCmpData.h>
+#include <FwProfile/FwSmConfig.h>
+#include <FwProfile/FwPrCore.h>
+
+#include <CrIaIasw.h>
+#include <Services/General/CrIaConstants.h>
+#include <IfswUtilities.h>
+
+
+void CrIaServ193SwitchOffIaswStartAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  SendTcAccRepSucc(pckt); /* in the case that no validity check is done also a successful acknowledge report will be sent */
+
+  /* Start the Controlled Switch-Off Procedure and set the action outcome to 'success' */
+
+  FwPrStart(prDescCtrldSwitchOffIasw);
+
+  SendTcStartRepSucc(pckt);
+
+  cmpData-> outcome = 1;
+
+  return;
+}
+
+void CrIaServ193SwitchOffIaswProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+
+  unsigned short status;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  /* Execute the Controlled Switch-Off Procedure and set the action outcome to 'continued' if the procedure is still running 
+     and to 'completed' if it has terminated. */
+
+  FwPrExecute(prDescCtrldSwitchOffIasw);
+
+  status = FwPrIsStarted(prDescCtrldSwitchOffIasw);
+
+  if (status == PR_STARTED)
+    {
+      cmpData-> outcome = 2;
+    }
+  else
+    {
+      SendTcTermRepSucc(pckt);
+
+      cmpData-> outcome = 1;
+    }
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193SwitchOffIasw.h b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193SwitchOffIasw.h
new file mode 100644
index 0000000..863fdd3
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ193IASWModeControlService/InCmd/CrIaServ193SwitchOffIasw.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ193SwitchOffIasw.h
+ *
+ * Declaration of the Controlled Switch-Off IASW in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV193_SWITCH_OFF_IASW_H
+#define CRIA_SERV193_SWITCH_OFF_IASW_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Start action of the Controlled Switch-Off IASW in-coming command packet.
+ * Start the Controlled Switch-Off Procedure and set the action outcome to 'success'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ193SwitchOffIaswStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Controlled Switch-Off IASW in-coming command packet.
+ * Execute the Controlled Switch-Off Procedure and set the action outcome to 'continued' if the procedure is still running and to 'completed' if it has terminated.
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ193SwitchOffIaswProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV193_SWITCH_OFF_IASW_H */
+
diff --git a/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194ResAlgo.c b/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194ResAlgo.c
new file mode 100644
index 0000000..4bc7315
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194ResAlgo.c
@@ -0,0 +1,130 @@
+/**
+ * @file CrIaServ194ResAlgo.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Resume Algorithm in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ194ResAlgo.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaIasw.h>
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <Services/General/CrIaParamGetter.h>
+#include <CrIaPrSm/CrIaAlgoCreate.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+CrFwBool_t CrIaServ194ResAlgoValidityCheck(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short algoId;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* The algorithm identifier must be in the range 1..MAX_ID_ALGO */
+
+  CrIaServ194ResAlgoParamGetAlgoId(&algoId, pckt);
+
+  if ((algoId == 0) || (algoId == 2) || (algoId == 7) || (algoId == 10) || (algoId > MAX_ID_ALGO)) 
+    {
+      SendTcAccRepFail(pckt, ACK_ILL_AID);
+      return 0;
+    }
+
+  SendTcAccRepSucc(pckt);
+  return 1;
+}
+
+void CrIaServ194ResAlgoStartAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short algoId;
+  unsigned short algoState = 65535; /* NOTE: set state undefined */
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Set the action outcome to 'success' iff the target algorithm is in state SUSPENDED */
+
+  CrIaServ194ResAlgoParamGetAlgoId(&algoId, pckt);
+  algoState = FwSmGetCurState(algoSm[algoId-1]);
+
+  if (algoState == CrIaAlgo_SUSPENDED)
+    {
+      cmpData->outcome = 1;
+      SendTcStartRepSucc(pckt);
+      return;
+    }
+
+  cmpData->outcome = 0;
+  SendTcStartRepFail(pckt, ACK_WR_ALGO_M, 0, (unsigned short)algoState);
+
+  return;
+}
+
+void CrIaServ194ResAlgoProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short algoId;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Send command Suspend to the Algorithm State Machine of the target algorithm; */
+
+  CrIaServ194ResAlgoParamGetAlgoId(&algoId, pckt);
+
+  FwSmMakeTrans(algoSm[algoId-1], Resume);
+
+  /* Set the action outcome to 'completed' */
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194ResAlgo.h b/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194ResAlgo.h
new file mode 100644
index 0000000..d757627
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194ResAlgo.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ194ResAlgo.h
+ *
+ * Declaration of the Resume Algorithm in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV194_RES_ALGO_H
+#define CRIA_SERV194_RES_ALGO_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Resume Algorithm in-coming command packet.
+ * The algorithm identifier must be in the range 1..MAX_ID_ALGO
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ194ResAlgoValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Resume Algorithm in-coming command packet.
+ * Set the action outcome to 'success' iff the target algorithm is in state ACTIVE
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ194ResAlgoStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Resume Algorithm in-coming command packet.
+ * Send command Suspend to the Algorithm State Machine of the target algorithm; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ194ResAlgoProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV194_RES_ALGO_H */
+
diff --git a/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194StartAlgo.c b/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194StartAlgo.c
new file mode 100644
index 0000000..0df1955
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194StartAlgo.c
@@ -0,0 +1,163 @@
+/**
+ * @file CrIaServ194StartAlgo.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Start Algorithm in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ194StartAlgo.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaIasw.h>
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <Services/General/CrIaParamGetter.h>
+#include <CrIaPrSm/CrIaAlgoCreate.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+
+#include <IfswDebug.h>
+#include <byteorder.h>
+
+
+CrFwBool_t CrIaServ194StartAlgoValidityCheck(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short algoId;
+  unsigned char len;
+  unsigned int algoParam;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* The algorithm identifier must be in the range 1..MAX_ID_ALGO */
+  /* The algorithm parameters must satisfy their constraints */
+
+  CrIaServ194StartAlgoParamGetAlgoId(&algoId, pckt);
+
+  if ((algoId == 0) || (algoId == 2) || (algoId == 7) ||  (algoId == 10) || (algoId > MAX_ID_ALGO)) 
+    {
+      SendTcAccRepFail(pckt, ACK_ILL_AID);
+      return 0;
+    }
+
+  /* SAA_EVAL_ALGO: check algorithm parameters */
+
+  if (algoId == SAA_EVAL_ALGO)
+    {
+      len = 4;
+
+      CrIaServ194StartAlgoParamGetAlgoParams((unsigned char *) &algoParam, len, pckt);
+
+      if (algoParam == 0)
+        {
+          SendTcAccRepFail(pckt, ACK_ILL_PAR);
+          return 0;
+        }
+
+    }
+
+  SendTcAccRepSucc(pckt);
+  return 1;
+}
+
+void CrIaServ194StartAlgoStartAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short algoId;
+  unsigned short algoState = 65535; /* NOTE: set state undefined */
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Set the action outcome to 'success' iff the target algorithm is in state INACTIVE */
+
+  CrIaServ194StartAlgoParamGetAlgoId(&algoId, pckt);
+  algoState = FwSmGetCurState(algoSm[algoId-1]);
+
+  if (algoState == CrIaAlgo_INACTIVE)
+    {
+      cmpData->outcome = 1;
+      SendTcStartRepSucc(pckt);
+      return;
+    }
+
+  cmpData->outcome = 0;
+  SendTcStartRepFail(pckt, ACK_WR_ALGO_M, 0, (unsigned short)algoState);
+
+  return;
+}
+
+void CrIaServ194StartAlgoProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short algoId;
+  unsigned int initSaaCounter;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Copy the algorithm parameters to the data pool;
+     send command Start to the Algorithm State Machine of the target algorithm; */
+
+  CrIaServ194StartAlgoParamGetAlgoId(&algoId, pckt);
+
+  if (algoId == SAA_EVAL_ALGO)
+    {
+      /* Get parameter InitSaaCounter and set it in data pool */
+      CrIaServ194SaaEvalAlgoParamGetInitSaaCounter(&initSaaCounter, pckt);
+      CrIaPaste(PINITSAACOUNTER_ID, &initSaaCounter);
+    }
+
+  FwSmMakeTrans(algoSm[algoId-1], Start);
+
+  /* Set the action outcome to 'completed' */
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194StartAlgo.h b/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194StartAlgo.h
new file mode 100644
index 0000000..bff4382
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194StartAlgo.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ194StartAlgo.h
+ *
+ * Declaration of the Start Algorithm in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV194_START_ALGO_H
+#define CRIA_SERV194_START_ALGO_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Start Algorithm in-coming command packet.
+ * The algorithm identifier must be in the range 1..MAX_ID_ALGO  and the algorithm parameters must satisfy their constraints
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ194StartAlgoValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Start Algorithm in-coming command packet.
+ * Set the action outcome to 'success' iff the target algorithm is in state INACTIVE
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ194StartAlgoStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Start Algorithm in-coming command packet.
+ * Copy the algorithm parameters to the data pool; send command Start to the Algorithm State Machine of the target algorithm; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ194StartAlgoProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV194_START_ALGO_H */
+
diff --git a/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194StopAlgo.c b/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194StopAlgo.c
new file mode 100644
index 0000000..7f461ba
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194StopAlgo.c
@@ -0,0 +1,130 @@
+/**
+ * @file CrIaServ194StopAlgo.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Stop Algorithm in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ194StopAlgo.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaIasw.h>
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <Services/General/CrIaParamGetter.h>
+#include <CrIaPrSm/CrIaAlgoCreate.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+CrFwBool_t CrIaServ194StopAlgoValidityCheck(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short algoId;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* The algorithm identifier must be in the range 1..MAX_ID_ALGO */
+
+  CrIaServ194StopAlgoParamGetAlgoId(&algoId, pckt);
+
+  if ((algoId == 0) || (algoId == 2) || (algoId == 7) || (algoId == 10) || (algoId > MAX_ID_ALGO)) 
+    {
+      SendTcAccRepFail(pckt, ACK_ILL_AID);
+      return 0;
+    }
+
+  SendTcAccRepSucc(pckt);
+  return 1;
+}
+
+void CrIaServ194StopAlgoStartAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short algoId;
+  unsigned short algoState = 65535; /* NOTE: set state undefined */
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Set the action outcome to 'success' iff the target algorithm is in state other than INACTIVE */
+
+  CrIaServ194StopAlgoParamGetAlgoId(&algoId, pckt);
+  algoState = FwSmGetCurState(algoSm[algoId-1]);
+
+  if (algoState != CrIaAlgo_INACTIVE)
+    {
+      cmpData->outcome = 1;
+      SendTcStartRepSucc(pckt);
+      return;
+    }
+
+  cmpData->outcome = 0;
+  SendTcStartRepFail(pckt, ACK_WR_ALGO_M, 0, (unsigned short)algoState);
+
+  return;
+}
+
+void CrIaServ194StopAlgoProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short algoId;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Send command Stop to the Algorithm State Machine of the target algorithm; */
+
+  CrIaServ194StopAlgoParamGetAlgoId(&algoId, pckt);
+
+  FwSmMakeTrans(algoSm[algoId-1], Stop);
+
+  /* Set the action outcome to 'completed' */
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194StopAlgo.h b/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194StopAlgo.h
new file mode 100644
index 0000000..591928d
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194StopAlgo.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ194StopAlgo.h
+ *
+ * Declaration of the Stop Algorithm in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV194_STOP_ALGO_H
+#define CRIA_SERV194_STOP_ALGO_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Stop Algorithm in-coming command packet.
+ * The algorithm identifier must be in the range 1..MAX_ID_ALGO
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ194StopAlgoValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Stop Algorithm in-coming command packet.
+ * Set the action outcome to 'success' iff the target algorithm is in a state other than INACTIVE
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ194StopAlgoStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Stop Algorithm in-coming command packet.
+ * Send command Stop to the Algorithm State Machine of the target algorithm; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ194StopAlgoProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV194_STOP_ALGO_H */
+
diff --git a/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194SusAlgo.c b/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194SusAlgo.c
new file mode 100644
index 0000000..8a84c28
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194SusAlgo.c
@@ -0,0 +1,130 @@
+/**
+ * @file CrIaServ194SusAlgo.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Suspend Algorithm in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ194SusAlgo.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaIasw.h>
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <Services/General/CrIaParamGetter.h>
+#include <CrIaPrSm/CrIaAlgoCreate.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+
+
+CrFwBool_t CrIaServ194SusAlgoValidityCheck(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short algoId;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* The algorithm identifier must be in the range 1..MAX_ID_ALGO */
+
+  CrIaServ194SusAlgoParamGetAlgoId(&algoId, pckt);
+
+  if ((algoId == 0) || (algoId == 2) || (algoId == 7) || (algoId == 10) || (algoId > MAX_ID_ALGO)) 
+    {
+      SendTcAccRepFail(pckt, ACK_ILL_AID);
+      return 0;
+    }
+
+  SendTcAccRepSucc(pckt);
+  return 1;
+}
+
+void CrIaServ194SusAlgoStartAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short algoId;
+  unsigned short algoState = 65535; /* NOTE: set state undefined */
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Set the action outcome to 'success' iff the target algorithm is in state ACTIVE */
+
+  CrIaServ194SusAlgoParamGetAlgoId(&algoId, pckt);
+  algoState = FwSmGetCurState(algoSm[algoId-1]);
+
+  if (algoState == CrIaAlgo_ACTIVE)
+    {
+      cmpData->outcome = 1;
+      SendTcStartRepSucc(pckt);
+      return;
+    }
+
+  cmpData->outcome = 0;
+  SendTcStartRepFail(pckt, ACK_WR_ALGO_M, 0, (unsigned short)algoState);
+
+  return;
+}
+
+void CrIaServ194SusAlgoProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t    *cmpData;
+  CrFwInCmdData_t  *cmpSpecificData;
+  CrFwPckt_t       pckt;
+
+  unsigned short algoId;
+
+  /* Get in packet */
+  cmpData         = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Send command Suspend to the Algorithm State Machine of the target algorithm; */
+
+  CrIaServ194SusAlgoParamGetAlgoId(&algoId, pckt);
+
+  FwSmMakeTrans(algoSm[algoId-1], Suspend);
+
+  /* Set the action outcome to 'completed' */
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194SusAlgo.h b/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194SusAlgo.h
new file mode 100644
index 0000000..68e0448
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ194AlgorithmControlService/InCmd/CrIaServ194SusAlgo.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ194SusAlgo.h
+ *
+ * Declaration of the Suspend Algorithm in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV194_SUS_ALGO_H
+#define CRIA_SERV194_SUS_ALGO_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Suspend Algorithm in-coming command packet.
+ * The algorithm identifier must be in the range 1..MAX_ID_ALGO
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ194SusAlgoValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Suspend Algorithm in-coming command packet.
+ * Set the action outcome to 'success' iff the target algorithm is in state ACTIVE
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ194SusAlgoStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Suspend Algorithm in-coming command packet.
+ * Send command Suspend to the Algorithm State Machine of the target algorithm; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ194SusAlgoProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV194_SUS_ALGO_H */
+
diff --git a/CrIa/src/Services/CrIaServ195HeartbeatService/OutRep/CrIaServ195HbRep.c b/CrIa/src/Services/CrIaServ195HeartbeatService/OutRep/CrIaServ195HbRep.c
new file mode 100644
index 0000000..07aadcc
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ195HeartbeatService/OutRep/CrIaServ195HbRep.c
@@ -0,0 +1,83 @@
+/**
+ * @file CrIaServ195HbRep.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Heartbeat Report out-going report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ195HbRep.h"
+
+#include <Services/General/CrIaParamSetter.h>
+#include <CrIaPrSm/CrIaSemCreate.h>
+
+#include <CrIaIasw.h>
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+CrFwBool_t toggleFlag = 0;
+
+
+CrFwBool_t CrIaServ195HbRepReadyCheck(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned char isEnabled;
+
+  /* If (HEARTBEAT_ENABLED is TRUE) then isReady is true once every 8 cycles; else isReady is FALSE */
+
+  CrIaCopy(HEARTBEAT_ENABLED_ID, &isEnabled);
+
+  if (!isEnabled)
+    return 0;
+
+  if (FwSmGetExecCnt(smDesc) % 8 == 0)
+    return 1;
+
+  return 0;
+}
+
+
+void CrIaServ195HbRepUpdateAction(FwSmDesc_t smDesc)
+{
+  unsigned char hbSem;
+  unsigned short hbData;
+
+  /* Toggle parameter alternates between HEARTBEAT_D1 and HEARTBEAT_D2 */
+  if(toggleFlag)
+    {
+      CrIaCopy(HEARTBEAT_D2_ID, &hbData);
+      toggleFlag = 0;
+    }
+  else 
+    {
+      CrIaCopy(HEARTBEAT_D1_ID, &hbData);
+      toggleFlag = 1;
+    }
+
+  /* SEM Heater Control Status is OFF if the
+   * SEM State Machine is in OPER and the SEM Operation State
+   * Machine is in a state other than STANDBY
+   */
+
+  hbSem = getHbSem(); 
+  /* Set HbSem Flag in data pool */
+  CrIaPaste(HBSEM_ID, &hbSem); 
+
+  CrIaServ195HbRepParamSetHbData(smDesc, hbData);
+
+  CrIaServ195HbRepParamSetHbSEM(smDesc, hbSem);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ195HeartbeatService/OutRep/CrIaServ195HbRep.h b/CrIa/src/Services/CrIaServ195HeartbeatService/OutRep/CrIaServ195HbRep.h
new file mode 100644
index 0000000..6eeeadb
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ195HeartbeatService/OutRep/CrIaServ195HbRep.h
@@ -0,0 +1,32 @@
+/**
+ * @file CrIaServ195HbRep.h
+ *
+ * Declaration of the Heartbeat Report out-going report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV195_HB_REP_H
+#define CRIA_SERV195_HB_REP_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Ready check of the Heartbeat Report telemetry packet.
+ * If (HEARTBEAT_ENABLED is TRUE) then isReady is true once every 8 cycles; else isReady is FALSE
+ * @param smDesc the state machine descriptor
+ * @return the ready check result
+ */
+CrFwBool_t CrIaServ195HbRepReadyCheck(FwSmDesc_t smDesc);
+
+/**
+ * Update action of the Heartbeat Report telemetry packet.
+ * Toggle parameter alternates between HEARTBEAT_D1 and HEARTBEAT_D2; SEM Heater Control Status is OFF iff the SEM State Machine is in OPER and the SEM Operation State Machine is in a state other than STANDBY
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ195HbRepUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV195_HB_REP_H */
+
diff --git a/CrIa/src/Services/CrIaServ196AOCSService/InCmd/CrIaServ196StarMapCmd.c b/CrIa/src/Services/CrIaServ196AOCSService/InCmd/CrIaServ196StarMapCmd.c
new file mode 100644
index 0000000..947ac52
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ196AOCSService/InCmd/CrIaServ196StarMapCmd.c
@@ -0,0 +1,289 @@
+/**
+ * @file CrIaServ196StarMapCmd.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Star Map Command in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ196StarMapCmd.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+
+#include <IfswDebug.h>
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+#include <Services/General/CrIaParamGetter.h>
+
+#include <Sdp/SdpAlgorithmsImplementation.h> /* for getnbits32 */
+
+#define SAFETARGETDIST 110000 /* max in imaging area is 105150/102350 */
+
+
+CrFwBool_t CrIaServ196StarMapCmdValidityCheck(FwPrDesc_t prDesc)
+{
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  unsigned char skyPattern[1024];
+  unsigned int TargetLocX, TargetLocY;
+  unsigned short acqAlgoId;
+  
+  DEBUGP("CrIaServ196StarMapCmdValidityCheck: TBD\n");
+
+  cmpData         = (CrFwCmpData_t   *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* check range of acquisition algo ID */
+  CrIaServ196StarMapCmdParamGetAcqAlgoId(&acqAlgoId, pckt);
+
+  if ((acqAlgoId < ACQALGOID_NOMINAL) || (acqAlgoId > ACQALGOID_DUMMY))
+    {
+      SendTcAccRepFail(pckt, ACK_ILL_SMAP);
+      return 0;
+    }
+
+  /* the following lines check if Target Location is within a safe distance */
+  CrIaServ196StarMapCmdParamGetSkyPattern(skyPattern, pckt);
+  
+  /* tglocx 24 */
+  GetNBits32 (&TargetLocX, 0, 24, (unsigned int *)skyPattern);
+
+  /* tglocy 24 */
+  GetNBits32 (&TargetLocY, 24, 24, (unsigned int *)skyPattern);
+
+  if (TargetLocX > SAFETARGETDIST)
+    {
+      SendTcAccRepFail(pckt, ACK_ILL_SMAP);
+      return 0;
+    }
+  if (TargetLocY > SAFETARGETDIST)
+    {
+      SendTcAccRepFail(pckt, ACK_ILL_SMAP);
+      return 0;
+    }
+  
+  SendTcAccRepSucc(pckt);
+
+  return 1;
+}
+
+void CrIaServ196StarMapCmdStartAction(FwSmDesc_t smDesc)
+{
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData         = (CrFwCmpData_t *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Set the action outcome to 'success' */
+
+  cmpData->outcome = 1;
+
+  SendTcStartRepSucc(pckt);
+
+  return;
+}
+
+void CrIaServ196StarMapCmdProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  unsigned int ObservationId, TaSpare32;
+  unsigned short TaAlgoId;
+  unsigned char skyPattern[1024];
+
+  unsigned int k;
+
+  unsigned int uint32, bitoff;
+  unsigned short uint16, NrOfStars;
+  unsigned char uint8;
+  
+  cmpData         = (CrFwCmpData_t *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Copy the star pattern, the observation identifier and the target star to the data pool; set the action outcome to 'completed' */
+  DEBUGP("CrIaServ196StarMapCmdProgressAction: Copy the star pattern, the observation identifier and the target star to the data pool; set the action outcome to 'completed'.\n");
+
+  CrIaServ196StarMapCmdParamGetObservationId(&ObservationId, pckt);
+  CrIaPaste(OBSERVATIONID_ID, &ObservationId);  
+  
+  CrIaServ196StarMapCmdParamGetAcqAlgoId(&TaAlgoId, pckt);
+  CrIaPaste(TAACQALGOID_ID, &TaAlgoId);
+  
+  CrIaServ196StarMapCmdParamGetSPARE(&TaSpare32, pckt);
+  CrIaPaste(TASPARE32_ID, &TaSpare32); /* was TARGETSTAR, but is no longer needed */ 
+   
+  /* 
+     read the inner parameters from the sky pattern 
+  */
+  CrIaServ196StarMapCmdParamGetSkyPattern(skyPattern, pckt);
+
+  /* tglocx 24 */
+  bitoff = 0;
+  GetNBits32 (&uint32, bitoff, 24, (unsigned int *)skyPattern);
+  bitoff += 24;
+  CrIaPaste(TARGETLOCATIONX_ID, &uint32);
+
+  /* tglocy 24 */
+  GetNBits32 (&uint32, bitoff, 24, (unsigned int *)skyPattern);
+  bitoff += 24;
+  CrIaPaste(TARGETLOCATIONY_ID, &uint32);
+
+  /* algoid 8 */
+  GetNBits32 (&uint32, bitoff, 8, (unsigned int *)skyPattern);
+  bitoff += 8;
+  uint16 = (unsigned short)uint32; /* NOTE: algoid is uchar in the packet, but enum in the DP, hence the cast */
+  CrIaPaste(TAALGOID_ID, &uint16);
+
+  /* timing1 ushort */
+  GetNBits32 (&uint32, bitoff, 16, (unsigned int *)skyPattern);
+  bitoff += 16;
+  uint16 = (unsigned short)uint32;
+  CrIaPaste(TATIMINGPAR1_ID, &uint16);
+  
+  /* timing2 ushort */
+  GetNBits32 (&uint32, bitoff, 16, (unsigned int *)skyPattern);
+  bitoff += 16;
+  uint16 = (unsigned short)uint32;
+  CrIaPaste(TATIMINGPAR2_ID, &uint16);
+  
+  /* dist  ushort */
+  GetNBits32 (&uint32, bitoff, 16, (unsigned int *)skyPattern);
+  bitoff += 16;
+  uint16 = (unsigned short)uint32;
+  CrIaPaste(TADISTANCETHRD_ID, &uint16);
+  
+  /* iter  uchar in SM, but ushort in DP */
+  GetNBits32 (&uint32, bitoff, 8, (unsigned int *)skyPattern);
+  bitoff += 8;
+  uint16 = (unsigned char)uint32;
+  CrIaPaste(TAITERATIONS_ID, &uint16);
+  
+  /* rebinfact ushort */
+  GetNBits32 (&uint32, bitoff, 16, (unsigned int *)skyPattern);
+  bitoff += 16;
+  uint16 = (unsigned short)uint32;
+  CrIaPaste(TAREBINNINGFACT_ID, &uint16);
+  
+  /* detthrd ushort */
+  GetNBits32 (&uint32, bitoff, 16, (unsigned int *)skyPattern);
+  bitoff += 16;
+  uint16 = (unsigned short)uint32;
+  CrIaPaste(TADETECTIONTHRD_ID, &uint16);
+  
+  /* se_reduced_extr ushort */
+  GetNBits32 (&uint32, bitoff, 16, (unsigned int *)skyPattern);
+  bitoff += 16;
+  uint16 = (unsigned short)uint32;
+  CrIaPaste(TASEREDUCEDEXTR_ID, &uint16);
+  
+  /* se reduced radius 16 */
+  GetNBits32 (&uint32, bitoff, 16, (unsigned int *)skyPattern);
+  bitoff += 16;
+  uint16 = (unsigned short)uint32;
+  CrIaPaste(TASEREDUCEDRADIUS_ID, &uint16);
+  
+  /* se tolerance 16 */
+  GetNBits32 (&uint32, bitoff, 16, (unsigned int *)skyPattern);
+  bitoff += 16;
+  uint16 = (unsigned short)uint32;
+  CrIaPaste(TASETOLERANCE_ID, &uint16);
+  
+  /* mva tolerance 16 */
+  GetNBits32 (&uint32, bitoff, 16, (unsigned int *)skyPattern);
+  bitoff += 16;
+  uint16 = (unsigned short)uint32;
+  CrIaPaste(TAMVATOLERANCE_ID, &uint16);
+  
+  /* ama tolerance 16 */
+  GetNBits32 (&uint32, bitoff, 16, (unsigned int *)skyPattern);
+  bitoff += 16;
+  uint16 = (unsigned short)uint32;
+  CrIaPaste(TAAMATOLERANCE_ID, &uint16);
+  
+  /* pointing uncertainty */
+  GetNBits32 (&uint32, bitoff, 16, (unsigned int *)skyPattern);
+  bitoff += 16;
+  uint16 = (unsigned short)uint32;
+  CrIaPaste(TAPOINTUNCERT_ID, &uint16);
+
+  /* 
+     copy data pattern parameters 
+  */
+  
+  /* targetsig 32 */
+  GetNBits32 (&uint32, bitoff, 32, (unsigned int *)skyPattern);
+  bitoff += 32;
+  CrIaPaste(TATARGETSIG_ID, &uint32);
+  
+  /* nrofstars 16 */
+  GetNBits32 (&uint32, bitoff, 16, (unsigned int *)skyPattern);
+  bitoff += 16;
+  NrOfStars = (unsigned short)uint32;
+  CrIaPaste(TANROFSTARS_ID, &NrOfStars);
+  
+  /* 
+     copy stars pattern 
+  */
+  
+  /* stars... each one has a 16 bit x and y */
+  for (k=0; (k < 2*NrOfStars) && (k < 2*MAXNROFSTARS); k++)
+    {
+      GetNBits32 (&uint32, bitoff, 16, (unsigned int *)skyPattern);
+      bitoff += 16;
+      uint16 = (unsigned short)uint32;
+      
+      uint8 = uint16 >> 8;
+      CrIaPasteArrayItem (STARMAP_ID, &uint8, 2*k);      
+      uint8 = uint16 & 0xff;
+      CrIaPasteArrayItem (STARMAP_ID, &uint8, 2*k+1);      
+    }
+
+  /* Mantis 2135: reset visit counters */
+  uint16 = 0;
+  CrIaPaste(CE_COUNTER_ID, &uint16);
+
+  uint32 = 0;
+  CrIaPaste(SDSCOUNTER_ID, &uint32);
+
+  
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ196AOCSService/InCmd/CrIaServ196StarMapCmd.h b/CrIa/src/Services/CrIaServ196AOCSService/InCmd/CrIaServ196StarMapCmd.h
new file mode 100644
index 0000000..3f4cec7
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ196AOCSService/InCmd/CrIaServ196StarMapCmd.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ196StarMapCmd.h
+ *
+ * Declaration of the Star Map Command in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV196_STAR_MAP_CMD_H
+#define CRIA_SERV196_STAR_MAP_CMD_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Star Map Command in-coming command packet.
+ * TBD
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ196StarMapCmdValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Star Map Command in-coming command packet.
+ * Set the action outcome to 'success' iff the TBD checks on the command parameters are passed.
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ196StarMapCmdStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Star Map Command in-coming command packet.
+ * Copy the star pattern, the observation identifier and the target star to the data pool; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ196StarMapCmdProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV196_STAR_MAP_CMD_H */
+
diff --git a/CrIa/src/Services/CrIaServ196AOCSService/OutRep/CrIaServ196AocsRep.c b/CrIa/src/Services/CrIaServ196AOCSService/OutRep/CrIaServ196AocsRep.c
new file mode 100644
index 0000000..f08181a
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ196AOCSService/OutRep/CrIaServ196AocsRep.c
@@ -0,0 +1,179 @@
+/**
+ * @file CrIaServ196AocsRep.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the AOCS Report out-going report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ196AocsRep.h"
+#include <FwSmConfig.h>
+#include <FwPrCore.h>
+
+#include <Services/General/CrIaConstants.h>
+#include <Services/General/CrIaParamSetter.h>
+
+#include <CrConfigIa/CrFwCmpData.h>
+#include <CrConfigIa/CrFwUserConstants.h>
+
+#include <CrFwTime.h>
+
+#include <CrIaIasw.h>
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+#include <IfswUtilities.h>
+#include <CrIaPrSm/CrIaIaswCreate.h>
+#include <CrIaPrSm/CrIaAlgoCreate.h>
+#include <Ta/TargetAcquisition.h>
+#include <EngineeringAlgorithms.h>
+
+#include <IfswDebug.h>
+
+#if !(__sparc__)
+#include <byteorder.h>
+#endif
+
+
+CrFwBool_t CrIaServ196AocsRepEnableCheck(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned short iaswState;
+
+  iaswState = FwSmGetCurState(smDescIasw);
+
+  if (iaswState != CrIaIasw_SCIENCE)
+    return 0;
+
+  return 1;
+}
+
+
+CrFwBool_t CrIaServ196AocsRepReadyCheck(FwSmDesc_t __attribute__((unused)) smDesc)
+{
+  unsigned int imageCycleCnt;
+  unsigned short algoCent0State, algoCent1State, algoAcqState;
+  static unsigned char Ta_lastsig;
+  
+  /* isReady is true in the cycles in which the Centroiding or Acquisition Algorithm has computed a new centroid. */
+
+  /* check if Centroiding Algorithm or Acquisition Algorithm is ACTIVE */
+  algoCent0State = FwSmGetCurState(smDescAlgoCent0);
+  algoCent1State = FwSmGetCurState(smDescAlgoCent1);
+  algoAcqState = FwSmGetCurState(smDescAlgoAcq1);
+
+  
+  if (algoAcqState != CrIaAlgo_ACTIVE)
+    {
+      if ((algoCent0State != CrIaAlgo_ACTIVE) && (algoCent1State != CrIaAlgo_ACTIVE))
+        {
+          /* return if both are inactive */
+          return 0;
+        }
+      else /* only centroid algorithm is active */
+        {
+          /* true in cycles in which the centroiding algo has computed a new centroid */
+	  /* Mantis 2180 */
+	  if (S196Flag == 0)
+	    return 0;
+        }
+    }
+  else /* target acquisition algorithm is active */
+    {
+      /* Mantis 2226: reset the toggle at the beginning */
+      CrIaCopy(IMAGECYCLECNT_ID, &imageCycleCnt);
+      if (imageCycleCnt == 0xffffffff)
+	{
+	  Ta_lastsig = signal_Ta;
+	  return 0;
+	}    
+
+      if (signal_Ta == Ta_lastsig)
+        {
+	  /* no toggle in signal_Ta means no new centroid */
+          return 0;
+        }
+      else
+        {
+	  Ta_lastsig = signal_Ta;
+        }
+    }
+
+  return 1;
+}
+
+
+void CrIaServ196AocsRepUpdateAction(FwSmDesc_t smDesc)
+{
+  int offsetX, offsetY;
+  unsigned short startIntegFine, endIntegFine, dataCadence;
+  unsigned int targetLocX, targetLocY, startIntegCoarse, endIntegCoarse;
+  unsigned char validityStatus, centValProcOutput;
+
+  /* load the report parameters from the data pool and feed into the packet */
+  
+  /* NOTE: the centroid validity is already entered in the Centroiding and TargetAcquisition functions */
+
+  /* Run the Centroid Validity Procedure */
+  FwPrRun(prDescCentVal);
+
+  /* OffsetX, 24 bits */
+  CrIaCopy (OFFSETX_ID, &offsetX);
+  CrIaServ196AocsRepParamSetOffsetX (smDesc, offsetX);
+
+  /* OffsetY, 24 bits */
+  CrIaCopy (OFFSETY_ID, &offsetY);
+  CrIaServ196AocsRepParamSetOffsetY (smDesc, offsetY);
+
+  /* TargetLocationX, 24 bits */
+  CrIaCopy(TARGETLOCATIONX_ID, &targetLocX);
+  CrIaServ196AocsRepParamSetTargetLocationX (smDesc, targetLocX);
+
+  /* TargetLocationY, 24 bits */
+  CrIaCopy(TARGETLOCATIONY_ID, &targetLocY);
+  CrIaServ196AocsRepParamSetTargetLocationY (smDesc, targetLocY);
+
+  /* IntegStartTimeCrs, 32 bits */
+  CrIaCopy(INTEGSTARTTIMECRS_ID, &startIntegCoarse);
+  CrIaServ196AocsRepParamSetIntegStartTimeCrs (smDesc, startIntegCoarse);
+
+  /* IntegStartTimeFine, 16 bits */
+  CrIaCopy(INTEGSTARTTIMEFINE_ID, &startIntegFine);
+  CrIaServ196AocsRepParamSetIntegStartTimeFine (smDesc, startIntegFine);
+
+  /* IntegEndTimeCrs, 32 bits */
+  CrIaCopy(INTEGENDTIMECRS_ID, &endIntegCoarse);
+  CrIaServ196AocsRepParamSetIntegEndTimeCrs (smDesc, endIntegCoarse);
+
+  /* IntegEndTimeFine, 16 bits */
+  CrIaCopy(INTEGENDTIMEFINE_ID, &endIntegFine);
+  CrIaServ196AocsRepParamSetIntegEndTimeFine (smDesc, endIntegFine);
+
+  /* DataCadence, 16 bits */
+  /* NOTE: datacadence is = SEM repetition time */
+  CrIaCopy(DATACADENCE_ID, &dataCadence); 
+  CrIaServ196AocsRepParamSetCentroidDataCadence (smDesc, dataCadence);
+
+  /* ValidityStatus, 8 bits */
+  CrIaCopy(CENTVALPROCOUTPUT_ID, &centValProcOutput);
+  if (centValProcOutput == 0xEE)
+    {
+      CrIaServ196AocsRepParamSetValidityStatus (smDesc, CEN_INV_INPUT);
+    }
+  else
+    {
+      CrIaCopy(VALIDITYSTATUS_ID, &validityStatus);
+      CrIaServ196AocsRepParamSetValidityStatus (smDesc, validityStatus);
+    }
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ196AOCSService/OutRep/CrIaServ196AocsRep.h b/CrIa/src/Services/CrIaServ196AOCSService/OutRep/CrIaServ196AocsRep.h
new file mode 100644
index 0000000..45d5632
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ196AOCSService/OutRep/CrIaServ196AocsRep.h
@@ -0,0 +1,40 @@
+/**
+ * @file CrIaServ196AocsRep.h
+ *
+ * Declaration of the AOCS Report out-going report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV196_AOCS_REP_H
+#define CRIA_SERV196_AOCS_REP_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Enable check of the AOCS Report telemetry packet.
+ * IsEnabled = (IASW State Machine is in SCIENCE)
+ * @param smDesc the state machine descriptor
+ * @return the enable check result
+ */
+CrFwBool_t CrIaServ196AocsRepEnableCheck(FwSmDesc_t smDesc);
+
+/**
+ * Ready check of the AOCS Report telemetry packet.
+ * isReady is true in the cycles in which the Centroiding or Acquisition Algorithm has computed a new centroid.
+ * @param smDesc the state machine descriptor
+ * @return the ready check result
+ */
+CrFwBool_t CrIaServ196AocsRepReadyCheck(FwSmDesc_t smDesc);
+
+/**
+ * Update action of the AOCS Report telemetry packet.
+ * Run Centroid Validity Procedure and then load report parameters from data pool
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ196AocsRepUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV196_AOCS_REP_H */
+
diff --git a/CrIa/src/Services/CrIaServ197BootReportService/InCmd/CrIaServ197RepBoot.c b/CrIa/src/Services/CrIaServ197BootReportService/InCmd/CrIaServ197RepBoot.c
new file mode 100644
index 0000000..623d1ca
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ197BootReportService/InCmd/CrIaServ197RepBoot.c
@@ -0,0 +1,351 @@
+/**
+ * @file CrIaServ197RepBoot.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Generate Boot Report in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ197RepBoot.h"
+
+#include "CrFwCmpData.h"
+#include "CrFramework/OutFactory/CrFwOutFactory.h"
+#include "CrFramework/OutLoader/CrFwOutLoader.h"
+#include "CrFramework/OutCmp/CrFwOutCmp.h"
+
+#include "FwProfile/FwSmConfig.h"
+#include "FwProfile/FwPrConfig.h"
+
+#include <Services/General/CrIaParamGetter.h>
+#include <Services/General/CrIaParamSetter.h>
+#include <Services/General/CrIaConstants.h>
+#include <CrIaInCmp.h>
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+#include <IfswUtilities.h> /* for memory IDs */
+#include <stdlib.h> /* for NULL */
+#include <string.h> /* for memcpy */
+
+#if(__sparc__)
+#include "ibsw_interface.h"
+#include "iwf_fpga.h"
+#include "exchange_area.h"
+#else
+#define ERROR_LOG_MAX_ENTRIES 64
+#define SIZEOF_ERR_LOG_ENTRY 20
+#endif
+
+
+CrFwBool_t CrIaServ197RepBootValidityCheck(FwPrDesc_t prDesc)
+{
+  CrFwPckt_t pckt;
+  CrFwCmpData_t *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+  unsigned short dpuMemoryId;
+  unsigned int startAddress;
+
+  cmpData = (CrFwCmpData_t *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt = cmpSpecificData->pckt;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  CrIaServ197RepBootParamGetDpuMemoryId (&dpuMemoryId, pckt);
+  CrIaServ197RepBootParamGetStartAddress (&startAddress, pckt);
+
+  /* check command parameters */
+  if (dpuMemoryId == DPU_RAM)
+    {
+      SendTcAccRepSucc(pckt);
+      return 1;
+    }
+
+  if (dpuMemoryId == DPU_FLASH1)
+    {
+      /* every 32 bit address is fine */
+      (void) startAddress;
+      SendTcAccRepSucc(pckt);
+      return 1;
+    }
+
+  if (dpuMemoryId == DPU_FLASH2)
+    {
+      /* every 32 bit address is fine */
+      (void) startAddress;
+      SendTcAccRepSucc(pckt);
+      return 1;
+    }
+
+  if (dpuMemoryId == DPU_FLASH3)
+    {
+      /* every 32 bit address is fine */
+      (void) startAddress;
+      SendTcAccRepSucc(pckt);
+      return 1;
+    }
+
+  if (dpuMemoryId == DPU_FLASH4)
+    {
+      /* every 32 bit address is fine */
+      (void) startAddress;
+      SendTcAccRepSucc(pckt);
+      return 1;
+    }
+
+  SendTcAccRepFail(pckt, ACK_ILL_MEM_ID);
+  return 0;
+}
+
+void CrIaServ197RepBootStartAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+  CrFwPckt_t pckt;
+
+  cmpData = (CrFwCmpData_t *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt = cmpSpecificData->pckt;
+
+  cmpData->outcome = 1;
+
+  SendTcStartRepSucc(pckt);
+
+  return;
+}
+
+void CrIaServ197RepBootProgressAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+  CrFwPckt_t pckt;
+
+  FwSmDesc_t rep;
+  CrFwGroup_t group = 1; /* group 1 PCAT = 2 */
+
+  unsigned char resetType=0, dpuMode=0, dpuSwActive=0, dpuWatchdogStatus=0;
+  unsigned char dpuUnit=2, dpuResetType=0, timeSyncStatus=0, bootReportSent=0;
+  unsigned char spare1=0, semError=0, semOn=0, dpuScLinkStatus=0;
+  unsigned char dpuMilbusCoreEx=0, dpuMilbusSyncDw=0, dpuMilbusSyncTo=0, dpuSemLinkStatus=0;
+  unsigned char dpuSemLinkState=0, trapCore1=0, trapCore2=0;
+
+  unsigned short spare2=0;
+  unsigned short dpuMemoryId=0;
+
+  unsigned int psrRegCore1=0, wimRegCore1=0, pcRegCore1=0, npcRegCore1=0;
+  unsigned int fsrRegCore1=0, psrRegCore2=0, wimRegCore2=0, pcRegCore2=0;
+  unsigned int npcRegCore2=0, fsrRegCore2=0, ahbStatusReg=0, ahbFailingAddrReg=0;
+  unsigned int startAddress=0;
+
+  const unsigned char *resetTime = NULL;
+  const unsigned char *pcHistoryCore1 = NULL;
+  const unsigned char *pcHistoryCore2 = NULL;
+  const unsigned char *errLogInfo = NULL;
+
+  unsigned char charBuf[ERROR_LOG_MAX_ENTRIES * SIZEOF_ERR_LOG_ENTRY];
+  
+  struct exchange_area *exchange;
+
+  unsigned int unit;
+
+  cmpData = (CrFwCmpData_t *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt = cmpSpecificData->pckt;
+
+  (void) pckt;
+  (void) exchange;
+  (void) unit;
+  (void) charBuf;
+  
+  /* Create an out component */
+  rep = (FwSmDesc_t) CrFwOutFactoryMakeOutCmp(CRIA_SERV197, CRIA_SERV197_BOOT_REP, 0, 0);
+  if (rep == NULL)
+    {
+      /* handled by Resource FdCheck */
+      return;
+    }
+
+#if (__sparc__)
+
+  exchange = (struct exchange_area *) EXCHANGE_AREA_BASE_ADDR;
+  
+  resetType = exchange->reset_type;
+
+  dpuMode = (exchange->hk_dbs_status_byte1 >> 4) & 15;
+  dpuSwActive = (exchange->hk_dbs_status_byte1 >> 2) & 3;
+  dpuWatchdogStatus = (exchange->hk_dbs_status_byte1 >> 1) & 1;
+  dpuUnit = exchange->hk_dbs_status_byte1 & 1;
+
+  dpuResetType = (exchange->hk_dbs_status_byte2 >> 5) & 7;
+  timeSyncStatus = (exchange->hk_dbs_status_byte2 >> 4) & 1;
+  bootReportSent = (exchange->hk_dbs_status_byte2 >> 3) & 1;
+  spare1 = (exchange->hk_dbs_status_byte2 >> 2) & 1;
+  semError = (exchange->hk_dbs_status_byte2 >> 1) & 1;
+  semOn = exchange->hk_dbs_status_byte2 & 1;
+
+  dpuScLinkStatus = (exchange->hk_dbs_status_byte3 >> 7) & 1;
+  dpuMilbusCoreEx = (exchange->hk_dbs_status_byte3 >> 6) & 1;
+  dpuMilbusSyncDw = (exchange->hk_dbs_status_byte3 >> 5) & 1;
+  dpuMilbusSyncTo = (exchange->hk_dbs_status_byte3 >> 4) & 1;
+  dpuSemLinkStatus = (exchange->hk_dbs_status_byte3 >> 3) & 1;
+  dpuSemLinkState = exchange->hk_dbs_status_byte3 & 7;
+
+  trapCore1 = (exchange->trapnum_core0);
+  trapCore2 = (exchange->trapnum_core1);
+
+  psrRegCore1 = exchange->regs_cpu0.psr;
+  wimRegCore1 = exchange->regs_cpu0.wim;
+  pcRegCore1 = exchange->regs_cpu0.pc;
+  npcRegCore1 = exchange->regs_cpu0.npc;
+  fsrRegCore1 = exchange->regs_cpu0.fsr;
+
+  psrRegCore2 = exchange->regs_cpu1.psr;
+  wimRegCore2 = exchange->regs_cpu1.wim;
+  pcRegCore2 = exchange->regs_cpu1.pc;
+  npcRegCore2 = exchange->regs_cpu1.npc;
+  fsrRegCore2 = exchange->regs_cpu1.fsr;
+
+  ahbStatusReg = exchange->ahb_status_reg;
+  ahbFailingAddrReg = exchange->ahb_failing_addr_reg;
+
+  spare2 = 0;
+#endif
+
+  CrIaServ197BootRepParamSetResetType(rep, resetType);
+  CrIaServ197BootRepParamSetDpuMode(rep, dpuMode);
+  CrIaServ197BootRepParamSetDpuSwActive(rep, dpuSwActive);
+  CrIaServ197BootRepParamSetDpuWatchdogStatus(rep, dpuWatchdogStatus);
+  CrIaServ197BootRepParamSetDpuUnit(rep, dpuUnit);
+  CrIaServ197BootRepParamSetDpuResetType(rep, dpuResetType);
+  CrIaServ197BootRepParamSetTimeSyncStatus(rep, timeSyncStatus);
+  CrIaServ197BootRepParamSetBootReportSent(rep, bootReportSent);
+  CrIaServ197BootRepParamSetSpare1(rep, spare1);
+  CrIaServ197BootRepParamSetSemError(rep, semError);
+  CrIaServ197BootRepParamSetSemOn(rep, semOn);
+  CrIaServ197BootRepParamSetDpuScLinkStatus(rep, dpuScLinkStatus);
+  CrIaServ197BootRepParamSetDpuMilbusCoreEx(rep, dpuMilbusCoreEx);
+  CrIaServ197BootRepParamSetDpuMilbusSyncDw(rep, dpuMilbusSyncDw);
+  CrIaServ197BootRepParamSetDpuMilbusSyncTo(rep, dpuMilbusSyncTo);
+  CrIaServ197BootRepParamSetDpuSemLinkStatus(rep, dpuSemLinkStatus);
+  CrIaServ197BootRepParamSetDpuSemLinkState(rep, dpuSemLinkState);
+#if (__sparc__)
+  charBuf[0] = (exchange->reset_time.coarse_time >> 24) & 0xff;
+  charBuf[1] = (exchange->reset_time.coarse_time >> 16) & 0xff;
+  charBuf[2] = (exchange->reset_time.coarse_time >> 8) & 0xff;
+  charBuf[3] = (exchange->reset_time.coarse_time) & 0xff;
+  charBuf[4] = (exchange->reset_time.fine_time >> 8) & 0xff;
+  charBuf[5] = (exchange->reset_time.fine_time) & 0xff;
+#endif
+  resetTime = charBuf;
+  CrIaServ197BootRepParamSetResetTime(rep, resetTime);
+
+  CrIaServ197BootRepParamSetTrapCore1(rep, trapCore1);
+  CrIaServ197BootRepParamSetTrapCore2(rep, trapCore2);
+
+  CrIaServ197BootRepParamSetPsrRegCore1(rep, psrRegCore1);
+  CrIaServ197BootRepParamSetWimRegCore1(rep, wimRegCore1);
+  CrIaServ197BootRepParamSetPcRegCore1(rep, pcRegCore1);
+  CrIaServ197BootRepParamSetNpcRegCore1(rep, npcRegCore1);
+  CrIaServ197BootRepParamSetFsrRegCore1(rep, fsrRegCore1);
+
+  CrIaServ197BootRepParamSetPsrRegCore2(rep, psrRegCore2);
+  CrIaServ197BootRepParamSetWimRegCore2(rep, wimRegCore2);
+  CrIaServ197BootRepParamSetPcRegCore2(rep, pcRegCore2);
+  CrIaServ197BootRepParamSetNpcRegCore2(rep, npcRegCore2);
+  CrIaServ197BootRepParamSetFsrRegCore2(rep, fsrRegCore2);
+
+  CrIaServ197BootRepParamSetAhbStatusReg(rep, ahbStatusReg);
+  CrIaServ197BootRepParamSetAhbFailingAddrReg(rep, ahbFailingAddrReg);
+
+#if (__sparc__)
+  pcHistoryCore1 = (unsigned char *) exchange->stacktrace_cpu0;
+  CrIaServ197BootRepParamSetPcHistoryCore1(rep, pcHistoryCore1);
+
+  pcHistoryCore2 = (unsigned char *) exchange->stacktrace_cpu1;
+  CrIaServ197BootRepParamSetPcHistoryCore2(rep, pcHistoryCore2);
+#else
+  (void) pcHistoryCore1;
+  (void) pcHistoryCore2;
+#endif
+  
+  CrIaServ197BootRepParamSetSpare2(rep, spare2);
+
+  CrIaServ197RepBootParamGetDpuMemoryId (&dpuMemoryId, pckt);
+  CrIaServ197RepBootParamGetStartAddress (&startAddress, pckt);
+  
+  CrIaServ197BootRepParamSetDpuMemoryId(rep, dpuMemoryId);
+  CrIaServ197BootRepParamSetStartAddress(rep, startAddress);
+
+  
+  /*
+     get the 64 most recent RAM error log entries, most recent one first
+     the setter copies the first 44 entries to the report
+  */
+  
+#if (__sparc__)
+
+  /* Mantis 1995: clear charBuf before */
+  bzero(charBuf, ERROR_LOG_MAX_ENTRIES * SIZEOF_ERR_LOG_ENTRY);
+  bzero((char *) SRAM1_DBS_FLASH_BUFFER, ERROR_LOG_MAX_ENTRIES * SIZEOF_ERR_LOG_ENTRY);
+  
+  if (dpuMemoryId == DPU_RAM)
+    {
+      CrIbDumpRamErrorLog (charBuf);
+    }
+  else /* can only be DPU_FLASH1..4 due to validity check */
+    {
+      /* Retrieve error log from flash */
+      /* Mantis 1995: the units are indexed 0..3 */
+      unit = 0; /* DPU_FLASH1 */
+      if (dpuMemoryId == DPU_FLASH2)
+	{
+	  unit = 1;
+	}
+      if (dpuMemoryId == DPU_FLASH3)
+	{
+	  unit = 2;
+	}
+      if (dpuMemoryId == DPU_FLASH4)
+	{
+	  unit = 3;
+	}
+      
+      /* the requested flash unit/address is dumped to the 1 MiB DBS FLASH buffer */
+      CrIbDumpFlashErrorLog(unit, startAddress, (char *) SRAM1_DBS_FLASH_BUFFER);
+	  
+      memcpy(charBuf, (const void *) SRAM1_DBS_FLASH_BUFFER, sizeof(charBuf));
+    } 
+
+#endif
+  
+  errLogInfo = charBuf;
+  CrIaServ197BootRepParamSetErrLogInfo(rep, errLogInfo);
+
+  /* Set out component parameters */
+  CrFwOutCmpSetGroup(rep, group);
+
+  CrFwOutCmpSetDest(rep, CR_FW_CLIENT_GRD_PUS); /* obc: CR_FW_CLIENT_OBC, grnd: CR_FW_CLIENT_GRD_PUS */
+
+  /* Load the Boot Report (197,1); set the action outcome to 'completed' */
+  CrFwOutLoaderLoad(rep);
+
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
diff --git a/CrIa/src/Services/CrIaServ197BootReportService/InCmd/CrIaServ197RepBoot.h b/CrIa/src/Services/CrIaServ197BootReportService/InCmd/CrIaServ197RepBoot.h
new file mode 100644
index 0000000..49c3c6e
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ197BootReportService/InCmd/CrIaServ197RepBoot.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ197RepBoot.h
+ *
+ * Declaration of the Generate Boot Report in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV197_REP_BOOT_H
+#define CRIA_SERV197_REP_BOOT_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Generate Boot Report in-coming command packet.
+ * The command parameters must have legal values
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ197RepBootValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Generate Boot Report in-coming command packet.
+ * Set the action outcome to 'success'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ197RepBootStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Generate Boot Report in-coming command packet.
+ * Load the Boot Report (197,1); set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ197RepBootProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV197_REP_BOOT_H */
+
diff --git a/CrIa/src/Services/CrIaServ197BootReportService/OutRep/CrIaServ197BootRep.c b/CrIa/src/Services/CrIaServ197BootReportService/OutRep/CrIaServ197BootRep.c
new file mode 100644
index 0000000..fd92008
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ197BootReportService/OutRep/CrIaServ197BootRep.c
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ197BootRep.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Boot Report out-going report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ197BootRep.h"
+
+
+void CrIaServ197BootRepUpdateAction(FwSmDesc_t smDesc)
+{
+  CRFW_UNUSED(smDesc);
+
+  /* Do nothing */
+  /* NOTE: content of packet is set in Progress Action of TC(197,1) */
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ197BootReportService/OutRep/CrIaServ197BootRep.h b/CrIa/src/Services/CrIaServ197BootReportService/OutRep/CrIaServ197BootRep.h
new file mode 100644
index 0000000..ae55207
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ197BootReportService/OutRep/CrIaServ197BootRep.h
@@ -0,0 +1,24 @@
+/**
+ * @file CrIaServ197BootRep.h
+ *
+ * Declaration of the Boot Report out-going report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV197_BOOT_REP_H
+#define CRIA_SERV197_BOOT_REP_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Update action of the Boot Report telemetry packet.
+ * Retrieve content of Boot Report from IBSW
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ197BootRepUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV197_BOOT_REP_H */
+
diff --git a/CrIa/src/Services/CrIaServ198ProcedureControlService/InCmd/CrIaServ198ProcStart.c b/CrIa/src/Services/CrIaServ198ProcedureControlService/InCmd/CrIaServ198ProcStart.c
new file mode 100644
index 0000000..320a3ab
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ198ProcedureControlService/InCmd/CrIaServ198ProcStart.c
@@ -0,0 +1,1203 @@
+/**
+ * @file CrIaServ198ProcStart.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Start Procedure in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#if !(__sparc__)
+#include <stdio.h> /* only for NULL */
+#include <stdlib.h> /* free */
+#endif
+
+/** FW Profile function definitions */
+#include <FwProfile/FwSmConfig.h>
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwPrCore.h>
+
+#include "CrIaServ198ProcStart.h"
+#include "CrFwCmpData.h"
+#include <Services/General/CrIaParamGetter.h>
+#include <Services/General/CrIaConstants.h>
+#include <Services/General/CrSemConstants.h>
+#include <CrIaInCmp.h>
+#include <IfswUtilities.h>
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+#include <CrIaIasw.h> /* for Event Reporting and extern sm and prDescriptors */
+
+#include "../../../IfswDebug.h"
+
+/* access to RAM */
+#if (__sparc__)
+#include <wrap_malloc.h>
+#else
+#include "Sdp/SdpBuffers.h"
+#endif
+
+
+int CheckSdbParameters (struct SdbLayout *cfg)
+{  
+  unsigned int CibSize, SibSize, GibSize;
+ 
+  /* 
+     check overall size for shared FULL/WIN memory config
+     For SIB and CIB, the larger of FULL/WIN is used.
+
+     NOTE: here we check these sizes in the same way they are
+     actually applied in CrIaSdbFunc.c CrIaSdbAction1 . 
+  */  
+  CibSize = cfg->CibNFull * cfg->CibSizeFull;
+  if ((unsigned int)(cfg->CibNWin * cfg->CibSizeWin) > CibSize)
+    CibSize = cfg->CibNWin * cfg->CibSizeWin;
+  
+  SibSize = cfg->SibNFull * cfg->SibSizeFull;
+  if ((unsigned int)(cfg->SibNWin * cfg->SibSizeWin) > SibSize)
+    SibSize = cfg->SibNWin * cfg->SibSizeWin;
+  
+  /* the GIB is not shared */
+  GibSize = cfg->GibNFull * cfg->GibSizeFull + cfg->GibNWin * cfg->GibSizeWin;
+  
+  DEBUGP("S(198,1) CONFIG SDB Sizes are: %d %d %d vs SDB size %d\n", SibSize, CibSize, GibSize, SDB_SIZE);
+  DEBUGP("                          Win: %d %d %d\n", cfg->SibSizeWin, cfg->CibSizeWin, cfg->GibSizeWin);
+  DEBUGP("                         Full: %d %d %d\n", cfg->SibSizeFull, cfg->CibSizeFull, cfg->GibSizeFull);
+  
+  if ((CibSize + SibSize)*1024 > SDB_SIZE)
+    {
+      /* error, too much RAM is requested */
+      return 1;
+    }
+
+  if ((GibSize * 1024) > SRAM1_RES_SIZE)
+    {
+      /* error, too much RAM is requested */
+      return 1;
+    }
+
+  return 0;
+}
+
+
+CrFwBool_t CrIaServ198ProcStartValidityCheck(FwPrDesc_t prDesc)
+{
+  CrFwPckt_t pckt;
+  CrFwCmpData_t *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+  struct SdbLayout SdbCfg;
+  
+  unsigned short ProcId;
+
+  /* variables for Save Images */
+  unsigned short saveTarget;
+  unsigned char fbfInit, fbfEnd;
+
+  /* variables for FBF Save and FBF Load */
+  unsigned char fbfId, fbfNBlocks;
+  unsigned short fbfRamAreaId, AddrId;
+  unsigned int fbfRamAddr, Addr;
+
+  /* variables for FBF To Ground */
+  unsigned char nmbFbf;
+  /*unsigned char fbfInit; declaration used from Save Images above */
+  unsigned char fbfSize;
+
+  /* variables for ... */
+  unsigned int imageRep;         /* Acq Full Drop, Cal Full Snap, Sci Stack */
+  unsigned int expTime;          /* Acq Full Drop, Cal Full Snap, Sci Stack */
+  unsigned int nmbImages;        /* Cal Full Snap, Sci Stack */
+  unsigned short centSel;        /* Cal Full Snap, Sci Stack */
+  unsigned short ccdRdMode;      /* Sci Stack */
+  unsigned short winPosX;        /* Sci Stack */
+  unsigned short winPosY;        /* Sci Stack */
+  unsigned short winSizeX;       /* Sci Stack */
+  unsigned short winSizeY;       /* Sci Stack */
+
+  unsigned int expTimeAcq;       /* Nom Sci - Acq */
+  unsigned int imageRepAcq;      /* Nom Sci - Acq */
+
+  unsigned int expTimeCal1;      /* Nom Sci - Cal1 */
+  unsigned int imageRepCal1;     /* Nom Sci - Cal1 */
+  unsigned int nmbImagesCal1;    /* Nom Sci - Cal1 */
+  unsigned short centSelCal1;    /* Nom Sci - Cal1 */
+
+  unsigned int nmbImagesSci;     /* Nom Sci - Sci */
+  unsigned short ccdRdModeSci;   /* Nom Sci - Sci */
+  unsigned int expTimeSci;       /* Nom Sci - Sci */
+  unsigned int imageRepSci;      /* Nom Sci - Sci */
+  unsigned short winPosXSci;     /* Nom Sci - Sci */
+  unsigned short winPosYSci;     /* Nom Sci - Sci */
+  unsigned short winSizeXSci;    /* Nom Sci - Sci */
+  unsigned short winSizeYSci;    /* Nom Sci - Sci */
+  unsigned short centSelSci;     /* Nom Sci - Sci */
+
+  unsigned int expTimeCal2;      /* Nom Sci - Cal2 */
+  unsigned int imageRepCal2;     /* Nom Sci - Cal2 */
+  unsigned int nmbImagesCal2;    /* Nom Sci - Cal2 */
+  unsigned short centSelCal2;    /* Nom Sci - Cal2 */
+
+  /*unsigned short saveTarget; declaration used from Save Images above */ /* Nom Sci - Save Images */
+  /*unsigned char fbfInit; declaration used from Save Images above */     /* Nom Sci - Save Images */
+  /*unsigned char fbfEnd; declaration used from Save Images above */      /* Nom Sci - Save Images */
+
+  unsigned short stckOrderCal1;  /* Nom Sci - Stack Order Cal1 */
+  unsigned short stckOrderSci;   /* Nom Sci - Stack Order Sci  */
+  unsigned short stckOrderCal2;  /* Nom Sci - Stack Order Cal2 */
+  
+  /* variables for CONFIG_SDB */
+  unsigned char GetCibNFull, GetSibNFull, GetGibNFull, GetSibNWin, GetCibNWin, GetGibNWin; /* NOTE: in the DP CibN is ushort, ConfigSdb_CibN is uchar, in the ICD it's uchar */
+  unsigned short SdbCmd;
+  unsigned short CibSizeFull, SibSizeFull, GibSizeFull, CibSizeWin, SibSizeWin, GibSizeWin;
+
+  cmpData = (CrFwCmpData_t *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt = cmpSpecificData->pckt;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* The procedure identifier must be in the range 1..MAX_ID_PROC */
+
+  CrIaServ198ProcStartParamGetProcId (&ProcId, pckt);
+
+  switch (ProcId)
+    {
+    /* --- Validity Check of SAVE_IMG_PR ------------------------------------------------------------------------ */
+    case (CRIA_SERV198_SAVE_IMG_PR):
+
+      /* get the Save Target (GROUND or FLASH) */
+      CrIaServ198SaveImgPrParamGetSaveTarget(&saveTarget, pckt);
+
+      /* get the FbfInit */
+      CrIaServ198SaveImgPrParamGetFbfInit(&fbfInit, pckt);
+
+      /* get the FbfEnd */
+      CrIaServ198SaveImgPrParamGetFbfEnd(&fbfEnd, pckt);
+
+      if ((saveTarget > 1) ||
+          ((saveTarget == SAVETARGET_FLASH) && ((!fbfInit) || (fbfInit > FBF_NFILES))) ||
+          ((saveTarget == SAVETARGET_FLASH) && ((!fbfEnd)  || (fbfEnd  > FBF_NFILES))))
+        {
+          SendTcAccRepFail(pckt, ACK_ILL_PR_PAR);
+          return 0;
+        }
+
+      break;
+
+    /* --- Validity Check of ACQ_FULL_DROP_PR -------------------------------------------------------------------- */
+    case (CRIA_SERV198_ACQ_FULL_DROP):
+
+      /* get the expTime */
+      CrIaServ198AcqFullDropParamGetExpTime(&expTime, pckt);
+
+      /* get the imageRep */ 
+      CrIaServ198AcqFullDropParamGetImageRep(&imageRep, pckt);
+
+      if (((expTime < 1) || (expTime > 700000)) ||
+          ((imageRep < 400) || (imageRep > 750000)) ||
+          (expTime > imageRep))
+        {
+          SendTcAccRepFail(pckt, ACK_ILL_PR_PAR);
+          return 0;
+        }
+
+      break;
+
+    /* --- Validity Check of CAL_FULL_SNAP_PR -------------------------------------------------------------------- */
+    case (CRIA_SERV198_CAL_FULL_SNAP):
+
+      /* get the expTime */
+      CrIaServ198CalFullSnapParamGetExpTime(&expTime, pckt);
+
+      /* get the imageRep */ 
+      CrIaServ198CalFullSnapParamGetImageRep(&imageRep, pckt);
+
+      /* get the nmbImages */
+      CrIaServ198CalFullSnapParamGetNmbImages(&nmbImages, pckt);
+
+      /* get the centSel */
+      CrIaServ198CalFullSnapParamGetCentSel(&centSel, pckt);
+
+      if (((expTime < 1) || (expTime > 700000)) ||
+          (expTime > imageRep) ||
+          ((imageRep < 400) || (imageRep > 750000)) ||
+          (!nmbImages) ||
+          ((!centSel) || (centSel > 3)))
+        {
+          SendTcAccRepFail(pckt, ACK_ILL_PR_PAR);
+          return 0;
+        }
+
+      break;
+
+    /* --- Validity Check of FBF_LOAD_PR ------------------------------------------------------------------------- */
+    case (CRIA_SERV198_FBF_LOAD_PR):
+
+      CrIaServ198FbfLoadPrParamGetFbfNBlocks(&fbfNBlocks, pckt);
+      if (fbfNBlocks > FBF_SIZE)
+        {
+	  SendTcAccRepFail(pckt, ACK_ILL_PR_PAR);
+          return 0;
+        }
+      
+      CrIaServ198FbfLoadPrParamGetFbfId(&fbfId, pckt);
+      if ((!fbfId) || (fbfId > FBF_NFILES))
+        {
+	  SendTcAccRepFail(pckt, ACK_ILL_PR_PAR);
+          return 0;
+        }
+
+      /* check AREAID and/or ADDRESS */
+      CrIaServ198FbfLoadPrParamGetFbfRamAreaId(&fbfRamAreaId, pckt);
+      CrIaServ198FbfLoadPrParamGetFbfRamAddr(&fbfRamAddr, pckt);
+
+      Addr = (unsigned int) areaIdToAddress (fbfRamAreaId, fbfRamAddr);
+      if (Addr == 0)
+	{
+	  SendTcAccRepFail(pckt, ACK_ILL_PR_PAR);
+          return 0;
+	}
+
+      if (fbfRamAreaId == AREAID_RAMADDR)
+        {
+	  AddrId = verifyAddress(fbfRamAddr);
+
+	  if (AddrId == ADDRID_INVALID)
+	    {
+	      SendTcAccRepFail(pckt, ACK_ILL_PR_PAR);
+	      return 0;
+	    }
+	}
+      
+      break;
+
+    /* --- Validity Check of FBF_SAVE_PR ------------------------------------------------------------------------- */
+    case (CRIA_SERV198_FBF_SAVE_PR):
+
+     CrIaServ198FbfSavePrParamGetFbfNBlocks(&fbfNBlocks, pckt);
+      if (fbfNBlocks > FBF_SIZE)
+        {
+	  SendTcAccRepFail(pckt, ACK_ILL_PR_PAR);
+          return 0;
+        }
+      
+      CrIaServ198FbfSavePrParamGetFbfId(&fbfId, pckt);
+      if ((!fbfId) || (fbfId > FBF_NFILES))
+        {
+	  SendTcAccRepFail(pckt, ACK_ILL_PR_PAR);
+          return 0;
+        }
+
+      /* check AREAID and/or ADDRESS */
+      CrIaServ198FbfSavePrParamGetFbfRamAreaId(&fbfRamAreaId, pckt);
+      CrIaServ198FbfSavePrParamGetFbfRamAddr(&fbfRamAddr, pckt);
+
+      Addr = (unsigned int) areaIdToAddress (fbfRamAreaId, fbfRamAddr);
+      if (Addr == 0)
+	{
+	  SendTcAccRepFail(pckt, ACK_ILL_PR_PAR);
+          cmpData->outcome = 0;
+          return 0;
+	}
+
+      if (fbfRamAreaId == AREAID_RAMADDR)
+        {
+	  AddrId = verifyAddress(fbfRamAddr);
+
+	  if (AddrId == ADDRID_INVALID)
+	    {
+	      SendTcAccRepFail(pckt, ACK_ILL_PR_PAR);
+	      return 0;
+	    }
+	}
+      
+      break;
+
+    /* --- Validity Check of SCI_STACK_PR ------------------------------------------------------------------------ */
+    case (CRIA_SERV198_SCI_STACK_PR):
+
+      /* get the nmbImages */
+      CrIaServ198SciStackPrParamGetNmbImages(&nmbImages, pckt);
+
+      /* get the CCD Readout Mode */
+      CrIaServ198SciStackPrParamGetCcdRdMode(&ccdRdMode, pckt);
+
+      /* get the expTime */
+      CrIaServ198SciStackPrParamGetExpTime(&expTime, pckt);
+
+      /* get the imageRep */ 
+      CrIaServ198SciStackPrParamGetImageRep(&imageRep, pckt);
+
+      /* get the Win Pos X */
+      CrIaServ198SciStackPrParamGetWinPosX(&winPosX, pckt);
+
+      /* get the Win Pos Y */
+      CrIaServ198SciStackPrParamGetWinPosY(&winPosY, pckt);
+
+      /* get the Win Size X */
+      CrIaServ198SciStackPrParamGetWinSizeX(&winSizeX, pckt);
+
+      /* get the Win Size Y */
+      CrIaServ198SciStackPrParamGetWinSizeY(&winSizeY, pckt);
+
+      /* get the centSel */
+      CrIaServ198SciStackPrParamGetCentSel(&centSel, pckt);
+
+      /* Mantis 2094: SEM coordinate check modified */
+      if ((!nmbImages) ||
+          (ccdRdMode > SEM_CCD_MODE_FAINT_STAR_FAST) ||
+          ((expTime < 1) || (expTime > 700000)) ||
+          (expTime > imageRep) ||
+          ((imageRep < 400) || (imageRep > 750000)) ||
+          (winPosX > 1023) ||
+          ((winPosY < 1) || (winPosY > 1022)) ||
+          ((winSizeX < 1) || (winSizeX > 1024)) ||
+          ((winSizeY < 1) || (winSizeY > 1022)) ||
+          ((!centSel) || (centSel > 3)))
+        {
+          SendTcAccRepFail(pckt, ACK_ILL_PR_PAR);
+          return 0;
+        }
+
+      break;
+      
+    /* --- Validity Check of FBF_TO_GND_PR ----------------------------------------------------------------------- */
+    case (CRIA_SERV198_FBF_TO_GND_PR):
+
+      /* get the nmbFbf */
+      CrIaServ198FbfToGndPrParamGetNmbFbf(&nmbFbf, pckt);
+
+      /* get the fbfInit */
+      CrIaServ198FbfToGndPrParamGetFbfInit(&fbfInit, pckt);
+
+      /* get the fbfSize */
+      CrIaServ198FbfToGndPrParamGetFbfSize(&fbfSize, pckt);
+
+      if (((!nmbFbf) || (nmbFbf > (FBF_NFILES - fbfInit))) ||
+          ((!fbfInit) || (fbfInit > FBF_NFILES)) ||
+          (((!fbfSize) || (fbfSize > FBF_SIZE))))
+        {
+          SendTcAccRepFail(pckt, ACK_ILL_PR_PAR);
+          return 0;
+        }
+
+      break;
+
+    /* --- Validity Check of NOM_SCI_PR -------------------------------------------------------------------------- */
+    case (CRIA_SERV198_NOM_SCI_PR):
+
+      /* check SDB configuration */
+      
+      CrIaServ198NomSciPrParamGetCibNFull(&GetCibNFull, pckt);
+      CrIaServ198NomSciPrParamGetCibSizeFull(&CibSizeFull, pckt);
+      CrIaServ198NomSciPrParamGetSibNFull(&GetSibNFull, pckt);
+      CrIaServ198NomSciPrParamGetSibSizeFull(&SibSizeFull, pckt);
+      CrIaServ198NomSciPrParamGetGibNFull(&GetGibNFull, pckt);
+      CrIaServ198NomSciPrParamGetGibSizeFull(&GibSizeFull, pckt);
+      CrIaServ198NomSciPrParamGetSibNWin(&GetSibNWin, pckt);
+      CrIaServ198NomSciPrParamGetSibSizeWin(&SibSizeWin, pckt);
+      CrIaServ198NomSciPrParamGetCibNWin(&GetCibNWin, pckt);
+      CrIaServ198NomSciPrParamGetCibSizeWin(&CibSizeWin, pckt);
+      CrIaServ198NomSciPrParamGetGibNWin(&GetGibNWin, pckt);
+      CrIaServ198NomSciPrParamGetGibSizeWin(&GibSizeWin, pckt);
+
+      SdbCfg.CibNFull = (unsigned short) GetCibNFull;  
+      SdbCfg.SibNFull = (unsigned short) GetSibNFull;
+      SdbCfg.GibNFull = (unsigned short) GetGibNFull;
+      SdbCfg.CibNWin = (unsigned short) GetCibNWin; 
+      SdbCfg.SibNWin = (unsigned short) GetSibNWin; 
+      SdbCfg.GibNWin = (unsigned short) GetGibNWin; 
+      SdbCfg.CibSizeFull = CibSizeFull;
+      SdbCfg.SibSizeFull = SibSizeFull;
+      SdbCfg.GibSizeFull = GibSizeFull;
+      SdbCfg.CibSizeWin = CibSizeWin;
+      SdbCfg.SibSizeWin = SibSizeWin;
+      SdbCfg.GibSizeWin = GibSizeWin;
+
+      /* the check must be carried out separately for FULL ... */
+      SdbCfg.mode = CrIaSdb_CONFIG_FULL;
+      if (CheckSdbParameters (&SdbCfg) != 0)
+	{
+	  SendTcAccRepFail(pckt, ACK_ILL_PR_PAR);
+	  return 0;
+	}
+      
+      /* ... and for WIN */
+      SdbCfg.mode = CrIaSdb_CONFIG_WIN;
+      if (CheckSdbParameters (&SdbCfg) != 0)
+	{
+	  SendTcAccRepFail(pckt, ACK_ILL_PR_PAR);
+	  return 0;
+	}      
+
+      /* get the Exposure Time for Acquisition */
+      CrIaServ198NomSciPrParamGetExpTimeAcq(&expTimeAcq, pckt);
+
+      /* get the Image Repetition Period for Acquisition */
+      CrIaServ198NomSciPrParamGetImageRepAcq(&imageRepAcq, pckt);
+
+      if (((expTimeAcq < 1) || (expTimeAcq > 700000)) ||
+          (expTimeAcq > imageRepAcq) ||
+          ((imageRepAcq < 400) || (imageRepAcq > 750000)))
+        {
+          SendTcAccRepFail(pckt, ACK_ILL_PR_PAR);
+          return 0;
+        }
+
+      /* get the Exposure Time for Calibration 1 */
+      CrIaServ198NomSciPrParamGetExpTimeCal1(&expTimeCal1, pckt);
+
+      /* get the Image Repetition Period for Calibration 1 */
+      CrIaServ198NomSciPrParamGetImageRepCal1(&imageRepCal1, pckt);
+
+      /* get the Number of Images for Calibration 1 */
+      CrIaServ198NomSciPrParamGetNmbImagesCal1(&nmbImagesCal1, pckt);
+
+      /* get the Centroid Selection for Calibration 1 */
+      CrIaServ198NomSciPrParamGetCentSelCal1(&centSelCal1, pckt);
+
+      if (((expTimeCal1 < 1) || (expTimeCal1 > 700000)) ||
+          (expTimeCal1 > imageRepCal1) ||
+          ((imageRepCal1 < 400) || (imageRepCal1 > 750000)) ||
+          (!nmbImagesCal1) ||
+          ((!centSelCal1) || (centSelCal1 > 3)))
+        {
+          SendTcAccRepFail(pckt, ACK_ILL_PR_PAR);
+          return 0;
+        }
+
+     /* get the Number of Images for Science Observation */
+      CrIaServ198NomSciPrParamGetNmbImagesSci(&nmbImagesSci, pckt);
+
+     /* get the CCD Readou Mode for Science Observation */
+      CrIaServ198NomSciPrParamGetCcdRdModeSci(&ccdRdModeSci, pckt);
+
+     /* get the Exposure Time for Science Observation */
+      CrIaServ198NomSciPrParamGetExpTimeSci(&expTimeSci, pckt);
+
+     /* get the Image Repitition Period for Science Observation */
+      CrIaServ198NomSciPrParamGetImageRepSci(&imageRepSci, pckt);
+
+     /* get the Win Pos X for Science Observation */
+      CrIaServ198NomSciPrParamGetWinPosXSci(&winPosXSci, pckt);
+
+     /* get the Win Pos Y for Science Observation */
+      CrIaServ198NomSciPrParamGetWinPosYSci(&winPosYSci, pckt);
+
+     /* get the Win Size X for Science Observation */
+      CrIaServ198NomSciPrParamGetWinSizeXSci(&winSizeXSci, pckt);
+
+     /* get the WinSize Y for Science Observation */
+      CrIaServ198NomSciPrParamGetWinSizeYSci(&winSizeYSci, pckt);
+
+     /* get the Centroid Selection for Science Observation */
+      CrIaServ198NomSciPrParamGetCentSelSci(&centSelSci, pckt);
+
+      /* Mantis 2094: SEM coordinate check modified */
+      if (((expTimeSci < 1) || (expTimeSci > 700000)) ||
+          (expTimeSci > imageRepSci) ||
+          ((imageRepSci < 400) || (imageRepSci > 750000)) ||
+          (!nmbImagesSci) ||
+          (ccdRdModeSci > SEM_CCD_MODE_FAINT_STAR_FAST) ||
+          (winPosXSci > 1023) ||
+          ((winPosYSci < 1) || (winPosYSci > 1022)) ||
+          ((winSizeXSci < 1) || (winSizeXSci > 1024)) ||
+          ((winSizeYSci < 1) || (winSizeYSci > 1022)) ||
+          ((!centSelSci) || (centSelSci > 3)))
+        {
+          SendTcAccRepFail(pckt, ACK_ILL_PR_PAR);
+          return 0;
+        }
+
+      /* get the Exposure Time for Calibration 2 */
+      CrIaServ198NomSciPrParamGetExpTimeCal2(&expTimeCal2, pckt);
+
+      /* get the Image Repetition Period for Calibration 2 */
+      CrIaServ198NomSciPrParamGetImageRepCal2(&imageRepCal2, pckt);
+
+      /* get the Number of Images for Calibration 2 */
+      CrIaServ198NomSciPrParamGetNmbImagesCal2(&nmbImagesCal2, pckt);
+
+      /* get the Centroid Selection for Calibration 2 */
+      CrIaServ198NomSciPrParamGetCentSelCal2(&centSelCal2, pckt);
+
+      if (((expTimeCal2 < 1) || (expTimeCal2 > 700000)) ||
+          (expTimeCal2 > imageRepCal2) ||
+          ((imageRepCal2 < 400) || (imageRepCal2 > 750000)) ||
+          (!nmbImagesCal2) ||
+          ((!centSelCal2) || (centSelCal2 > 3)))
+        {
+          SendTcAccRepFail(pckt, ACK_ILL_PR_PAR);
+          return 0;
+        }
+
+      /* get the Save Target (GROUND or FLASH) for Save Images */
+      CrIaServ198NomSciPrParamGetSaveTarget(&saveTarget, pckt);
+
+      /* get the fbfInit for Save Images */
+      CrIaServ198NomSciPrParamGetFbfInit(&fbfInit, pckt);
+
+      /* get the fbfEnd for Save Images */
+      CrIaServ198NomSciPrParamGetFbfEnd(&fbfEnd, pckt);
+
+      if ((saveTarget > 1) ||
+          ((saveTarget == SAVETARGET_FLASH) && ((!fbfInit) || (fbfInit > FBF_NFILES))) ||
+          ((saveTarget == SAVETARGET_FLASH) && ((!fbfEnd)  || (fbfEnd  > FBF_NFILES))))
+        {
+          SendTcAccRepFail(pckt, ACK_ILL_PR_PAR);
+          return 0;
+        }
+
+
+      /* get the Stacking Order for Calibration 1 */
+      CrIaServ198NomSciPrParamGetStckOrderCal1(&stckOrderCal1, pckt);
+
+      /* get the Stacking Order for Science Observation */
+      CrIaServ198NomSciPrParamGetStckOrderSci(&stckOrderSci, pckt);
+
+      /* get the Stacking Order for Calibration 2 */
+      CrIaServ198NomSciPrParamGetStckOrderCal2(&stckOrderCal2, pckt);
+
+      if ((!stckOrderCal1) ||
+          (!stckOrderSci)  ||
+          (!stckOrderCal2))
+        {
+          SendTcAccRepFail(pckt, ACK_ILL_PR_PAR);
+          return 0;
+        }
+
+      break;
+
+    /* --- Validity Check of CONFIG_SDB_PR ----------------------------------------------------------------------- */
+    case (CRIA_SERV198_CONFIG_SDB_PR):
+
+      /* get the SDB command */
+      CrIaServ198ConfigSdbPrParamGetSdbCmd(&SdbCmd, pckt);
+
+      /* if it is RESET, then don't care about the rest */
+      if (SdbCmd == CMD_RESET)
+        break;
+
+      /* get and check other parameters */
+      CrIaServ198ConfigSdbPrParamGetCibNFull(&GetCibNFull, pckt);
+      CrIaServ198ConfigSdbPrParamGetCibSizeFull(&CibSizeFull, pckt);
+      CrIaServ198ConfigSdbPrParamGetSibNFull(&GetSibNFull, pckt);
+      CrIaServ198ConfigSdbPrParamGetSibSizeFull(&SibSizeFull, pckt);
+      CrIaServ198ConfigSdbPrParamGetGibNFull(&GetGibNFull, pckt);
+      CrIaServ198ConfigSdbPrParamGetGibSizeFull(&GibSizeFull, pckt);
+      CrIaServ198ConfigSdbPrParamGetSibNWin(&GetSibNWin, pckt);
+      CrIaServ198ConfigSdbPrParamGetSibSizeWin(&SibSizeWin, pckt);
+      CrIaServ198ConfigSdbPrParamGetCibNWin(&GetCibNWin, pckt);
+      CrIaServ198ConfigSdbPrParamGetCibSizeWin(&CibSizeWin, pckt);
+      CrIaServ198ConfigSdbPrParamGetGibNWin(&GetGibNWin, pckt);
+      CrIaServ198ConfigSdbPrParamGetGibSizeWin(&GibSizeWin, pckt);
+
+      SdbCfg.CibNFull = (unsigned short) GetCibNFull;  
+      SdbCfg.SibNFull = (unsigned short) GetSibNFull;
+      SdbCfg.GibNFull = (unsigned short) GetGibNFull;
+      SdbCfg.CibNWin = (unsigned short) GetCibNWin; 
+      SdbCfg.SibNWin = (unsigned short) GetSibNWin; 
+      SdbCfg.GibNWin = (unsigned short) GetGibNWin; 
+      SdbCfg.CibSizeFull = CibSizeFull;
+      SdbCfg.SibSizeFull = SibSizeFull;
+      SdbCfg.GibSizeFull = GibSizeFull;
+      SdbCfg.CibSizeWin = CibSizeWin;
+      SdbCfg.SibSizeWin = SibSizeWin;
+      SdbCfg.GibSizeWin = GibSizeWin;
+
+      SdbCfg.mode = CrIaSdb_CONFIG_WIN;
+      
+      if (SdbCmd == CMD_RESET_FULL)
+	{
+	  SdbCfg.mode = CrIaSdb_CONFIG_FULL;
+	}
+      if (SdbCmd == CMD_CONFIG_FULL)
+	{
+	  SdbCfg.mode = CrIaSdb_CONFIG_FULL;
+	}
+
+      if (CheckSdbParameters (&SdbCfg) != 0)
+	{
+	  SendTcAccRepFail(pckt, ACK_ILL_PR_PAR);
+	  return 0;
+	}
+      
+      break;    
+
+    /* --- Validity Check default case --------------------------------------------------------------------------- */
+    default:
+      /* not a valid ProcId */
+      SendTcAccRepFail(pckt, ACK_ILL_PR_ID);
+      return 0;
+    }
+
+  DEBUGP("Service (198,1) Validity check passed\n");
+
+  cmpData->outcome = 1;
+
+  SendTcAccRepSucc(pckt);
+
+  return 1;
+}
+
+
+void CrIaServ198ProcStartStartAction(FwSmDesc_t smDesc)
+{
+  unsigned short ProcId;
+  unsigned short status;
+  CrFwPckt_t pckt;
+  CrFwCmpData_t *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData = (CrFwCmpData_t *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Set the action outcome to 'success' iff the target procedure is stopped and the procedure parameters satisfy their constraints */
+
+  CrIaServ198ProcStartParamGetProcId (&ProcId, pckt);
+
+  /* check if the procedure is in stopped state */
+  if (procPr[ProcId-1] != NULL)
+    {
+      status = FwPrIsStarted(procPr[ProcId-1]);
+
+      if (status != PR_STOPPED)
+        {
+          SendTcStartRepFail(pckt, ACK_PR_BUSY, 0, (unsigned short)status);
+          return;
+        }
+    }
+
+  /* Set the action outcome to 'completed' */
+
+  cmpData->outcome = 1;
+
+  SendTcStartRepSucc(pckt);
+
+  return;
+}
+
+
+void CrIaServ198ProcStartProgressAction(FwSmDesc_t smDesc)
+{
+  unsigned short ProcId;
+
+  /* variables for Save Images */
+  unsigned short saveTarget;
+  unsigned char fbfInit, fbfEnd;
+
+  /* variables for FBF Save and FBF Load */
+  unsigned char fbfId, fbfNBlocks;
+  unsigned short fbfRamAreaId;
+  unsigned int fbfRamAddr;
+
+  /* variables for Calibrate Full Snap */
+  unsigned short centSelCal;
+
+  /* variables for Nominal Science */
+  unsigned char acqFlag, cal1Flag, sciFlag, cal2Flag;
+  unsigned int expTimeAcq;
+  unsigned int imageRepAcq;
+  /* Cal1 */
+  unsigned int expTimeCal1;
+  unsigned int imageRepCal1;
+  unsigned int nmbImagesCal1;
+  unsigned short centSelCal1;
+  /* Sci */
+  unsigned int nmbImagesSci;
+  unsigned short ccdRdModeSci;
+  unsigned int imageRepSci;
+  unsigned int expTimeSci;
+  unsigned short winPosXSci, winPosYSci, winSizeXSci, winSizeYSci;
+  unsigned short centSelSci;
+  /* Cal2 */
+  unsigned int expTimeCal2;
+  unsigned int imageRepCal2;
+  unsigned int nmbImagesCal2;
+  unsigned short centSelCal2;
+  /* Stacking Order */
+  unsigned short stckOrderCal1;
+  unsigned short stckOrderSci;
+  unsigned short stckOrderCal2;
+
+  /* variables in Science Stack */
+  unsigned int nmbImages;
+  unsigned short ccdRdMode;
+  unsigned int imageRep;
+  unsigned int expTime;
+  unsigned short winPosX, winPosY, winSizeX, winSizeY;
+
+  /* variables for Transfer FBF to Ground */
+  unsigned char nmbFbf, fbfInitToGrd, fbfSize;
+
+  /* variables for CONFIG_SDB */
+  unsigned short SdbCmd, SdbState;
+  unsigned short cibNFull, sibNFull, gibNFull, sibNWin, cibNWin, gibNWin;
+  unsigned char GetCibNFull, GetSibNFull, GetGibNFull, GetSibNWin, GetCibNWin, GetGibNWin;
+  unsigned short CibSizeFull, SibSizeFull, GibSizeFull, CibSizeWin, SibSizeWin, GibSizeWin;
+
+  unsigned int sdu2DownTransferSize;
+
+  CrFwPckt_t pckt;
+  CrFwCmpData_t *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData = (CrFwCmpData_t *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt = cmpSpecificData->pckt;
+
+  /* Write the procedure parameters to the data pool; send the Start command to the target procedure; set the action outcome to 'completed' */
+
+  CrIaServ198ProcStartParamGetProcId (&ProcId, pckt);
+
+  switch (ProcId)
+    {
+    case (CRIA_SERV198_SAVE_IMG_PR):
+
+      /* get the Save Target (GROUND or FLASH) and write it into the data pool */
+      CrIaServ198SaveImgPrParamGetSaveTarget(&saveTarget, pckt);
+      CrIaPaste(SAVEIMAGES_PSAVETARGET_ID, &saveTarget);
+
+      /* get the FbfInit and write it into the data pool */
+      CrIaServ198SaveImgPrParamGetFbfInit(&fbfInit, pckt);
+      CrIaPaste(SAVEIMAGES_PFBFINIT_ID, &fbfInit);
+
+      /* get the FbfEnd and write it into the data pool */
+      CrIaServ198SaveImgPrParamGetFbfEnd(&fbfEnd, pckt);
+      CrIaPaste(SAVEIMAGES_PFBFEND_ID, &fbfEnd);
+
+      break;
+
+    case (CRIA_SERV198_ACQ_FULL_DROP):
+
+      /* get the expTime and write it into the data pool */
+      CrIaServ198AcqFullDropParamGetExpTime(&expTime, pckt);
+      CrIaPaste(ACQFULLDROP_PEXPTIME_ID, &expTime);
+
+      /* get the imageRep and write it into the data pool */ 
+      CrIaServ198AcqFullDropParamGetImageRep(&imageRep, pckt);
+      CrIaPaste(ACQFULLDROP_PIMAGEREP_ID, &imageRep);
+
+      break;
+
+    case (CRIA_SERV198_CAL_FULL_SNAP):
+
+      /* get the expTime and write it into the data pool */
+      CrIaServ198CalFullSnapParamGetExpTime(&expTime, pckt);
+      CrIaPaste(CALFULLSNAP_PEXPTIME_ID, &expTime);
+
+      /* get the imageRep and write it into the data pool */ 
+      CrIaServ198CalFullSnapParamGetImageRep(&imageRep, pckt);
+      CrIaPaste(CALFULLSNAP_PIMAGEREP_ID, &imageRep);      
+
+      /* get the nmbImages and write it into the data pool */
+      CrIaServ198CalFullSnapParamGetNmbImages(&nmbImages, pckt);
+      CrIaPaste(CALFULLSNAP_PNMBIMAGES_ID, &nmbImages);
+
+      /* get the centSel and write it into the data pool */
+      CrIaServ198CalFullSnapParamGetCentSel(&centSelCal, pckt);
+      CrIaPaste(CALFULLSNAP_PCENTSEL_ID, &centSelCal);
+
+      break;
+
+    case (CRIA_SERV198_FBF_LOAD_PR):
+
+      CrIaServ198FbfLoadPrParamGetFbfId(&fbfId, pckt);
+      CrIaPaste(FBFLOAD_PFBFID_ID, &fbfId);
+
+      CrIaServ198FbfLoadPrParamGetFbfNBlocks(&fbfNBlocks, pckt);
+      CrIaPaste(FBFLOAD_PFBFNBLOCKS_ID, &fbfNBlocks);
+
+      CrIaServ198FbfLoadPrParamGetFbfRamAreaId(&fbfRamAreaId, pckt);
+      CrIaPaste(FBFLOAD_PFBFRAMAREAID_ID, &fbfRamAreaId);
+
+      CrIaServ198FbfLoadPrParamGetFbfRamAddr(&fbfRamAddr, pckt);
+
+      /* the FBF Load function only needs the physical RAM address,
+	 which we calculate here considering the Area ID */
+      
+      fbfRamAddr = (unsigned int) areaIdToAddress (fbfRamAreaId, fbfRamAddr);
+
+      CrIaPaste(FBFLOAD_PFBFRAMADDR_ID, &fbfRamAddr);
+
+      break;
+
+    case (CRIA_SERV198_FBF_SAVE_PR):
+
+      /* get the FbfId and write it into the data pool */
+      CrIaServ198FbfSavePrParamGetFbfId(&fbfId, pckt);
+      CrIaPaste(FBFSAVE_PFBFID_ID, &fbfId);
+
+      /* get the FbfNBlocks and write it into the data pool */
+      CrIaServ198FbfSavePrParamGetFbfNBlocks(&fbfNBlocks, pckt);
+      CrIaPaste(FBFSAVE_PFBFNBLOCKS_ID, &fbfNBlocks);
+
+      /* get the FbfRamAreaId and write it into the data pool */
+      CrIaServ198FbfSavePrParamGetFbfRamAreaId(&fbfRamAreaId, pckt);
+      CrIaPaste(FBFSAVE_PFBFRAMAREAID_ID, &fbfRamAreaId);
+
+      /* get the FbfRamAddr and write it into the data pool */
+      CrIaServ198FbfSavePrParamGetFbfRamAddr(&fbfRamAddr, pckt);
+
+      /* the FBF Save function only needs the physical RAM address,
+	 which we calculate here considering the Area ID */
+      
+      fbfRamAddr = (unsigned int) areaIdToAddress (fbfRamAreaId, fbfRamAddr);
+
+      CrIaPaste(FBFSAVE_PFBFRAMADDR_ID, &fbfRamAddr);
+
+      break;
+
+    case (CRIA_SERV198_SCI_STACK_PR):
+
+      CrIaServ198SciStackPrParamGetNmbImages(&nmbImages, pckt);
+      CrIaPaste(SCIWIN_PNMBIMAGES_ID, &nmbImages);
+
+      CrIaServ198SciStackPrParamGetCcdRdMode(&ccdRdMode, pckt);
+      CrIaPaste(SCIWIN_PCCDRDMODE_ID, &ccdRdMode);
+
+      /* NOT USED
+            CrIaServ198SciStackPrParamGetStackSnap(&stackSnap, pckt);
+            CrIaPaste(SCIWIN_PSTACKSNAP_ID, &stackSnap);
+      */
+
+      CrIaServ198SciStackPrParamGetExpTime(&expTime, pckt);
+      CrIaPaste(SCIWIN_PEXPTIME_ID, &expTime);
+
+      CrIaServ198SciStackPrParamGetImageRep(&imageRep, pckt);
+      CrIaPaste(SCIWIN_PIMAGEREP_ID, &imageRep);
+
+      CrIaServ198SciStackPrParamGetWinPosX(&winPosX, pckt);
+      CrIaPaste(SCIWIN_PWINPOSX_ID, &winPosX);
+
+      CrIaServ198SciStackPrParamGetWinPosY(&winPosY, pckt);
+      CrIaPaste(SCIWIN_PWINPOSY_ID, &winPosY);
+
+      CrIaServ198SciStackPrParamGetWinSizeX(&winSizeX, pckt);
+      CrIaPaste(SCIWIN_PWINSIZEX_ID, &winSizeX);
+
+      CrIaServ198SciStackPrParamGetWinSizeY(&winSizeY, pckt);
+      CrIaPaste(SCIWIN_PWINSIZEY_ID, &winSizeY);
+
+      break;
+
+    case (CRIA_SERV198_FBF_TO_GND_PR):
+
+      CrIaServ198FbfToGndPrParamGetNmbFbf(&nmbFbf, pckt);
+      CrIaPaste(TRANSFBFTOGRND_PNMBFBF_ID, &nmbFbf);
+
+      CrIaServ198FbfToGndPrParamGetFbfInit(&fbfInitToGrd, pckt);
+      CrIaPaste(TRANSFBFTOGRND_PFBFINIT_ID, &fbfInitToGrd);
+
+      CrIaServ198FbfToGndPrParamGetFbfSize(&fbfSize, pckt);
+      CrIaPaste(TRANSFBFTOGRND_PFBFSIZE_ID, &fbfSize);
+
+      break;
+
+    case (CRIA_SERV198_NOM_SCI_PR):
+
+      CrIaServ198NomSciPrParamGetAcqFlag(&acqFlag, pckt);
+      CrIaPaste(NOMSCI_PACQFLAG_ID, &acqFlag);
+
+      CrIaServ198NomSciPrParamGetCal1Flag(&cal1Flag, pckt);
+      CrIaPaste(NOMSCI_PCAL1FLAG_ID, &cal1Flag);
+
+      CrIaServ198NomSciPrParamGetSciFlag(&sciFlag, pckt);
+      CrIaPaste(NOMSCI_PSCIFLAG_ID, &sciFlag);
+
+      CrIaServ198NomSciPrParamGetCal2Flag(&cal2Flag, pckt);
+      CrIaPaste(NOMSCI_PCAL2FLAG_ID, &cal2Flag);
+
+      CrIaServ198NomSciPrParamGetCibNFull(&GetCibNFull, pckt);
+      CrIaPaste(NOMSCI_PCIBNFULL_ID, &GetCibNFull);
+
+      CrIaServ198NomSciPrParamGetCibSizeFull(&CibSizeFull, pckt);
+      CrIaPaste(NOMSCI_PCIBSIZEFULL_ID, &CibSizeFull);
+
+      CrIaServ198NomSciPrParamGetSibNFull(&GetSibNFull, pckt);
+      CrIaPaste(NOMSCI_PSIBNFULL_ID, &GetSibNFull);
+
+      CrIaServ198NomSciPrParamGetSibSizeFull(&SibSizeFull, pckt);
+      CrIaPaste(NOMSCI_PSIBSIZEFULL_ID, &SibSizeFull);
+
+      CrIaServ198NomSciPrParamGetGibNFull(&GetGibNFull, pckt);
+      CrIaPaste(NOMSCI_PGIBNFULL_ID, &GetGibNFull);
+
+      CrIaServ198NomSciPrParamGetGibSizeFull(&GibSizeFull, pckt);
+      CrIaPaste(NOMSCI_PGIBSIZEFULL_ID, &GibSizeFull);
+
+      CrIaServ198NomSciPrParamGetSibNWin(&GetSibNWin, pckt);
+      CrIaPaste(NOMSCI_PSIBNWIN_ID, &GetSibNWin);
+
+      CrIaServ198NomSciPrParamGetSibSizeWin(&SibSizeWin, pckt);
+      CrIaPaste(NOMSCI_PSIBSIZEWIN_ID, &SibSizeWin);
+
+      CrIaServ198NomSciPrParamGetCibNWin(&GetCibNWin, pckt);
+      CrIaPaste(NOMSCI_PCIBNWIN_ID, &GetCibNWin);
+
+      CrIaServ198NomSciPrParamGetCibSizeWin(&CibSizeWin, pckt);
+      CrIaPaste(NOMSCI_PCIBSIZEWIN_ID, &CibSizeWin);
+
+      CrIaServ198NomSciPrParamGetGibNWin(&GetGibNWin, pckt);
+      CrIaPaste(NOMSCI_PGIBNWIN_ID, &GetGibNWin);
+
+      CrIaServ198NomSciPrParamGetGibSizeWin(&GibSizeWin, pckt);
+      CrIaPaste(NOMSCI_PGIBSIZEWIN_ID, &GibSizeWin);
+
+      CrIaServ198NomSciPrParamGetExpTimeAcq(&expTimeAcq, pckt);
+      CrIaPaste(NOMSCI_PEXPTIMEACQ_ID, &expTimeAcq);
+
+      CrIaServ198NomSciPrParamGetImageRepAcq(&imageRepAcq, pckt);
+      CrIaPaste(NOMSCI_PIMAGEREPACQ_ID, &imageRepAcq);
+
+      CrIaServ198NomSciPrParamGetExpTimeCal1(&expTimeCal1, pckt);
+      CrIaPaste(NOMSCI_PEXPTIMECAL1_ID, &expTimeCal1);
+
+      CrIaServ198NomSciPrParamGetImageRepCal1(&imageRepCal1, pckt);
+      CrIaPaste(NOMSCI_PIMAGEREPCAL1_ID, &imageRepCal1);
+
+      CrIaServ198NomSciPrParamGetNmbImagesCal1(&nmbImagesCal1, pckt);
+      CrIaPaste(NOMSCI_PNMBIMAGESCAL1_ID, &nmbImagesCal1);
+
+      CrIaServ198NomSciPrParamGetCentSelCal1(&centSelCal1, pckt);
+      CrIaPaste(NOMSCI_PCENTSELCAL1_ID, &centSelCal1);
+
+      CrIaServ198NomSciPrParamGetNmbImagesSci(&nmbImagesSci, pckt);
+      CrIaPaste(NOMSCI_PNMBIMAGESSCI_ID, &nmbImagesSci);
+
+      CrIaServ198NomSciPrParamGetCcdRdModeSci(&ccdRdModeSci, pckt);
+      CrIaPaste(NOMSCI_PCCDRDMODESCI_ID, &ccdRdModeSci);
+
+      /* NOT USED
+            CrIaServ198NomSciPrParamGetStackSnapSci(&stackSnapSci, pckt);
+            CrIaPaste(NOMSCI_PSTACKSNAPSCI_ID, &stackSnapSci);
+      */
+
+      CrIaServ198NomSciPrParamGetExpTimeSci(&expTimeSci, pckt);
+      CrIaPaste(NOMSCI_PEXPTIMESCI_ID, &expTimeSci);
+
+      CrIaServ198NomSciPrParamGetImageRepSci(&imageRepSci, pckt);
+      CrIaPaste(NOMSCI_PIMAGEREPSCI_ID, &imageRepSci);
+
+      CrIaServ198NomSciPrParamGetWinPosXSci(&winPosXSci, pckt);
+      CrIaPaste(NOMSCI_PWINPOSXSCI_ID, &winPosXSci);
+
+      CrIaServ198NomSciPrParamGetWinPosYSci(&winPosYSci, pckt);
+      CrIaPaste(NOMSCI_PWINPOSYSCI_ID, &winPosYSci);
+
+      CrIaServ198NomSciPrParamGetWinSizeXSci(&winSizeXSci, pckt);
+      CrIaPaste(NOMSCI_PWINSIZEXSCI_ID, &winSizeXSci);
+
+      CrIaServ198NomSciPrParamGetWinSizeYSci(&winSizeYSci, pckt);
+      CrIaPaste(NOMSCI_PWINSIZEYSCI_ID, &winSizeYSci);
+
+      CrIaServ198NomSciPrParamGetCentSelSci(&centSelSci, pckt);
+      CrIaPaste(NOMSCI_PCENTSELSCI_ID, &centSelSci);
+
+      CrIaServ198NomSciPrParamGetExpTimeCal2(&expTimeCal2, pckt);
+      CrIaPaste(NOMSCI_PEXPTIMECAL2_ID, &expTimeCal2);
+
+      CrIaServ198NomSciPrParamGetImageRepCal2(&imageRepCal2, pckt);
+      CrIaPaste(NOMSCI_PIMAGEREPCAL2_ID, &imageRepCal2);
+
+      CrIaServ198NomSciPrParamGetNmbImagesCal2(&nmbImagesCal2, pckt);
+      CrIaPaste(NOMSCI_PNMBIMAGESCAL2_ID, &nmbImagesCal2);
+
+      CrIaServ198NomSciPrParamGetCentSelCal2(&centSelCal2, pckt);
+      CrIaPaste(NOMSCI_PCENTSELCAL2_ID, &centSelCal2);
+
+      CrIaServ198NomSciPrParamGetSaveTarget(&saveTarget, pckt);
+      CrIaPaste(NOMSCI_PSAVETARGET_ID, &saveTarget);
+
+      CrIaServ198NomSciPrParamGetFbfInit(&fbfInit, pckt);
+      CrIaPaste(NOMSCI_PFBFINIT_ID, &fbfInit);
+
+      CrIaServ198NomSciPrParamGetFbfEnd(&fbfEnd, pckt);
+      CrIaPaste(NOMSCI_PFBFEND_ID, &fbfEnd);
+
+      CrIaServ198NomSciPrParamGetStckOrderCal1(&stckOrderCal1, pckt);
+      CrIaPaste(NOMSCI_PSTCKORDERCAL1_ID, &stckOrderCal1);
+
+      CrIaServ198NomSciPrParamGetStckOrderSci(&stckOrderSci, pckt);
+      CrIaPaste(NOMSCI_PSTCKORDERSCI_ID, &stckOrderSci);
+
+      CrIaServ198NomSciPrParamGetStckOrderCal2(&stckOrderCal2, pckt);
+      CrIaPaste(NOMSCI_PSTCKORDERCAL2_ID, &stckOrderCal2);
+
+      /* NOTE: the procedure parameters for the buffers are fetched in
+      the Nominal Science Procedure CrIaNomSciFunc */
+
+      break;
+
+    /******************
+     *                *
+     *   CONFIG SDB   *
+     *	        *
+     ******************/
+    case (CRIA_SERV198_CONFIG_SDB_PR):
+
+      DEBUGP("Service (198,1) CONFIG_SDB\n");
+
+      /* get the SDB command */
+      CrIaServ198ConfigSdbPrParamGetSdbCmd(&SdbCmd, pckt);
+
+      DEBUGP("the command is %d\n", SdbCmd);
+
+      /*    --- RESET ---    */
+      if (SdbCmd == CMD_RESET)
+        {
+          /* make the SM transition */
+          FwSmMakeTrans(smDescSdb, Reset);
+          sdu2DownTransferSize = 0;
+          CrIaPaste(SDU2DOWNTRANSFERSIZE_ID, &sdu2DownTransferSize);
+
+          /* set data pool variable to unconfigured */
+          /* NOTE: this is not done in the SDB SM */
+          SdbState = CrIaSdb_UNCONFIGURED;
+          CrIaPaste(SDBSTATE_ID, &SdbState);
+
+#if (__sparc__)
+          release (SDB);
+	  release (RES);
+#else
+          sdballoc (0, 1); /* reset on PC */
+	  resalloc (0, 1); 
+#endif
+	}
+
+      /*    --- CONFIGURE_FULL and CONFIGURE_WIN ---    */
+      /* both configure commands use all parameters */
+      if ((SdbCmd == CMD_CONFIG_FULL) || (SdbCmd == CMD_CONFIG_WIN))
+        {
+          /* get parameters and enter in DP */
+          CrIaServ198ConfigSdbPrParamGetCibNFull(&GetCibNFull, pckt);
+          CrIaServ198ConfigSdbPrParamGetCibSizeFull(&CibSizeFull, pckt);
+          CrIaServ198ConfigSdbPrParamGetSibNFull(&GetSibNFull, pckt);
+          CrIaServ198ConfigSdbPrParamGetSibSizeFull(&SibSizeFull, pckt);
+          CrIaServ198ConfigSdbPrParamGetGibNFull(&GetGibNFull, pckt);
+          CrIaServ198ConfigSdbPrParamGetGibSizeFull(&GibSizeFull, pckt);
+          CrIaServ198ConfigSdbPrParamGetSibNWin(&GetSibNWin, pckt);
+          CrIaServ198ConfigSdbPrParamGetSibSizeWin(&SibSizeWin, pckt);
+          CrIaServ198ConfigSdbPrParamGetCibNWin(&GetCibNWin, pckt);
+          CrIaServ198ConfigSdbPrParamGetCibSizeWin(&CibSizeWin, pckt);
+          CrIaServ198ConfigSdbPrParamGetGibNWin(&GetGibNWin, pckt);
+          CrIaServ198ConfigSdbPrParamGetGibSizeWin(&GibSizeWin, pckt);
+
+          /* "private" copy */
+          CrIaPaste(CONFIGSDB_PCIBNFULL_ID, &GetCibNFull);
+          CrIaPaste(CONFIGSDB_PCIBSIZEFULL_ID, &CibSizeFull);
+          CrIaPaste(CONFIGSDB_PSIBNFULL_ID, &GetSibNFull);
+          CrIaPaste(CONFIGSDB_PSIBSIZEFULL_ID, &SibSizeFull);
+          CrIaPaste(CONFIGSDB_PGIBNFULL_ID, &GetGibNFull);
+          CrIaPaste(CONFIGSDB_PGIBSIZEFULL_ID, &GibSizeFull);
+          CrIaPaste(CONFIGSDB_PSIBNWIN_ID, &GetSibNWin);
+          CrIaPaste(CONFIGSDB_PSIBSIZEWIN_ID, &SibSizeWin);
+          CrIaPaste(CONFIGSDB_PCIBNWIN_ID, &GetCibNWin);
+          CrIaPaste(CONFIGSDB_PCIBSIZEWIN_ID, &CibSizeWin);
+          CrIaPaste(CONFIGSDB_PGIBNWIN_ID, &GetGibNWin);
+          CrIaPaste(CONFIGSDB_PGIBSIZEWIN_ID, &GibSizeWin);
+
+          DEBUGP("We want to enter SibSizeWin in the data pool (pri): %d\n", SibSizeWin);
+          DEBUGP("We want to enter CibSizeWin in the data pool (pri): %d\n", CibSizeWin);
+          DEBUGP("We want to enter GibSizeWin in the data pool (pri): %d\n", GibSizeWin);
+          DEBUGP("We want to enter SibSizeWin in the data pool (pri): %d\n", SibSizeFull);
+          DEBUGP("We want to enter CibSizeWin in the data pool (pri): %d\n", CibSizeFull);
+          DEBUGP("We want to enter GibSizeWin in the data pool (pri): %d\n", GibSizeFull);
+
+          /* set them in data pool, but take care:
+             the procedure specific variables like CONFIGSDB_PCIBNFULL are
+             uchar, but the actually used ones like CIBNFULL are ushort! */
+          cibNFull = (unsigned short) GetCibNFull;
+          sibNFull = (unsigned short) GetSibNFull;
+          gibNFull = (unsigned short) GetGibNFull;
+          cibNWin = (unsigned short) GetCibNWin;
+          sibNWin = (unsigned short) GetSibNWin;
+          gibNWin = (unsigned short) GetGibNWin;
+
+          /* NOTE: here the ushorts are used! */
+          CrIaPaste(CIBNFULL_ID, &cibNFull);
+          CrIaPaste(CIBSIZEFULL_ID, &CibSizeFull);
+          CrIaPaste(SIBNFULL_ID, &sibNFull);
+          CrIaPaste(SIBSIZEFULL_ID, &SibSizeFull);
+          CrIaPaste(GIBNFULL_ID, &gibNFull);
+          CrIaPaste(GIBSIZEFULL_ID, &GibSizeFull);
+          CrIaPaste(SIBNWIN_ID, &sibNWin);
+          CrIaPaste(SIBSIZEWIN_ID, &SibSizeWin);
+          CrIaPaste(CIBNWIN_ID, &cibNWin);
+          CrIaPaste(CIBSIZEWIN_ID, &CibSizeWin);
+          CrIaPaste(GIBNWIN_ID, &gibNWin);
+          CrIaPaste(GIBSIZEWIN_ID, &GibSizeWin);
+        }
+
+      /* then also issue the transition */
+      if (SdbCmd == CMD_CONFIG_FULL)
+        {
+          FwSmMakeTrans(smDescSdb, ConfigFull);
+          sdu2DownTransferSize = GibSizeFull*1024;
+          CrIaPaste(SDU2DOWNTRANSFERSIZE_ID, &sdu2DownTransferSize);
+        }
+
+      if (SdbCmd == CMD_CONFIG_WIN)
+        {
+          FwSmMakeTrans(smDescSdb, ConfigWin);
+          sdu2DownTransferSize = GibSizeWin*1024;
+          CrIaPaste(SDU2DOWNTRANSFERSIZE_ID, &sdu2DownTransferSize);
+        }
+
+      /*    --- RESET_FULL and RESET_WIN ---
+      - no change of configuration
+      - only reset the pointers (gibOut) to the Win or Full */
+
+      /* the pointers (gibOut) are reset in the SDB entry action, no need to do this here */
+
+      /* issue the transition */
+      if (SdbCmd == CMD_RESET_FULL)
+        {
+          FwSmMakeTrans(smDescSdb, ResetFull);
+        }
+
+      if (SdbCmd == CMD_RESET_WIN)
+        {
+          FwSmMakeTrans(smDescSdb, ResetWin);
+        }
+
+      break;
+
+    default:
+      /* we never reach this */
+      return;
+    }
+
+
+  /* Send the Start command to the target procedure */
+  if (procPr[ProcId-1] != NULL)
+    {
+      FwPrStart(procPr[ProcId-1]);
+    }
+
+  /* Set the action outcome to 'completed' */
+
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ198ProcedureControlService/InCmd/CrIaServ198ProcStart.h b/CrIa/src/Services/CrIaServ198ProcedureControlService/InCmd/CrIaServ198ProcStart.h
new file mode 100644
index 0000000..c7329eb
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ198ProcedureControlService/InCmd/CrIaServ198ProcStart.h
@@ -0,0 +1,50 @@
+/**
+ * @file CrIaServ198ProcStart.h
+ *
+ * Declaration of the Start Procedure in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV198_PROC_START_H
+#define CRIA_SERV198_PROC_START_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+#include <CrIaPrSm/CrIaSdbCreate.h> /* for the SDB config defines */
+
+/* local names for the SDB config command procedure, 
+   do not mix with SM defines made in CrIaSdbCreate */
+#define CMD_RESET       0
+#define CMD_CONFIG_FULL 1
+#define CMD_CONFIG_WIN  2
+#define CMD_RESET_FULL  3
+#define CMD_RESET_WIN   4
+
+
+/**
+ * Validity check of the Start Procedure in-coming command packet.
+ * The procedure identifier must be in the range 1..MAX_ID_PROC
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ198ProcStartValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Start Procedure in-coming command packet.
+ * Set the action outcome to 'success' iff the target procedure is stopped and the procedure parameters satisfy their constraints
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ198ProcStartStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Start Procedure in-coming command packet.
+ * Write the procedure parameters to the data pool; send the Start command to the target procedure; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ198ProcStartProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV198_PROC_START_H */
+
diff --git a/CrIa/src/Services/CrIaServ198ProcedureControlService/InCmd/CrIaServ198ProcStop.c b/CrIa/src/Services/CrIaServ198ProcedureControlService/InCmd/CrIaServ198ProcStop.c
new file mode 100644
index 0000000..b72a9df
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ198ProcedureControlService/InCmd/CrIaServ198ProcStop.c
@@ -0,0 +1,146 @@
+/**
+ * @file CrIaServ198ProcStop.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Stop Procedure in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ198ProcStop.h"
+#include "CrIaServ198ProcStart.h" /* for the ACK_PR_IDLE and the PrStatusList */
+
+/** FW Profile function definitions */
+#include <FwProfile/FwPrCore.h>  /* for the FwPrStop(prDesc) */
+
+#include "CrFwCmpData.h"
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+#include <Services/General/CrIaParamGetter.h>
+#include <Services/General/CrIaConstants.h>
+#include <CrIaInCmp.h>
+#include <IfswUtilities.h>
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+#include <CrIaIasw.h> /* for Event Reporting and extern sm and prDescriptors */
+
+
+CrFwBool_t CrIaServ198ProcStopValidityCheck(FwPrDesc_t prDesc)
+{
+  CrFwPckt_t pckt;
+  CrFwCmpData_t *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  unsigned short ProcId;
+
+  cmpData = (CrFwCmpData_t *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* The procedure identifier must be in the range 1..MAX_ID_PROC */
+
+  CrIaServ198ProcStopParamGetProcId (&ProcId, pckt);
+
+  if ((ProcId == 0) || (ProcId > MAX_ID_PROC)) 
+    {
+      /* not a valid ProcId */
+      SendTcAccRepFail(pckt, ACK_ILL_PR_ID);
+      return 0;
+    }
+
+  cmpData->outcome = 1;
+
+  SendTcAccRepSucc(pckt);
+
+  return 1;
+}
+
+void CrIaServ198ProcStopStartAction(FwSmDesc_t smDesc)
+{
+  unsigned short ProcId;
+  unsigned short status;
+
+  CrFwPckt_t pckt;
+  CrFwCmpData_t *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData = (CrFwCmpData_t *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Set the action outcome to 'success' iff the target procedure is started */
+
+  CrIaServ198ProcStopParamGetProcId (&ProcId, pckt);
+
+  /* check if the procedure is in stopped state */
+  if (procPr[ProcId-1] != NULL)
+    {
+      status = FwPrIsStarted(procPr[ProcId-1]);
+
+      if (status != PR_STARTED)
+        {
+          SendTcStartRepFail(pckt, ACK_PR_IDLE, 0, (unsigned short)status);
+          return;
+        }
+    }
+
+  /* Set the action outcome to 'completed' */
+
+  cmpData->outcome = 1;
+
+  SendTcStartRepSucc(pckt);
+
+  return;
+}
+
+
+void CrIaServ198ProcStopProgressAction(FwSmDesc_t smDesc)
+{
+  unsigned short ProcId;
+
+  CrFwPckt_t pckt;
+  CrFwCmpData_t *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData = (CrFwCmpData_t *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt = cmpSpecificData->pckt;
+
+  /* get ProcId */
+  CrIaServ198ProcStopParamGetProcId (&ProcId, pckt);
+
+  /* Send the Stop command to the target procedure */
+  if (procPr[ProcId-1] != NULL)
+    {
+      FwPrStop(procPr[ProcId-1]);
+    }
+
+  /* Set the action outcome to 'completed' */
+
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ198ProcedureControlService/InCmd/CrIaServ198ProcStop.h b/CrIa/src/Services/CrIaServ198ProcedureControlService/InCmd/CrIaServ198ProcStop.h
new file mode 100644
index 0000000..c9d5ba8
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ198ProcedureControlService/InCmd/CrIaServ198ProcStop.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ198ProcStop.h
+ *
+ * Declaration of the Stop Procedure in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV198_PROC_STOP_H
+#define CRIA_SERV198_PROC_STOP_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Stop Procedure in-coming command packet.
+ * The procedure identifier must be in the range 1..MAX_ID_PROC
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ198ProcStopValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Stop Procedure in-coming command packet.
+ * Set the action outcome to 'success' iff the target procedure is started
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ198ProcStopStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Stop Procedure in-coming command packet.
+ * Send the Stop command to the target procedure; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ198ProcStopProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV198_PROC_STOP_H */
+
diff --git a/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1AccFail.c b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1AccFail.c
new file mode 100644
index 0000000..a9b5ab5
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1AccFail.c
@@ -0,0 +1,32 @@
+/**
+ * @file CrIaServ1AccFail.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Telecommand Acceptance Report – Failure out-going report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ1AccFail.h"
+
+
+void CrIaServ1AccFailUpdateAction(FwSmDesc_t smDesc)
+{
+  CRFW_UNUSED(smDesc); /* remove if smDesc is used in this function */
+  /* Implement the action logic here: */
+
+  /* Load the value of the report parameters */
+  /* NOT USED: done in IfswUtilities function, which packs and finalizes out-going packet */
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1AccFail.h b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1AccFail.h
new file mode 100644
index 0000000..08d5c23
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1AccFail.h
@@ -0,0 +1,24 @@
+/**
+ * @file CrIaServ1AccFail.h
+ *
+ * Declaration of the Telecommand Acceptance Report – Failure out-going report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV1_ACC_FAIL_H
+#define CRIA_SERV1_ACC_FAIL_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Update action of the Telecommand Acceptance Report – Failure telemetry packet.
+ * Load the value of the report parameters
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ1AccFailUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV1_ACC_FAIL_H */
+
diff --git a/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1AccSucc.c b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1AccSucc.c
new file mode 100644
index 0000000..8ebd46b
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1AccSucc.c
@@ -0,0 +1,32 @@
+/**
+ * @file CrIaServ1AccSucc.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Telecommand Acceptance Report – Success out-going report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ1AccSucc.h"
+
+
+void CrIaServ1AccSuccUpdateAction(FwSmDesc_t smDesc)
+{
+  CRFW_UNUSED(smDesc); /* remove if smDesc is used in this function */
+  /* Implement the action logic here: */
+
+  /* Load the value of the report parameters */
+  /* NOT USED: done in IfswUtilities function, which packs and finalizes out-going packet */
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1AccSucc.h b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1AccSucc.h
new file mode 100644
index 0000000..4ee07d5
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1AccSucc.h
@@ -0,0 +1,24 @@
+/**
+ * @file CrIaServ1AccSucc.h
+ *
+ * Declaration of the Telecommand Acceptance Report – Success out-going report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV1_ACC_SUCC_H
+#define CRIA_SERV1_ACC_SUCC_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Update action of the Telecommand Acceptance Report – Success telemetry packet.
+ * Load the value of the report parameters
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ1AccSuccUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV1_ACC_SUCC_H */
+
diff --git a/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1StartFail.c b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1StartFail.c
new file mode 100644
index 0000000..d607c43
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1StartFail.c
@@ -0,0 +1,32 @@
+/**
+ * @file CrIaServ1StartFail.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Telecommand Start Report – Failure out-going report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ1StartFail.h"
+
+
+void CrIaServ1StartFailUpdateAction(FwSmDesc_t smDesc)
+{
+  CRFW_UNUSED(smDesc); /* remove if smDesc is used in this function */
+  /* Implement the action logic here: */
+
+  /* Load the value of the report parameters */
+  /* NOT USED: done in IfswUtilities function, which packs and finalizes out-going packet */
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1StartFail.h b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1StartFail.h
new file mode 100644
index 0000000..a2c7dc6
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1StartFail.h
@@ -0,0 +1,24 @@
+/**
+ * @file CrIaServ1StartFail.h
+ *
+ * Declaration of the Telecommand Start Report – Failure out-going report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV1_START_FAIL_H
+#define CRIA_SERV1_START_FAIL_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Update action of the Telecommand Start Report – Failure telemetry packet.
+ * Load the value of the report parameters
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ1StartFailUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV1_START_FAIL_H */
+
diff --git a/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1StartSucc.c b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1StartSucc.c
new file mode 100644
index 0000000..a16dd9c
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1StartSucc.c
@@ -0,0 +1,32 @@
+/**
+ * @file CrIaServ1StartSucc.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Telecommand Start Report – Success out-going report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ1StartSucc.h"
+
+
+void CrIaServ1StartSuccUpdateAction(FwSmDesc_t smDesc)
+{
+  CRFW_UNUSED(smDesc); /* remove if smDesc is used in this function */
+  /* Implement the action logic here: */
+
+  /* Load the value of the report parameters */
+  /* NOT USED: done in IfswUtilities function, which packs and finalizes out-going packet */
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1StartSucc.h b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1StartSucc.h
new file mode 100644
index 0000000..6c3899f
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1StartSucc.h
@@ -0,0 +1,24 @@
+/**
+ * @file CrIaServ1StartSucc.h
+ *
+ * Declaration of the Telecommand Start Report – Success out-going report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV1_START_SUCC_H
+#define CRIA_SERV1_START_SUCC_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Update action of the Telecommand Start Report – Success telemetry packet.
+ * Load the value of the report parameters
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ1StartSuccUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV1_START_SUCC_H */
+
diff --git a/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1TermFail.c b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1TermFail.c
new file mode 100644
index 0000000..f38991b
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1TermFail.c
@@ -0,0 +1,32 @@
+/**
+ * @file CrIaServ1TermFail.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Telecommand Termination Report – Failure out-going report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ1TermFail.h"
+
+
+void CrIaServ1TermFailUpdateAction(FwSmDesc_t smDesc)
+{
+  CRFW_UNUSED(smDesc); /* remove if smDesc is used in this function */
+  /* Implement the action logic here: */
+
+  /* Load the value of the report parameters */
+  /* NOT USED: done in IfswUtilities function, which packs and finalizes out-going packet */
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1TermFail.h b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1TermFail.h
new file mode 100644
index 0000000..b4dd211
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1TermFail.h
@@ -0,0 +1,24 @@
+/**
+ * @file CrIaServ1TermFail.h
+ *
+ * Declaration of the Telecommand Termination Report – Failure out-going report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV1_TERM_FAIL_H
+#define CRIA_SERV1_TERM_FAIL_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Update action of the Telecommand Termination Report – Failure telemetry packet.
+ * Load the value of the report parameters
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ1TermFailUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV1_TERM_FAIL_H */
+
diff --git a/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1TermSucc.c b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1TermSucc.c
new file mode 100644
index 0000000..b41124c
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1TermSucc.c
@@ -0,0 +1,32 @@
+/**
+ * @file CrIaServ1TermSucc.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Telecommand Termination Report – Success out-going report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ1TermSucc.h"
+
+
+void CrIaServ1TermSuccUpdateAction(FwSmDesc_t smDesc)
+{
+  CRFW_UNUSED(smDesc); /* remove if smDesc is used in this function */
+  /* Implement the action logic here: */
+
+  /* Load the value of the report parameters */
+  /* NOT USED: done in IfswUtilities function, which packs and finalizes out-going packet */
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1TermSucc.h b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1TermSucc.h
new file mode 100644
index 0000000..ff38924
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ1CommandVerificationService/OutRep/CrIaServ1TermSucc.h
@@ -0,0 +1,24 @@
+/**
+ * @file CrIaServ1TermSucc.h
+ *
+ * Declaration of the Telecommand Termination Report – Success out-going report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV1_TERM_SUCC_H
+#define CRIA_SERV1_TERM_SUCC_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Update action of the Telecommand Termination Report – Success telemetry packet.
+ * Load the value of the report parameters
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ1TermSuccUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV1_TERM_SUCC_H */
+
diff --git a/CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210DisWdog.c b/CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210DisWdog.c
new file mode 100644
index 0000000..4f5e65f
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210DisWdog.c
@@ -0,0 +1,101 @@
+/**
+ * @file CrIaServ210DisWdog.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Disable Watchdog in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ210DisWdog.h"
+#include <CrFwCmpData.h>
+#include <FwSmConfig.h>
+
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#if (__sparc__)
+#include <ibsw_interface.h>
+#endif
+
+#include "../../../IfswDebug.h"
+
+
+void CrIaServ210DisWdogStartAction(FwSmDesc_t smDesc)
+{
+  unsigned char wdogEnb;
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  SendTcAccRepSucc(pckt); /* in the case that no validity check is done also a successful acknowledge report will be sent */
+
+  /* Set the action outcome to 'success' iff the watchdog is enabled */
+
+  CrIaCopy(ISWATCHDOGENABLED_ID, &wdogEnb);
+
+  if (wdogEnb == 1)
+    {
+      cmpData->outcome = 1;
+
+      SendTcStartRepSucc(pckt);
+
+      return;
+    }
+
+  SendTcStartRepFail(pckt, 1124, 0, (unsigned short)wdogEnb); /* ACK_ILL_WD_STATUS = 1124 = 0x0464 */
+
+  return;
+}
+
+void CrIaServ210DisWdogProgressAction(FwSmDesc_t smDesc)
+{
+  unsigned char wdogEnb;
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  /* Call the IBSW function which disables the watchdog */
+#if (__sparc__)
+  CrIbDisableWd();
+#endif
+
+  /* NOTE: not necessary: stop the Watchdog Reset Procedure */
+
+  /* set the enable status of the watchdog in the data pool to: 'disabled' */
+  wdogEnb = 0;
+  CrIaPaste(ISWATCHDOGENABLED_ID, &wdogEnb);
+
+  /* set the action outcome to 'completed' */
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  DEBUGP("S210: Disabled WD\n");
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210DisWdog.h b/CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210DisWdog.h
new file mode 100644
index 0000000..3f2044f
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210DisWdog.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ210DisWdog.h
+ *
+ * Declaration of the Disable Watchdog in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV210_DIS_WDOG_H
+#define CRIA_SERV210_DIS_WDOG_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Start action of the Disable Watchdog in-coming command packet.
+ * Set the action outcome to 'success' iff the watchdog is enabled
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ210DisWdogStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Disable Watchdog in-coming command packet.
+ * Call the IBSW function which disables the watchdog; set the enable status of the watchdog in the data pool to: 'disabled'; stop the Watchdog Reset Procedure; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ210DisWdogProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV210_DIS_WDOG_H */
+
diff --git a/CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210EnbWdog.c b/CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210EnbWdog.c
new file mode 100644
index 0000000..72263e3
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210EnbWdog.c
@@ -0,0 +1,101 @@
+/**
+ * @file CrIaServ210EnbWdog.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Enable Watchdog in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ210EnbWdog.h"
+#include <CrFwCmpData.h>
+#include <FwSmConfig.h>
+
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#if (__sparc__)
+#include <ibsw_interface.h>
+#endif
+
+#include "../../../IfswDebug.h"
+
+
+void CrIaServ210EnbWdogStartAction(FwSmDesc_t smDesc)
+{
+  unsigned char wdogEnb;
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  SendTcAccRepSucc(pckt); /* in the case that no validity check is done also a successful acknowledge report will be sent */
+
+  /* Set the action outcome to 'success' iff the watchdog is disabled */
+
+  CrIaCopy(ISWATCHDOGENABLED_ID, &wdogEnb);
+
+  if (wdogEnb == 0)
+    {
+      cmpData->outcome = 1;
+
+      SendTcStartRepSucc(pckt);
+
+      return;
+    }
+
+  SendTcStartRepFail(pckt, 1124, 0, (unsigned short)wdogEnb); /* ACK_ILL_WD_STATUS = 1124 = 0x0464 */
+
+  return;
+}
+
+void CrIaServ210EnbWdogProgressAction(FwSmDesc_t smDesc)
+{
+  unsigned char wdogEnb;
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  /* Call the IBSW function which enables the watchdog */
+#if (__sparc__)
+  CrIbEnableWd();
+#endif
+
+  /* NOTE: not necessary: start the Watchdog Reset Procedure */
+
+  /* set the enable status of the watchdog in the data pool to: 'enabled' */
+  wdogEnb = 1;
+  CrIaPaste(ISWATCHDOGENABLED_ID, &wdogEnb);
+
+  /* set the action outcome to 'completed' */
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  DEBUGP("S210: Enabled WD\n");
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210EnbWdog.h b/CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210EnbWdog.h
new file mode 100644
index 0000000..df07960
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210EnbWdog.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ210EnbWdog.h
+ *
+ * Declaration of the Enable Watchdog in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV210_ENB_WDOG_H
+#define CRIA_SERV210_ENB_WDOG_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Start action of the Enable Watchdog in-coming command packet.
+ * Set the action outcome to 'success' iff the watchdog is disabled
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ210EnbWdogStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Enable Watchdog in-coming command packet.
+ * Call the IBSW function which enables the watchdog; start the Watchdog Reset Procedure; set the enable status of the watchdog in the data pool to: 'enabled' set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ210EnbWdogProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV210_ENB_WDOG_H */
+
diff --git a/CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210ResetDpu.c b/CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210ResetDpu.c
new file mode 100644
index 0000000..4b2c839
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210ResetDpu.c
@@ -0,0 +1,91 @@
+/**
+ * @file CrIaServ210ResetDpu.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Reset DPU in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ210ResetDpu.h"
+#include <CrFwCmpData.h>
+#include <FwSmConfig.h>
+
+#include <IfswUtilities.h>
+#include <CrIaPrSm/CrIaSemCreate.h> /* for SwitchOff transition command and CrIaSem_OFF mode */
+
+#if (__sparc__)
+#include <ibsw_interface.h>
+#include <exchange_area.h>
+#else
+#include <stdlib.h> /* for exit() */
+#endif
+
+#include "../../../IfswDebug.h"
+
+
+void CrIaServ210ResetDpuStartAction(FwSmDesc_t smDesc)
+{
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  SendTcAccRepSucc(pckt); /* in the case that no validity check is done also a successful acknowledge report will be sent */
+
+  /* Start the DPU Reset Procedure and set the action outcome to 'success' */
+
+  /* NOTE: not needed: start the DPU Reset Procedure */
+
+  /* Send the SwitchOff command to the SEM State Machine (Mantis 2052) */
+  FwSmMakeTrans(smDescSem, SwitchOff);  
+
+  cmpData->outcome = 1;
+
+  SendTcStartRepSucc(pckt);
+
+  return;
+}
+
+void CrIaServ210ResetDpuProgressAction(FwSmDesc_t smDesc)
+{ 
+  CrFwCmpData_t* cmpData;
+
+  /* Call the IBSW function which triggers a DPU reset; set the action outcome to 'completed' - HAHA */
+  
+  DEBUGP("Service (210,5) => Carrying out Warm Reset!\nBye.\n");
+
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+
+  /* return 2 ('continue') if the SEM State Machine is in a state other than off; 
+     if SEM State Machine is in off, command the DPU reset and return 1 ('completed') (Mantis 2052) */
+  if (FwSmGetCurState(smDescSem) != CrIaSem_OFF)
+    {
+      cmpData->outcome = 2;
+      return;
+    }
+  else
+    {
+#if (__sparc__)
+      CrIbResetDPU(DBS_EXCHANGE_RESET_TYPE_CO);
+#else
+      exit (210);
+#endif
+    }
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210ResetDpu.h b/CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210ResetDpu.h
new file mode 100644
index 0000000..365628f
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ210BootManagementService/InCmd/CrIaServ210ResetDpu.h
@@ -0,0 +1,31 @@
+/**
+ * @file CrIaServ210ResetDpu.h
+ *
+ * Declaration of the Reset DPU in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV210_RESET_DPU_H
+#define CRIA_SERV210_RESET_DPU_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Start action of the Reset DPU in-coming command packet.
+ * Start the DPU Reset Procedre and set the action outcome to 'success'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ210ResetDpuStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Reset DPU in-coming command packet.
+ * Call the IBSW function which triggers a DPU reset; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ210ResetDpuProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV210_RESET_DPU_H */
+
diff --git a/CrIa/src/Services/CrIaServ211ParameterUpdateService/InCmd/CrIaServ211UpdatePar.c b/CrIa/src/Services/CrIaServ211ParameterUpdateService/InCmd/CrIaServ211UpdatePar.c
new file mode 100644
index 0000000..786c24c
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ211ParameterUpdateService/InCmd/CrIaServ211UpdatePar.c
@@ -0,0 +1,263 @@
+/**
+ * @file CrIaServ211UpdatePar.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Update Parameter in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ211UpdatePar.h"
+#include <CrFwCmpData.h>
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <Services/General/CrIaParamGetter.h>
+
+#include "../../../IfswDebug.h"
+
+#include <CrIaIasw.h>
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <CrConfigIa/CrFwUserConstants.h>
+#include <Services/General/CrIaConstants.h>
+
+#include <byteorder.h>
+#include <stdint.h>
+
+
+/* see 22.1 TC(211,1) Update Parameter ParamType
+ *
+ * TYPE_UINT8    1
+ * TYPE_UINT16   2
+ * TYPE_UINT32   3
+ * TYPE_INT8     4
+ * TYPE_INT16    5
+ * TYPE_INT32    6
+ * TYPE_BOOL     7
+ * TYPE_FLOAT    8
+ * TYPE_DOUBLE   9
+ * TYPE_CUC      10
+ *
+ * only 4 byte types are used (for now? TBC),
+ * hence the limit below:
+ */
+
+#define MAX_TYPE_ID   8
+
+/* The data pool uses much more relaxed integer types, but they will default
+ * to those below, so this is fine and much more explicit. (Remember, an int is
+ * only guaranteed to be at least 16 bits by the standard)
+ */
+unsigned char type_length[] = {0,
+                               sizeof(uint8_t), sizeof(uint16_t), sizeof(uint32_t),
+                               sizeof(int8_t),  sizeof(int16_t),  sizeof(int32_t),
+                               sizeof(uint8_t), sizeof(float),    sizeof(double),
+                               sizeof(CrFwTimeStamp_t)
+                              };
+
+
+CrFwBool_t CrIaServ211UpdateParValidityCheck(FwPrDesc_t prDesc)
+{
+  unsigned char len;
+  unsigned char param_type;
+
+  unsigned short offset = 0;
+  unsigned short num_params;
+  unsigned short array_elem_id;
+
+  unsigned int i;
+  unsigned int param_id;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData         = (CrFwCmpData_t   *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* Data item identifiers must be legal; parameter size (as determined by its type) must match the size of the data item to be updated; for array-like data items: array element index must be smaller than array length */
+
+  CrIaServ211UpdateParParamGetNoParams(&num_params, pckt);
+
+  for (i = 0; i < num_params; i++)
+    {
+
+      CrIaServ211UpdateParParamGetParamId(&param_id, offset, pckt);
+      CrIaServ211UpdateParParamGetParamType(&param_type, offset, pckt);
+      CrIaServ211UpdateParParamGetArrayElemId(&array_elem_id, offset, pckt);
+
+      len = type_length[param_type];
+
+      if (param_id == 0) /* Mantis 2247 handling of closed back-door */
+        {
+          SendTcAccRepFail(pckt, ACK_ILL_DID);
+          return 0;
+        }
+
+      if (param_id > DP_ID_MAX)
+        {
+          SendTcAccRepFail(pckt, ACK_ILL_DID);
+          return 0;
+        }
+
+      if (param_type > MAX_TYPE_ID)
+        {
+          SendTcAccRepFail(pckt, ACK_ILL_PTYP);
+          return 0;
+        }
+
+      if (len != GetDataPoolSize(param_id))
+        {
+          SendTcAccRepFail(pckt, ACK_WR_PLEN);
+          return 0;
+        }
+
+      if (array_elem_id >= GetDataPoolMult(param_id))
+        {
+          SendTcAccRepFail(pckt, ACK_ILL_ELEM);
+          return 0;
+        }
+
+      /* next block */
+      offset += (sizeof(param_id) + sizeof(param_type)
+                 + sizeof(array_elem_id) + len);
+    }
+
+  cmpData->outcome = 1;
+
+  SendTcAccRepSucc(pckt);
+
+  return 1;
+}
+
+
+
+void CrIaServ211UpdateParStartAction(FwSmDesc_t smDesc)
+{
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData		= (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		= cmpSpecificData->pckt;
+
+  /* Set the action outcome to 'success' */
+
+  cmpData->outcome = 1;
+
+  SendTcStartRepSucc(pckt);
+
+  return;
+}
+
+
+
+void CrIaServ211UpdateParProgressAction(FwSmDesc_t smDesc)
+{
+  unsigned char len;
+  unsigned char param_type;
+
+  unsigned short offset = 0;
+  unsigned short num_params;
+  unsigned short array_elem_id;
+
+  unsigned int i;
+  unsigned int tmp;
+  unsigned int param_id;
+
+  unsigned char *ptr;
+  unsigned char utemp8 = 1;
+  
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData		= (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		= cmpSpecificData->pckt;
+
+  /* Update the data item value; set the action outcome to 'completed' */
+
+  CrIaServ211UpdateParParamGetNoParams(&num_params, pckt);
+
+  for (i = 0; i < num_params; i++)
+    {
+
+      CrIaServ211UpdateParParamGetParamId(&param_id, offset, pckt);
+      CrIaServ211UpdateParParamGetParamType(&param_type, offset, pckt);
+      CrIaServ211UpdateParParamGetArrayElemId(&array_elem_id, offset, pckt);
+
+      len = type_length[param_type];
+
+      tmp = 0;
+
+      /* get the right spot */
+      ptr = ((unsigned char *) &tmp) + (sizeof(uint32_t) - len);
+
+      CrIaServ211UpdateParParamGetParamValue(ptr, offset, len, pckt);
+
+#if !(__sparc__)
+      switch (len)
+        {
+        case 2:
+          be16_to_cpus((unsigned short *) ptr);
+          break;
+        case 4:
+          be32_to_cpus((unsigned int *) ptr);
+          break;
+        }
+#endif
+
+      /* we use the paste single array element function also for the non-array parameters
+       * Because the parameter is passed below using a possibly larger container
+       * dataype, we have to adapt the pointer with the difference of the
+       * container sizes, similar to what will happen in the called function
+       * CrIaPasteArrayItem -> (TmType vs ImplType)
+       */
+      CrIaPasteArrayItem(param_id, ptr, array_elem_id);
+
+      /* Mantis 2219 */
+      if ((param_id == FBF_ENB_ID) && (*ptr == 1))
+	{
+	  CrIaPasteArrayItem(ISFBFVALID_ID, &utemp8, array_elem_id);
+	}     
+
+      /* next block */
+      offset += (sizeof(param_id) + sizeof(param_type)
+                 + sizeof(array_elem_id) + len);
+    }
+
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ211ParameterUpdateService/InCmd/CrIaServ211UpdatePar.h b/CrIa/src/Services/CrIaServ211ParameterUpdateService/InCmd/CrIaServ211UpdatePar.h
new file mode 100644
index 0000000..257365c
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ211ParameterUpdateService/InCmd/CrIaServ211UpdatePar.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ211UpdatePar.h
+ *
+ * Declaration of the Update Parameter in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV211_UPDATE_PAR_H
+#define CRIA_SERV211_UPDATE_PAR_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Update Parameter in-coming command packet.
+ * Data item identifiers must be legal; parameter size (as determined by its type) must match the size of the data item to be updated; for array-like data items: array element index must be smaller than array length
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ211UpdateParValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Update Parameter in-coming command packet.
+ * Set the action outcome to 'success'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ211UpdateParStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Update Parameter in-coming command packet.
+ * Update the data item value; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ211UpdateParProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV211_UPDATE_PAR_H */
+
diff --git a/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3ClrHkDr.c b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3ClrHkDr.c
new file mode 100644
index 0000000..1ad4175
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3ClrHkDr.c
@@ -0,0 +1,152 @@
+/**
+ * @file CrIaServ3ClrHkDr.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Clear Housekeeping Data Report in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ3ClrHkDr.h"
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+#include <Services/General/CrIaParamSetter.h>
+#include <Services/General/CrIaParamGetter.h>
+#include <Services/General/CrIaConstants.h>
+
+#include <CrIaIasw.h>
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include "../../../IfswDebug.h"
+
+
+CrFwBool_t CrIaServ3ClrHkDrValidityCheck(FwPrDesc_t prDesc)
+{
+  unsigned char sid;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData		= (CrFwCmpData_t   *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		= cmpSpecificData->pckt;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* SID must be in interval: (1..SID_MAX) */
+  CrIaServ3ClrHkDrParamGetSid(&sid, pckt);
+
+  if (sid && sid <= SID_MAX)
+    {
+      SendTcAccRepSucc(pckt);
+      return 1;
+    }
+
+  SendTcAccRepFail(pckt, ACK_ILL_SID);
+  return 0;
+}
+
+
+void CrIaServ3ClrHkDrStartAction(FwSmDesc_t smDesc)
+{
+  unsigned char sid, rdlSid, rdlSlot;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData	  = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		  = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Set the action outcome to 'success' iff there is an entry in the RDL corresponding to the argument SID */
+
+  CrIaServ3ClrHkDrParamGetSid(&sid, pckt);
+
+  /* look for the slot */
+  for (rdlSlot = 0; rdlSlot < RDL_SIZE; rdlSlot++)
+    {
+      CrIaCopyArrayItem(RDLSIDLIST_ID, &rdlSid, rdlSlot);
+      if (sid == rdlSid)
+        break;
+    }
+
+  /* sid not found in list */
+  if (rdlSlot == RDL_SIZE)
+    {
+      DEBUGP("SID %d not found!\n", sid);
+      SendTcStartRepFail(pckt, ACK_SID_NOT_USED, 1, (unsigned short)sid);
+      return;
+    }
+
+  cmpData->outcome = 1;
+
+  SendTcStartRepSucc(pckt);
+  return;
+}
+
+
+void CrIaServ3ClrHkDrProgressAction(FwSmDesc_t smDesc)
+{
+  unsigned char sid, rdlSid, rdlSlot, rdlFree, rdlEnabled;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData	  = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		  = cmpSpecificData->pckt;
+
+  /* Mark the entry in the RDL corresponding to the argument SID as 'free'; set the action outcome to 'completed'. */
+
+  CrIaServ3ClrHkDrParamGetSid(&sid, pckt);
+
+  /* look for the slot */
+  for (rdlSlot = 0; rdlSlot < RDL_SIZE; rdlSlot++)
+    {
+      CrIaCopyArrayItem(RDLSIDLIST_ID, &rdlSid, rdlSlot);
+      if (sid == rdlSid)
+        break;
+    }
+
+  rdlFree = 1;
+  CrIaPasteArrayItem(ISRDLFREE_ID, &rdlFree, rdlSlot);
+
+  /* in addition, we disable it */
+  rdlEnabled = 0;
+  CrIaPasteArrayItem(RDLENABLEDLIST_ID, &rdlEnabled, rdlSlot);
+
+  /* NOTE: Do not clear the SID here, especially for predefined HK SID slots (see Mantis 1755) */
+
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3ClrHkDr.h b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3ClrHkDr.h
new file mode 100644
index 0000000..ac447a9
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3ClrHkDr.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ3ClrHkDr.h
+ *
+ * Declaration of the Clear Housekeeping Data Report in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV3_CLR_HK_DR_H
+#define CRIA_SERV3_CLR_HK_DR_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Clear Housekeeping Data Report in-coming command packet.
+ * SID must be in interval: (1..SID_MAX)
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ3ClrHkDrValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Clear Housekeeping Data Report in-coming command packet.
+ * Set the action outcome to 'success' iff there is an entry in the RDL corresponding to the argument SID
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ3ClrHkDrStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Clear Housekeeping Data Report in-coming command packet.
+ * Mark the entry in the RDL corresponding to the argument SID as 'free'; set the action outcome to 'completed'.
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ3ClrHkDrProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV3_CLR_HK_DR_H */
+
diff --git a/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3DefineHkDr.c b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3DefineHkDr.c
new file mode 100644
index 0000000..ddaa234
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3DefineHkDr.c
@@ -0,0 +1,347 @@
+/**
+ * @file CrIaServ3DefineHkDr.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Define New Housekeeping Data Report in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ3DefineHkDr.h"
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <Services/General/CrIaParamGetter.h>
+#include <Services/General/CrIaConstants.h> /* for OFFSET_PAR_LENGTH_IN_CMD_PCKT */
+
+#include <CrIaIasw.h>
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <OutLoader/CrFwOutLoader.h>
+#include <OutFactory/CrFwOutFactory.h>
+#include <OutCmp/CrFwOutCmp.h>
+
+/* #include <string.h> */
+
+#include "IfswDebug.h"
+
+#define LISTITEMSIZE 4
+
+CrFwBool_t CrIaServ3DefineHkDrValidityCheck(FwPrDesc_t prDesc)
+{
+  unsigned char sid;
+
+  unsigned short items;
+  
+  unsigned int i, size;
+  unsigned int item_id;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData	  = (CrFwCmpData_t   *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		  = cmpSpecificData->pckt;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* SID must be in interval: (1..SID_MAX); number of Data Item Identifiers in interval: (1..RD_MAX_ITEMS); identifiers must be in interval: (1..DP_ID_MAX); total size of data items must be at most RD_MAX_SIZE */
+
+  CrIaServ3DefineHkDrParamGetSid(&sid, pckt);
+  CrIaServ3DefineHkDrParamGetNoDataItemId(&items, pckt);
+
+  /* check range of SID */
+  if (sid == 0 || sid > SID_MAX)
+    {
+      SendTcAccRepFail(pckt, ACK_ILL_SID);
+      return 0;
+    }
+
+  /* check number of items */
+  if (items == 0 || items > RD_MAX_ITEMS)
+    {
+      SendTcAccRepFail(pckt, ACK_ILL_NDI);
+      return 0;
+    }
+
+  /* check data item IDs for their range validity */
+  for (i = 0; i < items; i++)
+    {
+      CrIaServ3DefineHkDrParamGetDataItemId(&item_id, LISTITEMSIZE, i * LISTITEMSIZE, pckt);
+
+      if (item_id == 0 || item_id > DP_ID_MAX)
+        {
+          SendTcAccRepFail(pckt, ACK_ILL_DID);
+          return 0;
+        }
+    }
+
+  /* get and check total size of data items */
+  for (i=0, size=0; i < items; i++)
+    {
+      CrIaServ3DefineHkDrParamGetDataItemId(&item_id, LISTITEMSIZE, i * LISTITEMSIZE, pckt);
+
+      size += GetDataPoolSize(item_id) * GetDataPoolMult(item_id);      
+    }
+
+  /* Compare size of parameter part of the new generated report with maximum size of parameter part. */
+  /* size of parameter part: RD_MAX_SIZE (packet size) - header_size - discriminant_size (SID) - CRC_size */
+  if (size > (RD_MAX_SIZE - OFFSET_PAR_LENGTH_OUT_REP_PCKT - 1 - CRC_LENGTH))
+    {
+      SendTcAccRepFail(pckt, ACK_ILL_DSIZE);
+      return 0;
+    }
+
+  SendTcAccRepSucc(pckt);
+
+  return 1;
+}
+
+
+void CrIaServ3DefineHkDrStartAction(FwSmDesc_t smDesc)
+{
+  unsigned char sid;
+
+  unsigned char rdlSid, rdlFree;
+  unsigned int i;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData	  = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		  = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Set the action outcome to 'success' iff the argument SID is not already in use and if there is a free slot in the RDL */
+
+  CrIaServ3DefineHkDrParamGetSid(&sid, pckt);
+
+  /* check if the sid is not already taken */
+  for (i = 0; i < RDL_SIZE; i++)
+    {
+      CrIaCopyArrayItem(RDLSIDLIST_ID, &rdlSid, i);
+
+      if (rdlSid == sid)
+        {
+          /* the sid is taken, but is it actually marked as used? */
+          CrIaCopyArrayItem(ISRDLFREE_ID, &rdlFree, i);
+
+          if (rdlFree == 0)
+            {
+              SendTcStartRepFail(pckt, ACK_SID_IN_USE, 1, (unsigned short)sid);
+              return;
+            }
+        }
+    }
+
+  /* look for the first free RDL slot */
+  for (i = 0; i < RDL_SIZE; i++)
+    {
+      CrIaCopyArrayItem(ISRDLFREE_ID, &rdlFree, i);
+
+      if (rdlFree == 1)
+        break;
+    }
+  /* i contains now the index of the free RDL slot */
+
+  if (i == RDL_SIZE)
+    {
+      SendTcStartRepFail(pckt, ACK_RDL_NO_SLOT, 0, (unsigned int)i);
+      return;
+    }
+
+  cmpData->outcome = 1;
+
+  SendTcStartRepSucc(pckt);
+
+  return;
+}
+
+
+/**
+ * @brief Progress Action of the Service 3 Define New Housekeeping
+ *
+ * @note The implementation is not realized using the described framework procedure in the specification document CHEOPS-PNP-INST-RS-001.
+ *
+ * Following steps are executed:
+ * - Load report definition in the command parameter into a free slot of the RDL and mark the slot as 'not free'
+ * - Set the enable status in the RDL of the newly-defined report definition to 'enabled'
+ * - Run the OutComponent Load Procedure to load the newly-defined report in its POCL
+ * if report was not loaded in POCL:
+ * - Clear the definition of the new report in the RDL by marking its slot as 'free'
+ *
+ * @param[in]  smDesc state machine descriptor
+ * @param[out] none
+ */
+void CrIaServ3DefineHkDrProgressAction(FwSmDesc_t smDesc)
+{
+  unsigned char rdlSid, rdlFree, rdlSlot;
+  unsigned char rdlEnabled;
+
+  unsigned short numItems;
+  unsigned short getPeriod;
+
+  unsigned int i;
+  unsigned int itemId, rdlListId;
+  unsigned int rdlPeriod;
+  unsigned int rdlCycCnt;
+  unsigned int hkPacketSize;
+
+  unsigned short RdlDataItemList[RD_MAX_ITEMS];
+
+  FwSmDesc_t  rep;
+
+  CrFwGroup_t group = 1; /* PCAT = 2 */
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData	  = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		  = cmpSpecificData->pckt;
+
+  /* Run procedure of figure CrIaPrgAct3s1 */
+  /* NOTE: not needed: Run procedure */
+
+  CrIaServ3DefineHkDrParamGetSid(&rdlSid, pckt);
+
+  /* look for the first free RDL slot */
+  for (i = 0; i < RDL_SIZE; i++)
+    {
+      CrIaCopyArrayItem(ISRDLFREE_ID, &rdlFree, i);
+
+      if (rdlFree == 1)
+        break;
+    }
+  /* i contains now the index of the free RDL slot */
+  rdlSlot = i;
+
+  /* paste sid into the RdlSidList */
+  CrIaPasteArrayItem(RDLSIDLIST_ID, &rdlSid, rdlSlot);
+
+  /* mark as taken */
+  rdlFree = 0;
+  CrIaPasteArrayItem(ISRDLFREE_ID, &rdlFree, rdlSlot);
+
+  /* get and enter Period */
+  CrIaServ3DefineHkDrParamGetPeriod(&getPeriod, pckt); /* NOTE: getter is in ushort, but RDL entry is uint */
+
+  rdlPeriod = (unsigned int) getPeriod;
+  CrIaPasteArrayItem(RDLPERIODLIST_ID, &rdlPeriod, rdlSlot);
+
+  /* clear the RDL before */
+  CrIaServ3DefineHkDrParamGetNoDataItemId(&numItems, pckt);
+
+  /* enter items */
+  for (i=0; i < numItems; i++)
+    {
+      CrIaServ3DefineHkDrParamGetDataItemId(&itemId, LISTITEMSIZE, i * LISTITEMSIZE, pckt);
+      RdlDataItemList[i] = itemId;
+    }
+
+  /* fill rest of list with zeroes */
+  for ( ; i < RD_MAX_ITEMS; i++)
+    RdlDataItemList[i] = 0;
+
+  /* get the data pool handle of the list */
+  switch (rdlSlot)
+    {
+    case 0:
+      rdlListId = RDLDATAITEMLIST_0_ID;
+      break;
+    case 1:
+      rdlListId = RDLDATAITEMLIST_1_ID;
+      break;
+    case 2:
+      rdlListId = RDLDATAITEMLIST_2_ID;
+      break;
+    case 3:
+      rdlListId = RDLDATAITEMLIST_3_ID;
+      break;
+    case 4:
+      rdlListId = RDLDATAITEMLIST_4_ID;
+      break;
+    case 5:
+      rdlListId = RDLDATAITEMLIST_5_ID;
+      break;
+    case 6:
+      rdlListId = RDLDATAITEMLIST_6_ID;
+      break;
+    case 7:
+      rdlListId = RDLDATAITEMLIST_7_ID;
+      break;
+    case 8:
+      rdlListId = RDLDATAITEMLIST_8_ID;
+      break;
+    case 9:
+      rdlListId = RDLDATAITEMLIST_9_ID;
+      break;
+    default :
+      SendTcTermRepFail(pckt, ACK_RDL_NO_SLOT, 0, (unsigned short)rdlSlot);
+      return;
+    }
+
+  /* copy the local elements (16 bit) into the data pool list (element-wise) */
+  CrIaPaste(rdlListId, RdlDataItemList);
+
+  /* enable the list */
+  rdlEnabled = 1;
+  CrIaPasteArrayItem(RDLENABLEDLIST_ID, &rdlEnabled, rdlSlot);
+
+  /* we also set the cycle counter for this RDL to 1 */
+  rdlCycCnt = 0;
+  CrIaPasteArrayItem(RDLCYCCNTLIST_ID, &rdlCycCnt, rdlSlot);
+
+  /* determine the size of this HK packet to be created */
+  hkPacketSize = getHkDataSize(rdlSid);
+
+  /* prepare packet */
+  rep = CrFwOutFactoryMakeOutCmp(CRIA_SERV3, CRIA_SERV3_HK_DR, rdlSid, hkPacketSize);
+  if (rep == NULL)
+    {
+      /* handled by Resource FdCheck */
+
+      /* clear the definition of the new report in the RDL by marking its slot as 'free' */
+      /* mark as free */
+      rdlFree = 1;
+      CrIaPasteArrayItem(ISRDLFREE_ID, &rdlFree, rdlSlot);
+
+      return;
+    }
+
+  CrFwOutCmpSetGroup(rep, group);
+  CrFwOutLoaderLoad(rep); /* Mantis 1857: a load failure will result in the generation of an error by the OutManager */
+
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3DefineHkDr.h b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3DefineHkDr.h
new file mode 100644
index 0000000..da796b4
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3DefineHkDr.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ3DefineHkDr.h
+ *
+ * Declaration of the Define New Housekeeping Data Report in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV3_DEFINE_HK_DR_H
+#define CRIA_SERV3_DEFINE_HK_DR_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Define New Housekeeping Data Report in-coming command packet.
+ * SID must be in interval: (1..SID_MAX); number of Data Item Identifiers in interval: (1..RD_MAX_ITEMS); identifiers must be in interval: (1..DP_ID_MAX); total size of data items must be at most RD_MAX_SIZE
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ3DefineHkDrValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Define New Housekeeping Data Report in-coming command packet.
+ * Set the action outcome to 'success' iff the argument SID is not already in use and if there is a free slot in the RDL
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ3DefineHkDrStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Define New Housekeeping Data Report in-coming command packet.
+ * Run procedure of figure CrIaPrgAct3s1
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ3DefineHkDrProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV3_DEFINE_HK_DR_H */
+
diff --git a/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3DisHkDrGen.c b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3DisHkDrGen.c
new file mode 100644
index 0000000..cc728fa
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3DisHkDrGen.c
@@ -0,0 +1,148 @@
+/**
+ * @file CrIaServ3DisHkDrGen.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Disable Housekeeping Data Report Generation in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ3DisHkDrGen.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+#include <Services/General/CrIaParamGetter.h>
+#include <Services/General/CrIaConstants.h>
+
+#include <CrIaIasw.h>
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include "../../../IfswDebug.h"
+
+
+CrFwBool_t CrIaServ3DisHkDrGenValidityCheck(FwPrDesc_t prDesc)
+{
+  unsigned char sid;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData         = (CrFwCmpData_t   *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* SID must be in interval: (1..SID_MAX) */
+
+  CrIaServ3DisHkDrGenParamGetSid(&sid, pckt);
+
+  if (sid && sid <= SID_MAX)
+    {
+      SendTcAccRepSucc(pckt);
+      return 1;
+    }
+
+  SendTcAccRepFail(pckt, ACK_ILL_SID);
+  return 0;
+}
+
+
+void CrIaServ3DisHkDrGenStartAction(FwSmDesc_t smDesc)
+{
+  unsigned char sid, rdlSid, rdlSlot;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData	  = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		  = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Set the action outcome to 'success' iff there is an entry in the RDL corresponding to the argument SID */
+
+  CrIaServ3DisHkDrGenParamGetSid(&sid, pckt);
+
+  /* look for the slot */
+  for (rdlSlot = 0; rdlSlot < RDL_SIZE; rdlSlot++)
+    {
+      CrIaCopyArrayItem(RDLSIDLIST_ID, &rdlSid, rdlSlot);
+      if (sid == rdlSid)
+        break;
+    }
+
+  /* sid not found in list */
+  if (rdlSlot == RDL_SIZE)
+    {
+      DEBUGP("SID %d not found!\n", sid);
+      SendTcStartRepFail(pckt, ACK_SID_NOT_USED, 1, (unsigned short)sid);
+      return;
+    }
+
+  cmpData->outcome = 1;
+  SendTcStartRepSucc(pckt);
+  return;
+}
+
+
+void CrIaServ3DisHkDrGenProgressAction(FwSmDesc_t smDesc)
+{
+  unsigned char sid, rdlSid, rdlSlot, rdlEnabled;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData	  = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		  = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Set the enable status of the entry in the RDL corresponding to the argument SID to 'disabled'; set the action outcome to 'completed'. */
+
+  CrIaServ3DisHkDrGenParamGetSid(&sid, pckt);
+
+  /* look for the slot */
+  for (rdlSlot = 0; rdlSlot < RDL_SIZE; rdlSlot++)
+    {
+      CrIaCopyArrayItem(RDLSIDLIST_ID, &rdlSid, rdlSlot);
+      if (sid == rdlSid)
+        break;
+    }
+
+  rdlEnabled = 0;
+  CrIaPasteArrayItem(RDLENABLEDLIST_ID, &rdlEnabled, rdlSlot);
+
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3DisHkDrGen.h b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3DisHkDrGen.h
new file mode 100644
index 0000000..1d47e62
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3DisHkDrGen.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ3DisHkDrGen.h
+ *
+ * Declaration of the Disable Housekeeping Data Report Generation in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV3_DIS_HK_DR_GEN_H
+#define CRIA_SERV3_DIS_HK_DR_GEN_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Disable Housekeeping Data Report Generation in-coming command packet.
+ * SID must be in interval: (1..SID_MAX)
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ3DisHkDrGenValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Disable Housekeeping Data Report Generation in-coming command packet.
+ * Set the action outcome to 'success' iff there is an entry in the RDL corresponding to the argument SID
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ3DisHkDrGenStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Disable Housekeeping Data Report Generation in-coming command packet.
+ * Set the enable status of the entry in the RDL corresponding to the argument SID to 'disabled'; set the action outcome to 'completed'.
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ3DisHkDrGenProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV3_DIS_HK_DR_GEN_H */
+
diff --git a/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3EnbHkDrGen.c b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3EnbHkDrGen.c
new file mode 100644
index 0000000..2c3f209
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3EnbHkDrGen.c
@@ -0,0 +1,153 @@
+/**
+ * @file CrIaServ3EnbHkDrGen.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Enable Housekeeping Data Report Generation in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ3EnbHkDrGen.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+#include <Services/General/CrIaParamGetter.h>
+#include <Services/General/CrIaConstants.h>
+
+#include <CrIaIasw.h>
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include "../../../IfswDebug.h"
+
+
+CrFwBool_t CrIaServ3EnbHkDrGenValidityCheck(FwPrDesc_t prDesc)
+{
+  unsigned char sid;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData         = (CrFwCmpData_t   *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* SID must be in interval: (1..SID_MAX) */
+
+  CrIaServ3EnbHkDrGenParamGetSid(&sid, pckt);
+
+  if (sid && sid <= SID_MAX)
+    {
+      SendTcAccRepSucc(pckt);
+      return 1;
+    }
+
+  SendTcAccRepFail(pckt, ACK_ILL_SID);
+
+  return 0;
+}
+
+
+void CrIaServ3EnbHkDrGenStartAction(FwSmDesc_t smDesc)
+{
+  unsigned char sid, rdlSid, rdlSlot;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData	  = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		  = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Set the action outcome to 'success' iff there is an entry in the RDL corresponding to the argument SID */
+
+  CrIaServ3EnbHkDrGenParamGetSid(&sid, pckt);
+
+  /* look for the slot */
+  for (rdlSlot = 0; rdlSlot < RDL_SIZE; rdlSlot++)
+    {
+      CrIaCopyArrayItem(RDLSIDLIST_ID, &rdlSid, rdlSlot);
+      if (sid == rdlSid)
+        break;
+    }
+
+  /* sid not found in list */
+  if (rdlSlot == RDL_SIZE)
+    {
+      DEBUGP("SID %d not found!\n", sid);
+      SendTcStartRepFail(pckt, ACK_SID_NOT_USED, 1, (unsigned short)sid);
+      return;
+    }
+
+  cmpData->outcome = 1;
+  SendTcStartRepSucc(pckt);
+  return;
+}
+
+
+void CrIaServ3EnbHkDrGenProgressAction(FwSmDesc_t smDesc)
+{
+  unsigned char sid, rdlSid, rdlSlot, rdlEnabled;
+
+  unsigned int rdlCycCnt;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData	  = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		  = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Set the enable status of the entry in the RDL corresponding to the argument SID to 'enabled' and set the cycle counter of the same RDL entry to zero; set the action outcome to 'completed'. */
+
+  CrIaServ3EnbHkDrGenParamGetSid(&sid, pckt);
+
+  /* look for the slot */
+  for (rdlSlot = 0; rdlSlot < RDL_SIZE; rdlSlot++)
+    {
+      CrIaCopyArrayItem(RDLSIDLIST_ID, &rdlSid, rdlSlot);
+      if (sid == rdlSid)
+        break;
+    }
+
+  rdlEnabled = 1;
+  CrIaPasteArrayItem(RDLENABLEDLIST_ID, &rdlEnabled, rdlSlot);
+
+  rdlCycCnt = 0;
+  CrIaPasteArrayItem(RDLCYCCNTLIST_ID, &rdlCycCnt, rdlSlot);
+
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+  return;
+}
diff --git a/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3EnbHkDrGen.h b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3EnbHkDrGen.h
new file mode 100644
index 0000000..4e93f10
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3EnbHkDrGen.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ3EnbHkDrGen.h
+ *
+ * Declaration of the Enable Housekeeping Data Report Generation in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV3_ENB_HK_DR_GEN_H
+#define CRIA_SERV3_ENB_HK_DR_GEN_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Enable Housekeeping Data Report Generation in-coming command packet.
+ * SID must be in interval: (1..SID_MAX)
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ3EnbHkDrGenValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Enable Housekeeping Data Report Generation in-coming command packet.
+ * Set the action outcome to 'success' iff there is an entry in the RDL corresponding to the argument SID
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ3EnbHkDrGenStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Enable Housekeeping Data Report Generation in-coming command packet.
+ * Set the enable status of the entry in the RDL corresponding to the argument SID to 'enabled' and set the cycle counter of the same RDL entry to zero; set the action outcome to 'completed'.
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ3EnbHkDrGenProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV3_ENB_HK_DR_GEN_H */
+
diff --git a/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3SetHkRepFreq.c b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3SetHkRepFreq.c
new file mode 100644
index 0000000..4b9d8ac
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3SetHkRepFreq.c
@@ -0,0 +1,160 @@
+/**
+ * @file CrIaServ3SetHkRepFreq.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Set Housekeeping Reporting Frequency in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ3SetHkRepFreq.h"
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+#include <Services/General/CrIaParamGetter.h>
+#include <Services/General/CrIaConstants.h>
+
+#include <CrIaIasw.h>
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include "../../../IfswDebug.h"
+
+
+CrFwBool_t CrIaServ3SetHkRepFreqValidityCheck(FwPrDesc_t prDesc)
+{
+  unsigned char sid;
+  unsigned short period;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData		= (CrFwCmpData_t   *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		= cmpSpecificData->pckt;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* SID must be in interval: (1..SID_MAX) and period must be a non-negative integer */
+
+  CrIaServ3SetHkRepFreqParamGetSid(&sid, pckt);
+  CrIaServ3SetHkRepFreqParamGetPeriod(&period, pckt);
+
+  if (sid == 0 || sid > SID_MAX)
+    {
+      SendTcAccRepFail(pckt, ACK_ILL_SID);
+      return 0;
+    }
+
+  /* no check on period necessary, because it has an unsigned dataype and 0 is valid */
+
+  SendTcAccRepSucc(pckt);
+  return 1;
+}
+
+
+void CrIaServ3SetHkRepFreqStartAction(FwSmDesc_t smDesc)
+{
+  unsigned char sid, rdlSid, rdlSlot;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData	  = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		  = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Set the action outcome to 'success' iff there is an entry in the RDL corresponding to the argument SID */
+
+  CrIaServ3SetHkRepFreqParamGetSid(&sid, pckt);
+
+  /* look for the slot */
+  for (rdlSlot = 0; rdlSlot < RDL_SIZE; rdlSlot++)
+    {
+      CrIaCopyArrayItem(RDLSIDLIST_ID, &rdlSid, rdlSlot);
+      if (sid == rdlSid)
+        break;
+    }
+
+  /* sid not found in list */
+  if (rdlSlot == RDL_SIZE)
+    {
+      DEBUGP("SID %d not found!\n", sid);
+      SendTcStartRepFail(pckt, ACK_SID_NOT_USED, 1, (unsigned short)sid);
+      return;
+    }
+
+  cmpData->outcome = 1;
+  SendTcStartRepSucc(pckt);
+  return;
+}
+
+
+void CrIaServ3SetHkRepFreqProgressAction(FwSmDesc_t smDesc)
+{
+  unsigned char sid, rdlSid, rdlSlot;
+
+  unsigned short getPeriod;
+
+  unsigned int rdlPeriod, rdlCycCnt;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+
+  cmpData	  = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		  = cmpSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Set the period of the entry in the RDL corresponding to the argument SID to the value specified in the command argument; set the cycle counter in the same RDL entry to zero; set the action outcome to 'completed'. */
+
+  CrIaServ3SetHkRepFreqParamGetSid(&sid, pckt);
+  CrIaServ3SetHkRepFreqParamGetPeriod(&getPeriod, pckt); /* NOTE: datatype in packet and in DP are different */
+
+  /* look for the slot */
+  for (rdlSlot = 0; rdlSlot < RDL_SIZE; rdlSlot++)
+    {
+      CrIaCopyArrayItem(RDLSIDLIST_ID, &rdlSid, rdlSlot);
+      if (sid == rdlSid)
+        break;
+    }
+
+  rdlPeriod = (unsigned int) getPeriod; /* NOTE: datatype in packet and in DP are different */
+
+  CrIaPasteArrayItem(RDLPERIODLIST_ID, &rdlPeriod, rdlSlot);
+
+  rdlCycCnt = 0;
+  CrIaPasteArrayItem(RDLCYCCNTLIST_ID,  &rdlCycCnt, rdlSlot);
+
+  cmpData->outcome = 1;
+
+  SendTcTermRepSucc(pckt);
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3SetHkRepFreq.h b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3SetHkRepFreq.h
new file mode 100644
index 0000000..12fc108
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/InCmd/CrIaServ3SetHkRepFreq.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ3SetHkRepFreq.h
+ *
+ * Declaration of the Set Housekeeping Reporting Frequency in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV3_SET_HK_REP_FREQ_H
+#define CRIA_SERV3_SET_HK_REP_FREQ_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Set Housekeeping Reporting Frequency in-coming command packet.
+ * SID must be in interval: (1..SID_MAX) and period must be a non-negative integer
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ3SetHkRepFreqValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Set Housekeeping Reporting Frequency in-coming command packet.
+ * Set the action outcome to 'success' iff there is an entry in the RDL corresponding to the argument SID
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ3SetHkRepFreqStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Set Housekeeping Reporting Frequency in-coming command packet.
+ * Set the period of the entry in the RDL corresponding to the argument SID to the value specified in the command argument; set the cycle counter in the same RDL entry to zero; set the action outcome to 'completed'.
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ3SetHkRepFreqProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV3_SET_HK_REP_FREQ_H */
+
diff --git a/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/OutRep/CrIaServ3HkDr.c b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/OutRep/CrIaServ3HkDr.c
new file mode 100644
index 0000000..2b01181
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/OutRep/CrIaServ3HkDr.c
@@ -0,0 +1,263 @@
+/**
+ * @file CrIaServ3HkDr.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Housekeeping Data Report out-going report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ3HkDr.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+#include <Services/General/CrIaParamSetter.h>
+#include <Services/General/CrIaConstants.h> /* for ACK_SID_NOT_USED */
+
+#include <CrIaPckt.h>
+#include <IfswUtilities.h>
+#include <CrFramework/OutCmp/CrFwOutCmp.h>
+#include <Pckt/CrFwPckt.h>
+
+#include <CrFwCmpData.h>
+#include <CrIaPckt.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <stdlib.h>
+#include "../../../IfswDebug.h"
+
+
+CrFwBool_t CrIaServ3HkDrEnableCheck(FwSmDesc_t smDesc)
+{
+  unsigned char sid, rdlFree, rdlSid, rdlSlot;
+
+  CrFwPckt_t       pckt;
+  CrFwDiscriminant_t  disc;
+  CrFwCmpData_t      *cmpData;
+  CrFwInCmdData_t    *cmpSpecificData;
+
+  cmpData	  = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		  = cmpSpecificData->pckt;
+  disc            = CrFwPcktGetDiscriminant(pckt);
+
+  /* IsEnabled = (RDL entry corresponding to argument SID is not free) */
+
+  /* discriminant for HK is the SID */
+  sid = (unsigned char) disc;
+
+  /* look for the slot */
+  for (rdlSlot = 0; rdlSlot < RDL_SIZE; rdlSlot++)
+    {
+      CrIaCopyArrayItem(RDLSIDLIST_ID, &rdlSid, rdlSlot);
+      if (sid == rdlSid)
+        break;
+    }
+
+  /* get information if the list is used */
+  CrIaCopyArrayItem(ISRDLFREE_ID, &rdlFree, rdlSlot);
+
+  if (rdlFree == 0)
+    return 1;
+
+  return 0;
+}
+
+
+/**
+ * @brief Ready Check action of the Service 3 Housekeeping Data Report
+ *
+ * @note The implementation is not realized using the described framework procedure in the specification document CHEOPS-PNP-INST-RS-001.
+ *
+ * Following steps are executed:
+ * - Check the enable status
+ * if enabled:
+ * - Check the cycle counter
+ *
+ * @param[in]  smDesc state machine descriptor
+ * @param[out] 1 ('ready') or 0 ('not ready')
+ */
+CrFwBool_t CrIaServ3HkDrReadyCheck(FwSmDesc_t smDesc)
+{
+  unsigned char sid, rdlSid, rdlSlot, rdlEnabled;
+  unsigned int rdlPeriod, rdlCycCnt;
+
+  CrFwPckt_t          pckt;
+  CrFwDiscriminant_t  disc;
+  CrFwCmpData_t      *cmpData;
+  CrFwInCmdData_t    *cmpSpecificData;
+
+  cmpData	  = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		  = cmpSpecificData->pckt;
+  disc            = CrFwPcktGetDiscriminant(pckt);
+
+  /* Execute the procedure of figure CrIaReadyChk3s25 (NOTE: is manually implemented) */
+
+  /* disc for HK is the SID */
+  sid = (unsigned char) disc;
+
+  /* look for the slot */
+  for (rdlSlot = 0; rdlSlot < RDL_SIZE; rdlSlot++)
+    {
+      CrIaCopyArrayItem(RDLSIDLIST_ID, &rdlSid, rdlSlot);
+      if (sid == rdlSid)
+        break;
+    }
+
+  /*
+  DEBUGP("ready check for SID %d %d in slot %d\n", sid, rdlSid, rdlSlot);
+  */
+  CrIaCopyArrayItem(RDLENABLEDLIST_ID, &rdlEnabled, rdlSlot);
+  CrIaCopyArrayItem(RDLPERIODLIST_ID,  &rdlPeriod, rdlSlot);
+  CrIaCopyArrayItem(RDLCYCCNTLIST_ID,  &rdlCycCnt, rdlSlot);
+  /*
+  DEBUGP("enb %d per %d cyc %d\n", rdlEnabled, rdlPeriod, rdlCycCnt);
+  */
+  if (rdlEnabled == 0)
+    return 0;
+
+  /* in the case p=0 we move on to the repeat check, where this special case is handled */
+  /* 	if (rdl_period == 0)
+  return 1; */
+
+  /* for all normal "waiting" cases: */
+  /* cycle == 0 -> return 1 ; reset cycle counter to period - 1; write cycle counter back to data pool */
+  if (rdlCycCnt == 0)
+    {
+      rdlCycCnt = rdlPeriod - 1;
+      CrIaPasteArrayItem(RDLCYCCNTLIST_ID, &rdlCycCnt, rdlSlot);
+      return 1;
+    }
+
+  /* If period == 0, then the cycle counter will be decremented once to -1 and stay there */
+  /* if period 0xffffffff is commanded, it will never output a HK, but this will only be discovered after 20 years */
+  if (rdlCycCnt != 0xffffffff)
+    rdlCycCnt--;
+
+  CrIaPasteArrayItem(RDLCYCCNTLIST_ID, &rdlCycCnt, rdlSlot);
+
+  return 0;
+}
+
+void CrIaServ3HkDrUpdateAction(FwSmDesc_t smDesc)
+{
+  unsigned char sid, rdlSid, rdlSlot;
+  unsigned short rdlDest;
+
+  unsigned int i;
+  unsigned int len, typelen;
+  unsigned int offset  = 0;
+  unsigned int rdlListId = 0;
+
+  unsigned short RdlDataItemList[250];
+
+  CrFwPckt_t          pckt;
+  CrFwDiscriminant_t  disc;
+  CrFwCmpData_t      *cmpData;
+  CrFwInCmdData_t    *cmpSpecificData;
+
+
+  cmpData	  = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		  = cmpSpecificData->pckt;
+  disc            = CrFwPcktGetDiscriminant(pckt);
+
+  /* Load the values of the data pool items associated to the RDL entry corresponding to the report's SID */
+
+  sid = (unsigned char) disc;
+
+  /* look for the slot */
+  for (rdlSlot = 0; rdlSlot < RDL_SIZE; rdlSlot++)
+    {
+      CrIaCopyArrayItem(RDLSIDLIST_ID, &rdlSid, rdlSlot);
+      if (sid == rdlSid)
+        break;
+    }
+
+  /* get the data pool handle of the list */
+  switch (rdlSlot)
+    {
+    case 0:
+      rdlListId = RDLDATAITEMLIST_0_ID;
+      break;
+    case 1:
+      rdlListId = RDLDATAITEMLIST_1_ID;
+      break;
+    case 2:
+      rdlListId = RDLDATAITEMLIST_2_ID;
+      break;
+    case 3:
+      rdlListId = RDLDATAITEMLIST_3_ID;
+      break;
+    case 4:
+      rdlListId = RDLDATAITEMLIST_4_ID;
+      break;
+    case 5:
+      rdlListId = RDLDATAITEMLIST_5_ID;
+      break;
+    case 6:
+      rdlListId = RDLDATAITEMLIST_6_ID;
+      break;
+    case 7:
+      rdlListId = RDLDATAITEMLIST_7_ID;
+      break;
+    case 8:
+      rdlListId = RDLDATAITEMLIST_8_ID;
+      break;
+    case 9:
+      rdlListId = RDLDATAITEMLIST_9_ID;
+      break;
+    default :
+      SendTcTermRepFail(pckt, ACK_RDL_NO_SLOT, 0, (unsigned short)rdlSlot);
+      return;
+    }
+
+  CrIaCopy(rdlListId, RdlDataItemList);
+
+  for (i = 0; i < RD_MAX_ITEMS; i++)
+    {
+      if (RdlDataItemList[i] == 0)
+        break;
+
+      typelen = GetDataPoolSize((unsigned int)RdlDataItemList[i]);
+      len = GetDataPoolMult((unsigned int)RdlDataItemList[i]) * typelen;
+
+#if (__sparc__)
+      switch (typelen)
+        {
+        case 4:
+          CrIaCopy(RdlDataItemList[i], (unsigned int *) &pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1 + offset]);
+          break;
+        case 2:
+          CrIaCopy(RdlDataItemList[i], (unsigned short *) &pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1 + offset]);
+          break;
+        default:
+          CrIaCopy(RdlDataItemList[i], &pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1 + offset]);
+          break;
+        }
+#else
+      CrIaCopyPcPckt(RdlDataItemList[i], &pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1 + offset]);
+#endif
+
+      offset += len;
+    }
+
+  CrIaCopyArrayItem(RDLDESTLIST_ID, &rdlDest, rdlSlot);
+
+  CrFwOutCmpSetDest(smDesc, rdlDest);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/OutRep/CrIaServ3HkDr.h b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/OutRep/CrIaServ3HkDr.h
new file mode 100644
index 0000000..a46f330
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ3HousekeepingDataReportingService/OutRep/CrIaServ3HkDr.h
@@ -0,0 +1,40 @@
+/**
+ * @file CrIaServ3HkDr.h
+ *
+ * Declaration of the Housekeeping Data Report out-going report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV3_HK_DR_H
+#define CRIA_SERV3_HK_DR_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Enable check of the Housekeeping Data Report telemetry packet.
+ * IsEnabled = (RDL entry corresponding to argument SID is not free)
+ * @param smDesc the state machine descriptor
+ * @return the enable check result
+ */
+CrFwBool_t CrIaServ3HkDrEnableCheck(FwSmDesc_t smDesc);
+
+/**
+ * Ready check of the Housekeeping Data Report telemetry packet.
+ * Execute the procedure of figure CrIaReadyChk3s25 (NOTE: is manually implemented)
+ * @param smDesc the state machine descriptor
+ * @return the ready check result
+ */
+CrFwBool_t CrIaServ3HkDrReadyCheck(FwSmDesc_t smDesc);
+
+/**
+ * Update action of the Housekeeping Data Report telemetry packet.
+ * Load the values of the data pool items associated to the RDL entry corresponding to the report's SID
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ3HkDrUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV3_HK_DR_H */
+
diff --git a/CrIa/src/Services/CrIaServ5EventReportingService/InCmd/CrIaServ5DisEvtRepGen.c b/CrIa/src/Services/CrIaServ5EventReportingService/InCmd/CrIaServ5DisEvtRepGen.c
new file mode 100644
index 0000000..3ca8c95
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ5EventReportingService/InCmd/CrIaServ5DisEvtRepGen.c
@@ -0,0 +1,149 @@
+/**
+ * @file CrIaServ5DisEvtRepGen.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Disable Event Report Generation in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ5DisEvtRepGen.h"
+
+#include "../../../IfswDebug.h"
+
+#include "CrIaIasw.h"
+#include "CrFwCmpData.h"
+#include "IfswUtilities.h"
+#include "Services/General/CrIaConstants.h"
+#include <CrIaInCmp.h>
+
+#include <Services/General/CrIaParamGetter.h>
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+#include <Services/CrIaServ5EventReportingService/OutRep/CrIaServ5Event.h> /* for EventIndex() */
+
+
+CrFwBool_t CrIaServ5DisEvtRepGenValidityCheck(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* cmpSpecificData;
+  CrFwPckt_t pckt;
+  unsigned short evtId;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+  pckt = cmpSpecificData->pckt;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* Event identifier must be legal */
+
+  /* Get event identifier */
+  CrIaServ5DisEvtRepGenParamGetEvtId(&evtId, pckt);
+  DEBUGP("CrIaServ5DisEvtRepGenValidityCheck: evtId = %d\n", evtId);
+
+  /* Check event identifier */
+  if (EventIndex (evtId) != 0)
+    {
+      SendTcAccRepSucc(pckt);
+
+      return 1;
+    }
+
+  SendTcAccRepFail(pckt, ACK_ILL_EID);
+
+  return 0;
+}
+
+void CrIaServ5DisEvtRepGenStartAction(FwSmDesc_t smDesc)
+{
+  unsigned char evtRepEnbldStatus;
+  unsigned short evtId;
+
+  CrFwInCmdData_t* inSpecificData;
+  CrFwCmpData_t* cmpData;
+  CrFwPckt_t pckt;
+
+
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Set the action outcome to 'success' iff the argument event identifier is enabled */
+
+  /* Get event identifier */
+  CrIaServ5DisEvtRepGenParamGetEvtId(&evtId, pckt);
+  DEBUGP("CrIaServ5DisEvtRepGenStartAction: evtId = %d\n", evtId);
+
+  /* Get status in data pool */
+  CrIaCopyArrayItem(EVTENABLEDLIST_ID, &evtRepEnbldStatus, EventIndex(evtId));
+
+  /* Check if the argument event identifier is disabled */
+  if (evtRepEnbldStatus != 0)
+    {
+      SendTcStartRepSucc(pckt);
+
+      cmpData->outcome = 1;
+
+      return;
+    }
+
+  SendTcStartRepFail(pckt, ACK_EID_DIS, 10, (unsigned short)evtId); /* 10, because the evtId is in position 10 */
+
+  return;
+}
+
+void CrIaServ5DisEvtRepGenProgressAction(FwSmDesc_t smDesc)
+{
+  unsigned char evtRepEnbldStatus;
+  unsigned short evtId;
+
+  CrFwInCmdData_t* inSpecificData;
+  CrFwCmpData_t* cmpData;
+  CrFwPckt_t pckt;
+
+
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Set the enable status of the argument event identifier to 'disabled';
+     set the action outcome to 'completed' */
+
+  /* Get event identifier */
+  CrIaServ5EnbEvtRepGenParamGetEvtId(&evtId, pckt);
+  DEBUGP("CrIaServ5EnbEvtRepGenProgressAction: evtId = %d\n", evtId);
+
+  /* Set status in data pool */
+  evtRepEnbldStatus = 0;
+  CrIaPasteArrayItem(EVTENABLEDLIST_ID, &evtRepEnbldStatus, EventIndex(evtId));
+
+  SendTcTermRepSucc(pckt);
+
+  cmpData->outcome = 1;
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ5EventReportingService/InCmd/CrIaServ5DisEvtRepGen.h b/CrIa/src/Services/CrIaServ5EventReportingService/InCmd/CrIaServ5DisEvtRepGen.h
new file mode 100644
index 0000000..03a489e
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ5EventReportingService/InCmd/CrIaServ5DisEvtRepGen.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ5DisEvtRepGen.h
+ *
+ * Declaration of the Disable Event Report Generation in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV5_DIS_EVT_REP_GEN_H
+#define CRIA_SERV5_DIS_EVT_REP_GEN_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Disable Event Report Generation in-coming command packet.
+ * Event identifier must be legal
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ5DisEvtRepGenValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Disable Event Report Generation in-coming command packet.
+ * Set the action outcome to 'success' iff the argument event identifier is enabled
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ5DisEvtRepGenStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Disable Event Report Generation in-coming command packet.
+ * Set the enable status of the argument event identifier to 'disabled'; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ5DisEvtRepGenProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV5_DIS_EVT_REP_GEN_H */
+
diff --git a/CrIa/src/Services/CrIaServ5EventReportingService/InCmd/CrIaServ5EnbEvtRepGen.c b/CrIa/src/Services/CrIaServ5EventReportingService/InCmd/CrIaServ5EnbEvtRepGen.c
new file mode 100644
index 0000000..bf425eb
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ5EventReportingService/InCmd/CrIaServ5EnbEvtRepGen.c
@@ -0,0 +1,149 @@
+/**
+ * @file CrIaServ5EnbEvtRepGen.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Enable Event Report Generation in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ5EnbEvtRepGen.h"
+
+#include "../../../IfswDebug.h"
+
+#include "CrIaIasw.h"
+#include "CrFwCmpData.h"
+#include "IfswUtilities.h"
+#include "Services/General/CrIaConstants.h"
+#include <CrIaInCmp.h>
+
+#include <Services/General/CrIaParamGetter.h>
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+#include <Services/CrIaServ5EventReportingService/OutRep/CrIaServ5Event.h> /* for EventIndex() */
+
+
+CrFwBool_t CrIaServ5EnbEvtRepGenValidityCheck(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t* cmpData;
+  CrFwInCmdData_t* cmpSpecificData;
+  CrFwPckt_t pckt;
+  unsigned short evtId;
+
+  /* Get in packet */
+  cmpData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t*)(cmpData->cmpSpecificData);
+  pckt = cmpSpecificData->pckt;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* Event identifier must be legal */
+
+  /* Get event identifier */
+  CrIaServ5EnbEvtRepGenParamGetEvtId(&evtId, pckt);
+  DEBUGP("CrIaServ5EnbEvtRepGenValidityCheck: evtId = %d\n", evtId);
+
+  /* Check event identifier */
+  if (EventIndex (evtId) != 0)
+    {
+      SendTcAccRepSucc(pckt);
+
+      return 1;
+    }
+
+  SendTcAccRepFail(pckt, ACK_ILL_EID);
+
+  return 0;
+}
+
+void CrIaServ5EnbEvtRepGenStartAction(FwSmDesc_t smDesc)
+{
+  unsigned char evtRepEnbldStatus;
+  unsigned short evtId;
+
+  CrFwInCmdData_t* inSpecificData;
+  CrFwPckt_t pckt;
+  CrFwCmpData_t* cmpData;
+
+
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Set the action outcome to 'success' iff the argument event identifier is disabled */
+
+  /* Get event identifier */
+  CrIaServ5EnbEvtRepGenParamGetEvtId(&evtId, pckt);
+  DEBUGP("CrIaServ5EnbEvtRepGenStartAction: evtId = %d\n", evtId);
+
+  /* Get status in data pool */
+  CrIaCopyArrayItem(EVTENABLEDLIST_ID, &evtRepEnbldStatus, EventIndex(evtId));
+
+  /* Check if the argument event identifier is disabled */
+  if (evtRepEnbldStatus == 0)
+    {
+      SendTcStartRepSucc(pckt);
+
+      cmpData->outcome = 1;
+
+      return;
+    }
+
+  SendTcStartRepFail(pckt, ACK_EID_ENB, 10, (unsigned short)evtId); /* 10, because the evtId is in position 10 */
+
+  return;
+}
+
+void CrIaServ5EnbEvtRepGenProgressAction(FwSmDesc_t smDesc)
+{
+  unsigned char evtRepEnbldStatus;
+  unsigned short evtId;
+
+  CrFwInCmdData_t* inSpecificData;
+  CrFwCmpData_t* cmpData;
+  CrFwPckt_t pckt;
+
+
+  cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  inSpecificData = (CrFwInCmdData_t*)cmpData->cmpSpecificData;
+  pckt = inSpecificData->pckt;
+
+  cmpData->outcome = 0;
+
+  /* Set the enable status of the argument event identifier to 'enabled';
+     set the action outcome to 'completed'. */
+
+  /* Get event identifier */
+  CrIaServ5EnbEvtRepGenParamGetEvtId(&evtId, pckt);
+  DEBUGP("CrIaServ5EnbEvtRepGenProgressAction: evtId = %d\n", evtId);
+
+  /* Set status in data pool */
+  CrIaCopy(EVTFILTERDEF_ID, &evtRepEnbldStatus);
+  CrIaPasteArrayItem(EVTENABLEDLIST_ID, &evtRepEnbldStatus, EventIndex(evtId));
+
+  SendTcTermRepSucc(pckt);
+
+  cmpData->outcome = 1;
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ5EventReportingService/InCmd/CrIaServ5EnbEvtRepGen.h b/CrIa/src/Services/CrIaServ5EventReportingService/InCmd/CrIaServ5EnbEvtRepGen.h
new file mode 100644
index 0000000..e17eb5a
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ5EventReportingService/InCmd/CrIaServ5EnbEvtRepGen.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ5EnbEvtRepGen.h
+ *
+ * Declaration of the Enable Event Report Generation in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV5_ENB_EVT_REP_GEN_H
+#define CRIA_SERV5_ENB_EVT_REP_GEN_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Enable Event Report Generation in-coming command packet.
+ * Event identifier must be legal
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ5EnbEvtRepGenValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Enable Event Report Generation in-coming command packet.
+ * Set the action outcome to 'success' iff the argument event identifier is disabled
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ5EnbEvtRepGenStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Enable Event Report Generation in-coming command packet.
+ * Set the enable status of the argument event identifier to 'enabled'; set the action outcome to 'completed'.
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ5EnbEvtRepGenProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV5_ENB_EVT_REP_GEN_H */
+
diff --git a/CrIa/src/Services/CrIaServ5EventReportingService/OutRep/CrIaServ5Event.c b/CrIa/src/Services/CrIaServ5EventReportingService/OutRep/CrIaServ5Event.c
new file mode 100644
index 0000000..92f7747
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ5EventReportingService/OutRep/CrIaServ5Event.c
@@ -0,0 +1,236 @@
+/**
+ * @file CrIaServ5Event.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the event telemetry packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ5Event.h"
+
+#include "CrIaIasw.h"
+#include "CrFwCmpData.h"
+#include "CrIaPckt.h"
+
+#include <Services/General/CrIaConstants.h>
+
+#include <FwProfile/FwSmConfig.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include "../../../IfswDebug.h"
+
+
+/* we use an unsigned char as datatype, so we need to saturate at 255 */
+#define MAX_EVENT_COUNT 0xff
+
+/* array to count the events raised. it should be reset using ResetEventCounts() periodically */
+unsigned char eventCounts[N_EVT_ID];
+
+
+/* get the array index where the event has its flag in evtRepEnbld */
+unsigned char EventIndex (unsigned short eventId)
+{
+  switch (eventId)
+    {
+      /* 
+	 NOTE: the following errors report that the outgoing communication is broken, 
+	 thus it makes no sense to put them in the ougoing queue. They will run into the
+	 default clause instead and do nothing here. They still make their way into 
+	 the error log.
+
+	 case ERR_OUTSTREAM_PQ_FULL: 102, return 2;
+	 case ERR_POCL_FULL: 105, return 4;
+	 case ERR_OUTCMP_NO_MORE_PCKT: 108, return 5;
+      */
+      
+    case CRIA_SERV5_EVT_INV_DEST: /* 101 */
+      return 1;      
+    case CRIA_SERV5_EVT_SEQ_CNT_ERR: /* 200 */
+      return 2;
+    case CRIA_SERV5_EVT_INREP_CR_FAIL: /* 201 */
+      return 3;
+    case CRIA_SERV5_EVT_PCRL2_FULL: /* 202 */
+      return 4;
+    case CRIA_SERV5_EVT_FD_FAILED: /* 203 */
+      return 5;
+    case CRIA_SERV5_EVT_RP_STARTED: /* 204 */
+      return 6;
+    case CRIA_SERV5_EVT_SEM_TR: /* 205 */
+      return 7;
+    case CRIA_SERV5_EVT_IASW_TR: /* 206 */
+      return 8;
+    case CRIA_SERV5_EVT_SDSC_ILL: /* 208 */
+      return 9;
+    case CRIA_SERV5_EVT_SDSC_OOS: /* 209 */
+      return 10;
+    case CRIA_SERV5_EVT_CLCT_SIZE: /* 210 */
+      return 11;
+    case CRIA_SERV5_EVT_SIB_SIZE: /* 211 */
+      return 12;
+    case CRIA_SERV5_EVT_FBF_LOAD_RISK: /* 212 */
+      return 13;
+    case CRIA_SERV5_EVT_FBF_SAVE_DENIED: /* 213 */
+      return 14;
+    case CRIA_SERV5_EVT_FBF_SAVE_ABRT: /* 214 */
+      return 15;
+    case CRIA_SERV5_EVT_SDB_CNF_FAIL: /* 215 */
+      return 16;
+    case CRIA_SERV5_EVT_CMPR_SIZE: /* 216 */
+      return 17;
+    case CRIA_SERV5_EVT_SEMOP_TR: /* 217 */
+      return 18;
+    case CRIA_SERV5_EVT_SC_PR_STRT: /* 218 */
+      return 19;
+    case CRIA_SERV5_EVT_SC_PR_END: /* 219 */
+      return 20;
+    case CRIA_SERV5_EVT_INSTRM_PQF: /* 220 */
+      return 21;
+    case CRIA_SERV5_EVT_OCMP_INVD: /* 221 */
+      return 22;
+    case CRIA_SERV5_EVT_OCMP_ILLGR: /* 222 */
+      return 23;
+    case CRIA_SERV5_EVT_IN_ILLGR: /* 223 */
+      return 24;
+    case CRIA_SERV5_EVT_INV_CENT: /* 230 */
+      return 25;
+    case CRIA_SERV5_EVT_INIT_SUCC: /* 301 */
+      return 27;
+    case CRIA_SERV5_EVT_INIT_FAIL: /* 302 */
+      return 28;
+    case CRIA_SERV5_EVT_THRD_OR: /* 303 */
+      return 29;
+    case CRIA_SERV5_EVT_NOTIF_ERR: /* 304 */
+      return 30;
+    case CRIA_SERV5_EVT_1553_ERR_L: /* 311 */
+      return 32;
+    case CRIA_SERV5_EVT_1553_ERR_M: /* 312 */
+      return 33;
+    case CRIA_SERV5_EVT_1553_ERR_H: /* 313 */
+      return 34;
+    case CRIA_SERV5_EVT_SPW_ERR_L: /* 315 */
+      return 35;
+    case CRIA_SERV5_EVT_SPW_ERR_M: /* 316 */
+      return 36;
+    case CRIA_SERV5_EVT_SPW_ERR_H: /* 317 */
+      return 37;
+    case CRIA_SERV5_EVT_FL_EL_ERR: /* 320 */
+      return 38;
+    case CRIA_SERV5_EVT_FL_FBF_ERR: /* 325 */
+      return 39;
+    case CRIA_SERV5_EVT_FL_FBF_BB: /* 326 */
+      return 40;
+    case CRIA_SERV5_EVT_SBIT_ERR: /* 330 */
+      return 41;
+    case CRIA_SERV5_EVT_DBIT_ERR: /* 335 */
+      return 42;
+    case CRIA_SERV5_EVT_SYNC_LOSS: /* 350 */
+      return 43;
+    case CRIA_SERV5_EVT_SDP_NOMEM: /* 1001 */
+      return 44;
+    case CRIA_SERV5_EVT_SEM_ILL_ST: /* 1400 */
+      return 45;
+    case CRIA_SERV5_EVT_PROCBUF_INSUF: /* 1501 */
+      return 46;
+    case CRIA_SERV5_EVT_XIB_FULL: /* 1503 */
+      return 47;
+    case CRIA_SERV5_EVT_IMG_INSUF: /* 1504 */
+      return 48;
+    case CRIA_SERV5_EVT_ACQ_FAIL: /* 1450 */
+      return 49;
+
+    /* NOTE: 59 is maximum... */
+
+    default:
+      DEBUGP("ERR: Event %d has no place in the evtRepEnbld list, using 0!\n", eventId);
+      break;
+    }
+
+  return 0; /* all unknown events have index 0 */
+}
+
+
+void ResetEventCounts (void)
+{
+  int i;
+
+  for (i=0; i<N_EVT_ID; i++)
+    eventCounts[i] = 0;
+
+  return;
+}
+
+
+/* increment event counter in the eventCounts array with saturation at 255 and report the number of counts */
+/* NOTE: in order to only query the event counts without incrementing use: eventCounts[EventIndex(EVENT)] */
+unsigned char CountEvent(unsigned short eventId)
+{
+  int idx;
+  idx = EventIndex (eventId);
+
+  if (eventCounts[idx] != MAX_EVENT_COUNT)
+    eventCounts[idx]++;
+
+  return eventCounts[idx];
+}
+
+
+CrFwBool_t CrIaServ5EventEnableCheck(FwSmDesc_t smDesc)
+{
+  /* Implement the check logic here: */
+  DEBUGP("CrIaServ5EventEnableCheck: Check if Event Report Generation is enabled or disabled.\n");
+
+  (void) smDesc;
+  
+  /* v09+ event filter "the good one" is implemented in CrIaEvtRep.
+     This also covers if an event is enabled or not.
+     No need to double check here! */
+
+  return 1;
+}
+
+
+CrFwBool_t CrIaServ5EventReadyCheck(FwSmDesc_t smDesc)
+{
+  CRFW_UNUSED(smDesc); /* remove if smDesc is used in this function */
+
+  /* Implement the check logic here: */
+  DEBUGP("CrIaServ5EventReadyCheck: isReady = TRUE\n");
+
+  return 1;
+}
+
+
+CrFwBool_t CrIaServ5EventRepeatCheck(FwSmDesc_t smDesc)
+{
+  CRFW_UNUSED(smDesc); /* remove if smDesc is used in this function */
+
+  /* Implement the check logic here: */
+  DEBUGP("CrIaServ5EventRepeatCheck: isRepeat = FALSE\n");
+
+  return 0;
+}
+
+void CrIaServ5EventUpdateAction(FwSmDesc_t smDesc)
+{
+  CRFW_UNUSED(smDesc); /* remove if smDesc is used in this function */
+
+  /* Implement the action logic here: */
+  DEBUGP("CrIaServ5EventUpdateAction: load the value of the report parameters; for (5,3) & (5,4) make an entry in the Error Log.\n");
+
+  /* NOTE: empty, because all functionality is carried out in CrIaIasw.c */
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ5EventReportingService/OutRep/CrIaServ5Event.h b/CrIa/src/Services/CrIaServ5EventReportingService/OutRep/CrIaServ5Event.h
new file mode 100644
index 0000000..493415b
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ5EventReportingService/OutRep/CrIaServ5Event.h
@@ -0,0 +1,51 @@
+/**
+ * @file CrIaServ5Event.h
+ *
+ * Declaration of the event telemetry packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV5_EVENT_H
+#define CRIA_SERV5_EVENT_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+
+unsigned char EventIndex (unsigned short eventId);
+
+void ResetEventCounts (void);
+
+unsigned char CountEvent(unsigned short eventId);
+
+/**
+ * Enable check of the event telemetry packet.
+ * @param smDesc the state machine descriptor
+ * @return the enable check result
+ */
+CrFwBool_t CrIaServ5EventEnableCheck(FwSmDesc_t smDesc);
+
+/**
+ * Ready check of the event telemetry packet.
+ * @param smDesc the state machine descriptor
+ * @return the ready check result
+ */
+CrFwBool_t CrIaServ5EventReadyCheck(FwSmDesc_t smDesc);
+
+/**
+ * Repeat check of the event telemetry packet.
+ * @param smDesc the state machine descriptor
+ * @return the repeat check result
+ */
+CrFwBool_t CrIaServ5EventRepeatCheck(FwSmDesc_t smDesc);
+
+/**
+ * Update action of the event telemetry packet.
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ5EventUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV5_EVENT_H */
+
diff --git a/CrIa/src/Services/CrIaServ6MemoryManagementService/InCmd/CrIaServ6DumpMem.c b/CrIa/src/Services/CrIaServ6MemoryManagementService/InCmd/CrIaServ6DumpMem.c
new file mode 100644
index 0000000..69cadcf
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ6MemoryManagementService/InCmd/CrIaServ6DumpMem.c
@@ -0,0 +1,185 @@
+/**
+ * @file CrIaServ6DumpMem.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Dump Memory using Absolute Addresses in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ6DumpMem.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <stddef.h>
+#include <Pckt/CrFwPckt.h>
+#include <OutFactory/CrFwOutFactory.h>
+#include <OutCmp/CrFwOutCmp.h>
+#include <OutLoader/CrFwOutLoader.h>
+
+#include <Services/General/CrIaParamGetter.h>
+#include <Services/General/CrIaParamSetter.h>
+
+#include <CrIaDataPoolId.h> /* for MAX_DUMP_SIZE */
+#include <CrIaDataPool.h> /* for MAX_DUMP_SIZE */
+
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+#include <CrIaPckt.h>
+
+#include <byteorder.h>
+#include <stdio.h>
+
+
+
+CrFwBool_t CrIaServ6DumpMemValidityCheck(FwPrDesc_t prDesc)
+{
+  unsigned short dpu_mem_id;
+
+  unsigned int mem_start_addr;
+  unsigned int mem_stop_addr;
+  unsigned int dump_len;
+  unsigned int addr_id;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData         = (CrFwCmpData_t   *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt            = cmpSpecificData->pckt;
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* Memory block identifier must be legal; start address and length of dump must be legal; length and address must be double-word aligned */
+
+  CrIaServ6DumpMemParamGetDpuMemoryId(&dpu_mem_id, pckt);
+  CrIaServ6DumpMemParamGetStartAddress(&mem_start_addr, pckt);
+  CrIaServ6DumpMemParamGetBlockLength(&dump_len, pckt);
+
+  mem_stop_addr = mem_start_addr + dump_len;
+
+  /* check 4B alignment of provided address and length */
+  /* NOTE: the spec wants 8B alignment, but actually this is not necessary. We can go for 4B (better) alignment */
+  if (mem_start_addr & 0x3)
+    {
+      SendTcAccRepFail(pckt, ACK_ILL_MEM_SRC);
+      return 0;
+    }
+  if (dump_len & 0x3)
+    {
+      SendTcAccRepFail(pckt, ACK_ILL_MEM_LEN);
+      return 0;
+    }
+  if (dump_len > MAX_DUMP_SIZE)
+    {
+      SendTcAccRepFail(pckt, ACK_ILL_MEM_LEN);
+      return 0;
+    }
+
+  /* check memory block identifier and whether it fits with the given addresses */
+  addr_id = verifyAddress (mem_start_addr);
+
+  /* check if the ram id fits with the given start address */
+  if (cvtAddrIdToRamId(addr_id) != dpu_mem_id)
+    {
+      SendTcAccRepFail(pckt, ACK_ILL_MEM_ID);
+      return 0;
+    }
+
+  /* check if the end address is within the same segment */
+  if (addr_id != verifyAddress (mem_stop_addr))
+    {
+      SendTcAccRepFail(pckt, ACK_ILL_MEM_LEN);
+      return 0;
+    }
+
+  SendTcAccRepSucc(pckt);
+  return 1;
+}
+
+
+void CrIaServ6DumpMemStartAction(FwSmDesc_t smDesc)
+{
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData	  = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		  = cmpSpecificData->pckt;
+
+  /* Set the action outcome to 'success' */
+
+  SendTcStartRepSucc(pckt);
+  cmpData->outcome = 1;
+  return;
+}
+
+
+void CrIaServ6DumpMemProgressAction(FwSmDesc_t smDesc)
+{
+  unsigned short dpu_mem_id;
+  unsigned int mem_start_addr;
+  unsigned int dump_len;
+
+  FwSmDesc_t       rep;
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+  CrFwDestSrc_t    source;
+
+  cmpData	  = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		  = cmpSpecificData->pckt;
+  source          = CrFwPcktGetSrc (pckt);
+
+  /* Generate a (6,6) report configured to collect the content of the memory area specified in this command; set the action outcome to 'completed' */
+
+  CrIaServ6DumpMemParamGetDpuMemoryId(&dpu_mem_id, pckt);
+  CrIaServ6DumpMemParamGetStartAddress(&mem_start_addr, pckt);
+  CrIaServ6DumpMemParamGetBlockLength(&dump_len, pckt);
+
+  /* the size is dump_len + 16 (header) + 10 (service header) + 2 (crc) */
+  rep = CrFwOutFactoryMakeOutCmp (CRIA_SERV6, CRIA_SERV6_MEM_DUMP, 0, dump_len + 28);
+  if (rep == NULL)
+    {
+      /* handled by Resource FdCheck */
+      cmpData->outcome = 0;
+      return;
+    }
+
+  CrFwOutCmpSetDest (rep, source);
+
+  CrIaServ6MemDumpParamSetDpuMemoryId (rep, dpu_mem_id);
+  CrIaServ6MemDumpParamSetStartAddress (rep, mem_start_addr);
+  CrIaServ6MemDumpParamSetBlockLength (rep, dump_len);
+
+  /* NOTE: the actual copy of the data into the packet done in the outrep update action  */
+
+  CrFwOutLoaderLoad (rep);
+
+  SendTcTermRepSucc(pckt);
+  cmpData->outcome = 1;
+
+  /* Mantis 2066 */
+  CrIaPaste(LASTDUMPADDR_ID, &mem_start_addr);
+
+  return;
+}
diff --git a/CrIa/src/Services/CrIaServ6MemoryManagementService/InCmd/CrIaServ6DumpMem.h b/CrIa/src/Services/CrIaServ6MemoryManagementService/InCmd/CrIaServ6DumpMem.h
new file mode 100644
index 0000000..a0c2b96
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ6MemoryManagementService/InCmd/CrIaServ6DumpMem.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ6DumpMem.h
+ *
+ * Declaration of the Dump Memory using Absolute Addresses in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV6_DUMP_MEM_H
+#define CRIA_SERV6_DUMP_MEM_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Dump Memory using Absolute Addresses in-coming command packet.
+ * Memory block identifier must be legal; start address and length of dump must be legal; length and address must be double-word aligned
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ6DumpMemValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Dump Memory using Absolute Addresses in-coming command packet.
+ * Set the action outcome to 'success'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ6DumpMemStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Dump Memory using Absolute Addresses in-coming command packet.
+ * Generate a (6,6) report configured to collect the content of the memory area specified in this command; set the action outcome to 'completed'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ6DumpMemProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV6_DUMP_MEM_H */
+
diff --git a/CrIa/src/Services/CrIaServ6MemoryManagementService/InCmd/CrIaServ6LoadMem.c b/CrIa/src/Services/CrIaServ6MemoryManagementService/InCmd/CrIaServ6LoadMem.c
new file mode 100644
index 0000000..f7fe0de
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ6MemoryManagementService/InCmd/CrIaServ6LoadMem.c
@@ -0,0 +1,219 @@
+/**
+ * @file CrIaServ6LoadMem.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Load Memory using Absolute Addresses in-coming command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ6LoadMem.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <Pckt/CrFwPckt.h>
+#include <OutFactory/CrFwOutFactory.h>
+#include <OutCmp/CrFwOutCmp.h>
+#include <OutLoader/CrFwOutLoader.h>
+
+#include <Services/General/CrIaParamGetter.h>
+
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+#include <CrIaPckt.h>
+
+#include <CrIaDataPoolId.h>
+#include <CrIaDataPool.h>
+
+#include <stdio.h>
+
+#if (__sparc__)
+#include <io.h>	/* ioread32be(), iowrite32be() */
+#endif
+
+#define MAX_PATCH_LEN	1002
+
+
+CrFwBool_t CrIaServ6LoadMemValidityCheck(FwPrDesc_t prDesc)
+{
+  unsigned short dpu_mem_id;
+
+  unsigned int mem_start_addr;
+  unsigned int mem_stop_addr;
+  unsigned int patch_len;
+  unsigned int pckt_size;
+  unsigned int copy_size;
+  unsigned int addr_id;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData		= (CrFwCmpData_t   *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		= cmpSpecificData->pckt;
+  pckt_size       = CrFwPcktGetLength(pckt);
+
+  /* Verify Checksum of incoming packet */
+  if (!CheckCrc(pckt))
+    {
+      SendTcAccRepFail(pckt, ACK_WRONG_CHKSM);
+      return 0;
+    }
+
+  /* Memory block identifier must be legal; start address of patch must be legal; length of patch must be consistent with set of patch values provided in patch command; length and address must be double-word aligned */
+
+  CrIaServ6LoadMemParamGetDpuMemoryId(&dpu_mem_id, pckt);
+  CrIaServ6LoadMemParamGetStartAddress(&mem_start_addr, pckt);
+  CrIaServ6LoadMemParamGetBlockLength(&patch_len, pckt);
+
+  mem_stop_addr = mem_start_addr + patch_len;
+
+  /* check 4B alignment of provided address and length */
+  if (mem_start_addr & 0x3)
+    {
+      SendTcAccRepFail(pckt, ACK_ILL_MEM_SRC);
+      return 0;
+    }
+  if (patch_len & 0x3)
+    {
+      SendTcAccRepFail(pckt, ACK_ILL_MEM_LEN);
+      return 0;
+    }
+
+  /* check memory block identifier and whether it fits with the given addresses */
+  addr_id = verifyAddress (mem_start_addr);
+
+  /* check if the ram id fits with the given start address */
+  if (cvtAddrIdToRamId(addr_id) != dpu_mem_id)
+    {
+      SendTcAccRepFail(pckt, ACK_ILL_MEM_ID);
+      return 0;
+    }
+
+  /* check if the end address is within the same segment */
+  if (addr_id != verifyAddress (mem_stop_addr))
+    {
+      SendTcAccRepFail(pckt, ACK_ILL_MEM_LEN);
+      return 0;
+    }
+
+  /* check if the given length fits with the size of the packet */
+  copy_size = pckt_size - OFFSET_PAR_LENGTH_IN_CMD_PCKT - 10 - 2;
+  if (patch_len != copy_size)
+    {
+      SendTcAccRepFail(pckt, ACK_ILL_MEM_LEN);
+      return 0;
+    }
+
+  SendTcAccRepSucc(pckt);
+  return 1;
+}
+
+
+void CrIaServ6LoadMemStartAction(FwSmDesc_t smDesc)
+{
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData	  = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		  = cmpSpecificData->pckt;
+
+  /* Set the action outcome to 'success' */
+
+  SendTcStartRepSucc(pckt);
+  cmpData->outcome = 1;
+  return;
+}
+
+
+/**
+ * @brief Progress action of the Service 3 Housekeeping Data Report
+ *
+ * @note The implementation is not realized using the described framework procedure in the specification document CHEOPS-PNP-INST-RS-001.
+ *
+ * Following steps are executed:
+ * - Copy the data
+ * - Read back and compare data
+ *
+ * @param[in]  smDesc state machine descriptor
+ * @param[out] none
+ */
+void CrIaServ6LoadMemProgressAction(FwSmDesc_t smDesc)
+{
+  unsigned int i;
+  unsigned int len;
+
+  unsigned int mem_start_addr;
+  unsigned int patch_len;
+
+  unsigned char patch[MAX_PATCH_LEN]; /* NOTE: we should get this away from the stack */
+  unsigned int *buf, *mem;
+
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData		= (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		= cmpSpecificData->pckt;
+
+#ifdef PC_TARGET
+  /* on PC we just go back */
+  (void) i;
+  (void) len;
+  (void) mem_start_addr;
+  (void) patch_len;
+  (void) patch;
+  (void) buf;
+  (void) mem;
+  (void) pckt;
+  SendTcTermRepSucc(pckt);
+  cmpData->outcome = 1;
+  return;
+#else
+  CrIaServ6LoadMemParamGetStartAddress(&mem_start_addr, pckt);
+  CrIaServ6LoadMemParamGetBlockLength(&patch_len, pckt);
+  CrIaServ6LoadMemParamGetBlockData(patch, patch_len, pckt);
+
+  /* copy the data */
+  len = patch_len >> 2;
+  buf = (unsigned int *)patch;
+  mem = (unsigned int *) mem_start_addr;
+
+  for (i=0; i<len; i++)
+    iowrite32be(buf[i], &mem[i]);
+
+  /* Mantis 2066 */
+  CrIaPaste(LASTPATCHEDADDR_ID, &mem_start_addr);
+  
+  /* read back and compare */
+  for (i = 0; i < len; i++)
+    {
+      if (ioread32be(&mem[i]) != buf[i])
+        {
+          SendTcTermRepFail(pckt, ACK_MEM_FAIL, 0, (unsigned short)i); /* NOTE: the last parameter contains the failing index */
+          cmpData->outcome = 0;
+          return;
+        }
+    }
+
+  SendTcTermRepSucc(pckt);
+  cmpData->outcome = 1;
+  return;
+#endif
+}
+
diff --git a/CrIa/src/Services/CrIaServ6MemoryManagementService/InCmd/CrIaServ6LoadMem.h b/CrIa/src/Services/CrIaServ6MemoryManagementService/InCmd/CrIaServ6LoadMem.h
new file mode 100644
index 0000000..88dc14b
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ6MemoryManagementService/InCmd/CrIaServ6LoadMem.h
@@ -0,0 +1,39 @@
+/**
+ * @file CrIaServ6LoadMem.h
+ *
+ * Declaration of the Load Memory using Absolute Addresses in-coming command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV6_LOAD_MEM_H
+#define CRIA_SERV6_LOAD_MEM_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Validity check of the Load Memory using Absolute Addresses in-coming command packet.
+ * Memory block identifier must be legal; start address of patch must be legal; length of patch must be consistent with set of patch values provided in patch command; length and address must be double-word aligned
+ * @param prDesc the procedure descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrIaServ6LoadMemValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Start action of the Load Memory using Absolute Addresses in-coming command packet.
+ * Set the action outcome to 'success'
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ6LoadMemStartAction(FwSmDesc_t smDesc);
+
+/**
+ * Progress action of the Load Memory using Absolute Addresses in-coming command packet.
+ * Execute the behaviour shown in figure ProgressAction6s2
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ6LoadMemProgressAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV6_LOAD_MEM_H */
+
diff --git a/CrIa/src/Services/CrIaServ6MemoryManagementService/OutRep/CrIaServ6MemDump.c b/CrIa/src/Services/CrIaServ6MemoryManagementService/OutRep/CrIaServ6MemDump.c
new file mode 100644
index 0000000..3fe23d3
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ6MemoryManagementService/OutRep/CrIaServ6MemDump.c
@@ -0,0 +1,91 @@
+/**
+ * @file CrIaServ6MemDump.c
+ * @ingroup CrIaServices
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the Memory Dump using Absolute Addresses Report out-going report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaServ6MemDump.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+
+#include <Pckt/CrFwPckt.h>
+#include <OutFactory/CrFwOutFactory.h>
+#include <OutCmp/CrFwOutCmp.h>
+#include <OutLoader/CrFwOutLoader.h>
+
+#include <Services/General/CrIaParamGetter.h>
+#include <Services/General/CrIaParamSetter.h>
+
+#include <CrIaDataPool.h> /* for MAX_DUMP_SIZE */
+
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+#include <CrIaPckt.h>
+
+
+#include <stdio.h>
+#if (__sparc__)
+#include <io.h>
+#endif
+
+
+void CrIaServ6MemDumpUpdateAction(FwSmDesc_t smDesc)
+{
+  unsigned int i;
+  unsigned int len;
+
+  unsigned int mem_start_addr;
+  unsigned int dump_len;
+
+  unsigned char dump[MAX_DUMP_SIZE]; /* NOTE: we should get this away from the stack */
+  unsigned int *buf, *mem;
+
+  CrFwPckt_t	   pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInCmdData_t *cmpSpecificData;
+
+  cmpData	  = (CrFwCmpData_t   *) FwSmGetData(smDesc);
+  cmpSpecificData = (CrFwInCmdData_t *) cmpData->cmpSpecificData;
+  pckt		  = cmpSpecificData->pckt;
+
+  /* Use IBSW operation to collect the content of the area to be dumped and load it in the report */
+
+  CrIaServ6DumpRepMemParamGetStartAddress (&mem_start_addr, pckt);
+  CrIaServ6DumpRepMemParamGetBlockLength (&dump_len, pckt);
+
+  /* make a local copy of the data */
+  buf = (unsigned int *) dump;
+  mem = (unsigned int *) mem_start_addr;
+
+  len = dump_len >> 2;
+
+#if (__sparc__)
+  for (i = 0; i < len; i++)
+    buf[i] = ioread32be(&mem[i]);
+#else
+  /* on PC we only put a ramp in the packet */
+  (void) mem;
+  for (i = 0; i < len; i++)
+    buf[i] = i;
+#endif
+
+  /* make the actual copy to the packet */
+  CrIaServ6MemDumpParamSetBlockData (smDesc, dump, (unsigned short) dump_len);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrIaServ6MemoryManagementService/OutRep/CrIaServ6MemDump.h b/CrIa/src/Services/CrIaServ6MemoryManagementService/OutRep/CrIaServ6MemDump.h
new file mode 100644
index 0000000..b316edd
--- /dev/null
+++ b/CrIa/src/Services/CrIaServ6MemoryManagementService/OutRep/CrIaServ6MemDump.h
@@ -0,0 +1,24 @@
+/**
+ * @file CrIaServ6MemDump.h
+ *
+ * Declaration of the Memory Dump using Absolute Addresses Report out-going report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_SERV6_MEM_DUMP_H
+#define CRIA_SERV6_MEM_DUMP_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Update action of the Memory Dump using Absolute Addresses Report telemetry packet.
+ * Use IBSW operation to collect the content of the area to be dumped and load it in the report
+ * @param smDesc the state machine descriptor
+ */
+void CrIaServ6MemDumpUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRIA_SERV6_MEM_DUMP_H */
+
diff --git a/CrIa/src/Services/CrSemServ1CommandVerificationService/InRep/CrSemServ1ComVerif.c b/CrIa/src/Services/CrSemServ1CommandVerificationService/InRep/CrSemServ1ComVerif.c
new file mode 100644
index 0000000..1f94576
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ1CommandVerificationService/InRep/CrSemServ1ComVerif.c
@@ -0,0 +1,137 @@
+/**
+ * @file CrSemServ1ComVerif.c
+ * @ingroup CrIaServicesSem
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the SEM DAT Command Verification in-coming report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrSemServ1ComVerif.h"
+
+#include "../../../IfswDebug.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+#include <Services/General/CrIaParamSetter.h>
+#include <Services/General/CrIaParamGetter.h>
+
+#include <CrIaIasw.h>
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+#include <CrIaPckt.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+/* send function in the 1,1 and 1,3 forward */
+#include <OutStream/CrFwOutStream.h>
+
+ 
+/**
+ * @brief Update action of the Service 1 SEM DAT Command Verification in-coming report
+ *
+ * Following steps are executed:
+ * if forwarding of SEM command verification is enabled:
+ * - Forward command verification to Ground
+ *
+ * @param[in]  prDesc procedure descriptor
+ * @param[out] none
+ */
+void CrSemServ1ComVerifUpdateAction(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t* inData;
+  CrFwInRepData_t* inSpecificData;
+  CrFwPckt_t inPckt;
+  unsigned char subType, semS11flag, semS12flag, semS17flag, semS18flag;
+
+  CRFW_UNUSED(prDesc); /* remove if smDesc is used in this function */
+
+  /* The Update Action of incoming service 1 reports shall run the SEM Command Verification Update Procedure. */
+
+  /* Get in packet */
+  inData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+  inSpecificData = (CrFwInRepData_t*)(inData->cmpSpecificData);
+  inPckt = inSpecificData->pckt;
+
+  /* Get InRep SubType */
+  subType = CrFwPcktGetServSubType(inPckt);
+  DEBUGP("Sub Type: %d\n", subType);
+
+  if (subType == 1)
+    {
+      /* Check, if SEM_SERV1_1_FORWARD is enabled */
+      CrIaCopy(SEM_SERV1_1_FORWARD_ID, &semS11flag);
+      DEBUGP("semS11flag: %d\n", semS11flag);
+      if (semS11flag == 1)
+        {
+          /* SendSemForwardTmService1(inPckt, subType); */
+          CrFwOutStreamSend (outStreamGrd, inPckt);
+        }
+      else
+        {
+          DEBUGP("No packet sent!\n");
+        }
+    }
+
+  if (subType == 2)
+    {
+      /* Check, if SEM_SERV1_2_FORWARD is enabled */
+      CrIaCopy(SEM_SERV1_2_FORWARD_ID, &semS12flag);
+      DEBUGP("semS12flag: %d\n", semS12flag);
+      if (semS12flag == 1)
+        {
+          /* SendSemForwardTmService1(inPckt, subType); */
+          CrFwOutStreamSend (outStreamGrd, inPckt);
+        }
+      else
+        {
+          DEBUGP("No packet sent!\n");
+        }
+    }
+
+  if (subType == 7)
+    {
+      /* Check, if SEM_SERV1_7_FORWARD is enabled */
+      CrIaCopy(SEM_SERV1_7_FORWARD_ID, &semS17flag);
+      DEBUGP("semS17flag: %d\n", semS17flag);
+      if (semS17flag == 1)
+        {
+          /* SendSemForwardTmService1(inPckt, subType); */
+          CrFwOutStreamSend (outStreamGrd, inPckt);
+        }
+      else
+        {
+          DEBUGP("No packet sent!\n");
+        }
+    }
+
+  if (subType == 8)
+    {
+      /* Check, if SEM_SERV1_8_FORWARD is enabled */
+      CrIaCopy(SEM_SERV1_8_FORWARD_ID, &semS18flag);
+      DEBUGP("semS18flag: %d\n", semS18flag);
+      if (semS18flag == 1)
+        {
+          /* SendSemForwardTmService1(inPckt, subType); */
+          CrFwOutStreamSend (outStreamGrd, inPckt);
+        }
+      else
+        {
+          DEBUGP("No packet sent!\n");
+        }
+    }
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrSemServ1CommandVerificationService/InRep/CrSemServ1ComVerif.h b/CrIa/src/Services/CrSemServ1CommandVerificationService/InRep/CrSemServ1ComVerif.h
new file mode 100644
index 0000000..9dfd48d
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ1CommandVerificationService/InRep/CrSemServ1ComVerif.h
@@ -0,0 +1,32 @@
+/**
+ * @file CrSemServ1ComVerif.h
+ *
+ * Declaration of the Command Verification in-coming report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRSEM_SERV1_COM_VERIF_H
+#define CRSEM_SERV3_COM_VERIF_H
+
+#include "FwProfile/FwSmCore.h"
+#include "CrFwConstants.h"
+
+/**
+ * Validity check of the DAT HK in-coming report packet.
+ * Compute the CRC for the report and returns true if the CRC is correct and false otherwise.
+ * @param smDesc the state machine descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrSemServ1ComVerifValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Update action of the DAT HK in-coming report packet.
+ * The Update Action of incoming service 3 reports shall run the SEM HK Update Procedure.
+ * @param smDesc the state machine descriptor
+ */
+void CrSemServ1ComVerifUpdateAction(FwPrDesc_t prDesc);
+
+#endif /* CRSEM_SERV1_COM_VERIF_H */
+
diff --git a/CrIa/src/Services/CrSemServ21ScienceDataService/InRep/CrSemServ21DatCcdWindow.c b/CrIa/src/Services/CrSemServ21ScienceDataService/InRep/CrSemServ21DatCcdWindow.c
new file mode 100644
index 0000000..cbd2bf1
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ21ScienceDataService/InRep/CrSemServ21DatCcdWindow.c
@@ -0,0 +1,62 @@
+/**
+ * @file CrSemServ21DatCcdWindow.c
+ * @ingroup CrIaServicesSem
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the SEM DAT CCD Window in-coming report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrSemServ21DatCcdWindow.h"
+
+#include <CrIaInCmp.h>
+
+#include <IfswDebug.h>
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+#include <CrFwCmpData.h>
+
+#include <FwProfile/FwPrCore.h> /* for FwPrStart */
+
+#include <CrIaIasw.h> /* for prDescSciData */
+
+
+void CrSemServ21DatCcdWindowUpdateAction(FwPrDesc_t prDesc)
+{
+  CrFwPckt_t       pckt;
+  CrFwCmpData_t   *cmpData;
+  CrFwInRepData_t *cmpSpecificData;
+
+  /* The Update Action of the science data reports (21,3) shall run the Science Data Update Procedure. */
+
+  cmpData = (CrFwCmpData_t *) FwPrGetData(prDesc);
+  cmpSpecificData = (CrFwInRepData_t *) cmpData->cmpSpecificData;
+  pckt = cmpSpecificData->pckt;
+
+  /* pass the pointer to the packet on to the science data update procedure */
+  /*   FwPrSetData(prDescSciDataUpd, pckt);  */
+  S21SemPacket = pckt;
+
+  /* NOTE: could use Run instead of Start + Execute */
+  FwPrStart(prDescSciDataUpd);
+
+  FwPrExecute(prDescSciDataUpd);
+
+  /* the Science Data Update procedure according to RS-001 Fig. 9.3. */
+  /* It is implemented in CrIaSciDataUpdFunc */
+
+  cmpData->outcome = 1;
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrSemServ21ScienceDataService/InRep/CrSemServ21DatCcdWindow.h b/CrIa/src/Services/CrSemServ21ScienceDataService/InRep/CrSemServ21DatCcdWindow.h
new file mode 100644
index 0000000..6583ab9
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ21ScienceDataService/InRep/CrSemServ21DatCcdWindow.h
@@ -0,0 +1,34 @@
+/**
+ * @file CrSemServ21DatCcdWindow.h
+ *
+ * Declaration of the DAT CCD Window in-coming report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRSEM_SERV21_DAT_CCD_WINDOW_H
+#define CRSEM_SERV21_DAT_CCD_WINDOW_H
+
+#include "FwProfile/FwSmCore.h"
+#include "CrFwConstants.h"
+
+
+/**
+ * Validity check of the DAT CCD Window in-coming report packet.
+ * Compute the CRC for the report and returns true if the CRC is correct and false otherwise.
+ * @param smDesc the state machine descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrSemServ21DatCcdWindowValidityCheck(FwPrDesc_t prDesc);
+
+
+/**
+ * Update action of the DAT CCD Window in-coming report packet.
+ * The Update Action of the science data reports (21,3) shall run the Science Data Update Procedure.
+ * @param prDesc the procedure descriptor
+ */
+void CrSemServ21DatCcdWindowUpdateAction(FwPrDesc_t prDesc);
+
+#endif /* CRSEM_SERV21_DAT_CCD_WINDOW_H */
+
diff --git a/CrIa/src/Services/CrSemServ21ScienceDataService/OutCmd/CrSemServ21CmdCcdDataDisable.c b/CrIa/src/Services/CrSemServ21ScienceDataService/OutCmd/CrSemServ21CmdCcdDataDisable.c
new file mode 100644
index 0000000..31e8e8c
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ21ScienceDataService/OutCmd/CrSemServ21CmdCcdDataDisable.c
@@ -0,0 +1,25 @@
+/**
+ * @file CrSemServ21CmdCcdDataDisable.c
+ *
+ * Implementation of the CMD CCD Data Disable out-going command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#include "CrSemServ21CmdCcdDataDisable.h"
+
+#include "IfswDebug.h"
+
+
+void CrSemServ21CmdCcdDataDisableUpdateAction(FwSmDesc_t smDesc)
+{
+  CRFW_UNUSED(smDesc); /* remove if smDesc is used in this function */
+  /* Implement the action logic here: */
+  /* Collect target mode from data pool */
+
+  DEBUGP("CrSemServ21CmdCcdDataDisableUpdateAction() called.\n");
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrSemServ21ScienceDataService/OutCmd/CrSemServ21CmdCcdDataDisable.h b/CrIa/src/Services/CrSemServ21ScienceDataService/OutCmd/CrSemServ21CmdCcdDataDisable.h
new file mode 100644
index 0000000..9eefbc3
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ21ScienceDataService/OutCmd/CrSemServ21CmdCcdDataDisable.h
@@ -0,0 +1,24 @@
+/**
+ * @file CrSemServ21CmdCcdDataDisable.h
+ *
+ * Declaration of the CMD CCD Data Disable out-going command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRSEM_SERV21_CMD_CCD_DATA_DISABLE_H
+#define CRSEM_SERV21_CMD_CCD_DATA_DISABLE_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Update action of the CMD CCD Data Disable telemetry packet.
+ * Collect target mode from data pool
+ * @param smDesc the state machine descriptor
+ */
+void CrSemServ21CmdCcdDataDisableUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRSEM_SERV21_CMD_CCD_DATA_DISABLE_H */
+
diff --git a/CrIa/src/Services/CrSemServ21ScienceDataService/OutCmd/CrSemServ21CmdCcdDataEnable.c b/CrIa/src/Services/CrSemServ21ScienceDataService/OutCmd/CrSemServ21CmdCcdDataEnable.c
new file mode 100644
index 0000000..74e00b3
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ21ScienceDataService/OutCmd/CrSemServ21CmdCcdDataEnable.c
@@ -0,0 +1,20 @@
+/**
+ * @file CrSemServ21CmdCcdDataEnable.c
+ *
+ * Implementation of the CMD CCD Data Enable out-going command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#include "CrSemServ21CmdCcdDataEnable.h"
+
+
+void CrSemServ21CmdCcdDataEnableUpdateAction(FwSmDesc_t smDesc)
+{
+  CRFW_UNUSED(smDesc); /* remove if smDesc is used in this function */
+  /* Implement the action logic here: */
+  /* Collect target mode from data pool */
+  return;
+}
+
diff --git a/CrIa/src/Services/CrSemServ21ScienceDataService/OutCmd/CrSemServ21CmdCcdDataEnable.h b/CrIa/src/Services/CrSemServ21ScienceDataService/OutCmd/CrSemServ21CmdCcdDataEnable.h
new file mode 100644
index 0000000..0f17cdd
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ21ScienceDataService/OutCmd/CrSemServ21CmdCcdDataEnable.h
@@ -0,0 +1,24 @@
+/**
+ * @file CrSemServ21CmdCcdDataEnable.h
+ *
+ * Declaration of the CMD CCD Data Enable out-going command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRSEM_SERV21_CMD_CCD_DATA_ENABLE_H
+#define CRSEM_SERV21_CMD_CCD_DATA_ENABLE_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Update action of the CMD CCD Data Enable telemetry packet.
+ * Collect target mode from data pool
+ * @param smDesc the state machine descriptor
+ */
+void CrSemServ21CmdCcdDataEnableUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRSEM_SERV21_CMD_CCD_DATA_ENABLE_H */
+
diff --git a/CrIa/src/Services/CrSemServ220PrivateService220/InRep/CrSemServ220DatFunctParam.c b/CrIa/src/Services/CrSemServ220PrivateService220/InRep/CrSemServ220DatFunctParam.c
new file mode 100644
index 0000000..b387d49
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ220PrivateService220/InRep/CrSemServ220DatFunctParam.c
@@ -0,0 +1,63 @@
+/**
+ * @file CrSemServ220DatFunctParam.c
+ * @ingroup CrIaServicesSem
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the SEM DAT Functional Parameter in-coming report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrSemServ220DatFunctParam.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+#include <CrFwCmpData.h>
+
+/* send function in the 220,12 forward */
+#include <OutStream/CrFwOutStream.h>
+
+#include <CrIaIasw.h>
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <IfswDebug.h>
+
+
+void CrSemServ220DatFunctParamUpdateAction(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t* inData;
+  CrFwInRepData_t* inSpecificData;
+  CrFwPckt_t inPckt;
+  unsigned char semS22012flag;
+
+  /* Get in packet */
+  inData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+  inSpecificData = (CrFwInRepData_t*)(inData->cmpSpecificData);
+  inPckt = inSpecificData->pckt;
+
+  /* Check, if SEM_SERV220_12_FORWARD is enabled */
+  CrIaCopy(SEM_SERV220_12_FORWARD_ID, &semS22012flag);
+  DEBUGP("semS22012flag: %d\n", semS22012flag);
+  if (semS22012flag == 1)
+    {
+      CrFwOutStreamSend (outStreamGrd, inPckt);
+    }
+  else
+    {
+      DEBUGP("No packet sent!\n");
+    }
+
+  inData->outcome = 1;
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrSemServ220PrivateService220/InRep/CrSemServ220DatFunctParam.h b/CrIa/src/Services/CrSemServ220PrivateService220/InRep/CrSemServ220DatFunctParam.h
new file mode 100644
index 0000000..7f9697b
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ220PrivateService220/InRep/CrSemServ220DatFunctParam.h
@@ -0,0 +1,24 @@
+/**
+ * @file CrSemServ220DatFunctParam.h
+ *
+ * Declaration of the DAT Functional Parameter in-coming report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRSEM_SERV220_DAT_FUNCT_PARAM_H
+#define CRSEM_SERV220_DAT_FUNCT_PARAM_H
+
+#include "FwProfile/FwSmCore.h"
+#include "CrFwConstants.h"
+
+
+/**
+ * Update action of the DAT Functional Parameter in-coming report packet.
+ * @param prDesc the procedure descriptor
+ */
+void CrSemServ220DatFunctParamUpdateAction(FwPrDesc_t prDesc);
+
+#endif /* CRSEM_SERV220_DAT_FUNCT_PARAM_H */
+
diff --git a/CrIa/src/Services/CrSemServ220PrivateService220/InRep/CrSemServ220DatOperParam.c b/CrIa/src/Services/CrSemServ220PrivateService220/InRep/CrSemServ220DatOperParam.c
new file mode 100644
index 0000000..d6d7fc2
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ220PrivateService220/InRep/CrSemServ220DatOperParam.c
@@ -0,0 +1,63 @@
+/**
+ * @file CrSemServ220DatOperParam.c
+ * @ingroup CrIaServicesSem
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the SEM DAT Operation Parameter in-coming report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrSemServ220DatOperParam.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+#include <CrFwCmpData.h>
+
+/* send function in the 220,6 forward */
+#include <OutStream/CrFwOutStream.h>
+
+#include <CrIaIasw.h>
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <IfswDebug.h>
+
+
+void CrSemServ220DatOperParamUpdateAction(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t* inData;
+  CrFwInRepData_t* inSpecificData;
+  CrFwPckt_t inPckt;
+  unsigned char semS2206flag;
+
+  /* Get in packet */
+  inData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+  inSpecificData = (CrFwInRepData_t*)(inData->cmpSpecificData);
+  inPckt = inSpecificData->pckt;
+
+  /* Check, if SEM_SERV220_6_FORWARD is enabled */
+  CrIaCopy(SEM_SERV220_6_FORWARD_ID, &semS2206flag);
+  DEBUGP("semS2206flag: %d\n", semS2206flag);
+  if (semS2206flag == 1)
+    {
+      CrFwOutStreamSend (outStreamGrd, inPckt);
+    }
+  else
+    {
+      DEBUGP("No packet sent!\n");
+    }
+
+  inData->outcome = 1;
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrSemServ220PrivateService220/InRep/CrSemServ220DatOperParam.h b/CrIa/src/Services/CrSemServ220PrivateService220/InRep/CrSemServ220DatOperParam.h
new file mode 100644
index 0000000..a3a9dde
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ220PrivateService220/InRep/CrSemServ220DatOperParam.h
@@ -0,0 +1,24 @@
+/**
+ * @file CrSemServ220DatOperParam.h
+ *
+ * Declaration of the DAT Operation Parameter in-coming report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRSEM_SERV220_DAT_OPER_PARAM_H
+#define CRSEM_SERV220_DAT_OPER_PARAM_H
+
+#include "FwProfile/FwSmCore.h"
+#include "CrFwConstants.h"
+
+
+/**
+ * Update action of the DAT Operation Parameter in-coming report packet.
+ * @param prDesc the procedure descriptor
+ */
+void CrSemServ220DatOperParamUpdateAction(FwPrDesc_t prDesc);
+
+#endif /* CRSEM_SERV220_DAT_OPER_PARAM_H */
+
diff --git a/CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdFunctParam.c b/CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdFunctParam.c
new file mode 100644
index 0000000..362d9db
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdFunctParam.c
@@ -0,0 +1,79 @@
+/**
+ * @file CrSemServ220CmdFunctParam.c
+ * @ingroup CrIaServicesSem
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the SEM CMD Functional Parameter out-going command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrSemServ220CmdFunctParam.h"
+#include "../../General/CrSemParamSetter.h"
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include "../../../IfswDebug.h"
+
+
+void CrSemServ220CmdFunctParamUpdateAction(FwSmDesc_t smDesc)
+{
+  unsigned short parCcdWindowStarPosX, parCcdWindowStarPosY;
+  unsigned short parCcdWindowStarPosX2, parCcdWindowStarPosY2;
+  unsigned short parDataAcqSrc;
+  unsigned int parVoltFeeVod, parVoltFeeVrd, parVoltFeeVss; /* NOTE: These are actually float, but we can treat them as uint because we don't look at them. */
+  unsigned int parHeatTempFpaCcd, parHeatTempFeeStrap, parHeatTempFeeAnach, parHeatTempSpare; /* NOTE: These are actually float, but we can treat them as uint because we don't look at them. */
+
+  /* Collect configuration parameters from the data pool */
+  CrIaCopy(PWINPOSX_ID, &parCcdWindowStarPosX);
+  CrIaCopy(PWINPOSY_ID, &parCcdWindowStarPosY);
+  CrIaCopy(PWINSIZEX_ID, &parCcdWindowStarPosX2);
+  CrIaCopy(PWINSIZEY_ID, &parCcdWindowStarPosY2);
+  CrIaCopy(PDTACQSRC_ID, &parDataAcqSrc);
+  CrIaCopy(PVOLTFEEVOD_ID, &parVoltFeeVod);
+  CrIaCopy(PVOLTFEEVRD_ID, &parVoltFeeVrd);
+  CrIaCopy(PVOLTFEEVSS_ID, &parVoltFeeVss);
+  CrIaCopy(PHEATTEMPFPACCD_ID, &parHeatTempFpaCcd);
+  CrIaCopy(PHEATTEMPFEESTRAP_ID, &parHeatTempFeeStrap);
+  CrIaCopy(PHEATTEMPFEEANACH_ID, &parHeatTempFeeAnach);
+  CrIaCopy(PHEATTEMPSPARE_ID, &parHeatTempSpare);
+
+  PRDEBUGP("parCcdWindowStarPosX %d\n", parCcdWindowStarPosX);
+  PRDEBUGP("parCcdWindowStarPosY %d\n", parCcdWindowStarPosY);
+  PRDEBUGP("parCcdWindowStarPosX2 %d\n", parCcdWindowStarPosX2);
+  PRDEBUGP("parCcdWindowStarPosY2 %d\n", parCcdWindowStarPosY2);
+  PRDEBUGP("parDataAcqSrc %d\n", parDataAcqSrc);
+  PRDEBUGP("parVoltFeeVod %08x\n", parVoltFeeVod);
+  PRDEBUGP("parVoltFeeVrd %08x\n", parVoltFeeVrd);
+  PRDEBUGP("parVoltFeeVss %08x\n", parVoltFeeVss);
+  PRDEBUGP("parHeatTempFpaCcd %08x\n", parHeatTempFpaCcd);
+  PRDEBUGP("parHeatTempFeeStrap %08x\n", parHeatTempFeeStrap);
+  PRDEBUGP("parHeatTempFeeAnach %08x\n", parHeatTempFeeAnach);
+  PRDEBUGP("parHeatTempSpare %08x\n", parHeatTempSpare);
+
+  /* Set parameters in command */
+  CrSemServ220CmdFunctParamParamSetParCcdWindowStarPosX(smDesc, parCcdWindowStarPosX);
+  CrSemServ220CmdFunctParamParamSetParCcdWindowStarPosY(smDesc, parCcdWindowStarPosY);
+  CrSemServ220CmdFunctParamParamSetParCcdWindowStarPosX2(smDesc, parCcdWindowStarPosX2);
+  CrSemServ220CmdFunctParamParamSetParCcdWindowStarPosY2(smDesc, parCcdWindowStarPosY2);
+  CrSemServ220CmdFunctParamParamSetParDataAcqSrc(smDesc, parDataAcqSrc);
+  CrSemServ220CmdFunctParamParamSetParVoltFeeVod(smDesc, parVoltFeeVod); /* setter sets uint */
+  CrSemServ220CmdFunctParamParamSetParVoltFeeVrd(smDesc, parVoltFeeVrd); /* setter sets uint */
+  CrSemServ220CmdFunctParamParamSetParVoltFeeVss(smDesc, parVoltFeeVss); /* setter sets uint */
+  CrSemServ220CmdFunctParamParamSetParHeatTempFpaCcd(smDesc, parHeatTempFpaCcd); /* setter sets uint */
+  CrSemServ220CmdFunctParamParamSetParHeatTempFeeStrap(smDesc, parHeatTempFeeStrap); /* setter sets uint */
+  CrSemServ220CmdFunctParamParamSetParHeatTempFeeAnach(smDesc, parHeatTempFeeAnach); /* setter sets uint */
+  CrSemServ220CmdFunctParamParamSetParHeatTempSpare(smDesc, parHeatTempSpare); /* setter sets uint */
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdFunctParam.h b/CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdFunctParam.h
new file mode 100644
index 0000000..ec116ad
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdFunctParam.h
@@ -0,0 +1,24 @@
+/**
+ * @file CrSemServ220CmdFunctParam.h
+ *
+ * Declaration of the CMD Functional Parameter out-going command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRSEM_SERV220_CMD_FUNCT_PARAM_H
+#define CRSEM_SERV220_CMD_FUNCT_PARAM_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Update action of the CMD Functional Parameter telemetry packet.
+ * Collect configuration parameters from the data pool
+ * @param smDesc the state machine descriptor
+ */
+void CrSemServ220CmdFunctParamUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRSEM_SERV220_CMD_FUNCT_PARAM_H */
+
diff --git a/CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdOperParam.c b/CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdOperParam.c
new file mode 100644
index 0000000..2434ce6
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdOperParam.c
@@ -0,0 +1,73 @@
+/**
+ * @file CrSemServ220CmdOperParam.c
+ * @ingroup CrIaServicesSem
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the SEM CMD Operation Parameter out-going command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrSemServ220CmdOperParam.h"
+#include "../../General/CrSemParamSetter.h"
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include "../../../IfswDebug.h"
+
+
+void CrSemServ220CmdOperParamUpdateAction(FwSmDesc_t smDesc)
+{
+  unsigned int   parExposureTime;
+  unsigned int   parRepetitionPeriod;
+  unsigned int   parAcquisitionNum;
+  unsigned short parDataOversampling; /* setter needs char */
+  unsigned char  setDataOversampling;
+  unsigned short parCcdReadoutMode; /* setter needs char */
+  unsigned char  setCcdReadoutMode;
+
+  /* Collect configuration parameters from the data pool */
+  CrIaCopy(PEXPTIME_ID, &parExposureTime);
+  CrIaCopy(PIMAGEREP_ID, &parRepetitionPeriod);
+
+  /* Mantis 2168: always command the maximum number of images */
+
+  parAcquisitionNum = 0xffffffff;
+
+  if (useMaxAcquisitionNum == 0)
+    {
+      CrIaCopy(PACQNUM_ID, &parAcquisitionNum);
+    } 
+
+  CrIaCopy(PDATAOS_ID, &parDataOversampling);
+  setDataOversampling = (unsigned char) parDataOversampling;
+  CrIaCopy(PCCDRDMODE_ID, &parCcdReadoutMode);
+  setCcdReadoutMode = (unsigned char) parCcdReadoutMode;
+  /* set sciSubMode in data pool */
+  CrIaPaste(SCISUBMODE_ID, &parCcdReadoutMode);
+
+  PRDEBUGP("parExposureTime: %d\n", parExposureTime);
+  PRDEBUGP("parRepetitionPeriod: %d\n", parRepetitionPeriod);
+  PRDEBUGP("parAcquisitionNum : %d\n", parAcquisitionNum);
+  PRDEBUGP("setDataOversampling: %d\n", setDataOversampling);
+  PRDEBUGP("setCcdReadoutMode : %d\n", setCcdReadoutMode);
+
+  /* Set parameters in command */
+  CrSemServ220CmdOperParamParamSetParExposureTime(smDesc, parExposureTime);
+  CrSemServ220CmdOperParamParamSetParRepetitionPeriod(smDesc, parRepetitionPeriod);
+  CrSemServ220CmdOperParamParamSetParAcquisitionNum(smDesc, parAcquisitionNum);
+  CrSemServ220CmdOperParamParamSetParDataOversampling(smDesc, setDataOversampling);
+  CrSemServ220CmdOperParamParamSetParCcdReadoutMode(smDesc, setCcdReadoutMode);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdOperParam.h b/CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdOperParam.h
new file mode 100644
index 0000000..a5a9e1a
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdOperParam.h
@@ -0,0 +1,24 @@
+/**
+ * @file CrSemServ220CmdOperParam.h
+ *
+ * Declaration of the CMD Operation Parameter out-going command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRSEM_SERV220_CMD_OPER_PARAM_H
+#define CRSEM_SERV220_CMD_OPER_PARAM_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Update action of the CMD Operation Parameter telemetry packet.
+ * Collect configuration parameters from the data pool
+ * @param smDesc the state machine descriptor
+ */
+void CrSemServ220CmdOperParamUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRSEM_SERV220_CMD_OPER_PARAM_H */
+
diff --git a/CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdTempCtrlEnable.c b/CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdTempCtrlEnable.c
new file mode 100644
index 0000000..258c96d
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdTempCtrlEnable.c
@@ -0,0 +1,36 @@
+/**
+ * @file CrSemServ220CmdTempCtrlEnable.c
+ * @ingroup CrIaServicesSem
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the SEM CMD Temperature Control Enable out-going command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrSemServ220CmdTempCtrlEnable.h"
+#include "../../General/CrSemParamSetter.h"
+
+#include "CrIaDataPool.h"
+#include "CrIaDataPoolId.h"
+ 
+
+void CrSemServ220CmdTempCtrlEnableUpdateAction(FwSmDesc_t smDesc)
+{
+  unsigned short pTempCtrlTarget;
+
+  CrIaCopy(PTEMPCTRLTARGET_ID, &pTempCtrlTarget);
+
+  CrSemServ220CmdTempCtrlEnableParamSetParTempControlTarget(smDesc, pTempCtrlTarget);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdTempCtrlEnable.h b/CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdTempCtrlEnable.h
new file mode 100644
index 0000000..8bc5e98
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ220PrivateService220/OutCmd/CrSemServ220CmdTempCtrlEnable.h
@@ -0,0 +1,24 @@
+/**
+ * @file CrSemServ220CmdTempCtrlEnable.h
+ *
+ * Declaration of the CMD Temperature Control Enable out-going command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRSEM_SERV220_CMD_TEMP_CTRL_ENABLE_H
+#define CRSEM_SERV220_CMD_TEMP_CTRL_ENABLE_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Update action of the CMD Temperature Control Enable telemetry packet.
+ * TBD
+ * @param smDesc the state machine descriptor
+ */
+void CrSemServ220CmdTempCtrlEnableUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRSEM_SERV220_CMD_TEMP_CTRL_ENABLE_H */
+
diff --git a/CrIa/src/Services/CrSemServ221PrivateService221/OutCmd/CrSemServ221FpmPowerDis.c b/CrIa/src/Services/CrSemServ221PrivateService221/OutCmd/CrSemServ221FpmPowerDis.c
new file mode 100644
index 0000000..8e6c3e1
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ221PrivateService221/OutCmd/CrSemServ221FpmPowerDis.c
@@ -0,0 +1,26 @@
+/**
+ * @file CrSemServ221FpmPowerDis.c
+ *
+ * Implementation of the CMD FPM Power Disable out-going command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#include "CrSemServ221FpmPowerDis.h"
+#include "../../../CrIaIasw.h"
+#include <OutFactory/CrFwOutFactory.h>
+#include <OutCmp/CrFwOutCmp.h>
+#include <OutLoader/CrFwOutLoader.h>
+
+#include "../../../IfswDebug.h"
+
+
+void CrSemServ221CmdFpmPowerDisableUpdateAction(FwSmDesc_t smDesc)
+{
+  CRFW_UNUSED(smDesc); /* remove if smDesc is used in this function */
+  /* Implement the action logic here: */
+  DEBUGP("CrSemServ221CmdFpmPowerDisableUpdateAction: Switching-off power of SEM units\n");
+
+  return;
+}
diff --git a/CrIa/src/Services/CrSemServ221PrivateService221/OutCmd/CrSemServ221FpmPowerDis.h b/CrIa/src/Services/CrSemServ221PrivateService221/OutCmd/CrSemServ221FpmPowerDis.h
new file mode 100644
index 0000000..79c0891
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ221PrivateService221/OutCmd/CrSemServ221FpmPowerDis.h
@@ -0,0 +1,23 @@
+/**
+ * @file CrSemServ221FpmPowerDis.h
+ *
+ * Declaration of the CMD FPM Power Disable out-going command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRSEM_SERV221_CMD_FPM_POWER_DIS_H
+#define CRSEM_SERV221_CMD_FPM_POWER_DIS_H
+
+#include "FwProfile/FwSmCore.h"
+#include "CrFramework/CrFwConstants.h"
+
+/**
+ * Update action of the CMD FPM Power Disable telemetry packet.
+ * @param smDesc the state machine descriptor
+ */
+void CrSemServ221CmdFpmPowerDisableUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRSEM_SERV221_CMD_FPM_POWER_DIS_H */
+
diff --git a/CrIa/src/Services/CrSemServ221PrivateService221/OutCmd/CrSemServ221FpmPowerEnb.c b/CrIa/src/Services/CrSemServ221PrivateService221/OutCmd/CrSemServ221FpmPowerEnb.c
new file mode 100644
index 0000000..58feb5f
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ221PrivateService221/OutCmd/CrSemServ221FpmPowerEnb.c
@@ -0,0 +1,26 @@
+/**
+ * @file CrSemServ221FpmPowerEnb.c
+ *
+ * Implementation of the CMD FPM Power Enable out-going command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#include "CrSemServ221FpmPowerEnb.h"
+#include "../../../CrIaIasw.h"
+#include <OutFactory/CrFwOutFactory.h>
+#include <OutCmp/CrFwOutCmp.h>
+#include <OutLoader/CrFwOutLoader.h>
+
+#include "../../../IfswDebug.h"
+
+
+void CrSemServ221CmdFpmPowerEnableUpdateAction(FwSmDesc_t smDesc)
+{
+  CRFW_UNUSED(smDesc); /* remove if smDesc is used in this function */
+  /* Implement the action logic here: */
+  DEBUGP("CrSemServ221CmdFpmPowerEnableUpdateAction: Switching-on power of SEM units\n");
+
+  return;
+}
diff --git a/CrIa/src/Services/CrSemServ221PrivateService221/OutCmd/CrSemServ221FpmPowerEnb.h b/CrIa/src/Services/CrSemServ221PrivateService221/OutCmd/CrSemServ221FpmPowerEnb.h
new file mode 100644
index 0000000..5a1f9bb
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ221PrivateService221/OutCmd/CrSemServ221FpmPowerEnb.h
@@ -0,0 +1,23 @@
+/**
+ * @file CrSemServ220FpmPowerEnable.h
+ *
+ * Declaration of the CMD FPM Power Enable out-going command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRSEM_SERV221_CMD_FPM_POWER_ENB_H
+#define CRSEM_SERV221_CMD_FPM_POWER_ENB_H
+
+#include "FwProfile/FwSmCore.h"
+#include "CrFramework/CrFwConstants.h"
+
+/**
+ * Update action of the CMD FPM Power Enable telemetry packet.
+ * @param smDesc the state machine descriptor
+ */
+void CrSemServ221CmdFpmPowerEnableUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRSEM_SERV221_CMD_FPM_POWER_ENB_H */
+
diff --git a/CrIa/src/Services/CrSemServ222PrivateService222/InRep/CrSemServ222DatTestLog.c b/CrIa/src/Services/CrSemServ222PrivateService222/InRep/CrSemServ222DatTestLog.c
new file mode 100644
index 0000000..95100b5
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ222PrivateService222/InRep/CrSemServ222DatTestLog.c
@@ -0,0 +1,63 @@
+/**
+ * @file CrSemServ222DatTestLog.c
+ * @ingroup CrIaServicesSem
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the SEM DAT Test Log in-coming report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrSemServ222DatTestLog.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+#include <CrFwCmpData.h>
+
+/* send function in the 222,6 forward */
+#include <OutStream/CrFwOutStream.h>
+
+#include <CrIaIasw.h>
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <IfswDebug.h>
+
+
+void CrSemServ222DatTestLogUpdateAction(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t* inData;
+  CrFwInRepData_t* inSpecificData;
+  CrFwPckt_t inPckt;
+  unsigned char semS2226flag;
+
+  /* Get in packet */
+  inData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+  inSpecificData = (CrFwInRepData_t*)(inData->cmpSpecificData);
+  inPckt = inSpecificData->pckt;
+
+  /* Check, if SEM_SERV222_6_FORWARD is enabled */
+  CrIaCopy(SEM_SERV222_6_FORWARD_ID, &semS2226flag);
+  DEBUGP("semS2226flag: %d\n", semS2226flag);
+  if (semS2226flag == 1)
+    {
+      CrFwOutStreamSend (outStreamGrd, inPckt);
+    }
+  else
+    {
+      DEBUGP("No packet sent!\n");
+    }
+
+  inData->outcome = 1;
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrSemServ222PrivateService222/InRep/CrSemServ222DatTestLog.h b/CrIa/src/Services/CrSemServ222PrivateService222/InRep/CrSemServ222DatTestLog.h
new file mode 100644
index 0000000..cc67f93
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ222PrivateService222/InRep/CrSemServ222DatTestLog.h
@@ -0,0 +1,24 @@
+/**
+ * @file CrSemServ222DatTestLog.h
+ *
+ * Declaration of the DAT Test Log in-coming report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRSEM_SERV221_DAT_TEST_LOG_H
+#define CRSEM_SERV221_DAT_TEST_LOG_H
+
+#include "FwProfile/FwSmCore.h"
+#include "CrFwConstants.h"
+
+
+/**
+ * Update action of the DAT Test Log in-coming report packet.
+ * @param prDesc the procedure descriptor
+ */
+void CrSemServ222DatTestLogUpdateAction(FwPrDesc_t prDesc);
+
+#endif /* CRSEM_SERV221_DAT_TEST_LOG_H */
+
diff --git a/CrIa/src/Services/CrSemServ222PrivateService222/OutCmd/CrSemServ222DiagEnable.c b/CrIa/src/Services/CrSemServ222PrivateService222/OutCmd/CrSemServ222DiagEnable.c
new file mode 100644
index 0000000..9f86c82
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ222PrivateService222/OutCmd/CrSemServ222DiagEnable.c
@@ -0,0 +1,67 @@
+/**
+ * @file CrSemServ222DiagEnable.c
+ *
+ * Implementation of the CMD DIAGNOSTIC Enable out-going command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#include "CrSemServ222DiagEnable.h"
+#include "../../General/CrSemParamSetter.h"
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include "../../../IfswDebug.h"
+
+
+void CrSemServ222CmdDiagEnableUpdateAction(FwSmDesc_t smDesc)
+{
+  unsigned short pStepEnDiagCcd, pStepEnDiagFee, pStepEnDiagTemp, pStepEnDiagAna, pStepEnDiagExpos;
+  unsigned short pStepDebDiagCcd, pStepDebDiagFee, pStepDebDiagTemp, pStepDebDiagAna, pStepDebDiagExpos;
+
+  DEBUGP("CrSemServ222CmdDiagEnableUpdateAction\n");
+
+  /* get pStepEnDiagCcd PAR_STEP_ENABLE_ DIAG_CCD from data pool and set it in packet */
+  CrIaCopy(PSTEPENDIAGCCD_ID, &pStepEnDiagCcd);
+  CrSemServ222CmdDiagEnableParamSetParStepEnDiagCcd(smDesc, pStepEnDiagCcd);
+
+  /* pStepEnDiagFee PAR_STEP_ENABLE_ DIAG_FEE from data pool and set it in packet */
+  CrIaCopy(PSTEPENDIAGFEE_ID, &pStepEnDiagFee);
+  CrSemServ222CmdDiagEnableParamSetParStepEnDiagFee(smDesc, pStepEnDiagFee);
+
+  /* pStepEnDiagTemp PAR_STEP_ENABLE_ DIAG_TEMP_CONTROL from data pool and set it in packet */
+  CrIaCopy(PSTEPENDIAGTEMP_ID, &pStepEnDiagTemp);
+  CrSemServ222CmdDiagEnableParamSetParStepEnDiagTemp(smDesc, pStepEnDiagTemp);
+
+  /* pStepEnDiagAna PAR_STEP_ENABLE_ DIAG_ANALOG_HK from data pool and set it in packet */
+  CrIaCopy(PSTEPENDIAGANA_ID, &pStepEnDiagAna);
+  CrSemServ222CmdDiagEnableParamSetParStepEnDiagAna(smDesc, pStepEnDiagAna);
+
+  /* pStepEnDiagExpos PAR_STEP_ENABLE_ DIAG_EXPOS from data pool and set it in packet */
+  CrIaCopy(PSTEPENDIAGEXPOS_ID, &pStepEnDiagExpos);
+  CrSemServ222CmdDiagEnableParamSetParStepEnDiagExpos(smDesc, pStepEnDiagExpos);
+
+  /* pStepDebDiagCcd PAR_STEP_DEBUG_ DIAG_CCD from data pool and set it in packet */
+  CrIaCopy(PSTEPDEBDIAGCCD_ID, &pStepDebDiagCcd);
+  CrSemServ222CmdDiagEnableParamSetParStepDebDiagCcd(smDesc, pStepDebDiagCcd);
+
+  /* pStepDebDiagFee PAR_STEP_DEBUG_ DIAG_FEE from data pool and set it in packet */
+  CrIaCopy(PSTEPDEBDIAGFEE_ID, &pStepDebDiagFee);
+  CrSemServ222CmdDiagEnableParamSetParStepDebDiagFee(smDesc, pStepDebDiagFee);
+
+  /* pStepDebDiagTemp PAR_STEP_DEBUG_ DIAG_TEMP_CONTROL from data pool and set it in packet */
+  CrIaCopy(PSTEPDEBDIAGTEMP_ID, &pStepDebDiagTemp);
+  CrSemServ222CmdDiagEnableParamSetParStepDebDiagTemp(smDesc, pStepDebDiagTemp);
+
+  /* pStepDebDiagAna PAR_STEP_DEBUG_ DIAG_ANALOG_HK from data pool and set it in packet */
+  CrIaCopy(PSTEPDEBDIAGANA_ID, &pStepDebDiagAna);
+  CrSemServ222CmdDiagEnableParamSetParStepDebDiagAna(smDesc, pStepDebDiagAna);
+
+  /* pStepDebDiagExpos PAR_STEP_DEBUG_ DIAG_EXPOS from data pool and set it in packet */
+  CrIaCopy(PSTEPDEBDIAGEXPOS_ID, &pStepDebDiagExpos);
+  CrSemServ222CmdDiagEnableParamSetParStepDebDiagExpos(smDesc, pStepDebDiagExpos);
+
+  return;
+}
diff --git a/CrIa/src/Services/CrSemServ222PrivateService222/OutCmd/CrSemServ222DiagEnable.h b/CrIa/src/Services/CrSemServ222PrivateService222/OutCmd/CrSemServ222DiagEnable.h
new file mode 100644
index 0000000..1e8ba4d
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ222PrivateService222/OutCmd/CrSemServ222DiagEnable.h
@@ -0,0 +1,23 @@
+/**
+ * @file CrSemServ222DiagEnable.h
+ *
+ * Declaration of the CMD DIAGNOSTIC Enable out-going command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRSEM_SERV222_CMD_DIAG_ENABLE_H
+#define CRSEM_SERV222_CMD_DIAG_ENABLE_H
+
+#include "FwProfile/FwSmCore.h"
+#include "CrFramework/CrFwConstants.h"
+
+/**
+ * Update action of the CMD DIAGNOSTIC Enable telemetry packet.
+ * @param smDesc the state machine descriptor
+ */
+void CrSemServ222CmdDiagEnableUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRSEM_SERV222_CMD_DIAG_ENABLE_H */
+
diff --git a/CrIa/src/Services/CrSemServ3HousekeepingDataReportingService/InRep/CrSemServ3DatHk.c b/CrIa/src/Services/CrSemServ3HousekeepingDataReportingService/InRep/CrSemServ3DatHk.c
new file mode 100644
index 0000000..273fb8a
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ3HousekeepingDataReportingService/InRep/CrSemServ3DatHk.c
@@ -0,0 +1,1184 @@
+/**
+ * @file CrSemServ3DatHk.c
+ * @ingroup CrIaServicesSem
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the SEM DAT Housekeeping in-coming report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrSemServ3DatHk.h"
+
+#include "../../../IfswDebug.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+#include <Services/General/CrIaParamSetter.h>
+#include <Services/General/CrIaParamGetter.h>
+#include <Services/General/CrSemParamGetter.h>
+
+#include <byteorder.h>
+
+#include <CrIaIasw.h>
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h>
+#include <CrIaPrSm/CrIaFdCheckCreate.h>
+#include <CrIaPrSm/CrIaSemCreate.h> /* for SEM State Machine state identifiers */
+
+/* send function in the 3,25 1 and 3,25 2 forward */
+#include <OutStream/CrFwOutStream.h>
+
+/* imported global variables */
+extern unsigned short SemHkIaswStateExecCnt; /* needed by FdCheckFunc */
+extern FwSmBool_t flagDelayedSemHkPacket; /* needed by FdCheckFunc */
+extern unsigned int semAliveStatusDefCnt, semAliveStatusExtCnt; /* needed by FdCheckFunc */
+extern unsigned int warnLimitDefCnt, alarmLimitDefCnt; /* needed by FdCheckFunc (Default HK) */
+extern unsigned int warnLimitExtCnt, alarmLimitExtCnt; /* needed by FdCheckFunc (Extended HK) */
+static unsigned char warnLimitDef[NMB_LIMIT_CHECK_MAX], warnLimitExt[NMB_LIMIT_CHECK_MAX];
+static unsigned char semAliveStatusDef[NMB_LIMIT_CHECK_MAX], semAliveStatusExt[NMB_LIMIT_CHECK_MAX];
+
+unsigned int defHkCycCntOld = 0, extHkCycCntOld = 0;
+unsigned int defHkCycCntNew, extHkCycCntNew;
+unsigned short defHkCycCntDiff, extHkCycCntDiff; /* number of cycles */
+
+
+typedef struct {
+  unsigned int nmbWarn;
+  unsigned int nmbAlarm;
+} fdCheckLimit_t;
+
+
+/* Mantis 2182 */
+void ClearWarnLimit (void)
+{
+  unsigned int i;
+
+  for (i=0; i < NMB_LIMIT_CHECK_MAX; i++)
+    {
+      warnLimitDef[i] = 0;
+      warnLimitExt[i] = 0;
+    }
+
+  return;
+}
+
+
+/* Mantis 2182 */
+void ClearAliveLimit (void)
+{
+  unsigned int i;
+
+  for (i=0; i < NMB_LIMIT_CHECK_MAX; i++)
+    {
+      semAliveStatusDef[i] = 0;
+      semAliveStatusExt[i] = 0;
+    }
+
+  return;
+}
+
+
+fdCheckLimit_t checkFloatSemLimit(unsigned int id, float value)
+{
+  unsigned char FdCheckGlbEn = 0, FdCheckIntEn = 0, FdCheckExtEn = 0;
+  float upperAlarmLimit = 0.0f, upperWarningLimit = 0.0f, lowerAlarmLimit = 0.0f, lowerWarningLimit = 0.0f;
+  fdCheckLimit_t FdCheckLimit;
+  unsigned short evt_data[2];
+  unsigned short semState, semOperState;
+  unsigned char skipCheck;
+
+  /* Mantis 2121: Only perform check of TEMP_FEE_*, VOLT_FEE_*, and CURR_FEE_CLK_BUF
+                  after SEM State Machine has entered STABILIZE */
+  CrIaCopy(SEMSTATE_ID, &semState);
+  CrIaCopy(SEMOPERSTATE_ID, &semOperState);
+
+  /* initialize skipCheck */
+  skipCheck = 0;
+
+  switch (id)
+  {
+    /* Default HK */
+    case TEMP_SEM_SCU_ID:
+      CrIaCopy(TEMP_SEM_SCU_LW_ID, &lowerWarningLimit);
+      CrIaCopy(TEMP_SEM_SCU_UW_ID, &upperWarningLimit);
+      CrIaCopy(TEMP_SEM_SCU_LA_ID, &lowerAlarmLimit);
+      CrIaCopy(TEMP_SEM_SCU_UA_ID, &upperAlarmLimit);
+      break;
+    case TEMP_SEM_PCU_ID:
+      CrIaCopy(TEMP_SEM_PCU_LW_ID, &lowerWarningLimit);
+      CrIaCopy(TEMP_SEM_PCU_UW_ID, &upperWarningLimit);
+      CrIaCopy(TEMP_SEM_PCU_LA_ID, &lowerAlarmLimit);
+      CrIaCopy(TEMP_SEM_PCU_UA_ID, &upperAlarmLimit);
+      break;
+    case VOLT_SCU_P3_4_ID:
+      CrIaCopy(VOLT_SCU_P3_4_LW_ID, &lowerWarningLimit);
+      CrIaCopy(VOLT_SCU_P3_4_UW_ID, &upperWarningLimit);
+      CrIaCopy(VOLT_SCU_P3_4_LA_ID, &lowerAlarmLimit);
+      CrIaCopy(VOLT_SCU_P3_4_UA_ID, &upperAlarmLimit);
+      break;
+    case VOLT_SCU_P5_ID:
+      CrIaCopy(VOLT_SCU_P5_LW_ID, &lowerWarningLimit);
+      CrIaCopy(VOLT_SCU_P5_UW_ID, &upperWarningLimit);
+      CrIaCopy(VOLT_SCU_P5_LA_ID, &lowerAlarmLimit);
+      CrIaCopy(VOLT_SCU_P5_UA_ID, &upperAlarmLimit);
+      break;
+    /* Extended HK */
+    case TEMP_FEE_CCD_ID:
+      if ((semState == CrIaSem_OPER) && (semOperState != CrIaSem_STOPPED) && (semOperState != CrIaSem_STANDBY) && (semOperState != CrIaSem_TR_STABILIZE))
+        {
+          CrIaCopy(TEMP_FEE_CCD_LW_ID, &lowerWarningLimit);
+          CrIaCopy(TEMP_FEE_CCD_UW_ID, &upperWarningLimit);
+          CrIaCopy(TEMP_FEE_CCD_LA_ID, &lowerAlarmLimit);
+          CrIaCopy(TEMP_FEE_CCD_UA_ID, &upperAlarmLimit);
+        }
+      else
+        skipCheck = 1;
+      break;
+    case TEMP_FEE_STRAP_ID:
+      if ((semState == CrIaSem_OPER) && (semOperState != CrIaSem_STOPPED) && (semOperState != CrIaSem_STANDBY) && (semOperState != CrIaSem_TR_STABILIZE))
+        {
+          CrIaCopy(TEMP_FEE_STRAP_LW_ID, &lowerWarningLimit);
+          CrIaCopy(TEMP_FEE_STRAP_UW_ID, &upperWarningLimit);
+          CrIaCopy(TEMP_FEE_STRAP_LA_ID, &lowerAlarmLimit);
+          CrIaCopy(TEMP_FEE_STRAP_UA_ID, &upperAlarmLimit);
+        }
+      else
+        skipCheck = 1;
+      break;
+    case TEMP_FEE_ADC_ID:
+      if ((semState == CrIaSem_OPER) && (semOperState != CrIaSem_STOPPED) && (semOperState != CrIaSem_STANDBY) && (semOperState != CrIaSem_TR_STABILIZE))
+        {
+          CrIaCopy(TEMP_FEE_ADC_LW_ID, &lowerWarningLimit);
+          CrIaCopy(TEMP_FEE_ADC_UW_ID, &upperWarningLimit);
+          CrIaCopy(TEMP_FEE_ADC_LA_ID, &lowerAlarmLimit);
+          CrIaCopy(TEMP_FEE_ADC_UA_ID, &upperAlarmLimit);
+        }
+      else
+        skipCheck = 1; 
+      break;
+    case TEMP_FEE_BIAS_ID:
+      if ((semState == CrIaSem_OPER) && (semOperState != CrIaSem_STOPPED) && (semOperState != CrIaSem_STANDBY) && (semOperState != CrIaSem_TR_STABILIZE))
+        {
+          CrIaCopy(TEMP_FEE_BIAS_LW_ID, &lowerWarningLimit);
+          CrIaCopy(TEMP_FEE_BIAS_UW_ID, &upperWarningLimit);
+          CrIaCopy(TEMP_FEE_BIAS_LA_ID, &lowerAlarmLimit);
+          CrIaCopy(TEMP_FEE_BIAS_UA_ID, &upperAlarmLimit);
+        }
+      else
+        skipCheck = 1;
+      break;
+    case TEMP_FEE_DEB_ID:
+      if ((semState == CrIaSem_OPER) && (semOperState != CrIaSem_STOPPED) && (semOperState != CrIaSem_STANDBY) && (semOperState != CrIaSem_TR_STABILIZE))
+        {
+          CrIaCopy(TEMP_FEE_DEB_LW_ID, &lowerWarningLimit);
+          CrIaCopy(TEMP_FEE_DEB_UW_ID, &upperWarningLimit);
+          CrIaCopy(TEMP_FEE_DEB_LA_ID, &lowerAlarmLimit);
+          CrIaCopy(TEMP_FEE_DEB_UA_ID, &upperAlarmLimit);
+        }
+      else
+        skipCheck = 1;
+      break;
+    case VOLT_FEE_VOD_ID:
+      if ((semState == CrIaSem_OPER) && (semOperState != CrIaSem_STOPPED) && (semOperState != CrIaSem_STANDBY) && (semOperState != CrIaSem_TR_STABILIZE))
+        {
+          CrIaCopy(VOLT_FEE_VOD_LW_ID, &lowerWarningLimit);
+          CrIaCopy(VOLT_FEE_VOD_UW_ID, &upperWarningLimit);
+          CrIaCopy(VOLT_FEE_VOD_LA_ID, &lowerAlarmLimit);
+          CrIaCopy(VOLT_FEE_VOD_UA_ID, &upperAlarmLimit);
+        }
+      else
+        skipCheck = 1;
+      break;
+    case VOLT_FEE_VRD_ID:
+      if ((semState == CrIaSem_OPER) && (semOperState != CrIaSem_STOPPED) && (semOperState != CrIaSem_STANDBY) && (semOperState != CrIaSem_TR_STABILIZE))
+        {
+          CrIaCopy(VOLT_FEE_VRD_LW_ID, &lowerWarningLimit);
+          CrIaCopy(VOLT_FEE_VRD_UW_ID, &upperWarningLimit);
+          CrIaCopy(VOLT_FEE_VRD_LA_ID, &lowerAlarmLimit);
+          CrIaCopy(VOLT_FEE_VRD_UA_ID, &upperAlarmLimit);
+        }
+      else
+        skipCheck = 1;
+      break;
+    case VOLT_FEE_VOG_ID:
+      if ((semState == CrIaSem_OPER) && (semOperState != CrIaSem_STOPPED) && (semOperState != CrIaSem_STANDBY) && (semOperState != CrIaSem_TR_STABILIZE))
+        {
+          CrIaCopy(VOLT_FEE_VOG_LW_ID, &lowerWarningLimit);
+          CrIaCopy(VOLT_FEE_VOG_UW_ID, &upperWarningLimit);
+          CrIaCopy(VOLT_FEE_VOG_LA_ID, &lowerAlarmLimit);
+          CrIaCopy(VOLT_FEE_VOG_UA_ID, &upperAlarmLimit);
+        }
+      else
+        skipCheck = 1;
+      break;
+    case VOLT_FEE_VSS_ID:
+      if ((semState == CrIaSem_OPER) && (semOperState != CrIaSem_STOPPED) && (semOperState != CrIaSem_STANDBY) && (semOperState != CrIaSem_TR_STABILIZE))
+        {
+          CrIaCopy(VOLT_FEE_VSS_LW_ID, &lowerWarningLimit);
+          CrIaCopy(VOLT_FEE_VSS_UW_ID, &upperWarningLimit);
+          CrIaCopy(VOLT_FEE_VSS_LA_ID, &lowerAlarmLimit);
+          CrIaCopy(VOLT_FEE_VSS_UA_ID, &upperAlarmLimit);
+        }
+      else
+        skipCheck = 1;
+      break;
+    case VOLT_FEE_CCD_ID:
+      if ((semState == CrIaSem_OPER) && (semOperState != CrIaSem_STOPPED) && (semOperState != CrIaSem_STANDBY) && (semOperState != CrIaSem_TR_STABILIZE))
+        {
+          CrIaCopy(VOLT_FEE_CCD_LW_ID, &lowerWarningLimit);
+          CrIaCopy(VOLT_FEE_CCD_UW_ID, &upperWarningLimit);
+          CrIaCopy(VOLT_FEE_CCD_LA_ID, &lowerAlarmLimit);
+          CrIaCopy(VOLT_FEE_CCD_UA_ID, &upperAlarmLimit);
+        }
+      else
+        skipCheck = 1;
+      break;
+    case VOLT_FEE_CLK_ID:
+      if ((semState == CrIaSem_OPER) && (semOperState != CrIaSem_STOPPED) && (semOperState != CrIaSem_STANDBY) && (semOperState != CrIaSem_TR_STABILIZE))
+        {
+          CrIaCopy(VOLT_FEE_CLK_LW_ID, &lowerWarningLimit);
+          CrIaCopy(VOLT_FEE_CLK_UW_ID, &upperWarningLimit);
+          CrIaCopy(VOLT_FEE_CLK_LA_ID, &lowerAlarmLimit);
+          CrIaCopy(VOLT_FEE_CLK_UA_ID, &upperAlarmLimit);
+        }
+      else
+        skipCheck = 1;
+      break;
+    case VOLT_FEE_ANA_P5_ID:
+      if ((semState == CrIaSem_OPER) && (semOperState != CrIaSem_STOPPED) && (semOperState != CrIaSem_STANDBY) && (semOperState != CrIaSem_TR_STABILIZE))
+        {
+          CrIaCopy(VOLT_FEE_ANA_P5_LW_ID, &lowerWarningLimit);
+          CrIaCopy(VOLT_FEE_ANA_P5_UW_ID, &upperWarningLimit);
+          CrIaCopy(VOLT_FEE_ANA_P5_LA_ID, &lowerAlarmLimit);
+          CrIaCopy(VOLT_FEE_ANA_P5_UA_ID, &upperAlarmLimit);
+        }
+      else
+        skipCheck = 1;
+      break;   
+    case VOLT_FEE_ANA_N5_ID:
+      if ((semState == CrIaSem_OPER) && (semOperState != CrIaSem_STOPPED) && (semOperState != CrIaSem_STANDBY) && (semOperState != CrIaSem_TR_STABILIZE))
+        {
+          CrIaCopy(VOLT_FEE_ANA_N5_LW_ID, &lowerWarningLimit);
+          CrIaCopy(VOLT_FEE_ANA_N5_UW_ID, &upperWarningLimit);
+          CrIaCopy(VOLT_FEE_ANA_N5_LA_ID, &lowerAlarmLimit);
+          CrIaCopy(VOLT_FEE_ANA_N5_UA_ID, &upperAlarmLimit);
+        }
+      else
+        skipCheck = 1;
+      break;  
+    case VOLT_FEE_ANA_P3_3_ID:
+      if ((semState == CrIaSem_OPER) && (semOperState != CrIaSem_STOPPED) && (semOperState != CrIaSem_STANDBY) && (semOperState != CrIaSem_TR_STABILIZE))
+        {
+          CrIaCopy(VOLT_FEE_ANA_P3_3_LW_ID, &lowerWarningLimit);
+          CrIaCopy(VOLT_FEE_ANA_P3_3_UW_ID, &upperWarningLimit);
+          CrIaCopy(VOLT_FEE_ANA_P3_3_LA_ID, &lowerAlarmLimit);
+          CrIaCopy(VOLT_FEE_ANA_P3_3_UA_ID, &upperAlarmLimit);
+        }
+      else
+        skipCheck = 1;
+      break;      
+    case CURR_FEE_CLK_BUF_ID:
+      if ((semState == CrIaSem_OPER) && (semOperState != CrIaSem_STOPPED) && (semOperState != CrIaSem_STANDBY) && (semOperState != CrIaSem_TR_STABILIZE))
+        {
+          CrIaCopy(CURR_FEE_CLK_BUF_LW_ID, &lowerWarningLimit);
+          CrIaCopy(CURR_FEE_CLK_BUF_UW_ID, &upperWarningLimit);
+          CrIaCopy(CURR_FEE_CLK_BUF_LA_ID, &lowerAlarmLimit);
+          CrIaCopy(CURR_FEE_CLK_BUF_UA_ID, &upperAlarmLimit);
+        }
+      else
+        skipCheck = 1;
+      break;
+    case VOLT_SCU_FPGA_P1_5_ID:  
+      CrIaCopy(VOLT_SCU_FPGA_P1_5_LW_ID, &lowerWarningLimit);
+      CrIaCopy(VOLT_SCU_FPGA_P1_5_UW_ID, &upperWarningLimit);
+      CrIaCopy(VOLT_SCU_FPGA_P1_5_LA_ID, &lowerAlarmLimit);
+      CrIaCopy(VOLT_SCU_FPGA_P1_5_UA_ID, &upperAlarmLimit);    
+      break;  
+    case CURR_SCU_P3_4_ID:
+      CrIaCopy(CURR_SCU_P3_4_LW_ID, &lowerWarningLimit);
+      CrIaCopy(CURR_SCU_P3_4_UW_ID, &upperWarningLimit);
+      CrIaCopy(CURR_SCU_P3_4_LA_ID, &lowerAlarmLimit);
+      CrIaCopy(CURR_SCU_P3_4_UA_ID, &upperAlarmLimit);    
+      break;      
+    default:
+
+      break;
+  }
+
+  if (!skipCheck)
+    {
+      /* check if value is in alarm region */
+      if ((value >= upperAlarmLimit) || (value <= lowerAlarmLimit))
+        {
+          FdCheckLimit.nmbAlarm = 1;
+        }
+      else
+        {
+          FdCheckLimit.nmbAlarm = 0;
+        }
+
+      /* check if value is in warning or alarm region */
+      if ((value >= upperWarningLimit) || (value <= lowerWarningLimit))
+        {
+          FdCheckLimit.nmbWarn = 1;
+        }
+      else
+        {
+          FdCheckLimit.nmbWarn = 0;
+        }
+
+      /* Mantis 2182: if there is a warning or an alert (or both), we want to see only one event */
+      if (FdCheckLimit.nmbAlarm || FdCheckLimit.nmbWarn)
+	{      
+          /* send event report OOL only if SEM Limit FdCheck is enabled */
+          CrIaCopy(FDGLBENABLE_ID, &FdCheckGlbEn);
+          if (FdCheckGlbEn == 1)
+            {
+              CrIaCopy(FDCHECKSEMLIMITINTEN_ID, &FdCheckIntEn);
+              CrIaCopy(FDCHECKSEMLIMITEXTEN_ID, &FdCheckExtEn);
+              if ((FdCheckIntEn == 1) && (FdCheckExtEn == 1))
+                {
+                  evt_data[0] = 0; /* IDs fit in 16 bit */
+                  evt_data[1] = id;
+                  CrIaEvtRep(CRIA_SERV5_EVT_ERR_MED_SEV,  CRIA_SERV5_EVT_OOL_PARAM, evt_data, 4);
+                }
+            }
+	}
+    }
+  else
+    {
+      FdCheckLimit.nmbAlarm = 0;
+      FdCheckLimit.nmbWarn = 0;
+    }
+
+  return FdCheckLimit;
+}
+
+void shiftWarnLimits(CrFwBool_t HkDef)
+{
+  int i;
+  for (i=0; i<NMB_LIMIT_CHECK_MAX-1; i++)
+    {
+      if (HkDef)
+        {
+          warnLimitDef[NMB_LIMIT_CHECK_MAX-i-1] = warnLimitDef[NMB_LIMIT_CHECK_MAX-i-2];
+          DEBUGP("warnLimitDef[%d] = warnLimitDef[%d] = %d\n", i+1, i, warnLimitDef[i]);
+        }
+      else
+        {
+          warnLimitExt[NMB_LIMIT_CHECK_MAX-i-1] = warnLimitExt[NMB_LIMIT_CHECK_MAX-i-2];
+          DEBUGP("warnLimitExt[%d] = warnLimitExt[%d] = %d\n", i+1, i, warnLimitExt[i]);
+        }      
+    }
+  return;
+}
+
+void shiftSemAliveStatus(CrFwBool_t HkDef)
+{
+  int i;
+  for (i=0; i<NMB_LIMIT_CHECK_MAX-1; i++)
+    {
+      if (HkDef)
+        {
+          semAliveStatusDef[NMB_LIMIT_CHECK_MAX-i-1] = semAliveStatusDef[NMB_LIMIT_CHECK_MAX-i-2];
+          DEBUGP("semAliveStatusDef[%d] = semAliveStatusDef[%d] = %d\n", i+1, i, semAliveStatusDef[i]);
+        }
+      else
+        {
+          semAliveStatusExt[NMB_LIMIT_CHECK_MAX-i-1] = semAliveStatusExt[NMB_LIMIT_CHECK_MAX-i-2];
+          DEBUGP("semAliveStatusExt[%d] = semAliveStatusExt[%d] = %d\n", i+1, i, semAliveStatusExt[i]);
+        }      
+    }
+  return;
+}
+
+unsigned int sumWarnLimits(CrFwBool_t HkDef)
+{
+  int i, nmbWarnLimits;
+  unsigned int sum = 0;
+  unsigned short semLimDelT; /* number of cycles */
+
+  CrIaCopy(SEM_LIM_DEL_T_ID, &semLimDelT);
+
+  if (HkDef)
+    {
+      nmbWarnLimits = (unsigned short)(semLimDelT / defHkCycCntDiff) + 1;
+      DEBUGP("sumWarnLimits(): nmbWarnLimits = %d (semLimDelT: %d / defHkCycCntDiff: %d)\n", nmbWarnLimits, semLimDelT, defHkCycCntDiff);
+    }
+  else
+    {
+      nmbWarnLimits = (unsigned short)(semLimDelT / extHkCycCntDiff) + 1;
+      DEBUGP("sumWarnLimits(): nmbWarnLimits = %d (semLimDelT: %d / extHkCycCntDiff: %d)\n", nmbWarnLimits, semLimDelT, extHkCycCntDiff);
+    }
+
+  if (nmbWarnLimits > NMB_LIMIT_CHECK_MAX)
+    {
+      nmbWarnLimits = NMB_LIMIT_CHECK_MAX;
+    }
+
+  /* Mantis 2182: we sum recent and older warnings */
+  for (i=0; i<nmbWarnLimits; i++)
+    {
+      if (HkDef)
+        {
+          sum += warnLimitDef[i];
+          DEBUGP("warnLimitDef[%d] = %d\n", i, warnLimitDef[i]);
+        }
+      else
+        {
+          sum += warnLimitExt[i];
+          DEBUGP("warnLimitExt[%d] = %d\n", i, warnLimitExt[i]);
+        }
+    }
+  return sum;
+}
+
+unsigned int sumSemAliveStatus(CrFwBool_t HkDef)
+{
+  int i, nmbWarnLimits;
+  unsigned int sum = 0;
+  unsigned short semLimDelT; /* number of cycles */
+
+  CrIaCopy(SEM_LIM_DEL_T_ID, &semLimDelT);
+
+  if (HkDef)
+    {
+      nmbWarnLimits = (unsigned short)(semLimDelT / defHkCycCntDiff) + 1;
+      DEBUGP("sumSemAliveStatus(): nmbWarnLimits = %d (semLimDelT: %d / defHkCycCntDiff: %d)\n", nmbWarnLimits, semLimDelT, defHkCycCntDiff);
+    }
+  else
+    {
+      nmbWarnLimits = (unsigned short)(semLimDelT / extHkCycCntDiff) + 1;
+      DEBUGP("sumSemAliveStatus(): nmbWarnLimits = %d (semLimDelT: %d / extHkCycCntDiff: %d)\n", nmbWarnLimits, semLimDelT, extHkCycCntDiff);
+    }
+
+  if (nmbWarnLimits > NMB_LIMIT_CHECK_MAX)
+    {
+      nmbWarnLimits = NMB_LIMIT_CHECK_MAX;
+    }
+
+  for (i=0; i<nmbWarnLimits; i++)
+    {
+      if (HkDef)
+        {
+          sum += semAliveStatusDef[i];
+          DEBUGP("semAliveStatusDef[%d] = %d\n", i, semAliveStatusDef[i]);
+        }
+      else
+        {
+          sum += semAliveStatusExt[i];
+          DEBUGP("semAliveStatusExt[%d] = %d\n", i, semAliveStatusExt[i]);
+        }
+    }
+  return sum;
+}
+
+
+/**
+ * @brief Update action of the Service 3 SEM DAT Housekeeping in-coming report
+ *
+ * @note The implementation is not realized using the described framework procedure in the specification document CHEOPS-PNP-INST-RS-001.
+ *
+ * Following steps are executed:
+ * - Copy HK report to data pool
+ * if forwarding of SEM HK report is enabled:
+ * - Forward HK report to Ground
+ *
+ * @param[in]  prDesc procedure descriptor
+ * @param[out] none
+ */
+void CrSemServ3DatHkUpdateAction(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t* inData;
+  CrFwInRepData_t* inSpecificData;
+  CrFwPckt_t inPckt;
+  CrFwDiscriminant_t disc;
+  CrFwTimeStamp_t time;
+
+  fdCheckLimit_t FdCheckLimit;
+  unsigned short sm_state;
+
+  unsigned short timeStamp_FINE;
+  unsigned int timeStamp_CRS;
+  unsigned char semS31flag, semS32flag;
+
+  /* default HK */
+  unsigned short hkStatMode, hkStatFlags;
+#ifdef PC_TARGET
+  unsigned short fixVal9;
+  unsigned char hkStatObtSyncFlag, hkStatWatchDog, hkStatEepromPower, hkStatHkPower, hkStatFpmPower, hkStatDatBufferOverflow, hkStatScuMainRed;
+#endif
+  unsigned short hkStatLastSpwlinkError, hkStatLastErrorId, hkStatLastErrorFrequency;
+  unsigned short hkStatNumCmdReceived, hkStatNumCmdExecuted, hkStatNumDatSent;
+  unsigned short hkStatScuProcDutyCycle, hkStatScuNumAhbError, hkStatScuNumAhbCorrectableError, hkStatHkNumLatchupError;
+  float hkTempSemScu, hkTempSemPcu, hkVoltScuP34, hkVoltScuP5;
+
+  /* extended HK */
+  float hkTempFeeCcd, hkTempFeeStrap, hkTempFeeAdc, hkTempFeeBias, hkTempFeeDeb;
+  float hkVoltFeeVod, hkVoltFeeVrd, hkVoltFeeVog, hkVoltFeeVss, hkVoltFeeCcd, hkVoltFeeClk, hkVoltFeeAnaP5, hkVoltFeeAnaN5, hkVoltFeeDigP33, hkCurrFeeClkBuf;
+  /*  float hkVoltPcuP30, hkVoltPcuP15, hkVoltPcuP5, hkVoltPcuN5, hkVoltPcuP34, hkVoltPcuP7;*/
+  float hkVoltScuFpgaP15, hkCurrScuP34;
+  unsigned char hkStatNumSpwErrCredit, hkStatNumSpwErrEscape, hkStatNumSpwErrDisconnect, hkStatNumSpwErrParity, hkStatNumSpwErrWriteSync;
+  unsigned char hkStatNumSpwErrInvalidAddress, hkStatNumSpwErrEopeep, hkStatNumSpwErrRxAhb, hkStatNumSpwErrTxAhb, hkStatNumSpwErrTxBlocked;
+  unsigned char hkStatNumSpwErrTxle, hkStatNumSpwErrRx, hkStatNumSpwErrTx;
+  unsigned char hkStatHeatPwmFpaCcd, hkStatHeatPwmFeeStrap, hkStatHeatPwmFeeAnach, hkStatHeatPwmSpare;
+  unsigned char hkStatBits;
+  unsigned short hkStatOBTimeSyncDelta;
+
+  CRFW_UNUSED(prDesc); /* remove if smDesc is used in this function */
+
+  /* The Update Action of incoming service 3 reports shall run the SEM HK Update Procedure. */
+
+  /* Get in packet */
+  inData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+  inSpecificData = (CrFwInRepData_t*)(inData->cmpSpecificData);
+  inPckt = inSpecificData->pckt;
+
+  disc = CrFwPcktGetDiscriminant(inPckt);
+  DEBUGP("Discriminant: %d\n", disc);
+
+  if (disc == 1) /* default HK */
+    {
+      /* Check, if SEM_SERV3_1_FORWARD is enabled */
+      CrIaCopy(SEM_SERV3_1_FORWARD_ID, &semS31flag);
+      DEBUGP("semS31flag: %d\n", semS31flag);
+      if (semS31flag == 1)
+        {
+          /* SendSemForwardTmService3(inPckt); */
+          CrFwOutStreamSend (outStreamGrd, inPckt);
+        }
+      else
+        {
+          DEBUGP("No packet sent!\n");
+        }
+
+      /* used for FdCheck: SEM Alive Check */
+      /* get actual IASW cycle counter information when SEM HK was received and set the global variable */
+      SemHkIaswStateExecCnt = FwSmGetExecCnt(smDescIasw);
+      /* reset flag for first delayed SEM HK packet */
+      flagDelayedSemHkPacket = 0;
+
+      /* keep old IASW cycle count */
+      defHkCycCntOld = defHkCycCntNew;
+
+      /* get current IASW cycle count */
+      defHkCycCntNew = FwSmGetExecCnt(smDescIasw);
+
+      /* calculate the cycles between the last received and the current HK packet */
+      if (defHkCycCntOld < defHkCycCntNew)
+        {
+          defHkCycCntDiff = defHkCycCntNew - defHkCycCntOld;
+        }
+      else /* counter reset occured in the meantime ! */
+        {
+          defHkCycCntDiff = 65535 - defHkCycCntOld + defHkCycCntNew;
+        }
+
+    }
+
+  if (disc == 2) /* extended HK */
+    {
+      /* Check, if SEM_SERV3_2_FORWARD is enabled */
+      CrIaCopy(SEM_SERV3_2_FORWARD_ID, &semS32flag);
+      DEBUGP("semS32flag: %d\n", semS32flag);
+      if (semS32flag == 1)
+        {
+          /* SendSemForwardTmService3(inPckt); */
+          CrFwOutStreamSend (outStreamGrd, inPckt);
+        }
+      else
+        {
+          DEBUGP("No packet sent!\n");
+        }
+
+      /* keep old IASW cycle count */
+      extHkCycCntOld = extHkCycCntNew;
+
+      /* get current IASW cycle count */
+      extHkCycCntNew = FwSmGetExecCnt(smDescIasw);
+
+      /* calculate the cycles between the last received and the current HK packet */
+      if (extHkCycCntOld < extHkCycCntNew)
+        {
+          extHkCycCntDiff = extHkCycCntNew - extHkCycCntOld;
+        }
+      else /* counter reset occured in the meantime ! */
+        {
+          extHkCycCntDiff = 65535 - extHkCycCntOld + extHkCycCntNew;
+        }
+
+    }
+
+  time = CrFwPcktGetTimeStamp(inPckt);
+
+  timeStamp_CRS = ((((unsigned int) time.t[0]) << 24) |
+                   (((unsigned int) time.t[1]) << 16) |
+                   (((unsigned int) time.t[2]) <<  8) |
+                   ((unsigned int) time.t[3]));
+
+  timeStamp_FINE = ((((unsigned short) time.t[4]) << 8) |
+                    ((unsigned short) time.t[5]));
+
+  timeStamp_CRS  = be32_to_cpu(timeStamp_CRS);
+  timeStamp_FINE = be16_to_cpu(timeStamp_FINE);
+
+  DEBUGP("time stamp CRS: %d\n", timeStamp_CRS);
+  DEBUGP("time stamp FINE: %d\n", timeStamp_FINE);
+
+  if (disc == 1)
+    {
+
+      /* Set parameters SEM_HK_TIMESTAMP_DEF: SEM_HK_TS_DEF_CRS_ID and SEM_HK_TS_DEF_FINE_ID in data pool */
+      /* Copy of coarse part of the time-stamp from SEM HK default packet */
+      /* Copy of fine part of the time-stamp from SEM HK default packet */
+
+      CrIaPaste(SEM_HK_TS_DEF_CRS_ID, &timeStamp_CRS);
+      CrIaPaste(SEM_HK_TS_DEF_FINE_ID, &timeStamp_FINE);
+
+    }
+  else if (disc == 2)
+    {
+
+      /* Set parameters SEM_HK_TIMESTAMP_EXT: SEM_HK_TS_EXT_CRS_ID and SEM_HK_TS_EXT_FINE_ID  in data pool */
+      /* Copy of coarse part of the time-stamp from SEM HK extended packet */
+      /* Copy of fine part of the time-stamp from SEM HK extended packet */
+
+      CrIaPaste(SEM_HK_TS_EXT_CRS_ID, &timeStamp_CRS);
+      CrIaPaste(SEM_HK_TS_EXT_FINE_ID, &timeStamp_FINE);
+
+    }
+
+  /* Set other SEM HK parameters in data pool */
+
+  if (disc == 1)
+    {
+      /* FdCheck SEM Limit Check */
+      shiftWarnLimits(1); /* shift warn limits one slot further (Default HK) */
+      shiftSemAliveStatus(1); /* shift SEM Alive FdCheck status one slot further (Default HK) */
+      warnLimitDefCnt = 0; /* reset warn limit counter */
+      alarmLimitDefCnt = 0; /* reset alarm limit counter */
+
+      /* Get FdCheck SEM Alive status */
+      sm_state = FwSmGetCurState(smDescFdSemAliveCheck);
+      if ((sm_state == CrIaFdCheck_DISABLED) || (sm_state == CrIaFdCheck_NOMINAL))
+        {
+          semAliveStatusDef[0] = 0;
+        }
+      else
+        {
+          semAliveStatusDef[0] = 1;
+        }
+      semAliveStatusDefCnt = sumSemAliveStatus(1);
+
+      /* STAT_MODE               in SEM HK default packet */
+      CrSemServ3OperationDefaultHkParamGetHkStatMode(&hkStatMode, inPckt);
+      DEBUGP("hkStatMode: %d\n", hkStatMode);
+      CrIaPaste(STAT_MODE_ID, &hkStatMode);
+      /* Monitored by FdCheck SEM Limit Check */ 
+
+      CrSemServ3OperationDefaultHkParamGetHkStatFlags(&hkStatFlags, inPckt);
+      DEBUGP("hkStatFlags: %d\n", hkStatFlags);
+      CrIaPaste(STAT_FLAGS_ID, &hkStatFlags);
+
+#ifdef PC_TARGET
+      DEBUGP("hkStatFlags: -----------------------------------\n");
+
+      CrSemServ3OperationDefaultHkParamGetFixVal9(&fixVal9, inPckt);
+      DEBUGP("hkStatFlags: fixVal9 = %d\n", fixVal9);
+
+      CrSemServ3OperationDefaultHkParamGetHkStatObtSyncFlag(&hkStatObtSyncFlag, inPckt);
+      DEBUGP("hkStatFlags: hkStatObtSyncFlag = %d\n", hkStatObtSyncFlag);
+      /* Monitored by FdCheck SEM Limit Check */
+
+      CrSemServ3OperationDefaultHkParamGetHkStatWatchDog(&hkStatWatchDog, inPckt);
+      DEBUGP("hkStatFlags: hkStatWatchDog = %d\n", hkStatWatchDog);
+
+      CrSemServ3OperationDefaultHkParamGetHkStatEepromPower(&hkStatEepromPower, inPckt);
+      DEBUGP("hkStatFlags: hkStatEepromPower = %d\n", hkStatEepromPower);
+
+      CrSemServ3OperationDefaultHkParamGetHkStatHkPower(&hkStatHkPower, inPckt);
+      DEBUGP("hkStatFlags: hkStatHkPower = %d\n", hkStatHkPower);
+
+      CrSemServ3OperationDefaultHkParamGetHkStatFpmPower(&hkStatFpmPower, inPckt);
+      DEBUGP("hkStatFlags: hkStatFpmPower = %d\n", hkStatFpmPower);
+
+      CrSemServ3OperationDefaultHkParamGetHkStatDatBufferOverflow(&hkStatDatBufferOverflow, inPckt);
+      DEBUGP("hkStatFlags: hkStatDatBufferOverflow = %d\n", hkStatDatBufferOverflow);
+
+      CrSemServ3OperationDefaultHkParamGetHkStatScuMainRed(&hkStatScuMainRed, inPckt);
+      DEBUGP("hkStatFlags: hkStatScuMainRed = %d\n", hkStatScuMainRed);
+
+      DEBUGP("hkStatFlags: -----------------------------------\n");
+#endif
+
+      /* STAT_LAST_SPW_ERR       in SEM HK default packet */
+      /* STAT_LAST_ERR_ID        in SEM HK default packet */
+      /* STAT_LAST_ERR_FREQ      in SEM HK default packet */
+
+      CrSemServ3OperationDefaultHkParamGetHkStatLastSpwlinkError(&hkStatLastSpwlinkError, inPckt);
+      DEBUGP("hkStatLastSpwlinkError: %d\n", hkStatLastSpwlinkError);
+      CrIaPaste(STAT_LAST_SPW_ERR_ID, &hkStatLastSpwlinkError);
+
+      CrSemServ3OperationDefaultHkParamGetHkStatLastErrorId(&hkStatLastErrorId, inPckt);
+      DEBUGP("hkStatLastErrorId: %d\n", hkStatLastErrorId);
+      CrIaPaste(STAT_LAST_ERR_ID_ID, &hkStatLastErrorId);
+
+      CrSemServ3OperationDefaultHkParamGetHkStatLastErrorFrequency(&hkStatLastErrorFrequency, inPckt);
+      DEBUGP("hkStatLastErrorFrequency: %d\n", hkStatLastErrorFrequency);
+      CrIaPaste(STAT_LAST_ERR_FREQ_ID, &hkStatLastErrorFrequency);
+
+      /* STAT_NUM_CMD_RECEIVED   in SEM HK default packet */
+      /* STAT_NUM_CMD_EXECUTED   in SEM HK default packet */
+      /* STAT_NUM_DATA_SENT      in SEM HK default packet */
+
+      CrSemServ3OperationDefaultHkParamGetHkStatNumCmdReceived(&hkStatNumCmdReceived, inPckt);
+      DEBUGP("hkStatNumCmdReceived: %d\n", hkStatNumCmdReceived);
+      CrIaPaste(STAT_NUM_CMD_RECEIVED_ID, &hkStatNumCmdReceived);
+
+      CrSemServ3OperationDefaultHkParamGetHkStatNumCmdExecuted(&hkStatNumCmdExecuted, inPckt);
+      DEBUGP("hkStatNumCmdExecuted: %d\n", hkStatNumCmdExecuted);
+      CrIaPaste(STAT_NUM_CMD_EXECUTED_ID, &hkStatNumCmdExecuted);
+
+      CrSemServ3OperationDefaultHkParamGetHkStatNumDatSent(&hkStatNumDatSent, inPckt);
+      DEBUGP("hkStatNumDatSent: %d\n", hkStatNumDatSent);
+      CrIaPaste(STAT_NUM_DATA_SENT_ID, &hkStatNumDatSent);
+
+      /* STAT_SCU_PROC_DUTY_CL   in SEM HK default packet */
+      /* STAT_SCU_NUM_AHB_ERR    in SEM HK default packet */
+      /* STAT_SCU_NUM_AHB_CERR   in SEM HK default packet */
+      /* STAT_SCU_NUM_LUP_ERR    in SEM HK default packet */
+
+      CrSemServ3OperationDefaultHkParamGetHkStatScuProcDutyCycle(&hkStatScuProcDutyCycle, inPckt);
+      DEBUGP("hkStatScuProcDutyCycle: %d\n", hkStatScuProcDutyCycle);
+      CrIaPaste(STAT_SCU_PROC_DUTY_CL_ID, &hkStatScuProcDutyCycle);
+
+      CrSemServ3OperationDefaultHkParamGetHkStatScuNumAhbError(&hkStatScuNumAhbError, inPckt);
+      DEBUGP("hkStatScuNumAhbError: %d\n", hkStatScuNumAhbError);
+      CrIaPaste(STAT_SCU_NUM_AHB_ERR_ID, &hkStatScuNumAhbError);
+
+      CrSemServ3OperationDefaultHkParamGetHkStatScuNumAhbCorrectableError(&hkStatScuNumAhbCorrectableError, inPckt);
+      DEBUGP("hkStatScuNumAhbCorrectableError: %d\n", hkStatScuNumAhbCorrectableError);
+      CrIaPaste(STAT_SCU_NUM_AHB_CERR_ID, &hkStatScuNumAhbCorrectableError);
+
+      CrSemServ3OperationDefaultHkParamGetHkStatHkNumLatchupError(&hkStatHkNumLatchupError, inPckt);
+      DEBUGP("hkStatHkNumLatchupError: %d\n", hkStatHkNumLatchupError);
+      CrIaPaste(STAT_SCU_NUM_LUP_ERR_ID, &hkStatHkNumLatchupError);
+
+      /* TEMP_SEM_SCU in SEM HK default packet */
+      CrSemServ3OperationDefaultHkParamGetHkTempSemScu(&hkTempSemScu, inPckt);
+      DEBUGP("hkTempSemScu: %f\n", hkTempSemScu);
+      CrIaPaste(TEMP_SEM_SCU_ID, &hkTempSemScu);
+      /* Monitored by FdCheck SEM Limit Check */
+      FdCheckLimit = checkFloatSemLimit(TEMP_SEM_SCU_ID, hkTempSemScu);
+      warnLimitDefCnt  += FdCheckLimit.nmbWarn;
+      alarmLimitDefCnt += FdCheckLimit.nmbAlarm;
+
+      /* TEMP_SEM_PCU in SEM HK default packet */
+      CrSemServ3OperationDefaultHkParamGetHkTempSemPcu(&hkTempSemPcu, inPckt);
+      DEBUGP("hkTempSemPcu: %f\n", hkTempSemPcu);
+      CrIaPaste(TEMP_SEM_PCU_ID, &hkTempSemPcu);
+      /* Monitored by FdCheck SEM Limit Check */
+      FdCheckLimit = checkFloatSemLimit(TEMP_SEM_PCU_ID, hkTempSemPcu);
+      warnLimitDefCnt  += FdCheckLimit.nmbWarn;
+      alarmLimitDefCnt += FdCheckLimit.nmbAlarm;
+
+      /* NOTE: NEW in ICD DLR-INST-IC-001, issue 2.1 */
+      /* VOLT_SCU_P3_4 in SEM HK default packet */
+      CrSemServ3OperationDefaultHkParamGetHkVoltScuP34(&hkVoltScuP34, inPckt);
+      DEBUGP("hkVoltScuP34: %f\n", hkVoltScuP34);
+      CrIaPaste(VOLT_SCU_P3_4_ID, &hkVoltScuP34);
+      /* Monitored by FdCheck SEM Limit Check */
+      FdCheckLimit = checkFloatSemLimit(VOLT_SCU_P3_4_ID, hkVoltScuP34);
+      warnLimitDefCnt  += FdCheckLimit.nmbWarn;
+      alarmLimitDefCnt += FdCheckLimit.nmbAlarm;
+
+      /* NOTE: NEW in ICD DLR-INST-IC-001, issue 2.1 */
+      /* VOLT_SCU_P5 in SEM HK default packet */
+      CrSemServ3OperationDefaultHkParamGetHkVoltScuP5(&hkVoltScuP5, inPckt);
+      DEBUGP("hkVoltScuP5: %f\n", hkVoltScuP5);
+      CrIaPaste(VOLT_SCU_P5_ID, &hkVoltScuP5);
+      /* Monitored by FdCheck SEM Limit Check */
+      FdCheckLimit = checkFloatSemLimit(VOLT_SCU_P5_ID, hkVoltScuP5);
+      warnLimitDefCnt  += FdCheckLimit.nmbWarn;
+      alarmLimitDefCnt += FdCheckLimit.nmbAlarm;
+
+      /* FdCheck SEM Limit Check */
+      if (warnLimitDefCnt > 0)      /* Mantis 2182 */
+	{
+	  warnLimitDef[0] = 1;
+	}
+      else
+	{
+	  warnLimitDef[0] = 0;
+	}
+      
+      warnLimitDefCnt = sumWarnLimits(1); /* Default HK */
+      DEBUGP("CrSemServ3DatHkUpdateAction() DEF HK - warn (%d), alarm (%d), sum = %d\n", warnLimitDef[0], alarmLimitDefCnt, warnLimitDefCnt);
+
+    }
+
+  if (disc == 2)
+    {
+      /* FdCheck SEM Limit Check */
+      shiftWarnLimits(0); /* shift warn limits one slot further (Extended HK) */
+      shiftSemAliveStatus(0); /* shift SEM Alive FdCheck status one slot further (Extended HK) */      
+      warnLimitExtCnt = 0; /* reset warn limit counter */
+      alarmLimitExtCnt = 0; /* reset alarm limit counter */
+
+      /* Get FdCheck SEM Alive status */
+      sm_state = FwSmGetCurState(smDescFdSemAliveCheck);
+      if ((sm_state == CrIaFdCheck_DISABLED) || (sm_state == CrIaFdCheck_NOMINAL))
+        {
+          semAliveStatusExt[0] = 0;
+        }
+      else
+        {
+          semAliveStatusExt[0] = 1;
+        }
+      semAliveStatusExtCnt = sumSemAliveStatus(0);
+
+
+      /* TEMP_FEE_CCD   in SEM HK extended packet */
+      /* TEMP_FEE_STRAP in SEM HK extended packet */
+      /* TEMP_FEE_ADC   in SEM HK extended packet */
+      /* TEMP_FEE_BIAS  in SEM HK extended packet */
+      /* TEMP_FEE_DEB   in SEM HK extended packet */
+
+      CrSemServ3OperationExtendedHkParamGetHkTempFeeCcd(&hkTempFeeCcd, inPckt);
+      DEBUGP("hkTempFeeCcd: %f\n", hkTempFeeCcd);
+      CrIaPaste(TEMP_FEE_CCD_ID, &hkTempFeeCcd);
+      /* Monitored by FdCheck SEM Limit Check */      
+      FdCheckLimit = checkFloatSemLimit(TEMP_FEE_CCD_ID, hkTempFeeCcd);
+      warnLimitExtCnt  += FdCheckLimit.nmbWarn;
+      alarmLimitExtCnt += FdCheckLimit.nmbAlarm;
+
+      CrSemServ3OperationExtendedHkParamGetHkTempFeeStrap(&hkTempFeeStrap, inPckt);
+      DEBUGP("hkTempFeeStrap: %f\n", hkTempFeeStrap);
+      CrIaPaste(TEMP_FEE_STRAP_ID, &hkTempFeeStrap);
+      /* Monitored by FdCheck SEM Limit Check */
+      FdCheckLimit = checkFloatSemLimit(TEMP_FEE_STRAP_ID, hkTempFeeStrap);
+      warnLimitExtCnt  += FdCheckLimit.nmbWarn;
+      alarmLimitExtCnt += FdCheckLimit.nmbAlarm;
+
+      CrSemServ3OperationExtendedHkParamGetHkTempFeeAdc(&hkTempFeeAdc, inPckt);
+      DEBUGP("hkTempFeeAdc: %f\n", hkTempFeeAdc);
+      CrIaPaste(TEMP_FEE_ADC_ID, &hkTempFeeAdc);
+      /* Monitored by FdCheck SEM Limit Check */
+      FdCheckLimit = checkFloatSemLimit(TEMP_FEE_ADC_ID, hkTempFeeAdc);
+      warnLimitExtCnt  += FdCheckLimit.nmbWarn;
+      alarmLimitExtCnt += FdCheckLimit.nmbAlarm;
+
+      CrSemServ3OperationExtendedHkParamGetHkTempFeeBias(&hkTempFeeBias, inPckt);
+      DEBUGP("hkTempFeeBias: %f\n", hkTempFeeBias);
+      CrIaPaste(TEMP_FEE_BIAS_ID, &hkTempFeeBias);
+      /* Monitored by FdCheck SEM Limit Check */  
+      FdCheckLimit = checkFloatSemLimit(TEMP_FEE_BIAS_ID, hkTempFeeBias);
+      warnLimitExtCnt  += FdCheckLimit.nmbWarn;
+      alarmLimitExtCnt += FdCheckLimit.nmbAlarm;
+
+      CrSemServ3OperationExtendedHkParamGetHkTempFeeDeb(&hkTempFeeDeb, inPckt);
+      DEBUGP("hkTempFeeDeb: %f\n", hkTempFeeDeb);
+      CrIaPaste(TEMP_FEE_DEB_ID, &hkTempFeeDeb);
+      /* Monitored by FdCheck SEM Limit Check */  
+      FdCheckLimit = checkFloatSemLimit(TEMP_FEE_DEB_ID, hkTempFeeDeb);
+      warnLimitExtCnt  += FdCheckLimit.nmbWarn;
+      alarmLimitExtCnt += FdCheckLimit.nmbAlarm;
+
+      /* VOLT_FEE_VOD      in SEM HK extended packet */
+      /* VOLT_FEE_VRD      in SEM HK extended packet */
+      /* VOLT_FEE_VOG      in SEM HK extended packet */
+      /* VOLT_FEE_VSS      in SEM HK extended packet */
+      /* VOLT_FEE_CCD      in SEM HK extended packet */
+      /* VOLT_FEE_CLK      in SEM HK extended packet */
+      /* VOLT_FEE_ANA_P5   in SEM HK extended packet */
+      /* VOLT_FEE_ANA_N5   in SEM HK extended packet */
+      /* VOLT_FEE_DIG_P3_3 in SEM HK extended packet */
+
+      CrSemServ3OperationExtendedHkParamGetHkVoltFeeVod(&hkVoltFeeVod, inPckt);
+      DEBUGP("hkVoltFeeVod: %f\n", hkVoltFeeVod);
+      CrIaPaste(VOLT_FEE_VOD_ID, &hkVoltFeeVod);
+      /* Monitored by FdCheck SEM Limit Check */ 
+      FdCheckLimit = checkFloatSemLimit(VOLT_FEE_VOD_ID, hkVoltFeeVod);
+      warnLimitExtCnt  += FdCheckLimit.nmbWarn;
+      alarmLimitExtCnt += FdCheckLimit.nmbAlarm;
+
+      CrSemServ3OperationExtendedHkParamGetHkVoltFeeVrd(&hkVoltFeeVrd, inPckt);
+      DEBUGP("hkVoltFeeVrd: %f\n", hkVoltFeeVrd);
+      CrIaPaste(VOLT_FEE_VRD_ID, &hkVoltFeeVrd);
+      /* Monitored by FdCheck SEM Limit Check */ 
+      FdCheckLimit = checkFloatSemLimit(VOLT_FEE_VRD_ID, hkVoltFeeVrd);
+      warnLimitExtCnt  += FdCheckLimit.nmbWarn;
+      alarmLimitExtCnt += FdCheckLimit.nmbAlarm;
+
+      CrSemServ3OperationExtendedHkParamGetHkVoltFeeVog(&hkVoltFeeVog, inPckt);
+      DEBUGP("hkVoltFeeVog: %f\n", hkVoltFeeVog);
+      CrIaPaste(VOLT_FEE_VOG_ID, &hkVoltFeeVog);
+      /* Monitored by FdCheck SEM Limit Check */
+      FdCheckLimit = checkFloatSemLimit(VOLT_FEE_VOG_ID, hkVoltFeeVog);
+      warnLimitExtCnt  += FdCheckLimit.nmbWarn;
+      alarmLimitExtCnt += FdCheckLimit.nmbAlarm;
+
+      CrSemServ3OperationExtendedHkParamGetHkVoltFeeVss(&hkVoltFeeVss, inPckt);
+      DEBUGP("hkVoltFeeVss: %f\n", hkVoltFeeVss);
+      CrIaPaste(VOLT_FEE_VSS_ID, &hkVoltFeeVss);
+      /* Monitored by FdCheck SEM Limit Check */
+      FdCheckLimit = checkFloatSemLimit(VOLT_FEE_VSS_ID, hkVoltFeeVss);
+      warnLimitExtCnt  += FdCheckLimit.nmbWarn;
+      alarmLimitExtCnt += FdCheckLimit.nmbAlarm;
+
+      CrSemServ3OperationExtendedHkParamGetHkVoltFeeCcd(&hkVoltFeeCcd, inPckt);
+      DEBUGP("hkVoltFeeCcd: %f\n", hkVoltFeeCcd);
+      CrIaPaste(VOLT_FEE_CCD_ID, &hkVoltFeeCcd);
+      /* Monitored by FdCheck SEM Limit Check */ 
+      FdCheckLimit = checkFloatSemLimit(VOLT_FEE_CCD_ID, hkVoltFeeCcd);
+      warnLimitExtCnt  += FdCheckLimit.nmbWarn;
+      alarmLimitExtCnt += FdCheckLimit.nmbAlarm;
+
+      CrSemServ3OperationExtendedHkParamGetHkVoltFeeClk(&hkVoltFeeClk, inPckt);
+      DEBUGP("hkVoltFeeClk: %f\n", hkVoltFeeClk);
+      CrIaPaste(VOLT_FEE_CLK_ID, &hkVoltFeeClk);
+      /* Monitored by FdCheck SEM Limit Check */ 
+      FdCheckLimit = checkFloatSemLimit(VOLT_FEE_CLK_ID, hkVoltFeeClk);
+      warnLimitExtCnt  += FdCheckLimit.nmbWarn;
+      alarmLimitExtCnt += FdCheckLimit.nmbAlarm;
+
+      CrSemServ3OperationExtendedHkParamGetHkVoltFeeAnaP5(&hkVoltFeeAnaP5, inPckt);
+      DEBUGP("hkVoltFeeAnaP5: %f\n", hkVoltFeeAnaP5);
+      CrIaPaste(VOLT_FEE_ANA_P5_ID, &hkVoltFeeAnaP5);
+      /* Monitored by FdCheck SEM Limit Check */ 
+      FdCheckLimit = checkFloatSemLimit(VOLT_FEE_ANA_P5_ID, hkVoltFeeAnaP5);
+      warnLimitExtCnt  += FdCheckLimit.nmbWarn;
+      alarmLimitExtCnt += FdCheckLimit.nmbAlarm;
+
+      CrSemServ3OperationExtendedHkParamGetHkVoltFeeAnaN5(&hkVoltFeeAnaN5, inPckt);
+      DEBUGP("hkVoltFeeAnaN5: %f\n", hkVoltFeeAnaN5);
+      CrIaPaste(VOLT_FEE_ANA_N5_ID, &hkVoltFeeAnaN5);
+      /* Monitored by FdCheck SEM Limit Check */ 
+      FdCheckLimit = checkFloatSemLimit(VOLT_FEE_ANA_N5_ID, hkVoltFeeAnaN5);
+      warnLimitExtCnt  += FdCheckLimit.nmbWarn;
+      alarmLimitExtCnt += FdCheckLimit.nmbAlarm;
+
+      CrSemServ3OperationExtendedHkParamGetHkVoltFeeDigP33(&hkVoltFeeDigP33, inPckt);
+      DEBUGP("hkVoltFeeDigP33: %f\n", hkVoltFeeDigP33);
+      CrIaPaste(VOLT_FEE_ANA_P3_3_ID, &hkVoltFeeDigP33);
+      /* Monitored by FdCheck SEM Limit Check */ 
+      FdCheckLimit = checkFloatSemLimit(VOLT_FEE_ANA_P3_3_ID, hkVoltFeeDigP33);
+      warnLimitExtCnt  += FdCheckLimit.nmbWarn;
+      alarmLimitExtCnt += FdCheckLimit.nmbAlarm;
+
+      /* NOTE: CHANGED in ICD DLR-INST-IC-001, issue 2.1 */
+      /* CURR_FEE_CLK_BUF  in SEM HK extended packet */
+
+      CrSemServ3OperationExtendedHkParamGetHkCurrFeeClkBuf(&hkCurrFeeClkBuf, inPckt);
+      DEBUGP("hkCurrFeeClkBuf: %f\n", hkCurrFeeClkBuf);
+      CrIaPaste(CURR_FEE_CLK_BUF_ID, &hkCurrFeeClkBuf);
+      /* Monitored by FdCheck SEM Limit Check */
+      FdCheckLimit = checkFloatSemLimit(CURR_FEE_CLK_BUF_ID, hkCurrFeeClkBuf);
+      warnLimitExtCnt  += FdCheckLimit.nmbWarn;
+      alarmLimitExtCnt += FdCheckLimit.nmbAlarm;
+
+      /* VOLT_PCU_P30      in SEM HK extended packet */
+      /* VOLT_PCU_P15      in SEM HK extended packet */
+      /* VOLT_PCU_P5       in SEM HK extended packet */
+      /* VOLT_PCU_N5       in SEM HK extended packet */
+      /* VOLT_PCU_P3_4     in SEM HK extended packet */
+      /* VOLT_PCU_P7       in SEM HK extended packet */
+
+      /* NOTE: CHANGED in ICD DLR-INST-IC-001, issue 2.1
+          CrSemServ3OperationExtendedHkParamGetHkVoltPcuP30(&hkVoltPcuP30, inPckt);
+          DEBUGP("hkVoltPcuP30: %f\n", hkVoltPcuP30);
+          CrIaPaste(VOLT_PCU_P30_ID, &hkVoltPcuP30);
+
+          CrSemServ3OperationExtendedHkParamGetHkVoltPcuP15(&hkVoltPcuP15, inPckt);
+          DEBUGP("hkVoltPcuP15: %f\n", hkVoltPcuP15);
+          CrIaPaste(VOLT_PCU_P15_ID, &hkVoltPcuP15);
+
+          CrSemServ3OperationExtendedHkParamGetHkVoltPcuP5(&hkVoltPcuP5, inPckt);
+          DEBUGP("hkVoltPcuP5: %f\n", hkVoltPcuP5);
+          CrIaPaste(VOLT_PCU_P5_ID, &hkVoltPcuP5);
+
+          CrSemServ3OperationExtendedHkParamGetHkVoltPcuN5(&hkVoltPcuN5, inPckt);
+          DEBUGP("hkVoltPcuN5: %f\n", hkVoltPcuN5);
+          CrIaPaste(VOLT_PCU_N5_ID, &hkVoltPcuN5);
+
+          CrSemServ3OperationExtendedHkParamGetHkVoltPcuP34(&hkVoltPcuP34, inPckt);
+          DEBUGP("hkVoltPcuP34: %f\n", hkVoltPcuP34);
+          CrIaPaste(VOLT_PCU_P3_4_ID, &hkVoltPcuP34);
+
+          CrSemServ3OperationExtendedHkParamGetHkVoltPcuP7(&hkVoltPcuP7, inPckt);
+          DEBUGP("hkVoltPcuP7: %f\n", hkVoltPcuP7);
+          CrIaPaste(VOLT_PCU_P7_ID, &hkVoltPcuP7);
+      */
+
+      /* NOTE: NEW in ICD DLR-INST-IC-001, issue 2.1 */
+      /* VOLT_SCU_FPGA_P1_5        in SEM HK extended packet */
+
+      CrSemServ3OperationExtendedHkParamGetHkVoltScuFpgaP15(&hkVoltScuFpgaP15, inPckt);
+      DEBUGP("hkVoltScuFpgaP15: %f\n", hkVoltScuFpgaP15);
+      CrIaPaste(VOLT_SCU_FPGA_P1_5_ID, &hkVoltScuFpgaP15);
+      /* Monitored by FdCheck SEM Limit Check */ 
+      FdCheckLimit = checkFloatSemLimit(VOLT_SCU_FPGA_P1_5_ID, hkVoltScuFpgaP15);
+      warnLimitExtCnt  += FdCheckLimit.nmbWarn;
+      alarmLimitExtCnt += FdCheckLimit.nmbAlarm;
+
+      /* NOTE: NEW in ICD DLR-INST-IC-001, issue 2.1 */
+      /* CURR_SCU_P3_4             in SEM HK extended packet */
+
+      CrSemServ3OperationExtendedHkParamGetHkCurrScuP34(&hkCurrScuP34, inPckt);
+      DEBUGP("hkCurrScuP34: %f\n", hkCurrScuP34);
+      CrIaPaste(CURR_SCU_P3_4_ID, &hkCurrScuP34);
+      /* Monitored by FdCheck SEM Limit Check */ 
+      FdCheckLimit = checkFloatSemLimit(CURR_SCU_P3_4_ID, hkCurrScuP34);
+      warnLimitExtCnt  += FdCheckLimit.nmbWarn;
+      alarmLimitExtCnt += FdCheckLimit.nmbAlarm;
+
+      /* STAT_NUM_SPW_ERR_CRE      in SEM HK extended packet */
+      /* STAT_NUM_SPW_ERR_ESC      in SEM HK extended packet */
+      /* STAT_NUM_SPW_ERR_DISC     in SEM HK extended packet */
+      /* STAT_NUM_SPW_ERR_PAR      in SEM HK extended packet */
+      /* STAT_NUM_SPW_ERR_WRSY     in SEM HK extended packet */
+      /* STAT_NUM_SPW_ERR_INVA     in SEM HK extended packet */
+      /* STAT_NUM_SPW_ERR_EOP      in SEM HK extended packet */
+      /* STAT_NUM_SPW_ERR_RXAH     in SEM HK extended packet */
+      /* STAT_NUM_SPW_ERR_TXAH     in SEM HK extended packet */
+      /* STAT_NUM_SPW_ERR_TXBL     in SEM HK extended packet */
+
+      CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrCredit(&hkStatNumSpwErrCredit, inPckt);
+      DEBUGP("hkStatNumSpwErrCredit: %d\n", hkStatNumSpwErrCredit);
+      CrIaPaste(STAT_NUM_SPW_ERR_CRE_ID, &hkStatNumSpwErrCredit);
+
+      CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrEscape(&hkStatNumSpwErrEscape, inPckt);
+      DEBUGP("hkStatNumSpwErrEscape: %d\n", hkStatNumSpwErrEscape);
+      CrIaPaste(STAT_NUM_SPW_ERR_ESC_ID, &hkStatNumSpwErrEscape);
+
+      CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrDisconnect(&hkStatNumSpwErrDisconnect, inPckt);
+      DEBUGP("hkStatNumSpwErrDisconnect: %d\n", hkStatNumSpwErrDisconnect);
+      CrIaPaste(STAT_NUM_SPW_ERR_DISC_ID, &hkStatNumSpwErrDisconnect);
+
+      CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrParity(&hkStatNumSpwErrParity, inPckt);
+      DEBUGP("hkStatNumSpwErrParity: %d\n", hkStatNumSpwErrParity);
+      CrIaPaste(STAT_NUM_SPW_ERR_PAR_ID, &hkStatNumSpwErrParity);
+
+      CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrWriteSync(&hkStatNumSpwErrWriteSync, inPckt);
+      DEBUGP("hkStatNumSpwErrWriteSync: %d\n", hkStatNumSpwErrWriteSync);
+      CrIaPaste(STAT_NUM_SPW_ERR_WRSY_ID, &hkStatNumSpwErrWriteSync);
+
+      CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrInvalidAddress(&hkStatNumSpwErrInvalidAddress, inPckt);
+      DEBUGP("hkStatNumSpwErrInvalidAddress: %d\n", hkStatNumSpwErrInvalidAddress);
+      CrIaPaste(STAT_NUM_SPW_ERR_INVA_ID, &hkStatNumSpwErrInvalidAddress);
+
+      CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrEopeep(&hkStatNumSpwErrEopeep, inPckt);
+      DEBUGP("hkStatNumSpwErrEopeep: %d\n", hkStatNumSpwErrEopeep);
+      CrIaPaste(STAT_NUM_SPW_ERR_EOP_ID, &hkStatNumSpwErrEopeep);
+
+      CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrRxAhb(&hkStatNumSpwErrRxAhb, inPckt);
+      DEBUGP("hkStatNumSpwErrRxAhb: %d\n", hkStatNumSpwErrRxAhb);
+      CrIaPaste(STAT_NUM_SPW_ERR_RXAH_ID, &hkStatNumSpwErrRxAhb);
+
+      CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrTxAhb(&hkStatNumSpwErrTxAhb, inPckt);
+      DEBUGP("hkStatNumSpwErrTxAhb: %d\n", hkStatNumSpwErrTxAhb);
+      CrIaPaste(STAT_NUM_SPW_ERR_TXAH_ID, &hkStatNumSpwErrTxAhb);
+
+      CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrTxBlocked(&hkStatNumSpwErrTxBlocked, inPckt);
+      DEBUGP("hkStatNumSpwErrTxBlocked: %d\n", hkStatNumSpwErrTxBlocked);
+      CrIaPaste(STAT_NUM_SPW_ERR_TXBL_ID, &hkStatNumSpwErrTxBlocked);
+
+      /* NOTE: NEW in ICD DLR-INST-IC-001, issue 2.1 */
+      /* STAT_NUM_SPW_ERR_TXLE     in SEM HK extended packet */
+      /* STAT_NUM_SPW_ERR_RX       in SEM HK extended packet */
+      /* STAT_NUM_SPW_ERR_TX       in SEM HK extended packet */
+
+      CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrTxle(&hkStatNumSpwErrTxle, inPckt);
+      DEBUGP("hkStatNumSpwErrTxle: %d\n", hkStatNumSpwErrTxle);
+      CrIaPaste(STAT_NUM_SPW_ERR_TXLE_ID, &hkStatNumSpwErrTxle);
+
+      CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrRx(&hkStatNumSpwErrRx, inPckt);
+      DEBUGP("hkStatNumSpwErrRx: %d\n", hkStatNumSpwErrRx);
+      CrIaPaste(STAT_NUM_SP_ERR_RX_ID, &hkStatNumSpwErrRx);
+
+      CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrTx(&hkStatNumSpwErrTx, inPckt);
+      DEBUGP("hkStatNumSpwErrTx: %d\n", hkStatNumSpwErrTx);
+      CrIaPaste(STAT_NUM_SP_ERR_TX_ID, &hkStatNumSpwErrTx);
+
+      /* NOTE: NEW in ICD DLR-INST-IC-001, issue 2.1 */
+      /* STAT_HEAT_PWM_FPA_CCD     in SEM HK extended packet */
+      /* STAT_HEAT_PWM_FEE_STRAP   in SEM HK extended packet */
+      /* STAT_HEAT_PWM_FEE_ANACH   in SEM HK extended packet */
+      /* STAT_HEAT_PWM_SPARE       in SEM HK extended packet */
+
+      CrSemServ3OperationExtendedHkParamGetHkStatHeatPwmFpaCcd(&hkStatHeatPwmFpaCcd, inPckt);
+      DEBUGP("hkStatHeatPwmFpaCcd: %d\n", hkStatHeatPwmFpaCcd);
+      CrIaPaste(STAT_HEAT_PWM_FPA_CCD_ID, &hkStatHeatPwmFpaCcd);
+
+      CrSemServ3OperationExtendedHkParamGetHkStatHeatPwmFeeStrap(&hkStatHeatPwmFeeStrap, inPckt);
+      DEBUGP("hkStatHeatPwmFeeStrap: %d\n", hkStatHeatPwmFeeStrap);
+      CrIaPaste(STAT_HEAT_PWM_FEE_STR_ID, &hkStatHeatPwmFeeStrap);
+
+      CrSemServ3OperationExtendedHkParamGetHkStatHeatPwmFeeAnach(&hkStatHeatPwmFeeAnach, inPckt);
+      DEBUGP("hkStatHeatPwmFeeAnach: %d\n", hkStatHeatPwmFeeAnach);
+      CrIaPaste(STAT_HEAT_PWM_FEE_ANA_ID, &hkStatHeatPwmFeeAnach);
+
+      CrSemServ3OperationExtendedHkParamGetHkStatHeatPwmSpare(&hkStatHeatPwmSpare, inPckt);
+      DEBUGP("hkStatHeatPwmSpare: %d\n", hkStatHeatPwmSpare);
+      CrIaPaste(STAT_HEAT_PWM_SPARE_ID, &hkStatHeatPwmSpare);
+
+      /* NOTE: NEW in ICD DLR-INST-IC-001, issue 2.1 */
+      /* STAT_BITS       in SEM HK extended packet */
+
+      CrSemServ3OperationExtendedHkParamGetHkStatBits(&hkStatBits, inPckt);
+      DEBUGP("hkStatBits: %d\n", hkStatBits);
+      CrIaPaste(STAT_HEAT_PWM_FLAGS_ID, &hkStatBits);
+
+      /* ### STAT_BITS ### */
+
+      /* STAT_HEAT_POW_FPA_CCD     in SEM HK extended packet */
+      /* STAT_HEAT_POW_FEE_STRAP   in SEM HK extended packet */
+      /* STAT_HEAT_POW_FEE_ANACH   in SEM HK extended packet */
+      /* STAT_HEAT_POW_SPARE       in SEM HK extended packet */
+
+      /* ####################### */
+
+
+      /* NOTE: NEW in ICD DLR-INST-IC-001, issue 2.1 */
+      /* STAT_OBTIME_SYNC_DELTA    in SEM HK extended packet */
+
+      CrSemServ3OperationExtendedHkParamGetHkStatOBTimeSyncDelta(&hkStatOBTimeSyncDelta, inPckt);
+      DEBUGP("hkStatOBTimeSyncDelta: %d\n", hkStatOBTimeSyncDelta);
+      CrIaPaste(STAT_OBTIME_SYNC_DELTA_ID, &hkStatOBTimeSyncDelta);
+
+      /* FdCheck SEM Limit Check */
+      if (warnLimitExtCnt > 0)       /* Mantis 2182 */
+	{
+	  warnLimitExt[0] = 1;
+	}
+      else
+	{
+	  warnLimitExt[0] = 0;
+	}
+
+      warnLimitExtCnt = sumWarnLimits(0); /* Extended HK */
+      DEBUGP("CrSemServ3DatHkUpdateAction() EXT HK - warn (%d), alarm (%d), sum = %d\n", warnLimitExt[0], alarmLimitExtCnt, warnLimitExtCnt);
+
+    }
+
+  inData->outcome = 1;
+
+  return;
+
+}
+
diff --git a/CrIa/src/Services/CrSemServ3HousekeepingDataReportingService/InRep/CrSemServ3DatHk.h b/CrIa/src/Services/CrSemServ3HousekeepingDataReportingService/InRep/CrSemServ3DatHk.h
new file mode 100644
index 0000000..559db3f
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ3HousekeepingDataReportingService/InRep/CrSemServ3DatHk.h
@@ -0,0 +1,38 @@
+/**
+ * @file CrSemServ3DatHk.h
+ *
+ * Declaration of the DAT HK in-coming report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRSEM_SERV3_DAT_HK_H
+#define CRSEM_SERV3_DAT_HK_H
+
+#include "FwProfile/FwSmCore.h"
+#include "CrFwConstants.h"
+
+
+void ClearWarnLimit (void);
+
+void ClearAliveLimit (void);
+
+
+/**
+ * Validity check of the DAT HK in-coming report packet.
+ * Compute the CRC for the report and returns true if the CRC is correct and false otherwise.
+ * @param smDesc the state machine descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrSemServ3DatHkValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Update action of the DAT HK in-coming report packet.
+ * The Update Action of incoming service 3 reports shall run the SEM HK Update Procedure.
+ * @param prDesc the procedure descriptor
+ */
+void CrSemServ3DatHkUpdateAction(FwPrDesc_t prDesc);
+
+#endif /* CRSEM_SERV3_DAT_HK_H */
+
diff --git a/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrHighSev.c b/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrHighSev.c
new file mode 100644
index 0000000..abcadf2
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrHighSev.c
@@ -0,0 +1,103 @@
+/**
+ * @file CrSemServ5EvtErrHighSev.c
+ * @ingroup CrIaServicesSem
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the SEM DAT Event Error Report - High Severity in-coming report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrSemServ5EvtErrHighSev.h"
+
+#include "../../../IfswDebug.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+#include <Services/General/CrIaParamSetter.h>
+#include <Services/General/CrIaParamGetter.h>
+#include <Services/General/CrSemParamGetter.h>
+
+#include <CrIaIasw.h>
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+#include <CrIaPckt.h>
+
+/* send function in the 5,1 forward */
+#include <OutStream/CrFwOutStream.h>
+
+#include <CrIaPrSm/CrIaFdCheckCreate.h> /* for CrIaFdCheck_DISABLED */
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+extern unsigned short SemAnoEvtId; /* used for FdCheck SEM Anomaly Event */
+
+
+/**
+ * @brief Update action of the Service 5 SEM DAT Event Error Report - High Severity in-coming report
+ *
+ * @note The implementation is not realized using the described framework procedure in the specification document CHEOPS-PNP-INST-RS-001.
+ *
+ * Following steps are executed:
+ * - Push event report onto SEM Event Store
+ * if forwarding of SEM event report is enabled:
+ * - Forward event report to Ground
+ *
+ * @param[in]  prDesc procedure descriptor
+ * @param[out] none
+ */
+void CrSemServ5EvtErrHighSevUpdateAction(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t* inData;
+  CrFwInRepData_t* inSpecificData;
+  CrFwPckt_t inPckt;
+  unsigned char semS54flag;
+  unsigned short hkEventProgId;
+  unsigned int semEvtCnt;
+
+  /* The Update Action of incoming service 5 reports shall run the SEM Event Update Procedure. */
+
+  /* Get in packet */
+  inData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+  inSpecificData = (CrFwInRepData_t*)(inData->cmpSpecificData);
+  inPckt = inSpecificData->pckt;
+
+  /* Get InRep eventId */
+  CrSemServ5EvtErrHighSevParamGetHkEventProgId(&hkEventProgId, inPckt);
+  DEBUGP("Event ID: %d\n", hkEventProgId);
+
+  if (FwSmGetCurState(smDescFdSemAnomalyEventCheck) != CrIaFdCheck_DISABLED)
+    {
+      SemAnoEvtId = getSemAnoEvtId(hkEventProgId);
+    }
+
+  /* Increment the SEM Event Counter (Mantis 1764) */
+  CrIaCopy(SEMEVTCOUNTER_ID, &semEvtCnt);
+  semEvtCnt++;
+  CrIaPaste(SEMEVTCOUNTER_ID, &semEvtCnt);
+
+  /* Check, if SEM_SERV5_4_FORWARD is enabled */
+  CrIaCopy(SEM_SERV5_4_FORWARD_ID, &semS54flag);
+  DEBUGP("semS54flag: %d\n", semS54flag);
+  if (semS54flag==1)
+    {
+      CrFwOutStreamSend (outStreamGrd, inPckt);
+    }
+  else
+    {
+      DEBUGP("No packet sent!\n");
+    }
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrHighSev.h b/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrHighSev.h
new file mode 100644
index 0000000..a8d0e24
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrHighSev.h
@@ -0,0 +1,32 @@
+/**
+ * @file CrSemServ5EvtErrHighSev.h
+ *
+ * Declaration of the Error Report - High Severity in-coming report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRSEM_SERV5_EVT_ERR_HIGH_SEV_H
+#define CRSEM_SERV5_EVT_ERR_HIGH_SEV_H
+
+#include "FwProfile/FwSmCore.h"
+#include "CrFwConstants.h"
+
+/**
+ * Validity check of the Error Report - High Severity in-coming report packet.
+ * Compute the CRC for the report and returns true if the CRC is correct and false otherwise.
+ * @param smDesc the state machine descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrSemServ5EvtErrHighSevValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Update action of the Error Report - High Severity in-coming report packet.
+ * The Update Action of incoming service 5 reports shall run the SEM Event Update Procedure.
+ * @param prDesc the procedure descriptor
+ */
+void CrSemServ5EvtErrHighSevUpdateAction(FwPrDesc_t prDesc);
+
+#endif /* CRSEM_SERV5_EVT_ERR_HIGH_SEV_H */
+
diff --git a/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrLowSev.c b/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrLowSev.c
new file mode 100644
index 0000000..ea63e9a
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrLowSev.c
@@ -0,0 +1,103 @@
+/**
+ * @file CrSemServ5EvtErrLowSev.c
+ * @ingroup CrIaServicesSem
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the SEM DAT Event Error Report - Low Severity in-coming report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrSemServ5EvtErrLowSev.h"
+
+#include "../../../IfswDebug.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+#include <Services/General/CrIaParamSetter.h>
+#include <Services/General/CrIaParamGetter.h>
+#include <Services/General/CrSemParamGetter.h>
+
+#include <CrIaIasw.h>
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+#include <CrIaPckt.h>
+
+/* send function in the 5,1 forward */
+#include <OutStream/CrFwOutStream.h>
+
+#include <CrIaPrSm/CrIaFdCheckCreate.h> /* for CrIaFdCheck_DISABLED */
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+extern unsigned short SemAnoEvtId; /* used for FdCheck SEM Anomaly Event */
+
+
+/**
+ * @brief Update action of the Service 5 SEM DAT Event Error Report - Low Severity in-coming report
+ *
+ * @note The implementation is not realized using the described framework procedure in the specification document CHEOPS-PNP-INST-RS-001.
+ *
+ * Following steps are executed:
+ * - Push event report onto SEM Event Store
+ * if forwarding of SEM event report is enabled:
+ * - Forward event report to Ground
+ *
+ * @param[in]  prDesc procedure descriptor
+ * @param[out] none
+ */
+void CrSemServ5EvtErrLowSevUpdateAction(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t* inData;
+  CrFwInRepData_t* inSpecificData;
+  CrFwPckt_t inPckt;
+  unsigned char semS52flag;
+  unsigned short hkEventProgId;
+  unsigned int semEvtCnt;
+
+  /* The Update Action of incoming service 5 reports shall run the SEM Event Update Procedure. */
+
+  /* Get in packet */
+  inData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+  inSpecificData = (CrFwInRepData_t*)(inData->cmpSpecificData);
+  inPckt = inSpecificData->pckt;
+
+  /* Get InRep eventId */
+  CrSemServ5EvtErrLowSevParamGetHkEventProgId(&hkEventProgId, inPckt);
+  DEBUGP("Event ID: %d\n", hkEventProgId);
+
+  if (FwSmGetCurState(smDescFdSemAnomalyEventCheck) != CrIaFdCheck_DISABLED)
+    {
+      SemAnoEvtId = getSemAnoEvtId(hkEventProgId);
+    }
+
+  /* Increment the SEM Event Counter (Mantis 1764) */
+  CrIaCopy(SEMEVTCOUNTER_ID, &semEvtCnt);
+  semEvtCnt++;
+  CrIaPaste(SEMEVTCOUNTER_ID, &semEvtCnt);
+
+  /* Check, if SEM_SERV5_2_FORWARD is enabled */
+  CrIaCopy(SEM_SERV5_2_FORWARD_ID, &semS52flag);
+  DEBUGP("semS52flag: %d\n", semS52flag);
+  if (semS52flag==1)
+    {
+      CrFwOutStreamSend (outStreamGrd, inPckt);
+    }
+  else
+    {
+      DEBUGP("No packet sent!\n");
+    }
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrLowSev.h b/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrLowSev.h
new file mode 100644
index 0000000..a70a82a
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrLowSev.h
@@ -0,0 +1,32 @@
+/**
+ * @file CrSemServ5EvtErrLowSev.h
+ *
+ * Declaration of the Error Report - Low Severity in-coming report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRSEM_SERV5_EVT_ERR_LOW_SEV_H
+#define CRSEM_SERV5_EVT_ERR_LOW_SEV_H
+
+#include "FwProfile/FwSmCore.h"
+#include "CrFwConstants.h"
+
+/**
+ * Validity check of the Error Report - Low Severity in-coming report packet.
+ * Compute the CRC for the report and returns true if the CRC is correct and false otherwise.
+ * @param smDesc the state machine descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrSemServ5EvtErrLowSevValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Update action of the Error Report - Low Severity in-coming report packet.
+ * The Update Action of incoming service 5 reports shall run the SEM Event Update Procedure.
+ * @param prDesc the procedure descriptor
+ */
+void CrSemServ5EvtErrLowSevUpdateAction(FwPrDesc_t prDesc);
+
+#endif /* CRSEM_SERV5_EVT_ERR_LOW_SEV_H */
+
diff --git a/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrMedSev.c b/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrMedSev.c
new file mode 100644
index 0000000..47d0f88
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrMedSev.c
@@ -0,0 +1,103 @@
+/**
+ * @file CrSemServ5EvtErrMedSev.c
+ * @ingroup CrIaServicesSem
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the SEM DAT Event Error Report - Medium Severity in-coming report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrSemServ5EvtErrMedSev.h"
+
+#include "../../../IfswDebug.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+#include <Services/General/CrIaParamSetter.h>
+#include <Services/General/CrIaParamGetter.h>
+#include <Services/General/CrSemParamGetter.h>
+
+#include <CrIaIasw.h>
+#include <CrIaInCmp.h>
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+#include <CrIaPckt.h>
+
+/* send function in the 5,1 forward */
+#include <OutStream/CrFwOutStream.h>
+
+#include <CrIaPrSm/CrIaFdCheckCreate.h> /* for CrIaFdCheck_DISABLED */
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+extern unsigned short SemAnoEvtId; /* used for FdCheck SEM Anomaly Event */
+
+
+/**
+ * @brief Update action of the Service 5 SEM DAT Event Error Report - Medium Severity in-coming report
+ *
+ * @note The implementation is not realized using the described framework procedure in the specification document CHEOPS-PNP-INST-RS-001.
+ *
+ * Following steps are executed:
+ * - Push event report onto SEM Event Store
+ * if forwarding of SEM event report is enabled:
+ * - Forward event report to Ground
+ *
+ * @param[in]  prDesc procedure descriptor
+ * @param[out] none
+ */
+void CrSemServ5EvtErrMedSevUpdateAction(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t* inData;
+  CrFwInRepData_t* inSpecificData;
+  CrFwPckt_t inPckt;
+  unsigned char semS53flag;
+  unsigned short hkEventProgId;
+  unsigned int semEvtCnt;
+
+  /* The Update Action of incoming service 5 reports shall run the SEM Event Update Procedure. */
+
+  /* Get in packet */
+  inData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+  inSpecificData = (CrFwInRepData_t*)(inData->cmpSpecificData);
+  inPckt = inSpecificData->pckt;
+
+  /* Get InRep eventId */
+  CrSemServ5EvtErrMedSevParamGetHkEventProgId(&hkEventProgId, inPckt);
+  DEBUGP("Event ID: %d\n", hkEventProgId);
+
+  if (FwSmGetCurState(smDescFdSemAnomalyEventCheck) != CrIaFdCheck_DISABLED)
+    {
+      SemAnoEvtId = getSemAnoEvtId(hkEventProgId);
+    }
+
+  /* Increment the SEM Event Counter (Mantis 1764) */
+  CrIaCopy(SEMEVTCOUNTER_ID, &semEvtCnt);
+  semEvtCnt++;
+  CrIaPaste(SEMEVTCOUNTER_ID, &semEvtCnt);
+
+  /* Check, if SEM_SERV5_3_FORWARD is enabled */
+  CrIaCopy(SEM_SERV5_3_FORWARD_ID, &semS53flag);
+  DEBUGP("semS53flag: %d\n", semS53flag);
+  if (semS53flag==1)
+    {
+      CrFwOutStreamSend (outStreamGrd, inPckt);
+    }
+  else
+    {
+      DEBUGP("No packet sent!\n");
+    }
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrMedSev.h b/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrMedSev.h
new file mode 100644
index 0000000..1fb4f14
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtErrMedSev.h
@@ -0,0 +1,32 @@
+/**
+ * @file CrSemServ5EvtErrMedSev.h
+ *
+ * Declaration of the Error Report - Medium Severity in-coming report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRSEM_SERV5_EVT_ERR_MED_SEV_H
+#define CRSEM_SERV5_EVT_ERR_MED_SEV_H
+
+#include "FwProfile/FwSmCore.h"
+#include "CrFwConstants.h"
+
+/**
+ * Validity check of the Error Report - Medium Severity in-coming report packet.
+ * Compute the CRC for the report and returns true if the CRC is correct and false otherwise.
+ * @param smDesc the state machine descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrSemServ5EvtErrMedSevValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Update action of the Error Report - Medium Severity in-coming report packet.
+ * The Update Action of incoming service 5 reports shall run the SEM Event Update Procedure.
+ * @param prDesc the procedure descriptor
+ */
+void CrSemServ5EvtErrMedSevUpdateAction(FwPrDesc_t prDesc);
+
+#endif /* CRSEM_SERV5_EVT_ERR_MED_SEV_H */
+
diff --git a/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtNorm.c b/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtNorm.c
new file mode 100644
index 0000000..a900b30
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtNorm.c
@@ -0,0 +1,228 @@
+/**
+ * @file CrSemServ5EvtNorm.c
+ * @ingroup CrIaServicesSem
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the SEM Event Normal/Progress Report in-coming report packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrSemServ5EvtNorm.h"
+
+#include "../../../IfswDebug.h"
+
+#include <FwProfile/FwPrConfig.h>
+#include <FwProfile/FwSmConfig.h>
+#include <Services/General/CrIaParamSetter.h>
+#include <Services/General/CrIaParamGetter.h>
+#include <Services/General/CrSemParamGetter.h>
+#include <Services/General/CrSemConstants.h>
+
+#include <CrIaIasw.h>
+#include <CrIaInCmp.h>
+/*#include <CrIaPrSm/CrIaSemCreate.h> */
+#include <CrFwCmpData.h>
+#include <IfswUtilities.h>
+#include <CrIaPckt.h>
+#include <byteorder.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <CrIaSemEvents.h>
+
+/* send function in the 5,1 forward */
+#include <OutStream/CrFwOutStream.h>
+
+/* imported globals */
+extern unsigned short SemTransition;
+extern CrFwBool_t signalSemStateStandby;
+unsigned char CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_SAFE_SET; /* needed for FdCheck SAFE Mode */
+unsigned char CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_SAFE_FD_SET; /* needed for FdCheck SEM Mode Time-Out */
+unsigned char CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_STAB_SET; /* needed for FdCheck SEM Mode Time-Out */
+unsigned char CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_CCDWIN_SET; /* needed for FdCheck SEM Mode Time-Out */
+unsigned char CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_CCDFULL_SET; /* needed for FdCheck SEM Mode Time-Out */
+unsigned char CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_DIAG_SET; /* needed for FdCheck SEM Mode Time-Out */
+unsigned char CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_STANDBY_SET; /* needed for FdCheck SEM Mode Time-Out */
+unsigned char CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_INIT_SET; /* needed for FdCheck SEM Mode Time-Out */
+unsigned char CRSEM_SERV5_EVENT_PRG_THERMAL_STABILITY_FD_SET; /* needed for FdCheck SEM Mode Time-Out */	
+unsigned char CRSEM_SERV5_EVENT_PRG_CFG_LOAD_READY_FD_SET; /* needed for FdCheck SEM Mode Time-Out */
+
+
+/**
+ * @brief Update action of the Service 5 SEM Event Normal/Progress Report in-coming report
+ *
+ * @note The implementation is not realized using the described framework procedure in the specification document CHEOPS-PNP-INST-RS-001.
+ *
+ * Following steps are executed:
+ * - Push event report onto SEM Event Store
+ * - Set event flag according to event ProgID
+ * if forwarding of SEM event report is enabled:
+ * - Forward event report to Ground
+ *
+ * @param[in]  prDesc procedure descriptor
+ * @param[out] none
+ */
+void CrSemServ5EvtNormUpdateAction(FwPrDesc_t prDesc)
+{
+  CrFwCmpData_t* inData;
+  CrFwInRepData_t* inSpecificData;
+  CrFwPckt_t inPckt;
+  unsigned char semS51flag;
+  unsigned short hkEventProgId;
+  unsigned int semEvtCnt;
+
+  /* The Update Action of incoming service 5 reports shall run the SEM Event Update Procedure. */
+
+  /* Get in packet */
+  inData = (CrFwCmpData_t*)FwPrGetData(prDesc);
+  inSpecificData = (CrFwInRepData_t*)(inData->cmpSpecificData);
+  inPckt = inSpecificData->pckt;
+
+  /* Get InRep eventId */
+  CrSemServ5EvtNormParamGetHkEventProgId(&hkEventProgId, inPckt);
+  DEBUGP("Event ID: %d\n", hkEventProgId);
+
+  /* Set event flag according to ID */
+  if (hkEventProgId == CRSEM_SERV5_EVENT_PRG_PBS_BOOT_READY)
+    CRSEM_SERV5_EVENT_PRG_PBS_BOOT_READY_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_PRG_APS_BOOT_READY)
+    CRSEM_SERV5_EVENT_PRG_APS_BOOT_READY_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION)
+    {
+      CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_SET = 1;
+      /* NOTE: there can only be up to a single pending mode transition at any given time */
+      CrSemServ5EventPrgModeTransitionParamGetHkStatCurrentMode(&SemTransition, inPckt);
+      /* set flag, if SEM signals entry in SAFE mode; used for FdCheck SEM Mode Time-Out and FdCheck SAFE Mode */
+      if (SemTransition == SEM_STATE_SAFE)
+        {
+          CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_SAFE_SET = 1;
+          CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_SAFE_FD_SET = 1;
+        }
+      /* set flag, if SEM signals entry in STABILIZE mode; used for FdCheck SEM Mode Time-Out */
+      if (SemTransition == SEM_STATE_STABILIZE)
+        CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_STAB_SET = 1;
+      /* set flag, if SEM signals entry in CCD WINDOW mode; used for FdCheck SEM Mode Time-Out */
+      if ((SemTransition == SEM_STATE_SC_STAR_FAINT) || (SemTransition == SEM_STATE_SC_STAR_BRIGHT) || (SemTransition == SEM_STATE_SC_STAR_ULTBRT))
+        CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_CCDWIN_SET = 1;
+      /* set flag, if SEM signals entry in CCD FULL mode; used for FdCheck SEM Mode Time-Out */
+      if (SemTransition == SEM_STATE_CCD_FULL)
+        CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_CCDFULL_SET = 1;
+      /* set flag, if SEM signals entry in DIAGNOSTIC mode; used for FdCheck SEM Mode Time-Out */
+      if (SemTransition == SEM_STATE_DIAGNOSTIC)
+        CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_DIAG_SET = 1;
+      /* set flag, if SEM signals entry in STANDBY mode; used for FdCheck SEM Mode Time-Out */
+      if (SemTransition == SEM_STATE_STANDBY && signalSemStateStandby)
+        {
+          CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_TO_STANDBY_SET = 1;
+        }
+      else
+        {
+          signalSemStateStandby = 1;
+        }
+    }
+  if (hkEventProgId == CRSEM_SERV5_EVENT_PRG_DIAGNOSE_STEP_FINISHED)
+    CRSEM_SERV5_EVENT_PRG_DIAGNOSE_STEP_FINISHED_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_PRG_THERMAL_STABILITY)
+    {
+      CRSEM_SERV5_EVENT_PRG_THERMAL_STABILITY_SET = 1;
+      /* set flag, if DAT_Event_Progress(TempStable) from SEM is received; used for FdCheck SEM Mode Time-Out */
+      CRSEM_SERV5_EVENT_PRG_THERMAL_STABILITY_FD_SET = 1;
+    }
+  if (hkEventProgId == CRSEM_SERV5_EVENT_PRG_CFG_LOAD_READY)
+    {
+      CRSEM_SERV5_EVENT_PRG_CFG_LOAD_READY_SET = 1;
+      /* set flag, if DAT_Event_Progress(CFGLoadReady) from SEM is received; used for FdCheck SEM Mode Time-Out */
+      CRSEM_SERV5_EVENT_PRG_CFG_LOAD_READY_FD_SET = 1;
+    }
+  if (hkEventProgId == CRSEM_SERV5_EVENT_PRG_FPA_TEMP_NOMINAL)
+    CRSEM_SERV5_EVENT_PRG_FPA_TEMP_NOMINAL_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_WAR_EEPROM_NO_SEGMENT)
+    CRSEM_SERV5_EVENT_WAR_EEPROM_NO_SEGMENT_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_EXE)
+    CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_EXE_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_CFG)
+    CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_CFG_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_WAR_EEPROM_NO_PBS_CFG)
+    CRSEM_SERV5_EVENT_WAR_EEPROM_NO_PBS_CFG_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_EXE_FLAG)
+    CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_EXE_FLAG_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_CFG_FLAG)
+    CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_CFG_FLAG_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_WAR_NO_THERMAL_STABILITY)
+    CRSEM_SERV5_EVENT_WAR_NO_THERMAL_STABILITY_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_WAR_FPA_TEMP_TOO_HIGH)
+    CRSEM_SERV5_EVENT_WAR_FPA_TEMP_TOO_HIGH_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_WAR_WRONG_EXPOSURE_TIME)
+    CRSEM_SERV5_EVENT_WAR_WRONG_EXPOSURE_TIME_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_WAR_WRONG_REPETITION_PERIOD)
+    CRSEM_SERV5_EVENT_WAR_WRONG_REPETITION_PERIOD_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVT_WAR_PATTER)
+    CRSEM_SERV5_EVENT_WAR_FPM_OFF_ONLY_PATTERN_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVT_WAR_PACKWR)
+    CRSEM_SERV5_EVENT_WAR_PACK_ENCODE_FAILURE_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_ERR_EEPROM_WRITE_ERROR)
+    CRSEM_SERV5_EVENT_ERR_EEPROM_WRITE_ERROR_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_ERR_APS_BOOT_FAILURE)
+    CRSEM_SERV5_EVENT_ERR_APS_BOOT_FAILURE_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_ERR_UNEXPECTED_REBOOT)
+    CRSEM_SERV5_EVENT_ERR_UNEXPECTED_REBOOT_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_ERR_WATCHDOG_FAILURE)
+    CRSEM_SERV5_EVENT_ERR_WATCHDOG_FAILURE_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_ERR_CMD_SPW_RX_ERROR)
+    CRSEM_SERV5_EVENT_ERR_CMD_SPW_RX_ERROR_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_ERR_EEPROM_EXE_SEG_COPY_ABORT)
+    CRSEM_SERV5_EVENT_ERR_EEPROM_EXE_SEG_COPY_ABORT_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_ERR_EEPROM_EXE_SEG_CRC_WRONG)
+    CRSEM_SERV5_EVENT_ERR_EEPROM_EXE_SEG_CRC_WRONG_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_ERR_EEPROM_PBS_CFG_SIZE_WRONG)
+    CRSEM_SERV5_EVENT_ERR_EEPROM_PBS_CFG_SIZE_WRONG_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_ERR_WRITING_REGISTER_FAILED)
+    CRSEM_SERV5_EVENT_ERR_WRITING_REGISTER_FAILED_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_ERR_CMD_BUFFER_1_FULL)
+    CRSEM_SERV5_EVENT_ERR_CMD_BUFFER_1_FULL_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVENT_ERR_CMD_BUFFER_2_FULL)
+    CRSEM_SERV5_EVENT_ERR_CMD_BUFFER_2_FULL_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVT_ERR_DAT_DMA)
+    CRSEM_SERV5_EVENT_ERR_DMA_DATA_TRANSF_FAIL_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVT_ERR_BIAS_SET)
+    CRSEM_SERV5_EVENT_ERR_DATA_BIAS_VOLT_WRONG_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVT_ERR_SYNC)
+    CRSEM_SERV5_EVENT_ERR_FEESCU_SYNC_FAIL_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVT_ERR_SCRIPT)
+    CRSEM_SERV5_EVENT_ERR_FEE_SCRIPT_ERROR_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVT_ERR_PWR)
+    CRSEM_SERV5_EVENT_ERR_SCU_POWER_SWITCH_FAIL_SET = 1;
+  if (hkEventProgId == CRSEM_SERV5_EVT_ERR_SPW_TC)
+    CRSEM_SERV5_EVENT_ERR_SPW_TIME_CODE_MISS_SET = 1;
+
+  /* Increment the SEM Event Counter (Mantis 1764) */
+  CrIaCopy(SEMEVTCOUNTER_ID, &semEvtCnt);
+  semEvtCnt++;
+  CrIaPaste(SEMEVTCOUNTER_ID, &semEvtCnt);
+
+  /* Check SEM_SERV5_1_FORWARD */
+  CrIaCopy(SEM_SERV5_1_FORWARD_ID, &semS51flag);
+  DEBUGP("semS51flag: %d\n", semS51flag);
+
+  if (semS51flag==1)
+    {
+      CrFwOutStreamSend (outStreamGrd, inPckt);
+    }
+  else
+    {
+      DEBUGP("No packet sent!\n");
+    }
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtNorm.h b/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtNorm.h
new file mode 100644
index 0000000..3cdcc60
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ5EventReportingService/InRep/CrSemServ5EvtNorm.h
@@ -0,0 +1,32 @@
+/**
+ * @file CrSemServ5EvtNorm.h
+ *
+ * Declaration of the Normal/Progress Report in-coming report packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRSEM_SERV5_EVT_NORM_H
+#define CRSEM_SERV5_EVT_NORM_H
+
+#include "FwProfile/FwSmCore.h"
+#include "CrFwConstants.h"
+
+/**
+ * Validity check of the Normal/Progress Report in-coming report packet.
+ * Compute the CRC for the report and returns true if the CRC is correct and false otherwise.
+ * @param smDesc the state machine descriptor
+ * @return the validity check result
+ */
+CrFwBool_t CrSemServ5EvtNormValidityCheck(FwPrDesc_t prDesc);
+
+/**
+ * Update action of the Normal/Progress Report in-coming report packet.
+ * The Update Action of incoming service 5 reports shall run the SEM Event Update Procedure.
+ * @param prDesc the procedure descriptor
+ */
+void CrSemServ5EvtNormUpdateAction(FwPrDesc_t prDesc);
+
+#endif /* CRSEM_SERV5_EVT_NORM_H */
+
diff --git a/CrIa/src/Services/CrSemServ9HousekeepingDataReportingService/OutCmd/CrSemServ9CmdTimeUpdate.c b/CrIa/src/Services/CrSemServ9HousekeepingDataReportingService/OutCmd/CrSemServ9CmdTimeUpdate.c
new file mode 100644
index 0000000..e84f438
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ9HousekeepingDataReportingService/OutCmd/CrSemServ9CmdTimeUpdate.c
@@ -0,0 +1,97 @@
+/**
+ * @file CrSemServ9CmdTimeUpdate.c
+ * @ingroup CrIaServicesSem
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the SEM CMD Time Update out-going command packet.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrSemServ9CmdTimeUpdate.h"
+
+#include <Services/General/CrSemParamSetter.h>
+
+#include <CrIaPrSm/CrIaSemCreate.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include "../../../IfswDebug.h"
+
+#if(__sparc__)
+#include <ibsw_interface.h>
+#else
+#include <CrIaIasw.h>
+#endif
+
+
+CrFwBool_t CrSemServ9CmdTimeUpdateEnableCheck(FwSmDesc_t smDesc)
+{
+  unsigned short smState;
+
+  CRFW_UNUSED(smDesc); /* remove if smDesc is used in this function */
+
+  /* isEnabled is true if the SEM Unit State Machine is in state OPER or in state SAFE */
+
+  smState = FwSmGetCurState(smDescSem);
+
+  if ((smState != CrIaSem_OPER) && (smState != CrIaSem_SAFE))
+    {
+      return 0;
+    }
+  else
+    {
+      return 1;
+    }
+}
+
+CrFwBool_t CrSemServ9CmdTimeUpdateReadyCheck(FwSmDesc_t smDesc)
+{
+  unsigned int cnt;
+  
+  CRFW_UNUSED(smDesc); /* remove if smDesc is used in this function */
+
+  /* Query Basic Software to check if it is ready to accept a request to generate a TimeCode to the SEM and set isReady to TRUE when readiness is confirmed */
+  
+  cnt = CrIbGetNotifyCnt();
+
+  if (cnt != 1)
+    {
+      return 0; 
+    }
+  else
+    {
+      return 1;  
+    }
+}
+
+CrFwBool_t CrSemServ9CmdTimeUpdateRepeatCheck(FwSmDesc_t smDesc)
+{
+  CRFW_UNUSED(smDesc); /* remove if smDesc is used in this function */
+
+  return 1;
+}
+
+void CrSemServ9CmdTimeUpdateUpdateAction(FwSmDesc_t smDesc)
+{
+  CrFwTimeStamp_t time;
+
+  /* Collect from the Basic Software the time at which the TimeCode will be generated */
+
+  /* Here we send the time command and enable the SpW time code signal */
+  time = CrIbGetNextTime();
+
+  CrSemServ9CmdTimeUpdateParamSetParObtSyncTime(smDesc, (const unsigned char *) time.t);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/CrSemServ9HousekeepingDataReportingService/OutCmd/CrSemServ9CmdTimeUpdate.h b/CrIa/src/Services/CrSemServ9HousekeepingDataReportingService/OutCmd/CrSemServ9CmdTimeUpdate.h
new file mode 100644
index 0000000..2dfe15a
--- /dev/null
+++ b/CrIa/src/Services/CrSemServ9HousekeepingDataReportingService/OutCmd/CrSemServ9CmdTimeUpdate.h
@@ -0,0 +1,48 @@
+/**
+ * @file CrSemServ9CmdTimeUpdate.h
+ *
+ * Declaration of the CMD Time Update out-going command packet.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRSEM_SERV9_CMD_TIME_UPDATE_H
+#define CRSEM_SERV9_CMD_TIME_UPDATE_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Enable check of the CMD Time Update telemetry packet.
+ * isEnabled is true if the SEM Unit State Machine is in state OPER or in state SAFE
+ * @param smDesc the state machine descriptor
+ * @return the enable check result
+ */
+CrFwBool_t CrSemServ9CmdTimeUpdateEnableCheck(FwSmDesc_t smDesc);
+
+/**
+ * Ready check of the CMD Time Update telemetry packet.
+ * Query Basic Software to check if it is ready to accept a request to generate a TimeCode to the SEM and set isReady to TRUE when readiness is confirmed
+ * @param smDesc the state machine descriptor
+ * @return the ready check result
+ */
+CrFwBool_t CrSemServ9CmdTimeUpdateReadyCheck(FwSmDesc_t smDesc);
+
+/**
+ * Repeat check of the CMD Time Update telemetry packet.
+ * Set isRepeat to TRUE for as long as the IBSW is not ready to accept a request to generate TimeCode
+ * @param smDesc the state machine descriptor
+ * @return the repeat check result
+ */
+CrFwBool_t CrSemServ9CmdTimeUpdateRepeatCheck(FwSmDesc_t smDesc);
+
+/**
+ * Update action of the CMD Time Update telemetry packet.
+ * Collect from the Basic Software the time at which the TimeCode will be generated
+ * @param smDesc the state machine descriptor
+ */
+void CrSemServ9CmdTimeUpdateUpdateAction(FwSmDesc_t smDesc);
+
+#endif /* CRSEM_SERV9_CMD_TIME_UPDATE_H */
+
diff --git a/CrIa/src/Services/General/CrIaConstants.h b/CrIa/src/Services/General/CrIaConstants.h
new file mode 100644
index 0000000..8c5b712
--- /dev/null
+++ b/CrIa/src/Services/General/CrIaConstants.h
@@ -0,0 +1,1581 @@
+/**
+ * @file CrIaConstants.h
+ * @ingroup CrIaServicesGeneral
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Header file to define all service and packet identifiers, and packet length.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#ifndef CRIA_CONSTANTS_H
+#define CRIA_CONSTANTS_H
+
+#define PR_STOPPED 0
+#define PR_STARTED 1
+
+#define PR_SUCCESS 1
+#define PR_FAILURE 0
+
+#define FULL_SIZE_X 1076
+#define FULL_SIZE_Y 1033
+
+/* Selection of Centroidings */
+#define NO_CENT  1
+#define DEF_CENT 2
+#define DUM_CENT 3
+
+/* AlgoId */
+#define SAA_EVAL_ALGO  1
+#define CLCT_ALGO      3
+#define ACQ1_ALGO      4
+#define CNT1_ALGO      5
+#define SDS_EVAL_ALGO  6
+#define TTC1_ALGO      8
+#define TTC2_ALGO      9
+#define CENT0_ALGO    11
+
+/* FdCheckId */
+#define FDC_TS_TEMP    1
+#define FDC_ILL_CNT    2
+#define FDC_SEM_COMM   3
+#define FDC_SEM_TO     4
+#define FDC_SEM_SM     5
+#define FDC_SEM_ALIVE  6
+#define FDC_EVT1       7
+#define FDC_EVT2       8
+#define FDC_SEM_OOL    9
+#define FDC_PSDU_OOL  10
+#define FDC_CENT_CONS 11
+#define FDC_RES       12
+#define FDC_SEM_CONS  13
+
+/* Recovery Procedure Identifier */
+#define REP_SEM_OFF  1
+#define REP_TERM_SCI 3
+#define REP_STOP_HB  4
+#define REP_SEM_AE   5
+
+/* Response Type for FdCheck SEM Anomaly Check */
+#define SEMANOEVT_NO_ACT  1
+#define SEMANOEVT_SEM_OFF 2
+#define SEMANOEVT_SCI_OFF 3
+
+/* AcqAlgoId */
+#define ACQALGOID_NOMINAL 100
+#define ACQALGOID_CROWDED_FAINT 101
+#define ACQALGOID_CROWDED_BRIGHT 102
+#define ACQALGOID_SPARSE_FAINT 103
+#define ACQALGOID_SPARSE_BRIGHT 104
+#define ACQALGOID_PATTERN 105
+#define ACQALGOID_ROBUST 106
+#define ACQALGOID_SINGLE 107
+#define ACQALGOID_DOUBLE 108
+#define ACQALGOID_DUMMY 109
+
+/* SaveImages pSaveTarget */
+#define SAVETARGET_GROUND 0
+#define SAVETARGET_FLASH 1
+
+/* Service 13 constants */
+#define S13_MAX_BLOCK_SIZE 1001
+#define S13_MIN_BLOCK_SIZE 200
+#define S13_OVERHEAD 23 /* 16 + 5 + 2 Bytes overhead for the S13 packet */
+
+
+/**
+ * The maximal packet length.
+ */
+#define CR_MAX_SIZE_PCKT_LARGE 1024
+
+/**
+ * The length offset for the out-going report.
+ */
+#define OFFSET_PAR_LENGTH_OUT_REP_PCKT 16
+
+/**
+ * The length offset for the in-coming command.
+ */
+#define OFFSET_PAR_LENGTH_IN_CMD_PCKT 10
+
+/**
+ * The length of CRC.
+ */
+#define CRC_LENGTH 2
+
+/**
+ * Type identifier of the Command Verification Service.
+ */
+#define CRIA_SERV1 1
+
+/**
+ * Type identifier of the Housekeeping Data Reporting Service.
+ */
+#define CRIA_SERV3 3
+
+/**
+ * Type identifier of the Event Reporting Service.
+ */
+#define CRIA_SERV5 5
+
+/**
+ * Type identifier of the Memory Management Service.
+ */
+#define CRIA_SERV6 6
+
+/**
+ * Type identifier of the Large Data Transfer Service.
+ */
+#define CRIA_SERV13 13
+
+/**
+ * Type identifier of the Test Service.
+ */
+#define CRIA_SERV17 17
+
+/**
+ * Type identifier of the FDIR Service.
+ */
+#define CRIA_SERV191 191
+
+/**
+ * Type identifier of the SEM Management Service.
+ */
+#define CRIA_SERV192 192
+
+/**
+ * Type identifier of the IASW Mode Control Service.
+ */
+#define CRIA_SERV193 193
+
+/**
+ * Type identifier of the Algorithm Control Service.
+ */
+#define CRIA_SERV194 194
+
+/**
+ * Type identifier of the Heartbeat Service.
+ */
+#define CRIA_SERV195 195
+
+/**
+ * Type identifier of the AOCS Service.
+ */
+#define CRIA_SERV196 196
+
+/**
+ * Type identifier of the Boot Report Service.
+ */
+#define CRIA_SERV197 197
+
+/**
+ * Type identifier of the Procedure Control Service.
+ */
+#define CRIA_SERV198 198
+
+/**
+ * Type identifier of the Boot Management Service.
+ */
+#define CRIA_SERV210 210
+
+/**
+ * Type identifier of the Parameter Update Service.
+ */
+#define CRIA_SERV211 211
+
+/**
+ * Subtype identifier of the Telecommand Acceptance Report – Success out-going report packet.
+ */
+#define CRIA_SERV1_ACC_SUCC 1
+
+/**
+ * Subtype identifier of the Telecommand Acceptance Report – Failure out-going report packet.
+ */
+#define CRIA_SERV1_ACC_FAIL 2
+
+/**
+ * Subtype identifier of the Telecommand Start Report – Success out-going report packet.
+ */
+#define CRIA_SERV1_START_SUCC 3
+
+/**
+ * Subtype identifier of the Telecommand Start Report – Failure out-going report packet.
+ */
+#define CRIA_SERV1_START_FAIL 4
+
+/**
+ * Subtype identifier of the Telecommand Termination Report – Success out-going report packet.
+ */
+#define CRIA_SERV1_TERM_SUCC 7
+
+/**
+ * Subtype identifier of the Telecommand Termination Report – Failure out-going report packet.
+ */
+#define CRIA_SERV1_TERM_FAIL 8
+
+/**
+ * Subtype identifier of the Define New Housekeeping Data Report in-coming command packet.
+ */
+#define CRIA_SERV3_DEFINE_HK_DR 1
+
+/**
+ * Subtype identifier of the Clear Housekeeping Data Report in-coming command packet.
+ */
+#define CRIA_SERV3_CLR_HK_DR 3
+
+/**
+ * Subtype identifier of the Enable Housekeeping Data Report Generation in-coming command packet.
+ */
+#define CRIA_SERV3_ENB_HK_DR_GEN 5
+
+/**
+ * Subtype identifier of the Disable Housekeeping Data Report Generation in-coming command packet.
+ */
+#define CRIA_SERV3_DIS_HK_DR_GEN 6
+
+/**
+ * Subtype identifier of the Housekeeping Data Report out-going report packet.
+ */
+#define CRIA_SERV3_HK_DR 25
+
+/**
+ * Subtype identifier of the Set Housekeeping Reporting Frequency in-coming command packet.
+ */
+#define CRIA_SERV3_SET_HK_REP_FREQ 131
+
+/**
+ * Subtype identifier of the Normal/Progress Report out-going report packet.
+ */
+#define CRIA_SERV5_EVT_NORM 1
+
+/**
+ * Subtype identifier of the Error Report - Low Severity out-going report packet.
+ */
+#define CRIA_SERV5_EVT_ERR_LOW_SEV 2
+
+/**
+ * Subtype identifier of the Error Report - Medium Severity out-going report packet.
+ */
+#define CRIA_SERV5_EVT_ERR_MED_SEV 3
+
+/**
+ * Subtype identifier of the Error Report - High Severity out-going report packet.
+ */
+#define CRIA_SERV5_EVT_ERR_HIGH_SEV 4
+
+/**
+ * Subtype identifier of the Enable Event Report Generation in-coming command packet.
+ */
+#define CRIA_SERV5_ENB_EVT_REP_GEN 5
+
+/**
+ * Subtype identifier of the Disable Event Report Generation in-coming command packet.
+ */
+#define CRIA_SERV5_DIS_EVT_REP_GEN 6
+
+/**
+ * Subtype identifier of the Load Memory using Absolute Addresses in-coming command packet.
+ */
+#define CRIA_SERV6_LOAD_MEM 2
+
+/**
+ * Subtype identifier of the Dump Memory using Absolute Addresses in-coming command packet.
+ */
+#define CRIA_SERV6_DUMP_MEM 5
+
+/**
+ * Subtype identifier of the Memory Dump using Absolute Addresses Report out-going report packet.
+ */
+#define CRIA_SERV6_MEM_DUMP 6
+
+/**
+ * Subtype identifier of the First Downlink Part Report out-going report packet.
+ */
+#define CRIA_SERV13_FST_DWLK 1
+
+/**
+ * Subtype identifier of the Intermediate Downlink Part Report out-going report packet.
+ */
+#define CRIA_SERV13_INTM_DWLK 2
+
+/**
+ * Subtype identifier of the Last Downlink Part Report out-going report packet.
+ */
+#define CRIA_SERV13_LAST_DWLK 3
+
+/**
+ * Subtype identifier of the Downlink Abort Report out-going report packet.
+ */
+#define CRIA_SERV13_DWLK_ABRT 4
+
+/**
+ * Subtype identifier of the Abort Downlink in-coming command packet.
+ */
+#define CRIA_SERV13_ABRT_DWLK 8
+
+/**
+ * Subtype identifier of the Trigger Large Data Transfer in-coming command packet.
+ */
+#define CRIA_SERV13_TRG_LRG_DATA_TSFR 129
+
+/**
+ * Subtype identifier of the Perform Connection Test in-coming command packet.
+ */
+#define CRIA_SERV17_PERF_CONN_TEST 1
+
+/**
+ * Subtype identifier of the Link Connection Report out-going report packet.
+ */
+#define CRIA_SERV17_LINK_CONN_REP 2
+
+/**
+ * Subtype identifier of the Globally Enable FdChecks in-coming command packet.
+ */
+#define CRIA_SERV191_GLOB_ENB_FD_CHK 1
+
+/**
+ * Subtype identifier of the Globally Disable FdChecks in-coming command packet.
+ */
+#define CRIA_SERV191_GLOB_DIS_FD_CHK 2
+
+/**
+ * Subtype identifier of the Enable FdCheck in-coming command packet.
+ */
+#define CRIA_SERV191_ENB_FD_CHK 3
+
+/**
+ * Subtype identifier of the Disable FdCheck in-coming command packet.
+ */
+#define CRIA_SERV191_DIS_FD_CHK 4
+
+/**
+ * Subtype identifier of the Globally Enable Recovery Procedures in-coming command packet.
+ */
+#define CRIA_SERV191_GLOB_ENB_RECOV_PROC 5
+
+/**
+ * Subtype identifier of the Globally Disable Recovery Procedures in-coming command packet.
+ */
+#define CRIA_SERV191_GLOB_DIS_RECOV_PROC 6
+
+/**
+ * Subtype identifier of the Enable Recovery Procedure in-coming command packet.
+ */
+#define CRIA_SERV191_ENB_RECOV_PROC 7
+
+/**
+ * Subtype identifier of the Disable Recovery Procedure in-coming command packet.
+ */
+#define CRIA_SERV191_DIS_RECOV_PROC 8
+
+/**
+ * Subtype identifier of the Switch On SEM in-coming command packet.
+ */
+#define CRIA_SERV192_SWCH_ON_SEM 1
+
+/**
+ * Subtype identifier of the Switch Off SEM in-coming command packet.
+ */
+#define CRIA_SERV192_SWCH_OFF_SEM 2
+
+/**
+ * Subtype identifier of the Go to STABILIZE in-coming command packet.
+ */
+#define CRIA_SERV192_GO_STAB 3
+
+/**
+ * Subtype identifier of the Go to STANDBY in-coming command packet.
+ */
+#define CRIA_SERV192_GO_STBY 4
+
+/**
+ * Subtype identifier of the Go to CCD WINDOW in-coming command packet.
+ */
+#define CRIA_SERV192_GO_CCD_WIN 5
+
+/**
+ * Subtype identifier of the Go to CCD FULL in-coming command packet.
+ */
+#define CRIA_SERV192_GO_CCD_FULL 6
+
+/**
+ * Subtype identifier of the Go to DIAGNOSTICS in-coming command packet.
+ */
+#define CRIA_SERV192_GO_DIAG 7
+
+/**
+ * Subtype identifier of the Abort DIAGNOSTICS in-coming command packet.
+ */
+#define CRIA_SERV192_ABORT_DIAG 8
+
+/**
+ * Subtype identifier of the Go to SAFE in-coming command packet.
+ */
+#define CRIA_SERV192_GO_SAFE 10
+
+/**
+ * Subtype identifier of the Prepare Science in-coming command packet.
+ */
+#define CRIA_SERV193_PREPARE_SCI 1
+
+/**
+ * Subtype identifier of the Start Science in-coming command packet.
+ */
+#define CRIA_SERV193_START_SCI 2
+
+/**
+ * Subtype identifier of the Stop Science in-coming command packet.
+ */
+#define CRIA_SERV193_STOP_SCIENCE 3
+
+/**
+ * Subtype identifier of the Stop SEM in-coming command packet.
+ */
+#define CRIA_SERV193_STOP_SEM 4
+
+/**
+ * Subtype identifier of the Start Offline Operation in-coming command packet.
+ */
+#define CRIA_SERV193_START_OFFLINE_OPER 5
+
+/**
+ * Subtype identifier of the Controlled Switch-Off IASW in-coming command packet.
+ */
+#define CRIA_SERV193_SWITCH_OFF_IASW 6
+
+/**
+ * Subtype identifier of the Start Algorithm in-coming command packet.
+ */
+#define CRIA_SERV194_START_ALGO 1
+
+/**
+ * Subtype identifier of the Stop Algorithm in-coming command packet.
+ */
+#define CRIA_SERV194_STOP_ALGO 2
+
+/**
+ * Subtype identifier of the Suspend Algorithm in-coming command packet.
+ */
+#define CRIA_SERV194_SUS_ALGO 3
+
+/**
+ * Subtype identifier of the Resume Algorithm in-coming command packet.
+ */
+#define CRIA_SERV194_RES_ALGO 4
+
+/**
+ * Subtype identifier of the Heartbeat Report out-going report packet.
+ */
+#define CRIA_SERV195_HB_REP 1
+
+/**
+ * Subtype identifier of the AOCS Report out-going report packet.
+ */
+#define CRIA_SERV196_AOCS_REP 1
+
+/**
+ * Subtype identifier of the Star Map Command in-coming command packet.
+ */
+#define CRIA_SERV196_STAR_MAP_CMD 2
+
+/**
+ * Subtype identifier of the Boot Report out-going report packet.
+ */
+#define CRIA_SERV197_BOOT_REP 1
+
+/**
+ * Subtype identifier of the Generate Boot Report in-coming command packet.
+ */
+#define CRIA_SERV197_REP_BOOT 2
+
+/**
+ * Subtype identifier of the Start Procedure in-coming command packet.
+ */
+#define CRIA_SERV198_PROC_START 1
+
+/**
+ * Subtype identifier of the Stop Procedure in-coming command packet.
+ */
+#define CRIA_SERV198_PROC_STOP 2
+
+/**
+ * Subtype identifier of the Enable Watchdog in-coming command packet.
+ */
+#define CRIA_SERV210_ENB_WDOG 3
+
+/**
+ * Subtype identifier of the Disable Watchdog in-coming command packet.
+ */
+#define CRIA_SERV210_DIS_WDOG 4
+
+/**
+ * Subtype identifier of the Reset DPU in-coming command packet.
+ */
+#define CRIA_SERV210_RESET_DPU 5
+
+/**
+ * Subtype identifier of the Update Parameter in-coming command packet.
+ */
+#define CRIA_SERV211_UPDATE_PAR 1
+
+/**
+ * Length of the Telecommand Acceptance Report – Success out-going report packet.
+ */
+#define CRIA_SERV1_ACC_SUCC_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the Telecommand Acceptance Report – Failure out-going report packet.
+ */
+#define CRIA_SERV1_ACC_FAIL_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 16 + CRC_LENGTH)
+
+/**
+ * Length of the Telecommand Start Report – Success out-going report packet.
+ */
+#define CRIA_SERV1_START_SUCC_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the Telecommand Start Report – Failure out-going report packet.
+ */
+#define CRIA_SERV1_START_FAIL_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 12 + CRC_LENGTH)
+
+/**
+ * Length of the Telecommand Termination Report – Success out-going report packet.
+ */
+#define CRIA_SERV1_TERM_SUCC_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the Telecommand Termination Report – Failure out-going report packet.
+ */
+#define CRIA_SERV1_TERM_FAIL_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 12 + CRC_LENGTH)
+
+/**
+ * Length of the Define New Housekeeping Data Report in-coming command packet.
+ */
+#define CRIA_SERV3_DEFINE_HK_DR_LENGTH CR_MAX_SIZE_PCKT_LARGE
+
+/**
+ * Length of the Clear Housekeeping Data Report in-coming command packet.
+ */
+#define CRIA_SERV3_CLR_HK_DR_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 1 + CRC_LENGTH)
+
+/**
+ * Length of the Enable Housekeeping Data Report Generation in-coming command packet.
+ */
+#define CRIA_SERV3_ENB_HK_DR_GEN_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 1 + CRC_LENGTH)
+
+/**
+ * Length of the Disable Housekeeping Data Report Generation in-coming command packet.
+ */
+#define CRIA_SERV3_DIS_HK_DR_GEN_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 1 + CRC_LENGTH)
+
+/**
+ * Length of the Housekeeping Data Report out-going report packet.
+ */
+#define CRIA_SERV3_HK_DR_LENGTH CR_MAX_SIZE_PCKT_LARGE
+
+/**
+ * Length of the Set Housekeeping Reporting Frequency in-coming command packet.
+ */
+#define CRIA_SERV3_SET_HK_REP_FREQ_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the Normal/Progress Report out-going report packet.
+ */
+#define CRIA_SERV5_EVT_NORM_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the Error Report - Low Severity out-going report packet.
+ */
+#define CRIA_SERV5_EVT_ERR_LOW_SEV_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the Error Report - Medium Severity out-going report packet.
+ */
+#define CRIA_SERV5_EVT_ERR_MED_SEV_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the Error Report - High Severity out-going report packet.
+ */
+#define CRIA_SERV5_EVT_ERR_HIGH_SEV_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the Enable Event Report Generation in-coming command packet.
+ */
+#define CRIA_SERV5_ENB_EVT_REP_GEN_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the Disable Event Report Generation in-coming command packet.
+ */
+#define CRIA_SERV5_DIS_EVT_REP_GEN_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the Event Sequence Counter Error.
+ */
+#define CRIA_SERV5_EVT_SEQ_CNT_ERR_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the Event In Rep Cr Fail.
+ */
+#define CRIA_SERV5_EVT_INREP_CR_FAIL_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the Event Pcrl2 Full.
+ */
+#define CRIA_SERV5_EVT_PCRL2_FULL_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the Event Failure Detection Failed.
+ */
+#define CRIA_SERV5_EVT_FD_FAILED_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the Event Recovery Procedure Started.
+ */
+#define CRIA_SERV5_EVT_RP_STARTED_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the Event SEM State Machine Transition.
+ */
+#define CRIA_SERV5_EVT_SEM_TR_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the Event IASW State Machine Transition.
+ */
+#define CRIA_SERV5_EVT_IASW_TR_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the Event SDSC Illegal.
+ */
+#define CRIA_SERV5_EVT_SDSC_ILL_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the Event SDSC Out-of-sequence.
+ */
+#define CRIA_SERV5_EVT_SDSC_OOS_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the Event Collection Algorithm out of Space.
+ */
+#define CRIA_SERV5_EVT_CLCT_SIZE_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the Event Science Image Buffer size.
+ */
+#define CRIA_SERV5_EVT_SIB_SIZE_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the Centroid Validity Forced Invalid.
+ */
+#define CRIA_SERV5_EVT_INV_CENT_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the Parameter Out-Of-Limits.
+ */
+#define CRIA_SERV5_EVT_OOL_PARAM_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the Event Invalid Destination.
+ */
+#define CRIA_SERV5_EVT_INV_DEST_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the Event FBF Load Risk.
+ */
+#define CRIA_SERV5_EVT_FBF_LOAD_RISK_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the Event FBF Save Denied.
+ */
+#define CRIA_SERV5_EVT_FBF_SAVE_DENIED_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the Event FBF Save Abort.
+ */
+#define CRIA_SERV5_EVT_FBF_SAVE_ABRT_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the Event SDB Configuration Failed.
+ */
+#define CRIA_SERV5_EVT_SDB_CNF_FAIL_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 22 + CRC_LENGTH)
+
+/**
+ * Length of the Event Compression Algorithm out of Space.
+ */
+#define CRIA_SERV5_EVT_CMPR_SIZE_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the Event SEM OP State Machine Transition.
+ */
+#define CRIA_SERV5_EVT_SEMOP_TR_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the Event Science Procedure Starts Execution.
+ */
+#define CRIA_SERV5_EVT_SC_PR_STRT_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the Event Science Procedure Terminates Execution.
+ */
+#define CRIA_SERV5_EVT_SC_PR_END_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the Event InStream Packet Queue Full.
+ */
+#define CRIA_SERV5_EVT_INSTRM_PQF_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the Event OutComponent Invalid Destination.
+ */
+#define CRIA_SERV5_EVT_OCMP_INVD_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the Event OutComponent Illegal Group Identifier.
+ */
+#define CRIA_SERV5_EVT_OCMP_ILLGR_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5 + CRC_LENGTH)
+
+/**
+ * Length of the Event InStream Illegal Group Identifier.
+ */
+#define CRIA_SERV5_EVT_IN_ILLGR_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5 + CRC_LENGTH)
+
+/**
+ * Length of the Illegal SEM State at Entry in PRE_SCIENCE.
+ */
+#define CRIA_SERV5_EVT_SEM_ILL_ST_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the Successful IASW Initializationr.
+ */
+#define CRIA_SERV5_EVT_INIT_SUCC_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the IASW Initialization Failed.
+ */
+#define CRIA_SERV5_EVT_INIT_FAIL_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the Thread Overrun.
+ */
+#define CRIA_SERV5_EVT_THRD_OR_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the Notification Error.
+ */
+#define CRIA_SERV5_EVT_NOTIF_ERR_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the Low-severity 1553 Error.
+ */
+#define CRIA_SERV5_EVT_1553_ERR_L_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the Medium-severity 1553 Error.
+ */
+#define CRIA_SERV5_EVT_1553_ERR_M_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the High-severity 1553 Error.
+ */
+#define CRIA_SERV5_EVT_1553_ERR_H_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the Low-severity SpaceWire Error.
+ */
+#define CRIA_SERV5_EVT_SPW_ERR_L_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the Medium-severity SpaceWire Error.
+ */
+#define CRIA_SERV5_EVT_SPW_ERR_M_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the High-severity SpaceWire Error.
+ */
+#define CRIA_SERV5_EVT_SPW_ERR_H_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the Flash-Based Error Log Error.
+ */
+#define CRIA_SERV5_EVT_FL_EL_ERR_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 8 + CRC_LENGTH)
+
+/**
+ * Length of the Flash-Based File Error.
+ */
+#define CRIA_SERV5_EVT_FL_FBF_ERR_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 10 + CRC_LENGTH)
+
+/**
+ * Length of the Flash Bad Block Encountered.
+ */
+#define CRIA_SERV5_EVT_FL_FBF_BB_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the Single Bit EDAC Error.
+ */
+#define CRIA_SERV5_EVT_SBIT_ERR_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the Double Bit EDAC Error.
+ */
+#define CRIA_SERV5_EVT_DBIT_ERR_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the Synchronization Lost.
+ */
+#define CRIA_SERV5_EVT_SYNC_LOSS_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the SDP_NOMEM Failure.
+ */
+#define CRIA_SERV5_EVT_SDP_NOMEM_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the Science Buffer Too Small.
+ */
+#define CRIA_SERV5_EVT_PROCBUF_INSUF_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 12 + CRC_LENGTH)
+
+/**
+ * Length of the SIB or GIB Cannot Be Incremented.
+ */
+#define CRIA_SERV5_EVT_XIB_FULL_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the Image Too Large.
+ */
+#define CRIA_SERV5_EVT_IMG_INSUF_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 14 + CRC_LENGTH)
+
+/**
+ * Length of the Acquisition failure.
+ */
+#define CRIA_SERV5_EVT_ACQ_FAIL_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the Load Memory using Absolute Addresses in-coming command packet.
+ */
+#define CRIA_SERV6_LOAD_MEM_LENGTH CR_MAX_SIZE_PCKT_LARGE
+
+/**
+ * Length of the Dump Memory using Absolute Addresses in-coming command packet.
+ */
+#define CRIA_SERV6_DUMP_MEM_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 10 + CRC_LENGTH)
+
+/**
+ * Length of the Memory Dump using Absolute Addresses Report out-going report packet.
+ */
+#define CRIA_SERV6_MEM_DUMP_LENGTH CR_MAX_SIZE_PCKT_LARGE
+
+/**
+ * Length of the First Downlink Part Report out-going report packet.
+ */
+#define CRIA_SERV13_FST_DWLK_LENGTH CR_MAX_SIZE_PCKT_LARGE
+
+/**
+ * Length of the Intermediate Downlink Part Report out-going report packet.
+ */
+#define CRIA_SERV13_INTM_DWLK_LENGTH CR_MAX_SIZE_PCKT_LARGE
+
+/**
+ * Length of the Last Downlink Part Report out-going report packet.
+ */
+#define CRIA_SERV13_LAST_DWLK_LENGTH CR_MAX_SIZE_PCKT_LARGE
+
+/**
+ * Length of the Downlink Abort Report out-going report packet.
+ */
+#define CRIA_SERV13_DWLK_ABRT_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3 + CRC_LENGTH)
+
+/**
+ * Length of the Abort Downlink in-coming command packet.
+ */
+#define CRIA_SERV13_ABRT_DWLK_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 1 + CRC_LENGTH)
+
+/**
+ * Length of the Trigger Large Data Transfer in-coming command packet.
+ */
+#define CRIA_SERV13_TRG_LRG_DATA_TSFR_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 1 + CRC_LENGTH)
+
+/**
+ * Length of the Perform Connection Test in-coming command packet.
+ */
+#define CRIA_SERV17_PERF_CONN_TEST_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Link Connection Report out-going report packet.
+ */
+#define CRIA_SERV17_LINK_CONN_REP_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Globally Enable FdChecks in-coming command packet.
+ */
+#define CRIA_SERV191_GLOB_ENB_FD_CHK_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Globally Disable FdChecks in-coming command packet.
+ */
+#define CRIA_SERV191_GLOB_DIS_FD_CHK_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Enable FdCheck in-coming command packet.
+ */
+#define CRIA_SERV191_ENB_FD_CHK_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the Disable FdCheck in-coming command packet.
+ */
+#define CRIA_SERV191_DIS_FD_CHK_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the Globally Enable Recovery Procedures in-coming command packet.
+ */
+#define CRIA_SERV191_GLOB_ENB_RECOV_PROC_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Globally Disable Recovery Procedures in-coming command packet.
+ */
+#define CRIA_SERV191_GLOB_DIS_RECOV_PROC_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Enable Recovery Procedure in-coming command packet.
+ */
+#define CRIA_SERV191_ENB_RECOV_PROC_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the Disable Recovery Procedure in-coming command packet.
+ */
+#define CRIA_SERV191_DIS_RECOV_PROC_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the Switch On SEM in-coming command packet.
+ */
+#define CRIA_SERV192_SWCH_ON_SEM_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Switch Off SEM in-coming command packet.
+ */
+#define CRIA_SERV192_SWCH_OFF_SEM_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Go to STABILIZE in-coming command packet.
+ */
+#define CRIA_SERV192_GO_STAB_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Go to STANDBY in-coming command packet.
+ */
+#define CRIA_SERV192_GO_STBY_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Go to CCD WINDOW in-coming command packet.
+ */
+#define CRIA_SERV192_GO_CCD_WIN_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Go to CCD FULL in-coming command packet.
+ */
+#define CRIA_SERV192_GO_CCD_FULL_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Go to DIAGNOSTICS in-coming command packet.
+ */
+#define CRIA_SERV192_GO_DIAG_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Abort DIAGNOSTICS in-coming command packet.
+ */
+#define CRIA_SERV192_ABORT_DIAG_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Go to SAFE in-coming command packet.
+ */
+#define CRIA_SERV192_GO_SAFE_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Prepare Science in-coming command packet.
+ */
+#define CRIA_SERV193_PREPARE_SCI_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Start Science in-coming command packet.
+ */
+#define CRIA_SERV193_START_SCI_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Stop Science in-coming command packet.
+ */
+#define CRIA_SERV193_STOP_SCIENCE_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Stop SEM in-coming command packet.
+ */
+#define CRIA_SERV193_STOP_SEM_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Start Offline Operation in-coming command packet.
+ */
+#define CRIA_SERV193_START_OFFLINE_OPER_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Controlled Switch-Off IASW in-coming command packet.
+ */
+#define CRIA_SERV193_SWITCH_OFF_IASW_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Start Algorithm in-coming command packet.
+ */
+#define CRIA_SERV194_START_ALGO_LENGTH CR_MAX_SIZE_PCKT_LARGE
+
+/**
+ * Length of the Stop Algorithm in-coming command packet.
+ */
+#define CRIA_SERV194_STOP_ALGO_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the Suspend Algorithm in-coming command packet.
+ */
+#define CRIA_SERV194_SUS_ALGO_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the Resume Algorithm in-coming command packet.
+ */
+#define CRIA_SERV194_RES_ALGO_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the SAA Evaluation Algorithm.
+ */
+#define CRIA_SERV194_SAA_EVAL_ALGO_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the Compression/Collection Algorithm.
+ */
+#define CRIA_SERV194_CC_ALGO_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the Acquisition Algorithm 1.
+ */
+#define CRIA_SERV194_ACQ1_ALGO_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the Centroid Algorithm 1.
+ */
+#define CRIA_SERV194_CNT1_ALGO_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the SDS Evaluation Algorithm.
+ */
+#define CRIA_SERV194_SDS_EVAL_ALGO_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the TTC Algorithm 1.
+ */
+#define CRIA_SERV194_TTC1_ALGO_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the TTC Algorithm 2.
+ */
+#define CRIA_SERV194_TTC2_ALGO_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the Centroid Algorithm 0.
+ */
+#define CRIA_SERV194_CENT0_ALGO_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the Heartbeat Report out-going report packet.
+ */
+#define CRIA_SERV195_HB_REP_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3 + CRC_LENGTH)
+
+/**
+ * Length of the AOCS Report out-going report packet.
+ */
+#define CRIA_SERV196_AOCS_REP_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 27 + CRC_LENGTH)
+
+/**
+ * Length of the Star Map Command in-coming command packet.
+ */
+#define CRIA_SERV196_STAR_MAP_CMD_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 286 + CRC_LENGTH)
+
+/**
+ * Length of the Boot Report out-going report packet.
+ */
+#define CRIA_SERV197_BOOT_REP_LENGTH (OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1004 + CRC_LENGTH)
+
+/**
+ * Length of the Generate Boot Report in-coming command packet.
+ */
+#define CRIA_SERV197_REP_BOOT_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the Start Procedure in-coming command packet.
+ */
+#define CRIA_SERV198_PROC_START_LENGTH CR_MAX_SIZE_PCKT_LARGE
+
+/**
+ * Length of the Stop Procedure in-coming command packet.
+ */
+#define CRIA_SERV198_PROC_STOP_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the Save Images Procedure.
+ */
+#define CRIA_SERV198_SAVE_IMG_PR_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the Acquire Full Drop.
+ */
+#define CRIA_SERV198_ACQ_FULL_DROP_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 10 + CRC_LENGTH)
+
+/**
+ * Length of the Calibrate Full Snap.
+ */
+#define CRIA_SERV198_CAL_FULL_SNAP_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 16 + CRC_LENGTH)
+
+/**
+ * Length of the FBF Load Procedure.
+ */
+#define CRIA_SERV198_FBF_LOAD_PR_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 10 + CRC_LENGTH)
+
+/**
+ * Length of the FBF Save Procedure.
+ */
+#define CRIA_SERV198_FBF_SAVE_PR_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 10 + CRC_LENGTH)
+
+/**
+ * Length of the Science Window Stack/Snap.
+ */
+#define CRIA_SERV198_SCI_STACK_PR_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 26 + CRC_LENGTH)
+
+/**
+ * Length of the Transfer FBFs To Ground.
+ */
+#define CRIA_SERV198_FBF_TO_GND_PR_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 5 + CRC_LENGTH)
+
+/**
+ * Length of the Nominal Science.
+ */
+#define CRIA_SERV198_NOM_SCI_PR_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 94 + CRC_LENGTH)
+
+/**
+ * Length of the Configure SDB.
+ */
+#define CRIA_SERV198_CONFIG_SDB_PR_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 22 + CRC_LENGTH)
+
+/**
+ * Length of the Enable Watchdog in-coming command packet.
+ */
+#define CRIA_SERV210_ENB_WDOG_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Disable Watchdog in-coming command packet.
+ */
+#define CRIA_SERV210_DIS_WDOG_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Reset DPU in-coming command packet.
+ */
+#define CRIA_SERV210_RESET_DPU_LENGTH (OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the Update Parameter in-coming command packet.
+ */
+#define CRIA_SERV211_UPDATE_PAR_LENGTH CR_MAX_SIZE_PCKT_LARGE
+
+/**
+ * Identifier of the Event Sequence Counter Error.
+ */
+#define CRIA_SERV5_EVT_SEQ_CNT_ERR 200
+
+/**
+ * Identifier of the Event In Rep Cr Fail.
+ */
+#define CRIA_SERV5_EVT_INREP_CR_FAIL 201
+
+/**
+ * Identifier of the Event Pcrl2 Full.
+ */
+#define CRIA_SERV5_EVT_PCRL2_FULL 202
+
+/**
+ * Identifier of the Event Failure Detection Failed.
+ */
+#define CRIA_SERV5_EVT_FD_FAILED 203
+
+/**
+ * Identifier of the Event Recovery Procedure Started.
+ */
+#define CRIA_SERV5_EVT_RP_STARTED 204
+
+/**
+ * Identifier of the Event SEM State Machine Transition.
+ */
+#define CRIA_SERV5_EVT_SEM_TR 205
+
+/**
+ * Identifier of the Event IASW State Machine Transition.
+ */
+#define CRIA_SERV5_EVT_IASW_TR 206
+
+/**
+ * Identifier of the Event SDSC Illegal.
+ */
+#define CRIA_SERV5_EVT_SDSC_ILL 208
+
+/**
+ * Identifier of the Event SDSC Out-of-sequence.
+ */
+#define CRIA_SERV5_EVT_SDSC_OOS 209
+
+/**
+ * Identifier of the Event Collection Algorithm out of Space.
+ */
+#define CRIA_SERV5_EVT_CLCT_SIZE 210
+
+/**
+ * Identifier of the Event Science Image Buffer size.
+ */
+#define CRIA_SERV5_EVT_SIB_SIZE 211
+
+/**
+ * Identifier of the Centroid Validity Forced Invalid.
+ */
+#define CRIA_SERV5_EVT_INV_CENT 230
+
+/**
+ * Identifier of the Parameter Out-Of-Limits.
+ */
+#define CRIA_SERV5_EVT_OOL_PARAM 231
+
+/**
+ * Identifier of the Event Invalid Destination.
+ */
+#define CRIA_SERV5_EVT_INV_DEST 101
+
+/**
+ * Identifier of the Event FBF Load Risk.
+ */
+#define CRIA_SERV5_EVT_FBF_LOAD_RISK 212
+
+/**
+ * Identifier of the Event FBF Save Denied.
+ */
+#define CRIA_SERV5_EVT_FBF_SAVE_DENIED 213
+
+/**
+ * Identifier of the Event FBF Save Abort.
+ */
+#define CRIA_SERV5_EVT_FBF_SAVE_ABRT 214
+
+/**
+ * Identifier of the Event SDB Configuration Failed.
+ */
+#define CRIA_SERV5_EVT_SDB_CNF_FAIL 215
+
+/**
+ * Identifier of the Event Compression Algorithm out of Space.
+ */
+#define CRIA_SERV5_EVT_CMPR_SIZE 216
+
+/**
+ * Identifier of the Event SEM OP State Machine Transition.
+ */
+#define CRIA_SERV5_EVT_SEMOP_TR 217
+
+/**
+ * Identifier of the Event Science Procedure Starts Execution.
+ */
+#define CRIA_SERV5_EVT_SC_PR_STRT 218
+
+/**
+ * Identifier of the Event Science Procedure Terminates Execution.
+ */
+#define CRIA_SERV5_EVT_SC_PR_END 219
+
+/**
+ * Identifier of the Event InStream Packet Queue Full.
+ */
+#define CRIA_SERV5_EVT_INSTRM_PQF 220
+
+/**
+ * Identifier of the Event OutComponent Invalid Destination.
+ */
+#define CRIA_SERV5_EVT_OCMP_INVD 221
+
+/**
+ * Identifier of the Event OutComponent Illegal Group Identifier.
+ */
+#define CRIA_SERV5_EVT_OCMP_ILLGR 222
+
+/**
+ * Identifier of the Event InStream Illegal Group Identifier.
+ */
+#define CRIA_SERV5_EVT_IN_ILLGR 223
+
+/**
+ * Identifier of the Illegal SEM State at Entry in PRE_SCIENCE.
+ */
+#define CRIA_SERV5_EVT_SEM_ILL_ST 1400
+
+/**
+ * Identifier of the Successful IASW Initializationr.
+ */
+#define CRIA_SERV5_EVT_INIT_SUCC 301
+
+/**
+ * Identifier of the IASW Initialization Failed.
+ */
+#define CRIA_SERV5_EVT_INIT_FAIL 302
+
+/**
+ * Identifier of the Thread Overrun.
+ */
+#define CRIA_SERV5_EVT_THRD_OR 303
+
+/**
+ * Identifier of the Notification Error.
+ */
+#define CRIA_SERV5_EVT_NOTIF_ERR 304
+
+/**
+ * Identifier of the Low-severity 1553 Error.
+ */
+#define CRIA_SERV5_EVT_1553_ERR_L 311
+
+/**
+ * Identifier of the Medium-severity 1553 Error.
+ */
+#define CRIA_SERV5_EVT_1553_ERR_M 312
+
+/**
+ * Identifier of the High-severity 1553 Error.
+ */
+#define CRIA_SERV5_EVT_1553_ERR_H 313
+
+/**
+ * Identifier of the Low-severity SpaceWire Error.
+ */
+#define CRIA_SERV5_EVT_SPW_ERR_L 315
+
+/**
+ * Identifier of the Medium-severity SpaceWire Error.
+ */
+#define CRIA_SERV5_EVT_SPW_ERR_M 316
+
+/**
+ * Identifier of the High-severity SpaceWire Error.
+ */
+#define CRIA_SERV5_EVT_SPW_ERR_H 317
+
+/**
+ * Identifier of the Flash-Based Error Log Error.
+ */
+#define CRIA_SERV5_EVT_FL_EL_ERR 320
+
+/**
+ * Identifier of the Flash-Based File Error.
+ */
+#define CRIA_SERV5_EVT_FL_FBF_ERR 325
+
+/**
+ * Identifier of the Flash Bad Block Encountered.
+ */
+#define CRIA_SERV5_EVT_FL_FBF_BB 326
+
+/**
+ * Identifier of the Single Bit EDAC Error.
+ */
+#define CRIA_SERV5_EVT_SBIT_ERR 330
+
+/**
+ * Identifier of the Double Bit EDAC Error.
+ */
+#define CRIA_SERV5_EVT_DBIT_ERR 335
+
+/**
+ * Identifier of the Synchronization Lost.
+ */
+#define CRIA_SERV5_EVT_SYNC_LOSS 350
+
+/**
+ * Identifier of the SDP Failure.
+ */
+#define CRIA_SERV5_EVT_SDP_NOMEM 1001
+
+/**
+ * Identifier of the Science Buffer Too Small.
+ */
+#define CRIA_SERV5_EVT_PROCBUF_INSUF 1501
+
+/**
+ * Identifier of the SIB or GIB Cannot Be Incremented.
+ */
+#define CRIA_SERV5_EVT_XIB_FULL 1503
+
+/**
+ * Identifier of the Image Too Large.
+ */
+#define CRIA_SERV5_EVT_IMG_INSUF 1504
+
+/**
+ * Identifier of the Acquisition failure.
+ */
+#define CRIA_SERV5_EVT_ACQ_FAIL 1450
+
+/**
+ * Identifier of the SAA Evaluation Algorithm.
+ */
+#define CRIA_SERV194_SAA_EVAL_ALGO 1
+
+/**
+ * Identifier of the Compression/Collection Algorithm.
+ */
+#define CRIA_SERV194_CC_ALGO 3
+
+/**
+ * Identifier of the Acquisition Algorithm 1.
+ */
+#define CRIA_SERV194_ACQ1_ALGO 4
+
+/**
+ * Identifier of the Centroid Algorithm 1.
+ */
+#define CRIA_SERV194_CNT1_ALGO 5
+
+/**
+ * Identifier of the SDS Evaluation Algorithm.
+ */
+#define CRIA_SERV194_SDS_EVAL_ALGO 6
+
+/**
+ * Identifier of the TTC Algorithm 1.
+ */
+#define CRIA_SERV194_TTC1_ALGO 8
+
+/**
+ * Identifier of the TTC Algorithm 2.
+ */
+#define CRIA_SERV194_TTC2_ALGO 9
+
+/**
+ * Identifier of the Centroid Algorithm 0.
+ */
+#define CRIA_SERV194_CENT0_ALGO 11
+
+/**
+ * Identifier of the Save Images Procedure.
+ */
+#define CRIA_SERV198_SAVE_IMG_PR 1
+
+/**
+ * Identifier of the Acquire Full Drop.
+ */
+#define CRIA_SERV198_ACQ_FULL_DROP 2
+
+/**
+ * Identifier of the Calibrate Full Snap.
+ */
+#define CRIA_SERV198_CAL_FULL_SNAP 3
+
+/**
+ * Identifier of the FBF Load Procedure.
+ */
+#define CRIA_SERV198_FBF_LOAD_PR 4
+
+/**
+ * Identifier of the FBF Save Procedure.
+ */
+#define CRIA_SERV198_FBF_SAVE_PR 5
+
+/**
+ * Identifier of the Science Window Stack/Snap.
+ */
+#define CRIA_SERV198_SCI_STACK_PR 6
+
+/**
+ * Identifier of the Transfer FBFs To Ground.
+ */
+#define CRIA_SERV198_FBF_TO_GND_PR 7
+
+/**
+ * Identifier of the Nominal Science.
+ */
+#define CRIA_SERV198_NOM_SCI_PR 8
+
+/**
+ * Identifier of the Configure SDB.
+ */
+#define CRIA_SERV198_CONFIG_SDB_PR 9
+
+
+/* Error Log IDs */
+#define ERR_OUTSTREAM_PQ_FULL	102
+#define ERR_POCL_FULL		105
+#define ERR_OUTCMP_NO_MORE_PCKT 108
+
+/**
+ * Acknowledgements (positive and negative)
+ */
+#define ACK_WRONG_CHKSM		1001
+#define ACK_WRONG_LEN		1002
+#define ACK_ILL_MEM_LEN		1005
+#define ACK_ILL_SID		1006
+#define ACK_ILL_PER		1007
+#define ACK_ILL_MEM_SRC		1008
+#define ACK_ILL_MEM_ID      	1010
+#define ACK_ILL_DSIZE       	1099
+
+#define ACK_CREATE_FAIL		1100
+#define ACK_PCRL1_FULL		1101
+#define ACK_ILL_NDI		1102
+#define ACK_ILL_DID		1103
+#define ACK_RDL_NO_SLOT		1104
+#define ACK_SID_IN_USE  	1105
+#define ACK_SID_NOT_USED	1106
+#define ACK_ILL_EID	        1107
+#define ACK_EID_ENB	        1108
+#define ACK_EID_DIS	        1109
+#define ACK_WR_IASW_M	    	1110
+#define ACK_WR_SEM_M	    	1111
+#define ACK_ILL_FID	        1112
+#define ACK_ILL_RID	        1113
+#define ACK_FID_ENB	        1114
+#define ACK_FID_DIS	        1115
+#define ACK_RID_ENB	        1116
+#define ACK_RID_DIS	        1117
+
+#define ACK_ILL_AID     	1123
+#define ACK_ILL_WD_STATUS	1124
+#define ACK_MODE_CHNG_FAILED	1125
+#define ACK_ILL_PAR      	1127
+
+#define ACK_ILL_SMAP		1140
+
+#define ACK_ILL_PR_ID  		1200
+#define ACK_ILL_PR_PAR 		1201
+#define ACK_PR_BUSY    		1202
+#define ACK_PR_IDLE    		1203
+#define ACK_WR_SDB_M 		1204
+#define ACK_ILL_SDUID       	1205
+#define ACK_WR_SDU_M        	1206
+#define ACK_WR_ALGO_M       	1208
+
+#define ACK_ILL_PTYP		1250
+#define ACK_WR_PLEN		1251
+#define ACK_ILL_ELEM		1252
+
+#define ACK_MEM_FAIL        	1260
+
+#define SDU_ID_MAX        4 
+
+#define SDP_STATUS_IDLE 0
+#define SDP_STATUS_ERROR 1
+#define SDP_STATUS_ACQUISITION 2
+#define SDP_STATUS_SCIENCE 3
+
+#endif /* CRIA_CONSTANTS_H */
+
diff --git a/CrIa/src/Services/General/CrIaParamGetter.c b/CrIa/src/Services/General/CrIaParamGetter.c
new file mode 100644
index 0000000..0d0808f
--- /dev/null
+++ b/CrIa/src/Services/General/CrIaParamGetter.c
@@ -0,0 +1,897 @@
+/**
+ * @file CrIaParamGetter.c
+ * @ingroup CrIaServicesGeneral
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the getter operations for all parameters of all in-coming packets.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaParamGetter.h"
+#include "CrIaConstants.h"
+#include "CrIaPckt.h"
+#include "CrIaDataPool.h"
+#include <string.h>
+
+
+#define GET_UCHAR_FROM_PCKT(from) ((unsigned char)(pckt[from]))
+
+#define GET_USHORT_FROM_PCKT(from) ( (((unsigned char)(pckt[from])) << 8) | ((unsigned char)(pckt[from+1])) )
+
+#define GET_UINT_FROM_PCKT(from) ( (((unsigned char)(pckt[from])) << 24) | (((unsigned char)(pckt[from+1])) << 16) | (((unsigned char)(pckt[from+2])) << 8) | ((unsigned char)(pckt[from+3])) )
+
+
+void CrIaServ3DefineHkDrParamGetSid(unsigned char * sid, CrFwPckt_t pckt)
+{
+  *sid = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ3DefineHkDrParamGetPeriod(unsigned short * period, CrFwPckt_t pckt)
+{
+  *period = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 1);
+  return;
+}
+
+void CrIaServ3DefineHkDrParamGetNoDataItemId(unsigned short * noDataItemId, CrFwPckt_t pckt)
+{
+  *noDataItemId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 3);
+  return;
+}
+
+void CrIaServ3DefineHkDrParamGetDataItemId(unsigned int * dataItemId, unsigned short length, unsigned short offset, CrFwPckt_t pckt)
+{
+  (void) length;
+
+  *dataItemId = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 5 + offset);
+  
+  /* Mantis 1867 is overruled by Mantis 2247, which wants to remove the back-door */
+  if (*dataItemId > ADS_PARAM_OFFSET)
+    {
+      *dataItemId -= ADS_PARAM_OFFSET;
+    }
+  else
+    {
+      /* remove back-door */
+      *dataItemId = 0;
+    }
+  return;
+}
+
+void CrIaServ3ClrHkDrParamGetSid(unsigned char * sid, CrFwPckt_t pckt)
+{
+  *sid = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ3EnbHkDrGenParamGetSid(unsigned char * sid, CrFwPckt_t pckt)
+{
+  *sid = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ3DisHkDrGenParamGetSid(unsigned char * sid, CrFwPckt_t pckt)
+{
+  *sid = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ3SetHkRepFreqParamGetSid(unsigned char * sid, CrFwPckt_t pckt)
+{
+  *sid = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ3SetHkRepFreqParamGetSpare(unsigned char * spare, CrFwPckt_t pckt)
+{
+  *spare = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 1);
+  return;
+}
+
+void CrIaServ3SetHkRepFreqParamGetPeriod(unsigned short * period, CrFwPckt_t pckt)
+{
+  *period = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2);
+  return;
+}
+
+void CrIaServ5EnbEvtRepGenParamGetEvtId(unsigned short * evtId, CrFwPckt_t pckt)
+{
+  *evtId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ5DisEvtRepGenParamGetEvtId(unsigned short * evtId, CrFwPckt_t pckt)
+{
+  *evtId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ6LoadMemParamGetDpuMemoryId(unsigned short * dpuMemoryId, CrFwPckt_t pckt)
+{
+  *dpuMemoryId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ6LoadMemParamGetStartAddress(unsigned int * startAddress, CrFwPckt_t pckt)
+{
+  *startAddress = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2);
+  return;
+}
+
+void CrIaServ6LoadMemParamGetBlockLength(unsigned int * blockLength, CrFwPckt_t pckt)
+{
+  *blockLength = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 6);
+  return;
+}
+
+void CrIaServ6LoadMemParamGetBlockData(unsigned char * blockData, unsigned short length, CrFwPckt_t pckt)
+{
+  memcpy(blockData, &pckt[OFFSET_PAR_LENGTH_IN_CMD_PCKT + 10], length);
+  return;
+}
+
+void CrIaServ6DumpMemParamGetDpuMemoryId(unsigned short * dpuMemoryId, CrFwPckt_t pckt)
+{
+  *dpuMemoryId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ6DumpMemParamGetStartAddress(unsigned int * startAddress, CrFwPckt_t pckt)
+{
+  *startAddress = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2);
+  return;
+}
+
+void CrIaServ6DumpMemParamGetBlockLength(unsigned int * blockLength, CrFwPckt_t pckt)
+{
+  *blockLength = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 6);
+  return;
+}
+
+void CrIaServ6DumpRepMemParamGetDpuMemoryId(unsigned short * dpuMemoryId, CrFwPckt_t pckt)
+{
+  *dpuMemoryId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0);
+  return;
+}
+
+void CrIaServ6DumpRepMemParamGetStartAddress(unsigned int * startAddress, CrFwPckt_t pckt)
+{
+  *startAddress = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2);
+  return;
+}
+
+void CrIaServ6DumpRepMemParamGetBlockLength(unsigned int * blockLength, CrFwPckt_t pckt)
+{
+  *blockLength = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6);
+  return;
+}
+
+void CrIaServ13FstDwlkParamGetSduId(unsigned char * sduId, CrFwPckt_t pckt)
+{
+  *sduId = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0);
+  return;
+}
+
+void CrIaServ13IntmDwlkParamGetSduId(unsigned char * sduId, CrFwPckt_t pckt)
+{
+  *sduId = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0);
+  return;
+}
+
+void CrIaServ13LastDwlkParamGetSduId(unsigned char * sduId, CrFwPckt_t pckt)
+{
+  *sduId = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0);
+  return;
+}
+
+void CrIaServ13AbrtDwlkParamGetSduId(unsigned char * sduId, CrFwPckt_t pckt)
+{
+  *sduId = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ13TrgLrgDataTsfrParamGetSduId(unsigned char * sduId, CrFwPckt_t pckt)
+{
+  *sduId = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ191EnbFdChkParamGetFdChkId(unsigned short * fdChkId, CrFwPckt_t pckt)
+{
+  *fdChkId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ191DisFdChkParamGetFdChkId(unsigned short * fdChkId, CrFwPckt_t pckt)
+{
+  *fdChkId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ191EnbRecovProcParamGetFdChkId(unsigned short * fdChkId, CrFwPckt_t pckt)
+{
+  *fdChkId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ191DisRecovProcParamGetFdChkId(unsigned short * fdChkId, CrFwPckt_t pckt)
+{
+  *fdChkId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ194StartAlgoParamGetAlgoId(unsigned short * algoId, CrFwPckt_t pckt)
+{
+  *algoId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ194StartAlgoParamGetAlgoParams(unsigned char * algoParams, unsigned short length, CrFwPckt_t pckt)
+{
+#if(__sparc__)
+  memcpy(algoParams, &pckt[OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2], length);
+#else
+  /* the parameters should always be 4 in length, so we should never have a problem here */
+  if (length == 4)
+    {
+      algoParams[0] = pckt[OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2 + 3];
+      algoParams[1] = pckt[OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2 + 2];
+      algoParams[2] = pckt[OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2 + 1];
+      algoParams[3] = pckt[OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2 + 0];
+    }
+#endif
+
+  return;
+}
+
+void CrIaServ194StopAlgoParamGetAlgoId(unsigned short * algoId, CrFwPckt_t pckt)
+{
+  *algoId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ194SusAlgoParamGetAlgoId(unsigned short * algoId, CrFwPckt_t pckt)
+{
+  *algoId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ194ResAlgoParamGetAlgoId(unsigned short * algoId, CrFwPckt_t pckt)
+{
+  *algoId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ194SaaEvalAlgoParamGetInitSaaCounter(unsigned int * initSaaCounter, CrFwPckt_t pckt)
+{
+  *initSaaCounter = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2);
+  return;
+}
+
+void CrIaServ196StarMapCmdParamGetObservationId(unsigned int * observationId, CrFwPckt_t pckt)
+{
+  *observationId = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ196StarMapCmdParamGetAcqAlgoId(unsigned short * acqAlgoId, CrFwPckt_t pckt)
+{
+  *acqAlgoId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 4);
+  return;
+}
+
+void CrIaServ196StarMapCmdParamGetSPARE(unsigned int * sPARE, CrFwPckt_t pckt)
+{
+  *sPARE = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 6);
+  return;
+}
+
+void CrIaServ196StarMapCmdParamGetSkyPattern(unsigned char * skyPattern, CrFwPckt_t pckt)
+{
+  unsigned int i;
+  for(i = 0; i < 276; i++) /* NOTE: was 982 = 1004 (StarMap packet) - 2 (CRC) - 10 (PUS hdr) - 10 (StarMap Header) */
+    {
+      skyPattern[i] = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 10 + i);
+    }
+  return;
+}
+
+void CrIaServ197RepBootParamGetDpuMemoryId(unsigned short * dpuMemoryId, CrFwPckt_t pckt)
+{
+  *dpuMemoryId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ197RepBootParamGetStartAddress(unsigned int * startAddress, CrFwPckt_t pckt)
+{
+  *startAddress = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2);
+  return;
+}
+
+void CrIaServ198ProcStartParamGetProcId(unsigned short * procId, CrFwPckt_t pckt)
+{
+  *procId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ198ProcStartParamGetProcParams(unsigned char * procParams, unsigned short length, CrFwPckt_t pckt)
+{
+  memcpy(procParams, &pckt[OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2], length);
+  return;
+}
+
+void CrIaServ198ProcStopParamGetProcId(unsigned short * procId, CrFwPckt_t pckt)
+{
+  *procId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ198SaveImgPrParamGetSaveTarget(unsigned short * saveTarget, CrFwPckt_t pckt)
+{
+  *saveTarget = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2);
+  return;
+}
+
+void CrIaServ198SaveImgPrParamGetFbfInit(unsigned char * fbfInit, CrFwPckt_t pckt)
+{
+  *fbfInit = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 4);
+  return;
+}
+
+void CrIaServ198SaveImgPrParamGetFbfEnd(unsigned char * fbfEnd, CrFwPckt_t pckt)
+{
+  *fbfEnd = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 5);
+  return;
+}
+
+void CrIaServ198AcqFullDropParamGetExpTime(unsigned int * expTime, CrFwPckt_t pckt)
+{
+  *expTime = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2);
+  return;
+}
+
+void CrIaServ198AcqFullDropParamGetImageRep(unsigned int * imageRep, CrFwPckt_t pckt)
+{
+  *imageRep = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 6);
+  return;
+}
+
+void CrIaServ198CalFullSnapParamGetExpTime(unsigned int * expTime, CrFwPckt_t pckt)
+{
+  *expTime = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2);
+  return;
+}
+
+void CrIaServ198CalFullSnapParamGetImageRep(unsigned int * imageRep, CrFwPckt_t pckt)
+{
+  *imageRep = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 6);
+  return;
+}
+
+void CrIaServ198CalFullSnapParamGetNmbImages(unsigned int * nmbImages, CrFwPckt_t pckt)
+{
+  *nmbImages = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 10);
+  return;
+}
+
+void CrIaServ198CalFullSnapParamGetCentSel(unsigned short * centSel, CrFwPckt_t pckt)
+{
+  *centSel = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 14);
+  return;
+}
+
+void CrIaServ198FbfLoadPrParamGetFbfId(unsigned char * fbfId, CrFwPckt_t pckt)
+{
+  *fbfId = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2);
+  return;
+}
+
+void CrIaServ198FbfLoadPrParamGetFbfNBlocks(unsigned char * fbfNBlocks, CrFwPckt_t pckt)
+{
+  *fbfNBlocks = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 3);
+  return;
+}
+
+void CrIaServ198FbfLoadPrParamGetFbfRamAreaId(unsigned short * fbfRamAreaId, CrFwPckt_t pckt)
+{
+  *fbfRamAreaId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 4);
+  return;
+}
+
+void CrIaServ198FbfLoadPrParamGetFbfRamAddr(unsigned int * fbfRamAddr, CrFwPckt_t pckt)
+{
+  *fbfRamAddr = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 6);
+  return;
+}
+
+void CrIaServ198FbfSavePrParamGetFbfId(unsigned char * fbfId, CrFwPckt_t pckt)
+{
+  *fbfId = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2);
+  return;
+}
+
+void CrIaServ198FbfSavePrParamGetFbfNBlocks(unsigned char * fbfNBlocks, CrFwPckt_t pckt)
+{
+  *fbfNBlocks = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 3);
+  return;
+}
+
+void CrIaServ198FbfSavePrParamGetFbfRamAreaId(unsigned short * fbfRamAreaId, CrFwPckt_t pckt)
+{
+  *fbfRamAreaId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 4);
+  return;
+}
+
+void CrIaServ198FbfSavePrParamGetFbfRamAddr(unsigned int * fbfRamAddr, CrFwPckt_t pckt)
+{
+  *fbfRamAddr = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 6);
+  return;
+}
+
+void CrIaServ198SciStackPrParamGetNmbImages(unsigned int * nmbImages, CrFwPckt_t pckt)
+{
+  *nmbImages = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2);
+  return;
+}
+
+void CrIaServ198SciStackPrParamGetCcdRdMode(unsigned short * ccdRdMode, CrFwPckt_t pckt)
+{
+  *ccdRdMode = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 6);
+  return;
+}
+
+void CrIaServ198SciStackPrParamGetExpTime(unsigned int * expTime, CrFwPckt_t pckt)
+{
+  *expTime = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 8);
+  return;
+}
+
+void CrIaServ198SciStackPrParamGetImageRep(unsigned int * imageRep, CrFwPckt_t pckt)
+{
+  *imageRep = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 12);
+  return;
+}
+
+void CrIaServ198SciStackPrParamGetWinPosX(unsigned short * winPosX, CrFwPckt_t pckt)
+{
+  *winPosX = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 16);
+  return;
+}
+
+void CrIaServ198SciStackPrParamGetWinPosY(unsigned short * winPosY, CrFwPckt_t pckt)
+{
+  *winPosY = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 18);
+  return;
+}
+
+void CrIaServ198SciStackPrParamGetWinSizeX(unsigned short * winSizeX, CrFwPckt_t pckt)
+{
+  *winSizeX = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 20);
+  return;
+}
+
+void CrIaServ198SciStackPrParamGetWinSizeY(unsigned short * winSizeY, CrFwPckt_t pckt)
+{
+  *winSizeY = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 22); /* NOTE: was 23 */
+  return;
+}
+
+void CrIaServ198SciStackPrParamGetCentSel(unsigned short * centSel, CrFwPckt_t pckt)
+{
+  *centSel = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 24);
+  return;
+}
+
+void CrIaServ198FbfToGndPrParamGetNmbFbf(unsigned char * nmbFbf, CrFwPckt_t pckt)
+{
+  *nmbFbf = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2);
+  return;
+}
+
+void CrIaServ198FbfToGndPrParamGetFbfInit(unsigned char * fbfInit, CrFwPckt_t pckt)
+{
+  *fbfInit = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 3);
+  return;
+}
+
+void CrIaServ198FbfToGndPrParamGetFbfSize(unsigned char * fbfSize, CrFwPckt_t pckt)
+{
+  *fbfSize = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 4);
+  return;
+}
+
+/* --- Nominal Science ----------------------------------------------------------------------- */
+
+void CrIaServ198NomSciPrParamGetAcqFlag(unsigned char * acqFlag, CrFwPckt_t pckt)
+{
+  *acqFlag = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetCal1Flag(unsigned char * cal1Flag, CrFwPckt_t pckt)
+{
+  *cal1Flag = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 3);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetSciFlag(unsigned char * sciFlag, CrFwPckt_t pckt)
+{
+  *sciFlag = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 4);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetCal2Flag(unsigned char * cal2Flag, CrFwPckt_t pckt)
+{
+  *cal2Flag = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 5);
+  return;
+}
+
+/* --- Nominal Science ----------------------------------------------------------------------- */
+
+void CrIaServ198NomSciPrParamGetCibNFull(unsigned char * cibNFull, CrFwPckt_t pckt)
+{
+  *cibNFull = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 6);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetCibSizeFull(unsigned short * cibSizeFull, CrFwPckt_t pckt)
+{
+  *cibSizeFull = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 7);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetSibNFull(unsigned char * sibNFull, CrFwPckt_t pckt)
+{
+  *sibNFull = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 9);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetSibSizeFull(unsigned short * sibSizeFull, CrFwPckt_t pckt)
+{
+  *sibSizeFull = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 10);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetGibNFull(unsigned char * gibNFull, CrFwPckt_t pckt)
+{
+  *gibNFull = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 12);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetGibSizeFull(unsigned short * gibSizeFull, CrFwPckt_t pckt)
+{
+  *gibSizeFull = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 13);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetSibNWin(unsigned char * sibNWin, CrFwPckt_t pckt)
+{
+  *sibNWin = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 15);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetSibSizeWin(unsigned short * sibSizeWin, CrFwPckt_t pckt)
+{
+  *sibSizeWin = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 16);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetCibNWin(unsigned char * cibNWin, CrFwPckt_t pckt)
+{
+  *cibNWin = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 18);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetCibSizeWin(unsigned short * cibSizeWin, CrFwPckt_t pckt)
+{
+  *cibSizeWin = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 19);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetGibNWin(unsigned char * gibNWin, CrFwPckt_t pckt)
+{
+  *gibNWin = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 21);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetGibSizeWin(unsigned short * gibSizeWin, CrFwPckt_t pckt)
+{
+  *gibSizeWin = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 22);
+  return;
+}
+
+/* --- Nominal Science ----------------------------------------------------------------------- */
+
+void CrIaServ198NomSciPrParamGetExpTimeAcq(unsigned int * expTimeAcq, CrFwPckt_t pckt)
+{
+  *expTimeAcq = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 24);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetImageRepAcq(unsigned int * imageRepAcq, CrFwPckt_t pckt)
+{
+  *imageRepAcq = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 28);
+  return;
+}
+
+/* --- Nominal Science ----------------------------------------------------------------------- */
+
+void CrIaServ198NomSciPrParamGetExpTimeCal1(unsigned int * expTimeCal1, CrFwPckt_t pckt)
+{
+  *expTimeCal1 = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 32);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetImageRepCal1(unsigned int * imageRepCal1, CrFwPckt_t pckt)
+{
+  *imageRepCal1 = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 36);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetNmbImagesCal1(unsigned int * nmbImagesCal1, CrFwPckt_t pckt)
+{
+  *nmbImagesCal1 = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 40);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetCentSelCal1(unsigned short * centSelCal1, CrFwPckt_t pckt)
+{
+  *centSelCal1 = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 44);
+  return;
+}
+
+/* --- Nominal Science ----------------------------------------------------------------------- */
+
+void CrIaServ198NomSciPrParamGetNmbImagesSci(unsigned int * nmbImagesSci, CrFwPckt_t pckt)
+{
+  *nmbImagesSci = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 46);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetCcdRdModeSci(unsigned short * ccdRdModeSci, CrFwPckt_t pckt)
+{
+  *ccdRdModeSci = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 50);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetExpTimeSci(unsigned int * expTimeSci, CrFwPckt_t pckt)
+{
+  *expTimeSci = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 52);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetImageRepSci(unsigned int * imageRepSci, CrFwPckt_t pckt)
+{
+  *imageRepSci = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 56);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetWinPosXSci(unsigned short * winPosXSci, CrFwPckt_t pckt)
+{
+  *winPosXSci = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 60);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetWinPosYSci(unsigned short * winPosYSci, CrFwPckt_t pckt)
+{
+  *winPosYSci = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 62);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetWinSizeXSci(unsigned short * winSizeXSci, CrFwPckt_t pckt)
+{
+  *winSizeXSci = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 64);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetWinSizeYSci(unsigned short * winSizeYSci, CrFwPckt_t pckt)
+{
+  *winSizeYSci = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 66);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetCentSelSci(unsigned short * centSelSci, CrFwPckt_t pckt)
+{
+  *centSelSci = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 68);
+  return;
+}
+
+/* --- Nominal Science ----------------------------------------------------------------------- */
+
+void CrIaServ198NomSciPrParamGetExpTimeCal2(unsigned int * expTimeCal2, CrFwPckt_t pckt)
+{
+  *expTimeCal2 = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 70);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetImageRepCal2(unsigned int * imageRepCal2, CrFwPckt_t pckt)
+{
+  *imageRepCal2 = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 74);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetNmbImagesCal2(unsigned int * nmbImagesCal2, CrFwPckt_t pckt)
+{
+  *nmbImagesCal2 = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 78);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetCentSelCal2(unsigned short * centSelCal2, CrFwPckt_t pckt)
+{
+  *centSelCal2 = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 82);
+  return;
+}
+
+/* --- Nominal Science ----------------------------------------------------------------------- */
+
+void CrIaServ198NomSciPrParamGetSaveTarget(unsigned short * saveTarget, CrFwPckt_t pckt)
+{
+  *saveTarget = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 84);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetFbfInit(unsigned char * fbfInit, CrFwPckt_t pckt)
+{
+  *fbfInit = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 86);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetFbfEnd(unsigned char * fbfEnd, CrFwPckt_t pckt)
+{
+  *fbfEnd = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 87);
+  return;
+}
+
+/* --- Nominal Science ----------------------------------------------------------------------- */
+
+void CrIaServ198NomSciPrParamGetStckOrderCal1(unsigned short * stckOrderCal1, CrFwPckt_t pckt)
+{
+  *stckOrderCal1 = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 88);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetStckOrderSci(unsigned short * stckOrderSci, CrFwPckt_t pckt)
+{
+  *stckOrderSci = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 90);
+  return;
+}
+
+void CrIaServ198NomSciPrParamGetStckOrderCal2(unsigned short * stckOrderCal2, CrFwPckt_t pckt)
+{
+  *stckOrderCal2 = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 92);
+  return;
+}
+
+/* --- Nominal Science ----------------------------------------------------------------------- */
+
+/* NOTE: 0 1 are procedure ID, 2 3 are the sdb cmd */
+void CrIaServ198ConfigSdbPrParamGetSdbCmd(unsigned short * sdbCmd, CrFwPckt_t pckt)
+{
+  *sdbCmd = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2);
+  return;
+}
+
+void CrIaServ198ConfigSdbPrParamGetCibNFull(unsigned char * cibNFull, CrFwPckt_t pckt)
+{
+  *cibNFull = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 4);
+  return;
+}
+
+void CrIaServ198ConfigSdbPrParamGetCibSizeFull(unsigned short * cibSizeFull, CrFwPckt_t pckt)
+{
+  *cibSizeFull = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 5);
+  return;
+}
+
+void CrIaServ198ConfigSdbPrParamGetSibNFull(unsigned char * sibNFull, CrFwPckt_t pckt)
+{
+  *sibNFull = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 7);
+  return;
+}
+
+void CrIaServ198ConfigSdbPrParamGetSibSizeFull(unsigned short * sibSizeFull, CrFwPckt_t pckt)
+{
+  *sibSizeFull = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 8);
+  return;
+}
+
+void CrIaServ198ConfigSdbPrParamGetGibNFull(unsigned char * gibNFull, CrFwPckt_t pckt)
+{
+  *gibNFull = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 10);
+  return;
+}
+
+void CrIaServ198ConfigSdbPrParamGetGibSizeFull(unsigned short * gibSizeFull, CrFwPckt_t pckt)
+{
+  *gibSizeFull = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 11);
+  return;
+}
+
+void CrIaServ198ConfigSdbPrParamGetSibNWin(unsigned char * sibNWin, CrFwPckt_t pckt)
+{
+  *sibNWin = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 13);
+  return;
+}
+
+void CrIaServ198ConfigSdbPrParamGetSibSizeWin(unsigned short * sibSizeWin, CrFwPckt_t pckt)
+{
+  *sibSizeWin = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 14);
+  return;
+}
+
+void CrIaServ198ConfigSdbPrParamGetCibNWin(unsigned char * cibNWin, CrFwPckt_t pckt)
+{
+  *cibNWin = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 16);
+  return;
+}
+
+void CrIaServ198ConfigSdbPrParamGetCibSizeWin(unsigned short * cibSizeWin, CrFwPckt_t pckt)
+{
+  *cibSizeWin = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 17);
+  return;
+}
+
+void CrIaServ198ConfigSdbPrParamGetGibNWin(unsigned char * gibNWin, CrFwPckt_t pckt)
+{
+  *gibNWin = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 19);
+  return;
+}
+
+void CrIaServ198ConfigSdbPrParamGetGibSizeWin(unsigned short * gibSizeWin, CrFwPckt_t pckt)
+{
+  *gibSizeWin = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 20);
+  return;
+}
+
+void CrIaServ211UpdateParParamGetNoParams(unsigned short * noParams, CrFwPckt_t pckt)
+{
+  *noParams = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 0);
+  return;
+}
+
+void CrIaServ211UpdateParParamGetParamId(unsigned int * paramId, unsigned short offset, CrFwPckt_t pckt)
+{
+  *paramId = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 2 + offset);
+
+  /* Mantis 1867 is overruled by Mantis 2247, which wants to remove the back-door */
+  if (*paramId > ADS_PARAM_OFFSET)
+    {
+      *paramId -= ADS_PARAM_OFFSET;
+    }
+  else
+    {
+      /* remove back-door */
+      *paramId = 0;
+    }
+  
+  return;
+}
+
+void CrIaServ211UpdateParParamGetParamType(unsigned char * paramType, unsigned short offset, CrFwPckt_t pckt)
+{
+  *paramType = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 6 + offset);
+  return;
+}
+
+void CrIaServ211UpdateParParamGetArrayElemId(unsigned short * arrayElemId, unsigned short offset, CrFwPckt_t pckt)
+{
+
+  *arrayElemId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_CMD_PCKT + 7 + offset);
+  return;
+}
+
+void CrIaServ211UpdateParParamGetParamValue(unsigned char * paramValue, unsigned short offset, unsigned short length, CrFwPckt_t pckt)
+{
+  memcpy(paramValue, &pckt[OFFSET_PAR_LENGTH_IN_CMD_PCKT + 9 + offset], length);
+  return;
+}
+
diff --git a/CrIa/src/Services/General/CrIaParamGetter.h b/CrIa/src/Services/General/CrIaParamGetter.h
new file mode 100644
index 0000000..77e0268
--- /dev/null
+++ b/CrIa/src/Services/General/CrIaParamGetter.h
@@ -0,0 +1,948 @@
+/**
+ * @file CrIaParamGetter.h
+ *
+ * Declaration of the getter operations for all parameters of all in-coming packets.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_PARAM_GETTER_H
+#define CRIA_PARAM_GETTER_H
+
+#include <Pckt/CrFwPckt.h>
+#include <CrFwConstants.h>
+
+/**
+ * Gets the value of the parameter Sid of the Define New Housekeeping Data Report packet.
+ * @param sid Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ3DefineHkDrParamGetSid(unsigned char * sid, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter Period of the Define New Housekeeping Data Report packet.
+ * @param period Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ3DefineHkDrParamGetPeriod(unsigned short * period, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter NoDataItemId of the Define New Housekeeping Data Report packet.
+ * @param noDataItemId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ3DefineHkDrParamGetNoDataItemId(unsigned short * noDataItemId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter DataItemId of the Define New Housekeeping Data Report packet.
+ * @param dataItemId Pointer to the parameter that will be filled with data from the packet.
+ * @param length Length of dataItemId.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ3DefineHkDrParamGetDataItemId(unsigned int * dataItemId, unsigned short length, unsigned short offset, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter Sid of the Clear Housekeeping Data Report packet.
+ * @param sid Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ3ClrHkDrParamGetSid(unsigned char * sid, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter Sid of the Enable Housekeeping Data Report Generation packet.
+ * @param sid Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ3EnbHkDrGenParamGetSid(unsigned char * sid, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter Sid of the Disable Housekeeping Data Report Generation packet.
+ * @param sid Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ3DisHkDrGenParamGetSid(unsigned char * sid, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter Sid of the Set Housekeeping Reporting Destination packet.
+ * @param sid Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ3SetHkRepDestParamGetSid(unsigned char * sid, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter Dest of the Set Housekeeping Reporting Destination packet.
+ * @param dest Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ3SetHkRepDestParamGetDest(unsigned short * dest, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter Sid of the Set Housekeeping Reporting Frequency packet.
+ * @param sid Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ3SetHkRepFreqParamGetSid(unsigned char * sid, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter Spare of the Set Housekeeping Reporting Frequency packet.
+ * @param spare Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ3SetHkRepFreqParamGetSpare(unsigned char * spare, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter Period of the Set Housekeeping Reporting Frequency packet.
+ * @param period Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ3SetHkRepFreqParamGetPeriod(unsigned short * period, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter EvtId of the Enable Event Report Generation packet.
+ * @param evtId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ5EnbEvtRepGenParamGetEvtId(unsigned short * evtId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter EvtId of the Disable Event Report Generation packet.
+ * @param evtId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ5DisEvtRepGenParamGetEvtId(unsigned short * evtId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter DpuMemoryId of the Load Memory using Absolute Addresses packet.
+ * @param dpuMemoryId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ6LoadMemParamGetDpuMemoryId(unsigned short * dpuMemoryId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter StartAddress of the Load Memory using Absolute Addresses packet.
+ * @param startAddress Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ6LoadMemParamGetStartAddress(unsigned int * startAddress, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter BlockLength of the Load Memory using Absolute Addresses packet.
+ * @param blockLength Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ6LoadMemParamGetBlockLength(unsigned int * blockLength, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter BlockData of the Load Memory using Absolute Addresses packet.
+ * @param blockData Pointer to the parameter that will be filled with data from the packet.
+ * @param length Length of blockData.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ6LoadMemParamGetBlockData(unsigned char * blockData, unsigned short length, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter DpuMemoryId of the Dump Memory using Absolute Addresses packet.
+ * @param dpuMemoryId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ6DumpMemParamGetDpuMemoryId(unsigned short * dpuMemoryId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter StartAddress of the Dump Memory using Absolute Addresses packet.
+ * @param startAddress Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ6DumpMemParamGetStartAddress(unsigned int * startAddress, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter BlockLength of the Dump Memory using Absolute Addresses packet.
+ * @param blockLength Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ6DumpMemParamGetBlockLength(unsigned int * blockLength, CrFwPckt_t pckt);
+
+void CrIaServ6DumpRepMemParamGetDpuMemoryId(unsigned short * dpuMemoryId, CrFwPckt_t pckt);
+
+void CrIaServ6DumpRepMemParamGetStartAddress(unsigned int * startAddress, CrFwPckt_t pckt);
+
+void CrIaServ6DumpRepMemParamGetBlockLength(unsigned int * blockLength, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter SduId of the Abort Downlink packet.
+ * @param sduId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ13AbrtDwlkParamGetSduId(unsigned char * sduId, CrFwPckt_t pckt);
+
+void CrIaServ13FstDwlkParamGetSduId(unsigned char * sduId, CrFwPckt_t pckt);
+
+void CrIaServ13IntmDwlkParamGetSduId(unsigned char * sduId, CrFwPckt_t pckt);
+
+void CrIaServ13LastDwlkParamGetSduId(unsigned char * sduId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter SduId of the Trigger Large Data Transfer packet.
+ * @param sduId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ13TrgLrgDataTsfrParamGetSduId(unsigned char * sduId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter FdChkId of the Enable FdCheck packet.
+ * @param fdChkId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ191EnbFdChkParamGetFdChkId(unsigned short * fdChkId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter FdChkId of the Disable FdCheck packet.
+ * @param fdChkId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ191DisFdChkParamGetFdChkId(unsigned short * fdChkId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter FdChkId of the Enable Recovery Procedure packet.
+ * @param fdChkId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ191EnbRecovProcParamGetFdChkId(unsigned short * fdChkId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter FdChkId of the Disable Recovery Procedure packet.
+ * @param fdChkId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ191DisRecovProcParamGetFdChkId(unsigned short * fdChkId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter AlgoId of the Start Algorithm packet.
+ * @param algoId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ194StartAlgoParamGetAlgoId(unsigned short * algoId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter AlgoParams of the Start Algorithm packet.
+ * @param algoParams Pointer to the parameter that will be filled with data from the packet.
+ * @param length Length of algoParams.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ194StartAlgoParamGetAlgoParams(unsigned char * algoParams, unsigned short length, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter AlgoId of the Stop Algorithm packet.
+ * @param algoId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ194StopAlgoParamGetAlgoId(unsigned short * algoId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter AlgoId of the Suspend Algorithm packet.
+ * @param algoId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ194SusAlgoParamGetAlgoId(unsigned short * algoId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter AlgoId of the Resume Algorithm packet.
+ * @param algoId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ194ResAlgoParamGetAlgoId(unsigned short * algoId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter InitSaaCounter of the SAA Evaluation Algorithm packet.
+ * @param initSaaCounter Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ194SaaEvalAlgoParamGetInitSaaCounter(unsigned int * initSaaCounter, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ObservationId of the Star Map Command packet.
+ * @param observationId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ196StarMapCmdParamGetObservationId(unsigned int * observationId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter AcqAlgoId of the Star Map Command packet.
+ * @param acqAlgoId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ196StarMapCmdParamGetAcqAlgoId(unsigned short * acqAlgoId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter SPARE of the Star Map Command packet.
+ * @param SPARE Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ196StarMapCmdParamGetSPARE(unsigned int * sPARE, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter SkyPattern of the Star Map Command packet.
+ * @param skyPattern Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ196StarMapCmdParamGetSkyPattern(unsigned char * skyPattern, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter DpuMemoryId of the Generate Boot Report packet.
+ * @param dpuMemoryId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ197RepBootParamGetDpuMemoryId(unsigned short * dpuMemoryId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter StartAddress of the Generate Boot Report packet.
+ * @param startAddress Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ197RepBootParamGetStartAddress(unsigned int * startAddress, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ProcId of the Start Procedure packet.
+ * @param procId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198ProcStartParamGetProcId(unsigned short * procId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ProcParams of the Start Procedure packet.
+ * @param procParams Pointer to the parameter that will be filled with data from the packet.
+ * @param length Length of procParams.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198ProcStartParamGetProcParams(unsigned char * procParams, unsigned short length, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ProcId of the Stop Procedure packet.
+ * @param procId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198ProcStopParamGetProcId(unsigned short * procId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter SaveTarget of the Save Images Procedure packet.
+ * @param saveTarget Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198SaveImgPrParamGetSaveTarget(unsigned short * saveTarget, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter FbfInit of the Save Images Procedure packet.
+ * @param fbfInit Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198SaveImgPrParamGetFbfInit(unsigned char * fbfInit, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter FbfEnd of the Save Images Procedure packet.
+ * @param fbfEnd Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198SaveImgPrParamGetFbfEnd(unsigned char * fbfEnd, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ExpTime of the Acquire Full Drop packet.
+ * @param expTime Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198AcqFullDropParamGetExpTime(unsigned int * expTime, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ImageRep of the Acquire Full Drop packet.
+ * @param imageRep Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198AcqFullDropParamGetImageRep(unsigned int * imageRep, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ExpTime of the Calibrate Full Snap packet.
+ * @param expTime Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198CalFullSnapParamGetExpTime(unsigned int * expTime, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ImageRep of the Calibrate Full Snap packet.
+ * @param imageRep Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198CalFullSnapParamGetImageRep(unsigned int * imageRep, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter NmbImages of the Calibrate Full Snap packet.
+ * @param nmbImages Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198CalFullSnapParamGetNmbImages(unsigned int * nmbImages, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter CentSel of the Calibrate Full Snap packet.
+ * @param centSel Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198CalFullSnapParamGetCentSel(unsigned short * centSel, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter FbfId of the FBF Load Procedure packet.
+ * @param fbfId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198FbfLoadPrParamGetFbfId(unsigned char * fbfId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter FbfNBlocks of the FBF Load Procedure packet.
+ * @param fbfNBlocks Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198FbfLoadPrParamGetFbfNBlocks(unsigned char * fbfNBlocks, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter FbfRamAreaId of the FBF Load Procedure packet.
+ * @param fbfRamAreaId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198FbfLoadPrParamGetFbfRamAreaId(unsigned short * fbfRamAreaId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter FbfRamAddr of the FBF Load Procedure packet.
+ * @param fbfRamAddr Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198FbfLoadPrParamGetFbfRamAddr(unsigned int * fbfRamAddr, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter FbfId of the FBF Save Procedure packet.
+ * @param fbfId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198FbfSavePrParamGetFbfId(unsigned char * fbfId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter FbfNBlocks of the FBF Save Procedure packet.
+ * @param fbfNBlocks Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198FbfSavePrParamGetFbfNBlocks(unsigned char * fbfNBlocks, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter FbfRamAreaId of the FBF Save Procedure packet.
+ * @param fbfRamAreaId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198FbfSavePrParamGetFbfRamAreaId(unsigned short * fbfRamAreaId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter FbfRamAddr of the FBF Save Procedure packet.
+ * @param fbfRamAddr Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198FbfSavePrParamGetFbfRamAddr(unsigned int * fbfRamAddr, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter NmbImages of the Science Window Stack/Snap packet.
+ * @param nmbImages Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198SciStackPrParamGetNmbImages(unsigned int * nmbImages, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter CcdRdMode of the Science Window Stack/Snap packet.
+ * @param ccdRdMode Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198SciStackPrParamGetCcdRdMode(unsigned short * ccdRdMode, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ExpTime of the Science Window Stack/Snap packet.
+ * @param expTime Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198SciStackPrParamGetExpTime(unsigned int * expTime, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ImageRep of the Science Window Stack/Snap packet.
+ * @param imageRep Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198SciStackPrParamGetImageRep(unsigned int * imageRep, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter WinPosX of the Science Window Stack/Snap packet.
+ * @param winPosX Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198SciStackPrParamGetWinPosX(unsigned short * winPosX, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter WinPosY of the Science Window Stack/Snap packet.
+ * @param winPosY Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198SciStackPrParamGetWinPosY(unsigned short * winPosY, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter WinSizeX of the Science Window Stack/Snap packet.
+ * @param winSizeX Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198SciStackPrParamGetWinSizeX(unsigned short * winSizeX, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter WinSizeY of the Science Window Stack/Snap packet.
+ * @param winSizeY Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198SciStackPrParamGetWinSizeY(unsigned short * winSizeY, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter CentSel of the Science Window Stack/Snap packet.
+ * @param centSel Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198SciStackPrParamGetCentSel(unsigned short * centSel, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter NmbFbf of the Transfer FBFs To Ground packet.
+ * @param nmbFbf Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198FbfToGndPrParamGetNmbFbf(unsigned char * nmbFbf, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter FbfInit of the Transfer FBFs To Ground packet.
+ * @param fbfInit Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198FbfToGndPrParamGetFbfInit(unsigned char * fbfInit, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter FbfSize of the Transfer FBFs To Ground packet.
+ * @param fbfSize Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198FbfToGndPrParamGetFbfSize(unsigned char * fbfSize, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter AcqFlag of the Nominal Science packet.
+ * @param acqFlag Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetAcqFlag(unsigned char * acqFlag, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter Cal1Flag of the Nominal Science packet.
+ * @param cal1Flag Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetCal1Flag(unsigned char * cal1Flag, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter SciFlag of the Nominal Science packet.
+ * @param sciFlag Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetSciFlag(unsigned char * sciFlag, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter Cal2Flag of the Nominal Science packet.
+ * @param cal2Flag Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetCal2Flag(unsigned char * cal2Flag, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter CibNFull of the Nominal Science packet.
+ * @param cibNFull Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetCibNFull(unsigned char * cibNFull, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter CibSizeFull of the Nominal Science packet.
+ * @param cibSizeFull Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetCibSizeFull(unsigned short * cibSizeFull, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter SibNFull of the Nominal Science packet.
+ * @param sibNFull Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetSibNFull(unsigned char * sibNFull, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter SibSizeFull of the Nominal Science packet.
+ * @param sibSizeFull Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetSibSizeFull(unsigned short * sibSizeFull, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter GibNFull of the Nominal Science packet.
+ * @param gibNFull Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetGibNFull(unsigned char * gibNFull, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter GibSizeFull of the Nominal Science packet.
+ * @param gibSizeFull Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetGibSizeFull(unsigned short * gibSizeFull, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter SibNWin of the Nominal Science packet.
+ * @param sibNWin Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetSibNWin(unsigned char * sibNWin, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter SibSizeWin of the Nominal Science packet.
+ * @param sibSizeWin Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetSibSizeWin(unsigned short * sibSizeWin, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter CibNWin of the Nominal Science packet.
+ * @param cibNWin Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetCibNWin(unsigned char * cibNWin, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter CibSizeWin of the Nominal Science packet.
+ * @param cibSizeWin Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetCibSizeWin(unsigned short * cibSizeWin, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter GibNWin of the Nominal Science packet.
+ * @param gibNWin Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetGibNWin(unsigned char * gibNWin, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter GibSizeWin of the Nominal Science packet.
+ * @param gibSizeWin Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetGibSizeWin(unsigned short * gibSizeWin, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ExpTimeAcq of the Nominal Science packet.
+ * @param expTimeAcq Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetExpTimeAcq(unsigned int * expTimeAcq, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ImageRepAcq of the Nominal Science packet.
+ * @param imageRepAcq Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetImageRepAcq(unsigned int * imageRepAcq, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ExpTimeCal1 of the Nominal Science packet.
+ * @param expTimeCal1 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetExpTimeCal1(unsigned int * expTimeCal1, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ImageRepCal1 of the Nominal Science packet.
+ * @param imageRepCal1 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetImageRepCal1(unsigned int * imageRepCal1, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter NmbImagesCal1 of the Nominal Science packet.
+ * @param nmbImagesCal1 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetNmbImagesCal1(unsigned int * nmbImagesCal1, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter CentSelCal1 of the Nominal Science packet.
+ * @param centSelCal1 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetCentSelCal1(unsigned short * centSelCal1, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter NmbImagesSci of the Nominal Science packet.
+ * @param nmbImagesSci Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetNmbImagesSci(unsigned int * nmbImagesSci, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter CcdRdModeSci of the Nominal Science packet.
+ * @param ccdRdModeSci Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetCcdRdModeSci(unsigned short * ccdRdModeSci, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ExpTimeSci of the Nominal Science packet.
+ * @param expTimeSci Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetExpTimeSci(unsigned int * expTimeSci, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ImageRepSci of the Nominal Science packet.
+ * @param imageRepSci Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetImageRepSci(unsigned int * imageRepSci, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter WinPosXSci of the Nominal Science packet.
+ * @param winPosXSci Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetWinPosXSci(unsigned short * winPosXSci, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter WinPosYSci of the Nominal Science packet.
+ * @param winPosYSci Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetWinPosYSci(unsigned short * winPosYSci, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter WinSizeXSci of the Nominal Science packet.
+ * @param winSizeXSci Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetWinSizeXSci(unsigned short * winSizeXSci, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter WinSizeYSci of the Nominal Science packet.
+ * @param winSizeYSci Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetWinSizeYSci(unsigned short * winSizeYSci, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter CentSelSci of the Nominal Science packet.
+ * @param centSelSci Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetCentSelSci(unsigned short * centSelSci, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ExpTimeCal2 of the Nominal Science packet.
+ * @param expTimeCal2 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetExpTimeCal2(unsigned int * expTimeCal2, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ImageRepCal2 of the Nominal Science packet.
+ * @param imageRepCal2 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetImageRepCal2(unsigned int * imageRepCal2, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter NmbImagesCal2 of the Nominal Science packet.
+ * @param nmbImagesCal2 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetNmbImagesCal2(unsigned int * nmbImagesCal2, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter CentSelCal2 of the Nominal Science packet.
+ * @param centSelCal2 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetCentSelCal2(unsigned short * centSelCal2, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter SaveTarget of the Nominal Science packet.
+ * @param saveTarget Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetSaveTarget(unsigned short * saveTarget, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter FbfInit of the Nominal Science packet.
+ * @param fbfInit Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetFbfInit(unsigned char * fbfInit, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter FbfEnd of the Nominal Science packet.
+ * @param fbfEnd Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetFbfEnd(unsigned char * fbfEnd, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter StckOrderCal1 of the Nominal Science packet.
+ * @param stckOrderCal1 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetStckOrderCal1(unsigned short * stckOrderCal1, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter StckOrderSci of the Nominal Science packet.
+ * @param stckOrderSci Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetStckOrderSci(unsigned short * stckOrderSci, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter StckOrderCal2 of the Nominal Science packet.
+ * @param stckOrderCal2 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198NomSciPrParamGetStckOrderCal2(unsigned short * stckOrderCal2, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter SdbCmd of the Configure SDB packet.
+ * @param sdbCmd Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198ConfigSdbPrParamGetSdbCmd(unsigned short * sdbCmd, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter CibNFull of the Configure SDB packet.
+ * @param cibNFull Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198ConfigSdbPrParamGetCibNFull(unsigned char * cibNFull, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter CibSizeFull of the Configure SDB packet.
+ * @param cibSizeFull Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198ConfigSdbPrParamGetCibSizeFull(unsigned short * cibSizeFull, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter SibNFull of the Configure SDB packet.
+ * @param sibNFull Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198ConfigSdbPrParamGetSibNFull(unsigned char * sibNFull, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter SibSizeFull of the Configure SDB packet.
+ * @param sibSizeFull Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198ConfigSdbPrParamGetSibSizeFull(unsigned short * sibSizeFull, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter GibNFull of the Configure SDB packet.
+ * @param gibNFull Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198ConfigSdbPrParamGetGibNFull(unsigned char * gibNFull, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter GibSizeFull of the Configure SDB packet.
+ * @param gibSizeFull Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198ConfigSdbPrParamGetGibSizeFull(unsigned short * gibSizeFull, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter SibNWin of the Configure SDB packet.
+ * @param sibNWin Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198ConfigSdbPrParamGetSibNWin(unsigned char * sibNWin, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter SibSizeWin of the Configure SDB packet.
+ * @param sibSizeWin Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198ConfigSdbPrParamGetSibSizeWin(unsigned short * sibSizeWin, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter CibNWin of the Configure SDB packet.
+ * @param cibNWin Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198ConfigSdbPrParamGetCibNWin(unsigned char * cibNWin, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter CibSizeWin of the Configure SDB packet.
+ * @param cibSizeWin Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198ConfigSdbPrParamGetCibSizeWin(unsigned short * cibSizeWin, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter GibNWin of the Configure SDB packet.
+ * @param gibNWin Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198ConfigSdbPrParamGetGibNWin(unsigned char * gibNWin, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter GibSizeWin of the Configure SDB packet.
+ * @param gibSizeWin Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ198ConfigSdbPrParamGetGibSizeWin(unsigned short * gibSizeWin, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter NoParams of the Update Parameter packet.
+ * @param noParams Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ211UpdateParParamGetNoParams(unsigned short * noParams, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ParamId of the Update Parameter packet.
+ * @param paramId Pointer to the parameter that will be filled with data from the packet.
+ * @param offset Offset in bytes represents the parameter position in the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ211UpdateParParamGetParamId(unsigned int * paramId, unsigned short offset, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ParamType of the Update Parameter packet.
+ * @param paramType Pointer to the parameter that will be filled with data from the packet.
+ * @param offset Offset in bytes represents the parameter position in the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ211UpdateParParamGetParamType(unsigned char * paramType, unsigned short offset, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ArrayElemId of the Update Parameter packet.
+ * @param arrayElemId Pointer to the parameter that will be filled with data from the packet.
+ * @param offset Offset in bytes represents the parameter position in the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ211UpdateParParamGetArrayElemId(unsigned short * arrayElemId, unsigned short offset, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ParamValue of the Update Parameter packet.
+ * @param paramValue Pointer to the parameter that will be filled with data from the packet.
+ * @param offset Offset in bytes represents the parameter position in the packet.
+ * @param length Length of paramValue.
+ * @param pckt Pointer to the packet.
+ */
+void CrIaServ211UpdateParParamGetParamValue(unsigned char * paramValue, unsigned short offset, unsigned short length, CrFwPckt_t pckt);
+
+#endif /* CRIA_PARAM_GETTER_H */
+
diff --git a/CrIa/src/Services/General/CrIaParamSetter.c b/CrIa/src/Services/General/CrIaParamSetter.c
new file mode 100644
index 0000000..c2e334b
--- /dev/null
+++ b/CrIa/src/Services/General/CrIaParamSetter.c
@@ -0,0 +1,1888 @@
+/**
+ * @file CrIaParamSetter.c
+ * @ingroup CrIaServicesGeneral
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the setter operations for all parameters of all out-going packets.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrIaParamSetter.h"
+#include "CrIaConstants.h"
+#include "CrFwCmpData.h"
+#include "CrIaPckt.h"
+#include "IfswUtilities.h"
+#include "FwSmConfig.h"
+#include <string.h>
+
+
+
+void CrIaServ1AccSuccParamSetTcPacketId(FwSmDesc_t smDesc, unsigned short tcPacketId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0] = (tcPacketId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1] = (tcPacketId & 0xFF);
+  return;
+}
+
+void CrIaServ1AccSuccParamSetTcPacketSeqCtrl(FwSmDesc_t smDesc, unsigned short tcPacketSeqCtrl)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (tcPacketSeqCtrl >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (tcPacketSeqCtrl & 0xFF);
+  return;
+}
+
+void CrIaServ1AccFailParamSetTcPacketId(FwSmDesc_t smDesc, unsigned short tcPacketId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0] = (tcPacketId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1] = (tcPacketId & 0xFF);
+  return;
+}
+
+void CrIaServ1AccFailParamSetTcPacketSeqCtrl(FwSmDesc_t smDesc, unsigned short tcPacketSeqCtrl)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (tcPacketSeqCtrl >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (tcPacketSeqCtrl & 0xFF);
+  return;
+}
+
+void CrIaServ1AccFailParamSetTcFailureCode(FwSmDesc_t smDesc, unsigned short tcFailureCode)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (tcFailureCode >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = (tcFailureCode & 0xFF);
+  return;
+}
+
+void CrIaServ1AccFailParamSetTcType(FwSmDesc_t smDesc, unsigned char tcType)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6] = tcType;
+  return;
+}
+
+void CrIaServ1AccFailParamSetTcSubtype(FwSmDesc_t smDesc, unsigned char tcSubtype)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 7] = tcSubtype;
+  return;
+}
+
+void CrIaServ1AccFailParamSetTcLength(FwSmDesc_t smDesc, unsigned short tcLength)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 8] = (tcLength >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 9] = (tcLength & 0xFF);
+  return;
+}
+
+void CrIaServ1AccFailParamSetTcReceivedBytes(FwSmDesc_t smDesc, unsigned short tcReceivedBytes)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 10] = (tcReceivedBytes >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 11] = (tcReceivedBytes & 0xFF);
+  return;
+}
+
+void CrIaServ1AccFailParamSetTcReceivedCrc(FwSmDesc_t smDesc, unsigned short tcReceivedCrc)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 12] = (tcReceivedCrc >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 13] = (tcReceivedCrc & 0xFF);
+  return;
+}
+
+void CrIaServ1AccFailParamSetTcCalculatedCrc(FwSmDesc_t smDesc, unsigned short tcCalculatedCrc)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 14] = (tcCalculatedCrc >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 15] = (tcCalculatedCrc & 0xFF);
+  return;
+}
+
+void CrIaServ1StartSuccParamSetTcPacketId(FwSmDesc_t smDesc, unsigned short tcPacketId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0] = (tcPacketId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1] = (tcPacketId & 0xFF);
+  return;
+}
+
+void CrIaServ1StartSuccParamSetTcPacketSeqCtrl(FwSmDesc_t smDesc, unsigned short tcPacketSeqCtrl)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (tcPacketSeqCtrl >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (tcPacketSeqCtrl & 0xFF);
+  return;
+}
+
+void CrIaServ1StartFailParamSetTcPacketId(FwSmDesc_t smDesc, unsigned short tcPacketId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0] = (tcPacketId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1] = (tcPacketId & 0xFF);
+  return;
+}
+
+void CrIaServ1StartFailParamSetTcPacketSeqCtrl(FwSmDesc_t smDesc, unsigned short tcPacketSeqCtrl)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (tcPacketSeqCtrl >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (tcPacketSeqCtrl & 0xFF);
+  return;
+}
+
+void CrIaServ1StartFailParamSetTcFailureCode(FwSmDesc_t smDesc, unsigned short tcFailureCode)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (tcFailureCode >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = (char)(tcFailureCode & 0xFF);
+  return;
+}
+
+void CrIaServ1StartFailParamSetTcType(FwSmDesc_t smDesc, unsigned char tcType)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6] = tcType;
+  return;
+}
+
+void CrIaServ1StartFailParamSetTcSubtype(FwSmDesc_t smDesc, unsigned char tcSubtype)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 7] = tcSubtype;
+  return;
+}
+
+void CrIaServ1StartFailParamSetWrongParamPosition(FwSmDesc_t smDesc, unsigned short wrongParamPosition)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 8] = (wrongParamPosition >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 9] = (wrongParamPosition & 0xFF);
+  return;
+}
+
+void CrIaServ1StartFailParamSetWrongParamValue(FwSmDesc_t smDesc, unsigned short wrongParamValue)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 10] = (wrongParamValue >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 11] = (wrongParamValue & 0xFF);
+  return;
+}
+
+void CrIaServ1TermSuccParamSetTcPacketId(FwSmDesc_t smDesc, unsigned short tcPacketId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0] = (tcPacketId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1] = (tcPacketId & 0xFF);
+  return;
+}
+
+void CrIaServ1TermSuccParamSetTcPacketSeqCtrl(FwSmDesc_t smDesc, unsigned short tcPacketSeqCtrl)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (tcPacketSeqCtrl >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (tcPacketSeqCtrl & 0xFF);
+  return;
+}
+
+void CrIaServ1TermFailParamSetTcPacketId(FwSmDesc_t smDesc, unsigned short tcPacketId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0] = (tcPacketId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1] = (tcPacketId & 0xFF);
+  return;
+}
+
+void CrIaServ1TermFailParamSetTcPacketSeqCtrl(FwSmDesc_t smDesc, unsigned short tcPacketSeqCtrl)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (tcPacketSeqCtrl >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (tcPacketSeqCtrl & 0xFF);
+  return;
+}
+
+void CrIaServ1TermFailParamSetTcFailureCode(FwSmDesc_t smDesc, unsigned short tcFailureCode)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (tcFailureCode >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = (tcFailureCode & 0xFF);
+  return;
+}
+
+void CrIaServ1TermFailParamSetTcType(FwSmDesc_t smDesc, unsigned char tcType)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6] = tcType;
+  return;
+}
+
+void CrIaServ1TermFailParamSetTcSubtype(FwSmDesc_t smDesc, unsigned char tcSubtype)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 7] = tcSubtype;
+  return;
+}
+
+void CrIaServ1TermFailParamSetWrongParamPosition(FwSmDesc_t smDesc, unsigned short wrongParamPosition)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 8] = (wrongParamPosition >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 9] = (wrongParamPosition & 0xFF);
+  return;
+}
+
+void CrIaServ1TermFailParamSetWrongParamValue(FwSmDesc_t smDesc, unsigned short wrongParamValue)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 10] = (wrongParamValue >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 11] = (wrongParamValue & 0xFF);
+  return;
+}
+
+
+/* NOTE: we have inserted the event id here, and the remaining parameters are shifted by 2 bytes */
+void CrIaServ5EvtSetEvtId(FwSmDesc_t smDesc, unsigned short evtId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0] = (evtId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1] = (evtId & 0xFF);
+  return;
+}
+
+
+void CrIaServ5EvtSeqCntErrParamSetExpSeqCnt(FwSmDesc_t smDesc, unsigned short expSeqCnt)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (expSeqCnt >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (expSeqCnt & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtSeqCntErrParamSetActSeqCnt(FwSmDesc_t smDesc, unsigned short actSeqCnt)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (actSeqCnt >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = (actSeqCnt & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtInrepCrFailParamSetRepSeqCnt(FwSmDesc_t smDesc, unsigned short repSeqCnt)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (repSeqCnt >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (repSeqCnt & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtPcrl2FullParamSetRepSeqCnt(FwSmDesc_t smDesc, unsigned short repSeqCnt)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (repSeqCnt >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (repSeqCnt & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtFdFailedParamSetFdCheckId(FwSmDesc_t smDesc, unsigned short fdCheckId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (fdCheckId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (fdCheckId & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtRpStartedParamSetFdCheckId(FwSmDesc_t smDesc, unsigned short fdCheckId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (fdCheckId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (fdCheckId & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtRpStartedParamSetRecovProcId(FwSmDesc_t smDesc, unsigned short recovProcId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (recovProcId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = (recovProcId & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtSemTrParamSetSrcSemSt(FwSmDesc_t smDesc, unsigned short srcSemSt)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (srcSemSt >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (srcSemSt & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtSemTrParamSetDestSemSt(FwSmDesc_t smDesc, unsigned short destSemSt)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (destSemSt >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = (destSemSt & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtIaswTrParamSetSrcIaswSt(FwSmDesc_t smDesc, unsigned short srcIaswSt)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (srcIaswSt >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (srcIaswSt & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtIaswTrParamSetDestIaswSt(FwSmDesc_t smDesc, unsigned short destIaswSt)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (destIaswSt >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = (destIaswSt & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtSdscIllParamSetSciSeqCnt(FwSmDesc_t smDesc, unsigned short sciSeqCnt)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (sciSeqCnt >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (sciSeqCnt & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtSdscOosParamSetExpSciSeqCnt(FwSmDesc_t smDesc, unsigned short expSciSeqCnt)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (expSciSeqCnt >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (expSciSeqCnt & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtSdscOosParamSetActSciSeqCnt(FwSmDesc_t smDesc, unsigned short actSciSeqCnt)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (actSciSeqCnt >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = (actSciSeqCnt & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtClctSizeParamSetGibSize(FwSmDesc_t smDesc, unsigned short gibSize)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (gibSize >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (gibSize & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtSibSizeParamSetSibSize(FwSmDesc_t smDesc, unsigned short sibSize)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (sibSize >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (sibSize & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtOolParamParamSetParamId(FwSmDesc_t smDesc, unsigned int paramId) {
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = ( paramId >> 24);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = ((paramId >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = ((paramId >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = ( paramId & 0xFF);
+}
+
+void CrIaServ5EvtInvDestParamSetInvDest(FwSmDesc_t smDesc, unsigned short invDest)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (invDest >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (invDest & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtFbfLoadRiskParamSetFbfId(FwSmDesc_t smDesc, unsigned short fbfId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (fbfId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (fbfId & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtFbfSaveDeniedParamSetFbfId(FwSmDesc_t smDesc, unsigned short fbfId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (fbfId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (fbfId & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtFbfSaveAbrtParamSetFbfId(FwSmDesc_t smDesc, unsigned short fbfId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (fbfId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (fbfId & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtFbfSaveAbrtParamSetFbfNBlocks(FwSmDesc_t smDesc, unsigned short fbfNBlocks)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (fbfNBlocks >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = (fbfNBlocks & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtSdbCnfFailParamSetProcId(FwSmDesc_t smDesc, unsigned short procId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (procId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (procId & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtSdbCnfFailParamSetCibNFull(FwSmDesc_t smDesc, unsigned char cibNFull)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = cibNFull;
+  return;
+}
+
+void CrIaServ5EvtSdbCnfFailParamSetCibSizeFull(FwSmDesc_t smDesc, unsigned short cibSizeFull)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = ((cibSizeFull >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6] = ( cibSizeFull & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtSdbCnfFailParamSetSibNFull(FwSmDesc_t smDesc, unsigned char sibNFull)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 7] = sibNFull;
+  return;
+}
+
+void CrIaServ5EvtSdbCnfFailParamSetSibSizeFull(FwSmDesc_t smDesc, unsigned short sibSizeFull)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 8] = ((sibSizeFull >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 9] = ( sibSizeFull & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtSdbCnfFailParamSetGibNFull(FwSmDesc_t smDesc, unsigned char gibNFull)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 10] = gibNFull;
+  return;
+}
+
+void CrIaServ5EvtSdbCnfFailParamSetGibSizeFull(FwSmDesc_t smDesc, unsigned short gibSizeFull)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 11] = ((gibSizeFull >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 12] = ( gibSizeFull & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtSdbCnfFailParamSetSibNWin(FwSmDesc_t smDesc, unsigned char sibNWin)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 13] = sibNWin;
+  return;
+}
+
+void CrIaServ5EvtSdbCnfFailParamSetSibSizeWin(FwSmDesc_t smDesc, unsigned short sibSizeWin)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 14] = ((sibSizeWin >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 15] = ( sibSizeWin & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtSdbCnfFailParamSetCibNWin(FwSmDesc_t smDesc, unsigned char cibNWin)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 16] = cibNWin;
+  return;
+}
+
+void CrIaServ5EvtSdbCnfFailParamSetCibSizeWin(FwSmDesc_t smDesc, unsigned short cibSizeWin)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 17] = ((cibSizeWin >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 18] = ( cibSizeWin & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtSdbCnfFailParamSetGibNWin(FwSmDesc_t smDesc, unsigned char gibNWin)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 19] = gibNWin;
+  return;
+}
+
+void CrIaServ5EvtSdbCnfFailParamSetGibSizeWin(FwSmDesc_t smDesc, unsigned short gibSizeWin)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 20] = ((gibSizeWin >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 21] = ( gibSizeWin & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtCmprSizeParamSetImgBufferSize(FwSmDesc_t smDesc, unsigned int reqSize)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = ( reqSize >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = ((reqSize >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = ((reqSize >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = ( reqSize & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtSemopTrParamSetSrcSemOpSt(FwSmDesc_t smDesc, unsigned short srcSemOpSt)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (srcSemOpSt >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (srcSemOpSt & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtSemopTrParamSetDestSemOpSt(FwSmDesc_t smDesc, unsigned short destSemOpSt)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (destSemOpSt >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = (destSemOpSt & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtScPrStrtParamSetProcId(FwSmDesc_t smDesc, unsigned short procId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (procId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (procId & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtScPrEndParamSetProcId(FwSmDesc_t smDesc, unsigned short procId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (procId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (procId & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtScPrEndParamSetProcTermCode(FwSmDesc_t smDesc, unsigned short procTermCode)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (procTermCode >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = (procTermCode & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtInstrmPqfParamSetInStreamId(FwSmDesc_t smDesc, unsigned short inStreamId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (inStreamId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (inStreamId & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtOcmpInvdParamSetOutCompId(FwSmDesc_t smDesc, unsigned short outCompId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (outCompId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (outCompId & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtOcmpInvdParamSetInvDest(FwSmDesc_t smDesc, unsigned short invDest)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (invDest >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = (invDest & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtOcmpIllgrParamSetOutStreamId(FwSmDesc_t smDesc, unsigned short outStreamId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (outStreamId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (outStreamId & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtOcmpIllgrParamSetGroupId(FwSmDesc_t smDesc, unsigned char groupId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = groupId;
+  return;
+}
+
+void CrIaServ5EvtInIllgrParamSetInStreamId(FwSmDesc_t smDesc, unsigned short inStreamId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (inStreamId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (inStreamId & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtInIllgrParamSetGroupId(FwSmDesc_t smDesc, unsigned char groupId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = groupId;
+  return;
+}
+
+void CrIaServ5EvtSemIllStParamSetSemStateId(FwSmDesc_t smDesc, unsigned short semStateId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (semStateId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (semStateId & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtSemIllStParamSetSemOpStateId(FwSmDesc_t smDesc, unsigned short semOpStateId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (semOpStateId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = (semOpStateId & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtInitFailParamSetNoOfErrors(FwSmDesc_t smDesc, unsigned short noOfErrors)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (noOfErrors >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (noOfErrors & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtInitFailParamSetIbswErrNo(FwSmDesc_t smDesc, unsigned short ibswErrNo)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (ibswErrNo >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = (ibswErrNo & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtThrdOrParamSetThrdId(FwSmDesc_t smDesc, unsigned short thrdId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (thrdId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (thrdId & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtThrdOrParamSetThrdOrSize(FwSmDesc_t smDesc, unsigned short thrdOrSize)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (thrdOrSize >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = (thrdOrSize & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtNotifErrParamSetContdId(FwSmDesc_t smDesc, unsigned short contdId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (contdId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (contdId & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtNotifErrParamSetNotifCnt(FwSmDesc_t smDesc, unsigned short notifCnt)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (notifCnt >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = (notifCnt & 0xFF);
+  return;
+}
+
+void CrIaServ5Evt1553ErrLParamSetIbswErrNo(FwSmDesc_t smDesc, unsigned short ibswErrNo)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (ibswErrNo >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (ibswErrNo & 0xFF);
+  return;
+}
+
+void CrIaServ5Evt1553ErrMParamSetIbswErrNo(FwSmDesc_t smDesc, unsigned short ibswErrNo)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (ibswErrNo >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (ibswErrNo & 0xFF);
+  return;
+}
+
+void CrIaServ5Evt1553ErrHParamSetIbswErrNo(FwSmDesc_t smDesc, unsigned short ibswErrNo)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (ibswErrNo >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (ibswErrNo & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtSpwErrLParamSetIbswErrNo(FwSmDesc_t smDesc, unsigned short ibswErrNo)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (ibswErrNo >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (ibswErrNo & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtSpwErrMParamSetIbswErrNo(FwSmDesc_t smDesc, unsigned short ibswErrNo)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (ibswErrNo >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (ibswErrNo & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtSpwErrHParamSetIbswErrNo(FwSmDesc_t smDesc, unsigned short ibswErrNo)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (ibswErrNo >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (ibswErrNo & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtFlElErrParamSetIbswErrNo(FwSmDesc_t smDesc, unsigned short ibswErrNo)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (ibswErrNo >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (ibswErrNo & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtFlElErrParamSetFlashAdd(FwSmDesc_t smDesc, unsigned int flashAdd)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = ( flashAdd >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = ((flashAdd >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6] = ((flashAdd >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 7] = ( flashAdd & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtFlFbfErrParamSetIbswErrNo(FwSmDesc_t smDesc, unsigned short ibswErrNo)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (ibswErrNo >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (ibswErrNo & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtFlFbfErrParamSetFlashAdd(FwSmDesc_t smDesc, unsigned int flashAdd)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = ( flashAdd >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = ((flashAdd >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6] = ((flashAdd >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 7] = ( flashAdd & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtFlFbfErrParamSetFbfId(FwSmDesc_t smDesc, unsigned short fbfId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 8] = (fbfId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 9] = (fbfId & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtFlFbfBbParamSetChipId(FwSmDesc_t smDesc, unsigned short chipId) 
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (chipId >> 8);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (chipId & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtFlFbfBbParamSetBlck(FwSmDesc_t smDesc, unsigned short blck) 
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (blck >> 8);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = (blck & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtSbitErrParamSetRamAdd(FwSmDesc_t smDesc, unsigned int ramAdd)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = ( ramAdd >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = ((ramAdd >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = ((ramAdd >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = ( ramAdd & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtDbitErrParamSetRamAdd(FwSmDesc_t smDesc, unsigned int ramAdd)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = ( ramAdd >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = ((ramAdd >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = ((ramAdd >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = ( ramAdd & 0xFF);
+  return;
+}
+
+/* ### TM(5,3) EVT_SDP ### */
+
+void CrIaServ5EvtSdpNomemParamSetStepNmb(FwSmDesc_t smDesc, unsigned short stepNmb)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (stepNmb >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (stepNmb & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtSdpNomemParamSetDebugVal(FwSmDesc_t smDesc, unsigned short debugVal)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (debugVal >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = (debugVal & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtProcbufInsufParamSetProductID(FwSmDesc_t smDesc, unsigned short productID) {
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (productID >> 8);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (productID & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtProcbufInsufParamSetReqSize(FwSmDesc_t smDesc, unsigned int reqSize) {
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = ( reqSize >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = ((reqSize >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6] = ((reqSize >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 7] = ( reqSize & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtProcbufInsufParamSetAvailSize(FwSmDesc_t smDesc, unsigned int availSize) {
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 8] = ( availSize >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 9] = ((availSize >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 10] = ((availSize >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 11] = ( availSize & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtXibFullParamSetBufID(FwSmDesc_t smDesc, unsigned short bufID) {
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (bufID >> 8);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (bufID & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtImgInsufParamSetProductID(FwSmDesc_t smDesc, unsigned short productID) {
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (productID >> 8);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (productID & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtImgInsufParamSetStepID(FwSmDesc_t smDesc, unsigned short stepID) {
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (stepID >> 8);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = (stepID & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtImgInsufParamSetReqSize(FwSmDesc_t smDesc, unsigned int reqSize) {
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6] = ( reqSize >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 7] = ((reqSize >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 8] = ((reqSize >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 9] = ( reqSize & 0xFF);
+  return;
+}
+
+void CrIaServ5EvtImgInsufParamSetAvailSize(FwSmDesc_t smDesc, unsigned int availSize) {
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 10] = ( availSize >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 11] = ((availSize >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 12] = ((availSize >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 13] = ( availSize & 0xFF);
+  return;
+}
+
+
+/* ### END OF TM(5,3) EVT_SDP ### */
+
+
+void CrIaServ6MemDumpParamSetDpuMemoryId(FwSmDesc_t smDesc, unsigned short dpuMemoryId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0] = (dpuMemoryId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1] = (dpuMemoryId & 0xFF);
+  return;
+}
+
+void CrIaServ6MemDumpParamSetStartAddress(FwSmDesc_t smDesc, unsigned int startAddress)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = ( startAddress >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = ((startAddress >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = ((startAddress >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = ( startAddress & 0xFF);
+  return;
+}
+
+void CrIaServ6MemDumpParamSetBlockLength(FwSmDesc_t smDesc, unsigned int blockLength)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6] = ( blockLength >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 7] = ((blockLength >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 8] = ((blockLength >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 9] = ( blockLength & 0xFF);
+  return;
+}
+
+void CrIaServ6MemDumpParamSetBlockData(FwSmDesc_t smDesc, const unsigned char * blockData, unsigned short length)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  memcpy(&cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 10], blockData, length);
+  return;
+}
+
+void CrIaServ13FstDwlkParamSetSduId(FwSmDesc_t smDesc, unsigned char sduId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0] = sduId;
+  return;
+}
+
+void CrIaServ13FstDwlkParamSetSduBlockCount(FwSmDesc_t smDesc, unsigned short sduBlockCount)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1] = (sduBlockCount >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (sduBlockCount & 0xFF);
+  return;
+}
+
+void CrIaServ13FstDwlkParamSetSduBlockLength(FwSmDesc_t smDesc, unsigned short sduBlockLength)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (sduBlockLength >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (sduBlockLength & 0xFF);
+  return;
+}
+
+void CrIaServ13FstDwlkParamSetSduBlockData(FwSmDesc_t smDesc, const unsigned char * sduBlockData, unsigned short length)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  memcpy(&cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5], sduBlockData, length);
+  return;
+}
+
+void CrIaServ13IntmDwlkParamSetSduId(FwSmDesc_t smDesc, unsigned char sduId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0] = sduId;
+  return;
+}
+
+void CrIaServ13IntmDwlkParamSetSduBlockCount(FwSmDesc_t smDesc, unsigned short sduBlockCount)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1] = (sduBlockCount >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (sduBlockCount & 0xFF);
+  return;
+}
+
+void CrIaServ13IntmDwlkParamSetSduBlockLength(FwSmDesc_t smDesc, unsigned short sduBlockLength)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (sduBlockLength >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (sduBlockLength & 0xFF);
+  return;
+}
+
+void CrIaServ13IntmDwlkParamSetSduBlockData(FwSmDesc_t smDesc, const unsigned char * sduBlockData, unsigned short length)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  memcpy(&cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5], sduBlockData, length);
+  return;
+}
+
+void CrIaServ13LastDwlkParamSetSduId(FwSmDesc_t smDesc, unsigned char sduId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0] = sduId;
+  return;
+}
+
+void CrIaServ13LastDwlkParamSetSduBlockCount(FwSmDesc_t smDesc, unsigned short sduBlockCount)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1] = (sduBlockCount >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (sduBlockCount & 0xFF);
+  return;
+}
+
+void CrIaServ13LastDwlkParamSetSduBlockLength(FwSmDesc_t smDesc, unsigned short sduBlockLength)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (sduBlockLength >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (sduBlockLength & 0xFF);
+  return;
+}
+
+void CrIaServ13LastDwlkParamSetSduBlockData(FwSmDesc_t smDesc, const unsigned char * sduBlockData, unsigned short length)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  memcpy(&cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5], sduBlockData, length);
+  return;
+}
+
+void CrIaServ13DwlkAbrtParamSetSduId(FwSmDesc_t smDesc, unsigned char sduId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0] = sduId;
+  return;
+}
+
+void CrIaServ13DwlkAbrtParamSetReasonCode(FwSmDesc_t smDesc, unsigned short reasonCode)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1] = (reasonCode >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = (reasonCode & 0xFF);
+  return;
+}
+
+void CrIaServ195HbRepParamSetHbData(FwSmDesc_t smDesc, unsigned short hbData)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0] = (hbData >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1] = (hbData & 0xFF);
+  return;
+}
+
+void CrIaServ195HbRepParamSetHbSEM(FwSmDesc_t smDesc, unsigned char hbSEM)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = hbSEM;
+  return;
+}
+
+/* endianess safe */
+void CrIaServ196AocsRepParamSetOffsetX(FwSmDesc_t smDesc, int offsetX)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0] = (offsetX >> 16) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1] = (offsetX >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = offsetX & 0xff;
+  /* memcpy(&cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0], offsetX, 3); */
+  return;
+}
+
+void CrIaServ196AocsRepParamSetOffsetY(FwSmDesc_t smDesc, int offsetY)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = (offsetY >> 16) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4] = (offsetY >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 5] = offsetY & 0xff;
+  /* memcpy(&cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3], offsetY, 3); */
+  return;
+}
+
+void CrIaServ196AocsRepParamSetTargetLocationX(FwSmDesc_t smDesc, unsigned int targetLocationX)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6] = (targetLocationX >> 16) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 7] = (targetLocationX >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 8] = targetLocationX & 0xff;
+  /* memcpy(&cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 6], targetLocationX, 3); */
+  return;
+}
+
+void CrIaServ196AocsRepParamSetTargetLocationY(FwSmDesc_t smDesc, unsigned int targetLocationY)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 9] = (targetLocationY >> 16) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 10] = (targetLocationY >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 11] = targetLocationY & 0xff;
+  /* memcpy(&cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 9], targetLocationY, 3); */
+  return;
+}
+
+/* endianess safe */
+void CrIaServ196AocsRepParamSetIntegStartTimeCrs (FwSmDesc_t smDesc, unsigned int integStartTimeCrs)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 12] = (integStartTimeCrs >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 13] = (integStartTimeCrs >> 16) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 14] = (integStartTimeCrs >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 15] = integStartTimeCrs & 0xff;
+  /* memcpy(&cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 12], integStartTime, 6); */
+  return;
+}
+
+/* endianess safe */
+void CrIaServ196AocsRepParamSetIntegStartTimeFine (FwSmDesc_t smDesc, unsigned short integStartTimeFine)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 16] = (integStartTimeFine >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 17] = integStartTimeFine & 0xff;
+  return;
+}
+
+/* endianess safe */
+void CrIaServ196AocsRepParamSetIntegEndTimeCrs (FwSmDesc_t smDesc, unsigned int integEndTimeCrs)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 18] = (integEndTimeCrs >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 19] = (integEndTimeCrs >> 16) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 20] = (integEndTimeCrs >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 21] = integEndTimeCrs & 0xff;
+  /* memcpy(&cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 18], integEndTimeCrs, 6); */
+  return;
+}
+
+/* endianess safe */
+void CrIaServ196AocsRepParamSetIntegEndTimeFine (FwSmDesc_t smDesc, unsigned short integEndTimeFine)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 22] = (integEndTimeFine >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 23] = integEndTimeFine & 0xff;
+  return;
+}
+
+/* endianess safe */
+void CrIaServ196AocsRepParamSetCentroidDataCadence (FwSmDesc_t smDesc, unsigned short centroidDataCadence)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 24] = (centroidDataCadence >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 25] = (centroidDataCadence & 0xFF);
+  return;
+}
+
+/* endianess safe */
+void CrIaServ196AocsRepParamSetValidityStatus(FwSmDesc_t smDesc, unsigned char validityStatus)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 26] = validityStatus;
+  return;
+}
+
+
+void CrIaServ197BootRepParamSetResetType(FwSmDesc_t smDesc, unsigned char resetType)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 0] = resetType;
+  return;
+}
+
+void CrIaServ197BootRepParamSetDpuMode(FwSmDesc_t smDesc, unsigned char dpuMode)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  PutNBits8 (dpuMode, 0, 4, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1]));
+  /*
+    unsigned char tempByte = cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1];
+    cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1] = SetBits(tempByte, dpuMode, 0, 4);
+  */
+  return;
+}
+
+void CrIaServ197BootRepParamSetDpuSwActive(FwSmDesc_t smDesc, unsigned char dpuSwActive)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  PutNBits8 (dpuSwActive, 4, 2, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1]));
+  /*
+    unsigned char tempByte = cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1];
+    cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1] = SetBits(tempByte, dpuSwActive, 4, 2);
+  */
+  return;
+}
+
+void CrIaServ197BootRepParamSetDpuWatchdogStatus(FwSmDesc_t smDesc, unsigned char dpuWatchdogStatus)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  PutBit8 (dpuWatchdogStatus, 6, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1]));
+  /*
+    unsigned char tempByte = cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1];
+    cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1] = SetBits(tempByte, dpuWatchdogStatus, 6, 1);
+  */
+  return;
+}
+
+void CrIaServ197BootRepParamSetDpuUnit(FwSmDesc_t smDesc, unsigned char dpuUnit)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  PutBit8 (dpuUnit, 7, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1]));
+  /*
+    unsigned char tempByte = cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1];
+    cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 1] = SetBits(tempByte, dpuUnit, 7, 1);
+  */
+  return;
+}
+
+void CrIaServ197BootRepParamSetDpuResetType(FwSmDesc_t smDesc, unsigned char dpuResetType)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  PutNBits8 (dpuResetType, 0, 3, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2]));
+  /*
+    unsigned char tempByte = cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2];
+    cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = SetBits(tempByte, dpuResetType, 0, 3);
+  */
+  return;
+}
+
+void CrIaServ197BootRepParamSetTimeSyncStatus(FwSmDesc_t smDesc, unsigned char timeSyncStatus)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  PutNBits8 (timeSyncStatus, 3, 1, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2]));
+  /*
+    unsigned char tempByte = cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2];
+    cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = SetBits(tempByte, timeSyncStatus, 3, 1);
+  */
+  return;
+}
+
+void CrIaServ197BootRepParamSetBootReportSent(FwSmDesc_t smDesc, unsigned char bootReportSent)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  PutNBits8 (bootReportSent, 4, 1, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2]));
+  /*
+    unsigned char tempByte = cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2];
+    cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = SetBits(tempByte, bootReportSent, 4, 1);
+  */
+  return;
+}
+
+void CrIaServ197BootRepParamSetSpare1(FwSmDesc_t smDesc, unsigned char spare1)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  PutNBits8 (spare1, 5, 1, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2]));
+  /*
+    unsigned char tempByte = cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2];
+    cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = SetBits(tempByte, spare1, 5, 1);
+  */
+  return;
+}
+
+void CrIaServ197BootRepParamSetSemError(FwSmDesc_t smDesc, unsigned char semError)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  PutNBits8 (semError, 6, 1, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2]));
+  /*
+    unsigned char tempByte = cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2];
+    cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = SetBits(tempByte, semError, 6, 1);
+  */
+  return;
+}
+
+void CrIaServ197BootRepParamSetSemOn(FwSmDesc_t smDesc, unsigned char semOn)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  PutNBits8 (semOn, 7, 1, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2]));
+  /*
+    unsigned char tempByte = cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2];
+    cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 2] = SetBits(tempByte, semOn, 7, 1);
+  */
+  return;
+}
+
+void CrIaServ197BootRepParamSetDpuScLinkStatus(FwSmDesc_t smDesc, unsigned char dpuScLinkStatus)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  PutNBits8 (dpuScLinkStatus, 0, 1, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3]));
+  /*
+    unsigned char tempByte = cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3];
+    cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = SetBits(tempByte, dpuScLinkStatus, 0, 1);
+  */
+  return;
+}
+
+void CrIaServ197BootRepParamSetDpuMilbusCoreEx(FwSmDesc_t smDesc, unsigned char dpuMilbusCoreEx)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  PutNBits8 (dpuMilbusCoreEx, 1, 1, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3]));
+  /*
+    unsigned char tempByte = cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3];
+    cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = SetBits(tempByte, dpuMilbusCoreEx, 1, 1);
+  */
+  return;
+}
+
+void CrIaServ197BootRepParamSetDpuMilbusSyncDw(FwSmDesc_t smDesc, unsigned char dpuMilbusSyncDw)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  PutNBits8 (dpuMilbusSyncDw, 2, 1, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3]));
+  /*
+    unsigned char tempByte = cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3];
+    cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = SetBits(tempByte, dpuMilbusSyncDw, 2, 1);
+  */
+  return;
+}
+
+void CrIaServ197BootRepParamSetDpuMilbusSyncTo(FwSmDesc_t smDesc, unsigned char dpuMilbusSyncTo)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  PutNBits8 (dpuMilbusSyncTo, 3, 1, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3]));
+  /*
+    unsigned char tempByte = cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3];
+    cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = SetBits(tempByte, dpuMilbusSyncTo, 3, 1);
+  */
+  return;
+}
+
+void CrIaServ197BootRepParamSetDpuSemLinkStatus(FwSmDesc_t smDesc, unsigned char dpuSemLinkStatus)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  PutNBits8 (dpuSemLinkStatus, 4, 1, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3]));
+  /*
+    unsigned char tempByte = cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3];
+    cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = SetBits(tempByte, dpuSemLinkStatus, 4, 1);
+  */
+  return;
+}
+
+void CrIaServ197BootRepParamSetDpuSemLinkState(FwSmDesc_t smDesc, unsigned char dpuSemLinkState)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  PutNBits8 (dpuSemLinkState, 5, 3, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3]));
+  /*
+    unsigned char tempByte = cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3];
+    cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 3] = SetBits(tempByte, dpuSemLinkState, 5, 3);
+  */
+  return;
+}
+
+void CrIaServ197BootRepParamSetResetTime(FwSmDesc_t smDesc, const unsigned char * resetTime)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  memcpy(&cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 4], resetTime, 6);
+  return;
+}
+
+void CrIaServ197BootRepParamSetTrapCore1(FwSmDesc_t smDesc, unsigned char trapCore1)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 10] = trapCore1;
+  return;
+}
+
+void CrIaServ197BootRepParamSetTrapCore2(FwSmDesc_t smDesc, unsigned char trapCore2)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 11] = trapCore2;
+  return;
+}
+
+void CrIaServ197BootRepParamSetPsrRegCore1(FwSmDesc_t smDesc, unsigned int psrRegCore1)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 12] = ( psrRegCore1 >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 13] = ((psrRegCore1 >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 14] = ((psrRegCore1 >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 15] = ( psrRegCore1 & 0xFF);
+  return;
+}
+
+void CrIaServ197BootRepParamSetWimRegCore1(FwSmDesc_t smDesc, unsigned int wimRegCore1)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 16] = ( wimRegCore1 >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 17] = ((wimRegCore1 >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 18] = ((wimRegCore1 >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 19] = ( wimRegCore1 & 0xFF);
+  return;
+}
+
+void CrIaServ197BootRepParamSetPcRegCore1(FwSmDesc_t smDesc, unsigned int pcRegCore1)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 20] = ( pcRegCore1 >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 21] = ((pcRegCore1 >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 22] = ((pcRegCore1 >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 23] = ( pcRegCore1 & 0xFF);
+  return;
+}
+
+void CrIaServ197BootRepParamSetNpcRegCore1(FwSmDesc_t smDesc, unsigned int npcRegCore1)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 24] = ( npcRegCore1 >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 25] = ((npcRegCore1 >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 26] = ((npcRegCore1 >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 27] = ( npcRegCore1 & 0xFF);
+  return;
+}
+
+void CrIaServ197BootRepParamSetFsrRegCore1(FwSmDesc_t smDesc, unsigned int fsrRegCore1)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 28] = ( fsrRegCore1 >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 29] = ((fsrRegCore1 >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 30] = ((fsrRegCore1 >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 31] = ( fsrRegCore1 & 0xFF);
+  return;
+}
+
+void CrIaServ197BootRepParamSetPsrRegCore2(FwSmDesc_t smDesc, unsigned int psrRegCore2)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 32] = ( psrRegCore2 >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 33] = ((psrRegCore2 >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 34] = ((psrRegCore2 >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 35] = ( psrRegCore2 & 0xFF);
+  return;
+}
+
+void CrIaServ197BootRepParamSetWimRegCore2(FwSmDesc_t smDesc, unsigned int wimRegCore2)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 36] = ( wimRegCore2 >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 37] = ((wimRegCore2 >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 38] = ((wimRegCore2 >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 39] = ( wimRegCore2 & 0xFF);
+  return;
+}
+
+void CrIaServ197BootRepParamSetPcRegCore2(FwSmDesc_t smDesc, unsigned int pcRegCore2)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 40] = ( pcRegCore2 >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 41] = ((pcRegCore2 >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 42] = ((pcRegCore2 >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 43] = ( pcRegCore2 & 0xFF);
+  return;
+}
+
+void CrIaServ197BootRepParamSetNpcRegCore2(FwSmDesc_t smDesc, unsigned int npcRegCore2)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 44] = ( npcRegCore2 >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 45] = ((npcRegCore2 >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 46] = ((npcRegCore2 >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 47] = ( npcRegCore2 & 0xFF);
+  return;
+}
+
+void CrIaServ197BootRepParamSetFsrRegCore2(FwSmDesc_t smDesc, unsigned int fsrRegCore2)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 48] = ( fsrRegCore2 >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 49] = ((fsrRegCore2 >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 50] = ((fsrRegCore2 >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 51] = ( fsrRegCore2 & 0xFF);
+  return;
+}
+
+void CrIaServ197BootRepParamSetAhbStatusReg(FwSmDesc_t smDesc, unsigned int ahbStatusReg)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 52] = ( ahbStatusReg >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 53] = ((ahbStatusReg >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 54] = ((ahbStatusReg >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 55] = ( ahbStatusReg & 0xFF);
+  return;
+}
+
+void CrIaServ197BootRepParamSetAhbFailingAddrReg(FwSmDesc_t smDesc, unsigned int ahbFailingAddrReg)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 56] = ( ahbFailingAddrReg >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 57] = ((ahbFailingAddrReg >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 58] = ((ahbFailingAddrReg >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 59] = ( ahbFailingAddrReg & 0xFF);
+  return;
+}
+
+void CrIaServ197BootRepParamSetPcHistoryCore1(FwSmDesc_t smDesc, const unsigned char * pcHistoryCore1)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  memcpy(&cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 60], pcHistoryCore1, 28);
+  return;
+}
+
+void CrIaServ197BootRepParamSetPcHistoryCore2(FwSmDesc_t smDesc, const unsigned char * pcHistoryCore2)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  memcpy(&cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 88], pcHistoryCore2, 28);
+  return;
+}
+
+void CrIaServ197BootRepParamSetSpare2(FwSmDesc_t smDesc, unsigned short spare2)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 116] = (spare2 >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 117] = (spare2 & 0xFF);
+  return;
+}
+
+void CrIaServ197BootRepParamSetDpuMemoryId(FwSmDesc_t smDesc, unsigned short dpuMemoryId)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 118] = (dpuMemoryId >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 119] = (dpuMemoryId & 0xFF);
+  return;
+}
+
+void CrIaServ197BootRepParamSetStartAddress(FwSmDesc_t smDesc, unsigned int startAddress)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 120] = ( startAddress >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 121] = ((startAddress >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 122] = ((startAddress >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 123] = ( startAddress & 0xFF);
+  return;
+}
+
+void CrIaServ197BootRepParamSetErrLogInfo(FwSmDesc_t smDesc, const unsigned char * errLogInfo)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  memcpy(&cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + 124], errLogInfo, 880); /* was: + 132, 12 */
+  return;
+}
+
+/**
+ * Set data at specific position in data segment of PUS packet
+ * Author: Christian
+ */
+
+void CrIaSetUCharValue(FwSmDesc_t smDesc, unsigned char ucharValue, unsigned int pos)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + pos] = ucharValue;
+  return;
+}
+
+void CrIaSetUShortValue(FwSmDesc_t smDesc, unsigned short ushortValue, unsigned int pos)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + pos] = (ushortValue >> 8) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + pos + 1] = (ushortValue & 0xFF);
+  return;
+}
+
+void CrIaSetUIntValue(FwSmDesc_t smDesc, unsigned int uintValue, unsigned int pos)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + pos] = ( uintValue >> 24) & 0xff;
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + pos + 1] = ((uintValue >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + pos + 2] = ((uintValue >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_REP_PCKT + pos + 3] = ( uintValue & 0xFF);
+
+  return;
+}
+
diff --git a/CrIa/src/Services/General/CrIaParamSetter.h b/CrIa/src/Services/General/CrIaParamSetter.h
new file mode 100644
index 0000000..e6020e2
--- /dev/null
+++ b/CrIa/src/Services/General/CrIaParamSetter.h
@@ -0,0 +1,1093 @@
+/**
+ * @file CrIaParamSetter.h
+ *
+ * Declaration of the setter operations for all parameters of all out-going packets.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRIA_PARAM_SETTER_H
+#define CRIA_PARAM_SETTER_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+void PutBit8 (unsigned char value, unsigned int bitOffset, unsigned char *dest);
+
+void PutNBits8 (unsigned int value, unsigned int bitOffset, unsigned int nbits, unsigned char *dest);
+
+
+/**
+ * Sets the value of the parameter TcPacketId of the out-going packet Telecommand Acceptance Report – Success.
+ * @param tcPacketId Copy of the PACKET ID fields of the command being reported on.
+ */
+void CrIaServ1AccSuccParamSetTcPacketId(FwSmDesc_t smDesc, unsigned short tcPacketId);
+
+/**
+ * Sets the value of the parameter TcPacketSeqCtrl of the out-going packet Telecommand Acceptance Report – Success.
+ * @param tcPacketSeqCtrl Copy of the PACKET SEQUENCE CONTROL fields of the received command.
+ */
+void CrIaServ1AccSuccParamSetTcPacketSeqCtrl(FwSmDesc_t smDesc, unsigned short tcPacketSeqCtrl);
+
+/**
+ * Sets the value of the parameter TcPacketId of the out-going packet Telecommand Acceptance Report – Failure.
+ * @param tcPacketId Copy of the PACKET ID fields of the command being reported on.
+ */
+void CrIaServ1AccFailParamSetTcPacketId(FwSmDesc_t smDesc, unsigned short tcPacketId);
+
+/**
+ * Sets the value of the parameter TcPacketSeqCtrl of the out-going packet Telecommand Acceptance Report – Failure.
+ * @param tcPacketSeqCtrl Copy of the PACKET SEQUENCE CONTROL fields of the received command.
+ */
+void CrIaServ1AccFailParamSetTcPacketSeqCtrl(FwSmDesc_t smDesc, unsigned short tcPacketSeqCtrl);
+
+/**
+ * Sets the value of the parameter TcFailureCode of the out-going packet Telecommand Acceptance Report – Failure.
+ * @param tcFailureCode The failure identification code. See table \ref{tab:EFailureCode} for the full overview of the failure identification code.
+ */
+void CrIaServ1AccFailParamSetTcFailureCode(FwSmDesc_t smDesc, unsigned short tcFailureCode);
+
+/**
+ * Sets the value of the parameter TcType of the out-going packet Telecommand Acceptance Report – Failure.
+ * @param tcType Packet type from the received TC.
+ */
+void CrIaServ1AccFailParamSetTcType(FwSmDesc_t smDesc, unsigned char tcType);
+
+/**
+ * Sets the value of the parameter TcSubtype of the out-going packet Telecommand Acceptance Report – Failure.
+ * @param tcSubtype Packet sub-type from the received TC.
+ */
+void CrIaServ1AccFailParamSetTcSubtype(FwSmDesc_t smDesc, unsigned char tcSubtype);
+
+/**
+ * Sets the value of the parameter TcLength of the out-going packet Telecommand Acceptance Report – Failure.
+ * @param tcLength Length of the received TC.
+ */
+void CrIaServ1AccFailParamSetTcLength(FwSmDesc_t smDesc, unsigned short tcLength);
+
+/**
+ * Sets the value of the parameter TcReceivedBytes of the out-going packet Telecommand Acceptance Report – Failure.
+ * @param tcReceivedBytes Number of received bytes.
+ */
+void CrIaServ1AccFailParamSetTcReceivedBytes(FwSmDesc_t smDesc, unsigned short tcReceivedBytes);
+
+/**
+ * Sets the value of the parameter TcReceivedCrc of the out-going packet Telecommand Acceptance Report – Failure.
+ * @param tcReceivedCrc CRC received with TC.
+ */
+void CrIaServ1AccFailParamSetTcReceivedCrc(FwSmDesc_t smDesc, unsigned short tcReceivedCrc);
+
+/**
+ * Sets the value of the parameter TcCalculatedCrc of the out-going packet Telecommand Acceptance Report – Failure.
+ * @param tcCalculatedCrc Calculated CRC.
+ */
+void CrIaServ1AccFailParamSetTcCalculatedCrc(FwSmDesc_t smDesc, unsigned short tcCalculatedCrc);
+
+/**
+ * Sets the value of the parameter TcPacketId of the out-going packet Telecommand Start Report – Success.
+ * @param tcPacketId Copy of the PACKET ID fields of the command being reported on.
+ */
+void CrIaServ1StartSuccParamSetTcPacketId(FwSmDesc_t smDesc, unsigned short tcPacketId);
+
+/**
+ * Sets the value of the parameter TcPacketSeqCtrl of the out-going packet Telecommand Start Report – Success.
+ * @param tcPacketSeqCtrl Copy of the PACKET SEQUENCE CONTROL fields of the received command.
+ */
+void CrIaServ1StartSuccParamSetTcPacketSeqCtrl(FwSmDesc_t smDesc, unsigned short tcPacketSeqCtrl);
+
+/**
+ * Sets the value of the parameter TcPacketId of the out-going packet Telecommand Start Report – Failure.
+ * @param tcPacketId Copy of the PACKET ID fields of the command being reported on.
+ */
+void CrIaServ1StartFailParamSetTcPacketId(FwSmDesc_t smDesc, unsigned short tcPacketId);
+
+/**
+ * Sets the value of the parameter TcPacketSeqCtrl of the out-going packet Telecommand Start Report – Failure.
+ * @param tcPacketSeqCtrl Copy of the PACKET SEQUENCE CONTROL fields of the received command.
+ */
+void CrIaServ1StartFailParamSetTcPacketSeqCtrl(FwSmDesc_t smDesc, unsigned short tcPacketSeqCtrl);
+
+/**
+ * Sets the value of the parameter TcFailureCode of the out-going packet Telecommand Start Report – Failure.
+ * @param tcFailureCode Failure identification code. See table \ref{tab:EFailureCode} for the full overview of the failure identification code.
+ */
+void CrIaServ1StartFailParamSetTcFailureCode(FwSmDesc_t smDesc, unsigned short tcFailureCode);
+
+/**
+ * Sets the value of the parameter TcType of the out-going packet Telecommand Start Report – Failure.
+ * @param tcType Packet type from the received TC.
+ */
+void CrIaServ1StartFailParamSetTcType(FwSmDesc_t smDesc, unsigned char tcType);
+
+/**
+ * Sets the value of the parameter TcSubtype of the out-going packet Telecommand Start Report – Failure.
+ * @param tcSubtype Packet sub-type from the received TC.
+ */
+void CrIaServ1StartFailParamSetTcSubtype(FwSmDesc_t smDesc, unsigned char tcSubtype);
+
+/**
+ * Sets the value of the parameter WrongParamPosition of the out-going packet Telecommand Start Report – Failure.
+ * @param wrongParamPosition Position of the parameter with wrong value in the received command, or zero if the failure cannot be linked to a wrong command parameter value. For example, a value of 2 will mean: "second parameter in the report".
+ */
+void CrIaServ1StartFailParamSetWrongParamPosition(FwSmDesc_t smDesc, unsigned short wrongParamPosition);
+
+/**
+ * Sets the value of the parameter WrongParamValue of the out-going packet Telecommand Start Report – Failure.
+ * @param wrongParamValue Wrong value of the parameter.
+ */
+void CrIaServ1StartFailParamSetWrongParamValue(FwSmDesc_t smDesc, unsigned short wrongParamValue);
+
+/**
+ * Sets the value of the parameter TcPacketId of the out-going packet Telecommand Termination Report – Success.
+ * @param tcPacketId Copy of the PACKET ID fields of the command being reported on.
+ */
+void CrIaServ1TermSuccParamSetTcPacketId(FwSmDesc_t smDesc, unsigned short tcPacketId);
+
+/**
+ * Sets the value of the parameter TcPacketSeqCtrl of the out-going packet Telecommand Termination Report – Success.
+ * @param tcPacketSeqCtrl Copy of the PACKET SEQUENCE CONTROL fields of the received command.
+ */
+void CrIaServ1TermSuccParamSetTcPacketSeqCtrl(FwSmDesc_t smDesc, unsigned short tcPacketSeqCtrl);
+
+/**
+ * Sets the value of the parameter TcPacketId of the out-going packet Telecommand Termination Report – Failure.
+ * @param tcPacketId Copy of the PACKET ID fields of the command being reported on.
+ */
+void CrIaServ1TermFailParamSetTcPacketId(FwSmDesc_t smDesc, unsigned short tcPacketId);
+
+/**
+ * Sets the value of the parameter TcPacketSeqCtrl of the out-going packet Telecommand Termination Report – Failure.
+ * @param tcPacketSeqCtrl Copy of the PACKET SEQUENCE CONTROL fields of the received command.
+ */
+void CrIaServ1TermFailParamSetTcPacketSeqCtrl(FwSmDesc_t smDesc, unsigned short tcPacketSeqCtrl);
+
+/**
+ * Sets the value of the parameter TcFailureCode of the out-going packet Telecommand Termination Report – Failure.
+ * @param tcFailureCode Failure identification code. See table \ref{tab:EFailureCode} for the full overview of the failure identification code.
+ */
+void CrIaServ1TermFailParamSetTcFailureCode(FwSmDesc_t smDesc, unsigned short tcFailureCode);
+
+/**
+ * Sets the value of the parameter TcType of the out-going packet Telecommand Termination Report – Failure.
+ * @param tcType Packet type from the received TC.
+ */
+void CrIaServ1TermFailParamSetTcType(FwSmDesc_t smDesc, unsigned char tcType);
+
+/**
+ * Sets the value of the parameter TcSubtype of the out-going packet Telecommand Termination Report – Failure.
+ * @param tcSubtype Packet sub-type from the received TC.
+ */
+void CrIaServ1TermFailParamSetTcSubtype(FwSmDesc_t smDesc, unsigned char tcSubtype);
+
+/**
+ * Sets the value of the parameter WrongParamPosition of the out-going packet Telecommand Termination Report – Failure.
+ * @param wrongParamPosition Position of the parameter with wrong value in the received command, or zero if the failure cannot be linked to a wrong command parameter value. For example, a value of 2 will mean: "second parameter in the report".
+ */
+void CrIaServ1TermFailParamSetWrongParamPosition(FwSmDesc_t smDesc, unsigned short wrongParamPosition);
+
+/**
+ * Sets the value of the parameter WrongParamValue of the out-going packet Telecommand Termination Report – Failure.
+ * @param wrongParamValue Wrong value of the parameter.
+ */
+void CrIaServ1TermFailParamSetWrongParamValue(FwSmDesc_t smDesc, unsigned short wrongParamValue);
+
+void CrIaServ5EvtSetEvtId(FwSmDesc_t smDesc, unsigned short evtId);
+
+/**
+ * Sets the value of the parameter ExpSeqCnt of the out-going packet Event Sequence Counter Error.
+ * @param expSeqCnt The expected value of the sequence counter.
+ */
+void CrIaServ5EvtSeqCntErrParamSetExpSeqCnt(FwSmDesc_t smDesc, unsigned short expSeqCnt);
+
+/**
+ * Sets the value of the parameter ActSeqCnt of the out-going packet Event Sequence Counter Error.
+ * @param actSeqCnt The actual value of the sequence counter.
+ */
+void CrIaServ5EvtSeqCntErrParamSetActSeqCnt(FwSmDesc_t smDesc, unsigned short actSeqCnt);
+
+/**
+ * Sets the value of the parameter RepSeqCnt of the out-going packet Event In Rep Cr Fail.
+ * @param repSeqCnt The sequence counter of the report.
+ */
+void CrIaServ5EvtInrepCrFailParamSetRepSeqCnt(FwSmDesc_t smDesc, unsigned short repSeqCnt);
+
+/**
+ * Sets the value of the parameter RepSeqCnt of the out-going packet Event Pcrl2 Full.
+ * @param repSeqCnt The sequence counter of the report.
+ */
+void CrIaServ5EvtPcrl2FullParamSetRepSeqCnt(FwSmDesc_t smDesc, unsigned short repSeqCnt);
+
+/**
+ * Sets the value of the parameter FdCheckId of the out-going packet Event Failure Detection Failed.
+ * @param fdCheckId The FdCheck identifier. See table \ref{tab:EFdChkId} for the full overview of the FdCheck identifiers.
+ */
+void CrIaServ5EvtFdFailedParamSetFdCheckId(FwSmDesc_t smDesc, unsigned short fdCheckId);
+
+/**
+ * Sets the value of the parameter FdCheckId of the out-going packet Event Recovery Procedure Started.
+ * @param fdCheckId The FdCheck identifier. See table \ref{tab:EFdChkId} for the full overview of the FdCheck identifiers.
+ */
+void CrIaServ5EvtRpStartedParamSetFdCheckId(FwSmDesc_t smDesc, unsigned short fdCheckId);
+
+/**
+ * Sets the value of the parameter RecovProcId of the out-going packet Event Recovery Procedure Started.
+ * @param recovProcId The recovery procedure identifier. See table \ref{tab:ERecovProcId} for the full overview of the recovery procedure identifiers.
+ */
+void CrIaServ5EvtRpStartedParamSetRecovProcId(FwSmDesc_t smDesc, unsigned short recovProcId);
+
+/**
+ * Sets the value of the parameter SrcSemSt of the out-going packet Event SEM State Machine Transition.
+ * @param srcSemSt The source state identifier.
+ */
+void CrIaServ5EvtSemTrParamSetSrcSemSt(FwSmDesc_t smDesc, unsigned short srcSemSt);
+
+/**
+ * Sets the value of the parameter DestSemSt of the out-going packet Event SEM State Machine Transition.
+ * @param destSemSt The destination state identifier.
+ */
+void CrIaServ5EvtSemTrParamSetDestSemSt(FwSmDesc_t smDesc, unsigned short destSemSt);
+
+/**
+ * Sets the value of the parameter SrcIaswSt of the out-going packet Event IASW State Machine Transition.
+ * @param srcIaswSt The source state identifier.
+ */
+void CrIaServ5EvtIaswTrParamSetSrcIaswSt(FwSmDesc_t smDesc, unsigned short srcIaswSt);
+
+/**
+ * Sets the value of the parameter DestIaswSt of the out-going packet Event IASW State Machine Transition.
+ * @param destIaswSt The destination state identifier.
+ */
+void CrIaServ5EvtIaswTrParamSetDestIaswSt(FwSmDesc_t smDesc, unsigned short destIaswSt);
+
+/**
+ * Sets the value of the parameter SciSeqCnt of the out-going packet Event SDSC Illegal.
+ * @param sciSeqCnt The science data sequence counter.
+ */
+void CrIaServ5EvtSdscIllParamSetSciSeqCnt(FwSmDesc_t smDesc, unsigned short sciSeqCnt);
+
+/**
+ * Sets the value of the parameter ExpSciSeqCnt of the out-going packet Event SDSC Out-of-sequence.
+ * @param expSciSeqCnt The expected value of the science data sequence counter.
+ */
+void CrIaServ5EvtSdscOosParamSetExpSciSeqCnt(FwSmDesc_t smDesc, unsigned short expSciSeqCnt);
+
+/**
+ * Sets the value of the parameter ActSciSeqCnt of the out-going packet Event SDSC Out-of-sequence.
+ * @param actSciSeqCnt The actual value of the science data sequence counter.
+ */
+void CrIaServ5EvtSdscOosParamSetActSciSeqCnt(FwSmDesc_t smDesc, unsigned short actSciSeqCnt);
+
+/**
+ * Sets the value of the parameter GibSize of the out-going packet Event Collection Algorithm out of Space.
+ * @param gibSize The size of the GIB which caused the violation.
+ */
+void CrIaServ5EvtClctSizeParamSetGibSize(FwSmDesc_t smDesc, unsigned short gibSize);
+
+/**
+ * Sets the value of the parameter SibSize of the out-going packet Event Science Image Buffer size.
+ * @param sibSize The SIB size in kBytes.
+ */
+void CrIaServ5EvtSibSizeParamSetSibSize(FwSmDesc_t smDesc, unsigned short sibSize);
+
+/**
+ * Sets the value of the parameter ParamId of the out-going packet Parameter Out-Of-Limits.
+ * @param paramId The identifier of the OOL parameter.
+ */
+void CrIaServ5EvtOolParamParamSetParamId(FwSmDesc_t smDesc, unsigned int paramId);
+
+/**
+ * Sets the value of the parameter InvDest of the out-going packet Event Invalid Destination.
+ * @param invDest The invalid destination.
+ */
+void CrIaServ5EvtInvDestParamSetInvDest(FwSmDesc_t smDesc, unsigned short invDest);
+
+/**
+ * Sets the value of the parameter FbfId of the out-going packet Event FBF Load Risk.
+ * @param fbfId The FBF identifier.
+ */
+void CrIaServ5EvtFbfLoadRiskParamSetFbfId(FwSmDesc_t smDesc, unsigned short fbfId);
+
+/**
+ * Sets the value of the parameter FbfId of the out-going packet Event FBF Save Denied.
+ * @param fbfId The FBF identifier.
+ */
+void CrIaServ5EvtFbfSaveDeniedParamSetFbfId(FwSmDesc_t smDesc, unsigned short fbfId);
+
+/**
+ * Sets the value of the parameter FbfId of the out-going packet Event FBF Save Abort.
+ * @param fbfId The FBF identifier.
+ */
+void CrIaServ5EvtFbfSaveAbrtParamSetFbfId(FwSmDesc_t smDesc, unsigned short fbfId);
+
+/**
+ * Sets the value of the parameter FbfNBlocks of the out-going packet Event FBF Save Abort.
+ * @param fbfNBlocks The number of blocks written to flash up to the time when the FBF Save Procedure is aborted.
+ */
+void CrIaServ5EvtFbfSaveAbrtParamSetFbfNBlocks(FwSmDesc_t smDesc, unsigned short fbfNBlocks);
+
+/**
+ * Sets the value of the parameter ProcId of the out-going packet Event SDB Configuration Failed.
+ * @param procId The identifier of science procedure.
+ */
+void CrIaServ5EvtSdbCnfFailParamSetProcId(FwSmDesc_t smDesc, unsigned short procId);
+
+/**
+ * Sets the value of the parameter CibNFull of the out-going packet Event SDB Configuration Failed.
+ * @param cibNFull The number of CIBs for Full CCD Images.
+ */
+void CrIaServ5EvtSdbCnfFailParamSetCibNFull(FwSmDesc_t smDesc, unsigned char cibNFull);
+
+/**
+ * Sets the value of the parameter CibSizeFull of the out-going packet Event SDB Configuration Failed.
+ * @param cibSizeFull The size in kBytes of the CIBs for Full CCD Images.
+ */
+void CrIaServ5EvtSdbCnfFailParamSetCibSizeFull(FwSmDesc_t smDesc, unsigned short cibSizeFull);
+
+/**
+ * Sets the value of the parameter SibNFull of the out-going packet Event SDB Configuration Failed.
+ * @param sibNFull The number of SIBs for Full CCD Images.
+ */
+void CrIaServ5EvtSdbCnfFailParamSetSibNFull(FwSmDesc_t smDesc, unsigned char sibNFull);
+
+/**
+ * Sets the value of the parameter SibSizeFull of the out-going packet Event SDB Configuration Failed.
+ * @param sibSizeFull The size in kBytes of the SIBs for Full CCD Images.
+ */
+void CrIaServ5EvtSdbCnfFailParamSetSibSizeFull(FwSmDesc_t smDesc, unsigned short sibSizeFull);
+
+/**
+ * Sets the value of the parameter GibNFull of the out-going packet Event SDB Configuration Failed.
+ * @param gibNFull The number of GIBs for Full CCD Images.
+ */
+void CrIaServ5EvtSdbCnfFailParamSetGibNFull(FwSmDesc_t smDesc, unsigned char gibNFull);
+
+/**
+ * Sets the value of the parameter GibSizeFull of the out-going packet Event SDB Configuration Failed.
+ * @param gibSizeFull The size in kBytes of the GIBs for Full CCD Images.
+ */
+void CrIaServ5EvtSdbCnfFailParamSetGibSizeFull(FwSmDesc_t smDesc, unsigned short gibSizeFull);
+
+/**
+ * Sets the value of the parameter SibNWin of the out-going packet Event SDB Configuration Failed.
+ * @param sibNWin The number of SIBs for Window CCD Images.
+ */
+void CrIaServ5EvtSdbCnfFailParamSetSibNWin(FwSmDesc_t smDesc, unsigned char sibNWin);
+
+/**
+ * Sets the value of the parameter SibSizeWin of the out-going packet Event SDB Configuration Failed.
+ * @param sibSizeWin The size in kBytes of the SIBs for Window CCD Images.
+ */
+void CrIaServ5EvtSdbCnfFailParamSetSibSizeWin(FwSmDesc_t smDesc, unsigned short sibSizeWin);
+
+/**
+ * Sets the value of the parameter CibNWin of the out-going packet Event SDB Configuration Failed.
+ * @param cibNWin The number of CIBs for Window CCD Images.
+ */
+void CrIaServ5EvtSdbCnfFailParamSetCibNWin(FwSmDesc_t smDesc, unsigned char cibNWin);
+
+/**
+ * Sets the value of the parameter CibSizeWin of the out-going packet Event SDB Configuration Failed.
+ * @param cibSizeWin The size in kBytes of the CIBs for Window CCD Images.
+ */
+void CrIaServ5EvtSdbCnfFailParamSetCibSizeWin(FwSmDesc_t smDesc, unsigned short cibSizeWin);
+
+/**
+ * Sets the value of the parameter GibNWin of the out-going packet Event SDB Configuration Failed.
+ * @param gibNWin The number of GIBs for Window CCD Images.
+ */
+void CrIaServ5EvtSdbCnfFailParamSetGibNWin(FwSmDesc_t smDesc, unsigned char gibNWin);
+
+/**
+ * Sets the value of the parameter GibSizeWin of the out-going packet Event SDB Configuration Failed.
+ * @param gibSizeWin The size in kBytes of the GIBs for Window CCD Images.
+ */
+void CrIaServ5EvtSdbCnfFailParamSetGibSizeWin(FwSmDesc_t smDesc, unsigned short gibSizeWin);
+
+/**
+ * Sets the value of the parameter ImgBufferSize of the out-going packet Event Compression Algorithm out of Space.
+ * @param imgBufferSize The size of the CIB which caused the violation.
+ */
+void CrIaServ5EvtCmprSizeParamSetImgBufferSize(FwSmDesc_t smDesc, unsigned int imgBufferSize);
+
+/**
+ * Sets the value of the parameter SrcSemOpSt of the out-going packet Event SEM OP State Machine Transition.
+ * @param srcSemOpSt The source state identifier.
+ */
+void CrIaServ5EvtSemopTrParamSetSrcSemOpSt(FwSmDesc_t smDesc, unsigned short srcSemOpSt);
+
+/**
+ * Sets the value of the parameter DestSemOpSt of the out-going packet Event SEM OP State Machine Transition.
+ * @param destSemOpSt The destination state identifier.
+ */
+void CrIaServ5EvtSemopTrParamSetDestSemOpSt(FwSmDesc_t smDesc, unsigned short destSemOpSt);
+
+/**
+ * Sets the value of the parameter ProcId of the out-going packet Event Science Procedure Starts Execution.
+ * @param procId The procedure identifier.
+ */
+void CrIaServ5EvtScPrStrtParamSetProcId(FwSmDesc_t smDesc, unsigned short procId);
+
+/**
+ * Sets the value of the parameter ProcId of the out-going packet Event Science Procedure Terminates Execution.
+ * @param procId The procedure identifier.
+ */
+void CrIaServ5EvtScPrEndParamSetProcId(FwSmDesc_t smDesc, unsigned short procId);
+
+/**
+ * Sets the value of the parameter ProcTermCode of the out-going packet Event Science Procedure Terminates Execution.
+ * @param procTermCode The procedure termination code.
+ */
+void CrIaServ5EvtScPrEndParamSetProcTermCode(FwSmDesc_t smDesc, unsigned short procTermCode);
+
+/**
+ * Sets the value of the parameter InStreamId of the out-going packet Event InStream Packet Queue Full.
+ * @param inStreamId The InStream identifier.
+ */
+void CrIaServ5EvtInstrmPqfParamSetInStreamId(FwSmDesc_t smDesc, unsigned short inStreamId);
+
+/**
+ * Sets the value of the parameter OutCompId of the out-going packet Event OutComponent Invalid Destination.
+ * @param outCompId The OutComponent identifier.
+ */
+void CrIaServ5EvtOcmpInvdParamSetOutCompId(FwSmDesc_t smDesc, unsigned short outCompId);
+
+/**
+ * Sets the value of the parameter InvDest of the out-going packet Event OutComponent Invalid Destination.
+ * @param invDest The invalid destination.
+ */
+void CrIaServ5EvtOcmpInvdParamSetInvDest(FwSmDesc_t smDesc, unsigned short invDest);
+
+/**
+ * Sets the value of the parameter OutStreamId of the out-going packet Event OutComponent Illegal Group Identifier.
+ * @param outStreamId The OutStream identifier.
+ */
+void CrIaServ5EvtOcmpIllgrParamSetOutStreamId(FwSmDesc_t smDesc, unsigned short outStreamId);
+
+/**
+ * Sets the value of the parameter GroupId of the out-going packet Event OutComponent Illegal Group Identifier.
+ * @param groupId The illegal group identifier.
+ */
+void CrIaServ5EvtOcmpIllgrParamSetGroupId(FwSmDesc_t smDesc, unsigned char groupId);
+
+/**
+ * Sets the value of the parameter InStreamId of the out-going packet Event InStream Illegal Group Identifier.
+ * @param inStreamId The InStream identifier.
+ */
+void CrIaServ5EvtInIllgrParamSetInStreamId(FwSmDesc_t smDesc, unsigned short inStreamId);
+
+/**
+ * Sets the value of the parameter GroupId of the out-going packet Event InStream Illegal Group Identifier.
+ * @param groupId The illegal group identifier.
+ */
+void CrIaServ5EvtInIllgrParamSetGroupId(FwSmDesc_t smDesc, unsigned char groupId);
+
+/**
+ * Sets the value of the parameter SemStateId of the out-going packet Illegal SEM State at Entry in PRE_SCIENCE.
+ * @param semStateId The SEM State Machine state identifier.
+ */
+void CrIaServ5EvtSemIllStParamSetSemStateId(FwSmDesc_t smDesc, unsigned short semStateId);
+
+/**
+ * Sets the value of the parameter SemOpStateId of the out-going packet Illegal SEM State at Entry in PRE_SCIENCE.
+ * @param semOpStateId The SEM Operational State Machine state identifier.
+ */
+void CrIaServ5EvtSemIllStParamSetSemOpStateId(FwSmDesc_t smDesc, unsigned short semOpStateId);
+
+/**
+ * Sets the value of the parameter NoOfErrors of the out-going packet IASW Initialization Failed.
+ * @param noOfErrors The number of errors.
+ */
+void CrIaServ5EvtInitFailParamSetNoOfErrors(FwSmDesc_t smDesc, unsigned short noOfErrors);
+
+/**
+ * Sets the value of the parameter IbswErrNo of the out-going packet IASW Initialization Failed.
+ * @param ibswErrNo Error code (see doxygen documentation of errors.h).
+ */
+void CrIaServ5EvtInitFailParamSetIbswErrNo(FwSmDesc_t smDesc, unsigned short ibswErrNo);
+
+/**
+ * Sets the value of the parameter ThrdId of the out-going packet Thread Overrun.
+ * @param thrdId The thread identifier.
+ */
+void CrIaServ5EvtThrdOrParamSetThrdId(FwSmDesc_t smDesc, unsigned short thrdId);
+
+/**
+ * Sets the value of the parameter ThrdOrSize of the out-going packet Thread Overrun.
+ * @param thrdOrSize The extent of the thread overrun.
+ */
+void CrIaServ5EvtThrdOrParamSetThrdOrSize(FwSmDesc_t smDesc, unsigned short thrdOrSize);
+
+/**
+ * Sets the value of the parameter ContdId of the out-going packet Notification Error.
+ * @param contdId The identifier of the RT Container.
+ */
+void CrIaServ5EvtNotifErrParamSetContdId(FwSmDesc_t smDesc, unsigned short contdId);
+
+/**
+ * Sets the value of the parameter NotifCnt of the out-going packet Notification Error.
+ * @param notifCnt The value of the notification counter.
+ */
+void CrIaServ5EvtNotifErrParamSetNotifCnt(FwSmDesc_t smDesc, unsigned short notifCnt);
+
+/**
+ * Sets the value of the parameter IbswErrNo of the out-going packet Low-severity 1553 Error.
+ * @param ibswErrNo Error code (see doxygen documentation of errors.h).
+ */
+void CrIaServ5Evt1553ErrLParamSetIbswErrNo(FwSmDesc_t smDesc, unsigned short ibswErrNo);
+
+/**
+ * Sets the value of the parameter IbswErrNo of the out-going packet Medium-severity 1553 Error.
+ * @param ibswErrNo Error code (see doxygen documentation of errors.h).
+ */
+void CrIaServ5Evt1553ErrMParamSetIbswErrNo(FwSmDesc_t smDesc, unsigned short ibswErrNo);
+
+/**
+ * Sets the value of the parameter IbswErrNo of the out-going packet High-severity 1553 Error.
+ * @param ibswErrNo Error code (see doxygen documentation of errors.h).
+ */
+void CrIaServ5Evt1553ErrHParamSetIbswErrNo(FwSmDesc_t smDesc, unsigned short ibswErrNo);
+
+/**
+ * Sets the value of the parameter IbswErrNo of the out-going packet Low-severity SpaceWire Error.
+ * @param ibswErrNo Error code (see doxygen documentation of errors.h).
+ */
+void CrIaServ5EvtSpwErrLParamSetIbswErrNo(FwSmDesc_t smDesc, unsigned short ibswErrNo);
+
+/**
+ * Sets the value of the parameter IbswErrNo of the out-going packet Medium-severity SpaceWire Error.
+ * @param ibswErrNo Error code (see doxygen documentation of errors.h).
+ */
+void CrIaServ5EvtSpwErrMParamSetIbswErrNo(FwSmDesc_t smDesc, unsigned short ibswErrNo);
+
+/**
+ * Sets the value of the parameter IbswErrNo of the out-going packet High-severity SpaceWire Error.
+ * @param ibswErrNo Error code (see doxygen documentation of errors.h).
+ */
+void CrIaServ5EvtSpwErrHParamSetIbswErrNo(FwSmDesc_t smDesc, unsigned short ibswErrNo);
+
+/**
+ * Sets the value of the parameter IbswErrNo of the out-going packet Flash-Based Error Log Error.
+ * @param ibswErrNo Error code (see doxygen documentation of errors.h).
+ */
+void CrIaServ5EvtFlElErrParamSetIbswErrNo(FwSmDesc_t smDesc, unsigned short ibswErrNo);
+
+/**
+ * Sets the value of the parameter FlashAdd of the out-going packet Flash-Based Error Log Error.
+ * @param flashAdd The index of the 32-bit word in flash where the error occurred.
+ */
+void CrIaServ5EvtFlElErrParamSetFlashAdd(FwSmDesc_t smDesc, unsigned int flashAdd);
+
+/**
+ * Sets the value of the parameter IbswErrNo of the out-going packet Flash-Based File Error.
+ * @param ibswErrNo Error code (see doxygen documentation of errors.h).
+ */
+void CrIaServ5EvtFlFbfErrParamSetIbswErrNo(FwSmDesc_t smDesc, unsigned short ibswErrNo);
+
+/**
+ * Sets the value of the parameter FlashAdd of the out-going packet Flash-Based File Error.
+ * @param flashAdd The index of the 32-bit word in flash where the error occurred.
+ */
+void CrIaServ5EvtFlFbfErrParamSetFlashAdd(FwSmDesc_t smDesc, unsigned int flashAdd);
+
+/**
+ * Sets the value of the parameter FbfId of the out-going packet Flash-Based File Error.
+ * @param fbfId The identifier of the FBF where the error occurred.
+ */
+void CrIaServ5EvtFlFbfErrParamSetFbfId(FwSmDesc_t smDesc, unsigned short fbfId);
+
+/**
+ * Sets the value of the parameter ChipId of the out-going packet Flash Bad Block Encountered.
+ * @param chipId The identifier of the flash chip where the error occurred.
+ */
+void CrIaServ5EvtFlFbfBbParamSetChipId(FwSmDesc_t smDesc, unsigned short chipId);
+
+/**
+ * Sets the value of the parameter Blck of the out-going packet Flash Bad Block Encountered.
+ * @param blck The block where the error occurred (NB: a block is 1 MB, or 0x100000).
+ */
+void CrIaServ5EvtFlFbfBbParamSetBlck(FwSmDesc_t smDesc, unsigned short blck);
+
+/**
+ * Sets the value of the parameter RamAdd of the out-going packet Single Bit EDAC Error.
+ * @param ramAdd The RAM address where the error occurred.
+ */
+void CrIaServ5EvtSbitErrParamSetRamAdd(FwSmDesc_t smDesc, unsigned int ramAdd);
+
+/**
+ * Sets the value of the parameter RamAdd of the out-going packet Double Bit EDAC Error.
+ * @param ramAdd The RAM address where the error occurred.
+ */
+void CrIaServ5EvtDbitErrParamSetRamAdd(FwSmDesc_t smDesc, unsigned int ramAdd);
+
+/**
+ * Sets the value of the parameter StepNmb of the out-going packet SDP Failure.
+ * @param stepNmb The identifier of the science data processing step where the error occurred.
+ */
+void CrIaServ5EvtSdpNomemParamSetStepNmb(FwSmDesc_t smDesc, unsigned short stepNmb);
+
+/**
+ * Sets the value of the parameter DebugVal of the out-going packet SDP Failure.
+ * @param debugVal Debug value.
+ */
+void CrIaServ5EvtSdpNomemParamSetDebugVal(FwSmDesc_t smDesc, unsigned short debugVal);
+
+/**
+ * Sets the value of the parameter ProductID of the out-going packet Science Buffer Too Small.
+ * @param productID The product identifier.
+ */
+void CrIaServ5EvtProcbufInsufParamSetProductID(FwSmDesc_t smDesc, unsigned short productID);
+
+/**
+ * Sets the value of the parameter ReqSize of the out-going packet Science Buffer Too Small.
+ * @param reqSize The requested size in bytes.
+ */
+void CrIaServ5EvtProcbufInsufParamSetReqSize(FwSmDesc_t smDesc, unsigned int reqSize);
+
+/**
+ * Sets the value of the parameter AvailSize of the out-going packet Science Buffer Too Small.
+ * @param availSize The available size in bytes.
+ */
+void CrIaServ5EvtProcbufInsufParamSetAvailSize(FwSmDesc_t smDesc, unsigned int availSize);
+
+/**
+ * Sets the value of the parameter BufID of the out-going packet SIB or GIB Cannot Be Incremented.
+ * @param bufID The buffer identifier.
+ */
+void CrIaServ5EvtXibFullParamSetBufID(FwSmDesc_t smDesc, unsigned short bufID);
+
+/**
+ * Sets the value of the parameter ProductID of the out-going packet Image Too Large.
+ * @param productID The product identifier.
+ */
+void CrIaServ5EvtImgInsufParamSetProductID(FwSmDesc_t smDesc, unsigned short productID);
+
+/**
+ * Sets the value of the parameter StepID of the out-going packet Image Too Large.
+ * @param stepID The step identifier.
+ */
+void CrIaServ5EvtImgInsufParamSetStepID(FwSmDesc_t smDesc, unsigned short stepID);
+
+/**
+ * Sets the value of the parameter ReqSize of the out-going packet Image Too Large.
+ * @param reqSize The requested size in bytes.
+ */
+void CrIaServ5EvtImgInsufParamSetReqSize(FwSmDesc_t smDesc, unsigned int reqSize);
+
+/**
+ * Sets the value of the parameter AvailSize of the out-going packet Image Too Large.
+ * @param availSize The available size in bytes.
+ */
+void CrIaServ5EvtImgInsufParamSetAvailSize(FwSmDesc_t smDesc, unsigned int availSize);
+
+/**
+ * Sets the value of the parameter DpuMemoryId of the out-going packet Memory Dump using Absolute Addresses Report.
+ * @param dpuMemoryId The DPU memory identifier. See table \ref{tab:EDpuMemoryId} for the full overview of the DPU memory identifiers.
+ */
+void CrIaServ6MemDumpParamSetDpuMemoryId(FwSmDesc_t smDesc, unsigned short dpuMemoryId);
+
+/**
+ * Sets the value of the parameter StartAddress of the out-going packet Memory Dump using Absolute Addresses Report.
+ * @param startAddress The start address to be dumped.
+ */
+void CrIaServ6MemDumpParamSetStartAddress(FwSmDesc_t smDesc, unsigned int startAddress);
+
+/**
+ * Sets the value of the parameter BlockLength of the out-going packet Memory Dump using Absolute Addresses Report.
+ * @param blockLength The length of area to be dumped in number of bytes.
+ */
+void CrIaServ6MemDumpParamSetBlockLength(FwSmDesc_t smDesc, unsigned int blockLength);
+
+/**
+ * Sets the value of the parameter BlockData of the out-going packet Memory Dump using Absolute Addresses Report.
+ * @param blockData The dumped block data.
+ * @param length The data length in bytes.
+ */
+void CrIaServ6MemDumpParamSetBlockData(FwSmDesc_t smDesc, const unsigned char * blockData, unsigned short length);
+
+/**
+ * Sets the value of the parameter SduId of the out-going packet First Downlink Part Report.
+ * @param sduId The identifier of SDU being transferred.
+ */
+void CrIaServ13FstDwlkParamSetSduId(FwSmDesc_t smDesc, unsigned char sduId);
+
+/**
+ * Sets the value of the parameter SduBlockCount of the out-going packet First Downlink Part Report.
+ * @param sduBlockCount The SDU block counter.
+ */
+void CrIaServ13FstDwlkParamSetSduBlockCount(FwSmDesc_t smDesc, unsigned short sduBlockCount);
+
+/**
+ * Sets the value of the parameter SduBlockLength of the out-going packet First Downlink Part Report.
+ * @param sduBlockLength The length of the data block being transferred in bytes.
+ */
+void CrIaServ13FstDwlkParamSetSduBlockLength(FwSmDesc_t smDesc, unsigned short sduBlockLength);
+
+/**
+ * Sets the value of the parameter SduBlockData of the out-going packet First Downlink Part Report.
+ * @param sduBlockData The first data block.
+ * @param length The data length in bytes.
+ */
+void CrIaServ13FstDwlkParamSetSduBlockData(FwSmDesc_t smDesc, const unsigned char * sduBlockData, unsigned short length);
+
+/**
+ * Sets the value of the parameter SduId of the out-going packet Intermediate Downlink Part Report.
+ * @param sduId The identifier of SDU being transferred.
+ */
+void CrIaServ13IntmDwlkParamSetSduId(FwSmDesc_t smDesc, unsigned char sduId);
+
+/**
+ * Sets the value of the parameter SduBlockCount of the out-going packet Intermediate Downlink Part Report.
+ * @param sduBlockCount The SDU block counter.
+ */
+void CrIaServ13IntmDwlkParamSetSduBlockCount(FwSmDesc_t smDesc, unsigned short sduBlockCount);
+
+/**
+ * Sets the value of the parameter SduBlockLength of the out-going packet Intermediate Downlink Part Report.
+ * @param sduBlockLength The length of the data block being transferred in bytes.
+ */
+void CrIaServ13IntmDwlkParamSetSduBlockLength(FwSmDesc_t smDesc, unsigned short sduBlockLength);
+
+/**
+ * Sets the value of the parameter SduBlockData of the out-going packet Intermediate Downlink Part Report.
+ * @param sduBlockData The N-th data block.
+ * @param length The data length in bytes.
+ */
+void CrIaServ13IntmDwlkParamSetSduBlockData(FwSmDesc_t smDesc, const unsigned char * sduBlockData, unsigned short length);
+
+/**
+ * Sets the value of the parameter SduId of the out-going packet Last Downlink Part Report.
+ * @param sduId The identifier of SDU being transferred.
+ */
+void CrIaServ13LastDwlkParamSetSduId(FwSmDesc_t smDesc, unsigned char sduId);
+
+/**
+ * Sets the value of the parameter SduBlockCount of the out-going packet Last Downlink Part Report.
+ * @param sduBlockCount The SDU block counter.
+ */
+void CrIaServ13LastDwlkParamSetSduBlockCount(FwSmDesc_t smDesc, unsigned short sduBlockCount);
+
+/**
+ * Sets the value of the parameter SduBlockLength of the out-going packet Last Downlink Part Report.
+ * @param sduBlockLength The length of the data block being transferred in bytes.
+ */
+void CrIaServ13LastDwlkParamSetSduBlockLength(FwSmDesc_t smDesc, unsigned short sduBlockLength);
+
+/**
+ * Sets the value of the parameter SduBlockData of the out-going packet Last Downlink Part Report.
+ * @param sduBlockData The last data block.
+ * @param length The data length in bytes.
+ */
+void CrIaServ13LastDwlkParamSetSduBlockData(FwSmDesc_t smDesc, const unsigned char * sduBlockData, unsigned short length);
+
+/**
+ * Sets the value of the parameter SduId of the out-going packet Downlink Abort Report.
+ * @param sduId The identifier of SDU being aborted.
+ */
+void CrIaServ13DwlkAbrtParamSetSduId(FwSmDesc_t smDesc, unsigned char sduId);
+
+/**
+ * Sets the value of the parameter ReasonCode of the out-going packet Downlink Abort Report.
+ * @param reasonCode The reason code of abortion.
+ */
+void CrIaServ13DwlkAbrtParamSetReasonCode(FwSmDesc_t smDesc, unsigned short reasonCode);
+
+/**
+ * Sets the value of the parameter HbData of the out-going packet Heartbeat Report.
+ * @param hbData The heartbeat data, toggling between HEARTBEAT\_D1 and HEARTBEAT\_D2 values.
+ */
+void CrIaServ195HbRepParamSetHbData(FwSmDesc_t smDesc, unsigned short hbData);
+
+/**
+ * Sets the value of the parameter HbSEM of the out-going packet Heartbeat Report.
+ * @param hbSEM The SEM thermal control status.
+ */
+void CrIaServ195HbRepParamSetHbSEM(FwSmDesc_t smDesc, unsigned char hbSEM);
+
+/**
+ * Sets the value of the parameter OffsetX of the out-going packet AOCS Report.
+ * @param offsetX The offset from the target position in X-axis in [centi-arcseconds]. This is the residual in X-axis that should be corrected.
+ */
+void CrIaServ196AocsRepParamSetOffsetX(FwSmDesc_t smDesc, int offsetX); /* was: const char * offsetX */
+
+/**
+ * Sets the value of the parameter OffsetY of the out-going packet AOCS Report.
+ * @param offsetY The offset from the target position in Y-axis in [centi-arcseconds]. This is the residual in Y-axis that should be corrected.
+ */
+void CrIaServ196AocsRepParamSetOffsetY(FwSmDesc_t smDesc, int offsetY); /* was: const char * offsetX */
+
+/**
+ * Sets the value of the parameter TargetLocationX of the out-going packet AOCS Report.
+ * @param targetLocationX The X position on the CCD where the target shall to be located in [centi-arcseconds]. Origin = bottom left pixel corner (center of bottom left pixel is thus [50/50]), counting in Cartesian coordinates.
+ */
+void CrIaServ196AocsRepParamSetTargetLocationX(FwSmDesc_t smDesc, unsigned int targetLocationX); /* was: const unsigned char * targetLocationX */
+
+/**
+ * Sets the value of the parameter TargetLocationY of the out-going packet AOCS Report.
+ * @param targetLocationY The Y position on the CCD where the target shall to be located in [centi-arcseconds]. Origin = bottom left pixel corner (center of bottom left pixel is thus [50/50]), counting in Cartesian coordinates.
+ */
+void CrIaServ196AocsRepParamSetTargetLocationY(FwSmDesc_t smDesc, unsigned int targetLocationY); /* was: const unsigned char * targetLocationY */
+
+/**
+ * Sets the value of the parameter IntegStartTime of the out-going packet AOCS Report.
+ * @param integStartTime The time stamp of exposure start used for the centroid calculation.
+ */
+void CrIaServ196AocsRepParamSetIntegStartTimeCrs(FwSmDesc_t smDesc, unsigned int integStartTimeCrs);
+void CrIaServ196AocsRepParamSetIntegStartTimeFine(FwSmDesc_t smDesc, unsigned short integStartTimeFine); /* was: const unsigned char * integStartTime */
+
+/**
+ * Sets the value of the parameter IntegEndTime of the out-going packet AOCS Report.
+ * @param integEndTime The time stamp of exposure end used for the centroid calculation.
+ */
+void CrIaServ196AocsRepParamSetIntegEndTimeCrs(FwSmDesc_t smDesc, unsigned int integEndTimeCrs);
+void CrIaServ196AocsRepParamSetIntegEndTimeFine(FwSmDesc_t smDesc, unsigned short integEndTimeFine); /* was: const unsigned char * integEndTime */
+
+/**
+ * Sets the value of the parameter CentroidDataCadence of the out-going packet AOCS Report.
+ * @param centroidDataCadence The centroid data cadence time in centiseconds. CCD Window mode: 1 to 60 seconds. CCD Full mode: nominal 5 seconds (range 1..60 seconds).
+ */
+void CrIaServ196AocsRepParamSetCentroidDataCadence(FwSmDesc_t smDesc, unsigned short centroidDataCadence);
+
+/**
+ * Sets the value of the parameter ValidityStatus of the out-going packet AOCS Report.
+ * @param validityStatus The outcome of Validity Procedure.
+ */
+void CrIaServ196AocsRepParamSetValidityStatus(FwSmDesc_t smDesc, unsigned char validityStatus);
+
+/**
+ * Sets the value of the parameter ResetType of the out-going packet Boot Report.
+ * @param resetType The reset trigger type.
+ */
+void CrIaServ197BootRepParamSetResetType(FwSmDesc_t smDesc, unsigned char resetType);
+
+/**
+ * Sets the value of the parameter DpuMode of the out-going packet Boot Report.
+ * @param dpuMode The DPU mode.
+ */
+void CrIaServ197BootRepParamSetDpuMode(FwSmDesc_t smDesc, unsigned char dpuMode);
+
+/**
+ * Sets the value of the parameter DpuSwActive of the out-going packet Boot Report.
+ * @param dpuSwActive The active software on DPU.
+ */
+void CrIaServ197BootRepParamSetDpuSwActive(FwSmDesc_t smDesc, unsigned char dpuSwActive);
+
+/**
+ * Sets the value of the parameter DpuWatchdogStatus of the out-going packet Boot Report.
+ * @param dpuWatchdogStatus The DPU watchdog status.
+ */
+void CrIaServ197BootRepParamSetDpuWatchdogStatus(FwSmDesc_t smDesc, unsigned char dpuWatchdogStatus);
+
+/**
+ * Sets the value of the parameter DpuUnit of the out-going packet Boot Report.
+ * @param dpuUnit The DPU unit.
+ */
+void CrIaServ197BootRepParamSetDpuUnit(FwSmDesc_t smDesc, unsigned char dpuUnit);
+
+/**
+ * Sets the value of the parameter DpuResetType of the out-going packet Boot Report.
+ * @param dpuResetType The DPU reset type.
+ */
+void CrIaServ197BootRepParamSetDpuResetType(FwSmDesc_t smDesc, unsigned char dpuResetType);
+
+/**
+ * Sets the value of the parameter TimeSyncStatus of the out-going packet Boot Report.
+ * @param timeSyncStatus The time synchronization status.
+ */
+void CrIaServ197BootRepParamSetTimeSyncStatus(FwSmDesc_t smDesc, unsigned char timeSyncStatus);
+
+/**
+ * Sets the value of the parameter BootReportSent of the out-going packet Boot Report.
+ * @param bootReportSent Boot report sent status.
+ */
+void CrIaServ197BootRepParamSetBootReportSent(FwSmDesc_t smDesc, unsigned char bootReportSent);
+
+/**
+ * Sets the value of the parameter Spare1 of the out-going packet Boot Report.
+ * @param spare1 Spare parameter.
+ */
+void CrIaServ197BootRepParamSetSpare1(FwSmDesc_t smDesc, unsigned char spare1);
+
+/**
+ * Sets the value of the parameter SemError of the out-going packet Boot Report.
+ * @param semError The SEM error from the SEM status register.
+ */
+void CrIaServ197BootRepParamSetSemError(FwSmDesc_t smDesc, unsigned char semError);
+
+/**
+ * Sets the value of the parameter SemOn of the out-going packet Boot Report.
+ * @param semOn The SEM on status from the SEM status register.
+ */
+void CrIaServ197BootRepParamSetSemOn(FwSmDesc_t smDesc, unsigned char semOn);
+
+/**
+ * Sets the value of the parameter DpuScLinkStatus of the out-going packet Boot Report.
+ * @param dpuScLinkStatus The DPU SC link status.
+ */
+void CrIaServ197BootRepParamSetDpuScLinkStatus(FwSmDesc_t smDesc, unsigned char dpuScLinkStatus);
+
+/**
+ * Sets the value of the parameter DpuMilbusCoreEx of the out-going packet Boot Report.
+ * @param dpuMilbusCoreEx The DPU MilBus execution status.
+ */
+void CrIaServ197BootRepParamSetDpuMilbusCoreEx(FwSmDesc_t smDesc, unsigned char dpuMilbusCoreEx);
+
+/**
+ * Sets the value of the parameter DpuMilbusSyncDw of the out-going packet Boot Report.
+ * @param dpuMilbusSyncDw The DPU MilBus initial synchronization status.
+ */
+void CrIaServ197BootRepParamSetDpuMilbusSyncDw(FwSmDesc_t smDesc, unsigned char dpuMilbusSyncDw);
+
+/**
+ * Sets the value of the parameter DpuMilbusSyncTo of the out-going packet Boot Report.
+ * @param dpuMilbusSyncTo The DPU MilBus synchronization status.
+ */
+void CrIaServ197BootRepParamSetDpuMilbusSyncTo(FwSmDesc_t smDesc, unsigned char dpuMilbusSyncTo);
+
+/**
+ * Sets the value of the parameter DpuSemLinkStatus of the out-going packet Boot Report.
+ * @param dpuSemLinkStatus The DPU SEM link status.
+ */
+void CrIaServ197BootRepParamSetDpuSemLinkStatus(FwSmDesc_t smDesc, unsigned char dpuSemLinkStatus);
+
+/**
+ * Sets the value of the parameter DpuSemLinkState of the out-going packet Boot Report.
+ * @param dpuSemLinkState The DPU SEM link state.
+ */
+void CrIaServ197BootRepParamSetDpuSemLinkState(FwSmDesc_t smDesc, unsigned char dpuSemLinkState);
+
+/**
+ * Sets the value of the parameter ResetTime of the out-going packet Boot Report.
+ * @param resetTime The last reset time.
+ */
+void CrIaServ197BootRepParamSetResetTime(FwSmDesc_t smDesc, const unsigned char * resetTime);
+
+/**
+ * Sets the value of the parameter TrapCore1 of the out-going packet Boot Report.
+ * @param trapCore1 Exception number according to GR712RC user manual, Table 15, [RD-4]. Only valid if RESET\_TYPE = EXCEPTION\_RESET, otherwise = 0.
+ */
+void CrIaServ197BootRepParamSetTrapCore1(FwSmDesc_t smDesc, unsigned char trapCore1);
+
+/**
+ * Sets the value of the parameter TrapCore2 of the out-going packet Boot Report.
+ * @param trapCore2 Exception number according to GR712RC user manual, Table 15, [RD-4]. Only valid if RESET\_TYPE = EXCEPTION\_RESET, otherwise = 0.
+ */
+void CrIaServ197BootRepParamSetTrapCore2(FwSmDesc_t smDesc, unsigned char trapCore2);
+
+/**
+ * Sets the value of the parameter PsrRegCore1 of the out-going packet Boot Report.
+ * @param psrRegCore1 PSR CPU register of Core 1.
+ */
+void CrIaServ197BootRepParamSetPsrRegCore1(FwSmDesc_t smDesc, unsigned int psrRegCore1);
+
+/**
+ * Sets the value of the parameter WimRegCore1 of the out-going packet Boot Report.
+ * @param wimRegCore1 WIM CPU register of Core 1.
+ */
+void CrIaServ197BootRepParamSetWimRegCore1(FwSmDesc_t smDesc, unsigned int wimRegCore1);
+
+/**
+ * Sets the value of the parameter PcRegCore1 of the out-going packet Boot Report.
+ * @param pcRegCore1 PC CPU register of Core 1.
+ */
+void CrIaServ197BootRepParamSetPcRegCore1(FwSmDesc_t smDesc, unsigned int pcRegCore1);
+
+/**
+ * Sets the value of the parameter NpcRegCore1 of the out-going packet Boot Report.
+ * @param npcRegCore1 nPC CPU register of Core 1.
+ */
+void CrIaServ197BootRepParamSetNpcRegCore1(FwSmDesc_t smDesc, unsigned int npcRegCore1);
+
+/**
+ * Sets the value of the parameter FsrRegCore1 of the out-going packet Boot Report.
+ * @param fsrRegCore1 FSR CPU register of Core 1.
+ */
+void CrIaServ197BootRepParamSetFsrRegCore1(FwSmDesc_t smDesc, unsigned int fsrRegCore1);
+
+/**
+ * Sets the value of the parameter PsrRegCore2 of the out-going packet Boot Report.
+ * @param psrRegCore2 PSR CPU register of Core 2.
+ */
+void CrIaServ197BootRepParamSetPsrRegCore2(FwSmDesc_t smDesc, unsigned int psrRegCore2);
+
+/**
+ * Sets the value of the parameter WimRegCore2 of the out-going packet Boot Report.
+ * @param wimRegCore2 WIM CPU register of Core 2.
+ */
+void CrIaServ197BootRepParamSetWimRegCore2(FwSmDesc_t smDesc, unsigned int wimRegCore2);
+
+/**
+ * Sets the value of the parameter PcRegCore2 of the out-going packet Boot Report.
+ * @param pcRegCore2 PC CPU register of Core 2.
+ */
+void CrIaServ197BootRepParamSetPcRegCore2(FwSmDesc_t smDesc, unsigned int pcRegCore2);
+
+/**
+ * Sets the value of the parameter NpcRegCore2 of the out-going packet Boot Report.
+ * @param npcRegCore2 nPC CPU register of Core 2.
+ */
+void CrIaServ197BootRepParamSetNpcRegCore2(FwSmDesc_t smDesc, unsigned int npcRegCore2);
+
+/**
+ * Sets the value of the parameter FsrRegCore2 of the out-going packet Boot Report.
+ * @param fsrRegCore2 FSR CPU register of Core 2.
+ */
+void CrIaServ197BootRepParamSetFsrRegCore2(FwSmDesc_t smDesc, unsigned int fsrRegCore2);
+
+/**
+ * Sets the value of the parameter AhbStatusReg of the out-going packet Boot Report.
+ * @param ahbStatusReg AHB status register.
+ */
+void CrIaServ197BootRepParamSetAhbStatusReg(FwSmDesc_t smDesc, unsigned int ahbStatusReg);
+
+/**
+ * Sets the value of the parameter AhbFailingAddrReg of the out-going packet Boot Report.
+ * @param ahbFailingAddrReg AHB failing address register.
+ */
+void CrIaServ197BootRepParamSetAhbFailingAddrReg(FwSmDesc_t smDesc, unsigned int ahbFailingAddrReg);
+
+/**
+ * Sets the value of the parameter PcHistoryCore1 of the out-going packet Boot Report.
+ * @param pcHistoryCore1 Up to 7 values of stored Program Counters in the out register 7 (Core1) using CWP.
+ */
+void CrIaServ197BootRepParamSetPcHistoryCore1(FwSmDesc_t smDesc, const unsigned char * pcHistoryCore1);
+
+/**
+ * Sets the value of the parameter PcHistoryCore2 of the out-going packet Boot Report.
+ * @param pcHistoryCore2 Up to 7 values of stored Program Counters in the out register 7 (Core2) using CWP.
+ */
+void CrIaServ197BootRepParamSetPcHistoryCore2(FwSmDesc_t smDesc, const unsigned char * pcHistoryCore2);
+
+/**
+ * Sets the value of the parameter Spare2 of the out-going packet Boot Report.
+ * @param spare2 Spare parameter.
+ */
+void CrIaServ197BootRepParamSetSpare2(FwSmDesc_t smDesc, unsigned short spare2);
+
+/**
+ * Sets the value of the parameter DpuMemoryId of the out-going packet Boot Report.
+ * @param dpuMemoryId The DPU memory identifier. See table \ref{tab:EDpuMemoryId} for the full overview of the DPU memory identifiers.
+ */
+void CrIaServ197BootRepParamSetDpuMemoryId(FwSmDesc_t smDesc, unsigned short dpuMemoryId);
+
+/**
+ * Sets the value of the parameter StartAddress of the out-going packet Boot Report.
+ * @param startAddress The start address.
+ */
+void CrIaServ197BootRepParamSetStartAddress(FwSmDesc_t smDesc, unsigned int startAddress);
+
+/**
+ * Sets the value of the parameter ErrLogInfo of the out-going packet Boot Report.
+ * @param errLogInfo The error log of the most recent error.
+ */
+void CrIaServ197BootRepParamSetErrLogInfo(FwSmDesc_t smDesc, const unsigned char * errLogInfo);
+
+
+void CrIaSetUCharValue(FwSmDesc_t smDesc, unsigned char ucharValue, unsigned int pos);
+
+void CrIaSetUShortValue(FwSmDesc_t smDesc, unsigned short ushortValue, unsigned int pos);
+
+void CrIaSetUIntValue(FwSmDesc_t smDesc, unsigned int uintValue, unsigned int pos);
+
+#endif /* CRIA_PARAM_SETTER_H */
+
diff --git a/CrIa/src/Services/General/CrSemConstants.h b/CrIa/src/Services/General/CrSemConstants.h
new file mode 100644
index 0000000..8b38326
--- /dev/null
+++ b/CrIa/src/Services/General/CrSemConstants.h
@@ -0,0 +1,739 @@
+/**
+ * @file CrSemConstants.h
+ * @ingroup CrIaServicesGeneral
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Header file to define all service and packet identifiers, and packet length.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#ifndef CRSEM_CONSTANTS_H
+#define CRSEM_CONSTANTS_H
+
+
+/**
+ * SEM Acquisition Type IDs and max number of packets for that type
+ */
+#define CCD_WIN_EXPOS_ID         1 /* exposed star window, X*Y, typically 200x200 */
+#define CCD_WIN_LSM_ID           2 /* large side margin, 4*Y overscan, 8*Y blank, 16*Y dark */
+#define CCD_WIN_RSM_ID           3 /* reduced side margin, 8*Y blank, 16*Y dark */
+#define CCD_WIN_TM_ID            4 /* top margin window, X*6 overscan, X*3 dark */
+#define CCD_FULL_ID              5 /* full frame, 1076*1033 */
+#define CCD_FULL_MAX_PCKTS    2331
+
+#define MAX_CCD_PACKET_NUM CCD_FULL_MAX_PCKTS 
+
+/**
+ * SEM states from DLR-INST-IC-001 issue 1.6
+ */
+#define SEM_STATE_SAFE           1 
+#define SEM_STATE_STANDBY        2
+#define SEM_STATE_STABILIZE      3 
+#define SEM_STATE_SC_STAR_FAINT  4 
+#define SEM_STATE_SC_STAR_BRIGHT 5 
+#define SEM_STATE_SC_STAR_ULTBRT 6 
+#define SEM_STATE_CCD_FULL       7 
+#define SEM_STATE_DIAGNOSTIC     8 
+
+/**
+ * SEM mode configuration
+ */
+#define SEM_CCD_MODE_FAINT_STAR  0 
+#define SEM_CCD_MODE_BRIGHT_STAR 1
+#define SEM_CCD_MODE_ULTRBR_STAR 2
+#define SEM_CCD_MODE_CCD_FULL    3
+#define SEM_CCD_MODE_AUTO_STAR   4 
+#define SEM_CCD_MODE_FAINT_STAR_FAST 5 /* new in SEM ICD 2.4 */
+
+
+/**
+ * The length offset for the in-coming report.
+ */
+#define OFFSET_PAR_LENGTH_IN_REP_PCKT 16
+
+/**
+ * The length offset for the out-going command.
+ */
+#define OFFSET_PAR_LENGTH_OUT_CMD_PCKT 10
+
+/**
+ * The length of CRC.
+ */
+#define CRC_LENGTH 2
+
+/**
+ * Type identifier of the Service 1.
+ */
+#define CRSEM_SERV1 1
+
+/**
+ * Type identifier of the Housekeeping Data Reporting Service.
+ */
+#define CRSEM_SERV3 3
+
+/**
+ * Type identifier of the Event Reporting Service.
+ */
+#define CRSEM_SERV5 5
+
+/**
+ * Type identifier of the Housekeeping Data Reporting Service.
+ */
+#define CRSEM_SERV9 9
+
+/**
+ * Type identifier of the Science Data Service.
+ */
+#define CRSEM_SERV21 21
+
+/**
+ * Type identifier of the Private Service 220.
+ */
+#define CRSEM_SERV220 220
+
+/**
+ * Type identifier of the Private Service 221.
+ */
+#define CRSEM_SERV221 221
+
+/**
+ * Type identifier of the Private Service 222.
+ */
+#define CRSEM_SERV222 222
+
+/**
+ * Subtype identifier of the Service 1.
+ */
+#define CRSEM_SERV1_ACC_SUCC 1
+#define CRSEM_SERV1_ACC_FAIL 2
+#define CRSEM_SERV1_START_SUCC 3
+#define CRSEM_SERV1_START_FAIL 4
+#define CRSEM_SERV1_TERM_SUCC 7
+#define CRSEM_SERV1_TERM_FAIL 8
+
+/**
+ * Subtype identifier of the CMD Housekeeping Data Enable out-going command packet.
+ */
+#define CRSEM_SERV3_CMD_HK_ENABLE 5
+
+/**
+ * Subtype identifier of the CMD Housekeeping Data Disable out-going command packet.
+ */
+#define CRSEM_SERV3_CMD_HK_DISABLE 6
+
+/**
+ * Subtype identifier of the DAT HK in-coming report packet.
+ */
+#define CRSEM_SERV3_DAT_HK 25
+
+/**
+ * Subtype identifier of the CMD Housekeeping Data Period out-going command packet.
+ */
+#define CRSEM_SERV3_CMD_HK_PERIOD 129
+
+/**
+ * Subtype identifier of the Normal/Progress Report in-coming report packet.
+ */
+#define CRSEM_SERV5_EVT_NORM 1
+
+/**
+ * Subtype identifier of the Error Report - Low Severity in-coming report packet.
+ */
+#define CRSEM_SERV5_EVT_ERR_LOW_SEV 2
+
+/**
+ * Subtype identifier of the Error Report - Medium Severity in-coming report packet.
+ */
+#define CRSEM_SERV5_EVT_ERR_MED_SEV 3
+
+/**
+ * Subtype identifier of the Error Report - High Severity in-coming report packet.
+ */
+#define CRSEM_SERV5_EVT_ERR_HIGH_SEV 4
+
+/**
+ * Subtype identifier of the CMD Time Update out-going command packet.
+ */
+#define CRSEM_SERV9_CMD_TIME_UPDATE 129
+
+/**
+ * Subtype identifier of the CMD CCD Data Enable out-going command packet.
+ */
+#define CRSEM_SERV21_CMD_CCD_DATA_ENABLE 1
+
+/**
+ * Subtype identifier of the CMD CCD Data Disable out-going command packet.
+ */
+#define CRSEM_SERV21_CMD_CCD_DATA_DISABLE 2
+
+/**
+ * Subtype identifier of the DAT CCD Window in-coming report packet.
+ */
+#define CRSEM_SERV21_DAT_CCD_WINDOW 3
+
+/**
+ * Subtype identifier of the CMD Operation Parameter out-going command packet.
+ */
+#define CRSEM_SERV220_CMD_OPER_PARAM 3
+
+/**
+ * Subtype identifier of the CMD Temperature Control Enable out-going command packet.
+ */
+#define CRSEM_SERV220_CMD_TEMP_CTRL_ENABLE 4
+
+/**
+ * Subtype identifier of the DAT Operation Parameter in-coming report packet.
+ */
+#define CRSEM_SERV220_DAT_OPER_PARAM 6
+
+/**
+ * Subtype identifier of the Changes SEM Functional Parameter out-going command packet.
+ */
+#define CRSEM_SERV220_CMD_FUNCT_PARAM 11
+
+/**
+ * Subtype identifier of the DAT Functional Parameter in-coming report packet.
+ */
+#define CRSEM_SERV220_DAT_FUNCT_PARAM 12
+
+/**
+ * Subtype identifier of the CMD Safe Enter out-going command packet.
+ */
+#define CRSEM_SERV221_CMD_SAFE_ENTER 1
+
+/**
+ * Subtype identifier of the CMD Standby Enter out-going command packet.
+ */
+#define CRSEM_SERV221_CMD_STANDBY_ENTER 2
+
+/**
+ * Subtype identifier of the CMD FPM Power Enable out-going command packet.
+ */
+#define CRSEM_SERV221_CMD_FPM_POWER_ENABLE 3
+
+/**
+ * Subtype identifier of the CMD FPM Power Disable out-going command packet.
+ */
+#define CRSEM_SERV221_CMD_FPM_POWER_DISABLE 4
+
+/**
+ * Subtype identifier of the CMD Diagnostic Enable out-going command packet.
+ */
+#define CRSEM_SERV222_CMD_DIAG_ENABLE 3
+
+/**
+ * Subtype identifier of the CMD Diagnostic Disable out-going command packet.
+ */
+#define CRSEM_SERV222_CMD_DIAG_DISABLE 4
+
+/**
+ * Subtype identifier of the CMD Test Log in-coming report packet.
+ */
+#define CRSEM_SERV222_DAT_TEST_LOG 6
+
+/**
+ * Length of the CMD Housekeeping Data Enable out-going command packet.
+ */
+#define CRSEM_SERV3_CMD_HK_ENABLE_LENGTH (OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the CMD Housekeeping Data Disable out-going command packet.
+ */
+#define CRSEM_SERV3_CMD_HK_DISABLE_LENGTH (OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the DAT HK in-coming report packet.
+ */
+#define CRSEM_SERV3_DAT_HK_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the CMD Housekeeping Data Period out-going command packet.
+ */
+#define CRSEM_SERV3_CMD_HK_PERIOD_LENGTH (OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the Operation Default HK.
+ */
+#define CRSEM_SERV3_OPERATION_DEFAULT_HK_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 42 + CRC_LENGTH)
+
+/**
+ * Length of the Operation Extended HK.
+ */
+#define CRSEM_SERV3_OPERATION_EXTENDED_HK_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 90 + CRC_LENGTH)
+
+/**
+ * Length of the Normal/Progress Report in-coming report packet.
+ */
+#define CRSEM_SERV5_EVT_NORM_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the Error Report - Low Severity in-coming report packet.
+ */
+#define CRSEM_SERV5_EVT_ERR_LOW_SEV_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the Error Report - Medium Severity in-coming report packet.
+ */
+#define CRSEM_SERV5_EVT_ERR_MED_SEV_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the Error Report - High Severity in-coming report packet.
+ */
+#define CRSEM_SERV5_EVT_ERR_HIGH_SEV_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Progress(PBSBootReady).
+ */
+#define CRSEM_SERV5_EVENT_PRG_PBS_BOOT_READY_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 38 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Progress(APSBootReady).
+ */
+#define CRSEM_SERV5_EVENT_PRG_APS_BOOT_READY_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 38 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Progress(ModeTransition).
+ */
+#define CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Progress(DiagStepFinished).
+ */
+#define CRSEM_SERV5_EVENT_PRG_DIAGNOSE_STEP_FINISHED_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Progress(TempStable).
+ */
+#define CRSEM_SERV5_EVENT_PRG_THERMAL_STABILITY_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Progress(CFGLoadReady).
+ */
+#define CRSEM_SERV5_EVENT_PRG_CFG_LOAD_READY_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 38 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Progress(FPATempNominal).
+ */
+#define CRSEM_SERV5_EVENT_PRG_FPA_TEMP_NOMINAL_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Warning(EEPROM no segment).
+ */
+#define CRSEM_SERV5_EVENT_WAR_EEPROM_NO_SEGMENT_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Warning(EEPROM no APS exe).
+ */
+#define CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_EXE_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Warning(EEPROM no APS config).
+ */
+#define CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_CFG_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Warning(EEPROM no PBS config).
+ */
+#define CRSEM_SERV5_EVENT_WAR_EEPROM_NO_PBS_CFG_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Warning(EEPROM no APS exe flag).
+ */
+#define CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_EXE_FLAG_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Warning(EEPROM no APS config flag).
+ */
+#define CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_CFG_FLAG_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Warning(TempUnstable).
+ */
+#define CRSEM_SERV5_EVENT_WAR_NO_THERMAL_STABILITY_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 14 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Warning(FPATempTooHigh).
+ */
+#define CRSEM_SERV5_EVENT_WAR_FPA_TEMP_TOO_HIGH_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Warning(WrongExposureTime).
+ */
+#define CRSEM_SERV5_EVENT_WAR_WRONG_EXPOSURE_TIME_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 8 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Warning(WrongRepetitionPeriod).
+ */
+#define CRSEM_SERV5_EVENT_WAR_WRONG_REPETITION_PERIOD_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 12 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Warning(FPMoffOnlyPattern).
+ */
+#define CRSEM_SERV5_EVT_WAR_PATTER_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Warning(PackEncodeFailure).
+ */
+#define CRSEM_SERV5_EVT_WAR_PACKWR_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Error(EEPROM write error).
+ */
+#define CRSEM_SERV5_EVENT_ERR_EEPROM_WRITE_ERROR_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Error(Auto-boot failure).
+ */
+#define CRSEM_SERV5_EVENT_ERR_APS_BOOT_FAILURE_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Error(unexpected re-boot).
+ */
+#define CRSEM_SERV5_EVENT_ERR_UNEXPECTED_REBOOT_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 20 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Error(watchdog failure).
+ */
+#define CRSEM_SERV5_EVENT_ERR_WATCHDOG_FAILURE_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 10 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Error(SpW Error).
+ */
+#define CRSEM_SERV5_EVENT_ERR_CMD_SPW_RX_ERROR_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Error(EEPROM Exe copy abort).
+ */
+#define CRSEM_SERV5_EVENT_ERR_EEPROM_EXE_SEG_COPY_ABORT_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Error(EEPROM EXE seg CRC wrong).
+ */
+#define CRSEM_SERV5_EVENT_ERR_EEPROM_EXE_SEG_CRC_WRONG_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Error(PBS CFG size wrong).
+ */
+#define CRSEM_SERV5_EVENT_ERR_EEPROM_PBS_CFG_SIZE_WRONG_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Error(Reg writing wrong).
+ */
+#define CRSEM_SERV5_EVENT_ERR_WRITING_REGISTER_FAILED_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 14 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Error(CMD Buffer1 full).
+ */
+#define CRSEM_SERV5_EVENT_ERR_CMD_BUFFER_1_FULL_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Error(CMD Buffer2 full).
+ */
+#define CRSEM_SERV5_EVENT_ERR_CMD_BUFFER_2_FULL_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Error(DMA data transfer failure).
+ */
+#define CRSEM_SERV5_EVT_ERR_DAT_DMA_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Error(BIAS voltage wrong).
+ */
+#define CRSEM_SERV5_EVT_ERR_BIAS_SET_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 34 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Error(FEE-SCU sync failure).
+ */
+#define CRSEM_SERV5_EVT_ERR_SYNC_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Error(FEE script error).
+ */
+#define CRSEM_SERV5_EVT_ERR_SCRIPT_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 4 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Error(PCU power switching failed).
+ */
+#define CRSEM_SERV5_EVT_ERR_PWR_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the DAT_Event_Error(SpW time code missing).
+ */
+#define CRSEM_SERV5_EVT_ERR_SPW_TC_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the CMD Time Update out-going command packet.
+ */
+#define CRSEM_SERV9_CMD_TIME_UPDATE_LENGTH (OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 6 + CRC_LENGTH)
+
+/**
+ * Length of the CMD CCD Data Enable out-going command packet.
+ */
+#define CRSEM_SERV21_CMD_CCD_DATA_ENABLE_LENGTH (OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the CMD CCD Data Disable out-going command packet.
+ */
+#define CRSEM_SERV21_CMD_CCD_DATA_DISABLE_LENGTH (OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the DAT CCD Window in-coming report packet.
+ */
+#define CRSEM_SERV21_DAT_CCD_WINDOW_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 1006 + CRC_LENGTH)
+
+/**
+ * Length of the CMD Operation Parameter out-going command packet.
+ */
+#define CRSEM_SERV220_CMD_OPER_PARAM_LENGTH (OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 14 + CRC_LENGTH) /* NOTE: manual fix */
+
+/**
+ * Length of the CMD Temperature Control Enable out-going command packet.
+ */
+#define CRSEM_SERV220_CMD_TEMP_CTRL_ENABLE_LENGTH (OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the CMD Temperature Control Disable out-going command packet.
+ */
+#define CRSEM_SERV220_CMD_TEMP_CTRL_DISABLE_LENGTH (OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the CMD Functional Parameter out-going command packet.
+ */
+#define CRSEM_SERV220_CMD_FUNCT_PARAM_LENGTH (OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 38 + CRC_LENGTH)
+
+/**
+ * Length of the CMD Safe Enter out-going command packet.
+ */
+#define CRSEM_SERV221_CMD_SAFE_ENTER_LENGTH (OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the CMD Standby Enter out-going command packet.
+ */
+#define CRSEM_SERV221_CMD_STANDBY_ENTER_LENGTH (OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the CMD FPM Power Enable out-going command packet.
+ */
+#define CRSEM_SERV221_CMD_FPM_POWER_ENABLE_LENGTH (OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the CMD FPM Power Disable out-going command packet.
+ */
+#define CRSEM_SERV221_CMD_FPM_POWER_DISABLE_LENGTH (OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the CMD Diagnostic Enable out-going command packet.
+ */
+#define CRSEM_SERV222_CMD_DIAG_ENABLE_LENGTH (OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 2 + CRC_LENGTH)
+
+/**
+ * Length of the CMD Diagnostic Disable out-going command packet.
+ */
+#define CRSEM_SERV222_CMD_DIAG_DISABLE_LENGTH (OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 0 + CRC_LENGTH)
+
+/**
+ * Length of the DAT Test Log in-coming report packet.
+ */
+#define CRSEM_SERV222_DAT_TEST_LOG_LENGTH (OFFSET_PAR_LENGTH_IN_REP_PCKT + 5 + CRC_LENGTH)
+
+/**
+ * Identifier of the Operation Default HK.
+ */
+#define CRSEM_SERV3_OPERATION_DEFAULT_HK 1
+
+/**
+ * Identifier of the Operation Extended HK.
+ */
+#define CRSEM_SERV3_OPERATION_EXTENDED_HK 2
+
+/**
+ * Identifier of the DAT_Event_Progress(PBSBootReady).
+ */
+#define CRSEM_SERV5_EVENT_PRG_PBS_BOOT_READY 42001
+
+/**
+ * Identifier of the DAT_Event_Progress(APSBootReady).
+ */
+#define CRSEM_SERV5_EVENT_PRG_APS_BOOT_READY 42002
+
+/**
+ * Identifier of the DAT_Event_Progress(ModeTransition).
+ */
+#define CRSEM_SERV5_EVENT_PRG_MODE_TRANSITION 42003
+
+/**
+ * Identifier of the DAT_Event_Progress(DiagStepFinished).
+ */
+#define CRSEM_SERV5_EVENT_PRG_DIAGNOSE_STEP_FINISHED 42004
+
+/**
+ * Identifier of the DAT_Event_Progress(TempStable).
+ */
+#define CRSEM_SERV5_EVENT_PRG_THERMAL_STABILITY 42008
+
+/**
+ * Identifier of the DAT_Event_Progress(CFGLoadReady).
+ */
+#define CRSEM_SERV5_EVENT_PRG_CFG_LOAD_READY 42009
+
+/**
+ * Identifier of the DAT_Event_Progress(FPATempNominal).
+ */
+#define CRSEM_SERV5_EVENT_PRG_FPA_TEMP_NOMINAL 42010
+
+/**
+ * Identifier of the DAT_Event_Warning(EEPROM no segment).
+ */
+#define CRSEM_SERV5_EVENT_WAR_EEPROM_NO_SEGMENT 42204
+
+/**
+ * Identifier of the DAT_Event_Warning(EEPROM no APS exe).
+ */
+#define CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_EXE 42205
+
+/**
+ * Identifier of the DAT_Event_Warning(EEPROM no APS config).
+ */
+#define CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_CFG 42206
+
+/**
+ * Identifier of the DAT_Event_Warning(EEPROM no PBS config).
+ */
+#define CRSEM_SERV5_EVENT_WAR_EEPROM_NO_PBS_CFG 42207
+
+/**
+ * Identifier of the DAT_Event_Warning(EEPROM no APS exe flag).
+ */
+#define CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_EXE_FLAG 42208
+
+/**
+ * Identifier of the DAT_Event_Warning(EEPROM no APS config flag).
+ */
+#define CRSEM_SERV5_EVENT_WAR_EEPROM_NO_APS_CFG_FLAG 42209
+
+/**
+ * Identifier of the DAT_Event_Warning(TempUnstable).
+ */
+#define CRSEM_SERV5_EVENT_WAR_NO_THERMAL_STABILITY 42214
+
+/**
+ * Identifier of the DAT_Event_Warning(FPATempTooHigh).
+ */
+#define CRSEM_SERV5_EVENT_WAR_FPA_TEMP_TOO_HIGH 42215
+
+/**
+ * Identifier of the DAT_Event_Warning(WrongExposureTime).
+ */
+#define CRSEM_SERV5_EVENT_WAR_WRONG_EXPOSURE_TIME 42216
+
+/**
+ * Identifier of the DAT_Event_Warning(WrongRepetitionPeriod).
+ */
+#define CRSEM_SERV5_EVENT_WAR_WRONG_REPETITION_PERIOD 42217
+
+/**
+ * Identifier of the DAT_Event_Warning(FPMoffOnlyPattern).
+ */
+#define CRSEM_SERV5_EVT_WAR_PATTER 42218
+
+/**
+ * Identifier of the DAT_Event_Warning(PackEncodeFailure).
+ */
+#define CRSEM_SERV5_EVT_WAR_PACKWR 42219
+
+/**
+ * Identifier of the DAT_Event_Error(EEPROM write error).
+ */
+#define CRSEM_SERV5_EVENT_ERR_EEPROM_WRITE_ERROR 43800
+
+/**
+ * Identifier of the DAT_Event_Error(Auto-boot failure).
+ */
+#define CRSEM_SERV5_EVENT_ERR_APS_BOOT_FAILURE 43801
+
+/**
+ * Identifier of the DAT_Event_Error(unexpected re-boot).
+ */
+#define CRSEM_SERV5_EVENT_ERR_UNEXPECTED_REBOOT 43802
+
+/**
+ * Identifier of the DAT_Event_Error(watchdog failure).
+ */
+#define CRSEM_SERV5_EVENT_ERR_WATCHDOG_FAILURE 43813
+
+/**
+ * Identifier of the DAT_Event_Error(SpW Error).
+ */
+#define CRSEM_SERV5_EVENT_ERR_CMD_SPW_RX_ERROR 43814
+
+/**
+ * Identifier of the DAT_Event_Error(EEPROM Exe copy abort).
+ */
+#define CRSEM_SERV5_EVENT_ERR_EEPROM_EXE_SEG_COPY_ABORT 43815
+
+/**
+ * Identifier of the DAT_Event_Error(EEPROM EXE seg CRC wrong).
+ */
+#define CRSEM_SERV5_EVENT_ERR_EEPROM_EXE_SEG_CRC_WRONG 43816
+
+/**
+ * Identifier of the DAT_Event_Error(PBS CFG size wrong).
+ */
+#define CRSEM_SERV5_EVENT_ERR_EEPROM_PBS_CFG_SIZE_WRONG 43817
+
+/**
+ * Identifier of the DAT_Event_Error(Reg writing wrong).
+ */
+#define CRSEM_SERV5_EVENT_ERR_WRITING_REGISTER_FAILED 43818
+
+/**
+ * Identifier of the DAT_Event_Error(CMD Buffer1 full).
+ */
+#define CRSEM_SERV5_EVENT_ERR_CMD_BUFFER_1_FULL 43819
+
+/**
+ * Identifier of the DAT_Event_Error(CMD Buffer2 full).
+ */
+#define CRSEM_SERV5_EVENT_ERR_CMD_BUFFER_2_FULL 43820
+
+/**
+ * Identifier of the DAT_Event_Error(DMA data transfer failure).
+ */
+#define CRSEM_SERV5_EVT_ERR_DAT_DMA 43821
+
+/**
+ * Identifier of the DAT_Event_Error(BIAS voltage wrong).
+ */
+#define CRSEM_SERV5_EVT_ERR_BIAS_SET 43822
+
+/**
+ * Identifier of the DAT_Event_Error(FEE-SCU sync failure).
+ */
+#define CRSEM_SERV5_EVT_ERR_SYNC 43823
+
+/**
+ * Identifier of the DAT_Event_Error(FEE script error).
+ */
+#define CRSEM_SERV5_EVT_ERR_SCRIPT 43824
+
+/**
+ * Identifier of the DAT_Event_Error(PCU power switching failed).
+ */
+#define CRSEM_SERV5_EVT_ERR_PWR 43825
+
+/**
+ * Identifier of the DAT_Event_Error(SpW time code missing).
+ */
+#define CRSEM_SERV5_EVT_ERR_SPW_TC 43826
+
+#endif /* CRSEM_CONSTANTS_H */
+
diff --git a/CrIa/src/Services/General/CrSemParamGetter.c b/CrIa/src/Services/General/CrSemParamGetter.c
new file mode 100644
index 0000000..be2036c
--- /dev/null
+++ b/CrIa/src/Services/General/CrSemParamGetter.c
@@ -0,0 +1,930 @@
+/**
+ * @file CrSemParamGetter.c
+ * @ingroup CrIaServicesGeneral
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the getter operations for all parameters of all in-coming packets.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrSemParamGetter.h"
+#include "CrSemConstants.h"
+#include "CrIaPckt.h"
+#include <string.h>
+
+#define GET_UCHAR_FROM_PCKT(from) ((unsigned char)(pckt[from]))
+
+#define GET_USHORT_FROM_PCKT(from) ( (((unsigned char)(pckt[from])) << 8) | ((unsigned char)(pckt[from+1])) )
+
+#define GET_UINT_FROM_PCKT(from) ( (((unsigned char)(pckt[from])) << 24) | (((unsigned char)(pckt[from+1])) << 16) | (((unsigned char)(pckt[from+2])) << 8) | ((unsigned char)(pckt[from+3])) )
+
+
+
+static unsigned char GetBitsFromByte(unsigned char value, unsigned char at, unsigned char numBits)
+{
+  unsigned char mask = (1 << numBits) -1;
+  return (value >> at) & mask;
+}
+
+static unsigned short GetBitsFromShort(unsigned short value, unsigned short at, unsigned short numBits)
+{
+  unsigned short mask = (1 << numBits) -1;
+  return (value >> at) & mask;
+}
+
+void CrSemServ3DatHkParamGetHkStatSid(unsigned short * hkStatSid, CrFwPckt_t pckt)
+{
+  *hkStatSid = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT);
+  return;
+}
+
+/***************/
+/* Default HK  */
+/***************/
+void CrSemServ3OperationDefaultHkParamGetHkStatMode(unsigned short * hkStatMode, CrFwPckt_t pckt)
+{
+  *hkStatMode = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 2);
+  return;
+}
+
+/* get HK_STAT_FLAGS including all flags */
+void CrSemServ3OperationDefaultHkParamGetHkStatFlags(unsigned short * hkStatFlags, CrFwPckt_t pckt)
+{
+  *hkStatFlags = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 4);
+  return;
+}
+
+void CrSemServ3OperationDefaultHkParamGetFixVal9(unsigned short * fixVal9, CrFwPckt_t pckt)
+{
+  *fixVal9 = GetBitsFromShort(pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 4], 0, 9);
+  return;
+}
+
+void CrSemServ3OperationDefaultHkParamGetHkStatObtSyncFlag(unsigned char * hkStatObtSyncFlag, CrFwPckt_t pckt)
+{
+  *hkStatObtSyncFlag = GetBitsFromByte(pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 5], 2, 1);
+  return;
+}
+
+void CrSemServ3OperationDefaultHkParamGetHkStatWatchDog(unsigned char * hkStatWatchDog, CrFwPckt_t pckt)
+{
+  *hkStatWatchDog = GetBitsFromByte(pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 5], 3, 1);
+  return;
+}
+
+void CrSemServ3OperationDefaultHkParamGetHkStatEepromPower(unsigned char * hkStatEepromPower, CrFwPckt_t pckt)
+{
+  *hkStatEepromPower = GetBitsFromByte(pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 5], 4, 1);
+  return;
+}
+
+void CrSemServ3OperationDefaultHkParamGetHkStatHkPower(unsigned char * hkStatHkPower, CrFwPckt_t pckt)
+{
+  *hkStatHkPower = GetBitsFromByte(pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 5], 5, 1);
+  return;
+}
+
+void CrSemServ3OperationDefaultHkParamGetHkStatFpmPower(unsigned char * hkStatFpmPower, CrFwPckt_t pckt)
+{
+  *hkStatFpmPower = GetBitsFromByte(pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 5], 6, 1);
+  return;
+}
+
+void CrSemServ3OperationDefaultHkParamGetHkStatDatBufferOverflow(unsigned char * hkStatDatBufferOverflow, CrFwPckt_t pckt)
+{
+  *hkStatDatBufferOverflow = GetBitsFromByte(pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 5], 7, 1);
+  return;
+}
+
+void CrSemServ3OperationDefaultHkParamGetHkStatScuMainRed(unsigned char * hkStatScuMainRed, CrFwPckt_t pckt)
+{
+  *hkStatScuMainRed = GetBitsFromByte(pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 5], 8, 1);
+  return;
+}
+
+void CrSemServ3OperationDefaultHkParamGetHkStatLastSpwlinkError(unsigned short * hkStatLastSpwlinkError, CrFwPckt_t pckt)
+{
+  *hkStatLastSpwlinkError = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 6);
+  return;
+}
+
+void CrSemServ3OperationDefaultHkParamGetHkStatLastErrorId(unsigned short * hkStatLastErrorId, CrFwPckt_t pckt)
+{
+  *hkStatLastErrorId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 8);
+  return;
+}
+
+void CrSemServ3OperationDefaultHkParamGetHkStatLastErrorFrequency(unsigned short * hkStatLastErrorFrequency, CrFwPckt_t pckt)
+{
+  *hkStatLastErrorFrequency = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 10);
+  return;
+}
+
+void CrSemServ3OperationDefaultHkParamGetHkStatNumCmdReceived(unsigned short * hkStatNumCmdReceived, CrFwPckt_t pckt)
+{
+  *hkStatNumCmdReceived = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 12);
+  return;
+}
+
+void CrSemServ3OperationDefaultHkParamGetHkStatNumCmdExecuted(unsigned short * hkStatNumCmdExecuted, CrFwPckt_t pckt)
+{
+  *hkStatNumCmdExecuted = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 14);
+  return;
+}
+
+void CrSemServ3OperationDefaultHkParamGetHkStatNumDatSent(unsigned short * hkStatNumDatSent, CrFwPckt_t pckt)
+{
+  *hkStatNumDatSent = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 16);
+  return;
+}
+
+void CrSemServ3OperationDefaultHkParamGetHkStatScuProcDutyCycle(unsigned short * hkStatScuProcDutyCycle, CrFwPckt_t pckt)
+{
+  *hkStatScuProcDutyCycle = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 18);
+  return;
+}
+
+void CrSemServ3OperationDefaultHkParamGetHkStatScuNumAhbError(unsigned short * hkStatScuNumAhbError, CrFwPckt_t pckt)
+{
+  *hkStatScuNumAhbError = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 20);
+  return;
+}
+
+void CrSemServ3OperationDefaultHkParamGetHkStatScuNumAhbCorrectableError(unsigned short * hkStatScuNumAhbCorrectableError, CrFwPckt_t pckt)
+{
+  *hkStatScuNumAhbCorrectableError = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 22);
+  return;
+}
+
+void CrSemServ3OperationDefaultHkParamGetHkStatHkNumLatchupError(unsigned short * hkStatHkNumLatchupError, CrFwPckt_t pckt)
+{
+  *hkStatHkNumLatchupError = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 24);
+  return;
+}
+
+void CrSemServ3OperationDefaultHkParamGetHkTempSemScu(float * hkTempSemScu, CrFwPckt_t pckt)
+{
+  *((unsigned int *)hkTempSemScu) = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 26);
+  return;
+}
+
+void CrSemServ3OperationDefaultHkParamGetHkTempSemPcu(float * hkTempSemPcu, CrFwPckt_t pckt)
+{
+  *((unsigned int *)hkTempSemPcu) = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 30);
+  return;
+}
+
+/* NOTE: NEW in ICD DLR-INST-IC-001, issue 2.1 */
+void CrSemServ3OperationDefaultHkParamGetHkVoltScuP34(float * hkVoltScuP34, CrFwPckt_t pckt)
+{
+  *((unsigned int *)hkVoltScuP34) = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 34);
+  return;
+}
+
+/* NOTE: NEW in ICD DLR-INST-IC-001, issue 2.1 */
+void CrSemServ3OperationDefaultHkParamGetHkVoltScuP5(float * hkVoltScuP5, CrFwPckt_t pckt)
+{
+  *((unsigned int *)hkVoltScuP5) = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 38);
+  return;
+}
+
+/***************/
+/* Extended HK */
+/***************/
+
+/**
+ * @warning There is one dangerous thing here: the floats which are acquired by 
+ *          getters such as @ref CrSemServ3OperationExtendedHkParamGetHkVoltFeeVod 
+ *          must be normalized (see App Note on "Handling denormalized numbers with the GRFPU").
+ *          If they are not (because SEM gives us rubbish data), this leads to a FP exception.
+ */
+
+void CrSemServ3OperationExtendedHkParamGetHkTempFeeCcd(float * hkTempFeeCcd, CrFwPckt_t pckt)
+{
+  *((unsigned int *)hkTempFeeCcd) = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 2);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkTempFeeStrap(float * hkTempFeeStrap, CrFwPckt_t pckt)
+{
+  *((unsigned int *)hkTempFeeStrap) = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 6);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkTempFeeAdc(float * hkTempFeeAdc, CrFwPckt_t pckt)
+{
+  *((unsigned int *)hkTempFeeAdc) = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 10);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkTempFeeBias(float * hkTempFeeBias, CrFwPckt_t pckt)
+{
+  *((unsigned int *)hkTempFeeBias) = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 14);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkTempFeeDeb(float * hkTempFeeDeb, CrFwPckt_t pckt)
+{
+  *((unsigned int *)hkTempFeeDeb) = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 18);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkVoltFeeVod(float * hkVoltFeeVod, CrFwPckt_t pckt)
+{
+  *((unsigned int *)hkVoltFeeVod) = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 22);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkVoltFeeVrd(float * hkVoltFeeVrd, CrFwPckt_t pckt)
+{
+  *((unsigned int *)hkVoltFeeVrd) = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 26);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkVoltFeeVog(float * hkVoltFeeVog, CrFwPckt_t pckt)
+{
+  *((unsigned int *)hkVoltFeeVog) = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 30);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkVoltFeeVss(float * hkVoltFeeVss, CrFwPckt_t pckt)
+{
+  *((unsigned int *)hkVoltFeeVss) = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 34);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkVoltFeeCcd(float * hkVoltFeeCcd, CrFwPckt_t pckt)
+{
+  *((unsigned int *)hkVoltFeeCcd) = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 38);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkVoltFeeClk(float * hkVoltFeeClk, CrFwPckt_t pckt)
+{
+  *((unsigned int *)hkVoltFeeClk) = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 42);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkVoltFeeAnaP5(float * hkVoltFeeAnaP5, CrFwPckt_t pckt)
+{
+  *((unsigned int *)hkVoltFeeAnaP5) = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 46);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkVoltFeeAnaN5(float * hkVoltFeeAnaN5, CrFwPckt_t pckt)
+{
+  *((unsigned int *)hkVoltFeeAnaN5) = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 50);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkVoltFeeDigP33(float * hkVoltDigP33, CrFwPckt_t pckt)
+{
+  *((unsigned int *)hkVoltDigP33) = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 54);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkCurrFeeClkBuf(float * hkCurrFeeClkBuf, CrFwPckt_t pckt)
+{
+  *((unsigned int *)hkCurrFeeClkBuf) = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 58);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkVoltScuFpgaP15(float * hkVoltScuFpgaP15, CrFwPckt_t pckt)
+{
+  *((unsigned int *)hkVoltScuFpgaP15) = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 62);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkCurrScuP34(float * hkCurrScuP34, CrFwPckt_t pckt)
+{
+  *((unsigned int *)hkCurrScuP34) = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 66);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrCredit(unsigned char * hkStatNumSpwErrCredit, CrFwPckt_t pckt)
+{
+  *hkStatNumSpwErrCredit = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 70);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrEscape(unsigned char * hkStatNumSpwErrEscape, CrFwPckt_t pckt)
+{
+  *hkStatNumSpwErrEscape = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 71);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrDisconnect(unsigned char * hkStatNumSpwErrDisconnect, CrFwPckt_t pckt)
+{
+  *hkStatNumSpwErrDisconnect = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 72);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrParity(unsigned char * hkStatNumSpwErrParity, CrFwPckt_t pckt)
+{
+  *hkStatNumSpwErrParity = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 73);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrWriteSync(unsigned char * hkStatNumSpwErrWriteSync, CrFwPckt_t pckt)
+{
+  *hkStatNumSpwErrWriteSync = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 74);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrInvalidAddress(unsigned char * hkStatNumSpwErrInvalidAddress, CrFwPckt_t pckt)
+{
+  *hkStatNumSpwErrInvalidAddress = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 75);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrEopeep(unsigned char * hkStatNumSpwErrEopeep, CrFwPckt_t pckt)
+{
+  *hkStatNumSpwErrEopeep = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 76);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrRxAhb(unsigned char * hkStatNumSpwErrRxAhb, CrFwPckt_t pckt)
+{
+  *hkStatNumSpwErrRxAhb = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 77);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrTxAhb(unsigned char * hkStatNumSpwErrTxAhb, CrFwPckt_t pckt)
+{
+  *hkStatNumSpwErrTxAhb = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 78);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrTxBlocked(unsigned char * hkStatNumSpwErrTxBlocked, CrFwPckt_t pckt)
+{
+  *hkStatNumSpwErrTxBlocked = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 79);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrTxle(unsigned char * hkStatNumSpwErrTxle, CrFwPckt_t pckt)
+{
+  *hkStatNumSpwErrTxle = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 80);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrRx(unsigned char * hkStatNumSpwErrRx, CrFwPckt_t pckt)
+{
+  *hkStatNumSpwErrRx = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 81);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrTx(unsigned char * hkStatNumSpwErrTx, CrFwPckt_t pckt)
+{
+  *hkStatNumSpwErrTx = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 82);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkStatHeatPwmFpaCcd(unsigned char * hkStatHeatPwmFpaCcd, CrFwPckt_t pckt)
+{
+  *hkStatHeatPwmFpaCcd = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 83);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkStatHeatPwmFeeStrap(unsigned char * hkStatHeatPwmFeeStrap, CrFwPckt_t pckt)
+{
+  *hkStatHeatPwmFeeStrap = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 84);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkStatHeatPwmFeeAnach(unsigned char * hkStatHeatPwmFeeAnach, CrFwPckt_t pckt)
+{
+  *hkStatHeatPwmFeeAnach = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 85);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkStatHeatPwmSpare(unsigned char * hkStatHeatPwmSpare, CrFwPckt_t pckt)
+{
+  *hkStatHeatPwmSpare = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 86);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkStatBits(unsigned char * hkStatBits, CrFwPckt_t pckt)
+{
+  *hkStatBits = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 87);
+  return;
+}
+
+void CrSemServ3OperationExtendedHkParamGetHkStatOBTimeSyncDelta(unsigned short * hkStatOBTimeSyncDelta, CrFwPckt_t pckt)
+{
+  *hkStatOBTimeSyncDelta = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 88);
+  return;
+}
+
+/* End Of HK Getter */
+
+void CrSemServ5EvtNormParamGetHkEventProgId(unsigned short * hkEventProgId, CrFwPckt_t pckt)
+{
+  *hkEventProgId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT);
+  return;
+}
+
+void CrSemServ5EvtErrLowSevParamGetHkEventProgId(unsigned short * hkEventProgId, CrFwPckt_t pckt)
+{
+  *hkEventProgId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT);
+  return;
+}
+
+void CrSemServ5EvtErrMedSevParamGetHkEventProgId(unsigned short * hkEventProgId, CrFwPckt_t pckt)
+{
+  *hkEventProgId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT);
+  return;
+}
+
+void CrSemServ5EvtErrHighSevParamGetHkEventProgId(unsigned short * hkEventProgId, CrFwPckt_t pckt)
+{
+  *hkEventProgId = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT);
+  return;
+}
+
+void CrSemServ5EventPrgPbsBootReadyParamGetHkStatSwVersion(unsigned char * hkStatSwVersion, CrFwPckt_t pckt)
+{
+  unsigned int i;
+  for(i = 0; i < 30; i++)
+    {
+      hkStatSwVersion[i] = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + i);
+    }
+  return;
+}
+
+void CrSemServ5EventPrgPbsBootReadyParamGetHkStatBootReason(unsigned short * hkStatBootReason, CrFwPckt_t pckt)
+{
+  *hkStatBootReason = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 30);
+  return;
+}
+
+void CrSemServ5EventPrgPbsBootReadyParamGetHkStatScuFpgaVersion(unsigned char * hkStatScuFpgaVersion, CrFwPckt_t pckt)
+{
+  *hkStatScuFpgaVersion = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 32);
+  return;
+}
+
+void CrSemServ5EventPrgPbsBootReadyParamGetHkStatScuMainRedundant(unsigned char * hkStatScuMainRedundant, CrFwPckt_t pckt)
+{
+  *hkStatScuMainRedundant = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 33);
+  return;
+}
+
+void CrSemServ5EventPrgApsBootReadyParamGetHkStatSwVersion(unsigned char * hkStatSwVersion, CrFwPckt_t pckt)
+{
+  unsigned int i;
+  for(i = 0; i < 30; i++)
+    {
+      hkStatSwVersion[i] = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + i);
+    }
+  return;
+}
+
+void CrSemServ5EventPrgApsBootReadyParamGetHkStatBootReason(unsigned short * hkStatBootReason, CrFwPckt_t pckt)
+{
+  *hkStatBootReason = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 30);
+  return;
+}
+
+void CrSemServ5EventPrgApsBootReadyParamGetHkStatScuFpgaVersion(unsigned char * hkStatScuFpgaVersion, CrFwPckt_t pckt)
+{
+  *hkStatScuFpgaVersion = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 32);
+  return;
+}
+
+void CrSemServ5EventPrgApsBootReadyParamGetHkStatScuMainRedundant(unsigned char * hkStatScuMainRedundant, CrFwPckt_t pckt)
+{
+  *hkStatScuMainRedundant = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 33);
+  return;
+}
+
+void CrSemServ5EventPrgModeTransitionParamGetHkStatPreviousMode(unsigned short * hkStatPreviousMode, CrFwPckt_t pckt)
+{
+  *hkStatPreviousMode = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 2);
+  return;
+}
+
+void CrSemServ5EventPrgModeTransitionParamGetHkStatCurrentMode(unsigned short * hkStatCurrentMode, CrFwPckt_t pckt)
+{
+  *hkStatCurrentMode = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 4);
+  return;
+}
+
+void CrSemServ5EventPrgDiagnoseStepFinishedParamGetHkStatDiagStep(unsigned short * hkStatDiagStep, CrFwPckt_t pckt)
+{
+  *hkStatDiagStep = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT);
+  return;
+}
+
+void CrSemServ5EventPrgDiagnoseStepFinishedParamGetHkStatDiagStepResult(unsigned short * hkStatDiagStepResult, CrFwPckt_t pckt)
+{
+  *hkStatDiagStepResult = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 2);
+  return;
+}
+
+void CrSemServ5EventPrgCfgLoadReadyParamGetHkStatCfgVersion(unsigned char * hkStatCfgVersion, CrFwPckt_t pckt)
+{
+  unsigned int i;
+  for(i = 0; i < 30; i++)
+    {
+      hkStatCfgVersion[i] = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + i);
+    }
+  return;
+}
+
+void CrSemServ5EventPrgCfgLoadReadyParamGetHkStatCfgNumParamsLoaded(unsigned short * hkStatCfgNumParamsLoaded, CrFwPckt_t pckt)
+{
+  *hkStatCfgNumParamsLoaded = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 30);
+  return;
+}
+
+void CrSemServ5EventPrgCfgLoadReadyParamGetHkStatCfgNumParamsUsed(unsigned short * hkStatCfgNumParamsUsed, CrFwPckt_t pckt)
+{
+  *hkStatCfgNumParamsUsed = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 32);
+  return;
+}
+
+void CrSemServ5EventWarNoThermalStabilityParamGetHkTempFpaCcd(int * hkTempFpaCcd, CrFwPckt_t pckt)
+{
+  *hkTempFpaCcd = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT);
+  return;
+}
+
+void CrSemServ5EventWarNoThermalStabilityParamGetHkTempFpaStrap(int * hkTempFpaStrap, CrFwPckt_t pckt)
+{
+  *hkTempFpaStrap = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 4);
+  return;
+}
+
+void CrSemServ5EventWarNoThermalStabilityParamGetHkTempFee1(int * hkTempFee1, CrFwPckt_t pckt)
+{
+  *hkTempFee1 = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 8);
+  return;
+}
+
+void CrSemServ5EventWarFpaTempTooHighParamGetHkTempFpaCcd(int * hkTempFpaCcd, CrFwPckt_t pckt)
+{
+  *hkTempFpaCcd = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT);
+  return;
+}
+
+void CrSemServ5EventWarWrongExposureTimeParamGetFixVal8(unsigned char * fixVal8, CrFwPckt_t pckt)
+{
+  *fixVal8 = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT);
+  return;
+}
+
+void CrSemServ5EventWarWrongExposureTimeParamGetParCcdReadoutMode(unsigned char * parCcdReadoutMode, CrFwPckt_t pckt)
+{
+  *parCcdReadoutMode = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 1);
+  return;
+}
+
+void CrSemServ5EventWarWrongExposureTimeParamGetParExposureTime(unsigned int * parExposureTime, CrFwPckt_t pckt)
+{
+  *parExposureTime = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 2);
+  return;
+}
+
+void CrSemServ5EventWarWrongRepetitionPeriodParamGetHkStatExposureTime(unsigned int * hkStatExposureTime, CrFwPckt_t pckt)
+{
+  *hkStatExposureTime = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT);
+  return;
+}
+
+void CrSemServ5EventWarWrongRepetitionPeriodParamGetParRepetitionPeriod(unsigned int * parRepetitionPeriod, CrFwPckt_t pckt)
+{
+  *parRepetitionPeriod = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 4);
+  return;
+}
+
+void CrSemServ5EventWarWrongRepetitionPeriodParamGetHkStatMode(unsigned short * hkStatMode, CrFwPckt_t pckt)
+{
+  *hkStatMode = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 8);
+  return;
+}
+
+void CrSemServ5EvtWarPatterParamGetHkStatDatSequCount(unsigned short * hkStatDatSequCount, CrFwPckt_t pckt)
+{
+  *hkStatDatSequCount = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT);
+  return;
+}
+
+void CrSemServ5EvtWarPackwrParamGetHkStatDatSequCount(unsigned short * hkStatDatSequCount, CrFwPckt_t pckt)
+{
+  *hkStatDatSequCount = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT);
+  return;
+}
+
+void CrSemServ5EventErrUnexpectedRebootParamGetHkStatBootReason(unsigned short * hkStatBootReason, CrFwPckt_t pckt)
+{
+  *hkStatBootReason = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT);
+  return;
+}
+
+void CrSemServ5EventErrUnexpectedRebootParamGetHkStatRegProcStatus(unsigned int * hkStatRegProcStatus, CrFwPckt_t pckt)
+{
+  *hkStatRegProcStatus = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 2);
+  return;
+}
+
+void CrSemServ5EventErrUnexpectedRebootParamGetHkStatRegProcTrapBase(unsigned int * hkStatRegProcTrapBase, CrFwPckt_t pckt)
+{
+  *hkStatRegProcTrapBase = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 6);
+  return;
+}
+
+void CrSemServ5EventErrUnexpectedRebootParamGetHkStatRegProcProgrammCount(unsigned int * hkStatRegProcProgrammCount, CrFwPckt_t pckt)
+{
+  *hkStatRegProcProgrammCount = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 10);
+  return;
+}
+
+void CrSemServ5EventErrUnexpectedRebootParamGetHkStatRegProcProgrammInstruct(unsigned int * hkStatRegProcProgrammInstruct, CrFwPckt_t pckt)
+{
+  *hkStatRegProcProgrammInstruct = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 14);
+  return;
+}
+
+void CrSemServ5EventErrWatchdogFailureParamGetHkStatWatchDogTimerValueSet(unsigned int * hkStatWatchDogTimerValueSet, CrFwPckt_t pckt)
+{
+  *hkStatWatchDogTimerValueSet = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT);
+  return;
+}
+
+void CrSemServ5EventErrWatchdogFailureParamGetHkStatWatchDogTimerValueRead(unsigned int * hkStatWatchDogTimerValueRead, CrFwPckt_t pckt)
+{
+  *hkStatWatchDogTimerValueRead = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 4);
+  return;
+}
+
+void CrSemServ5EventErrCmdSpwRxErrorParamGetHkStatSpwReceiveError(unsigned short * hkStatSpwReceiveError, CrFwPckt_t pckt)
+{
+  *hkStatSpwReceiveError = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT);
+  return;
+}
+
+void CrSemServ5EventErrEepromPbsCfgSizeWrongParamGetHkStatPbsCfgSizeExpected(unsigned short * hkStatPbsCfgSizeExpected, CrFwPckt_t pckt)
+{
+  *hkStatPbsCfgSizeExpected = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT);
+  return;
+}
+
+void CrSemServ5EventErrEepromPbsCfgSizeWrongParamGetHkStatPbsCfgSizeRead(unsigned short * hkStatPbsCfgSizeRead, CrFwPckt_t pckt)
+{
+  *hkStatPbsCfgSizeRead = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 2);
+  return;
+}
+
+void CrSemServ5EventErrWritingRegisterFailedParamGetHkStatRegAddress(unsigned int * hkStatRegAddress, CrFwPckt_t pckt)
+{
+  *hkStatRegAddress = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT);
+  return;
+}
+
+void CrSemServ5EventErrWritingRegisterFailedParamGetHkStatRegValueWritten(unsigned int * hkStatRegValueWritten, CrFwPckt_t pckt)
+{
+  *hkStatRegValueWritten = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 4);
+  return;
+}
+
+void CrSemServ5EventErrWritingRegisterFailedParamGetHkStatRegValueRead(unsigned int * hkStatRegValueRead, CrFwPckt_t pckt)
+{
+  *hkStatRegValueRead = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 8);
+  return;
+}
+
+void CrSemServ5EvtErrDatDmaParamGetHkStatDmaErrType(unsigned short * hkStatDmaErrType, CrFwPckt_t pckt) {
+  *hkStatDmaErrType = ((pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 1] << 8) | 
+            pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 0]);
+  return;
+}
+
+void CrSemServ5EvtErrBiasSetParamGetHkParVoltFeeVod(unsigned int * hkParVoltFeeVod, CrFwPckt_t pckt) {
+  *hkParVoltFeeVod = ((pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 3] << 24) | 
+           (pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 2] << 16) | 
+           (pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 1] << 8)  | 
+            pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 0]);
+  return;
+}
+
+void CrSemServ5EvtErrBiasSetParamGetHkParVoltFeeVrd(unsigned int * hkParVoltFeeVrd, CrFwPckt_t pckt) {
+  *hkParVoltFeeVrd = ((pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 7] << 24) | 
+           (pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 6] << 16) | 
+           (pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 5] << 8)  | 
+            pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 4]);
+  return;
+}
+
+void CrSemServ5EvtErrBiasSetParamGetHkParVoltFeeVss(unsigned int * hkParVoltFeeVss, CrFwPckt_t pckt) {
+  *hkParVoltFeeVss = ((pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 11] << 24) | 
+           (pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 10] << 16) | 
+           (pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 9] << 8)  | 
+            pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 8]);
+  return;
+}
+
+void CrSemServ5EvtErrBiasSetParamGetHkParVoltFeeVog(unsigned int * hkParVoltFeeVog, CrFwPckt_t pckt) {
+  *hkParVoltFeeVog = ((pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 15] << 24) | 
+           (pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 14] << 16) | 
+           (pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 13] << 8)  | 
+            pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 12]);
+  return;
+}
+
+void CrSemServ5EvtErrBiasSetParamGetHkParVoltFeeVod2(unsigned int * hkParVoltFeeVod2, CrFwPckt_t pckt) {
+  *hkParVoltFeeVod2 = ((pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 19] << 24) | 
+           (pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 18] << 16) | 
+           (pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 17] << 8)  | 
+            pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 16]);
+  return;
+}
+
+void CrSemServ5EvtErrBiasSetParamGetHkParVoltFeeVrd2(unsigned int * hkParVoltFeeVrd2, CrFwPckt_t pckt) {
+  *hkParVoltFeeVrd2 = ((pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 23] << 24) | 
+           (pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 22] << 16) | 
+           (pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 21] << 8)  | 
+            pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 20]);
+  return;
+}
+
+void CrSemServ5EvtErrBiasSetParamGetHkParVoltFeeVss2(unsigned int * hkParVoltFeeVss2, CrFwPckt_t pckt) {
+  *hkParVoltFeeVss2 = ((pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 27] << 24) | 
+           (pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 26] << 16) | 
+           (pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 25] << 8)  | 
+            pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 24]);
+  return;
+}
+
+void CrSemServ5EvtErrBiasSetParamGetHkParVoltFeeVog2(unsigned int * hkParVoltFeeVog2, CrFwPckt_t pckt) {
+  *hkParVoltFeeVog2 = ((pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 31] << 24) | 
+           (pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 30] << 16) | 
+           (pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 29] << 8)  | 
+            pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 28]);
+  return;
+}
+
+void CrSemServ5EvtErrSyncParamGetHkStatSynctErrType(unsigned short * hkStatSynctErrType, CrFwPckt_t pckt) {
+  *hkStatSynctErrType = ((pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 1] << 8) | 
+            pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 0]);
+  return;
+}
+
+void CrSemServ5EvtErrScriptParamGetHkStatScriptErrType(unsigned short * hkStatScriptErrType, CrFwPckt_t pckt) {
+  *hkStatScriptErrType = ((pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 1] << 8) | 
+            pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 0]);
+  return;
+}
+
+void CrSemServ5EvtErrPwrParamGetHkStatPowErrType(unsigned short * hkStatPowErrType, CrFwPckt_t pckt) {
+  *hkStatPowErrType = ((pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 1] << 8) | 
+            pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 0]);
+  return;
+}
+
+void CrSemServ5EvtErrPwrParamGetHkStatPcuPowWord(unsigned short * hkStatPcuPowWord, CrFwPckt_t pckt) {
+  *hkStatPcuPowWord = ((pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 3] << 8) | 
+            pckt[OFFSET_PAR_LENGTH_IN_REP_PCKT + 2]);
+  return;
+}
+
+/*
+void CrSemServ5EventErrDataAcqTimeoutParamGetHkStatDataTimeoutValue(unsigned short * hkStatDataTimeoutValue, CrFwPckt_t pckt)
+{
+  *hkStatDataTimeoutValue = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT);
+  return;
+}
+*/
+
+
+/*
+   SEM Serv 21, revised in 0.9+ for ICD 2.1 compatibility
+*/
+void CrSemServ21DatCcdWindowParamGetHkStatDataAcqId(unsigned int * hkStatDataAcqId, CrFwPckt_t pckt)
+{
+  *hkStatDataAcqId = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT);
+  return;
+}
+
+void CrSemServ21DatCcdWindowParamGetHkStatDataAcqType(unsigned char * hkStatDataAcqType, CrFwPckt_t pckt)
+{
+  *hkStatDataAcqType = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 4);
+  *hkStatDataAcqType = (*hkStatDataAcqType >> 4) & 0x0f;
+  return;
+}
+
+void CrSemServ21DatCcdWindowParamGetHkStatDataAcqSrc(unsigned char * hkStatDataAcqSrc, CrFwPckt_t pckt)
+{
+  *hkStatDataAcqSrc = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 4);
+  *hkStatDataAcqSrc = *hkStatDataAcqSrc & 0x0f;
+  return;
+}
+
+void CrSemServ21DatCcdWindowParamGetHkStatDataAcqTypeSrc(unsigned char * hkStatDataAcqTypeSrc, CrFwPckt_t pckt)
+{
+  *hkStatDataAcqTypeSrc = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 4);
+  return;
+}
+
+void CrSemServ21DatCcdWindowParamGetHkStatCcdTimingScriptId(unsigned char * hkStatCcdTimingScriptId, CrFwPckt_t pckt)
+{
+  *hkStatCcdTimingScriptId = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 5);
+  return;
+}
+
+void CrSemServ21DatCcdWindowParamGetHkStatDataAcqTime(unsigned char * hkStatDataAcqTime, CrFwPckt_t pckt)
+{
+  unsigned char i;
+  for(i = 0; i < 6; i++)
+    {
+      hkStatDataAcqTime[i] = GET_UCHAR_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 6 + i);
+    }
+  return;
+}
+
+void CrSemServ21DatCcdWindowParamGetHkStatExposureTime(unsigned int * hkStatExposureTime, CrFwPckt_t pckt)
+{
+  *hkStatExposureTime = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 12);
+  return;
+}
+
+void CrSemServ21DatCcdWindowParamGetHkStatTotalPacketNum(unsigned short * hkStatTotalPacketNum, CrFwPckt_t pckt)
+{
+  *hkStatTotalPacketNum = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 16);
+  return;
+}
+
+void CrSemServ21DatCcdWindowParamGetHkStatCurrentPacketNum(unsigned short * hkStatCurrentPacketNum, CrFwPckt_t pckt)
+{
+  *hkStatCurrentPacketNum = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 18);
+  return;
+}
+
+void CrSemServ21DatCcdWindowParamGetHkVoltFeeVod(unsigned int * hkVoltFeeVod, CrFwPckt_t pckt)
+{
+  *hkVoltFeeVod = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 20);
+  return;
+}
+
+void CrSemServ21DatCcdWindowParamGetHkVoltFeeVrd(unsigned int * hkVoltFeeVrd, CrFwPckt_t pckt)
+{
+  *hkVoltFeeVrd = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 24);
+  return;
+}
+
+void CrSemServ21DatCcdWindowParamGetHkVoltFeeVog(unsigned int * hkVoltFeeVog, CrFwPckt_t pckt)
+{
+  *hkVoltFeeVog = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 28);
+  return;
+}
+
+void CrSemServ21DatCcdWindowParamGetHkVoltFeeVss(unsigned int * hkVoltFeeVss, CrFwPckt_t pckt)
+{
+  *hkVoltFeeVss = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 32);
+  return;
+}
+
+void CrSemServ21DatCcdWindowParamGetHkTempFeeCcd(unsigned int * hkTempFeeCcd, CrFwPckt_t pckt)
+{
+  *hkTempFeeCcd = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 36);
+  return;
+}
+
+void CrSemServ21DatCcdWindowParamGetHkTempFeeAdc(unsigned int * hkTempFeeAdc, CrFwPckt_t pckt)
+{
+  *hkTempFeeAdc = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 40);
+  return;
+}
+
+void CrSemServ21DatCcdWindowParamGetHkTempFeeBias(unsigned int * hkTempFeeBias, CrFwPckt_t pckt)
+{
+  *hkTempFeeBias = GET_UINT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 44);
+  return;
+}
+
+void CrSemServ21DatCcdWindowParamGetHkStatPixDataOffset(unsigned short * hkStatPixDataOffset, CrFwPckt_t pckt)
+{
+  *hkStatPixDataOffset = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 48);
+  return;
+}
+
+void CrSemServ21DatCcdWindowParamGetHkStatNumDataWords(unsigned short * hkStatNumDataWords, CrFwPckt_t pckt)
+{
+  *hkStatNumDataWords = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 50);
+  return;
+}
+
+void CrSemServ21DatCcdWindowParamGetDatScienceBlock(unsigned short * datScienceBlock, CrFwPckt_t pckt)
+{
+  *datScienceBlock = GET_USHORT_FROM_PCKT(OFFSET_PAR_LENGTH_IN_REP_PCKT + 52);
+  return;
+}
+
diff --git a/CrIa/src/Services/General/CrSemParamGetter.h b/CrIa/src/Services/General/CrSemParamGetter.h
new file mode 100644
index 0000000..adef235
--- /dev/null
+++ b/CrIa/src/Services/General/CrSemParamGetter.h
@@ -0,0 +1,983 @@
+/**
+ * @file CrSemParamGetter.h
+ *
+ * Declaration of the getter operations for all parameters of all in-coming packets.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRSEM_PARAM_GETTER_H
+#define CRSEM_PARAM_GETTER_H
+
+#include <Pckt/CrFwPckt.h>
+#include <CrFwConstants.h>
+
+/**
+ * Gets the value of the parameter HkStatSid of the DAT HK packet.
+ * @param hkStatSid Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3DatHkParamGetHkStatSid(unsigned short * hkStatSid, CrFwPckt_t pckt);
+
+/******************
+ * SEM DEFAULT HK *
+ ******************/
+/**
+ * Gets the value of the parameter HkStatMode of the Operation Default HK packet.
+ * @param hkStatMode Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetHkStatMode(unsigned short * hkStatMode, CrFwPckt_t pckt);
+
+void CrSemServ3OperationDefaultHkParamGetHkStatFlags(unsigned short * hkStatFlags, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter FixVal9 of the Operation Default HK packet.
+ * @param fixVal9 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetFixVal9(unsigned short * fixVal9, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatObtSyncFlag of the Operation Default HK packet.
+ * @param hkStatObtSyncFlag Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetHkStatObtSyncFlag(unsigned char * hkStatObtSyncFlag, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatWatchDog of the Operation Default HK packet.
+ * @param hkStatWatchDog Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetHkStatWatchDog(unsigned char * hkStatWatchDog, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatEepromPower of the Operation Default HK packet.
+ * @param hkStatEepromPower Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetHkStatEepromPower(unsigned char * hkStatEepromPower, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatHkPower of the Operation Default HK packet.
+ * @param hkStatHkPower Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetHkStatHkPower(unsigned char * hkStatHkPower, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatFpmPower of the Operation Default HK packet.
+ * @param hkStatFpmPower Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetHkStatFpmPower(unsigned char * hkStatFpmPower, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatDatBufferOverflow of the Operation Default HK packet.
+ * @param hkStatDatBufferOverflow Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetHkStatDatBufferOverflow(unsigned char * hkStatDatBufferOverflow, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatScuMainRed of the Operation Default HK packet.
+ * @param hkStatScuMainRed Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetHkStatScuMainRed(unsigned char * hkStatScuMainRed, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatLastSpwlinkError of the Operation Default HK packet.
+ * @param hkStatLastSpwlinkError Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetHkStatLastSpwlinkError(unsigned short * hkStatLastSpwlinkError, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatLastErrorId of the Operation Default HK packet.
+ * @param hkStatLastErrorId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetHkStatLastErrorId(unsigned short * hkStatLastErrorId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatLastErrorFrequency of the Operation Default HK packet.
+ * @param hkStatLastErrorFrequency Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetHkStatLastErrorFrequency(unsigned short * hkStatLastErrorFrequency, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatNumCmdReceived of the Operation Default HK packet.
+ * @param hkStatNumCmdReceived Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetHkStatNumCmdReceived(unsigned short * hkStatNumCmdReceived, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatNumCmdExecuted of the Operation Default HK packet.
+ * @param hkStatNumCmdExecuted Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetHkStatNumCmdExecuted(unsigned short * hkStatNumCmdExecuted, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatNumDatSent of the Operation Default HK packet.
+ * @param hkStatNumDatSent Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetHkStatNumDatSent(unsigned short * hkStatNumDatSent, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatScuProcDutyCycle of the Operation Default HK packet.
+ * @param hkStatScuProcDutyCycle Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetHkStatScuProcDutyCycle(unsigned short * hkStatScuProcDutyCycle, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatScuNumAhbError of the Operation Default HK packet.
+ * @param hkStatScuNumAhbError Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetHkStatScuNumAhbError(unsigned short * hkStatScuNumAhbError, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatScuNumAhbCorrectableError of the Operation Default HK packet.
+ * @param hkStatScuNumAhbCorrectableError Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetHkStatScuNumAhbCorrectableError(unsigned short * hkStatScuNumAhbCorrectableError, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatHkNumLatchupError of the Operation Default HK packet.
+ * @param hkStatHkNumLatchupError Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetHkStatHkNumLatchupError(unsigned short * hkStatHkNumLatchupError, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkTempSemScu of the Operation Default HK packet.
+ * @param hkTempSemScu Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetHkTempSemScu(float * hkTempSemScu, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkTempSemPcu of the Operation Default HK packet.
+ * @param hkTempSemPcu Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetHkTempSemPcu(float * hkTempSemPcu, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkVoltScuP34 of the Operation Default HK packet.
+ * @param hkVoltScuP34 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetHkVoltScuP34(float * hkVoltScuP34, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkVoltScuP5 of the Operation Default HK packet.
+ * @param hkVoltScuP5 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationDefaultHkParamGetHkVoltScuP5(float * hkVoltScuP5, CrFwPckt_t pckt);
+
+/*******************
+ * SEM EXTENDED HK *
+ *******************/
+/**
+ * Gets the value of the parameter HkTempFee1 of the Operation Extended HK packet.
+ * @param hkTempFee1 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkTempFeeCcd(float * hkTempFeeCcd, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkTempFee2 of the Operation Extended HK packet.
+ * @param hkTempFee2 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkTempFeeStrap(float * hkTempFeeStrap, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkTempFee3 of the Operation Extended HK packet.
+ * @param hkTempFee3 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkTempFeeAdc(float * hkTempFeeAdc, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkTempFee4 of the Operation Extended HK packet.
+ * @param hkTempFee4 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkTempFeeBias(float * hkTempFeeBias, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkTempFee5 of the Operation Extended HK packet.
+ * @param hkTempFee5 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkTempFeeDeb(float * hkTempFeeDeb, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkVoltFee1 of the Operation Extended HK packet.
+ * @param hkVoltFee1 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkVoltFeeVod(float * hkVoltFeeVod, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkVoltFee2 of the Operation Extended HK packet.
+ * @param hkVoltFee2 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkVoltFeeVrd(float * hkVoltFeeVrd, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkVoltFee3 of the Operation Extended HK packet.
+ * @param hkVoltFee3 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkVoltFeeVog(float * hkVoltFeeVog, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkVoltFee4 of the Operation Extended HK packet.
+ * @param hkVoltFee4 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkVoltFeeVss(float * hkVoltFeeVss, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkVoltFee5 of the Operation Extended HK packet.
+ * @param hkVoltFee5 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkVoltFeeCcd(float * hkVoltFeeCcd, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkVoltFee6 of the Operation Extended HK packet.
+ * @param hkVoltFee6 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkVoltFeeClk(float * hkVoltFeeClk, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkVoltFee7 of the Operation Extended HK packet.
+ * @param hkVoltFee7 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkVoltFeeAnaP5(float * hkVoltFeeAnaP5, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkVoltFee8 of the Operation Extended HK packet.
+ * @param hkVoltFee8 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkVoltFeeAnaN5(float * hkVoltFeeAnaN5, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkVoltFee9 of the Operation Extended HK packet.
+ * @param hkVoltFee9 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkVoltFeeDigP33(float * hkVoltFeeDigP33, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkCurrFeeClkBuf of the Operation Extended HK packet.
+ * @param hkCurrFeeClkBuf Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkCurrFeeClkBuf(float * hkCurrFeeClkBuf, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkVoltScuFpgaP15 of the Operation Extended HK packet.
+ * @param hkVoltScuFpgaP15 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkVoltScuFpgaP15(float * hkVoltScuFpgaP15, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkCurrScuP34 of the Operation Extended HK packet.
+ * @param hkCurrScuP34 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkCurrScuP34(float * hkCurrScuP34, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatNumSpwErrCredit of the Operation Extended HK packet.
+ * @param hkStatNumSpwErrCredit Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrCredit(unsigned char * hkStatNumSpwErrCredit, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatNumSpwErrEscape of the Operation Extended HK packet.
+ * @param hkStatNumSpwErrEscape Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrEscape(unsigned char * hkStatNumSpwErrEscape, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatNumSpwErrDisconnect of the Operation Extended HK packet.
+ * @param hkStatNumSpwErrDisconnect Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrDisconnect(unsigned char * hkStatNumSpwErrDisconnect, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatNumSpwErrParity of the Operation Extended HK packet.
+ * @param hkStatNumSpwErrParity Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrParity(unsigned char * hkStatNumSpwErrParity, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatNumSpwErrWriteSync of the Operation Extended HK packet.
+ * @param hkStatNumSpwErrWriteSync Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrWriteSync(unsigned char * hkStatNumSpwErrWriteSync, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatNumSpwErrInvalidAddress of the Operation Extended HK packet.
+ * @param hkStatNumSpwErrInvalidAddress Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrInvalidAddress(unsigned char * hkStatNumSpwErrInvalidAddress, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatNumSpwErrEopeep of the Operation Extended HK packet.
+ * @param hkStatNumSpwErrEopeep Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrEopeep(unsigned char * hkStatNumSpwErrEopeep, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatNumSpwErrRxAhb of the Operation Extended HK packet.
+ * @param hkStatNumSpwErrRxAhb Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrRxAhb(unsigned char * hkStatNumSpwErrRxAhb, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatNumSpwErrTxAhb of the Operation Extended HK packet.
+ * @param hkStatNumSpwErrTxAhb Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrTxAhb(unsigned char * hkStatNumSpwErrTxAhb, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatNumSpwErrTxBlocked of the Operation Extended HK packet.
+ * @param hkStatNumSpwErrTxBlocked Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrTxBlocked(unsigned char * hkStatNumSpwErrTxBlocked, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkNumSpwErrTxle of the Operation Extended HK packet.
+ * @param hkNumSpwErrTxle Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrTxle(unsigned char * hkStatNumSpwErrTxle, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkNumSpwErrRx of the Operation Extended HK packet.
+ * @param hkNumSpwErrRx Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrRx(unsigned char * hkStatNumSpwErrRx, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkNumSpwErrTx of the Operation Extended HK packet.
+ * @param hkNumSpwErrTx Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkStatNumSpwErrTx(unsigned char * hkStatNumSpwErrTx, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkHeatPwmFpaCcd of the Operation Extended HK packet.
+ * @param hkHeatPwmFpaCcd Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkStatHeatPwmFpaCcd(unsigned char * hkStatHeatPwmFpaCcd, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkHeatPwmFeeStrap of the Operation Extended HK packet.
+ * @param hkHeatPwmFeeStrap Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkStatHeatPwmFeeStrap(unsigned char * hkStatHeatPwmFeeStrap, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkHeatPwmFeeAnach of the Operation Extended HK packet.
+ * @param hkHeatPwmFeeAnach Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkStatHeatPwmFeeAnach(unsigned char * hkStatHeatPwmFeeAnach, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkHeatPwmSpare of the Operation Extended HK packet.
+ * @param hkHeatPwmSpare Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkStatHeatPwmSpare(unsigned char * hkStatHeatPwmSpare, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatBits of the Operation Extended HK packet.
+ * @param hkStatBits Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkStatBits(unsigned char * hkStatBits, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatOBTimeSyncDelta of the Operation Extended HK packet.
+ * @param hkStatOBTimeSyncDelta Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ3OperationExtendedHkParamGetHkStatOBTimeSyncDelta(unsigned short * hkStatOBTimeSyncDelta, CrFwPckt_t pckt);
+
+
+/**************************
+ * END OF SEM EXTENDED HK *
+ **************************/
+
+
+/**
+ * Gets the value of the parameter HkEventProgId of the Normal/Progress Report packet.
+ * @param hkEventProgId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EvtNormParamGetHkEventProgId(unsigned short * hkEventProgId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkEventProgId of the Error Report - Low Severity packet.
+ * @param hkEventProgId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EvtErrLowSevParamGetHkEventProgId(unsigned short * hkEventProgId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkEventProgId of the Error Report - Medium Severity packet.
+ * @param hkEventProgId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EvtErrMedSevParamGetHkEventProgId(unsigned short * hkEventProgId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkEventProgId of the Error Report - High Severity packet.
+ * @param hkEventProgId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EvtErrHighSevParamGetHkEventProgId(unsigned short * hkEventProgId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatSwVersion of the DAT_Event_Progress(PBSBootReady) packet.
+ * @param hkStatSwVersion Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventPrgPbsBootReadyParamGetHkStatSwVersion(unsigned char * hkStatSwVersion, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatBootReason of the DAT_Event_Progress(PBSBootReady) packet.
+ * @param hkStatBootReason Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventPrgPbsBootReadyParamGetHkStatBootReason(unsigned short * hkStatBootReason, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatScuFpgaVersion of the DAT_Event_Progress(PBSBootReady) packet.
+ * @param hkStatScuFpgaVersion Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventPrgPbsBootReadyParamGetHkStatScuFpgaVersion(unsigned char * hkStatScuFpgaVersion, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatScuMainRedundant of the DAT_Event_Progress(PBSBootReady) packet.
+ * @param hkStatScuMainRedundant Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventPrgPbsBootReadyParamGetHkStatScuMainRedundant(unsigned char * hkStatScuMainRedundant, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatSwVersion of the DAT_Event_Progress(APSBootReady) packet.
+ * @param hkStatSwVersion Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventPrgApsBootReadyParamGetHkStatSwVersion(unsigned char * hkStatSwVersion, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatBootReason of the DAT_Event_Progress(APSBootReady) packet.
+ * @param hkStatBootReason Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventPrgApsBootReadyParamGetHkStatBootReason(unsigned short * hkStatBootReason, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatScuFpgaVersion of the DAT_Event_Progress(APSBootReady) packet.
+ * @param hkStatScuFpgaVersion Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventPrgApsBootReadyParamGetHkStatScuFpgaVersion(unsigned char * hkStatScuFpgaVersion, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatScuMainRedundant of the DAT_Event_Progress(APSBootReady) packet.
+ * @param hkStatScuMainRedundant Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventPrgApsBootReadyParamGetHkStatScuMainRedundant(unsigned char * hkStatScuMainRedundant, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatPreviousMode of the DAT_Event_Progress(ModeTransition) packet.
+ * @param hkStatPreviousMode Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventPrgModeTransitionParamGetHkStatPreviousMode(unsigned short * hkStatPreviousMode, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatCurrentMode of the DAT_Event_Progress(ModeTransition) packet.
+ * @param hkStatCurrentMode Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventPrgModeTransitionParamGetHkStatCurrentMode(unsigned short * hkStatCurrentMode, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatDiagStep of the DAT_Event_Progress(DiagStepFinished) packet.
+ * @param hkStatDiagStep Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventPrgDiagnoseStepFinishedParamGetHkStatDiagStep(unsigned short * hkStatDiagStep, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatDiagStepResult of the DAT_Event_Progress(DiagStepFinished) packet.
+ * @param hkStatDiagStepResult Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventPrgDiagnoseStepFinishedParamGetHkStatDiagStepResult(unsigned short * hkStatDiagStepResult, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatCfgVersion of the DAT_Event_Progress(CFGLoadReady) packet.
+ * @param hkStatCfgVersion Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventPrgCfgLoadReadyParamGetHkStatCfgVersion(unsigned char * hkStatCfgVersion, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatCfgNumParamsLoaded of the DAT_Event_Progress(CFGLoadReady) packet.
+ * @param hkStatCfgNumParamsLoaded Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventPrgCfgLoadReadyParamGetHkStatCfgNumParamsLoaded(unsigned short * hkStatCfgNumParamsLoaded, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatCfgNumParamsUsed of the DAT_Event_Progress(CFGLoadReady) packet.
+ * @param hkStatCfgNumParamsUsed Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventPrgCfgLoadReadyParamGetHkStatCfgNumParamsUsed(unsigned short * hkStatCfgNumParamsUsed, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkTempFpaCcd of the DAT_Event_Warning(TempUnstable) packet.
+ * @param hkTempFpaCcd Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventWarNoThermalStabilityParamGetHkTempFpaCcd(int * hkTempFpaCcd, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkTempFpaStrap of the DAT_Event_Warning(TempUnstable) packet.
+ * @param hkTempFpaStrap Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventWarNoThermalStabilityParamGetHkTempFpaStrap(int * hkTempFpaStrap, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkTempFee1 of the DAT_Event_Warning(TempUnstable) packet.
+ * @param hkTempFee1 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventWarNoThermalStabilityParamGetHkTempFee1(int * hkTempFee1, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkTempFpaCcd of the DAT_Event_Warning(FPATempTooHigh) packet.
+ * @param hkTempFpaCcd Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventWarFpaTempTooHighParamGetHkTempFpaCcd(int * hkTempFpaCcd, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter FixVal8 of the DAT_Event_Warning(WrongExposureTime) packet.
+ * @param fixVal8 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventWarWrongExposureTimeParamGetFixVal8(unsigned char * fixVal8, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ParCcdReadoutMode of the DAT_Event_Warning(WrongExposureTime) packet.
+ * @param parCcdReadoutMode Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventWarWrongExposureTimeParamGetParCcdReadoutMode(unsigned char * parCcdReadoutMode, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ParExposureTime of the DAT_Event_Warning(WrongExposureTime) packet.
+ * @param parExposureTime Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventWarWrongExposureTimeParamGetParExposureTime(unsigned int * parExposureTime, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatExposureTime of the DAT_Event_Warning(WrongRepetitionPeriod) packet.
+ * @param hkStatExposureTime Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventWarWrongRepetitionPeriodParamGetHkStatExposureTime(unsigned int * hkStatExposureTime, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter ParRepetitionPeriod of the DAT_Event_Warning(WrongRepetitionPeriod) packet.
+ * @param parRepetitionPeriod Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventWarWrongRepetitionPeriodParamGetParRepetitionPeriod(unsigned int * parRepetitionPeriod, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatMode of the DAT_Event_Warning(WrongRepetitionPeriod) packet.
+ * @param hkStatMode Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventWarWrongRepetitionPeriodParamGetHkStatMode(unsigned short * hkStatMode, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatDatSequCount of the DAT_Event_Warning(FPMoffOnlyPattern) packet.
+ * @param hkStatDatSequCount Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EvtWarPatterParamGetHkStatDatSequCount(unsigned short * hkStatDatSequCount, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatDatSequCount of the DAT_Event_Warning(PackEncodeFailure) packet.
+ * @param hkStatDatSequCount Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EvtWarPackwrParamGetHkStatDatSequCount(unsigned short * hkStatDatSequCount, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatBootReason of the DAT_Event_Error(unexpected re-boot) packet.
+ * @param hkStatBootReason Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventErrUnexpectedRebootParamGetHkStatBootReason(unsigned short * hkStatBootReason, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatRegProcStatus of the DAT_Event_Error(unexpected re-boot) packet.
+ * @param hkStatRegProcStatus Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventErrUnexpectedRebootParamGetHkStatRegProcStatus(unsigned int * hkStatRegProcStatus, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatRegProcTrapBase of the DAT_Event_Error(unexpected re-boot) packet.
+ * @param hkStatRegProcTrapBase Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventErrUnexpectedRebootParamGetHkStatRegProcTrapBase(unsigned int * hkStatRegProcTrapBase, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatRegProcProgrammCount of the DAT_Event_Error(unexpected re-boot) packet.
+ * @param hkStatRegProcProgrammCount Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventErrUnexpectedRebootParamGetHkStatRegProcProgrammCount(unsigned int * hkStatRegProcProgrammCount, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatRegProcProgrammInstruct of the DAT_Event_Error(unexpected re-boot) packet.
+ * @param hkStatRegProcProgrammInstruct Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventErrUnexpectedRebootParamGetHkStatRegProcProgrammInstruct(unsigned int * hkStatRegProcProgrammInstruct, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatWatchDogTimerValueSet of the DAT_Event_Error(watchdog failure) packet.
+ * @param hkStatWatchDogTimerValueSet Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventErrWatchdogFailureParamGetHkStatWatchDogTimerValueSet(unsigned int * hkStatWatchDogTimerValueSet, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatWatchDogTimerValueRead of the DAT_Event_Error(watchdog failure) packet.
+ * @param hkStatWatchDogTimerValueRead Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventErrWatchdogFailureParamGetHkStatWatchDogTimerValueRead(unsigned int * hkStatWatchDogTimerValueRead, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatSpwReceiveError of the DAT_Event_Error(SpW Error) packet.
+ * @param hkStatSpwReceiveError Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventErrCmdSpwRxErrorParamGetHkStatSpwReceiveError(unsigned short * hkStatSpwReceiveError, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatPbsCfgSizeExpected of the DAT_Event_Error(PBS CFG size wrong) packet.
+ * @param hkStatPbsCfgSizeExpected Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventErrEepromPbsCfgSizeWrongParamGetHkStatPbsCfgSizeExpected(unsigned short * hkStatPbsCfgSizeExpected, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatPbsCfgSizeRead of the DAT_Event_Error(PBS CFG size wrong) packet.
+ * @param hkStatPbsCfgSizeRead Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventErrEepromPbsCfgSizeWrongParamGetHkStatPbsCfgSizeRead(unsigned short * hkStatPbsCfgSizeRead, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatRegAddress of the DAT_Event_Error(Reg writing wrong) packet.
+ * @param hkStatRegAddress Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventErrWritingRegisterFailedParamGetHkStatRegAddress(unsigned int * hkStatRegAddress, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatRegValueWritten of the DAT_Event_Error(Reg writing wrong) packet.
+ * @param hkStatRegValueWritten Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventErrWritingRegisterFailedParamGetHkStatRegValueWritten(unsigned int * hkStatRegValueWritten, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatRegValueRead of the DAT_Event_Error(Reg writing wrong) packet.
+ * @param hkStatRegValueRead Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EventErrWritingRegisterFailedParamGetHkStatRegValueRead(unsigned int * hkStatRegValueRead, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatDmaErrType of the DAT_Event_Error(DMA data transfer failure) packet.
+ * @param hkStatDmaErrType Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EvtErrDatDmaParamGetHkStatDmaErrType(unsigned short * hkStatDmaErrType, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkParVoltFeeVod of the DAT_Event_Error(BIAS voltage wrong) packet.
+ * @param hkParVoltFeeVod Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EvtErrBiasSetParamGetHkParVoltFeeVod(unsigned int * hkParVoltFeeVod, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkParVoltFeeVrd of the DAT_Event_Error(BIAS voltage wrong) packet.
+ * @param hkParVoltFeeVrd Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EvtErrBiasSetParamGetHkParVoltFeeVrd(unsigned int * hkParVoltFeeVrd, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkParVoltFeeVss of the DAT_Event_Error(BIAS voltage wrong) packet.
+ * @param hkParVoltFeeVss Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EvtErrBiasSetParamGetHkParVoltFeeVss(unsigned int * hkParVoltFeeVss, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkParVoltFeeVog of the DAT_Event_Error(BIAS voltage wrong) packet.
+ * @param hkParVoltFeeVog Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EvtErrBiasSetParamGetHkParVoltFeeVog(unsigned int * hkParVoltFeeVog, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkParVoltFeeVod2 of the DAT_Event_Error(BIAS voltage wrong) packet.
+ * @param hkParVoltFeeVod2 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EvtErrBiasSetParamGetHkParVoltFeeVod2(unsigned int * hkParVoltFeeVod2, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkParVoltFeeVrd2 of the DAT_Event_Error(BIAS voltage wrong) packet.
+ * @param hkParVoltFeeVrd2 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EvtErrBiasSetParamGetHkParVoltFeeVrd2(unsigned int * hkParVoltFeeVrd2, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkParVoltFeeVss2 of the DAT_Event_Error(BIAS voltage wrong) packet.
+ * @param hkParVoltFeeVss2 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EvtErrBiasSetParamGetHkParVoltFeeVss2(unsigned int * hkParVoltFeeVss2, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkParVoltFeeVog2 of the DAT_Event_Error(BIAS voltage wrong) packet.
+ * @param hkParVoltFeeVog2 Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EvtErrBiasSetParamGetHkParVoltFeeVog2(unsigned int * hkParVoltFeeVog2, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatSynctErrType of the DAT_Event_Error(FEE-SCU sync failure) packet.
+ * @param hkStatSynctErrType Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EvtErrSyncParamGetHkStatSynctErrType(unsigned short * hkStatSynctErrType, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatScriptErrType of the DAT_Event_Error(FEE script error) packet.
+ * @param hkStatScriptErrType Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EvtErrScriptParamGetHkStatScriptErrType(unsigned short * hkStatScriptErrType, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatPowErrType of the DAT_Event_Error(PCU power switching failed) packet.
+ * @param hkStatPowErrType Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EvtErrPwrParamGetHkStatPowErrType(unsigned short * hkStatPowErrType, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatPcuPowWord of the DAT_Event_Error(PCU power switching failed) packet.
+ * @param hkStatPcuPowWord Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ5EvtErrPwrParamGetHkStatPcuPowWord(unsigned short * hkStatPcuPowWord, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatDataAcqId of the DAT CCD Window packet.
+ * @param hkStatDataAcqId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ21DatCcdWindowParamGetHkStatDataAcqId(unsigned int * hkStatDataAcqId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatDataAcqType of the DAT CCD Window packet.
+ * @param hkStatDataAcqType Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ21DatCcdWindowParamGetHkStatDataAcqType(unsigned char * hkStatDataAcqType, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatDataAcqSrc of the DAT CCD Window packet.
+ * @param hkStatDataAcqSrc Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ21DatCcdWindowParamGetHkStatDataAcqSrc(unsigned char * hkStatDataAcqSrc, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatDataAcqTypeSrc of the DAT CCD Window packet.
+ * @param hkStatDataAcqTypeSrc Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ21DatCcdWindowParamGetHkStatDataAcqTypeSrc(unsigned char * hkStatDataAcqTypeSrc, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatCcdTimingScriptId of the DAT CCD Window packet.
+ * @param hkStatCcdTimingScriptId Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ21DatCcdWindowParamGetHkStatCcdTimingScriptId(unsigned char * hkStatCcdTimingScriptId, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatDataAcqTime of the DAT CCD Window packet.
+ * @param hkStatDataAcqTime Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ21DatCcdWindowParamGetHkStatDataAcqTime(unsigned char * hkStatDataAcqTime, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatExposureTime of the DAT CCD Window packet.
+ * @param hkStatExposureTime Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ21DatCcdWindowParamGetHkStatExposureTime(unsigned int * hkStatExposureTime, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatTotalPacketNum of the DAT CCD Window packet.
+ * @param hkStatTotalPacketNum Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ21DatCcdWindowParamGetHkStatTotalPacketNum(unsigned short * hkStatTotalPacketNum, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatCurrentPacketNum of the DAT CCD Window packet.
+ * @param hkStatCurrentPacketNum Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ21DatCcdWindowParamGetHkStatCurrentPacketNum(unsigned short * hkStatCurrentPacketNum, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkVoltFeeVod of the DAT CCD Window packet.
+ * @param hkVoltFeeVod Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ21DatCcdWindowParamGetHkVoltFeeVod(unsigned int * hkVoltFeeVod, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkVoltFeeVrd of the DAT CCD Window packet.
+ * @param hkVoltFeeVrd Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ21DatCcdWindowParamGetHkVoltFeeVrd(unsigned int * hkVoltFeeVrd, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkVoltFeeVog of the DAT CCD Window packet.
+ * @param hkVoltFeeVog Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ21DatCcdWindowParamGetHkVoltFeeVog(unsigned int * hkVoltFeeVog, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkVoltFeeVss of the DAT CCD Window packet.
+ * @param hkVoltFeeVss Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ21DatCcdWindowParamGetHkVoltFeeVss(unsigned int * hkVoltFeeVss, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkTempFeeCcd of the DAT CCD Window packet.
+ * @param hkTempFeeCcd Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ21DatCcdWindowParamGetHkTempFeeCcd(unsigned int * hkTempFeeCcd, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkTempFeeAdc of the DAT CCD Window packet.
+ * @param hkTempFeeAdc Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ21DatCcdWindowParamGetHkTempFeeAdc(unsigned int * hkTempFeeAdc, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkTempFeeBias of the DAT CCD Window packet.
+ * @param hkTempFeeBias Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ21DatCcdWindowParamGetHkTempFeeBias(unsigned int * hkTempFeeBias, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatPixDataOffset of the DAT CCD Window packet.
+ * @param hkStatPixDataOffset Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ21DatCcdWindowParamGetHkStatPixDataOffset(unsigned short * hkStatPixDataOffset, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter HkStatNumDataWords of the DAT CCD Window packet.
+ * @param hkStatNumDataWords Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ21DatCcdWindowParamGetHkStatNumDataWords(unsigned short * hkStatNumDataWords, CrFwPckt_t pckt);
+
+/**
+ * Gets the value of the parameter DatScienceBlock of the DAT CCD Window packet.
+ * @param datScienceBlock Pointer to the parameter that will be filled with data from the packet.
+ * @param pckt Pointer to the packet.
+ */
+void CrSemServ21DatCcdWindowParamGetDatScienceBlock(unsigned short * datScienceBlock, CrFwPckt_t pckt);
+
+#endif /* CRSEM_PARAM_GETTER_H */
+
diff --git a/CrIa/src/Services/General/CrSemParamSetter.c b/CrIa/src/Services/General/CrSemParamSetter.c
new file mode 100644
index 0000000..79d0fa3
--- /dev/null
+++ b/CrIa/src/Services/General/CrSemParamSetter.c
@@ -0,0 +1,344 @@
+/**
+ * @file CrSemParamSetter.c
+ * @ingroup CrIaServicesGeneral
+ * @authors FW Profile code generator, P&P Software GmbH, 2015; Institute for Astrophysics, 2015-2016
+ *
+ * @brief Implementation of the setter operations for all parameters of all out-going packets.
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include "CrSemParamSetter.h"
+#include "CrSemConstants.h"
+#include "CrFwCmpData.h"
+#include "CrIaPckt.h"
+#include "IfswUtilities.h"
+#include "FwSmConfig.h"
+#include <string.h>
+
+
+
+void CrSemServ3CmdHkEnableParamSetParSidHk(FwSmDesc_t smDesc, unsigned char parSidHk)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 0] = parSidHk;
+}
+
+void CrSemServ3CmdHkEnableParamSetPad(FwSmDesc_t smDesc, unsigned char pad)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 1] = pad;
+}
+
+void CrSemServ3CmdHkDisableParamSetParSidHk(FwSmDesc_t smDesc, unsigned char parSidHk)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 0] = parSidHk;
+}
+
+void CrSemServ3CmdHkDisableParamSetPad(FwSmDesc_t smDesc, unsigned char pad)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 1] = pad;
+}
+
+void CrSemServ3CmdHkPeriodParamSetParSidHk(FwSmDesc_t smDesc, unsigned char parSidHk)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 0] = parSidHk;
+}
+
+void CrSemServ3CmdHkPeriodParamSetParHkPeriod(FwSmDesc_t smDesc, unsigned short parHkPeriod)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 1] = (parHkPeriod >> 8);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 2] = (parHkPeriod & 0xFF);
+}
+
+void CrSemServ3CmdHkPeriodParamSetPad(FwSmDesc_t smDesc, unsigned char pad)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 3] = pad;
+}
+
+/* this does not work ... */
+void CrSemServ9CmdTimeUpdateParamSetParObtSyncTime(FwSmDesc_t smDesc, const unsigned char * parObtSyncTime)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  memcpy(&cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 0], parObtSyncTime, 6);
+}
+
+
+/***************************
+ * CMD_Operation_Parameter *
+ ***************************/
+
+void CrSemServ220CmdOperParamParamSetParExposureTime(FwSmDesc_t smDesc, unsigned int parExposureTime)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 0] = ( parExposureTime >> 24);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 1] = ((parExposureTime >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 2] = ((parExposureTime >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 3] = ( parExposureTime & 0xFF);
+}
+
+void CrSemServ220CmdOperParamParamSetParRepetitionPeriod(FwSmDesc_t smDesc, unsigned int parRepetitionPeriod)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 4] = ( parRepetitionPeriod >> 24);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 5] = ((parRepetitionPeriod >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 6] = ((parRepetitionPeriod >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 7] = ( parRepetitionPeriod & 0xFF);
+}
+
+void CrSemServ220CmdOperParamParamSetParAcquisitionNum(FwSmDesc_t smDesc, unsigned int parAcquisitionNum) /* NOTE: manual change to 32 bit */
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 8] = ( parAcquisitionNum >> 24);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 9] = ((parAcquisitionNum >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 10] = ((parAcquisitionNum >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 11] = ( parAcquisitionNum & 0xFF);
+}
+
+void CrSemServ220CmdOperParamParamSetParDataOversampling(FwSmDesc_t smDesc, unsigned char parDataOversampling)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 12] = parDataOversampling;
+}
+
+void CrSemServ220CmdOperParamParamSetParCcdReadoutMode(FwSmDesc_t smDesc, unsigned char parCcdReadoutMode)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 13] = parCcdReadoutMode;
+}
+
+/***************************
+ * CMD_Temp_Control_Enable *
+ ***************************/
+
+void CrSemServ220CmdTempCtrlEnableParamSetParTempControlTarget(FwSmDesc_t smDesc, unsigned short parTempControlTarget)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 0] = (parTempControlTarget >> 8);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 1] = (parTempControlTarget & 0xFF);
+}
+
+/****************************
+ * CMD_Functional_Parameter *
+ ****************************/
+
+void CrSemServ220CmdFunctParamParamSetParCcdWindowStarPosX(FwSmDesc_t smDesc, unsigned short parCcdWindowStarPosX)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 0] = (parCcdWindowStarPosX >> 8);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 1] = (parCcdWindowStarPosX & 0xFF);
+}
+
+void CrSemServ220CmdFunctParamParamSetParCcdWindowStarPosY(FwSmDesc_t smDesc, unsigned short parCcdWindowStarPosY)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 2] = (parCcdWindowStarPosY >> 8);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 3] = (parCcdWindowStarPosY & 0xFF);
+}
+
+void CrSemServ220CmdFunctParamParamSetParCcdWindowStarPosX2(FwSmDesc_t smDesc, unsigned short parCcdWindowStarPosX2)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 4] = (parCcdWindowStarPosX2 >> 8);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 5] = (parCcdWindowStarPosX2 & 0xFF);
+}
+
+void CrSemServ220CmdFunctParamParamSetParCcdWindowStarPosY2(FwSmDesc_t smDesc, unsigned short parCcdWindowStarPosY2)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 6] = (parCcdWindowStarPosY2 >> 8);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 7] = (parCcdWindowStarPosY2 & 0xFF);
+}
+
+void CrSemServ220CmdFunctParamParamSetParDataAcqSrc(FwSmDesc_t smDesc, unsigned short parDataAcqSrc)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 8] = (parDataAcqSrc >> 8);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 9] = (parDataAcqSrc & 0xFF);
+}
+
+void CrSemServ220CmdFunctParamParamSetParVoltFeeVod(FwSmDesc_t smDesc, unsigned int parVoltFeeVod)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 10] = ( parVoltFeeVod >> 24);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 11] = ((parVoltFeeVod >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 12] = ((parVoltFeeVod >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 13] = ( parVoltFeeVod & 0xFF);
+}
+
+void CrSemServ220CmdFunctParamParamSetParVoltFeeVrd(FwSmDesc_t smDesc, unsigned int parVoltFeeVrd)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 14] = ( parVoltFeeVrd >> 24);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 15] = ((parVoltFeeVrd >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 16] = ((parVoltFeeVrd >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 17] = ( parVoltFeeVrd & 0xFF);
+}
+
+void CrSemServ220CmdFunctParamParamSetParVoltFeeVss(FwSmDesc_t smDesc, unsigned int parVoltFeeVss)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 18] = ( parVoltFeeVss >> 24);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 19] = ((parVoltFeeVss >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 20] = ((parVoltFeeVss >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 21] = ( parVoltFeeVss & 0xFF);
+}
+
+void CrSemServ220CmdFunctParamParamSetParHeatTempFpaCcd(FwSmDesc_t smDesc, unsigned int parHeatTempFpaCcd)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 22] = ( parHeatTempFpaCcd >> 24);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 23] = ((parHeatTempFpaCcd >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 24] = ((parHeatTempFpaCcd >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 25] = ( parHeatTempFpaCcd & 0xFF);
+}
+
+void CrSemServ220CmdFunctParamParamSetParHeatTempFeeStrap(FwSmDesc_t smDesc, unsigned int parHeatTempFeeStrap)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 26] = ( parHeatTempFeeStrap >> 24);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 27] = ((parHeatTempFeeStrap >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 28] = ((parHeatTempFeeStrap >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 29] = ( parHeatTempFeeStrap & 0xFF);
+}
+
+void CrSemServ220CmdFunctParamParamSetParHeatTempFeeAnach(FwSmDesc_t smDesc, unsigned int parHeatTempFeeAnach)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 30] = ( parHeatTempFeeAnach >> 24);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 31] = ((parHeatTempFeeAnach >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 32] = ((parHeatTempFeeAnach >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 33] = ( parHeatTempFeeAnach & 0xFF);
+}
+
+void CrSemServ220CmdFunctParamParamSetParHeatTempSpare(FwSmDesc_t smDesc, unsigned int parHeatTempSpare)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 34] = ( parHeatTempSpare >> 24);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 35] = ((parHeatTempSpare >> 16) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 36] = ((parHeatTempSpare >> 8 ) & 0xFF);
+  cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 37] = ( parHeatTempSpare & 0xFF);
+}
+
+/****************************
+ * CMD_DIAGNOSTIC_Enable    *
+ ****************************/
+
+void CrSemServ222CmdDiagEnableParamSetParStepEnDiagCcd(FwSmDesc_t smDesc, unsigned short parStepEnDiagCcd)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  PutNBits8 (parStepEnDiagCcd, 0, 1, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 0]));
+  return;
+}
+
+void CrSemServ222CmdDiagEnableParamSetParStepEnDiagFee(FwSmDesc_t smDesc, unsigned short parStepEnDiagFee)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  PutNBits8 (parStepEnDiagFee, 1, 1, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 0]));
+  return;
+}
+
+void CrSemServ222CmdDiagEnableParamSetParStepEnDiagTemp(FwSmDesc_t smDesc, unsigned short parStepEnDiagTemp)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  PutNBits8 (parStepEnDiagTemp, 2, 1, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 0]));
+  return;
+}
+
+void CrSemServ222CmdDiagEnableParamSetParStepEnDiagAna(FwSmDesc_t smDesc, unsigned short parStepEnDiagAna)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  PutNBits8 (parStepEnDiagAna, 3, 1, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 0]));
+  return;
+}
+
+void CrSemServ222CmdDiagEnableParamSetParStepEnDiagExpos(FwSmDesc_t smDesc, unsigned short parStepEnDiagExpos)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  PutNBits8 (parStepEnDiagExpos, 4, 1, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 0]));
+  return;
+}
+
+void CrSemServ222CmdDiagEnableParamSetParStepDebDiagCcd(FwSmDesc_t smDesc, unsigned short parStepDebDiagCcd)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  PutNBits8 (parStepDebDiagCcd, 5, 2, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 0]));
+  return;
+}
+
+void CrSemServ222CmdDiagEnableParamSetParStepDebDiagFee(FwSmDesc_t smDesc, unsigned short parStepDebDiagFee)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  PutNBits8 (parStepDebDiagFee, 7, 2, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 0]));
+  return;
+}
+
+void CrSemServ222CmdDiagEnableParamSetParStepDebDiagTemp(FwSmDesc_t smDesc, unsigned short parStepDebDiagTemp)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  PutNBits8 (parStepDebDiagTemp, 1, 2, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 1]));
+  return;
+}
+
+void CrSemServ222CmdDiagEnableParamSetParStepDebDiagAna(FwSmDesc_t smDesc, unsigned short parStepDebDiagAna)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  PutNBits8 (parStepDebDiagAna, 3, 2, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 1]));
+  return;
+}
+
+void CrSemServ222CmdDiagEnableParamSetParStepDebDiagExpos(FwSmDesc_t smDesc, unsigned short parStepDebDiagExpos)
+{
+  CrFwCmpData_t* cmpData = (CrFwCmpData_t*)FwSmGetData(smDesc);
+  CrFwOutCmpData_t* cmpSpecificData = (CrFwOutCmpData_t*)(cmpData->cmpSpecificData);
+  PutNBits8 (parStepDebDiagExpos, 5, 3, (unsigned char *)&(cmpSpecificData->pckt[OFFSET_PAR_LENGTH_OUT_CMD_PCKT + 1]));
+  return;
+}
diff --git a/CrIa/src/Services/General/CrSemParamSetter.h b/CrIa/src/Services/General/CrSemParamSetter.h
new file mode 100644
index 0000000..812eb21
--- /dev/null
+++ b/CrIa/src/Services/General/CrSemParamSetter.h
@@ -0,0 +1,233 @@
+/**
+ * @file CrSemParamSetter.h
+ *
+ * Declaration of the setter operations for all parameters of all out-going packets.
+ *
+ * @author code generator
+ * @copyright P&P Software GmbH, 2015
+ */
+
+#ifndef CRSEM_PARAM_SETTER_H
+#define CRSEM_PARAM_SETTER_H
+
+#include <FwSmCore.h>
+#include <CrFwConstants.h>
+
+/**
+ * Sets the value of the parameter ParSidHk of the out-going packet CMD Housekeeping Data Enable.
+ * @param parSidHk
+ */
+void CrSemServ3CmdHkEnableParamSetParSidHk(FwSmDesc_t smDesc, unsigned char parSidHk);
+
+/**
+ * Sets the value of the parameter Pad of the out-going packet CMD Housekeeping Data Enable.
+ * @param pad
+ */
+void CrSemServ3CmdHkEnableParamSetPad(FwSmDesc_t smDesc, unsigned char pad);
+
+/**
+ * Sets the value of the parameter ParSidHk of the out-going packet CMD Housekeeping Data Disable.
+ * @param parSidHk
+ */
+void CrSemServ3CmdHkDisableParamSetParSidHk(FwSmDesc_t smDesc, unsigned char parSidHk);
+
+/**
+ * Sets the value of the parameter Pad of the out-going packet CMD Housekeeping Data Disable.
+ * @param pad
+ */
+void CrSemServ3CmdHkDisableParamSetPad(FwSmDesc_t smDesc, unsigned char pad);
+
+/**
+ * Sets the value of the parameter ParSidHk of the out-going packet CMD Housekeeping Data Period.
+ * @param parSidHk
+ */
+void CrSemServ3CmdHkPeriodParamSetParSidHk(FwSmDesc_t smDesc, unsigned char parSidHk);
+
+/**
+ * Sets the value of the parameter ParHkPeriod of the out-going packet CMD Housekeeping Data Period.
+ * @param parHkPeriod
+ */
+void CrSemServ3CmdHkPeriodParamSetParHkPeriod(FwSmDesc_t smDesc, unsigned short parHkPeriod);
+
+/**
+ * Sets the value of the parameter Pad of the out-going packet CMD Housekeeping Data Period.
+ * @param pad
+ */
+void CrSemServ3CmdHkPeriodParamSetPad(FwSmDesc_t smDesc, unsigned char pad);
+
+/**
+ * Sets the value of the parameter ParObtSyncTime of the out-going packet CMD Time Update.
+ * @param parObtSyncTime On-board time at next synchronization SpaceWire TimeCode
+ */
+void CrSemServ9CmdTimeUpdateParamSetParObtSyncTime(FwSmDesc_t smDesc, const unsigned char * parObtSyncTime);
+
+/**
+ * Sets the value of the parameter ParExposureTime of the out-going packet CMD Operation Parameter.
+ * @param parExposureTime
+ */
+void CrSemServ220CmdOperParamParamSetParExposureTime(FwSmDesc_t smDesc, unsigned int parExposureTime);
+
+/**
+ * Sets the value of the parameter ParRepetitionPeriod of the out-going packet CMD Operation Parameter.
+ * @param parRepetitionPeriod
+ */
+void CrSemServ220CmdOperParamParamSetParRepetitionPeriod(FwSmDesc_t smDesc, unsigned int parRepetitionPeriod);
+
+/**
+ * Sets the value of the parameter ParAcquisitionNum of the out-going packet CMD Operation Parameter.
+ * @param parAcquisitionNum
+ */
+void CrSemServ220CmdOperParamParamSetParAcquisitionNum(FwSmDesc_t smDesc, unsigned int parAcquisitionNum); /* NOTE: manual change */
+
+/**
+ * Sets the value of the parameter ParDataOversampling of the out-going packet CMD Operation Parameter.
+ * @param parDataOversampling
+ */
+void CrSemServ220CmdOperParamParamSetParDataOversampling(FwSmDesc_t smDesc, unsigned char parDataOversampling);
+
+/**
+ * Sets the value of the parameter ParCcdReadoutMode of the out-going packet CMD Operation Parameter.
+ * @param parCcdReadoutMode
+ */
+void CrSemServ220CmdOperParamParamSetParCcdReadoutMode(FwSmDesc_t smDesc, unsigned char parCcdReadoutMode);
+
+/**
+ * Sets the value of the parameter ParTempControlTarget of the out-going packet CMD Temperature Control Enable.
+ * @param parTempControlTarget Temperature control target (TBC).
+ */
+void CrSemServ220CmdTempCtrlEnableParamSetParTempControlTarget(FwSmDesc_t smDesc, unsigned short parTempControlTarget);
+
+/**
+ * Sets the value of the parameter ParCcdWindowStarPosX of the out-going packet Changes SEM Functional Parameter.
+ * @param parCcdWindowStarPosX TBD
+ */
+void CrSemServ220CmdFunctParamParamSetParCcdWindowStarPosX(FwSmDesc_t smDesc, unsigned short parCcdWindowStarPosX);
+
+/**
+ * Sets the value of the parameter ParCcdWindowStarPosY of the out-going packet Changes SEM Functional Parameter.
+ * @param parCcdWindowStarPosY TBD
+ */
+void CrSemServ220CmdFunctParamParamSetParCcdWindowStarPosY(FwSmDesc_t smDesc, unsigned short parCcdWindowStarPosY);
+
+/**
+ * Sets the value of the parameter ParCcdWindowStarPosX2 of the out-going packet Changes SEM Functional Parameter.
+ * @param parCcdWindowStarPosX2 TBD
+ */
+void CrSemServ220CmdFunctParamParamSetParCcdWindowStarPosX2(FwSmDesc_t smDesc, unsigned short parCcdWindowStarPosX2);
+
+/**
+ * Sets the value of the parameter ParCcdWindowStarPosY2 of the out-going packet Changes SEM Functional Parameter.
+ * @param parCcdWindowStarPosY2 TBD
+ */
+void CrSemServ220CmdFunctParamParamSetParCcdWindowStarPosY2(FwSmDesc_t smDesc, unsigned short parCcdWindowStarPosY2);
+
+/**
+ * Sets the value of the parameter ParDataAcqSrc of the out-going packet Changes SEM Functional Parameter.
+ * @param parDataAcqSrc TBD
+ */
+void CrSemServ220CmdFunctParamParamSetParDataAcqSrc(FwSmDesc_t smDesc, unsigned short parDataAcqSrc);
+
+/**
+ * Sets the value of the parameter ParVoltFeeVod of the out-going packet Changes SEM Functional Parameter.
+ * @param parVoltFeeVod TBD
+ */
+void CrSemServ220CmdFunctParamParamSetParVoltFeeVod(FwSmDesc_t smDesc, unsigned int parVoltFeeVod);
+
+/**
+ * Sets the value of the parameter ParVoltFeeVrd of the out-going packet Changes SEM Functional Parameter.
+ * @param parVoltFeeVrd TBD
+ */
+void CrSemServ220CmdFunctParamParamSetParVoltFeeVrd(FwSmDesc_t smDesc, unsigned int parVoltFeeVrd);
+
+/**
+ * Sets the value of the parameter ParVoltFeeVss of the out-going packet Changes SEM Functional Parameter.
+ * @param parVoltFeeVss TBD
+ */
+void CrSemServ220CmdFunctParamParamSetParVoltFeeVss(FwSmDesc_t smDesc, unsigned int parVoltFeeVss);
+
+/**
+ * Sets the value of the parameter ParHeatTempFpaCcd of the out-going packet Changes SEM Functional Parameter.
+ * @param parHeatTempFpaCcd TBD
+ */
+void CrSemServ220CmdFunctParamParamSetParHeatTempFpaCcd(FwSmDesc_t smDesc, unsigned int parHeatTempFpaCcd);
+
+/**
+ * Sets the value of the parameter ParHeatTempFeeStrap of the out-going packet Changes SEM Functional Parameter.
+ * @param parHeatTempFeeStrap TBD
+ */
+void CrSemServ220CmdFunctParamParamSetParHeatTempFeeStrap(FwSmDesc_t smDesc, unsigned int parHeatTempFeeStrap);
+
+/**
+ * Sets the value of the parameter ParHeatTempFeeAnach of the out-going packet Changes SEM Functional Parameter.
+ * @param parHeatTempFeeAnach TBD
+ */
+void CrSemServ220CmdFunctParamParamSetParHeatTempFeeAnach(FwSmDesc_t smDesc, unsigned int parHeatTempFeeAnach);
+
+/**
+ * Sets the value of the parameter ParHeatTempSpare of the out-going packet Changes SEM Functional Parameter.
+ * @param parHeatTempSpare TBD
+ */
+void CrSemServ220CmdFunctParamParamSetParHeatTempSpare(FwSmDesc_t smDesc, unsigned int parHeatTempSpare);
+
+/**
+ * Sets the value of the parameter ParStepEnDiagCcd of the out-going packet CMD_DIAGNOSTIC_Enable.
+ * @param parStepEnDiagCcd TBD
+ */
+void CrSemServ222CmdDiagEnableParamSetParStepEnDiagCcd(FwSmDesc_t smDesc, unsigned short parStepEnDiagCcd);
+
+/**
+ * Sets the value of the parameter ParStepEnDiagFee of the out-going packet CMD_DIAGNOSTIC_Enable.
+ * @param parStepEnDiagCcd TBD
+ */
+void CrSemServ222CmdDiagEnableParamSetParStepEnDiagFee(FwSmDesc_t smDesc, unsigned short parStepEnDiagFee);
+
+/**
+ * Sets the value of the parameter ParStepEnDiagTemp of the out-going packet CMD_DIAGNOSTIC_Enable.
+ * @param parStepEnDiagCcd TBD
+ */
+void CrSemServ222CmdDiagEnableParamSetParStepEnDiagTemp(FwSmDesc_t smDesc, unsigned short parStepEnDiagTemp);
+
+/**
+ * Sets the value of the parameter ParStepEnDiagAna of the out-going packet CMD_DIAGNOSTIC_Enable.
+ * @param parStepEnDiagCcd TBD
+ */
+void CrSemServ222CmdDiagEnableParamSetParStepEnDiagAna(FwSmDesc_t smDesc, unsigned short parStepEnDiagAna);
+
+/**
+ * Sets the value of the parameter ParStepEnDiagExpos of the out-going packet CMD_DIAGNOSTIC_Enable.
+ * @param parStepEnDiagCcd TBD
+ */
+void CrSemServ222CmdDiagEnableParamSetParStepEnDiagExpos(FwSmDesc_t smDesc, unsigned short parStepEnDiagExpos);
+
+/**
+ * Sets the value of the parameter ParStepDebDiagCcd of the out-going packet CMD_DIAGNOSTIC_Enable.
+ * @param parStepEnDiagCcd TBD
+ */
+void CrSemServ222CmdDiagEnableParamSetParStepDebDiagCcd(FwSmDesc_t smDesc, unsigned short parStepDebDiagCcd);
+
+/**
+ * Sets the value of the parameter ParStepDebDiagFee of the out-going packet CMD_DIAGNOSTIC_Enable.
+ * @param parStepEnDiagCcd TBD
+ */
+void CrSemServ222CmdDiagEnableParamSetParStepDebDiagFee(FwSmDesc_t smDesc, unsigned short parStepDebDiagFee);
+
+/**
+ * Sets the value of the parameter ParStepDebDiagTemp of the out-going packet CMD_DIAGNOSTIC_Enable.
+ * @param parStepEnDiagCcd TBD
+ */
+void CrSemServ222CmdDiagEnableParamSetParStepDebDiagTemp(FwSmDesc_t smDesc, unsigned short parStepDebDiagTemp);
+
+/**
+ * Sets the value of the parameter ParStepDebDiagAna of the out-going packet CMD_DIAGNOSTIC_Enable.
+ * @param parStepEnDiagCcd TBD
+ */
+void CrSemServ222CmdDiagEnableParamSetParStepDebDiagAna(FwSmDesc_t smDesc, unsigned short parStepDebDiagAna);
+
+/**
+ * Sets the value of the parameter ParStepDebDiagExpos of the out-going packet CMD_DIAGNOSTIC_Enable.
+ * @param parStepEnDiagCcd TBD
+ */
+void CrSemServ222CmdDiagEnableParamSetParStepDebDiagExpos(FwSmDesc_t smDesc, unsigned short parStepDebDiagExpos);
+
+#endif /* CRSEM_PARAM_SETTER_H */
+
diff --git a/CrIa/src/Ta/AngleMethod.c b/CrIa/src/Ta/AngleMethod.c
new file mode 120000
index 0000000..39a68c8
--- /dev/null
+++ b/CrIa/src/Ta/AngleMethod.c
@@ -0,0 +1 @@
+../../../TargetAcquisition/src/AngleMethod.c
\ No newline at end of file
diff --git a/CrIa/src/Ta/AngleMethod.h b/CrIa/src/Ta/AngleMethod.h
new file mode 120000
index 0000000..416a43a
--- /dev/null
+++ b/CrIa/src/Ta/AngleMethod.h
@@ -0,0 +1 @@
+../../../TargetAcquisition/src/AngleMethod.h
\ No newline at end of file
diff --git a/CrIa/src/Ta/StarExtractor.c b/CrIa/src/Ta/StarExtractor.c
new file mode 120000
index 0000000..bc9c202
--- /dev/null
+++ b/CrIa/src/Ta/StarExtractor.c
@@ -0,0 +1 @@
+../../../TargetAcquisition/src/StarExtractor.c
\ No newline at end of file
diff --git a/CrIa/src/Ta/StarExtractor.h b/CrIa/src/Ta/StarExtractor.h
new file mode 120000
index 0000000..1a8d0fe
--- /dev/null
+++ b/CrIa/src/Ta/StarExtractor.h
@@ -0,0 +1 @@
+../../../TargetAcquisition/src/StarExtractor.h
\ No newline at end of file
diff --git a/CrIa/src/Ta/StarPosDistortCorr.c b/CrIa/src/Ta/StarPosDistortCorr.c
new file mode 120000
index 0000000..1f8bac8
--- /dev/null
+++ b/CrIa/src/Ta/StarPosDistortCorr.c
@@ -0,0 +1 @@
+../../../TargetAcquisition/src/StarPosDistortCorr.c
\ No newline at end of file
diff --git a/CrIa/src/Ta/StarPosDistortCorr.h b/CrIa/src/Ta/StarPosDistortCorr.h
new file mode 120000
index 0000000..48d3bc4
--- /dev/null
+++ b/CrIa/src/Ta/StarPosDistortCorr.h
@@ -0,0 +1 @@
+../../../TargetAcquisition/src/StarPosDistortCorr.h
\ No newline at end of file
diff --git a/CrIa/src/Ta/TaDatatypes.h b/CrIa/src/Ta/TaDatatypes.h
new file mode 120000
index 0000000..7dd40c5
--- /dev/null
+++ b/CrIa/src/Ta/TaDatatypes.h
@@ -0,0 +1 @@
+../../../TargetAcquisition/src/TaDatatypes.h
\ No newline at end of file
diff --git a/CrIa/src/Ta/TargetAcquisition.c b/CrIa/src/Ta/TargetAcquisition.c
new file mode 120000
index 0000000..585d31b
--- /dev/null
+++ b/CrIa/src/Ta/TargetAcquisition.c
@@ -0,0 +1 @@
+../../../TargetAcquisition/src/TargetAcquisition.c
\ No newline at end of file
diff --git a/CrIa/src/Ta/TargetAcquisition.h b/CrIa/src/Ta/TargetAcquisition.h
new file mode 120000
index 0000000..722b5cd
--- /dev/null
+++ b/CrIa/src/Ta/TargetAcquisition.h
@@ -0,0 +1 @@
+../../../TargetAcquisition/src/TargetAcquisition.h
\ No newline at end of file
diff --git a/CrIa/src/byteorder.h b/CrIa/src/byteorder.h
new file mode 100644
index 0000000..b039705
--- /dev/null
+++ b/CrIa/src/byteorder.h
@@ -0,0 +1,273 @@
+/**
+ * @file   byteorder.h
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * This is a set of macros for consistent endianess conversion. They work
+ * for both little and big endian cpus.
+ *
+ * conversion of XX-bit integers (16- or 32-) between native CPU format
+ * and little/big endian format:
+ *	cpu_to_[bl]eXX(uintXX_t x)
+ *	[bl]eXX_to_cpu(uintXX_t x)
+ *
+ * the same, but change in situ:
+ *	cpu_to_[bl]eXXs(uintXX_t x)
+ *	[bl]eXX_to_cpus(uintXX_t x)
+ *
+ *
+ * This is based on the byte order macros from the linux kernel, see:
+ * include/linux/byteorder/generic.h
+ * include/uapi/linux/swab.h
+ * include/uapi/linux/byteorder/big_endian.h
+ * include/uapi/linux/byteorder/little_endian.h
+ * by @author Linus Torvalds et al.
+ *
+ */
+#ifndef BYTEORDER_H
+#define BYTEORDER_H
+
+#include <stdint.h>
+
+
+
+#ifdef __BIG_ENDIAN
+#undef __BIG_ENDIAN
+#endif
+
+#ifdef __LITTLE_ENDIAN
+#undef __LITTLE_ENDIAN
+#endif
+
+#if (__sparc__)
+#ifndef __BIG_ENDIAN
+#define __BIG_ENDIAN 4321
+#endif
+#endif
+
+#if (__i386__ || __x86_64__)
+#ifndef __LITTLE_ENDIAN
+#define __LITTLE_ENDIAN 1234
+#endif
+#endif
+
+
+#define ___constant_swab16(x) ((uint16_t)(			\
+	(((uint16_t)(x) & (uint16_t)0x00ffU) << 8) |		\
+	(((uint16_t)(x) & (uint16_t)0xff00U) >> 8)))
+
+#define ___constant_swab32(x) ((uint32_t)(			\
+	(((uint32_t)(x) & (uint32_t)0x000000ffUL) << 24) |	\
+	(((uint32_t)(x) & (uint32_t)0x0000ff00UL) <<  8) |	\
+	(((uint32_t)(x) & (uint32_t)0x00ff0000UL) >>  8) |	\
+	(((uint32_t)(x) & (uint32_t)0xff000000UL) >> 24)))
+
+
+#ifdef USE_BUILTIN_BSWAP
+#if GCC_VERSION >= 40400
+#define __HAVE_BUILTIN_BSWAP32__
+#endif
+#if GCC_VERSION >= 40800
+#define __HAVE_BUILTIN_BSWAP16__
+#endif
+#endif /* USE_BUILTIN_BSWAP */
+
+
+static inline __attribute__((const)) uint16_t __fswab16(uint16_t val)
+{
+#ifdef __HAVE_BUILTIN_BSWAP16__
+	return __builtin_bswap16(val);
+#else
+	return ___constant_swab16(val);
+#endif
+}
+
+
+static inline __attribute__((const)) uint32_t __fswab32(uint32_t val)
+{
+#ifdef __HAVE_BUILTIN_BSWAP32__
+	return __builtin_bswap32(val);
+#else
+	return ___constant_swab32(val);
+#endif
+}
+
+
+/**
+ * @brief return a byteswapped 16-bit value
+ * @param x value to byteswap
+ */
+
+#define __swab16(x)				\
+	(__builtin_constant_p((uint16_t)(x)) ?	\
+	___constant_swab16(x) :			\
+	__fswab16(x))
+
+
+/**
+ * @brief return a byteswapped 32-bit value
+ * @param x a value to byteswap
+ */
+
+#define __swab32(x)				\
+	(__builtin_constant_p((uint32_t)(x)) ?	\
+	___constant_swab32(x) :			\
+	__fswab32(x))
+
+
+/**
+ * @brief return a byteswapped 16-bit value from a pointer
+ * @param p a pointer to a naturally-aligned 16-bit value
+ */
+static inline uint16_t __swab16p(const uint16_t *p)
+{
+	return __swab16(*p);
+}
+
+
+/**
+ * @brief return a byteswapped 32-bit value from a pointer
+ * @param p a pointer to a naturally-aligned 32-bit value
+ */
+static inline uint32_t __swab32p(const uint32_t *p)
+{
+	return __swab32(*p);
+}
+
+
+/**
+ * @brief byteswap a 16-bit value in-place
+ * @param p a pointer to a naturally-aligned 16-bit value
+ */
+
+static inline void __swab16s(uint16_t *p)
+{
+	*p = __swab16p(p);
+}
+
+
+/**
+ * @brief byteswap a 32-bit value in-place
+ * @param p a pointer to a naturally-aligned 32-bit value
+ */
+
+static inline void __swab32s(uint32_t *p)
+{
+	*p = __swab32p(p);
+}
+
+
+
+#ifdef __BIG_ENDIAN
+
+#define __cpu_to_le16(x)   ((uint16_t)__swab16((x)))
+#define __cpu_to_le32(x)   ((uint32_t)__swab32((x)))
+
+#define __cpu_to_le16s(x)  __swab16s((x))
+#define __cpu_to_le32s(x)  __swab32s((x))
+
+#define __cpu_to_be16(x)   ((uint16_t)(x))
+#define __cpu_to_be32(x)   ((uint32_t)(x))
+
+#define __cpu_to_be16s(x)  { (void)(x); }
+#define __cpu_to_be32s(x)  { (void)(x); }
+
+
+
+#define __le16_to_cpu(x)   __swab16((uint16_t)(x))
+#define __le32_to_cpu(x)   __swab32((uint32_t)(x))
+
+#define __le16_to_cpus(x)  __swab16s((x))
+#define __le32_to_cpus(x)  __swab32s((x))
+
+#define __be16_to_cpu(x)   ((uint16_t)(x))
+#define __be32_to_cpu(x)   ((uint32_t)(x))
+
+#define __be16_to_cpus(x)  { (void)(x); }
+#define __be32_to_cpus(x)  { (void)(x); }
+
+#endif /* __BIG_ENDIAN */
+
+
+#ifdef __LITTLE_ENDIAN
+
+#define __cpu_to_le16(x)   ((uint16_t)(x))
+#define __cpu_to_le32(x)   ((uint32_t)(x))
+
+#define __cpu_to_le16s(x)  { (void)(x); }
+#define __cpu_to_le32s(x)  { (void)(x); }
+
+#define __cpu_to_be16(x)   ((uint16_t)__swab16((x)))
+#define __cpu_to_be32(x)   ((uint32_t)__swab32((x)))
+
+#define __cpu_to_be16s(x)  __swab16s((x))
+#define __cpu_to_be32s(x)  __swab32s((x))
+
+
+
+#define __le16_to_cpu(x)  ((uint16_t)(x))
+#define __le32_to_cpu(x)  ((uint32_t)(x))
+
+#define __le32_to_cpus(x) { (void)(x); }
+#define __le16_to_cpus(x) { (void)(x); }
+
+#define __be16_to_cpu(x)  __swab16((uint16_t)(uint16_t)(x))
+#define __be32_to_cpu(x)  __swab32((uint32_t)(uint32_t)(x))
+
+#define __be16_to_cpus(x) __swab16s((x))
+#define __be32_to_cpus(x) __swab32s((x))
+
+#endif /* __LITTLE_ENDIAN */
+
+
+
+/** these are the conversion macros */
+
+/** convert cpu order to little endian */
+#define cpu_to_le16  __cpu_to_le16
+#define cpu_to_le32  __cpu_to_le32
+
+/** in-place convert cpu order to little endian */
+#define cpu_to_le16s __cpu_to_le16s
+#define cpu_to_le32s __cpu_to_le32s
+
+/** convert cpu order to big endian */
+#define cpu_to_be16  __cpu_to_be16
+#define cpu_to_be32  __cpu_to_be32
+
+/** in-place convert cpu order to big endian */
+#define cpu_to_be16s __cpu_to_be16s
+#define cpu_to_be32s __cpu_to_be32s
+
+
+/* same, but in reverse */
+
+/** convert little endian to cpu order*/
+#define le16_to_cpu  __le16_to_cpu
+#define le32_to_cpu  __le32_to_cpu
+
+/** in-place convert little endian to cpu order*/
+#define le16_to_cpus __le16_to_cpus
+#define le32_to_cpus __le32_to_cpus
+
+/** convert big endian to cpu order*/
+#define be16_to_cpu  __be16_to_cpu
+#define be32_to_cpu  __be32_to_cpu
+
+/** in-place convert big endian to cpu order*/
+#define be16_to_cpus __be16_to_cpus
+#define be32_to_cpus __be32_to_cpus
+
+
+
+#endif /* BYTEORDER_H */
diff --git a/FwProfile/.tup/db b/FwProfile/.tup/db
new file mode 100644
index 0000000000000000000000000000000000000000..a0621b5537cc0453c752dea45dfac9d6cdbc038a
GIT binary patch
literal 37888
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

literal 0
HcmV?d00001

diff --git a/FwProfile/.tup/object b/FwProfile/.tup/object
new file mode 100644
index 0000000..e69de29
diff --git a/FwProfile/.tup/shared b/FwProfile/.tup/shared
new file mode 100644
index 0000000..e69de29
diff --git a/FwProfile/.tup/tri b/FwProfile/.tup/tri
new file mode 100644
index 0000000..e69de29
diff --git a/FwProfile/Makefile b/FwProfile/Makefile
new file mode 100644
index 0000000..d7ccca0
--- /dev/null
+++ b/FwProfile/Makefile
@@ -0,0 +1,28 @@
+.PHONY: all
+all:	ifsw-dpu ifsw-pc
+	@echo "finished building all targets"
+
+ifsw-dpu:
+	@echo "+-------------------------------+"
+	@echo "| building fwprofile DPU target |"
+	@echo "+-------------------------------+"
+	make -f ./Makefile-dpu.mk ifsw
+	@echo "+----------------------------+"
+	@echo "| built fwprofile DPU target |"
+	@echo "+----------------------------+"
+	@echo
+
+ifsw-pc:
+	@echo "+------------------------------+"
+	@echo "| building fwprofile PC target |"
+	@echo "+------------------------------+"
+	make -f ./Makefile-pc.mk ifsw
+	@echo "+---------------------------+"
+	@echo "| built fwprofile PC target |"
+	@echo "+---------------------------+"
+	@echo
+
+.PHONY: clean
+clean:
+	make -f ./Makefile-dpu.mk clean
+	make -f ./Makefile-pc.mk clean
diff --git a/FwProfile/Makefile-dpu.mk b/FwProfile/Makefile-dpu.mk
new file mode 100644
index 0000000..26d1fca
--- /dev/null
+++ b/FwProfile/Makefile-dpu.mk
@@ -0,0 +1,35 @@
+CC		= sparc-elf-gcc
+#CFLAGS		= -O2 -mv8 -W -Wall -Wextra -Werror -std=gnu89 -pedantic
+CFLAGS		= -mv8 -mhard-float -mfix-gr712rc -O2 -std=gnu89 -ggdb -W -Wall -Wextra -Werror -pedantic -Wshadow -Wuninitialized -fdiagnostics-show-option -Wcast-qual -Wformat=2
+
+AR		= sparc-elf-ar
+ARFLAGS		= crs
+
+FWROOT 		= $(shell pwd)
+TARGET		= dpu
+SOURCEDIR	= $(FWROOT)/src
+BUILDDIR 	= $(FWROOT)/build/$(TARGET)
+
+SOURCES		= $(shell ls $(SOURCEDIR)/*.c)
+OBJECTS		= $(patsubst %.c,$(BUILDDIR)/%.o,$(notdir $(SOURCES)))
+
+LIBS		= ""
+INCLUDE		= ""
+
+ifsw: $(SOURCES)
+	@echo "building" $(TARGET) "target"
+	mkdir -p $(BUILDDIR)
+	# compile
+	cd $(BUILDDIR) && $(CC) $(CFLAGS) -c $(SOURCES)  
+	# archive
+	cd $(BUILDDIR) && $(AR) $(ARFLAGS) $(BUILDDIR)/libfwprofile.a $(OBJECTS)
+	@echo "libfwprofile.a is ready"
+
+.PHONY: all
+all:	ifsw
+	@echo "finished building all targets"
+
+.PHONY: clean
+clean:
+	rm -f $(BUILDDIR)/*.[ao]
+
diff --git a/FwProfile/Makefile-pc.mk b/FwProfile/Makefile-pc.mk
new file mode 100644
index 0000000..131b8f0
--- /dev/null
+++ b/FwProfile/Makefile-pc.mk
@@ -0,0 +1,35 @@
+CC		= gcc
+CFLAGS		= -O0 -W -Wall -Wextra -Werror -std=gnu89 -m32 -pedantic -ggdb
+DEFS		= -DPC_TARGET
+
+AR		= ar
+ARFLAGS		= crs
+
+FWROOT 		= $(shell pwd)
+TARGET		= pc
+SOURCEDIR	= $(FWROOT)/src
+BUILDDIR 	= $(FWROOT)/build/$(TARGET)
+
+SOURCES		= $(shell ls $(SOURCEDIR)/*.c)
+OBJECTS		= $(patsubst %.c,$(BUILDDIR)/%.o,$(notdir $(SOURCES)))
+
+LIBS		= ""
+INCLUDE		= ""
+
+ifsw: $(SOURCES)
+	@echo "building" $(TARGET) "target"
+	mkdir -p $(BUILDDIR)
+	# compile
+	cd $(BUILDDIR) && $(CC) $(CFLAGS) $(DEFS) -c $(SOURCES)  
+	# archive
+	cd $(BUILDDIR) && $(AR) $(ARFLAGS) $(BUILDDIR)/libfwprofile.a $(OBJECTS)
+	@echo "libfwprofile.a is ready"
+
+.PHONY: all
+all:	ifsw
+	@echo "finished building all targets"
+
+.PHONY: clean
+clean:
+	rm -f $(BUILDDIR)/*.[ao]
+
diff --git a/FwProfile/src/FwPrConfig.c b/FwProfile/src/FwPrConfig.c
new file mode 100644
index 0000000..1af2f6b
--- /dev/null
+++ b/FwProfile/src/FwPrConfig.c
@@ -0,0 +1,475 @@
+/**
+ * @file
+ * @ingroup prGroup
+ * Implements the configuration functions for the FW Procedure Module.
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include "FwPrConfig.h"
+#include "FwPrPrivate.h"
+#include <stdlib.h>
+
+/**
+ * Create a control flow (other than the control flow from the initial node) with the
+ * given characteristics and add it to state machine.
+ * The newly created control flow is stored in the control flow array at the first non-null location
+ * (in other words, the first control flow to be added to the state machine is stored at location 0,
+ * the second control flow is stored at location 1, etc).
+ * @param prDesc the descriptor of the state machine to which the control flow is added.
+ * @param srcId the identifier of the source of the control flow.
+ * @param srcType the type of the source.
+ * @param destId the identifier of the destination of the control flow. If the destination is an action
+ * node, this argument has a positive value equal to the destination identifier. If the destination
+ * is a decision node, this argument has a negative value equal to the opposite of the destination
+ * identifier. If the destination is the final node, this argument has the value zero.
+ * @param cfGuard the control flow guard (or NULL if no guard is associated to this control flow).
+ */
+static void AddFlow(FwPrDesc_t prDesc, FwPrCounterS1_t srcId, NodeType_t srcType, FwPrCounterS1_t destId,
+                    FwPrGuard_t cfGuard);
+
+/**
+ * Add an action to the set of actions in the procedure descriptor.
+ * This function scans the array of actions in the procedure descriptor and
+ * can then have one of three outcomes:
+ * - if the argument action is already present in the array of actions, the function
+ *   returns the index of the location where the action is stored;
+ * - if the argument action is not present and the array of actions is not full, the
+ *   function adds it at the first free location and returns the index of this
+ *   location;
+ * - if the argument action is not present but the array of actions is already full,
+ *   the function returns 0.
+ * .
+ * Note that the argument action is guaranteed to be different from NULL
+ * (because function <code>::FwPrAddAction</code> handles the case of action
+ * being equal to NULL and, in that case, it does not call <code>AddAction</code>.
+ * @param prDesc descriptor of the procedure where the action is added
+ * @param action action to be added
+ * @return the location where the action is stored in the array or -1 if the
+ * action cannot be added because the array is already full
+ */
+static FwPrCounterS1_t AddAction(FwPrDesc_t prDesc, FwPrAction_t action);
+
+/**
+ * Add a guard to the set of guards in the procedure descriptor.
+ * This function scans the array of guards in the procedure descriptor and
+ * can then have one of three outcomes:
+ * - if the argument guard is equal to NULL, the function returns 0;
+ * - if the argument guard is already present in the array of guards, the function
+ *   returns the index of the location where the guard is stored;
+ * - if the argument guard is not present and the array of guards is not full, the
+ *   function adds it at the first free location and returns the index of this
+ *   location;
+ * - if the argument guard is not present but the array of guards is already full, the
+ *   function returns 0.
+ * @param prDesc descriptor of the procedure where the guard is added
+ * @param guard guard to be added
+ * @return the location where the guard is stored in the array or -1 if the
+ * guard cannot be added because the array is already full
+ */
+static FwPrCounterS1_t AddGuard(FwPrDesc_t prDesc, FwPrGuard_t guard);
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwPrSetData(FwPrDesc_t prDesc, void* prData) {
+  prDesc->prData = prData;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void* FwPrGetData(FwPrDesc_t prDesc) {
+  return prDesc->prData;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwPrAddActionNode(FwPrDesc_t prDesc, FwPrCounterS1_t nodeId, FwPrAction_t action) {
+
+  PrANode_t*    aNode;
+  PrBaseDesc_t* prBase = prDesc->prBase;
+
+  if (action == NULL) {
+    prDesc->errCode = prNullAction;
+    return;
+  }
+
+  if (nodeId > prBase->nOfANodes) {
+    prDesc->errCode = prIllActNodeId;
+    return;
+  }
+
+  if (nodeId < 1) {
+    prDesc->errCode = prIllActNodeId;
+    return;
+  }
+
+  if (prBase->aNodes[nodeId - 1].iFlow != -1) {
+    prDesc->errCode = prActNodeIdInUse;
+    return;
+  }
+
+  if (prDesc->flowCnt + 1 > prBase->nOfFlows) {
+    prDesc->errCode = prTooManyOutFlows;
+    return;
+  }
+
+  /* Initialize newly added state */
+  aNode = &(prBase->aNodes[nodeId - 1]);
+
+  aNode->iFlow    = prDesc->flowCnt;
+  prDesc->flowCnt = (FwPrCounterS1_t)(prDesc->flowCnt + 1);
+
+  aNode->iAction = AddAction(prDesc, action);
+
+  return;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwPrAddDecisionNode(FwPrDesc_t prDesc, FwPrCounterS1_t nodeId, FwPrCounterS1_t nOfOutFlows) {
+  PrDNode_t*    dNode;
+  PrBaseDesc_t* prBase = prDesc->prBase;
+
+  if (nodeId > prBase->nOfDNodes) {
+    prDesc->errCode = prIllDecNodeId;
+    return;
+  }
+
+  if (nodeId < 1) {
+    prDesc->errCode = prIllDecNodeId;
+    return;
+  }
+
+  if (prBase->dNodes[nodeId - 1].outFlowIndex != -1) {
+    prDesc->errCode = prDecNodeIdInUse;
+    return;
+  }
+
+  if (nOfOutFlows < 2) {
+    prDesc->errCode = prIllNOfOutFlows;
+    return;
+  }
+
+  if (prDesc->flowCnt + nOfOutFlows > prBase->nOfFlows) {
+    prDesc->errCode = prTooManyOutFlows;
+    return;
+  }
+
+  /* Initialize newly added decision node */
+  dNode = &(prBase->dNodes[nodeId - 1]);
+
+  dNode->outFlowIndex = prDesc->flowCnt;
+  prDesc->flowCnt     = (FwPrCounterS1_t)(prDesc->flowCnt + nOfOutFlows);
+
+  dNode->nOfOutTrans = nOfOutFlows;
+
+  return;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwPrAddFlowIniToAct(FwPrDesc_t prDesc, FwPrCounterS1_t destId, FwPrGuard_t cfGuard) {
+  AddFlow(prDesc, 0, stoppedNode, destId, cfGuard);
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwPrAddFlowIniToDec(FwPrDesc_t prDesc, FwPrCounterS1_t destId, FwPrGuard_t cfGuard) {
+  AddFlow(prDesc, 0, stoppedNode, (FwPrCounterS1_t)(-destId), cfGuard);
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwPrAddFlowActToAct(FwPrDesc_t prDesc, FwPrCounterS1_t srcId, FwPrCounterS1_t destId, FwPrGuard_t cfGuard) {
+  AddFlow(prDesc, srcId, actionNode, destId, cfGuard);
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwPrAddFlowActToDec(FwPrDesc_t prDesc, FwPrCounterS1_t srcId, FwPrCounterS1_t destId, FwPrGuard_t cfGuard) {
+  AddFlow(prDesc, srcId, actionNode, (FwPrCounterS1_t)(-destId), cfGuard);
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwPrAddFlowDecToAct(FwPrDesc_t prDesc, FwPrCounterS1_t srcId, FwPrCounterS1_t destId, FwPrGuard_t cfGuard) {
+  AddFlow(prDesc, srcId, decisionNode, destId, cfGuard);
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwPrAddFlowDecToDec(FwPrDesc_t prDesc, FwPrCounterS1_t srcId, FwPrCounterS1_t destId, FwPrGuard_t cfGuard) {
+  AddFlow(prDesc, srcId, decisionNode, (FwPrCounterS1_t)(-destId), cfGuard);
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwPrAddFlowActToFin(FwPrDesc_t prDesc, FwPrCounterS1_t srcId, FwPrGuard_t cfGuard) {
+  AddFlow(prDesc, srcId, actionNode, 0, cfGuard);
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwPrAddFlowDecToFin(FwPrDesc_t prDesc, FwPrCounterS1_t srcId, FwPrGuard_t cfGuard) {
+  AddFlow(prDesc, srcId, decisionNode, 0, cfGuard);
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+static void AddFlow(FwPrDesc_t prDesc, FwPrCounterS1_t srcId, NodeType_t srcType, FwPrCounterS1_t destId,
+                    FwPrGuard_t cfGuard) {
+
+  FwPrCounterS1_t i, baseLoc, nOfOutFlows;
+  FwPrCounterS1_t loc = -1;
+  PrFlow_t*       flow;
+  PrBaseDesc_t*   prBase = prDesc->prBase;
+
+  /* check that the source state is legal and has been defined */
+  if (srcType == actionNode) {
+    if (srcId > prBase->nOfANodes) {
+      prDesc->errCode = prIllFlowSrc;
+      return;
+    }
+    if (srcId < 1) {
+      prDesc->errCode = prIllFlowSrc;
+      return;
+    }
+    if (prBase->aNodes[srcId - 1].iFlow == -1) {
+      prDesc->errCode = prUndefinedFlowSrc;
+      return;
+    }
+    baseLoc     = prBase->aNodes[srcId - 1].iFlow;
+    nOfOutFlows = 1;
+  }
+  else if (srcType == decisionNode) {
+    if (srcId > prBase->nOfDNodes) {
+      prDesc->errCode = prIllFlowSrc;
+      return;
+    }
+    if (srcId < 1) {
+      prDesc->errCode = prIllFlowSrc;
+      return;
+    }
+    if (prBase->dNodes[srcId - 1].outFlowIndex == -1) {
+      prDesc->errCode = prUndefinedFlowSrc;
+      return;
+    }
+    baseLoc     = prBase->dNodes[srcId - 1].outFlowIndex;
+    nOfOutFlows = prBase->dNodes[srcId - 1].nOfOutTrans;
+  }
+  else { /* Source state is the stopped state */
+    baseLoc     = 0;
+    nOfOutFlows = 1;
+  }
+
+  /* New control flow will be stored in the control flow array of the Procedure Descriptor at a location
+   * in the range [baseLoc, baseLoc+nOfOutFlows-1]. We check that this range of locations
+   * is not already full (note that the checks performed when a node is added to the procedure
+   * ensure that the location [baseLoc+nOfOutFlows-1] is within the range of flow array..
+   */
+  if (prBase->flows[baseLoc + nOfOutFlows - 1].iGuard != -1) {
+    prDesc->errCode = prTooManyFlows;
+    return;
+  }
+
+  /* Identify location where newly added control flow will be stored in the control flow array.
+   * Note that the nOfOutFlows is guaranteed to be greater than zero by the way it is
+   * initialized in the previous statements in this function. Hence, the loop will be
+   * taken at least once. */
+  for (i = 0; i < nOfOutFlows; i++) {
+    if (prBase->flows[baseLoc + i].iGuard == -1) {
+      loc = (FwPrCounterS1_t)(baseLoc + i);
+      break;
+    }
+  }
+  flow = &(prBase->flows[loc]);
+
+  /* Assign control flow destination */
+  flow->dest = destId;
+
+  /* add guard to control flow descriptor */
+  flow->iGuard = AddGuard(prDesc, cfGuard);
+
+  return;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+static FwPrCounterS1_t AddAction(FwPrDesc_t prDesc, FwPrAction_t action) {
+  FwPrCounterS1_t i;
+
+  for (i = 0; i < prDesc->nOfActions; i++) {
+    if (prDesc->prActions[i] == NULL) {
+      break;
+    }
+    if (action == prDesc->prActions[i]) {
+      return i;
+    }
+  }
+
+  if (i < prDesc->nOfActions) {
+    prDesc->prActions[i] = action;
+    return i;
+  }
+
+  prDesc->errCode = prTooManyActions;
+  return 0;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+static FwPrCounterS1_t AddGuard(FwPrDesc_t prDesc, FwPrGuard_t guard) {
+  FwPrCounterS1_t i;
+
+  if (guard == NULL) {
+    return 0;
+  }
+
+  for (i = 1; i < prDesc->nOfGuards; i++) {
+    if (prDesc->prGuards[i] == NULL) {
+      break;
+    }
+    if (guard == prDesc->prGuards[i]) {
+      return i;
+    }
+  }
+
+  if (i < prDesc->nOfGuards) {
+    prDesc->prGuards[i] = guard;
+    return i;
+  }
+
+  prDesc->errCode = prTooManyGuards;
+  return 0;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrErrCode_t FwPrCheck(FwPrDesc_t prDesc) {
+
+  FwPrCounterS1_t i, j;
+  PrBaseDesc_t*   prBase = prDesc->prBase;
+  FwPrBool_t      found;
+
+  /* Check that no error occurred during the configuration process */
+  if (prDesc->errCode != prSuccess) {
+    return prConfigErr;
+  }
+
+  /* Check that all action nodes have been defined */
+  for (i = 0; i < prBase->nOfANodes; i++) {
+    if (prBase->aNodes[i].iFlow == -1) {
+      return prNullActNode;
+    }
+  }
+
+  /* Check that all decision nodes have been defined */
+  for (i = 0; i < prBase->nOfDNodes; i++) {
+    if (prBase->dNodes[i].outFlowIndex == -1) {
+      return prNullDecNode;
+    }
+  }
+
+  /* Check that all control flows have been defined */
+  for (i = 0; i < prBase->nOfFlows; i++) {
+    if (prBase->flows[i].iGuard == -1) {
+      return prNullFlow;
+    }
+  }
+
+  /* Check that all control flow destinations are legal action nodes or decision nodes */
+  for (i = 0; i < prBase->nOfFlows; i++) {
+    if (prBase->flows[i].dest > prBase->nOfANodes) {
+      return prIllegalADest;
+    }
+    if (prBase->flows[i].dest < -prBase->nOfDNodes) {
+      return prIllegalDDest;
+    }
+  }
+
+  /* Check that all actions have been defined */
+  for (i = 0; i < prDesc->nOfActions; i++) {
+    if (prDesc->prActions[i] == NULL) {
+      return prTooFewActions;
+    }
+  }
+
+  /* Check that all guards have been defined */
+  for (i = 0; i < prDesc->nOfGuards; i++) {
+    if (prDesc->prGuards[i] == NULL) {
+      return prTooFewGuards;
+    }
+  }
+
+  /* Check that all action nodes are reachable */
+  for (i = 1; i <= prBase->nOfANodes; i++) {
+    found = 0;
+    for (j = 0; j < prBase->nOfFlows; j++) {
+      if (prBase->flows[j].dest == i) {
+        found = 1;
+        break;
+      }
+    }
+    if (found == 0) {
+      return prUnreachableANode;
+    }
+  }
+
+  /* Check that all decision nodes are reachable */
+  for (i = 1; i <= prBase->nOfDNodes; i++) {
+    found = 0;
+    for (j = 0; j < prBase->nOfFlows; j++) {
+      if (prBase->flows[j].dest == -i) {
+        found = 1;
+        break;
+      }
+    }
+    if (found == 0) {
+      return prUnreachableDNode;
+    }
+  }
+
+  return prSuccess;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwPrOverrideAction(FwPrDesc_t prDesc, FwPrAction_t oldAction, FwPrAction_t newAction) {
+  FwPrCounterS1_t i;
+
+  if (prDesc->flowCnt != 0) {
+    prDesc->errCode = prNotDerivedPr;
+    return;
+  }
+
+  for (i = 0; i < prDesc->nOfActions; i++) {
+    if (prDesc->prActions[i] == oldAction) {
+      prDesc->prActions[i] = newAction;
+      return;
+    }
+  }
+
+  prDesc->errCode = prUndefAction;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwPrOverrideGuard(FwPrDesc_t prDesc, FwPrGuard_t oldGuard, FwPrGuard_t newGuard) {
+  FwPrCounterS1_t i;
+
+  if (prDesc->flowCnt != 0) {
+    prDesc->errCode = prNotDerivedPr;
+    return;
+  }
+
+  for (i = 1; i < prDesc->nOfGuards; i++) {
+    if (prDesc->prGuards[i] == oldGuard) {
+      prDesc->prGuards[i] = newGuard;
+      return;
+    }
+  }
+
+  prDesc->errCode = prUndefGuard;
+}
diff --git a/FwProfile/src/FwPrConfig.h b/FwProfile/src/FwPrConfig.h
new file mode 100644
index 0000000..90e9402
--- /dev/null
+++ b/FwProfile/src/FwPrConfig.h
@@ -0,0 +1,459 @@
+/**
+ * @file
+ * @ingroup prGroup
+ * Declaration of the configuration interface for a FW Procedure.
+ * A FW Procedure is described by a procedure descriptor.
+ * The functions declared in this interface allow a procedure descriptor
+ * to be configured.
+ * During the configuration process, the action nodes, the decision nodes and
+ * the control flows of the procedure are defined.
+ *
+ * There are two types of procedures: newly created procedures
+ * (i.e. procedures which are created from scratch using <code>::FwPrCreate</code>
+ * or <code>#FW_PR_INST</code>) and derived procedures (i.e. procedures
+ * which are created by extending another procedure through calls
+ * to <code>::FwPrCreateDer</code> or <code>#FW_PR_INST_DER</code>).
+ * The functions declared in this header file can be used to configure both types
+ * of procedures.
+ *
+ * In the case of a newly created procedure, the mode of use of the
+ * functions in this header file is as follows:
+ * -# The action nodes of the procedure are added to its descriptor with
+ *    the <code>::FwPrAddActionNode</code> function.
+ * -# The decision nodes of the procedure are added to its
+ *    descriptor with the <code>::FwPrAddDecisionNode</code> function.
+ * -# The control flows of the procedures are added to the procedure
+ *    with the <code>FwPrAddFlow*</code> functions (there are several of these
+ *    functions, one for each type of control flow source and destination).
+ * -# The pointer to the procedure data in the procedure descriptor
+ *    is set with the <code>::FwPrSetData</code> function.
+ * -# The consistency and completeness of the procedure configuration may
+ *    optionally be verified with function <code>::FwPrCheck</code>.
+ * .
+ * The only constraint on the order in which the above functions are called is
+ * that a control flow from an action node or decision node can only be defined
+ * after the source action node or decision node has been defined.
+ *
+ * In the case of a derived procedure, the mode of use of the functions
+ * declared in this header file is as follows:
+ * -# An action can be overridden
+ *    with the <code>::FwPrOverrideAction</code> function.
+ * -# A guard can be overridden with the <code>::FwPrOverrideGuard</code> function.
+ * -# The consistency and completeness of the configuration of the derived
+ *    procedure may optionally be verified with function <code>::FwPrCheck</code>.
+ * .
+ * There are no constraints on the order in which the above functions are
+ * called.
+ *
+ * Error handling is done as follows:
+ * - Errors are reported through error codes. The range of error codes is
+ *   defined in header file <code>FwPrConstant.h</code>. The error code is
+ *   stored in the procedure descriptor (see <code>::FwPrGetErrCode</code>).
+ * - If an illegal input value could cause a corruption of the internal data
+ *   structures of a procedure descriptor, a check is performed on the
+ *   input parameter value and the function is aborted if this is found to be
+ *   illegal.
+ * - When a function takes a procedure descriptor as an argument, no
+ *   check is performed that the argument is non-NULL and valid (e.g. if
+ *   a configuration function is called with a NULL value for the procedure
+ *   descriptor argument, this error is not handled and the call
+ *   will probably result in a segmentation fault).
+ * .
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef FWPR_CONFIG_H_
+#define FWPR_CONFIG_H_
+
+#include "FwPrConstants.h"
+
+/**
+ * Set the pointer to the procedure data in the procedure descriptor.
+ * The procedure data are data which are manipulated by the procedure
+ * actions and guards.
+ * The procedure descriptor holds a pointer to the procedure data.
+ * This function allows this pointer to be defined.
+ * The exact type of the procedure data is defined by applications for each
+ * procedure.
+ * It is therefore unknown at the level of the procedure module.
+ * This function accordingly treats the pointer to the procedure data as a
+ * pointer to <code>void</code>.
+ * In most cases, the procedure data will take the form of a <code>struct</code>
+ * whose fields represent the inputs and outputs for the procedure actions
+ * and guards.
+ *
+ * The functions which implement the actions and guards access the procedure
+ * data as follows:
+ * - The functions implementing the actions and guards of a procedure
+ *   take the procedure descriptor as an argument (because they must conform
+ *   to the prototype defined by <code>::FwPrAction_t</code> and
+ *   <code>::FwPrGuard_t</code>).
+ * - The functions implementing the actions and guards of a procedure
+ *   use the <code>::FwPrGetData</code> function to retrieve the pointer to the
+ *   procedure data.
+ * - The pointer returned by <code>::FwPrGetData</code> is defined as a pointer
+ *   to <code>void</code> and will normally have to be cast to its true type.
+ * .
+ * @param prDesc the descriptor of the procedure to which the data structure is attached.
+ * @param prData the pointer to the procedure data.
+ * A value of NULL is legal (but note that the default value of the pointer to the
+ * procedure data when the procedure is created is NULL).
+ */
+void FwPrSetData(FwPrDesc_t prDesc, void* prData);
+
+/**
+ * Get the pointer to the procedure data in the procedure descriptor.
+ * This function returns the pointer which was set with the
+ * <code>::FwPrSetData</code> function.
+ * This function is normally used by the functions implementing a procedure
+ * action or guard to access the procedure data.
+ * See the description of the <code>::FwPrSetData</code> function for more details.
+ * @param prDesc the descriptor of the procedure to which the data structure is attached.
+ * @return the pointer to the procedure data or NULL if no procedure data
+ * were defined for the procedure.
+ */
+void* FwPrGetData(FwPrDesc_t prDesc);
+
+/**
+ * Create an action node with the given characteristics and add it to a procedure.
+ * This function reports the following errors in the error code of the procedure
+ * descriptor:
+ * - #prIllActNodeId: illegal value of the action node identifier
+ * - #prActNodeIdInUse: an action node with this identifier has already been defined
+ * - #prTooManyOutFlows: there is no space left in the procedure descriptor for the
+ *   out-going control flow of this node
+ * - #prTooManyActions: there is no space left in the procedure descriptor for the
+ *   action of this node
+ * - #prNullAction: the action associated to this node is a NULL pointer
+ * .
+ * @param prDesc the procedure to which the action node is added.
+ * @param nodeId the identifier of the action node to be added
+ * (an integer in the range [1,N] where N is the number of action nodes in the procedure).
+ * @param action the action for the new action node (a function pointer).
+ */
+void FwPrAddActionNode(FwPrDesc_t prDesc, FwPrCounterS1_t nodeId, FwPrAction_t action);
+
+/**
+ * Create a decision node with the given characteristics and add it to a procedure.
+ * This function reports the following errors in the error code of the procedure
+ * descriptor:
+ * - #prIllDecNodeId: illegal identifier for the decision node
+ * - #prDecNodeIdInUse: a decision node with this identifier has already been defined
+ * - #prIllNOfOutFlows: the number of out-going control flows is smaller than 2
+ * - #prTooManyOutFlows: the decision node adds too many out-going control flows
+ * .
+ * @param prDesc the descriptor of the procedure to which the decision node is added.
+ * @param nodeId the identifier of the decision node to be added (an integer
+ * in the range [1,N] where N is the number of decision nodes).
+ * @param nOfOutFlows the number of outgoing control flows from the new action node (a positive
+ * integer greater than 1).
+ */
+void FwPrAddDecisionNode(FwPrDesc_t prDesc, FwPrCounterS1_t nodeId, FwPrCounterS1_t nOfOutFlows);
+
+/**
+ * Create a control flow from the initial node to an action node and add it
+ * to a procedure.
+ * This function reports the following errors in the error code of the procedure
+ * descriptor:
+ * - #prTooManyFlows: there is no space left in the control flow array of the procedure
+ *   descriptor for this control flow
+ * - #prTooManyGuards: there is no space left in the guard array of the procedure
+ *   descriptor for the guard defined by this control flow
+ * .
+ * @param prDesc the descriptor of the procedure to which the control flow is added.
+ * @param destId the identifier of the destination action node of the control flow (an integer in the
+ * range [1,N] where N is the number of action nodes).
+ * @param cfGuard the control flow guard (a function pointer) or NULL if no guard is attached to this
+ * control flow.
+ */
+void FwPrAddFlowIniToAct(FwPrDesc_t prDesc, FwPrCounterS1_t destId, FwPrGuard_t cfGuard);
+
+/**
+ * Create a control flow from the initial node to a decision node and add
+ * it to a procedure.
+ * This function reports the following errors in the error code of the procedure
+ * descriptor:
+ * - #prTooManyFlows: there is no space left in the control flow array of the procedure
+ *   descriptor for this control flow
+ * - #prTooManyGuards: there is no space left in the guard array of the procedure
+ *   descriptor for the guard defined by this control flow
+ * .
+ * @param prDesc the descriptor of the procedure to which the control flow is added.
+ * @param destId the identifier of the destination decision node of the control flow (an
+ * integer in the range [1,N] where N is the number of decision nodes).
+ * @param cfGuard the control flow guard (a function pointer) or NULL if no guard is attached to this
+ * control flow.
+ */
+void FwPrAddFlowIniToDec(FwPrDesc_t prDesc, FwPrCounterS1_t destId, FwPrGuard_t cfGuard);
+
+/**
+ * Create a control flow from an action node to another action node and add it
+ * to a procedure.
+ * This function should only be performed after the source action node of the control flow
+ * has been added to the procedure.
+ * This function reports the following errors in the error code of the procedure
+ * descriptor:
+ * - #prIllFlowSrc: the identifier of the source of this control flow has an illegal value
+ * - #prUndefinedFlowSrc: the source of this control flow has not yet been added to the procedure
+ * - #prTooManyFlows: there is no space left in the control flow array of the procedure
+ *   descriptor for this control flow
+ * - #prTooManyGuards: there is no space left in the guard array of the procedure
+ *   descriptor for the guard defined by this control flow
+ * .
+ * @param prDesc the descriptor of the procedure to which the control flow is added.
+ * @param srcId the identifier of the source action node of the control flow (an integer in the range
+ * [1,N] where N is the number of action nodes).
+ * @param destId the identifier of the destination action node of the control flow (an integer
+ * in the range [1,N] where N is the number of action nodes).
+ * @param cfGuard the control flow guard (a function pointer) or NULL if no guard is attached to this
+ * control flow.
+ */
+void FwPrAddFlowActToAct(FwPrDesc_t prDesc, FwPrCounterS1_t srcId, FwPrCounterS1_t destId, FwPrGuard_t cfGuard);
+
+/**
+ * Create a control flow from an action node to a decision node and add it to a procedure.
+ * This function should only be performed after the source action node of the control flow
+ * has been added to the action node procedure.
+ * This function reports the following errors in the error code of the procedure
+ * descriptor:
+ * - #prIllFlowSrc: the identifier of the source of this control flow has an illegal value
+ * - #prUndefinedFlowSrc: the source of this control flow has not yet been added to the procedure
+ * - #prTooManyFlows: there is no space left in the control flow array of the procedure
+ *   descriptor for this control flow
+ * - #prTooManyGuards: there is no space left in the guard array of the procedure
+ *   descriptor for the guard defined by this control flow
+ * .
+ * @param prDesc the descriptor of the procedure to which the control flow is added.
+ * @param srcId the identifier of the source action node of the control flow (an integer in the range
+ * [1,N] where N is the number of action nodes)
+ * @param destId the identifier of the destination decision node of the control flow (an integer
+ * in the range [1,M] where M is the number of decision nodes)
+ * @param cfGuard the control flow guard (a function pointer) or NULL if no guard is attached to this
+ * control flow.
+ */
+void FwPrAddFlowActToDec(FwPrDesc_t prDesc, FwPrCounterS1_t srcId, FwPrCounterS1_t destId, FwPrGuard_t cfGuard);
+
+/**
+ * Create a control flow from a decision node to an action node and add it to a procedure.
+ * This function should only be performed after the source of the control flow has been added
+ * to the action node procedure.
+ * This function reports the following errors in the error code of the procedure
+ * descriptor:
+ * - #prIllFlowSrc: the identifier of the source of this control flow has an illegal value
+ * - #prUndefinedFlowSrc: the source of this control flow has not yet been added to the procedure
+ * - #prTooManyFlows: there is no space left in the control flow array of the procedure
+ *   descriptor for this control flow
+ * - #prTooManyGuards: there is no space left in the guard array of the procedure
+ *   descriptor for the guard defined by this control flow
+ * .
+ * @param prDesc the descriptor of the procedure to which the control flow is added.
+ * @param srcId the identifier of the source decision node of the control flow (an integer
+ * in the range [1,N] where N is the number of decision nodes).
+ * @param destId the identifier of the destination action node of the control flow (an integer in the range
+ * [1,N] where N is the number of action nodes).
+ * @param cfGuard the control flow guard (a function pointer) or NULL if no guard is attached to this
+ * control flow.
+ */
+void FwPrAddFlowDecToAct(FwPrDesc_t prDesc, FwPrCounterS1_t srcId, FwPrCounterS1_t destId, FwPrGuard_t cfGuard);
+
+/**
+ * Create a control flow from a decision node to another decision node and add it to a procedure.
+ * This function should only be performed after the source of the control flow has been added
+ * to the action node procedure.
+ * This function reports the following errors in the error code of the procedure
+ * descriptor:
+ * - #prIllFlowSrc: the identifier of the source of this control flow has an illegal value
+ * - #prUndefinedFlowSrc: the source of this control flow has not yet been added to the procedure
+ * - #prTooManyFlows: there is no space left in the control flow array of the procedure
+ *   descriptor for this control flow
+ * - #prTooManyGuards: there is no space left in the guard array of the procedure
+ *   descriptor for the guard defined by this control flow
+ * .
+ * @param prDesc the descriptor of the procedure to which the control flow is added.
+ * @param srcId the identifier of the source decision node of the control flow (an integer
+ * in the range [1,N] where N is the number of decision nodes).
+ * @param destId the identifier of the destination decision node of the control flow (an integer in the range
+ * [1,N] where N is the number of decision nodes).
+ * @param cfGuard the control flow guard (a function pointer) or NULL if no guard is attached to this
+ * control flow.
+ */
+void FwPrAddFlowDecToDec(FwPrDesc_t prDesc, FwPrCounterS1_t srcId, FwPrCounterS1_t destId, FwPrGuard_t cfGuard);
+
+/**
+ * Create a control flow from an action node to the final node and add it to a procedure.
+ * This function should only be performed after the source action node of the control flow
+ * has been added to the action node procedure.
+ * This function reports the following errors in the error code of the procedure
+ * descriptor:
+ * - #prIllFlowSrc: the identifier of the source of this control flow has an illegal value
+ * - #prUndefinedFlowSrc: the source of this control flow has not yet been added to the procedure
+ * - #prTooManyFlows: there is no space left in the control flow array of the procedure
+ *   descriptor for this control flow
+ * - #prTooManyGuards: there is no space left in the guard array of the procedure
+ *   descriptor for the guard defined by this control flow
+ * .
+ * @param prDesc the descriptor of the procedure to which the control flow is added.
+ * @param srcId the identifier of the source action node of the control flow (an integer in the range
+ * [1,N] where N is the number of action nodes).
+ * @param cfGuard the control flow guard (a function pointer) or NULL if no guard is attached to this
+ * control flow.
+ */
+void FwPrAddFlowActToFin(FwPrDesc_t prDesc, FwPrCounterS1_t srcId, FwPrGuard_t cfGuard);
+
+/**
+ * Create a control flow from a decision node to the final node and add it to a procedure.
+ * This function should only be performed after the source action node of the control flow
+ * has been added to the action node procedure.
+ * This function reports the following errors in the error code of the procedure
+ * descriptor:
+ * - #prIllFlowSrc: the identifier of the source of this control flow has an illegal value
+ * - #prUndefinedFlowSrc: the source of this control flow has not yet been added to the procedure
+ * - #prTooManyFlows: there is no space left in the control flow array of the procedure
+ *   descriptor for this control flow
+ * - #prTooManyGuards: there is no space left in the guard array of the procedure
+ *   descriptor for the guard defined by this control flow
+ * .
+ * @param prDesc the descriptor of the procedure to which the control flow is added.
+ * @param srcId the identifier of the source action node of the control flow (an integer in the range
+ * [1,N] where N is the number of action nodes).
+ * @param cfGuard the control flow guard (a function pointer) or NULL if no guard is attached to this
+ * control flow.
+ */
+void FwPrAddFlowDecToFin(FwPrDesc_t prDesc, FwPrCounterS1_t srcId, FwPrGuard_t cfGuard);
+
+/**
+ * Check the correctness and completeness of the configuration of a procedure descriptor.
+ * This function may be called on a procedure descriptor after it has been created and
+ * configured.
+ * This function does not modify the configuration of the procedure.
+ * It checks the error conditions which may arise when an application configures a
+ * procedure using the configuration functions declared in this header file.
+ * More specifically, this function performs the following checks:
+ * -# Check that no configuration errors have occurred (i.e. check that the error code
+ *    in the procedure descriptor is equal to: <code>::prSuccess</code>).
+ * -# Check that all action nodes have been defined.
+ * -# Check that all decision nodes have been defined.
+ * -# Check that all control flows have been defined.
+ * -# Check that the destinations of the control flows out of a action node represent
+ *    legal entities.
+ * -# Check that the destinations of the control flows out of a decision node represent
+ *    legal entities.
+ * -# Check that the number of actions declared when the procedure was created is the same
+ *    as the number of actions defined during the procedure configuration process.
+ * -# Check that the number of guards declared when the procedure was created is the same
+ *    as the number of guards defined during the procedure configuration process.
+ * -# Check that all action nodes are reachable (i.e. they are a destination for a
+ *    control flow).
+ * -# Check that all decision nodes are reachable (i.e. they are a destination for a
+ *    control flow).
+ * .
+ * Note that there are configuration errors which are not covered by this function because
+ * they cannot occur if the procedure is configured using the functions declared in
+ * this header file.
+ * @param prDesc the descriptor of the procedure to be checked.
+ * @return the outcome of the check. The outcome of the check is one of the following:
+ * - #prSuccess: all checks have been passed.
+ * - #prConfigErr: check 1 has failed.
+ * - #prNullActNode: check 2 has failed.
+ * - #prNullDecNode: check 3 has failed.
+ * - #prNullFlow: check 4 has failed.
+ * - #prIllegalADest: check 5 has failed
+ * - #prIllegalDDest: check 6 has failed
+ * - #prTooFewActions: check 7 has failed
+ * - #prTooFewGuards: check 8 has failed
+ * - #prUnreachableANode: check 9 has failed
+ * - #prUnreachableDNode: check 10 has failed
+ * .
+ * This function returns when it encounters the first error. Hence, the function return value
+ * is determined by the first error encountered by the function.
+ */
+FwPrErrCode_t FwPrCheck(FwPrDesc_t prDesc);
+
+/**
+ * Override an action in a derived procedure.
+ * By default a derived procedure has the same actions as the base procedure
+ * from which it was derived.
+ * This function overrides one of the actions of the derived procedure.
+ *
+ * As an example consider the case of a base procedure B and suppose that action
+ * a1 is attached to node S1 and node S2.
+ * If an application creates a derived procedure D from B (for instance, through
+ * function <code>::FwPrCreateDer</code>), then, after creation, the action of
+ * action nodes S1 and S2 in procedure D is still a1.
+ * This function can be used to change a1.
+ * Note that a single invocation of this function will change the action of both
+ * S1 and S2.
+ *
+ * If an attempt is made to override a non-existent action, an error is declared
+ * and the function returns without doing anything.
+ *
+ * The override mechanism is only available for derived procedures.
+ * If this function is called on a procedure which was not derived by extending
+ * some other procedure, an error is declared.
+ *
+ * This function reports the following errors in the error code of the procedure
+ * descriptor:
+ * - #prUndefAction: the action to be overridden does not exist
+ * - #prNotDerivedPr: the procedure is not a derived procedure
+ * .
+ * @param prDesc the descriptor of the derived procedure.
+ * @param oldAction the action to be overridden
+ * @param newAction the new action which overrides the old action
+ */
+void FwPrOverrideAction(FwPrDesc_t prDesc, FwPrAction_t oldAction, FwPrAction_t newAction);
+
+/**
+ * Override a guard in a derived procedure.
+ * By default a derived procedure has the same guards as the base procedure
+ * from which it was derived.
+ * This function overrides one of the guards of the derived procedure.
+ *
+ * As an example consider the case of a base procedure B and suppose that
+ * the control flows F1 and F2 both have the same guard g1.
+ * If an application creates a derived procedure D from B (for instance, through
+ * function <code>::FwPrCreateDer</code>), then, after creation, the guard of the
+ * control flows F1 and F2 in D is still g1.
+ * This function can be used to change g1.
+ * Note that a single invocation of this function will change the guard on both
+ * control flows.
+ *
+ * If an attempt is made to override a non-existent guard, the function declares
+ * an error and returns.
+ *
+ * The override mechanism is only available for derived procedures.
+ * If this function is called on a procedure which was not derived by extending
+ * some other procedure, an error is declared.
+ *
+ * This function reports the following errors in the error code of the procedure
+ * descriptor:
+ * - #prUndefGuard: the guard to be overridden does not exist
+ * - #prNotDerivedPr: the procedure is not a derived procedure
+ * .
+ * @param prDesc the descriptor of the derived procedure.
+ * @param oldGuard the guard to be overridden
+ * @param newGuard the new guard which overrides the old guard
+ */
+void FwPrOverrideGuard(FwPrDesc_t prDesc, FwPrGuard_t oldGuard, FwPrGuard_t newGuard);
+
+#endif /* FWPR_CONFIG_H_ */
diff --git a/FwProfile/src/FwPrConstants.h b/FwProfile/src/FwPrConstants.h
new file mode 100644
index 0000000..a426809
--- /dev/null
+++ b/FwProfile/src/FwPrConstants.h
@@ -0,0 +1,227 @@
+/**
+ * @file
+ * @ingroup prGroup
+ * Header file to define all constants and types for the procedure
+ * module of the FW Profile.
+ * This header file should be included by all applications which use the
+ * procedure module of the FW Profile.
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef FWPR_CONSTANTS_H_
+#define FWPR_CONSTANTS_H_
+
+/**
+ * Forward declaration for the pointer to a procedure descriptor.
+ * A procedure descriptor is a data structure which holds all the information
+ * describing a procedure instance.
+ * Users only manipulate the pointer to the procedure descriptor. The internal
+ * definition of the procedure descriptor (see <code>FwPrPrivate.h</code>) is
+ * kept hidden from users.
+ */
+typedef struct FwPrDesc* FwPrDesc_t;
+
+/**
+ * Type for a pointer to a procedure action.
+ * A procedure action is a function which encapsulates an action of a
+ * procedure node.
+ * A procedure action takes the descriptor of the procedure as an argument.
+ *
+ * Pointers to procedure actions are used when a new procedure is defined:
+ * all the actions in the procedure must be defined as functions which conform
+ * to the <code>FwPrAction_t</code> prototype and are loaded into the procedure
+ * as function pointers.
+ */
+typedef void (*FwPrAction_t)(FwPrDesc_t);
+
+/** Type used for booleans (0 is "false" and 1 is "true"). */
+typedef int FwPrBool_t;
+
+/**
+ * Type for a pointer to a procedure guard.
+ * A procedure guard is a function which encapsulates a transition guard in a
+ * procedure.
+ * The procedure guard takes the descriptor of the procedure as an argument
+ * and it returns 0 to signify that the guard is false or a non-zero value
+ * (typically 1) to signify that the guard is true.
+ *
+ * Pointers to procedure guards are used when a new procedure is defined:
+ * all the guards in the procedure must be defined as functions which conform
+ * to the <code>FwPrGuard_t</code> prototype and are loaded into the procedure
+ * as function pointers.
+ */
+typedef FwPrBool_t (*FwPrGuard_t)(FwPrDesc_t);
+
+/** Type used for unsigned counters with a "short" range. */
+typedef unsigned char FwPrCounterU1_t;
+
+/** Type used for unsigned counters with a "medium" range. */
+typedef unsigned short int FwPrCounterU2_t;
+
+/** Type used for unsigned counters with a "long" range. */
+typedef unsigned int FwPrCounterU3_t;
+
+/** Type used for unsigned counters with a "long int" range. */
+typedef long unsigned int FwPrCounterU4_t;
+
+/** Type used for signed counters with a "short" range. */
+typedef signed char FwPrCounterS1_t;
+
+/** Error codes and function return codes for the procedure functions. */
+typedef enum {
+  /**
+   * Return codes of a function which has completed execution without errors.
+   */
+  prSuccess = 1,
+  /**
+   * A call to <code>malloc</code> has failed (it has returned a NULL pointer).
+   */
+  prOutOfMemory = 2,
+  /**
+   * The number of actions in the base procedure is not the same as in the derived
+   * procedure.
+   */
+  prWrongNOfActions = 3,
+  /**
+   * The number of guards in the base procedure is not the same as in the derived
+   * procedure.
+   */
+  prWrongNOfGuards = 4,
+  /**
+   * An action node is added to a procedure with an illegal (out-of-range) identifier.
+   */
+  prIllActNodeId = 5,
+  /**
+   * An action node is added twice to the same procedure.
+   */
+  prActNodeIdInUse = 6,
+  /**
+   * A decision node is added to a procedure with an illegal (out-of-range) identifier.
+   */
+  prIllDecNodeId = 7,
+  /**
+   * A decision node is added twice to the same procedure.
+   */
+  prDecNodeIdInUse = 8,
+  /**
+   * The number of actions added to the procedure exceeds the number of actions declared
+   * when the procedure descriptor was created.
+   */
+  prTooManyActions = 9,
+  /**
+   * The number of guards added to the procedure exceeds the number of guards declared
+   * when the procedure descriptor was created.
+   */
+  prTooManyGuards = 10,
+  /**
+   * An action node is defined with a null action.
+   */
+  prNullAction = 11,
+  /**
+   * A node is added to a procedure which has more
+   * out-going transitions than fit into the control flow array of the procedure descriptor.
+   */
+  prTooManyOutFlows = 12,
+  /**
+   * A choice pseudo-state is added to a procedure with less than 2 out-going control flows.
+   */
+  prIllNOfOutFlows = 13,
+  /**
+   * A control flow from a certain source is added
+   * to a procedure but there isn't space for it in the control flow array of the
+   * procedure descriptor.
+   */
+  prTooManyFlows = 14,
+  /**
+   * A control flow is added to a SM with a source which has an illegal value.
+   */
+  prIllFlowSrc = 15,
+  /**
+   * A configuration error has been detected during the procedure configuration process.
+   */
+  prConfigErr = 16,
+  /**
+   * There is an undefined action node in a procedure.
+   */
+  prNullActNode = 17,
+  /**
+   * There is an undefined decision node in a procedure.
+   */
+  prNullDecNode = 18,
+  /**
+   * There is an undefined control flow in a procedure.
+   */
+  prNullFlow = 19,
+  /**
+   * A control flow is added to a procedure with a source (either a state or a source
+   * choice pseudo-state) which has not yet been defined.
+   */
+  prUndefinedFlowSrc = 20,
+  /**
+   * A control flow is added to a procedure with an illegal (out-of-range) action node destination.
+   */
+  prIllegalADest = 21,
+  /**
+   * A control flow is added to a procedure with an illegal (out-of-range) decision node destination.
+   */
+  prIllegalDDest = 22,
+  /**
+   * The number of actions added to the procedure is smaller than the number of actions declared
+   * when the procedure descriptor was created.
+   */
+  prTooFewActions = 23,
+  /**
+   * The number of guards added to the procedure is smaller than the number of guards declared
+   * when the procedure descriptor was created.
+   */
+  prTooFewGuards = 24,
+  /**
+   * An error was encountered while executing a transition in a procedure (see
+   * <code>::FwPrExecute</code>).
+   */
+  prFlowErr = 25,
+  /**
+   * The overridden action in a derived procedure does not exist.
+   */
+  prUndefAction = 26,
+  /**
+   * The overridden guard in a derived procedure does not exist.
+   */
+  prUndefGuard = 27,
+  /**
+   * The procedure where an action or a guard is overridden or a procedure is embedded
+   * is not a derived procedure.
+   */
+  prNotDerivedPr = 28,
+  /**
+   * The procedure has an action node which is not a destination of any control flow
+   */
+  prUnreachableANode = 29,
+  /**
+   * The procedure has a decision node which is not a destination of any control flow
+   */
+  prUnreachableDNode = 30
+} FwPrErrCode_t;
+
+#endif /* FWPR_CONSTANTS_H_ */
diff --git a/FwProfile/src/FwPrCore.c b/FwProfile/src/FwPrCore.c
new file mode 100644
index 0000000..b164c37
--- /dev/null
+++ b/FwProfile/src/FwPrCore.c
@@ -0,0 +1,154 @@
+/**
+ * @file
+ * @ingroup prGroup
+ * Implements Core Functions of the FW Procedure.
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include "FwPrCore.h"
+#include "FwPrPrivate.h"
+#include <stdlib.h>
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrBool_t PrDummyGuard(FwPrDesc_t prDesc) {
+  (void)(prDesc);
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwPrStart(FwPrDesc_t prDesc) {
+  if (prDesc->curNode == 0) {
+    prDesc->curNode     = -1;
+    prDesc->prExecCnt   = 0;
+    prDesc->nodeExecCnt = 0;
+  }
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwPrStop(FwPrDesc_t prDesc) {
+  prDesc->curNode = 0;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwPrExecute(FwPrDesc_t prDesc) {
+  PrANode_t*      curNode;
+  PrDNode_t*      decNode;
+  PrFlow_t*       flow;
+  FwPrCounterS1_t i;
+  PrBaseDesc_t*   prBase = prDesc->prBase;
+  FwPrCounterS1_t trueGuardFound;
+
+  /* check if procedure is started */
+  if (prDesc->curNode == 0) { /* procedure is stopped */
+    return;
+  }
+
+  prDesc->prExecCnt++;   /* Increment procedure execution counter */
+  prDesc->nodeExecCnt++; /* Increment node execution counter */
+
+  /* Get the Control Flow issuing from the current node */
+  if (prDesc->curNode == -1) { /* procedure is at initial node */
+    flow = &(prBase->flows[0]);
+  }
+  else {
+    curNode = &(prBase->aNodes[prDesc->curNode - 1]); /* procedure is at an action node */
+    flow    = &(prBase->flows[curNode->iFlow]);
+  }
+
+  /* Evaluate guard of control flow issuing from current node */
+  trueGuardFound = (FwPrCounterS1_t)prDesc->prGuards[flow->iGuard](prDesc);
+
+  /* Execute loop as long as guard of control flow issuing from current node is true */
+  while (trueGuardFound) {
+    /* Target of flow is a final node */
+    if (flow->dest == 0) {
+      prDesc->curNode = 0; /* Stop procedure */
+      return;
+    }
+
+    if (flow->dest > 0) { /* Target of control flow is an action node */
+      prDesc->curNode     = flow->dest;
+      prDesc->nodeExecCnt = 0;
+      curNode             = &(prBase->aNodes[(prDesc->curNode) - 1]);
+      prDesc->prActions[curNode->iAction](prDesc);
+      flow           = &(prBase->flows[curNode->iFlow]);
+      trueGuardFound = (FwPrCounterS1_t)prDesc->prGuards[flow->iGuard](prDesc);
+    }
+    else { /* Target of flow is a decision node */
+      trueGuardFound = 0;
+      decNode        = &(prBase->dNodes[(-flow->dest) - 1]);
+      /* Evaluate guards of control flows issuing from decision node */
+      for (i = 0; i < decNode->nOfOutTrans; i++) {
+        flow = &(prBase->flows[decNode->outFlowIndex + i]);
+        if (prDesc->prGuards[flow->iGuard](prDesc) != 0) {
+          trueGuardFound = 1;
+          break; /* First control flow out of dec. node with true guard */
+        }
+      }
+      /* All control flows out of decision node have false guards */
+      if (trueGuardFound == 0) {
+        prDesc->errCode = prFlowErr;
+        return;
+      }
+    }
+  }
+  return;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwPrRun(FwPrDesc_t prDesc) {
+  FwPrStart(prDesc);
+  FwPrExecute(prDesc);
+  FwPrStop(prDesc);
+  return;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrCounterS1_t FwPrGetCurNode(FwPrDesc_t prDesc) {
+  return prDesc->curNode;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrBool_t FwPrIsStarted(FwPrDesc_t prDesc) {
+  if (prDesc->curNode == 0) {
+    return 0;
+  }
+
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrErrCode_t FwPrGetErrCode(FwPrDesc_t prDesc) {
+  return prDesc->errCode;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrCounterU3_t FwPrGetExecCnt(FwPrDesc_t prDesc) {
+  return prDesc->prExecCnt;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrCounterU3_t FwPrGetNodeExecCnt(FwPrDesc_t prDesc) {
+  return prDesc->nodeExecCnt;
+}
diff --git a/FwProfile/src/FwPrCore.h b/FwProfile/src/FwPrCore.h
new file mode 100644
index 0000000..c140054
--- /dev/null
+++ b/FwProfile/src/FwPrCore.h
@@ -0,0 +1,163 @@
+/**
+ * @file
+ * @ingroup prGroup
+ * Declaration of the execution interface for a FW Procedure.
+ * The execution interface offers the functions to start and stop
+ * a procedure and to execute a procedure.
+ * The functions declared in this header file, take a procedure descriptor
+ * as their first argument.
+ * This represents the procedure upon which the functions operate.
+ *
+ * The functions declared in this header file can only be used after a
+ * procedure has been fully configured.
+ * This is normally done using the configuration functions declared
+ * in <code>FwPrConfig.h</code>.
+ * The basic mode of use of the functions declared in this file is as follows:
+ * -# The procedure is started with function <code>::FwPrStart</code>.
+ * -# The procedure is executed with function
+ *    <code>::FwPrExecute</code>.
+ * -# The procedure is stopped with function <code>::FwPrStop</code>.
+ * .
+ *
+ * The functions declared in this header file assume that they are passed
+ * a valid procedure descriptor representing a correctly configured
+ * procedure.
+ * Failure to comply with this assumption will result in undefined
+ * behaviour.
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef FWPR_CORE_H_
+#define FWPR_CORE_H_
+
+#include "FwPrConstants.h"
+
+/**
+ * Start a procedure. The semantics of this operation is defined by the activity
+ * diagram of the following figure
+ * (this is figure 3.3-1 in the "FW Profile Definition Document"):
+ * @image html PR_StartStop.png
+ * @param prDesc the descriptor of the procedure to be started.
+ */
+void FwPrStart(FwPrDesc_t prDesc);
+
+/**
+ * Stop a procedure. The semantics of this operation is defined by the activity
+ * diagram of the following figure
+ * (this is figure 3.3-1 in the "FW Profile Definition Document"):
+ * @image html SM_StartStop.png
+ * @param prDesc the descriptor of the procedure to be started.
+ */
+void FwPrStop(FwPrDesc_t prDesc);
+
+/**
+ * Execute a procedure. The semantics of this function is defined
+ * by the following activity diagram (this is taken from figure 3.3-2 in the "FW Profile
+ * Definition Document"):
+ * @image html PR_Execution.png
+ *
+ * If the execution of the procedure passes through a decision node and there are two
+ * or more control flows out of that node which have guards which evaluate to true,
+ * the control flow to be taken is the one which was added first to the procedure.
+ *
+ * The FW Profile stipulates that at least one of the control flows out of a
+ * decision node must have a guard evaluating to true. This constraint is not enforced
+ * by this function.
+ * However, if the constraint is violated, the error code is set to
+ * <code>#prFlowErr</code>.
+ * The procedure, however, remains in a consistent state.
+ * @param prDesc the descriptor of the procedure where the transition is triggered.
+ */
+void FwPrExecute(FwPrDesc_t prDesc);
+
+/**
+ * Run a procedure.
+ * When a procedure is run, the procedure is first started, then it is executed
+ * once, and then it is stopped.
+ * @param prDesc the descriptor of the procedure where the transition is triggered.
+ */
+void FwPrRun(FwPrDesc_t prDesc);
+
+/**
+ * Return the identifier of the current action node in a procedure.
+ * The following convention is used:
+ * - If the procedure is in the STOPPED state, this function returns 0.
+ * - If the procedure is in the STARTED state but has not yet executed
+ *   any action (either because the procedure has not yet been executed or because it
+ *   has been executed but the guard from the initial node is false),
+ *   this function returns -1.
+ * - If the procedure is in the STARTED state and has already left the
+ *   initial node, the procedure returns the identifier of the current node
+ *   (a positive integer).
+ * .
+ * @param prDesc the descriptor of the procedure.
+ * @return the identifier of the current action node of the procedure (or 0
+ * if the procedure is at the initial node, or -1 if the procedure is in the
+ * STOPPED state).
+ */
+FwPrCounterS1_t FwPrGetCurNode(FwPrDesc_t prDesc);
+
+/**
+ * Check whether the procedure is started.
+ * @param prDesc the descriptor of the procedure.
+ * @return 1 if the procedure is STARTED or 0 if it is STOPPED.
+ */
+FwPrBool_t FwPrIsStarted(FwPrDesc_t prDesc);
+
+/**
+ * Return the error code of the argument procedure.
+ * The error code of a procedure holds either <code>#prSuccess</code> if the
+ * procedure never encountered an error or else it holds the code of the last error
+ * encountered by the procedure.
+ * If the error code is different from <code>#prSuccess</code>, the behaviour of
+ * the procedure is undefined.
+ * @param prDesc the descriptor of the procedure.
+ * @return either <code>#prSuccess</code> or the code of the last error encountered
+ * by the procedure.
+ */
+FwPrErrCode_t FwPrGetErrCode(FwPrDesc_t prDesc);
+
+/**
+ * Return the Procedure Execution Counter.
+ * The Procedure Execution Counter holds the number of execution cycles since
+ * the procedure was started.
+ * Note that the Procedure Execution Counter is not reset when the procedure
+ * is stopped  (it is only reset when the procedure is started).
+ * @param prDesc the descriptor of the procedure.
+ * @return the value of the Procedure Execution Counter.
+ */
+FwPrCounterU3_t FwPrGetExecCnt(FwPrDesc_t prDesc);
+
+/**
+ * Return the Node Execution Counter.
+ * The Node Execution Counter holds the number of execution cycles since
+ * the current node was entered.
+ * Note that the Node Execution Counter is not reset when the procedure
+ * is stopped  (it is only reset when the procedure is started).
+ * @param prDesc the descriptor of the procedure.
+ * @return the value of the Node Execution Counter.
+ */
+FwPrCounterU3_t FwPrGetNodeExecCnt(FwPrDesc_t prDesc);
+
+#endif /* FWPR_CORE_H_ */
diff --git a/FwProfile/src/FwPrDCreate.c b/FwProfile/src/FwPrDCreate.c
new file mode 100644
index 0000000..bd718b4
--- /dev/null
+++ b/FwProfile/src/FwPrDCreate.c
@@ -0,0 +1,228 @@
+/**
+ * @file
+ * @ingroup prGroup
+ * Implements the dynamical creation functions for the FW Procedure Module.
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include "FwPrDCreate.h"
+#include "FwPrPrivate.h"
+#include <stdlib.h>
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t FwPrCreate(FwPrCounterS1_t nOfANodes, FwPrCounterS1_t nOfDNodes, FwPrCounterS1_t nOfFlows,
+                      FwPrCounterS1_t nOfActions, FwPrCounterS1_t nOfGuards) {
+
+  FwPrCounterS1_t i;
+  PrBaseDesc_t*   prBase;
+  FwPrDesc_t      prDesc;
+
+  if (nOfFlows < 2) {
+    return NULL;
+  }
+
+  if (nOfANodes < 1) {
+    return NULL;
+  }
+
+  if (nOfDNodes < 0) {
+    return NULL;
+  }
+
+  if (nOfActions < 1) {
+    return NULL;
+  }
+
+  if (nOfActions > nOfANodes) {
+    return NULL;
+  }
+
+  if (nOfGuards < 0) {
+    return NULL;
+  }
+
+  if (nOfGuards > nOfFlows) {
+    return NULL;
+  }
+
+  prDesc = (FwPrDesc_t)malloc(sizeof(struct FwPrDesc));
+  if (prDesc == NULL) {
+    return NULL;
+  }
+
+  prBase = (PrBaseDesc_t*)malloc(sizeof(PrBaseDesc_t));
+  if (prBase == NULL) {
+    return NULL;
+  }
+
+  prBase->aNodes = (PrANode_t*)malloc(((FwPrCounterU4_t)(nOfANodes)) * sizeof(PrANode_t));
+  if (prBase->aNodes == NULL) {
+    return NULL;
+  }
+  for (i = 0; i < nOfANodes; i++) {
+    prBase->aNodes[i].iFlow = -1;
+  }
+
+  if (nOfDNodes > 0) {
+    prBase->dNodes = (PrDNode_t*)malloc(((FwPrCounterU4_t)(nOfDNodes)) * sizeof(PrDNode_t));
+    if (prBase->dNodes == NULL) {
+      return NULL;
+    }
+    for (i = 0; i < nOfDNodes; i++) {
+      prBase->dNodes[i].outFlowIndex = -1;
+    }
+  }
+  else {
+    prBase->dNodes = NULL;
+  }
+
+  prBase->flows = (PrFlow_t*)malloc(((FwPrCounterU4_t)(nOfFlows)) * sizeof(PrFlow_t));
+  if (prBase->flows == NULL) {
+    return NULL;
+  }
+  for (i = 0; i < nOfFlows; i++) {
+    prBase->flows[i].iGuard = -1;
+  }
+
+  prDesc->prActions = (FwPrAction_t*)malloc(((FwPrCounterU4_t)(nOfActions)) * sizeof(FwPrAction_t));
+  if (prDesc->prActions == NULL) {
+    return NULL;
+  }
+  for (i = 0; i < nOfActions; i++) {
+    prDesc->prActions[i] = NULL;
+  }
+
+  prDesc->prGuards = (FwPrGuard_t*)malloc(((FwPrCounterU4_t)(nOfGuards + 1)) * sizeof(FwPrGuard_t));
+  if (prDesc->prGuards == NULL) {
+    return NULL;
+  }
+
+  for (i = 1; i <= nOfGuards; i++) {
+    prDesc->prGuards[i] = NULL;
+  }
+  prDesc->prGuards[0] = &PrDummyGuard;
+
+  prBase->nOfANodes   = nOfANodes;
+  prBase->nOfDNodes   = nOfDNodes;
+  prBase->nOfFlows    = nOfFlows;
+  prDesc->prBase      = prBase;
+  prDesc->curNode     = 0;
+  prDesc->prData      = NULL;
+  prDesc->flowCnt     = 1;
+  prDesc->nOfActions  = nOfActions;
+  prDesc->nOfGuards   = (FwPrCounterS1_t)(nOfGuards + 1);
+  prDesc->errCode     = prSuccess;
+  prDesc->nodeExecCnt = 0;
+  prDesc->prExecCnt   = 0;
+
+  return prDesc;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwPrDesc_t FwPrCreateDer(FwPrDesc_t prDesc) {
+  FwPrCounterS1_t i;
+  PrBaseDesc_t*   prBase = prDesc->prBase;
+  FwPrDesc_t      extPrDesc;
+
+  /* Create descriptor for derived SM */
+  extPrDesc = (FwPrDesc_t)malloc(sizeof(struct FwPrDesc));
+  if (extPrDesc == NULL) {
+    return NULL;
+  }
+
+  /* Create array of actions in the derived SM */
+  extPrDesc->prActions = (FwPrAction_t*)malloc(((FwPrCounterU4_t)(prDesc->nOfActions)) * sizeof(FwPrAction_t));
+  if (extPrDesc->prActions == NULL) {
+    return NULL;
+  }
+  for (i = 0; i < prDesc->nOfActions; i++) {
+    extPrDesc->prActions[i] = prDesc->prActions[i];
+  }
+
+  /* Create array of guards in the derived SM (NB: number of guards is guaranteed to be greater than 0 */
+  extPrDesc->prGuards = (FwPrGuard_t*)malloc(((FwPrCounterU4_t)(prDesc->nOfGuards)) * sizeof(FwPrGuard_t));
+  if (extPrDesc->prGuards == NULL) {
+    return NULL;
+  }
+  for (i = 0; i < prDesc->nOfGuards; i++) {
+    extPrDesc->prGuards[i] = prDesc->prGuards[i];
+  }
+
+  extPrDesc->prBase      = prBase;
+  extPrDesc->curNode     = 0;
+  extPrDesc->prData      = NULL;
+  extPrDesc->flowCnt     = 0;
+  extPrDesc->nOfActions  = prDesc->nOfActions;
+  extPrDesc->nOfGuards   = prDesc->nOfGuards;
+  extPrDesc->errCode     = prDesc->errCode;
+  extPrDesc->nodeExecCnt = 0;
+  extPrDesc->prExecCnt   = 0;
+
+  return extPrDesc;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwPrRelease(FwPrDesc_t prDesc) {
+  PrBaseDesc_t* prBase;
+
+  /* Release memory allocated to base descriptor (base descriptor is always allocated and
+   * hence it is not necessary to check whether it is non-NULL) */
+  prBase = prDesc->prBase;
+
+  /* Release memory allocated to action node array (this is guaranteed to have at least one entry
+   * since procedure are constrained to have at least one action node) */
+  free(prBase->aNodes);
+
+  /* Release memory allocated to decision node array (this may be empty) */
+  if (prBase->dNodes != NULL) {
+    free(prBase->dNodes);
+  }
+
+  /* Release pointer to transition array (note that the transition array is guaranteed to exist and to
+   * have at least one element, see operation FwPrCreate) */
+  free(prBase->flows);
+
+  /* Release memory allocated to base descriptor */
+  free(prDesc->prBase);
+
+  /* Release memory allocated to extension part of the state machine descriptor */
+  FwPrReleaseDer(prDesc);
+
+  return;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwPrReleaseDer(FwPrDesc_t prDesc) {
+
+  /* Release pointer to the action and guard arrays (note that both arrays are guaranteed to
+   * have non-zero length) */
+  free(prDesc->prActions);
+  free(prDesc->prGuards);
+
+  /* Release pointer to state machine descriptor */
+  free(prDesc);
+  prDesc = NULL;
+
+  return;
+}
diff --git a/FwProfile/src/FwPrDCreate.h b/FwProfile/src/FwPrDCreate.h
new file mode 100644
index 0000000..c4ab247
--- /dev/null
+++ b/FwProfile/src/FwPrDCreate.h
@@ -0,0 +1,196 @@
+/**
+ * @file
+ * @ingroup prGroup
+ * Declaration of the dynamical creation interface for a FW Procedure.
+ * A FW Procedure is described by a procedure descriptor.
+ * This interface declares the functions required to create and release
+ * a procedure descriptor dynamically.
+ * Dynamic creation and release of memory is done through calls to
+ * <code>malloc</code> and <code>free</code>.
+ *
+ * A procedure can be created in two ways:
+ * - It can be created from scratch, or
+ * - It can be created by extending an existing procedure.
+ * .
+ * The functions offered by this interface cover both creation of a new
+ * procedure descriptor from scratch (<code>::FwPrCreate</code>) and
+ * the extension of an existing procedure descriptor to create the
+ * descriptor for a derived procedure (<code>::FwPrCreateDer</code>).
+ *
+ * Both the creation and the extension functions create a new procedure
+ * descriptor and return a pointer to the newly created descriptor instance.
+ * The procedure descriptor returned by these functions is initialized
+ * (i.e. all its attributes have a well-defined value) but will normally
+ * need to be configured.
+ * Configuration can be done using the functions offered by
+ * <code>FwPrConfig.h</code>.
+ *
+ * The creation and the extension functions in this header file always check the
+ * success of calls to <code>malloc</code>.
+ * In case of failure, the caller aborts and returns a NULL pointer.
+ *
+ * Applications which do not wish to use dynamic memory allocation can
+ * create a procedure descriptor statically using the services offered
+ * by <code>FwPrSCreate.h</code>.
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef FWPR_DCREATE_H_
+#define FWPR_DCREATE_H_
+
+#include "FwPrConstants.h"
+
+/**
+ * Create a new procedure descriptor.
+ * This function creates the procedure descriptor and its internal data structures
+ * dynamically through calls to <code>malloc</code>.
+ * If any of these calls fails, the function aborts and returns NULL.
+ * In this case, there may be a memory leak if part of the procedure descriptor memory
+ * had been allocated before the function was aborted.
+ *
+ * It is legal to create a procedure descriptor with no decision
+ * nodes but it is not legal to create a procedure descriptor with no
+ * control flows or with no action nodes.
+ * @param nOfANodes the number of action nodes in the new procedure (a positive integer).
+ * @param nOfDNodes the number of decision nodes in the new procedure
+ * (a non-negative integer).
+ * @param nOfFlows the number of control flows in the new procedure (an
+ * integer greater than 1).
+ * @param nOfActions the total number of actions which the
+ * user wishes to define for the procedure.
+ * The total number of actions must be a positive integer not greater than the number
+ * of action nodes.
+ * If the same action appears more than once in a procedure, it is counted only once.
+ * @param nOfGuards the total number of control flow guards which the
+ * user wishes to define for the procedure.
+ * The total number of guards must be a non-negative integer not greater than the number
+ * control flows.
+ * If the same guard appears more than once in a procedure, it is counted only once.
+ * @return the descriptor of the new procedure (or NULL if creation of the
+ * data structures to hold the procedure descriptor failed or one of the
+ * function parameters had an illegal value).
+ */
+FwPrDesc_t FwPrCreate(FwPrCounterS1_t nOfANodes, FwPrCounterS1_t nOfDNodes, FwPrCounterS1_t nOfFlows,
+                      FwPrCounterS1_t nOfActions, FwPrCounterS1_t nOfGuards);
+
+/**
+ * Create the descriptor of a derived procedure.
+ * A derived procedure is a procedure which is created by extending
+ * another procedure.
+ * The procedure which is thus extended is called base procedure.
+ *
+ * This function takes a procedure as an argument and creates a derived
+ * procedure from it.
+ * The function returns the descriptor of the newly created derived procedure.
+ *
+ * The base procedure should be fully and correctly configured (i.e. it should
+ * pass the configuration check implemented by <code>::FwPrCheck</code>).
+ * Compliance with this constraint is not checked by this function.
+ * If the constraint is not satisfied, the behaviour of the derived procedure
+ * is undefined.
+ *
+ * After being created, the derived procedure has the following characteristics:
+ * - It has the same number of action and decision nodes as the base procedure.
+ * - Its action and decision nodes are connected by the same control flows as
+ *   the base procedure.
+ * - Its action nodes have the same actions as the homologous nodes of the base node
+ *   machine.
+ * - Its control flows have the same guards as the homologous control flows of
+ *   the base procedure.
+ * .
+ * Thus, the derived procedure is a structural clone of its base procedure.
+ *
+ * The attributes of the derived procedure are initialized as follows:
+ * - The error code is the same as the error code of the base procedure.
+ * - No procedure data are associated to the derived procedure.
+ * - The execution counters are equal to zero
+ * - The procedure state is STOPPED.
+ * - The <code>flowCnt</code> field in the procedure descriptor is initialized
+ *   to zero.
+ * .
+ * After being created, the derived procedure is fully configured because it
+ * inherits the configuration of its base procedure.
+ * The configuration of a derived procedure can be modified by:
+ * - loading its procedure data, and
+ * - overriding some or all of its actions and guards.
+ * .
+ * The functions to perform these reconfiguration operations are defined in
+ * <code>FwPrConfig.h</code>.
+ *
+ * A procedure descriptor consists of two parts: the base descriptor and
+ * the extension descriptor (see <code>FwPrPrivate.h</code>).
+ * A derived procedure and its base procedure share the same base descriptor
+ * (which defines the topology of the procedure) but have different extension
+ * descriptors.
+ * The extension descriptor is linked to the base descriptor through a pointer.
+ * This function accordingly creates a new extension descriptor and links it to the
+ * base descriptor of the base procedure.
+ * @param prDesc the descriptor of the base procedure. The base procedure
+ * should be a fully and correctly configured procedure (i.e. it should pass
+ * the <code>::FwPrCheck</code> configuration check).
+ * @return the descriptor of the derived procedure (or NULL if creation of the
+ * data structures to hold the extended procedure descriptor failed).
+ */
+FwPrDesc_t FwPrCreateDer(FwPrDesc_t prDesc);
+
+/**
+ * Release the memory which was allocated when the procedure descriptor was created.
+ * After this operation is called, the procedure descriptor can no longer be used.
+ *
+ * This function releases the memory of both the base and the extension parts of the
+ * procedure descriptor.
+ * Hence, if the argument procedure descriptor acted as base for other procedure
+ * descriptors, the derived procedure descriptors are no longer usable
+ * after the function has been called.
+ *
+ * Use of this function is subject to the following constraints:
+ * - It should only be called on a procedure descriptor which was created using
+ *   function <code>FwPrCreate</code>.
+ * - It should only be called once on the same procedure descriptor.
+ * - It should only be called on a procedure descriptor which is correctly configured.
+ * .
+ * Violation of any of the above constraints may result in memory corruption.
+ * @param prDesc the descriptor of the procedure.
+ */
+void FwPrRelease(FwPrDesc_t prDesc);
+
+/**
+ * Release the memory allocated to a derived procedure descriptor.
+ * After this operation is called, the argument procedure descriptor can no longer
+ * be used.
+ * The procedure descriptor of the base procedure is unaffected by this
+ * function.
+ *
+ * Use of this function is subject to the following constraints:
+ * - It should only be called on a procedure descriptor which was created using
+ *   function <code>FwPrCreateDer</code>.
+ * - It should only be called once on the same procedure descriptor.
+ * - It should only be called on a procedure descriptor which is correctly configured.
+ * .
+ * Violation of any of the above constraints may result in memory corruption.
+ * @param prDesc the descriptor of the procedure.
+ */
+void FwPrReleaseDer(FwPrDesc_t prDesc);
+
+#endif /* FWSM_DCREATE_H_ */
diff --git a/FwProfile/src/FwPrPrivate.h b/FwProfile/src/FwPrPrivate.h
new file mode 100644
index 0000000..6e872c0
--- /dev/null
+++ b/FwProfile/src/FwPrPrivate.h
@@ -0,0 +1,290 @@
+/**
+ * @file
+ * @ingroup prGroup
+ * Declaration of the internal data structures of the FW Procedure
+ * Module.
+ * Users should not normally be concerned with these data structures.
+ *
+ * The data structures declared in this header file are used to define the
+ * procedure descriptor.
+ * A procedure descriptor holds all the information related to a certain procedure.
+ * A procedure descriptor consists of two parts: the base descriptor and
+ * the extension descriptor.
+ *
+ * The base descriptor holds the information which is not changed when the
+ * procedure is extended.
+ * This consists of:
+ * - The list of action nodes in the procedure
+ * - The list of decision nodes in the procedure
+ * - The list of control flows in the procedure
+ * .
+ *
+ * The extension descriptor holds the information which may be overridden when the
+ * procedure is extended.
+ * This consists of:
+ * - The list of actions used in the procedure
+ * - The list of guards used in the procedure
+ * - The pointer to the procedure data (the data upon which the
+ *   procedure actions operate)
+ * - The current node of the procedure
+ * - The execution counters of the procedure
+ * - The error code for the procedure
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef FWPR_PRIVATE_H_
+#define FWPR_PRIVATE_H_
+
+#include "FwPrConstants.h"
+
+/**
+ * Enumerated type for the type of a node in a procedure.
+ */
+typedef enum {
+  /**
+   * An action state in a procedure.
+   */
+  actionNode = 1,
+  /**
+   * A decision node in a procedure.
+   */
+  decisionNode = 2,
+  /**
+   * Either the initial or the final node.
+   */
+  stoppedNode = 3
+} NodeType_t;
+
+/**
+ * Dummy guard which always returns true.
+ * This guard is used where no control flow guard is specified.
+ * @param prDesc procedure descriptor. This parameter is unused in this dummy guard.
+ * The parameter is retained for compatibility with the <code>::FwPrGuard_t</code> type.
+ * @return always return 1 (to signify that the guard is true).
+ */
+FwPrBool_t PrDummyGuard(FwPrDesc_t prDesc);
+
+/**
+ * Structure representing an action node in a procedure.
+ * An action node is characterized by:
+ * - the out-going control flow
+ * - the action associated to the node
+ * .
+ * The out-going control flow is identified by an integer pointing at the location
+ * in the control flow array in the base descriptor (see <code>::PrBaseDesc_t</code>).
+ * Thus, for instance, if the <code>iFlow</code> field for node N is equal to 5,
+ * then the out-going control flow of node N is the one stored at location 5 of the
+ * control flow array of that procedure.
+ *
+ * The node action is identified by an integer pointing at the location in the
+ * action array of the procedure descriptor where the action is stored.
+ * Thus, for instance, if the <code>iAction</code> field for node N is equal to 5,
+ * then the action of node N is the one stored at location 5 of the
+ * action array of that procedure.
+ *
+ * By convention, the implementation treats an action node as uninitialized if its
+ * <code>iFlow</code> field is equal to -1.
+ */
+typedef struct {
+  /** index of out-going control flows */
+  FwPrCounterS1_t iFlow;
+  /** index of the action attached to the node */
+  FwPrCounterS1_t iAction;
+} PrANode_t;
+
+/**
+ * Structure representing a decision node in a procedure.
+ * A decision node is characterized by the set of its out-going control flows.
+ * The set of out-going control flows is defined as follows.
+ * Control flows which originate from the same decision node are located in adjacent
+ * locations in the control flow array of the base descriptor (see
+ * <code>::PrBaseDesc_t</code>).
+ * Field <code>outFlowIndex</code> identifies the first location of this set of adjacent
+ * locations.
+ * Thus, for instance, if a decision node has 3 out-going control flows and if its
+ * <code>outFlowIndex</code> field has value 4, then the three out-going control flows
+ * are located in elements 4, 5 and 6 of the array of control flows.
+ *
+ * By convention, the implementation treats a decision node as uninitialized if its
+ * <code>outFlowIndex</code> field is equal to -1.
+ */
+typedef struct {
+  /** index of first out-going control flow in control flow array */
+  FwPrCounterS1_t outFlowIndex;
+  /** number of outgoing control flows from the decision node */
+  FwPrCounterS1_t nOfOutTrans;
+} PrDNode_t;
+
+/**
+ * Structure representing a control flow.
+ * A control flow is characterized by:
+ * - the destination of the control flow
+ * - the guard associated to the control flow
+ * .
+ * The destination of the control flow may be either an action node, or the final node,
+ * or a decision node. The type of the control flow destination is identified as follows:
+ * - a value of zero means that the destination is the final node
+ * - a positive value means that the destination is an action node and the value of
+ *   <code>dest</code> is the identifier of the destination node
+ * - a negative value means that the destination is a decision node and the value of
+ *   <code>-dest</code> is the identifier of the decision
+ * .
+ * The guard is an integer which identifies the location in the
+ * guard array of the procedure descriptor (see <code>FwPrDesc</code>)
+ * where the guard is stored as a function pointer.
+ * Control flows which do not have a guard associated to them, set <code>iGuard</code>
+ * equal to zero (the zero-th location in the guard array holds the "dummy
+ * guard" <code>::PrDummyGuard</code> which always returns 1).
+ *
+ * By convention, the implementation treats a control flow as uninitialized if its
+ * <code>iGuard</code> field is equal to -1.
+ */
+typedef struct {
+  /** the index of the destination of the control flow */
+  FwPrCounterS1_t dest;
+  /** the index of the guard associated to the control flow */
+  FwPrCounterS1_t iGuard;
+} PrFlow_t;
+
+/**
+ * Structure representing the base descriptor of a procedure.
+ * The base descriptor holds the information which is not changed when the procedure
+ * is extended.
+ * This consists of:
+ * - The list of action nodes in the procedure (array <code>aNodes</code>)
+ * - The list of decision nodes in the procedure (array <code>dNodes</code>)
+ * - The list of control flows in the procedure (array <code>flows</code>)
+ * .
+ * Array <code>aNodes</code> holds the action nodes in the procedure.
+ * The action nodes are identified by an integer in the range [1,N] (N is the total
+ * number of nodes).
+ * The i-th action node is stored in the (i-1)-th location of <code>aNodes</code>.
+ * The number of action nodes is stored in field <code>nOfANodes</code>.
+ *
+ * Array <code>dNodes</code> holds the decision nodes in the procedure.
+ * The decision nodes are identified by an integer in the range [1,M] (M is the total
+ * number of decision nodes).
+ * The i-th decision node is stored in the (i-1)-th location of <code>dNodes</code>.
+ * The number of decision nodes is stored in field <code>nOfDNodes</code>.
+ *
+ * Array <code>flows</code> holds the control flows in the procedure.
+ * The control flows are stored in groups of adjacent locations where each group
+ * holds the control flows out of the same node (see also
+ * <code>::PrANode_t</code> and <code>::PrDNode_t</code>).
+ * The number of control flows is stored in field <code>nOfFlows</code>.
+ */
+typedef struct {
+  /** array holding the action nodes in the procedure */
+  PrANode_t* aNodes;
+  /** array holding the decision nodes in the procedure */
+  PrDNode_t* dNodes;
+  /** array holding the control flows in the procedure */
+  PrFlow_t* flows;
+  /** the number of action nodes in the procedure */
+  FwPrCounterS1_t nOfANodes;
+  /** the number of decision nodes in the procedure */
+  FwPrCounterS1_t nOfDNodes;
+  /** the number of control flows in the procedure (excluding control flow from initial node) */
+  FwPrCounterS1_t nOfFlows;
+} PrBaseDesc_t;
+
+/**
+ * Structure representing a procedure descriptor.
+ * Field <code>prBase</code> points to the base descriptor for the procedure
+ * which holds the information about the action nodes, decision nodes and the
+ * control flows connecting them.
+ *
+ * Array <code>prActions</code> holds the list of all actions in the procedure.
+ * Each distinct action only appears once in the action array.
+ * If the same action is used several times in a procedure, only one instance is
+ * registered in the action array.
+ *
+ * Array <code>prGuards</code> holds the list of all control flow guards in the
+ * procedure.
+ * If the same guard is used several times in a procedure, only one instance is
+ * registered in the guard array.
+ * The first location in the guard array (location 0) holds the "dummy guard"
+ * <code>::PrDummyGuard</code> which always returns 1.
+ *
+ * When a new action node is added to the procedure, field
+ * <code>flowCnt</code> holds the position in the control flow array where its
+ * out-going control flow will be stored.
+ *
+ * The identifier of the current node is stored in <code>curNode</code>.
+ * The following convention is used:
+ * - A value of 0 indicates that the procedure is in the STOPPED state;
+ * - A value of -1 indicates that the procedure is in the STARTED state but the
+ *   guard on the flow out of the initial node was false and hence the
+ *   procedure is waiting in the initial node;
+ * - A value of i (a positive integer) indicates that the procedure is in the
+ *   STARTED state and i is the identifier of its current node.
+ * .
+ *
+ * If during the creation, configuration or execution of the procedure, an error is
+ * encountered, the corresponding error code is stored in field <code>errCode</code>.
+ * This field is initialized to <code>#prSuccess</code> and should nominally remain
+ * unchanged throughout the life of the procedure.
+ * If the error code has a value other than <code>#prSuccess</code>, the behaviour of
+ * the procedure is undefined.
+ *
+ * There are two types of procedures: base procedures (i.e.
+ * procedures which are created from scratch using <code>::FwPrCreate</code> or
+ * <code>#FW_SM_INST</code>) and derived procedures (i.e. procedures
+ * which are created by extending a base procedure through calls
+ * to <code>::FwPrCreateDer</code> or <code>#FW_PR_INST_DER</code>).
+ * By convention, a derived procedure is characterized by field
+ * <code>flowCnt</code> being equal to zero.
+ *
+ * Two counters are associated to a procedure: the Procedure Execution Counter
+ * and the Node Execution Counter.
+ * The Procedure Execution Counter holds the number of execution cycles since
+ * the procedure was started and the Node Execution Counter holds the number of cycle
+ * since the current node was entered.
+ */
+struct FwPrDesc {
+  /** pointer to the base descriptor */
+  PrBaseDesc_t* prBase;
+  /** the procedure actions */
+  FwPrAction_t* prActions;
+  /** the control flow guards in the procedure */
+  FwPrGuard_t* prGuards;
+  /** the number of actions in the procedure */
+  FwPrCounterS1_t nOfActions;
+  /** the number of guards in the procedure */
+  FwPrCounterS1_t nOfGuards;
+  /** the counter for the number of control flows added to the procedure */
+  FwPrCounterS1_t flowCnt;
+  /** the current node of the procedure */
+  FwPrCounterS1_t curNode;
+  /** either 'success' or the code of the last error encountered by the procedure */
+  FwPrErrCode_t errCode;
+  /** the procedure execution counter */
+  FwPrCounterU3_t prExecCnt;
+  /** the node execution counter */
+  FwPrCounterU3_t nodeExecCnt;
+  /** the pointer to the data manipulated by the procedure actions and guards */
+  void* prData;
+};
+
+#endif /* FWPR_PRIVATE_H_ */
diff --git a/FwProfile/src/FwPrSCreate.c b/FwProfile/src/FwPrSCreate.c
new file mode 100644
index 0000000..c5dc822
--- /dev/null
+++ b/FwProfile/src/FwPrSCreate.c
@@ -0,0 +1,102 @@
+/**
+ * @file
+ * @ingroup prGroup
+ * Implements the static initialization functions for the FW
+ * Procedure Module.
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include "FwPrPrivate.h"
+#include <stdlib.h>
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwPrInit(FwPrDesc_t prDesc) {
+
+  FwPrCounterS1_t i;
+  PrBaseDesc_t*   prBase = prDesc->prBase;
+
+  for (i = 0; i < prBase->nOfANodes; i++) {
+    prBase->aNodes[i].iFlow = -1;
+  }
+
+  for (i = 0; i < prBase->nOfDNodes; i++) {
+    prBase->dNodes[i].outFlowIndex = -1;
+  }
+
+  for (i = 0; i < prBase->nOfFlows; i++) {
+    prBase->flows[i].iGuard = -1;
+  }
+
+  for (i = 0; i < prDesc->nOfActions; i++) {
+    prDesc->prActions[i] = NULL;
+  }
+
+  prDesc->prGuards[0] = &PrDummyGuard;
+  for (i = 1; i < prDesc->nOfGuards; i++) {
+    prDesc->prGuards[i] = NULL;
+  }
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwPrInitDer(FwPrDesc_t prDesc, FwPrDesc_t prDescBase) {
+  FwPrCounterS1_t i;
+  PrBaseDesc_t*   prBase = prDescBase->prBase;
+
+  if (prDesc->nOfActions != prDescBase->nOfActions) {
+    prDesc->errCode = prWrongNOfActions;
+    return;
+  }
+
+  if (prDesc->nOfGuards != prDescBase->nOfGuards) {
+    prDesc->errCode = prWrongNOfGuards;
+    return;
+  }
+
+  prDesc->prBase = prBase;
+
+  /* This cycle will always be executed at least once because
+   * the number of actions (nOfActions) is always greater than
+   * zero (since all procedures have at least one action node)
+   */
+  for (i = 0; i < prDesc->nOfActions; i++) {
+    prDesc->prActions[i] = prDescBase->prActions[i];
+  }
+
+  /* This cycle will always be executed at least once because
+   * the number of guards (nOfGuards) is always greater than
+   * zero (since all procedures have at least the dummy guard)
+   */
+  for (i = 0; i < prDesc->nOfGuards; i++) {
+    prDesc->prGuards[i] = prDescBase->prGuards[i];
+  }
+
+  prDesc->errCode = prDescBase->errCode;
+
+  prDesc->flowCnt     = 0;
+  prDesc->curNode     = 0;
+  prDesc->nodeExecCnt = 0;
+  prDesc->prExecCnt   = 0;
+
+  return;
+}
diff --git a/FwProfile/src/FwPrSCreate.h b/FwProfile/src/FwPrSCreate.h
new file mode 100644
index 0000000..683210c
--- /dev/null
+++ b/FwProfile/src/FwPrSCreate.h
@@ -0,0 +1,278 @@
+/**
+ * @file
+ * @ingroup prGroup
+ * Declaration of the static creation interface for a FW Procedure.
+ * A FW Procedure is described by a procedure descriptor.
+ * This interface allows a procedure descriptor to be created
+ * statically (i.e. without using dynamic memory allocation).
+ * In this sense, this interface is alternative to the dynamic creation
+ * interface defined in <code>FwPrDCreate.h</code>.
+ *
+ * A procedure can be created in two ways:
+ * - It can be created from scratch, or
+ * - It can be created by extending an existing procedure.
+ * .
+ * In both cases, creation of a procedure descriptor is done in two
+ * steps:
+ * - The procedure descriptor and its internal data structures are
+ *   instantiated.
+ * - The procedure descriptor and its internal data structures are
+ *   initialized.
+ * .
+ * Instantiation is done by means of the following macros.
+ * - <code>#FW_PR_INST</code> should be used to instantiate from scratch
+ *   a descriptor for a procedure with one or more choice
+ *   pseudo-states.
+ * - <code>#FW_PR_INST_NODEC</code> should be used to instantiate from
+ *   scratch a descriptor for a procedure with no choice pseudo-states.
+ * - <code>#FW_PR_INST_DER</code> should be used to instantiate a
+ *   descriptor for a procedure which is derived by extending another
+ *   procedure.
+ * .
+ * Initialization is done by means of the following functions:
+ * - <code>::FwPrInit</code> should be used to initialize a descriptor
+ *   which has been created from scratch with either
+ *   <code>#FW_PR_INST</code> or <code>#FW_PR_INST_NODEC</code>.
+ * - <code>::FwPrInitDer</code> should be used to initialize a descriptor
+ *   of a procedure which is derived by extending another procedure
+ * .
+ * After a procedure descriptor has been instantiated and
+ * initialized, it will normally need to be configured.
+ * Configuration of a procedure descriptor can be done using the
+ * functions described in the <code>FwPrConfig.h</code> file.
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef FWPR_SCREATE_H_
+#define FWPR_SCREATE_H_
+
+#include "FwPrPrivate.h"
+
+/**
+ * Instantiate a procedure descriptor and its internal data structure.
+ * This macro compiles correctly only if the number of action nodes N, the number
+ * of decision NDEC and the number of control flows NFLOWS is positive.
+ * If there is a need to define a procedure with zero decision nodes,
+ * the <code>::FW_PR_INST_NODEC</code> macro should be used.
+ *
+ * The macro generates code that does the following:
+ * - It defines an array of N elements of type <code>PrANode_t</code> to
+ *   represent the array holding the procedure action nodes.
+ * - It defines an array of NDEC elements of type <code>PrDNodes_t</code> to
+ *   represent the array holding the procedure decision nodes.
+ * - It defines an array of NFLOWS elements of type <code>PrFlow_t</code> to
+ *   represent the array holding the procedure control flows.
+ * - It defines an array of NA elements of type <code>PrAction_t</code> to
+ *   represent the array holding the procedure actions.
+ * - It defines an array of (NG+1) elements of type <code>PrGuard_t</code> to
+ *   represent the array holding the procedure guards (the extra guard is
+ *   the "dummy guard" <code>::PrDummyGuard"</code> to be attached to control flows
+ *   which have no guard).
+ * - It defines and initializes a variable of type <code>FwPrDescBase_t</code>
+ *   to represent the base part of the procedure descriptor.
+ * - It defines and initializes a variable with the name PR_DESC of type
+ *   <code>struct FwPrDesc</code> to represent the procedure descriptor.
+ * .
+ * All variables defined by this macro are <code>static</code>.
+ *
+ * The procedure descriptor instantiated by the macro is only partially
+ * initialized.
+ * Full initialization is performed using function <code>::FwPrInit</code>.
+ *
+ * Since the macro includes the declaration of several variables, it should be located
+ * in the section of a c-file where variable declaration is legal.
+ * @param PR_DESC the variable holding the procedure descriptor
+ * @param N a positive integer representing the number of action nodes
+ * @param NDEC a positive integer the number of decision nodes
+ * @param NFLOWS a positive integer representing the number of control flows
+ * @param NA a positive integer representing the number of actions
+ * @param NG a non-negative integer representing the number of guards (i.e. the
+ * number of transition actions which are defined on the procedure)
+ */
+#define FW_PR_INST(PR_DESC, N, NDEC, NFLOWS, NA, NG)                                                                 \
+  static PrANode_t    PR_DESC##_aNodes[(N)];                                                                         \
+  static PrDNode_t    PR_DESC##_dNodes[(NDEC)];                                                                      \
+  static PrFlow_t     PR_DESC##_flows[(NFLOWS)];                                                                     \
+  static FwPrAction_t PR_DESC##_actions[(NA)];                                                                       \
+  static FwPrGuard_t  PR_DESC##_guards[(NG) + 1];                                                                    \
+  static PrBaseDesc_t PR_DESC##_base = {(PR_DESC##_aNodes), (PR_DESC##_dNodes), (PR_DESC##_flows), N, NDEC, NFLOWS}; \
+  static struct FwPrDesc(PR_DESC)    = {                                                                             \
+      &(PR_DESC##_base), (PR_DESC##_actions), (PR_DESC##_guards), NA, (NG) + 1, 1, 0, prSuccess, 0, 0, NULL};
+
+/**
+ * Instantiate a procedure descriptor and its internal data structure.
+ * This macro compiles correctly only if the number of action nodes N
+ * and the number of control flows is positive.
+ * This macro instantiates a descriptor for a procedure without decision
+ * nodes.
+ * If there is a need to define a procedure with one or more decision
+ * nodes, the <code>::FW_PR_INST</code> macro should be used.
+ *
+ * The macro generates code that does the following:
+ * - It defines an array of N elements of type <code>PrANode_t</code> to
+ *   represent the array holding the procedure action nodes.
+ * - It defines an array of NFLOWS elements of type <code>PrFlow_t</code> to
+ *   represent the array holding the procedure control flows.
+ * - It defines an array of NA elements of type <code>PrAction_t</code> to
+ *   represent the array holding the procedure actions.
+ * - It defines an array of (NG+1) elements of type <code>PrGuard_t</code> to
+ *   represent the array holding the procedure guards (the extra guard is
+ *   the "dummy guard" <code>::PrDummyGuard"</code> to be attached to control flows
+ *   which have no guard).
+ * - It defines and initializes a variable of type <code>FwPrDescBase_t</code>
+ *   to represent the base part of the procedure descriptor.
+ * - It defines and initializes a variable with the name PR_DESC of type
+ *   <code>struct FwPrDesc</code> to represent the procedure descriptor.
+ * .
+ * All variables defined by this macro are <code>static</code>.
+ *
+ * The procedure descriptor instantiated by the macro is only partially
+ * initialized.
+ * Full initialization is performed using function <code>::FwPrInit</code>.
+ *
+ * Since the macro includes the declaration of several variables, it should be located
+ * in the section of a c-file where variable declaration is legal.
+ *
+ * @param PR_DESC the variable holding the procedure descriptor
+ * @param N a positive integer representing the number of action nodes
+ * @param NFLOWS a positive integer representing the number of control flows
+ * @param NA a positive integer representing the number of actions
+ * @param NG a non-negative integer representing the number of guards (i.e. the
+ * number of transition actions which are defined on the procedure)
+ */
+#define FW_PR_INST_NODEC(PR_DESC, N, NFLOWS, NA, NG)                                                \
+  static PrANode_t    PR_DESC##_aNodes[(N)];                                                        \
+  static PrFlow_t     PR_DESC##_flows[(NFLOWS)];                                                    \
+  static FwPrAction_t PR_DESC##_actions[(NA)];                                                      \
+  static FwPrGuard_t  PR_DESC##_guards[(NG) + 1];                                                   \
+  static PrBaseDesc_t PR_DESC##_base = {(PR_DESC##_aNodes), NULL, (PR_DESC##_flows), N, 0, NFLOWS}; \
+  static struct FwPrDesc(PR_DESC)    = {                                                            \
+      &(PR_DESC##_base), (PR_DESC##_actions), (PR_DESC##_guards), NA, (NG) + 1, 1, 0, prSuccess, 0, 0, NULL};
+
+/**
+ * Instantiate a descriptor for a derived procedure.
+ * A derived procedure is a procedure which is created by extending
+ * another procedure.
+ * The procedure which is thus extended is called base procedure.
+ *
+ * A procedure descriptor consists of two parts: the base descriptor and
+ * the extension descriptor (see <code>FwPrPrivate.h</code>).
+ * A derived procedure and its base procedure share the same base descriptor
+ * (which defines the topology of the procedure) but have different extension
+ * descriptors.
+ * This macro accordingly only instantiates a new extension descriptor.
+ * More precisely, this macro generates code that does the following:
+ * - It defines an array of NA elements of type <code>PrAction_t</code> to
+ *   represent the array holding the procedure actions.
+ * - It defines an array of (NG+1) elements of type <code>PrGuard_t</code> to
+ *   represent the array holding the procedure guards (the extra guard is
+ *   the "dummy guard" <code>::PrDummyGuard"</code> to be attached to control
+ *   flows which have no guard).
+ * - It defines and initializes a variable with the name PR_DESC of type
+ *   <code>struct FwPrDesc</code> to represent the procedure descriptor.
+ * .
+ * All variables defined by this macro are <code>static</code>.
+ *
+ * The procedure descriptor instantiated by the macro is only partially
+ * initialized.
+ * Full initialization is performed using function <code>::FwPrInitDer</code>.
+ *
+ * Since the macro includes the declaration of several variables, it should be located
+ * in the section of a c-file where variable declaration is legal.
+ *
+ * @param PR_DESC the variable holding the procedure descriptor
+ * @param NA a non-negative integer representing the number of actions
+ * @param NG a non-negative integer representing the number of guards
+ */
+#define FW_PR_INST_DER(PR_DESC, NA, NG)           \
+  static FwPrAction_t PR_DESC##_actions[(NA)];    \
+  static FwPrGuard_t  PR_DESC##_guards[(NG) + 1]; \
+  static struct FwPrDesc(PR_DESC) = {             \
+      NULL, (PR_DESC##_actions), (PR_DESC##_guards), NA, (NG) + 1, 1, 0, prSuccess, 0, 0, NULL};
+
+/**
+ * Initialize a procedure descriptor to represent an unconfigured procedure
+ * with no control flows, no actions, and no guards.
+ * After this function has been executed, the argument procedure descriptor
+ * has the same content as a procedure descriptor which has been
+ * created by calling <code>::FwPrCreate</code>.
+ *
+ * This function is primarily intended to be used to initialize a procedure
+ * descriptor which has been statically instantiated with macro
+ * <code>#FW_PR_INST</code> or <code>#FW_PR_INST_NODEC</code>.
+ *
+ * If the function is called upon a procedure descriptor that had already been
+ * initialized, the previous initialization values are lost.
+ * In such a case, a memory leak is possible due to the potential loss of the pointers
+ * to the arrays where the procedures nodes and control flows are stored.
+ * @param prDesc the procedure descriptor to be initialized.
+ */
+void FwPrInit(FwPrDesc_t prDesc);
+
+/**
+ * Initialize a procedure descriptor to extend another procedure (the
+ * base procedure).
+ * This function checks that the descriptor to be initialized satisfies
+ * the following constraints:
+ * - it has the same number of actions as the base procedure, and
+ * - it has the same number of guards as the base procedure.
+ * .
+ * If either constraint is not satisfied, the function reports an error
+ * by setting the error code of the descriptor to be initialized and then
+ * returns.
+ * If the first constraint is not satisfied, the function sets the error
+ * code to <code>#prWrongNOfActions</code>.
+ * If the second constraint is not satisfied, the function sets the error
+ * code to <code>#prWrongNOfGuards</code>.
+ *
+ * If both constraints are satisfied, this function initializes a descriptor
+ * as follows:
+ * - It links it to the descriptor of the base procedure.
+ * - It initializes its actions to be the same as the actions of the base state
+ *   machine.
+ * - It initializes its guards to be the same as the guards of the base state
+ *   machine.
+ * - It initializes its error code to be the same as the error code of the base
+ *   procedure.
+ * - It initializes its <code>flowCnt</code> field to zero.
+ * - It sets its state to STOPPED.
+ * .
+ * Thus, the descriptor initialized by this function represents
+ * exactly the same procedure as the descriptor created by calling
+ * function <code>::FwPrCreateDer</code>.
+ *
+ * This function is primarily intended to be used to initialize a procedure
+ * descriptor which has been statically instantiated with macro
+ * <code>#FW_PR_INST_DER</code>.
+ * If the function is called upon a procedure descriptor that had already been
+ * initialized, the previous initialization values are lost.
+ * In such a case, a memory leak is possible due to the potential loss of the pointers
+ * to the arrays where the procedures states, choice pseudo-states, transitions and
+ * embedded procedures are stored.
+ * @param prDesc the procedure descriptor to be initialized.
+ * @param prDescBase the procedure descriptor of the base procedure.
+ */
+void FwPrInitDer(FwPrDesc_t prDesc, FwPrDesc_t prDescBase);
+
+#endif /* FWPR_SCREATE_H_ */
diff --git a/FwProfile/src/FwRtConfig.c b/FwProfile/src/FwRtConfig.c
new file mode 100644
index 0000000..013b265
--- /dev/null
+++ b/FwProfile/src/FwRtConfig.c
@@ -0,0 +1,278 @@
+/**
+ * @file
+ * @ingroup rtGroup
+ * Implements Configuration Functions of the RT Container.
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include "FwRtConfig.h"
+#if 0
+#include "FwRtConstants.h"
+#include <pthread.h>
+#endif
+#include <stdlib.h>
+
+/**
+ * Dummy function which always returns 1.
+ * This function is used as the default for the procedure actions of the RT Container.
+ * @param rtDesc the descriptor of the RT Container
+ * @return this function always returns 1
+ */
+FwRtOutcome_t DummyAction(FwRtDesc_t rtDesc);
+
+void FwRtReset(FwRtDesc_t rtDesc) {
+  rtDesc->state               = rtContUninitialized;
+  rtDesc->activPrStarted      = 0;
+  rtDesc->notifPrStarted      = 0;
+  rtDesc->errCode             = 0;
+  rtDesc->execFuncBehaviour   = &DummyAction;
+  rtDesc->finalizeActivPr     = &DummyAction;
+  rtDesc->finalizeNotifPr     = &DummyAction;
+  rtDesc->implementActivLogic = &DummyAction;
+  rtDesc->implementNotifLogic = &DummyAction;
+  rtDesc->initializeActivPr   = &DummyAction;
+  rtDesc->initializeNotifPr   = &DummyAction;
+  rtDesc->setUpNotification   = &DummyAction;
+  rtDesc->notifCounter        = 0;
+  rtDesc->pThreadAttr         = NULL;
+  rtDesc->pCondAttr           = NULL;
+  rtDesc->pMutexAttr          = NULL;
+  rtDesc->rtData              = NULL;
+}
+
+/*--------------------------------------------------------------------------------------*/
+void FwRtInit(FwRtDesc_t rtDesc) {
+  int errCode;
+
+  if (rtDesc->state != rtContUninitialized) {
+    rtDesc->state = rtConfigErr;
+    return;
+  }
+
+  /* Initialize mutex attributes */
+  if (rtDesc->pMutexAttr != NULL) {
+    if ((errCode = pthread_mutexattr_init(rtDesc->pMutexAttr)) != 0) {
+      rtDesc->errCode = errCode;
+      rtDesc->state   = rtMutexAttrInitErr;
+      return;
+    }
+  }
+
+  /* Initialize condition variable attributes */
+  if (rtDesc->pCondAttr != NULL) {
+    if ((errCode = pthread_condattr_init(rtDesc->pCondAttr)) != 0) {
+      rtDesc->errCode = errCode;
+      rtDesc->state   = rtCondAttrInitErr;
+      return;
+    }
+  }
+
+  /* Initialize thread attributes */
+  if (rtDesc->pThreadAttr != NULL) {
+    if ((errCode = pthread_attr_init(rtDesc->pThreadAttr)) != 0) {
+      rtDesc->errCode = errCode;
+      rtDesc->state   = rtThreadAttrInitErr;
+      return;
+    }
+  }
+
+  /* Initialize mutex */
+  if ((errCode = pthread_mutex_init(&(rtDesc->mutex), rtDesc->pMutexAttr)) != 0) {
+    rtDesc->errCode = errCode;
+    rtDesc->state   = rtMutexInitErr;
+    return;
+  }
+
+  /* Initialize condition variable */
+  if ((errCode = pthread_cond_init(&(rtDesc->cond), rtDesc->pCondAttr)) != 0) {
+    rtDesc->errCode = errCode;
+    rtDesc->state   = rtCondInitErr;
+    return;
+  }
+
+  rtDesc->state = rtContStopped;
+}
+
+/*--------------------------------------------------------------------------------------*/
+void FwRtShutdown(FwRtDesc_t rtDesc) {
+  int errCode;
+
+  /* Destroy mutex attributes */
+  if (rtDesc->pMutexAttr != NULL) {
+    if ((errCode = pthread_mutexattr_destroy(rtDesc->pMutexAttr)) != 0) {
+      rtDesc->errCode = errCode;
+      rtDesc->state   = rtMutexAttrDestroyErr;
+      return;
+    }
+  }
+
+  /* Destroy condition variable attributes */
+  if (rtDesc->pCondAttr != NULL) {
+    if ((errCode = pthread_condattr_destroy(rtDesc->pCondAttr)) != 0) {
+      rtDesc->errCode = errCode;
+      rtDesc->state   = rtCondAttrDestroyErr;
+      return;
+    }
+  }
+
+  /* Destroy thread attributes */
+  if (rtDesc->pThreadAttr != NULL) {
+    if ((errCode = pthread_attr_destroy(rtDesc->pThreadAttr)) != 0) {
+      rtDesc->errCode = errCode;
+      rtDesc->state   = rtThreadAttrDestroyErr;
+      return;
+    }
+  }
+
+  if ((errCode = pthread_cond_destroy(&(rtDesc->cond))) != 0) {
+    rtDesc->errCode = errCode;
+    rtDesc->state   = rtCondDestroyErr;
+    return;
+  }
+
+  if ((errCode = pthread_mutex_destroy(&(rtDesc->mutex))) != 0) {
+    rtDesc->errCode = errCode;
+    rtDesc->state   = rtMutexDestroyErr;
+    return;
+  }
+
+  rtDesc->state = rtContUninitialized;
+}
+
+/*--------------------------------------------------------------------------------------*/
+void FwRtSetPosixAttr(FwRtDesc_t rtDesc, pthread_attr_t* pThreadAttr, pthread_mutexattr_t* pMutexAttr,
+                      pthread_condattr_t* pCondAttr) {
+
+  if (rtDesc->state != rtContUninitialized) {
+    rtDesc->state = rtConfigErr;
+    return;
+  }
+
+  rtDesc->pThreadAttr = pThreadAttr;
+  rtDesc->pMutexAttr  = pMutexAttr;
+  rtDesc->pCondAttr   = pCondAttr;
+}
+
+/*--------------------------------------------------------------------------------------*/
+pthread_attr_t* FwRtGetActivThreadAttr(FwRtDesc_t rtDesc) {
+  return rtDesc->pThreadAttr;
+}
+
+/*--------------------------------------------------------------------------------------*/
+pthread_mutexattr_t* FwRtGetMutexAttr(FwRtDesc_t rtDesc) {
+  return rtDesc->pMutexAttr;
+}
+
+/*--------------------------------------------------------------------------------------*/
+pthread_condattr_t* FwRtGetCondAttr(FwRtDesc_t rtDesc) {
+  return rtDesc->pCondAttr;
+}
+
+/* -------------------------------------------------------------------------------------*/
+void FwRtSetData(FwRtDesc_t rtDesc, void* rtData) {
+  rtDesc->rtData = rtData;
+}
+
+/* -------------------------------------------------------------------------------------*/
+void* FwRtGetData(FwRtDesc_t rtDesc) {
+  return rtDesc->rtData;
+}
+
+/* -------------------------------------------------------------------------------------*/
+void FwRtSetInitializeNotifPr(FwRtDesc_t rtDesc, FwRtAction_t initializeNotifPr) {
+  if (rtDesc->state != rtContUninitialized) {
+    rtDesc->state = rtConfigErr;
+    return;
+  }
+  rtDesc->initializeNotifPr = initializeNotifPr;
+}
+
+/* -------------------------------------------------------------------------------------*/
+void FwRtSetFinalizeNotifPr(FwRtDesc_t rtDesc, FwRtAction_t finalizeNotifPr) {
+  if (rtDesc->state != rtContUninitialized) {
+    rtDesc->state = rtConfigErr;
+    return;
+  }
+  rtDesc->finalizeNotifPr = finalizeNotifPr;
+}
+
+/* -------------------------------------------------------------------------------------*/
+void FwRtSetImplementNotifLogic(FwRtDesc_t rtDesc, FwRtAction_t implementNotifLogicPr) {
+  if (rtDesc->state != rtContUninitialized) {
+    rtDesc->state = rtConfigErr;
+    return;
+  }
+  rtDesc->implementNotifLogic = implementNotifLogicPr;
+}
+
+/* -------------------------------------------------------------------------------------*/
+void FwRtSetInitializeActivPr(FwRtDesc_t rtDesc, FwRtAction_t initializeActivPr) {
+  if (rtDesc->state != rtContUninitialized) {
+    rtDesc->state = rtConfigErr;
+    return;
+  }
+  rtDesc->initializeActivPr = initializeActivPr;
+}
+
+/* -------------------------------------------------------------------------------------*/
+void FwRtSetFinalizeActivPr(FwRtDesc_t rtDesc, FwRtAction_t finalizeActivPr) {
+  if (rtDesc->state != rtContUninitialized) {
+    rtDesc->state = rtConfigErr;
+    return;
+  }
+  rtDesc->finalizeActivPr = finalizeActivPr;
+}
+
+/* -------------------------------------------------------------------------------------*/
+void FwRtSetSetUpNotif(FwRtDesc_t rtDesc, FwRtAction_t setUpNotification) {
+  if (rtDesc->state != rtContUninitialized) {
+    rtDesc->state = rtConfigErr;
+    return;
+  }
+  rtDesc->setUpNotification = setUpNotification;
+}
+
+/* -------------------------------------------------------------------------------------*/
+void FwRtSetImplementActivLogic(FwRtDesc_t rtDesc, FwRtAction_t implementActivLogic) {
+  if (rtDesc->state != rtContUninitialized) {
+    rtDesc->state = rtConfigErr;
+    return;
+  }
+  rtDesc->implementActivLogic = implementActivLogic;
+}
+
+/* -------------------------------------------------------------------------------------*/
+void FwRtSetExecFuncBehaviour(FwRtDesc_t rtDesc, FwRtAction_t execFuncBehaviour) {
+  if (rtDesc->state != rtContUninitialized) {
+    rtDesc->state = rtConfigErr;
+    return;
+  }
+  rtDesc->execFuncBehaviour = execFuncBehaviour;
+}
+
+/* -------------------------------------------------------------------------------------*/
+FwRtOutcome_t DummyAction(FwRtDesc_t rtDesc) {
+  (void)(rtDesc);
+  return 1;
+}
diff --git a/FwProfile/src/FwRtConfig.h b/FwProfile/src/FwRtConfig.h
new file mode 100644
index 0000000..1879341
--- /dev/null
+++ b/FwProfile/src/FwRtConfig.h
@@ -0,0 +1,414 @@
+/**
+ * @file
+ * @ingroup rtGroup
+ * Declaration of the configuration interface for a RT Container.
+ * A RT Container is described by a container descriptor.
+ * The functions declared in this interface allow a container descriptor
+ * to be configured.
+ *
+ * The user instantiates a RT Container descriptor by creating a variable
+ * of type <code>struct FwRtCont</code>.
+ * After the container descriptor has been instantiated, it is configured
+ * using the functions defined in this header file as follows:
+ * -# The container descriptor is reset with function <code>::FwRtReset</code>.
+ * -# The attributes of the container's POSIX objects may be set with
+ *    function <code>::FwRtSetPosixAttr</code>.
+ * -# The pointers to the procedure functions which implement the adaptation
+ *    points of the container may be set with function <code>FwRtSetProcActions</code>.
+ * -# The pointer to the RT Container data in the container descriptor
+ *    may be set with the <code>::FwRtSetData</code> function.
+ * -# The container is initialized with function <code>::FwRtInit</code>.
+ *    This completes the configuration process.
+ * .
+ * Configuration can only be done before the container is started with
+ * <code>::FwRtStart</code> or after the container has been shut down with
+ * <code>::FwRtShutdown</code>.
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef FWRT_CONFIG_H_
+#define FWRT_CONFIG_H_
+
+#include "FwRtConstants.h"
+
+#if __sparc__
+  #include <fsu_pthread.h> 
+#else
+  #include <pthread.h>
+#endif
+
+/**
+ * Reset the RT Container descriptor (RTD).
+ * This function should be called at the beginning of the configuration process.
+ * The function initializes the fields of the container descriptor with default
+ * values as follows:
+ * - The actions of the Notification Procedure and of the Activation Procedure are set
+ *   equal to a dummy action representing a situation where all
+ *   procedure actions do nothing and always return 1.
+ * - The attribute objects for the Activation Thread, for the container mutex, and for
+ *   the container condition variable are set to NULL. This represents a situation
+ *   where the default values for these attributes are used.
+ * - The error code is set to zero.
+ * - The notification counter is set to zero.
+ * - The container state is set to: <code>::rtContUninitialized</code>.
+ * - The state of the Activation and Notification Procedures is set to: STOPPED.
+ * - The pointer to the container data is set to NULL.
+ * .
+ * @param rtDesc the descriptor of the RT Container
+ */
+void FwRtReset(FwRtDesc_t rtDesc);
+
+/**
+ * Initialize a RT Container.
+ * The following initialization actions are performed:
+ * - If the container state is not <code>::rtContUninitialized</code>, the function
+ *   sets the container's state to the error state <code>::rtConfigErr</code>
+ *   and then returns.
+ * - If non-NULL attributes have been loaded for the container's POSIX objects
+ *   (i.e. if the user has called function <code>FwRtSetPosixAttr</code> with
+ *   non-NULL values), the attributes are initialized using their POSIX initialization
+ *   functions (<code>pthread_attr_init</code>, <code>pthread_mutexattr_init</code>,
+ *   and <code>pthread_condattr_init</code>) and then the initialized attributes
+ *   are used to initialize the mutex and the condition variable.
+ * - If no attributes have been loaded for the container's POSIX mutex and
+ *   condition variable (i.e. if the user has not called function
+ *   <code>::FwRtSetPosixAttr</code> or he has called it with NULL values for
+ *   the POSIX attributes), the container POSIX mutex and condition variable are
+ *   initialized with their default attribute values.
+ * - If any of the POSIX system calls made by this function returns an error,
+ *   the container state is set to an error state (see <code>::FwRtState_t</code>)
+ *   and the error code is initialized with the error code returned by the failed
+ *   POSIX system call.
+ * - If all the POSIX system calls made by this function are successful,
+ *   the container state is set to <code>::rtContStopped</code>.
+ * .
+ * A call to this function concludes the configuration process of the RTD.
+ * The configuration process has been successful if, after this function is called,
+ * the container is in state <code>::rtContStopped</code>.
+ * @param rtDesc the descriptor of the RT Container.
+ */
+void FwRtInit(FwRtDesc_t rtDesc);
+
+/**
+ * Shutdown the RT Container.
+ * The following shutdown actions are performed:
+ * - If non-NULL attributes have been loaded for the container's POSIX thread,
+ *   or for the container's POSIX mutex, or for the container's POSIX condition
+ *   variable, the attributes are destroyed using their POSIX destruction
+ *   functions (<code>pthread_attr_destroy</code>, <code>pthread_mutexattr_destroy</code>,
+ *   and <code>pthread_condattr_destroy</code>).
+ * - The container POSIX mutex and POSIX condition variables are destroyed using
+ *   their POSIX destructor functions (<code>pthread_mutex_destroy</code> and
+ *   <code>pthread_cond_destroy</code>).
+ * - If all the POSIX system calls made by this function are successful, then the
+ *   container state is set to <code>::rtContUninitialized</code> to signify
+ *   that the container is now uninitialized.
+ * - If any of the POSIX system calls made by this function returns an error,
+ *   the container state is set to an error state (see <code>::FwRtState_t</code>)
+ *   and the error code is set to the error code returned by the failed POSIX
+ *   system call.
+ * .
+ * After this function has been called, the container must be again configured in
+ * full before it can again be used.
+ *
+ * This function should only be called when the RT Container is in state STOPPED
+ * and after its Activation Thread has terminated execution.
+ * Enforcement of this constraint is under the responsibility of the user.
+ *
+ * @param rtDesc the descriptor of the RT Container.
+ */
+void FwRtShutdown(FwRtDesc_t rtDesc);
+
+/**
+ * Set the pointers to the attribute objects of the POSIX thread, mutex and condition
+ * variable used by the container.
+ * A RT Container uses a POSIX thread, a POSIX mutex and a POSIX condition
+ * variable.
+ * Their configuration is defined by attribute objects.
+ * This function allows the attribute objects to be loaded into the container.
+ * A value of NULL for an attribute object means that the POSIX-defined default
+ * value for that attribute will be used.
+ * The attribute objects will be initialized at the end of the container
+ * configuration process when <code>::FwRtInit</code> is called.
+ *
+ * The thread attributes are used when the container's thread (the Activation Thread)
+ * is started by calling <code>::FwRtStart</code>.
+ * The mutex and condition variable attributes are used when the container mutex and
+ * its condition variable are initialized by calling <code>::FwRtInit</code>.
+ *
+ * If this function is not called during the container configuration process,
+ * the container will be configured with NULL values for all POSIX attribute
+ * objects (i.e. the POSIX thread, mutex and condition variable will be
+ * initialized with their POSIX-defined default attribute values).
+ *
+ * This function may only be called during the container's configuration process
+ * (i.e. before <code>::FwRtInit</code> is called or after <code>::FwRtShutdown</code>
+ * is called).
+ * If it is called at any other time, it causes the container's state to be
+ * put in error state <code>::rtConfigErr</code>.
+ * @param rtDesc the descriptor of the RT Container
+ * @param pThreadAttr the attributes of the Activation Thread (or NULL if it is desired
+ * to use default attribute for the thread)
+ * @param pMutexAttr the attributes of the container's mutex (or NULL if it is desired
+ * to use default attribute for the mutex)
+ * @param pCondAttr the attributes of the container's mutex (or NULL if it is desired
+ * to use default attribute for the condition variable)
+ */
+void FwRtSetPosixAttr(FwRtDesc_t rtDesc, pthread_attr_t* pThreadAttr, pthread_mutexattr_t* pMutexAttr,
+                      pthread_condattr_t* pCondAttr);
+
+/**
+ * Get the value of the attributes of the Activation Thread.
+ * The attribute values returned by this call are those set with
+ * <code>::FwRtSetPosixAttr</code> or NULL if the container
+ * was initialized without calling this function.
+ * @param rtDesc the descriptor of the RT Container
+ * @return the attributes of the Activation Thread
+ */
+pthread_attr_t* FwRtGetActivThreadAttr(FwRtDesc_t rtDesc);
+
+/**
+ * Get the value of the attributes of the mutex associated to the RT Container.
+ * The attribute values returned by this call are those set with
+ * <code>::FwRtSetPosixAttr</code> or NULL if the container
+ * was initialized without calling this function.
+ * @param rtDesc the descriptor of the RT Container
+ * @return the attributes of the mutex
+ */
+pthread_mutexattr_t* FwRtGetMutexAttr(FwRtDesc_t rtDesc);
+
+/**
+ * Get the value of the attributes of the condition variable associated to
+ * the RT Container.
+ * The attribute values returned by this call are those set with
+ * <code>::FwRtSetPosixAttr</code> or NULL if the container
+ * was initialized without calling this function.
+ * @param rtDesc the descriptor of the RT Container
+ * @return the attributes of the condition variable
+ */
+pthread_condattr_t* FwRtGetCondAttr(FwRtDesc_t rtDesc);
+
+/**
+ * Set the pointer to the RT Container data in the container descriptor.
+ * The container data are data which are manipulated by the container's
+ * procedures.
+ * The container descriptor holds a pointer to the procedure data.
+ * This function allows this pointer to be defined.
+ * The exact type of the container data is defined by applications for each
+ * RT Container.
+ * It is therefore unknown at the level of the RT Container module.
+ * This function accordingly treats the pointer to the procedure data as a
+ * pointer to <code>void</code>.
+ * In most cases, the container data will take the form of a <code>struct</code>
+ * whose fields represent the inputs and outputs for the procedure actions
+ * and guards.
+ *
+ * The functions which implement the container's procedures access the
+ * container data as follows:
+ * - The procedure functions take the container descriptor as an argument
+ *   (because they must conform to the <code>::FwRtAction_t</code> prototype).
+ * - The procedure functions use the <code>::FwRtGetData</code> function to
+ *   retrieve the pointer to the container data.
+ * - The pointer returned by <code>::FwRtGetData</code> is defined as a pointer
+ *   to <code>void</code> and will normally have to be cast to its true type.
+ * .
+ * If this function is not called, the value of the container data is NULL.
+ *
+ * This function may be called at any time but should normally be called only during
+ * the container configuration process.
+ * @param rtDesc the RT Container descriptor.
+ * @param rtData the pointer to the container data (a value of NULL is legal
+ * if no data need be attached to the container).
+ */
+void FwRtSetData(FwRtDesc_t rtDesc, void* rtData);
+
+/**
+ * Get the pointer to the container data in the container descriptor.
+ * This function returns the pointer which was set with the
+ * <code>::FwRtSetData</code> function.
+ * @param rtDesc the RT Container descriptor.
+ * @return the pointer to the container data.
+ */
+void* FwRtGetData(FwRtDesc_t rtDesc);
+
+/**
+ * Define the function implementing the Initialization Action for the Notification
+ * Procedure.
+ * The argument function must conform to the <code>::FwRtAction_t</code> prototype.
+ *
+ * If this function is not called, the default value for the Initialization Action
+ * is used which is a dummy action which corresponds to a situation where no
+ * initialization action is performed by the Notification Procedure.
+ *
+ * This function may only be called during the container's configuration process
+ * (i.e. before <code>::FwRtInit</code> is called or after <code>::FwRtShutdown</code>
+ * is called).
+ * If it is called at any other time, it causes the container's state to be
+ * put in error state <code>::rtConfigErr</code>.
+ * @param rtDesc the RT Container descriptor.
+ * @param initializeNotifPr the pointer to the function implementing the
+ * Initialization Action for the Notification Procedure.
+ */
+void FwRtSetInitializeNotifPr(FwRtDesc_t rtDesc, FwRtAction_t initializeNotifPr);
+
+/**
+ * Define the function implementing the Finalization Action for the Notification
+ * Procedure.
+ * The argument function must conform to the <code>::FwRtAction_t</code> prototype.
+ *
+ * If this function is not called, the default value for the Finalization Action
+ * is used which is a dummy action which corresponds to a situation where no
+ * finalization action is performed by the Notification Procedure.
+ *
+ * This function may only be called during the container's configuration process
+ * (i.e. before <code>::FwRtInit</code> is called or after <code>::FwRtShutdown</code>
+ * is called).
+ * If it is called at any other time, it causes the container's state to be
+ * put in error state <code>::rtConfigErr</code>.
+ * @param rtDesc the RT Container descriptor.
+ * @param finalizeNotifPr the pointer to the function implementing the
+ * Finalization Action for the Notification Procedure.
+ */
+void FwRtSetFinalizeNotifPr(FwRtDesc_t rtDesc, FwRtAction_t finalizeNotifPr);
+
+/**
+ * Define the function implementing the Notification Logic for the Notification
+ * Procedure.
+ * The argument function must conform to the <code>::FwRtAction_t</code> prototype.
+ *
+ * If this function is not called, the default value for the Notification Logic
+ * is used which is a dummy action which never skips a notification.
+ *
+ * This function may only be called during the container's configuration process
+ * (i.e. before <code>::FwRtInit</code> is called or after <code>::FwRtShutdown</code>
+ * is called).
+ * If it is called at any other time, it causes the container's state to be
+ * put in error state <code>::rtConfigErr</code>.
+ * @param rtDesc the RT Container descriptor.
+ * @param implementNotifLogicPr the pointer to the function implementing the
+ * Notification Logic for the Notification Procedure.
+ */
+void FwRtSetImplementNotifLogic(FwRtDesc_t rtDesc, FwRtAction_t implementNotifLogicPr);
+
+/**
+ * Define the function implementing the Initialization Action for the Activation
+ * Procedure.
+ * The argument function must conform to the <code>::FwRtAction_t</code> prototype.
+ *
+ * If this function is not called, the default value for the Initialization Action
+ * is used which is a dummy action which corresponds to a situation where no
+ * initialization action is performed by the Activation Procedure.
+ *
+ * This function may only be called during the container's configuration process
+ * (i.e. before <code>::FwRtInit</code> is called or after <code>::FwRtShutdown</code>
+ * is called).
+ * If it is called at any other time, it causes the container's state to be
+ * put in error state <code>::rtConfigErr</code>.
+ * @param rtDesc the RT Container descriptor.
+ * @param initializeActivPr the pointer to the function implementing the
+ * Initialization Action for the Activation Procedure.
+ */
+void FwRtSetInitializeActivPr(FwRtDesc_t rtDesc, FwRtAction_t initializeActivPr);
+
+/**
+ * Define the function implementing the Finalization Action for the Activation
+ * Procedure.
+ * The argument function must conform to the <code>::FwRtAction_t</code> prototype.
+ *
+ * If this function is not called, the default value for the Finalization Action
+ * is used which is a dummy action which corresponds to a situation where no
+ * finalization action is performed by the Activation Procedure.
+ *
+ * This function may only be called during the container's configuration process
+ * (i.e. before <code>::FwRtInit</code> is called or after <code>::FwRtShutdown</code>
+ * is called).
+ * If it is called at any other time, it causes the container's state to be
+ * put in error state <code>::rtConfigErr</code>.
+ * @param rtDesc the RT Container descriptor.
+ * @param finalizeActivPr the pointer to the function implementing the
+ * Finalization Action for the Activation Procedure.
+ */
+void FwRtSetFinalizeActivPr(FwRtDesc_t rtDesc, FwRtAction_t finalizeActivPr);
+
+/**
+ * Define the function implementing the logic to set up a notification for the
+ * RT Container.
+ * The argument function must conform to the <code>::FwRtAction_t</code> prototype.
+ *
+ * If this function is not called, the default value for the Set Up Notification
+ * Function is used which is a dummy action which corresponds to a situation
+ * where no notification set-up mechanism is implemented.
+ *
+ * This function may only be called during the container's configuration process
+ * (i.e. before <code>::FwRtInit</code> is called or after <code>::FwRtShutdown</code>
+ * is called).
+ * If it is called at any other time, it causes the container's state to be
+ * put in error state <code>::rtConfigErr</code>.
+ * @param rtDesc the RT Container descriptor.
+ * @param setUpNotification the pointer to the function implementing the
+ * Set Up Notification logic.
+ */
+void FwRtSetSetUpNotif(FwRtDesc_t rtDesc, FwRtAction_t setUpNotification);
+
+/**
+ * Define the function implementing the activation logic for the RT Container.
+ * The argument function must conform to the <code>::FwRtAction_t</code> prototype.
+ *
+ * If this function is not called, the default value for the Implementation Activation
+ * Logic Function is used which is a dummy action which corresponds to a situation
+ * where the container's functional behaviour is executed at every activation cycle.
+ *
+ * This function may only be called during the container's configuration process
+ * (i.e. before <code>::FwRtInit</code> is called or after <code>::FwRtShutdown</code>
+ * is called).
+ * If it is called at any other time, it causes the container's state to be
+ * put in error state <code>::rtConfigErr</code>.
+ * @param rtDesc the RT Container descriptor.
+ * @param implementActivLogic the pointer to the function implementing the
+ * container's activation logic.
+ */
+void FwRtSetImplementActivLogic(FwRtDesc_t rtDesc, FwRtAction_t implementActivLogic);
+
+/**
+ * Define the function which executes the functional behaviour associated to the
+ * RT Container.
+ * The argument function must conform to the <code>::FwRtAction_t</code> prototype.
+ *
+ * If this function is not called, the default value for the container's functional
+ * behaviour is used.
+ * This is a dummy action which corresponds to a situation where the
+ * container's functional behaviour is terminated after the first execution.
+ *
+ * This function may only be called during the container's configuration process
+ * (i.e. before <code>::FwRtInit</code> is called or after <code>::FwRtShutdown</code>
+ * is called).
+ * If it is called at any other time, it causes the container's state to be
+ * put in error state <code>::rtConfigErr</code>.
+ * @param rtDesc the RT Container descriptor.
+ * @param execFuncBehaviour the pointer to the function implementing the
+ * container's functional behaviour.
+ */
+void FwRtSetExecFuncBehaviour(FwRtDesc_t rtDesc, FwRtAction_t execFuncBehaviour);
+
+#endif /* FWRT_CONFIG_H_ */
diff --git a/FwProfile/src/FwRtConstants.h b/FwProfile/src/FwRtConstants.h
new file mode 100644
index 0000000..f88fcd3
--- /dev/null
+++ b/FwProfile/src/FwRtConstants.h
@@ -0,0 +1,274 @@
+/**
+ * @file
+ * @ingroup rtGroup
+ * Header file to define all constants and types for the RT Container Module
+ * of the FW Profile.
+ * This header file should be included by all applications which use the
+ * RT Container Module of the FW Profile.
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef FWRT_CONSTANTS_H_
+#define FWRT_CONSTANTS_H_
+
+#if __sparc__
+  #include <fsu_pthread.h> 
+#else
+  #include <pthread.h>
+#endif
+
+
+/**
+ * Forward declaration for the pointer to a RT Container Descriptor.
+ * A RT Container Descriptor is a data structure which holds all the information
+ * describing a RT Container instance.
+ */
+typedef struct FwRtDesc* FwRtDesc_t;
+
+/** Type used for booleans (0 is "false" and 1 is "true"). */
+typedef int FwRtBool_t;
+
+/** Type used for the outcome of a container action. */
+typedef int FwRtOutcome_t;
+
+/** Type used for unsigned integers with a "medium" range. */
+typedef short int FwRtCounterU2_t;
+
+/**
+ * Type for a pointer to a container action.
+ * A container action is a function which encapsulates an action executed by
+ * either the Notification Procedure or the Activation Procedure of a
+ * RT Container.
+ * Container actions return an outcome.
+ * The semantics of the outcome depends on the kind of action.
+ */
+typedef FwRtOutcome_t (*FwRtAction_t)(FwRtDesc_t);
+
+/**
+ * Enumerated type for the state of the RT Container.
+ * The only nominal values are <code>rtContStopped</code> and <code>rtContStarted</code>.
+ * If the container is not in one of these two states, its behaviour is undefined.
+ * All other values indicate that an error has been reported by a system call.
+ * The error code reported by the system call is stored in the error code field of
+ * the RT Container Descriptor.
+ */
+typedef enum {
+  /** The RT Container has not yet been initialized */
+  rtContUninitialized = 0,
+  /** The RT Container is in state STOPPED */
+  rtContStopped = 3,
+  /** The RT Container is in state STARTED */
+  rtContStarted = 4,
+  /** The function to create the Activation Thread has reported an error */
+  rtThreadCreateErr = 5,
+  /** The function to initialize the container mutex has reported an error */
+  rtMutexInitErr = 6,
+  /** The function to destroy the container mutex has reported an error */
+  rtMutexDestroyErr = 7,
+  /** The function to initialize the container condition has reported an error */
+  rtCondInitErr = 8,
+  /** The function to destroy the container condition has reported an error */
+  rtCondDestroyErr = 9,
+  /** The function to lock the container mutex has reported an error */
+  rtMutexLockErr = 10,
+  /** The function to unlock the container mutex has reported an error */
+  rtMutexUnlockErr = 11,
+  /** The function to signal a condition has reported an error */
+  rtCondSignalErr = 12,
+  /** The function to wait on a condition has reported an error */
+  rtCondWaitErr = 13,
+  /** The function to initialize a mutex attribute has reported an error */
+  rtMutexAttrInitErr = 14,
+  /** The function to initialize a mutex attribute has reported an error */
+  rtCondAttrInitErr = 15,
+  /** The function to initialize a thread attribute has reported an error */
+  rtThreadAttrInitErr = 16,
+  /** The function to destroy a mutex attribute has reported an error */
+  rtMutexAttrDestroyErr = 17,
+  /** The function to destroy a mutex attribute has reported an error */
+  rtCondAttrDestroyErr = 18,
+  /** The function to destroy a thread attribute has reported an error */
+  rtThreadAttrDestroyErr = 19,
+  /** The function to wait on a thread join has reported an error */
+  rtJoinErr = 20,
+  /** A configuration function has been called during the container's normal operation
+   * (i.e. after <code>::FwRtInit</code> has been called but before <code>::FwRtShutdown</code>
+   * is called) */
+  rtConfigErr = 21
+} FwRtState_t;
+
+typedef enum { rtSampleEnumItem } FwRtSampleEnum;
+
+/**
+ * Structure representing a RT Container Descriptor.
+ * The RT Container Descriptor holds all the information which describes a RT
+ * Container.
+ * This consists of:
+ * - The STARTED/STOPPED state of the RT Container;
+ * - The activation thread;
+ * - The lock (a mutex) associated to the RT Container;
+ * - The state of the Notification and Activation Procedures associated to the
+ *   container;
+ * - The pointers to the functions which implement the adaptation points of
+ *   the container;
+ * - The outcome of the last action executed by the Notification Procedure;
+ * - The outcome of the last action executed by the Activation Procedure;
+ * - The error code for the RT Container;
+ * - A pointer to a user-defined data structure to hold the container's data.
+ * .
+ * The STARTED/STOPPED state of the RT Container is not stored explicitly
+ * because a RT Container is started if and only if its pthread object is
+ * non-NULL.
+ */
+struct FwRtDesc {
+  /** The state of the RT Container. */
+  FwRtState_t state;
+  /**
+   * The pointer to the Activation Thread attributes.
+   * The default value of NULL indicates the default values of a pthread
+   * attributes should be used.
+   */
+  pthread_attr_t* pThreadAttr;
+  /**
+   * The pointer to the mutex attributes.
+   * The default value of NULL indicates the default values of a pthread
+   * mutex attributes should be used.
+   */
+  pthread_mutexattr_t* pMutexAttr;
+  /**
+   * The pointer to the condition variable attributes.
+   * The default value of NULL indicates the default values of a pthread
+   * condition variable attributes should be used.
+   */
+  pthread_condattr_t* pCondAttr;
+  /** The thread associated to the RT Container. */
+  pthread_t activationThread;
+  /** The mutex associated to the RT Container. */
+  pthread_mutex_t mutex;
+  /** The condition variable associated to the RT Container */
+  pthread_cond_t cond;
+  /** The notification counter */
+  FwRtCounterU2_t notifCounter;
+  /**
+   * Pointer to the function encapsulating the initialization action for the
+   * Notification Procedure.
+   * This is a user-defined function.
+   * This function is called once when the Notification Procedure is executed
+   * for the first time.
+   * It should perform any initialization action which is required by the
+   * Notification Procedure.
+   * The function always returns a value of 1.
+   */
+  FwRtAction_t initializeNotifPr;
+  /**
+   * Pointer to the function encapsulating the finalization action for the
+   * Notification Procedure.
+   * This is a user-defined function.
+   * This function is called just before the Notification Procedure terminates.
+   * It should perform any finalization action which is required by the
+   * Notification Procedure.
+   * The function always returns a value of 1.
+   */
+  FwRtAction_t finalizeNotifPr;
+  /**
+   * Pointer to the function encapsulating the implementation of the notification
+   * logic.
+   * This is a user-defined function.
+   * After the Notification Procedure has been executed for the first time,
+   * this function is called every time the procedure is executed as long as
+   * the Notification Procedure has not been stopped.
+   * This procedure should implement the logic which decides whether the Activation
+   * Thread should be notified.
+   * The function returns 1 if the Activation Thread is to be notified or it returns
+   * 0 if the notification of the Activation Thread should be skipped.
+   */
+  FwRtAction_t implementNotifLogic;
+  /**
+   * Pointer to the function encapsulating the initialization action for the
+   * Activation Procedure.
+   * This is a user-defined function.
+   * This function is called once when the Activation Procedure is executed
+   * for the first time.
+   * It should perform any initialization action which is required by the
+   * Activation Procedure.
+   * The function always returns a value of 1.
+   */
+  FwRtAction_t initializeActivPr;
+  /**
+   * Pointer to the function encapsulating the finalization action for the
+   * Activation Procedure.
+   * This is a user-defined function.
+   * This function is called just before the Activation Procedure terminates.
+   * It should perform any finalization action which is required by the
+   * Activation Procedure.
+   * The function always returns a value of 1.
+   */
+  FwRtAction_t finalizeActivPr;
+  /**
+   * Pointer to the function encapsulating the logic to set up the notification
+   * for the RT Container.
+   * This is a user-defined function.
+   * This function is called each time the Activation Procedure is executed.
+   * This function may be used to implement the logic which determines when the
+   * next notification is sent to the RT Container.
+   * The function always returns a value of 1.
+   */
+  FwRtAction_t setUpNotification;
+  /**
+   * Pointer to the function encapsulating the implementation of the activation
+   * logic.
+   * This is a user-defined function.
+   * After the Activation Procedure has been executed for the first time,
+   * this function is called every time the procedure is executed as long as
+   * the RT Container has not been stopped.
+   * This procedure should implement the logic which decides whether the Functional
+   * Behaviour associated to the RT Container is executed.
+   * The function returns 1 if the container's functional behaviour should be executed
+   * and it returns 0 if the container's functional behaviour should not be executed.
+   */
+  FwRtAction_t implementActivLogic;
+  /**
+   * Pointer to the function encapsulating the execution of the functional behaviour
+   * associated to the RT Container.
+   * This is a user-defined function.
+   * After the Activation Procedure has been executed for the first time,
+   * this function is called every time the procedure is executed as long as
+   * the RT Container has not been stopped.
+   * This procedure should implement the functional behaviour associated to the
+   * RT Container.
+   * The function returns 1 if the execution of the functional behaviour has terminated
+   * and it returns 0 if the execution of the functional behaviour is not yet terminated.
+   */
+  FwRtAction_t execFuncBehaviour;
+  /** The flag indicating whether the Notification Procedure is STÂRTED. */
+  FwRtBool_t notifPrStarted;
+  /** The flag indicating whether the Activation Procedure is STÂRTED. */
+  FwRtBool_t activPrStarted;
+  /** The return value of the last system call which failed. */
+  int errCode;
+  /** The pointer to the RT Container data. */
+  void* rtData;
+};
+
+#endif /* FWRT_CONSTANTS_H_ */
diff --git a/FwProfile/src/FwRtCore.c b/FwProfile/src/FwRtCore.c
new file mode 100644
index 0000000..b5ea2ca
--- /dev/null
+++ b/FwProfile/src/FwRtCore.c
@@ -0,0 +1,290 @@
+/**
+ * @file
+ * @ingroup rtGroup
+ * Implements Core Functions of the RT Container.
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include "FwRtCore.h"
+#include "FwRtConstants.h"
+#if 0
+  #include <pthread.h> /* use fsu_pthread.h on SPARC */
+#endif
+#include <stdlib.h>
+
+/**
+ * The Activation Thread of the RT Container.
+ * This function is called by the Activation Thread when it is created.
+ * @param ptr this parameter is not used
+ * @return this function always returns NULL
+ */
+void* ExecActivThread(void* ptr);
+
+/**
+ * Execute the loop in the Notification Procedure.
+ * @param rtDesc the descriptor of the RT Container
+ */
+void ExecNotifProcedure(FwRtDesc_t rtDesc);
+
+/**
+ * Execute the loop in the Activation Procedure.
+ * No check is performed on whether the activation procedure is started
+ * because, by design, the Activation Procedure is only ever executed
+ * if it is started.
+ * @param rtDesc the descriptor of the RT Container
+ */
+void ExecActivProcedure(FwRtDesc_t rtDesc);
+
+/*--------------------------------------------------------------------------------------*/
+void FwRtStart(FwRtDesc_t rtDesc) {
+  int errCode;
+
+  if ((errCode = pthread_mutex_lock(&(rtDesc->mutex))) != 0) {
+    rtDesc->errCode = errCode;
+    rtDesc->state   = rtMutexLockErr;
+    return;
+  }
+
+  if (rtDesc->state != rtContStopped) {
+    if ((errCode = pthread_mutex_unlock(&(rtDesc->mutex))) != 0) {
+      rtDesc->errCode = errCode;
+      rtDesc->state   = rtMutexUnlockErr;
+      return;
+    }
+    return;
+  }
+
+  /* Start Notification Procedure */
+  rtDesc->notifPrStarted = 1;
+  /* Start Activation Procedure */
+  rtDesc->activPrStarted = 1;
+
+  /* Execute Notification and Activation Procedures. Since the procedures have just been
+   * started, this is equivalent to executing their initialization actions and (for the
+   * Activation Procedure) its Set Up Notification action. */
+  rtDesc->initializeNotifPr(rtDesc);
+  rtDesc->initializeActivPr(rtDesc);
+  rtDesc->setUpNotification(rtDesc);
+
+  rtDesc->state        = rtContStarted;
+  rtDesc->notifCounter = 0;
+
+  /* Create thread */
+  if ((errCode = pthread_create(&(rtDesc->activationThread), rtDesc->pThreadAttr, ExecActivThread, rtDesc)) != 0) {
+    rtDesc->errCode = errCode;
+    rtDesc->state   = rtThreadCreateErr;
+    return;
+  }
+
+  if ((errCode = pthread_mutex_unlock(&(rtDesc->mutex))) != 0) {
+    rtDesc->errCode = errCode;
+    rtDesc->state   = rtMutexUnlockErr;
+    return;
+  }
+
+  return;
+}
+
+/*--------------------------------------------------------------------------------------*/
+void FwRtStop(FwRtDesc_t rtDesc) {
+  int errCode;
+
+  if ((errCode = pthread_mutex_lock(&(rtDesc->mutex))) != 0) {
+    rtDesc->errCode = errCode;
+    rtDesc->state   = rtMutexLockErr;
+    return;
+  }
+
+  if (rtDesc->state != rtContStarted) {
+    if ((errCode = pthread_mutex_unlock(&(rtDesc->mutex))) != 0) {
+      rtDesc->errCode = errCode;
+      rtDesc->state   = rtMutexUnlockErr;
+      return;
+    }
+    return;
+  }
+
+  /* Stop the RT Container */
+  rtDesc->state = rtContStopped;
+
+  /* Notify the Activation Thread */
+  rtDesc->notifCounter++;
+
+  if ((errCode = pthread_cond_signal(&(rtDesc->cond))) != 0) {
+    rtDesc->errCode = errCode;
+    rtDesc->state   = rtCondSignalErr;
+    return;
+  }
+
+  if ((errCode = pthread_mutex_unlock(&(rtDesc->mutex))) != 0) {
+    rtDesc->errCode = errCode;
+    rtDesc->state   = rtMutexUnlockErr;
+    return;
+  }
+
+  return;
+}
+
+/*--------------------------------------------------------------------------------------*/
+void FwRtNotify(FwRtDesc_t rtDesc) {
+  int errCode;
+
+  if ((errCode = pthread_mutex_lock(&(rtDesc->mutex))) != 0) {
+    rtDesc->errCode = errCode;
+    rtDesc->state   = rtMutexLockErr;
+    return;
+  }
+  ExecNotifProcedure(rtDesc);
+  if ((errCode = pthread_mutex_unlock(&(rtDesc->mutex))) != 0) {
+    rtDesc->errCode = errCode;
+    rtDesc->state   = rtMutexUnlockErr;
+    return;
+  }
+}
+
+/*--------------------------------------------------------------------------------------*/
+void FwRtWaitForTermination(FwRtDesc_t rtDesc) {
+  int   errCode;
+  void* status = 0;
+
+  if ((errCode = pthread_join(rtDesc->activationThread, &status)) != 0) {
+    rtDesc->errCode = errCode;
+    rtDesc->state   = rtJoinErr;
+    return;
+  }
+}
+
+/*--------------------------------------------------------------------------------------*/
+FwRtBool_t FwRtIsNotifPrStarted(FwRtDesc_t rtDesc) {
+  return rtDesc->notifPrStarted;
+}
+
+/*--------------------------------------------------------------------------------------*/
+FwRtBool_t FwRtIsActivPrStarted(FwRtDesc_t rtDesc) {
+  return rtDesc->activPrStarted;
+}
+
+/*--------------------------------------------------------------------------------------*/
+FwRtState_t FwRtGetContState(FwRtDesc_t rtDesc) {
+  return rtDesc->state;
+}
+
+/*--------------------------------------------------------------------------------------*/
+int FwRtGetErrCode(FwRtDesc_t rtDesc) {
+  return rtDesc->errCode;
+}
+
+/*--------------------------------------------------------------------------------------*/
+FwRtCounterU2_t FwRtGetNotifCounter(FwRtDesc_t rtDesc) {
+  return rtDesc->notifCounter;
+}
+
+/*--------------------------------------------------------------------------------------*/
+void ExecNotifProcedure(FwRtDesc_t rtDesc) {
+  int errCode;
+
+  if (rtDesc->notifPrStarted == 0) {
+    return;
+  }
+
+  if (rtDesc->activPrStarted == 0) {
+    rtDesc->finalizeNotifPr(rtDesc);
+    rtDesc->notifPrStarted = 0;
+    return;
+  }
+
+  if (rtDesc->implementNotifLogic(rtDesc) == 1) {
+    rtDesc->notifCounter++;
+    if ((errCode = pthread_cond_signal(&(rtDesc->cond))) != 0) {
+      rtDesc->errCode = errCode;
+      rtDesc->state   = rtCondSignalErr;
+      return;
+    }
+  }
+
+  return;
+}
+
+/*--------------------------------------------------------------------------------------*/
+void ExecActivProcedure(FwRtDesc_t rtDesc) {
+
+  if (rtDesc->state == rtContStopped) {
+    rtDesc->finalizeActivPr(rtDesc);
+    rtDesc->activPrStarted = 0;
+    return;
+  }
+
+  if (rtDesc->implementActivLogic(rtDesc) == 1) { /* Execute functional behaviour */
+    if (rtDesc->execFuncBehaviour(rtDesc) == 1) { /* Functional behaviour is terminated */
+      rtDesc->finalizeActivPr(rtDesc);
+      rtDesc->activPrStarted = 0;
+      return;
+    }
+  }
+  rtDesc->setUpNotification(rtDesc);
+  return;
+}
+
+/*--------------------------------------------------------------------------------------*/
+void* ExecActivThread(void* ptr) {
+  FwRtDesc_t rtDesc = (FwRtDesc_t)ptr;
+  int        errCode;
+
+  while (1) {
+    if ((errCode = pthread_mutex_lock(&(rtDesc->mutex))) != 0) {
+      rtDesc->errCode = errCode;
+      rtDesc->state   = rtMutexLockErr;
+      return NULL;
+    }
+    while (rtDesc->notifCounter == 0) {
+      if ((errCode = pthread_cond_wait(&(rtDesc->cond), &(rtDesc->mutex))) != 0) {
+        rtDesc->errCode = errCode;
+        rtDesc->state   = rtCondWaitErr;
+        return NULL;
+      }
+    }
+    rtDesc->notifCounter--;
+    if ((errCode = pthread_mutex_unlock(&(rtDesc->mutex))) != 0) {
+      rtDesc->errCode = errCode;
+      rtDesc->state   = rtMutexUnlockErr;
+      return NULL;
+    }
+
+    ExecActivProcedure(rtDesc);
+
+    if (rtDesc->activPrStarted == 0) {
+      rtDesc->state = rtContStopped; /* Put RT Container in state STOPPED */
+      FwRtNotify(rtDesc);            /* Execute Notification Procedure in mutual exclusion */
+      break;
+    }
+
+    if (rtDesc->state == rtContStopped) {
+      ExecActivProcedure(rtDesc);
+      FwRtNotify(rtDesc); /* Execute Notification Procedure in mutual exclusion */
+      break;
+    }
+  }
+
+  return NULL;
+}
diff --git a/FwProfile/src/FwRtCore.h b/FwProfile/src/FwRtCore.h
new file mode 100644
index 0000000..aa1bb55
--- /dev/null
+++ b/FwProfile/src/FwRtCore.h
@@ -0,0 +1,220 @@
+/**
+ * @file
+ * @ingroup rtGroup
+ * Declaration of the API for a RT Container.
+ * A RT Container consists of:
+ * - A POSIX thread (the container's Activation Thread)
+ * - A POSIX mutex
+ * - A POSIX condition variable
+ * - Two procedures (the Notification Procedure and the Activation Procedure)
+ * - A pointer to a user-defined data structure to hold the data associated to the
+ *   RT Container
+ * - An error code field to hold the code of the last error encountered by the
+ *   container procedures
+ * .
+ * The Notification Procedure and the Activation Procedure implement the logic
+ * defined in the figure below.
+ *
+ * This interface offers functions to:
+ * - start and stop the RT Container;
+ * - execute the container's Notification Procedure;
+ * - query the state of the container or of its procedures.
+ * .
+ * The functions declared in this header file, take a RT Container Descriptor
+ * as their argument.
+ * This represents the RT Container upon which the functions operate.
+ * The functions assume that the container has been fully and correctly configured
+ * (this is done through the functions defined in <code>FwRtConfig.h</code>).
+ *
+ * The basic mode of use of the functions defined in this header file is as follows:
+ * -# The container is configured through the functions offered by
+ *    <code>FwRtConfig.h</code>.
+ * -# The RT Container is started with function <code>::FwRtStart</code>.
+ * -# The RT Container is notified by calling function
+ *    <code>::FwRtNotify</code>.
+ * -# The RT Container is stopped with function <code>::FwRtStop</code>.
+ * .
+ * After the container has been stopped, it can be re-started.
+ * @image html RTContainer.png
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef FWRT_CORE_H_
+#define FWRT_CORE_H_
+
+#include "FwRtConstants.h"
+
+/**
+ * Start a RT Container.
+ * A RT Container can be in two states: STARTED or STOPPED.
+ * This function proceeds as follows:
+ * - It locks the container's mutex
+ * - If the container is not in state STOPPED, the function releases
+ *   the mutex and returns without doing anything.
+ * - If instead the container is in state STOPPED, the function:
+ *   1. puts the container in state STARTED;
+ *   2. resets the Notification Counter
+ *   3. starts the Notification Procedure
+ *   4. starts the Activation Procedure
+ *   5. executes the Notification Procedure (this causes its initialization action
+ *      to be performed)
+ *   6. executes the Activation Procedure (this causes its initialization action
+ *      to be performed)
+ *   7. creates the container's Activation Thread (this also releases the thread);
+ *   8. release the mutex and returns
+ * .
+ * The attributes of the Activation Thread are NULL by default or are those
+ * set with function <code>::FwRtSetPosixAttr</code>.
+ *
+ * If any of the system calls made by this function returns an error, the
+ * container is put in an error state (see <code>::FwRtState_t</code>) and
+ * the error code is stored in the <code>errCode</code> field of the container
+ * descriptor.
+ *
+ * The Activation Thread is released upon creation and executes the following actions:
+ * <pre>
+ * while true do {
+ *   lock container's mutex;
+ *   	wait until Notification Counter is greater than zero;
+ *   	decrement Notification Counter;
+ *   release container's mutex;
+ *   execute Activation Procedure;
+ *
+ *   if (Activation Procedure has terminated) then {
+ *     put RT Container in STOPPED state;
+ *     execute Notification Procedure;
+ *     break;
+ *   }
+ *
+ *   if (RT Container is in state STOPPED) then {
+ *     execute Activation Procedure;
+ *     execute Notification Procedure;
+ *     break;
+ *   }
+ * }
+ * </pre>
+ * Use of this function is subject to the following constraint:
+ * - The function may only be called before the Activation Thread has been created for
+ *   the first time or after the Activation Thread has terminated execution (function
+ *   <code>::FwRtWaitForTermination</code> can be used to wait for the Activation Thread
+ *   to have terminated).
+ * .
+ * @param rtDesc the descriptor of the RT Container.
+ */
+void FwRtStart(FwRtDesc_t rtDesc);
+
+/**
+ * Stop a RT Container.
+ * A RT Container can be in two states: STARTED or STOPPED.
+ * This function proceeds as follows:
+ * - It locks the container's mutex.
+ * - If the container is not in state STARTED, the function releases
+ *   the mutex and returns.
+ * - If instead the container is in state STARTED, the function: (a) puts
+ *   the container in the STOPPED state; (b) sends a notification to
+ *   the Activation Thread; and (c) releases the mutex.
+ * .
+ * If any of the system calls made by this function returns an error, the
+ * container is put in an error state (see <code>::FwRtState_t</code>) and
+ * the error code is stored in the <code>errCode</code> field of the container
+ * descriptor.
+ * @param rtDesc the descriptor of the RT Container.
+ */
+void FwRtStop(FwRtDesc_t rtDesc);
+
+/**
+ * Blocking function which returns when the Activation Thread has terminated.
+ * This function uses POSIX's <code>pthread_join</code> to wait until the
+ * Activation Thread has terminated.
+ *
+ * Use of this function is subject to the following constraints:
+ * - While this function is waiting on a given container, no other call to the
+ *   function can be made on the same container.
+ * - Use of this function assumes that the thread in the argument container
+ *   is joinable (this will normally be the case if the container's thread
+ *   has been created with default attributes).
+ * .
+ * @param rtDesc the descriptor of the RT Container.
+ */
+void FwRtWaitForTermination(FwRtDesc_t rtDesc);
+
+/**
+ * Execute the Notification Procedure of a RT Container.
+ * This function proceeds as follows:
+ * - It locks the container mutex.
+ * - It executes the Notification Procedure
+ * - It releases the mutex
+ * .
+ * @param rtDesc the descriptor of the RT Container.
+ */
+void FwRtNotify(FwRtDesc_t rtDesc);
+
+/**
+ * Check whether the Notification Procedure is started.
+ * This function is not thread-safe (but note that it only returns the value of
+ * a field of the RT Container descriptor).
+ * @param rtDesc the descriptor of the RT Container.
+ * @return 1 if the Notification Procedure is started, 0 otherwise.
+ */
+FwRtBool_t FwRtIsNotifPrStarted(FwRtDesc_t rtDesc);
+
+/**
+ * Check whether the Activation Procedure is started.
+ * This function is not thread-safe (but note that it only returns the value of
+ * a field of the RT Container descriptor).
+ * @param rtDesc the descriptor of the RT Container.
+ * @return 1 if the Activation Procedure is started, 0 otherwise.
+ */
+FwRtBool_t FwRtIsActivPrStarted(FwRtDesc_t rtDesc);
+
+/**
+ * Return the RT Container state.
+ * This function is not thread-safe (but note that it only returns the value of
+ * a field of the RT Container descriptor).
+ * @param rtDesc the descriptor of the RT Container.
+ * @return the state of the RT Container.
+ */
+FwRtState_t FwRtGetContState(FwRtDesc_t rtDesc);
+
+/**
+ * Return the error code of the RT Container.
+ * This function is not thread-safe (but note that it only returns the value of
+ * a field of the RT Container descriptor).
+ * @param rtDesc the descriptor of the RT Container.
+ * @return the state of the RT Container.
+ */
+int FwRtGetErrCode(FwRtDesc_t rtDesc);
+
+/**
+ * Return the value of the notification counter.
+ * The value of the notification counter represents the number of pending notifications
+ * in the RT Container.
+ * This function is not thread-safe (but note that it only returns the value of
+ * a field of the RT Container descriptor).
+ * @param rtDesc the descriptor of the RT Container.
+ * @return the value of the notification counter.
+ */
+FwRtCounterU2_t FwRtGetNotifCounter(FwRtDesc_t rtDesc);
+
+#endif /* FWRT_CORE_H_ */
diff --git a/FwProfile/src/FwSmAux.c b/FwProfile/src/FwSmAux.c
new file mode 100644
index 0000000..ccf3a54
--- /dev/null
+++ b/FwProfile/src/FwSmAux.c
@@ -0,0 +1,352 @@
+/**
+ * @file
+ * @ingroup smGroup
+ * Implements the auxiliary functions of the FW State Machine Module.
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include "FwSmAux.h"
+#include "FwSmConfig.h"
+#include "FwSmPrivate.h"
+
+/* ------------------------------------------------------------------------------- */
+void FwSmPrintConfig(FwSmDesc_t smDesc, FILE* stream) {
+  char            prefix[1]     = "";
+  FwSmCounterS1_t actNOfPStates = 0;
+  FwSmCounterS1_t actNOfCStates = 0;
+  FwSmCounterS1_t actNOfTrans   = 0;
+  FwSmCounterS1_t actNOfEsm     = 0;
+  FwSmCounterS1_t actNOfActions = 0;
+  FwSmCounterS1_t actNOfGuards  = 0;
+  FwSmCounterS1_t i, j, baseLoc;
+  SmTrans_t       trans;
+
+  if (smDesc == NULL) {
+    fprintf(stream, "%sThe argument state machine descriptor is NULL\n", prefix);
+    return;
+  }
+
+  for (i = 0; i < smDesc->smBase->nOfPStates; i++) {
+    if (smDesc->smBase->pStates[i].outTransIndex != 0) {
+      actNOfPStates++;
+    }
+  }
+
+  for (i = 0; i < smDesc->smBase->nOfCStates; i++) {
+    if (smDesc->smBase->cStates[i].outTransIndex != 0) {
+      actNOfCStates++;
+    }
+  }
+
+  for (i = 0; i < smDesc->smBase->nOfTrans; i++) {
+    if (smDesc->smBase->trans[i].iTrAction != -1) {
+      actNOfTrans++;
+    }
+  }
+
+  for (i = 0; i < smDesc->smBase->nOfPStates; i++) {
+    if (smDesc->esmDesc[i] != NULL) {
+      actNOfEsm++;
+    }
+  }
+
+  for (i = 0; i < smDesc->nOfActions; i++) {
+    if (smDesc->smActions[i] != NULL) {
+      actNOfActions++;
+    }
+  }
+
+  for (i = 0; i < smDesc->nOfGuards; i++) {
+    if (smDesc->smGuards[i] != NULL) {
+      actNOfGuards++;
+    }
+  }
+
+  fprintf(stream, "\n");
+  fprintf(stream, "%sSTATE MACHINE SIZE\n", prefix);
+  fprintf(stream, "%s------------------\n", prefix);
+  fprintf(stream, "%sDeclared number of states              : %d\n", prefix, smDesc->smBase->nOfPStates);
+  fprintf(stream, "%sDeclared number of choice pseudo-states: %d\n", prefix, smDesc->smBase->nOfCStates);
+  fprintf(stream, "%sDeclared number of transitions         : %d\n", prefix, smDesc->smBase->nOfTrans);
+  fprintf(stream, "%sDeclared number of actions             : %d\n", prefix, smDesc->nOfActions - 1);
+  fprintf(stream, "%sDeclared number of guards              : %d\n", prefix, smDesc->nOfGuards - 1);
+  fprintf(stream, "\n");
+
+  fprintf(stream, "%sSTATE MACHINE CONFIGURATION\n", prefix);
+  fprintf(stream, "%s---------------------------\n", prefix);
+  fprintf(stream, "%sThe error code is                        : %s\n", prefix, FwSmPrintErrCode(smDesc->errCode));
+  fprintf(stream, "%sThe SM Execution Counter is              : %u\n", prefix, smDesc->smExecCnt);
+  fprintf(stream, "%sThe State Execution Counter is           : %u\n", prefix, smDesc->stateExecCnt);
+  fprintf(stream, "%sThe outcome of the configuration check is: %s\n", prefix, FwSmPrintErrCode(FwSmCheck(smDesc)));
+  fprintf(stream, "%sNumber of configured states              : %d\n", prefix, actNOfPStates);
+  fprintf(stream, "%sNumber of configured choice pseudo-states: %d\n", prefix, actNOfCStates);
+  fprintf(stream, "%sNumber of configured transitions         : %d\n", prefix, actNOfTrans);
+  fprintf(stream, "%sNumber of configured actions             : %d\n", prefix, actNOfActions - 1);
+  fprintf(stream, "%sNumber of configured guards              : %d\n", prefix, actNOfGuards - 1);
+  fprintf(stream, "%sNumber of embedded state machines        : %d\n", prefix, actNOfEsm);
+  if (FwSmIsStarted(smDesc) == 0) {
+    fprintf(stream, "%sCurrent state machine state is           : STOPPED\n", prefix);
+  }
+  else {
+    fprintf(stream, "%sState machine is STARTED and is in state : %d\n", prefix, FwSmGetCurState(smDesc));
+  }
+  fprintf(stream, "\n");
+
+  fprintf(stream, "%sCONFIGURATION OF INITIAL PSEUDO STATE\n", prefix);
+  fprintf(stream, "%s-------------------------------------\n", prefix);
+
+  if (smDesc->smBase->trans[0].iTrAction == -1) {
+    fprintf(stream, "%sThe transition from the initial pseudo-state is not defined\n", prefix);
+  }
+  else {
+    if (smDesc->smBase->trans[0].dest > 0) {
+      fprintf(stream, "%sThe transition from the initial pseudo state is to state n. %d\n", prefix,
+              smDesc->smBase->trans[0].dest);
+    }
+    else if (smDesc->smBase->trans[0].dest < 0) {
+      fprintf(stream, "%sThe transition from the initial pseudo state is to choice pseudo-state n. %d\n", prefix,
+              -smDesc->smBase->trans[0].dest);
+    }
+    else {
+      fprintf(stream, "%sThe transition from the initial pseudo state is to the final pseudo-state.\n", prefix);
+    }
+
+    if (smDesc->smBase->trans[0].iTrAction != 0) {
+      fprintf(stream, "\tTransition Action is action n. %d\n", smDesc->smBase->trans[0].iTrAction);
+    }
+    else {
+      fprintf(stream, "\tNo Transition Action\n");
+    }
+
+    fprintf(stream, "\tNo Transition Guard\n");
+  }
+  fprintf(stream, "\n");
+
+  if (smDesc->smBase->nOfPStates > 0) {
+    fprintf(stream, "%sCONFIGURATION OF STATES\n", prefix);
+    fprintf(stream, "%s-----------------------\n", prefix);
+  }
+
+  for (i = 0; i < smDesc->smBase->nOfPStates; i++) {
+    if (smDesc->smBase->pStates[i].outTransIndex == 0) {
+      fprintf(stream, "%sState %d is not defined\n", prefix, i + 1);
+    }
+    else {
+      fprintf(stream, "%sState %d:\n", prefix, i + 1);
+
+      if (smDesc->smBase->pStates[i].iEntryAction != 0) {
+        fprintf(stream, "\tEntry Action: action n. %d\n", smDesc->smBase->pStates[i].iEntryAction);
+      }
+      else {
+        fprintf(stream, "\tNo entry action\n");
+      }
+
+      if (smDesc->smBase->pStates[i].iDoAction != 0) {
+        fprintf(stream, "\tDo-Action: action n. %d\n", smDesc->smBase->pStates[i].iDoAction);
+      }
+      else {
+        fprintf(stream, "\tNo do-action\n");
+      }
+
+      if (smDesc->smBase->pStates[i].iExitAction != 0) {
+        fprintf(stream, "\tExit Action: action n. %d\n", smDesc->smBase->pStates[i].iExitAction);
+      }
+      else {
+        fprintf(stream, "\tNo exit action\n");
+      }
+
+      if (smDesc->esmDesc[i] == NULL) {
+        fprintf(stream, "\tNo state machine is embedded in this state\n");
+      }
+      else {
+        fprintf(stream, "\tA state machine is embedded in this state\n");
+      }
+
+      baseLoc = smDesc->smBase->pStates[i].outTransIndex;
+      for (j = baseLoc; j < (baseLoc + smDesc->smBase->pStates[i].nOfOutTrans); j++) {
+        trans = smDesc->smBase->trans[j];
+        if (trans.id == FW_TR_EXECUTE) {
+          if (trans.dest > 0) {
+            fprintf(stream, "\t'Execute' transition to state %d\n", trans.dest);
+          }
+          else if (trans.dest < 0) {
+            fprintf(stream, "\t'Execute' transition to choice pseudo-state %d\n", -trans.dest);
+          }
+          else {
+            fprintf(stream, "\t'Execute' transition to final pseudo-state\n");
+          }
+        }
+        else {
+          if (trans.dest > 0) {
+            fprintf(stream, "\tTransition %d to state %d\n", trans.id, trans.dest);
+          }
+          else if (trans.dest < 0) {
+            fprintf(stream, "\tTransition %d to choice pseudo-state %d\n", trans.id, -trans.dest);
+          }
+          else {
+            fprintf(stream, "\tTransition %d to final pseudo-state\n", trans.id);
+          }
+        }
+
+        if (trans.iTrAction != 0) {
+          fprintf(stream, "\t\tTransition Action is action n. %d\n", trans.iTrAction);
+        }
+        else {
+          fprintf(stream, "\t\tNo Transition Action\n");
+        }
+
+        if (trans.iTrGuard != 0) {
+          fprintf(stream, "\t\tTransition Guard is guard n. %d\n", trans.iTrGuard);
+        }
+        else {
+          fprintf(stream, "\t\tNo Transition Guard\n");
+        }
+      }
+    }
+  }
+  fprintf(stream, "\n");
+
+  if (smDesc->smBase->nOfCStates > 0) {
+    fprintf(stream, "%sCONFIGURATION OF CHOICE PSEUDO-STATES\n", prefix);
+    fprintf(stream, "%s-------------------------------------\n", prefix);
+  }
+
+  for (i = 0; i < smDesc->smBase->nOfCStates; i++) {
+    if (smDesc->smBase->cStates[i].outTransIndex == 0) {
+      fprintf(stream, "%sChoice Pseudo-State %d is not defined\n", prefix, i + 1);
+    }
+    else {
+      fprintf(stream, "%sChoice Pseudo-State %d:\n", prefix, i + 1);
+
+      baseLoc = smDesc->smBase->cStates[i].outTransIndex;
+      for (j = baseLoc; j < (baseLoc + smDesc->smBase->cStates[i].nOfOutTrans); j++) {
+        if (smDesc->smBase->trans[j].dest > 0) {
+          fprintf(stream, "\tTransition to state %d\n", smDesc->smBase->trans[j].dest);
+        }
+        else if (smDesc->smBase->trans[j].dest < 0) {
+          fprintf(stream, "\tTransition to choice pseudo-state %d (this is an illegal transition)\n",
+                  -smDesc->smBase->trans[j].dest);
+        }
+        else {
+          fprintf(stream, "\tTransition to final pseudo-state\n");
+        }
+
+        if (smDesc->smBase->trans[j].iTrAction != 0) {
+          fprintf(stream, "\t\tTransition Action: action n. %d\n", smDesc->smBase->trans[j].iTrAction);
+        }
+        else {
+          fprintf(stream, "\t\tNo Transition Action\n");
+        }
+
+        if (smDesc->smBase->trans[j].iTrGuard != 0) {
+          fprintf(stream, "\t\tTransition Guard: guard n. %d\n", smDesc->smBase->trans[j].iTrGuard);
+        }
+        else {
+          fprintf(stream, "\t\tNo Transition Guard\n");
+        }
+      }
+    }
+  }
+}
+
+/* ------------------------------------------------------------------------------- */
+void FwSmPrintConfigRec(FwSmDesc_t smDesc, FILE* stream) {
+  FwSmCounterS1_t i;
+  FwSmDesc_t      embDesc;
+
+  FwSmPrintConfig(smDesc, stream);
+
+  for (i = 1; i <= smDesc->smBase->nOfPStates; ++i) {
+    embDesc = FwSmGetEmbSm(smDesc, i);
+    if (NULL != embDesc) {
+      FwSmPrintConfigRec(embDesc, stream);
+    }
+  }
+}
+
+/* ------------------------------------------------------------------------------- */
+char* FwSmPrintErrCode(FwSmErrCode_t errCode) {
+  switch (errCode) {
+  case smSuccess:
+    return "success";
+  case smOutOfMemory:
+    return "smOutOfMemory";
+  case smNullPState:
+    return "smNullPState";
+  case smNullCState:
+    return "smNullCState";
+  case smNullTrans:
+    return "smNullTrans";
+  case smConfigErr:
+    return "smConfigErr";
+  case smIllStateId:
+    return "smIllStateId";
+  case smIllChoiceId:
+    return "smIllChoiceId";
+  case smStateIdInUse:
+    return "smStateIdInUse";
+  case smChoiceIdInUse:
+    return "smChoiceIdInUse";
+  case smUndefinedTransSrc:
+    return "smUndefinedTransSrc";
+  case smIllegalPDest:
+    return "smIllegalPDest";
+  case smIllegalCDest:
+    return "smIllegalCDest";
+  case smIllNOfOutTrans:
+    return "smIllNOfOutTrans";
+  case smIllTransSrc:
+    return "smIllTransSrc";
+  case smTransErr:
+    return "smTransErr";
+  case smTooManyTrans:
+    return "smTooManyTrans";
+  case smTooManyOutTrans:
+    return "smTooManyOutTrans";
+  case smTooManyActions:
+    return "smTooManyActions";
+  case smTooManyGuards:
+    return "smTooManyGuards";
+  case smTooFewActions:
+    return "smTooFewActions";
+  case smTooFewGuards:
+    return "smTooFewGuards";
+  case smNegOutTrans:
+    return "smNegOutTrans";
+  case smUndefAction:
+    return "smUndefAction";
+  case smUndefGuard:
+    return "smUndefGuard";
+  case smNotDerivedSM:
+    return "smNotDerivedSM";
+  case smEsmDefined:
+    return "smEsmDefined";
+  case smWrongNOfActions:
+    return "smWrongNOfActions";
+  case smWrongNOfGuards:
+    return "smWrongNOfGuards";
+  default:
+    return "invalid error code";
+  }
+}
diff --git a/FwProfile/src/FwSmAux.h b/FwProfile/src/FwSmAux.h
new file mode 100644
index 0000000..f279b95
--- /dev/null
+++ b/FwProfile/src/FwSmAux.h
@@ -0,0 +1,99 @@
+/**
+ * @file
+ * @ingroup smGroup
+ * Declaration of the auxiliary interface for a FW State Machine.
+ * The auxiliary interface offers functions which support the
+ * development of an application which uses the FW State Machine
+ * but which are not expected to be used during normal operation.
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef FWSM_AUX_H_
+#define FWSM_AUX_H_
+
+#include "FwSmCore.h"
+#include <stdio.h>
+
+/**
+ * Print the configuration of the state machine to an output stream.
+ * This function extracts all the configuration information from the
+ * argument state machine and prints it to the argument output stream.
+ * It is legal for the argument state machine to be only partly configured.
+ * It is also legal to call this function on a state machine which has
+ * already been started.
+ *
+ * The function describes the configuration of the argument state machine
+ * in terms of its states, choice pseudo-states, transitions, actions
+ * and guards.
+ * The following conventions are used to refer to these items:
+ * - The name of a state is its identifier.
+ * - The name of a choice pseudo-state is its identifier.
+ * - Transitions are identified by their source, destination,
+ *   transition identifier, transition action and guard.
+ * - The name of an action is an integer in the range [1,N] where N is
+ *   total number of actions declared for the state machine and the
+ *   action with identifier 'i' is the i-th action to have been added
+ *   to the state machine.
+ * - The name of a guard is an integer in the range [1,M] where M is
+ *   total number of guards declared for the state machine and the
+ *   guard with identifier 'i' is the i-th guard to have been added
+ *   to the state machine.
+ *
+ * This function assumes the argument output stream to be open and
+ * to have enough space to receive the output generated by the function.
+ * The function neither closes nor flushes the output stream.
+ * Opening and closing of the output stream must thus be done by the caller.
+ * @param smDesc the descriptor of the state machine to be started.
+ * @param stream the output stream to which the configuration information is
+ * printed.
+ */
+void FwSmPrintConfig(FwSmDesc_t smDesc, FILE* stream);
+
+/**
+ * Print the configuration of the state machine and its embedded state machines
+ * to an output stream.
+ * This is a recursive version of <code>::FwSmPrintConfig</code> which operates
+ * on a state machine and, recursively, on all its embedded state machines.
+ * This function assumes the argument output stream to be open and
+ * to have enough space to receive the output generated by the function.
+ * The function neither closes nor flushes the output stream.
+ * Opening and closing of the output stream must thus be done by the caller.
+ * @param smDesc the descriptor of the state machine to be started.
+ * @param stream the output stream to which the configuration information is
+ * printed.
+ */
+void FwSmPrintConfigRec(FwSmDesc_t smDesc, FILE* stream);
+
+/**
+ * Print the name of a state machine error code.
+ * Error code are defined as instances of an enumerated type in
+ * <code>FwSmConstants.h</code>.
+ * This function translates an error code to a string holding the
+ * name of its enumerated value.
+ * @param errCode the error code
+ * @return the string holding the name of the error code
+ */
+char* FwSmPrintErrCode(FwSmErrCode_t errCode);
+
+#endif /* FWSM_AUX_H_ */
diff --git a/FwProfile/src/FwSmConfig.c b/FwProfile/src/FwSmConfig.c
new file mode 100644
index 0000000..25ce767
--- /dev/null
+++ b/FwProfile/src/FwSmConfig.c
@@ -0,0 +1,529 @@
+/**
+ * @file
+ * @ingroup smGroup
+ * Implements the configuration functions for the FW State Machine Module.
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include "FwSmConfig.h"
+#include "FwSmPrivate.h"
+#include <stdlib.h>
+
+/**
+ * Create a transition (other than the transition from the initial pseudo-state) with the
+ * given characteristics and add it to state machine.
+ * The newly created transition is stored in the transition array at the first non-null location
+ * (in other words, the first transition to be added to the state machine is stored at location 0,
+ * the second transition is stored at location 1, etc).
+ * @param smDesc the descriptor of the state machine to which the transition is added.
+ * @param transId the identifier of the trigger which is associated to the transition. This is an integer
+ * which is unique for the state machine and for all its embedded state machines. The zero identifier is
+ * reserved for the "execute" transition.
+ * @param srcId the identifier of the source of the transition.
+ * @param srcType the type of the source.
+ * @param destId the identifier of the destination of the transition. If the destination is a proper
+ * state, this argument has a positive value equal to the destination identifier. If the destination
+ * is a choice pseudo-state, this argument has a negative value equal to the opposite of the destination
+ * identifier. If the destination is the final pseudo-state, this argument has the value zero.
+ * @param trAction the transition action (or NULL if no action is associated to this transition).
+ * @param trGuard the transition guard (or NULL if no guard is associated to this transition).
+ */
+static void AddTrans(FwSmDesc_t smDesc, FwSmCounterU2_t transId, FwSmCounterS1_t srcId, StateType_t srcType,
+                     FwSmCounterS1_t destId, FwSmAction_t trAction, FwSmGuard_t trGuard);
+
+/**
+ * Add an action to the set of actions in the state machine descriptor.
+ * This function scans the array of actions in the state machine descriptor and
+ * can then have one of three outcomes:
+ * - if the argument action is equal to NULL, the function returns 0;
+ * - if the argument action is already present in the array of actions, the function
+ *   returns the index of the location where the action is stored;
+ * - if the argument action is not present and the array of actions is not full, the
+ *   function adds it at the first free location and returns the index of this
+ *   location;
+ * - if the argument action is not present but the array of actions is already full,
+ *   the function returns 0.
+ * @param smDesc descriptor of the state machine where the action is added
+ * @param action action to be added
+ * @return the location where the action is stored in the array or -1 if the
+ * action cannot be added because the array is already full
+ */
+static FwSmCounterS1_t AddAction(FwSmDesc_t smDesc, FwSmAction_t action);
+
+/**
+ * Add a guard to the set of guards in the state machine descriptor.
+ * This function scans the array of guards in the state machine descriptor and
+ * can then have one of three outcomes:
+ * - if the argument guard is equal to NULL, the function returns 0;
+ * - if the argument guard is already present in the array of guards, the function
+ *   returns the index of the location where the guard is stored;
+ * - if the argument guard is not present and the array of guards is not full, the
+ *   function adds it at the first free location and returns the index of this
+ *   location;
+ * - if the argument guard is not present but the array of guards is already full, the
+ *   function returns 0.
+ * @param smDesc descriptor of the state machine where the guard is added
+ * @param guard guard to be added
+ * @return the location where the guard is stored in the array or -1 if the
+ * guard cannot be added because the array is already full
+ */
+static FwSmCounterS1_t AddGuard(FwSmDesc_t smDesc, FwSmGuard_t guard);
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwSmSetData(FwSmDesc_t smDesc, void* smData) {
+  smDesc->smData = smData;
+}
+
+void* FwSmGetData(FwSmDesc_t smDesc) {
+  return smDesc->smData;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwSmAddState(FwSmDesc_t smDesc, FwSmCounterS1_t stateId, FwSmCounterS1_t nOfOutTrans, FwSmAction_t entryAction,
+                  FwSmAction_t exitAction, FwSmAction_t doAction, FwSmDesc_t esmDesc) {
+
+  SmPState_t*   pState;
+  SmBaseDesc_t* smBase = smDesc->smBase;
+
+  if (stateId > smBase->nOfPStates) {
+    smDesc->errCode = smIllStateId;
+    return;
+  }
+
+  if (stateId < 1) {
+    smDesc->errCode = smIllStateId;
+    return;
+  }
+
+  if (smBase->pStates[stateId - 1].outTransIndex != 0) {
+    smDesc->errCode = smStateIdInUse;
+    return;
+  }
+
+  if (nOfOutTrans < 0) {
+    smDesc->errCode = smNegOutTrans;
+    return;
+  }
+
+  if (smDesc->transCnt + nOfOutTrans > smBase->nOfTrans) {
+    smDesc->errCode = smTooManyOutTrans;
+    return;
+  }
+
+  /* Initialize newly added state */
+  pState = &(smBase->pStates[stateId - 1]);
+
+  pState->outTransIndex = smDesc->transCnt;
+  smDesc->transCnt      = (FwSmCounterS1_t)(smDesc->transCnt + nOfOutTrans);
+
+  pState->iDoAction    = AddAction(smDesc, doAction);
+  pState->iEntryAction = AddAction(smDesc, entryAction);
+  pState->iExitAction  = AddAction(smDesc, exitAction);
+
+  smDesc->esmDesc[stateId - 1] = esmDesc;
+  pState->nOfOutTrans          = nOfOutTrans;
+
+  return;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwSmAddChoicePseudoState(FwSmDesc_t smDesc, FwSmCounterS1_t choiceId, FwSmCounterS1_t nOfOutTrans) {
+  SmCState_t*   cState;
+  SmBaseDesc_t* smBase = smDesc->smBase;
+
+  if (choiceId > smBase->nOfCStates) {
+    smDesc->errCode = smIllChoiceId;
+    return;
+  }
+
+  if (choiceId < 1) {
+    smDesc->errCode = smIllChoiceId;
+    return;
+  }
+
+  if (smBase->cStates[choiceId - 1].outTransIndex != 0) {
+    smDesc->errCode = smChoiceIdInUse;
+    return;
+  }
+
+  if (nOfOutTrans < 1) {
+    smDesc->errCode = smIllNOfOutTrans;
+    return;
+  }
+
+  if (smDesc->transCnt + nOfOutTrans > smBase->nOfTrans) {
+    smDesc->errCode = smTooManyOutTrans;
+    return;
+  }
+
+  /* Initialize newly added choice pseudo-state */
+  cState = &(smBase->cStates[choiceId - 1]);
+
+  cState->outTransIndex = smDesc->transCnt;
+  smDesc->transCnt      = (FwSmCounterS1_t)(smDesc->transCnt + nOfOutTrans);
+
+  cState->nOfOutTrans = nOfOutTrans;
+
+  return;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwSmAddTransIpsToSta(FwSmDesc_t smDesc, FwSmCounterS1_t destId, FwSmAction_t trAction) {
+  AddTrans(smDesc, 0, 0, stoppedState, destId, trAction, NULL);
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwSmAddTransIpsToCps(FwSmDesc_t smDesc, FwSmCounterS1_t destId, FwSmAction_t trAction) {
+  AddTrans(smDesc, 0, 0, stoppedState, (FwSmCounterS1_t)(-destId), trAction, NULL);
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwSmAddTransStaToSta(FwSmDesc_t smDesc, FwSmCounterU2_t transId, FwSmCounterS1_t srcId, FwSmCounterS1_t destId,
+                          FwSmAction_t trAction, FwSmGuard_t trGuard) {
+  AddTrans(smDesc, transId, srcId, properState, destId, trAction, trGuard);
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwSmAddTransStaToCps(FwSmDesc_t smDesc, FwSmCounterU2_t transId, FwSmCounterS1_t srcId, FwSmCounterS1_t destId,
+                          FwSmAction_t trAction, FwSmGuard_t trGuard) {
+  AddTrans(smDesc, transId, srcId, properState, (FwSmCounterS1_t)(-destId), trAction, trGuard);
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwSmAddTransCpsToSta(FwSmDesc_t smDesc, FwSmCounterS1_t srcId, FwSmCounterS1_t destId, FwSmAction_t trAction,
+                          FwSmGuard_t trGuard) {
+  AddTrans(smDesc, 0, srcId, choicePseudoState, destId, trAction, trGuard);
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwSmAddTransStaToFps(FwSmDesc_t smDesc, FwSmCounterU2_t transId, FwSmCounterS1_t srcId, FwSmAction_t trAction,
+                          FwSmGuard_t trGuard) {
+  AddTrans(smDesc, transId, srcId, properState, 0, trAction, trGuard);
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwSmAddTransCpsToFps(FwSmDesc_t smDesc, FwSmCounterS1_t srcId, FwSmAction_t trAction, FwSmGuard_t trGuard) {
+  AddTrans(smDesc, 0, srcId, choicePseudoState, 0, trAction, trGuard);
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+static void AddTrans(FwSmDesc_t smDesc, FwSmCounterU2_t transId, FwSmCounterS1_t srcId, StateType_t srcType,
+                     FwSmCounterS1_t destId, FwSmAction_t trAction, FwSmGuard_t trGuard) {
+
+  FwSmCounterS1_t i, baseLoc, nOfOutTrans;
+  FwSmCounterS1_t loc = -1;
+  SmTrans_t*      trans;
+  SmBaseDesc_t*   smBase = smDesc->smBase;
+
+  /* check that the source state is legal and has been defined */
+  if (srcType == properState) {
+    if (srcId > smBase->nOfPStates) {
+      smDesc->errCode = smIllTransSrc;
+      return;
+    }
+    if (smBase->pStates[srcId - 1].outTransIndex == 0) {
+      smDesc->errCode = smUndefinedTransSrc;
+      return;
+    }
+    if (smBase->pStates[srcId - 1].nOfOutTrans < 1) {
+      smDesc->errCode = smIllTransSrc;
+      return;
+    }
+    baseLoc     = smBase->pStates[srcId - 1].outTransIndex;
+    nOfOutTrans = smBase->pStates[srcId - 1].nOfOutTrans;
+  }
+  else if (srcType == choicePseudoState) {
+    if (srcId > smBase->nOfCStates) {
+      smDesc->errCode = smIllTransSrc;
+      return;
+    }
+    if (smBase->cStates[srcId - 1].outTransIndex == 0) {
+      smDesc->errCode = smUndefinedTransSrc;
+      return;
+    }
+    baseLoc     = smBase->cStates[srcId - 1].outTransIndex;
+    nOfOutTrans = smBase->cStates[srcId - 1].nOfOutTrans;
+  }
+  else { /* Source state is the stopped state */
+    baseLoc     = 0;
+    nOfOutTrans = 1;
+  }
+
+  /* New transition will be stored in the transition array of the SM Descriptor at a location
+   * in the range [baseLoc, baseLoc+nOfOutTrans]. We check that this range of locations
+   * is not already full.
+   */
+  if (smBase->trans[baseLoc + nOfOutTrans - 1].iTrAction != -1) {
+    smDesc->errCode = smTooManyTrans;
+    return;
+  }
+
+  /* Identify location where newly added transition will be stored in the transition array.
+   * Note that the nOfOutTrans is guaranteed to be greater than zero by the way it is
+   * initialized in the previous statements in this function. Hence, the loop will be
+   * taken at least once. */
+  for (i = 0; i < nOfOutTrans; i++) {
+    if (smBase->trans[baseLoc + i].iTrAction == -1) {
+      loc = (FwSmCounterS1_t)(baseLoc + i);
+      break;
+    }
+  }
+  trans = &(smBase->trans[loc]);
+
+  /* Assign the transition identifier */
+  trans->id = transId;
+
+  /* Assign transition destination */
+  trans->dest = destId;
+
+  /* add transition action to transition descriptor */
+  trans->iTrAction = AddAction(smDesc, trAction);
+
+  /* add guard to transition descriptor */
+  trans->iTrGuard = AddGuard(smDesc, trGuard);
+
+  return;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+static FwSmCounterS1_t AddAction(FwSmDesc_t smDesc, FwSmAction_t action) {
+  FwSmCounterS1_t i;
+
+  if (action == NULL) {
+    return 0;
+  }
+
+  for (i = 1; i < smDesc->nOfActions; i++) {
+    if (smDesc->smActions[i] == NULL) {
+      break;
+    }
+    if (action == smDesc->smActions[i]) {
+      return i;
+    }
+  }
+
+  if (i < smDesc->nOfActions) {
+    smDesc->smActions[i] = action;
+    return i;
+  }
+
+  smDesc->errCode = smTooManyActions;
+  return 0;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+static FwSmCounterS1_t AddGuard(FwSmDesc_t smDesc, FwSmGuard_t guard) {
+  FwSmCounterS1_t i;
+
+  if (guard == NULL) {
+    return 0;
+  }
+
+  for (i = 1; i < smDesc->nOfGuards; i++) {
+    if (smDesc->smGuards[i] == NULL) {
+      break;
+    }
+    if (guard == smDesc->smGuards[i]) {
+      return i;
+    }
+  }
+
+  if (i < smDesc->nOfGuards) {
+    smDesc->smGuards[i] = guard;
+    return i;
+  }
+
+  smDesc->errCode = smTooManyGuards;
+  return 0;
+}
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwSmErrCode_t FwSmCheck(FwSmDesc_t smDesc) {
+
+  FwSmCounterS1_t i, j;
+  FwSmBool_t      found;
+  SmBaseDesc_t*   smBase = smDesc->smBase;
+
+  /* Check that no error occurred during the configuration process */
+  if (smDesc->errCode != smSuccess) {
+    return smConfigErr;
+  }
+
+  /* Check that all proper states have been defined */
+  for (i = 0; i < smBase->nOfPStates; i++) {
+    if (smBase->pStates[i].outTransIndex == 0) {
+      return smNullPState;
+    }
+  }
+
+  /* Check that all choice pseudo-states have been defined */
+  for (i = 0; i < smBase->nOfCStates; i++) {
+    if (smBase->cStates[i].outTransIndex == 0) {
+      return smNullCState;
+    }
+  }
+
+  /* Check that all transitions have been defined */
+  for (i = 0; i < smBase->nOfTrans; i++) {
+    if (smBase->trans[i].iTrAction == -1) {
+      return smNullTrans;
+    }
+  }
+
+  /* Check that all transition destinations are legal states or choice pseudo-states */
+  for (i = 0; i < smBase->nOfTrans; i++) {
+    if (smBase->trans[i].dest > smBase->nOfPStates) {
+      return smIllegalPDest;
+    }
+    if (smBase->trans[i].dest < -smBase->nOfCStates) {
+      return smIllegalCDest;
+    }
+  }
+
+  /* Check that all actions have been defined */
+  for (i = 0; i < smDesc->nOfActions; i++) {
+    if (smDesc->smActions[i] == NULL) {
+      return smTooFewActions;
+    }
+  }
+
+  /* Check that all guards have been defined */
+  for (i = 0; i < smDesc->nOfGuards; i++) {
+    if (smDesc->smGuards[i] == NULL) {
+      return smTooFewGuards;
+    }
+  }
+
+  /* Check that all states are reachable */
+  for (i = 1; i <= smBase->nOfPStates; i++) {
+    found = 0;
+    for (j = 0; j < smBase->nOfTrans; j++) {
+      if (smBase->trans[j].dest == i) {
+        found = 1;
+        break;
+      }
+    }
+    if (found == 0) {
+      return smUnreachablePState;
+    }
+  }
+
+  /* Check that all choice pseudo-states are reachable */
+  for (i = 1; i <= smBase->nOfCStates; i++) {
+    found = 0;
+    for (j = 0; j < smBase->nOfTrans; j++) {
+      if (smBase->trans[j].dest == -i) {
+        found = 1;
+        break;
+      }
+    }
+    if (found == 0) {
+      return smUnreachableCState;
+    }
+  }
+
+  return smSuccess;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwSmErrCode_t FwSmCheckRec(FwSmDesc_t smDesc) {
+  FwSmErrCode_t   outcome;
+  FwSmCounterS1_t i;
+
+  /* Check all embedded state machines */
+  for (i = 0; i < smDesc->smBase->nOfPStates; i++) {
+    if (smDesc->esmDesc[i] != NULL) {
+      outcome = FwSmCheckRec(smDesc->esmDesc[i]);
+      if (outcome != smSuccess) {
+        return outcome;
+      }
+    }
+  }
+
+  return FwSmCheck(smDesc);
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwSmOverrideAction(FwSmDesc_t smDesc, FwSmAction_t oldAction, FwSmAction_t newAction) {
+  FwSmCounterS1_t i;
+
+  if (smDesc->transCnt != 0) {
+    smDesc->errCode = smNotDerivedSM;
+    return;
+  }
+
+  for (i = 1; i < smDesc->nOfActions; i++) {
+    if (smDesc->smActions[i] == oldAction) {
+      smDesc->smActions[i] = newAction;
+      return;
+    }
+  }
+
+  smDesc->errCode = smUndefAction;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwSmOverrideGuard(FwSmDesc_t smDesc, FwSmGuard_t oldGuard, FwSmGuard_t newGuard) {
+  FwSmCounterS1_t i;
+
+  if (smDesc->transCnt != 0) {
+    smDesc->errCode = smNotDerivedSM;
+    return;
+  }
+
+  for (i = 1; i < smDesc->nOfGuards; i++) {
+    if (smDesc->smGuards[i] == oldGuard) {
+      smDesc->smGuards[i] = newGuard;
+      return;
+    }
+  }
+
+  smDesc->errCode = smUndefGuard;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwSmEmbed(FwSmDesc_t smDesc, FwSmCounterS1_t stateId, FwSmDesc_t esmDesc) {
+
+  if (smDesc->transCnt != 0) {
+    smDesc->errCode = smNotDerivedSM;
+    return;
+  }
+
+  if (stateId < 1) {
+    smDesc->errCode = smIllStateId;
+    return;
+  }
+
+  if (stateId > smDesc->smBase->nOfPStates) {
+    smDesc->errCode = smIllStateId;
+    return;
+  }
+
+  if (smDesc->esmDesc[stateId - 1] != NULL) {
+    smDesc->errCode = smEsmDefined;
+    return;
+  }
+
+  smDesc->esmDesc[stateId - 1] = esmDesc;
+  return;
+}
diff --git a/FwProfile/src/FwSmConfig.h b/FwProfile/src/FwSmConfig.h
new file mode 100644
index 0000000..dae01c5
--- /dev/null
+++ b/FwProfile/src/FwSmConfig.h
@@ -0,0 +1,546 @@
+/**
+ * @file
+ * @ingroup smGroup
+ * Declaration of the configuration interface for a FW State Machine.
+ * A FW State Machine is described by a state machine descriptor.
+ * The functions declared in this interface allow a state machine descriptor
+ * to be configured.
+ * During the configuration process, the states, the choice pseudo-states and
+ * the transitions of the state machine are defined.
+ *
+ * There are two types of state machines: newly created state machines
+ * (i.e. state machines which are created from scratch using <code>::FwSmCreate</code>
+ * or <code>#FW_SM_INST</code>) and derived state machines (i.e. state
+ * machines which are created by extending another state machine through calls
+ * to <code>::FwSmCreateDer</code> or <code>#FW_SM_INST_DER</code>).
+ * The functions declared in this header file can be used to configure both types
+ * of state machines.
+ *
+ * In the case of a newly created state machine, the mode of use of the
+ * functions in this header file is as follows:
+ * -# The states of the state machine are added to its descriptor with
+ *    the <code>::FwSmAddState</code> function.
+ * -# The choice pseudo-states of the state machine are added to its
+ *    descriptor with the <code>::FwSmAddChoicePseudoState</code> function.
+ * -# The transitions of the state machines are added to the state machine
+ *    with the <code>FwSmAddFlow*</code> functions (there are several of these
+ *    functions, one for each type of transition source and destination).
+ * -# The pointer to the state machine data in the state machine descriptor
+ *    is set with the <code>::FwSmSetData</code> function.
+ * -# The consistency and completeness of the state machine configuration may
+ *    be verified with function <code>::FwSmCheck</code> or
+ *    <code>::FwSmCheckRec</code>. Use of this function is optional.
+ * .
+ * The only constraint on the order in which the above functions are called is
+ * that a transition from a state or choice pseudo-state can only be defined
+ * after the source state or choice pseudo-state has been defined.
+ *
+ * In the case of a derived state machine, the mode of use of the functions
+ * declared in this header file is as follows:
+ * -# An action (either a state or a transition action) can be overridden
+ *    with the <code>::FwSmOverrideAction</code> function.
+ * -# A guard can be overridden with the <code>::FwSmOverrideGuard</code> function.
+ * -# A state machine can be embedded in the state of the derived state
+ *    machine with the <code>::FwSmEmbed</code> function.
+ * -# The consistency and completeness of the configuration of the derived
+ *    state machine may be verified with function <code>::FwSmCheck</code> or
+ *    <code>::FwSmCheckRec</code>. Use of this function is optional.
+ * .
+ * There are no constraints on the order in which the above functions are
+ * called.
+ *
+ * Error handling is done as follows:
+ * - Errors are reported through error codes. The range of error codes is
+ *   defined in header file <code>FwSmConstant.h</code>. The error code is
+ *   stored in the state machine descriptor (see <code>::FwSmGetErrCode</code>).
+ * - If an illegal input value could cause a corruption of the internal data
+ *   structures of a state machine descriptor, a check is performed on the
+ *   input parameter value and the function is aborted if this is found to be
+ *   illegal.
+ * - When a function takes a state machine descriptor as an argument, no
+ *   check is performed that the argument is non-NULL and valid (e.g. if
+ *   a configuration function is called with a NULL value for the state
+ *   machine descriptor argument, this error is not handled and the call
+ *   will probably result in a segmentation fault).
+ * .
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef FWSM_CONFIG_H_
+#define FWSM_CONFIG_H_
+
+#include "FwSmCore.h"
+
+/**
+ * Set the pointer to the state machine data in the state machine descriptor.
+ * The state machine data are data which are manipulated by the state machine
+ * actions and guards.
+ * The state machine descriptor holds a pointer to the state machine data.
+ * This function allows this pointer to be defined.
+ * The exact type of the state machine data is defined by applications for each
+ * state machine.
+ * It is therefore unknown at the level of the FW State Machine Module.
+ * This function accordingly treats the pointer to the state machine data as a
+ * pointer to <code>void</code>.
+ * In most cases, the state machine data will take the form of a <code>struct</code>
+ * whose fields represents the inputs and outputs for the state machine actions
+ * and guards.
+ *
+ * The functions which implement the actions and guards access the state machine
+ * data as follows:
+ * - The functions implementing the actions and guards of a state machine
+ *   take the state machine descriptor as an argument (because they must conform
+ *   to the prototype defined by <code>::FwSmAction_t</code> and
+ *   <code>::FwSmGuard_t</code>).
+ * - The functions implementing the actions and guards of a state machine
+ *   use the <code>::FwSmGetData</code> function to retrieve the pointer to the
+ *   state machine data.
+ * - The pointer returned by <code>::FwSmGetData</code> is defined as a pointer
+ *   to <code>void</code> and will normally have to be cast to its true type.
+ * @param smDesc the descriptor of the state machine to which the data structure is attached.
+ * @param smData the pointer to the state machine data.
+ * A value of NULL is legal (but note that the default value of the pointer to the
+ * state machine data when the state machine is created is NULL).
+ */
+void FwSmSetData(FwSmDesc_t smDesc, void* smData);
+
+/**
+ * Get the pointer to the state machine data in the state machine descriptor.
+ * This function returns the pointer which was set with the
+ * <code>::FwSmSetData</code> function.
+ * This function is normally used by the functions implementing a state machine
+ * action or guard to access the state machine data.
+ * See the description of the <code>::FwSmSetData</code> function for more details.
+ * @param smDesc the descriptor of the state machine to which the data structure is attached.
+ * @return the pointer to the state machine data or NULL if no state machine data
+ * were defined for the state machine.
+ */
+void* FwSmGetData(FwSmDesc_t smDesc);
+
+/**
+ * Create a state with the given characteristics and add it to a state machine.
+ * This function reports the following errors in the error code of the state
+ * machine descriptor:
+ * - #smIllStateId: illegal value of the state identifier
+ * - #smStateIdInUse: a state with this identifier has already been defined
+ * - #smNegOutTrans: the number of out-going transitions is negative
+ * - #smTooManyOutTrans: the state adds too many transitions
+ * - #smTooManyActions: the state adds too many actions
+ * .
+ * @param smDesc the state machine to which the state is added.
+ * @param stateId the identifier of the state to be added
+ * (an integer in the range [1,N] where N is the number of states in the state machine).
+ * @param nOfOutTrans the number of out-going transitions from the new state. This must be
+ * a non-negative integer. A negative value is illegal but will not be reported as an
+ * error by this function.
+ * @param entryAction the entry action for the new state (a function pointer) or NULL if no
+ * entry action is associated to this state.
+ * @param doAction the do action for the new state (a function pointer) or NULL if no
+ * do action is associated to this state.
+ * @param exitAction the exit action for the new state (a function pointer) or NULL if no
+ * exit action is associated to this state.
+ * @param esmDesc the descriptor of the state machine embedded in the new state or NULL
+ * if no state machine is embedded in the new state.
+ */
+void FwSmAddState(FwSmDesc_t smDesc, FwSmCounterS1_t stateId, FwSmCounterS1_t nOfOutTrans, FwSmAction_t entryAction,
+                  FwSmAction_t exitAction, FwSmAction_t doAction, FwSmDesc_t esmDesc);
+
+/**
+ * Create a choice pseudo-state with the given characteristics and add it to a state machine.
+ * This function reports the following errors in the error code of the state
+ * machine descriptor:
+ * - #smIllChoiceId: illegal identifier for the choice pseudo-state
+ * - #smChoiceIdInUse: a choice pseudo-state with this identifier has already been defined
+ * - #smIllNOfOutTrans: the number of out-going transitions is smaller than 1
+ * - #smTooManyOutTrans: the choice pseudo-state adds too many out-going transitions
+ * .
+ * @param smDesc the descriptor of the state machine to which the choice pseudo-state is added.
+ * @param choiceId the identifier of the choice pseudo-state to be added (an integer
+ * in the range [1,N] where N is the number of choice pseudo-states).
+ * @param nOfOutTrans the number of outgoing transitions from the new state (a positive
+ * integer).
+ */
+void FwSmAddChoicePseudoState(FwSmDesc_t smDesc, FwSmCounterS1_t choiceId, FwSmCounterS1_t nOfOutTrans);
+
+/**
+ * Create a transition from the initial pseudo-state to a proper state and add it
+ * to a state machine.
+ * Transitions from the initial pseudo-state have no trigger and no guard.
+ * This function reports the following errors in the error code of the state
+ * machine descriptor:
+ * - #smTooManyTrans: there is no space left in the transition array of the state machine
+ *   descriptor for this transition
+ * - #smTooManyActions: there is no space left in the action array of the state machine
+ *   for the transition action defined by this transition
+ * .
+ * @param smDesc the descriptor of the state machine to which the transition is added.
+ * @param destId the identifier of the destination state of the transition (an integer in the
+ * range [1,N] where N is the number of states).
+ * @param trAction the transition action (a function pointer) or NULL if no action is associated
+ * to this transition.
+ */
+void FwSmAddTransIpsToSta(FwSmDesc_t smDesc, FwSmCounterS1_t destId, FwSmAction_t trAction);
+
+/**
+ * Create a transition from the initial pseudo-state to a choice pseudo-state and add
+ * it to a state machine.
+ * Transitions from the initial pseudo-state have no trigger and no guard.
+ * This function reports the following errors in the error code of the state
+ * machine descriptor:
+ * - #smTooManyTrans: there is no space left in the transition array of the state machine
+ *   descriptor for this transition
+ * - #smTooManyActions: there is no space left in the action array of the state machine
+ *   for the transition action defined by this transition
+ * .
+ * @param smDesc the descriptor of the state machine to which the transition is added.
+ * @param destId the identifier of the destination choice pseudo-state of the transition (an
+ * integer in the range [1,N] where N is the number of choice pseudo-states).
+ * @param trAction the transition action (a function pointer) or NULL if no action is associated
+ * to this transition.
+ */
+void FwSmAddTransIpsToCps(FwSmDesc_t smDesc, FwSmCounterS1_t destId, FwSmAction_t trAction);
+
+/**
+ * Create a transition from a proper state to a proper state and add it to a state machine.
+ * This function should only be performed after the source state of the transition has been added
+ * to the state state machine.
+ * This function reports the following errors in the error code of the state
+ * machine descriptor:
+ * - #smIllTransSrc: the identifier of the source of this transition has an illegal value
+ * - #smUndefinedTransSrc: the source of this transition has not yet been added to the state machine
+ * - #smTooManyTrans: there is no space left in the transition array of the state machine
+ *   descriptor for this transition
+ * - #smTooManyGuards: there is no space left in the guard array of the state machine
+ *   descriptor for the guard defined by this transition
+ * - #smTooManyActions: there is no space left in the action array of the state machine
+ *   for the transition action defined by this transition
+ * .
+ * @param smDesc the descriptor of the state machine to which the transition is added.
+ * @param transId the identifier of the trigger which is associated to the transition. This is an integer
+ * which is unique for the state machine and for all its embedded state machines. The zero identifier is
+ * reserved for the "Execute" transition.
+ * @param srcId the identifier of the source state of the transition (an integer in the range
+ * [1,N] where N is the number of states).
+ * @param destId the identifier of the destination state of the transition.
+ * @param trAction the transition action (a function pointer) or NULL if no action is associated
+ * to this transition.
+ * @param trGuard the transition guard (a function pointer) or NULL if no guard is associated
+ * to this transition.
+ */
+void FwSmAddTransStaToSta(FwSmDesc_t smDesc, FwSmCounterU2_t transId, FwSmCounterS1_t srcId, FwSmCounterS1_t destId,
+                          FwSmAction_t trAction, FwSmGuard_t trGuard);
+
+/**
+ * Create a transition from a proper state to a choice pseudo-state and add it to a state machine.
+ * This function should only be performed after the source state of the transition has been added
+ * to the state state machine.
+ * This function reports the following errors in the error code of the state
+ * machine descriptor:
+ * - #smIllTransSrc: the identifier of the source of this transition has an illegal value
+ * - #smUndefinedTransSrc: the source of this transition has not yet been added to the state machine
+ * - #smTooManyTrans: there is no space left in the transition array of the state machine
+ *   descriptor for this transition
+ * - #smTooManyGuards: there is no space left in the guard array of the state machine
+ *   descriptor for the guard defined by this transition
+ * - #smTooManyActions: there is no space left in the action array of the state machine
+ *   for the transition action defined by this transition
+ * .
+ * @param smDesc the descriptor of the state machine to which the transition is added.
+ * @param transId the identifier of the trigger which is associated to the transition. This is a
+ * non-negative integer but the value of zero is reserved for the "Execute" transition
+ * (see #FW_TR_EXECUTE).
+ * @param srcId the identifier of the source state of the transition (an integer in the range
+ * [1,N] where N is the number of states)
+ * @param destId the identifier of the destination choice pseudo-state of the transition (an integer
+ * in the range [1,M] where M is the number of choice pseudo-states)
+ * @param trAction the transition action (a function pointer) or NULL if no action is associated
+ * to this transition.
+ * @param trGuard the transition guard (a function pointer) or NULL if no guard is associated
+ * to this transition.
+ */
+void FwSmAddTransStaToCps(FwSmDesc_t smDesc, FwSmCounterU2_t transId, FwSmCounterS1_t srcId, FwSmCounterS1_t destId,
+                          FwSmAction_t trAction, FwSmGuard_t trGuard);
+
+/**
+ * Create a transition from a choice pseudo-state to a proper state and add it to a state machine.
+ * This function should only be performed after the source of the transition has been added
+ * to the state state machine.
+ * This function reports the following errors in the error code of the state
+ * machine descriptor:
+ * - #smIllTransSrc: the identifier of the source of this transition has an illegal value
+ * - #smUndefinedTransSrc: the source of this transition has not yet been added to the state machine
+ * - #smTooManyTrans: there is no space left in the transition array of the state machine
+ *   descriptor for this transition
+ * - #smTooManyGuards: there is no space left in the guard array of the state machine
+ *   descriptor for the guard defined by this transition
+ * - #smTooManyActions: there is no space left in the action array of the state machine
+ *   for the transition action defined by this transition
+ * .
+ * @param smDesc the descriptor of the state machine to which the transition is added.
+ * @param srcId the identifier of the source choice pseudo-state of the transition (an integer
+ * in the range [1,N] where N is the number of choice pseudo-states).
+ * @param destId the identifier of the destination state of the transition (an integer in the range
+ * [1,N] where N is the number of states).
+ * @param trAction the transition action (a function pointer) or NULL if no action is associated
+ * to this transition.
+ * @param trGuard the transition guard (a function pointer) or NULL if no guard is associated
+ * to this transition.
+ */
+void FwSmAddTransCpsToSta(FwSmDesc_t smDesc, FwSmCounterS1_t srcId, FwSmCounterS1_t destId, FwSmAction_t trAction,
+                          FwSmGuard_t trGuard);
+
+/**
+ * Create a transition from a proper state to the final pseudo-state and add it to a state machine.
+ * This function should only be performed after the source state of the transition has been added
+ * to the state state machine.
+ * This function reports the following errors in the error code of the state
+ * machine descriptor:
+ * - #smIllTransSrc: the identifier of the source of this transition has an illegal value
+ * - #smUndefinedTransSrc: the source of this transition has not yet been added to the state machine
+ * - #smTooManyTrans: there is no space left in the transition array of the state machine
+ *   descriptor for this transition
+ * - #smTooManyGuards: there is no space left in the guard array of the state machine
+ *   descriptor for the guard defined by this transition
+ * - #smTooManyActions: there is no space left in the action array of the state machine
+ *   for the transition action defined by this transition
+ * .
+ * @param smDesc the descriptor of the state machine to which the transition is added.
+ * @param transId the identifier of the trigger which is associated to the transition. This is a
+ * non-negative integer but the value of zero is reserved for the "Execute" transition
+ * (see #FW_TR_EXECUTE).
+ * @param srcId the identifier of the source state of the transition (an integer in the range
+ * [1,N] where N is the number of states).
+ * @param trAction the transition action (a function pointer) or NULL if no action is associated
+ * to this transition.
+ * @param trGuard the transition guard (a function pointer) or NULL if no guard is associated
+ * to this transition.
+ */
+void FwSmAddTransStaToFps(FwSmDesc_t smDesc, FwSmCounterU2_t transId, FwSmCounterS1_t srcId, FwSmAction_t trAction,
+                          FwSmGuard_t trGuard);
+
+/**
+ * Create a transition from a choice pseudo-state to the final pseudo-state and add it to a state machine.
+ * This function should only be performed after the source state of the transition has been added
+ * to the state state machine.
+ * Transitions from a choice pseudo-state have no trigger.
+ * This function reports the following errors in the error code of the state
+ * machine descriptor:
+ * - #smIllTransSrc: the identifier of the source of this transition has an illegal value
+ * - #smUndefinedTransSrc: the source of this transition has not yet been added to the state machine
+ * - #smTooManyTrans: there is no space left in the transition array of the state machine
+ *   descriptor for this transition
+ * - #smTooManyGuards: there is no space left in the guard array of the state machine
+ *   descriptor for the guard defined by this transition
+ * - #smTooManyActions: there is no space left in the action array of the state machine
+ *   for the transition action defined by this transition
+ * .
+ * @param smDesc the descriptor of the state machine to which the transition is added.
+ * @param srcId the identifier of the source state of the transition (an integer in the range
+ * [1,N] where N is the number of states).
+ * @param trAction the transition action (a function pointer) or NULL if no action is associated
+ * to this transition.
+ * @param trGuard the transition guard (a function pointer) or NULL if no guard is associated
+ * to this transition
+ */
+void FwSmAddTransCpsToFps(FwSmDesc_t smDesc, FwSmCounterS1_t srcId, FwSmAction_t trAction, FwSmGuard_t trGuard);
+
+/**
+ * Check the correctness and completeness of the configuration of a state machine descriptor.
+ * This function may be called on a state machine descriptor after it has been created and
+ * configured.
+ * This function does not modify the configuration of the state machine.
+ * It checks the error conditions which may arise when an application configures a
+ * state machine using the configuration functions declared in this header file.
+ * More specifically, this function performs the following checks:
+ * -# Check that no configuration errors have occurred (i.e. check that the error code
+ *    in the state machine descriptor is equal to: <code>::smSuccess</code>).
+ * -# Check that all states have been defined.
+ * -# Check that all choice pseudo-states have been defined.
+ * -# Check that all transitions have been defined.
+ * -# Check that the destinations of the transitions out of a state represent legal entities.
+ * -# Check that the destinations of the transitions out of a choice pseudo-state represent
+ *    legal entities.
+ * -# Check that the number of actions declared when the state machine was created is the same
+ *    as the number of actions defined during the state machine configuration process.
+ * -# Check that the number of guards declared when the state machine was created is the same
+ *    as the number of guards defined during the state machine configuration process.
+ * -# Check that all states are reachable (i.e. they are at the end of at least one transition).
+ * -# Check that all choice pseudo-states are reachable (i.e. they are at the end of at least
+ *    one transition).
+ * .
+ * Note that there are configuration errors which are not covered by this function because
+ * they cannot occur if the state machine is configured using the functions declared in
+ * this header file.
+ * Examples of this kind of errors include:
+ * - Defining a guard on a transition out of the initial pseudo-state;
+ * - Defining a transition which has a choice pseudo-state as both source and destination
+ *   of the transition.
+ * .
+ * @param smDesc the descriptor of the state machine to be checked.
+ * @return the outcome of the check. The outcome of the check is one of the following:
+ * - #smSuccess: all checks have been passed.
+ * - #smConfigErr: check 1 has failed.
+ * - #smNullPState: check 2 has failed.
+ * - #smNullCState: check 3 has failed.
+ * - #smNullTrans: check 4 has failed.
+ * - #smIllegalPDest: check 5 has failed
+ * - #smIllegalCDest: check 6 has failed
+ * - #smTooFewActions: check 7 has failed
+ * - #smTooFewGuards: check 8 has failed
+ * - #smUnreachablePState: check 9 has failed
+ * - #smUnreachableCState: check 10 has failed
+ * .
+ * This function returns when it encounters the first error. Hence, the function return value
+ * is determined by the first error encountered by the function.
+ */
+FwSmErrCode_t FwSmCheck(FwSmDesc_t smDesc);
+
+/**
+ * Recursively check the configuration of a state machine and all its embedded state
+ * machines.
+ * This function performs the same checks as <code>::FwSmCheck</code> but the checks are
+ * also performed (recursively) on all the embedded state machines.
+ * The function returns the first error code it encounters while checking the
+ * outer state machine and its embedded state machine.
+ * Thus, the error reported by this function may have arisen either in the outer
+ * state machine or in one of its embedded state machines.
+ * @param smDesc the descriptor of the state machine to be checked.
+ * @return the outcome of the check (this is the same as for <code>::FwSmCheck</code>).
+ */
+FwSmErrCode_t FwSmCheckRec(FwSmDesc_t smDesc);
+
+/**
+ * Override an action (either a state action or a transition action) in a derived
+ * state machine.
+ * By default a derived state machine has the same actions as the base state machine
+ * from which it was derived.
+ * This function overrides one of the actions of the derived state machine.
+ *
+ * As an example consider the case of a base state machine B and suppose that action
+ * a1 is used as entry action of state S1 and as exit action of state S2.
+ * If an application creates a derived state machine D from B (for instance, through
+ * function <code>::FwSmCreateDer</code>), then, after creation, the entry action of
+ * state S1 and the exit action of state S2 in state machine D is still a1.
+ * This function can be used to change a1.
+ * Note that a single invocation of this function will change both the entry action
+ * of S1 and the exit action of S2.
+ *
+ * A call to this function on a state machine D has no effect on the actions of
+ * the state machines which are embedded in the states of D.
+ *
+ * If an attempt is made to override a non-existent action, an error is declared
+ * and the function returns without doing anything.
+ *
+ * The override mechanism is only available for derived state machines.
+ * If this function is called on a state machine which was not derived by extending
+ * some other state machine, an error is declared.
+ *
+ * This function reports the following errors in the error code of the state
+ * machine descriptor:
+ * - #smUndefAction: the action to be overridden does not exist
+ * - #smNotDerivedSM: the state machine is not a derived state machine
+ * .
+ * @param smDesc the descriptor of the derived state machine.
+ * @param oldAction the action to be overridden
+ * @param newAction the new action which overrides the old action
+ */
+void FwSmOverrideAction(FwSmDesc_t smDesc, FwSmAction_t oldAction, FwSmAction_t newAction);
+
+/**
+ * Override a guard in a derived state machine.
+ * By default a derived state machine has the same guards as the base state machine
+ * from which it was derived.
+ * This function overrides one of the guards of the derived state machine.
+ *
+ * As an example consider the case of a base state machine B and suppose that
+ * the transitions from state S1 to state S2 and the transition from state S3 to
+ * state S4 both have the same guard g1.
+ * If an application creates a derived state machine D from B (for instance, through
+ * function <code>::FwSmCreateDer</code>), then, after creation, the guard of the
+ * transition from S1 to S2 and from S3 to S4 is still g1.
+ * This function can be used to change g1.
+ * Note that a single invocation of this function will change the guard on both
+ * transitions.
+ *
+ * A call to this function on a state machine D has no effect on the guards of
+ * the state machines which are embedded in the states of D.
+ *
+ * If an attempt is made to override a non-existent guard, the function declares
+ * an error and returns.
+ *
+ * The override mechanism is only available for derived state machines.
+ * If this function is called on a state machine which was not derived by extending
+ * some other state machine, an error is declared.
+ *
+ * This function reports the following errors in the error code of the state
+ * machine descriptor:
+ * - #smUndefGuard: the guard to be overridden does not exist
+ * - #smNotDerivedSM: the state machine is not a derived state machine
+ * .
+ * @param smDesc the descriptor of the derived state machine.
+ * @param oldGuard the guard to be overridden
+ * @param newGuard the new guard which overrides the old guard
+ */
+void FwSmOverrideGuard(FwSmDesc_t smDesc, FwSmGuard_t oldGuard, FwSmGuard_t newGuard);
+
+/**
+ * Embed a state machine in a state of a derived state machine.
+ * By default a derived state machine has the same embedded state machines as
+ * the base state machine from which it was derived.
+ * This function allows a state machine to be embedded in one of the states
+ * of the derived state machine.
+ * A state machine can only be embedded in an "empty" state (i.e. a state which,
+ * in the base state machine, had no embedded state).
+ *
+ * As an example consider the case of a base state machine B and suppose that
+ * state S1 in this state machine has not embedded state machine.
+ * If an application creates a derived state machine D from B (for instance, through
+ * function <code>::FwSmCreateDer</code>), then, after creation, state S1 in the
+ * derived state machine has no embedded state machine.
+ * This function allows a state machine to be embedded in S1.
+ *
+ * If an attempt is made to embed a state machine in a non-empty state, the
+ * function returns with an error but does not modify in any way the state
+ * machine descriptor.
+ *
+ * The override mechanism is only available for derived state machines.
+ * If this function is called on a base state machine, an error is returned
+ * and the function returns without doing anything.
+ *
+ * This function reports the following errors in the error code of the state
+ * machine descriptor:
+ * - #smUndefGuard: the action to be overridden does not exist
+ * - #smIllStateId: the state identifier is illegal
+ * - #smNotDerivedSM: the state machine is a base state machine
+ * - #smEsmDefined: an embedded state machine is already defined for the target
+ *   state
+ * .
+ * @param smDesc the descriptor of the derived state machine.
+ * @param stateId the identifier of the state where the state machine is to be
+ * embedded.
+ * @param esmDesc the descriptor of the state machine to be embedded.
+ */
+void FwSmEmbed(FwSmDesc_t smDesc, FwSmCounterS1_t stateId, FwSmDesc_t esmDesc);
+
+#endif /* FWSM_CONFIG_H_ */
diff --git a/FwProfile/src/FwSmConstants.h b/FwProfile/src/FwSmConstants.h
new file mode 100644
index 0000000..d6b171b
--- /dev/null
+++ b/FwProfile/src/FwSmConstants.h
@@ -0,0 +1,245 @@
+/**
+ * @file
+ * @ingroup smGroup
+ * Header file to define all constants and types for the state machine
+ * module of the FW Profile.
+ * This header file should be included by all applications which use the
+ * state machine module of the FW Profile.
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef FWSM_CONSTANTS_H_
+#define FWSM_CONSTANTS_H_
+
+/**
+ * Forward declaration for the pointer to a state machine descriptor.
+ * A state machine descriptor is a data structure which holds all the information
+ * describing a state machine instance.
+ * Users only manipulate the pointer to the state machine descriptor. The internal
+ * definition of the state machine descriptor (see <code>FwSmPrivate.h</code>) is
+ * kept hidden from users.
+ */
+typedef struct FwSmDesc* FwSmDesc_t;
+
+/**
+ * Type for a pointer to a state machine action.
+ * A state machine action is a function which encapsulates one of the following:
+ * the entry action of a state, the exit action of a state, the do-action of a state,
+ * a transition action.
+ * A state machine action takes the descriptor of the state machine as an argument.
+ *
+ * Pointers to state machine actions are used when a new state machine is defined:
+ * all the actions in the state machine must be defined as functions which conform
+ * to the <code>FwSmAction_t</code> prototype and are loaded into the state machine
+ * as function pointers.
+ */
+typedef void (*FwSmAction_t)(FwSmDesc_t);
+
+/** Type used for booleans (0 is "false" and 1 is "true"). */
+typedef int FwSmBool_t;
+
+/**
+ * Type for a pointer to a state machine guard.
+ * A state machine guard is a function which encapsulates a transition guard in a
+ * state machine.
+ * The state machine guard takes the descriptor of the state machine as an argument
+ * and it returns 0 to signify that the guard is false or a non-zero value
+ * (typically 1) to signify that the guard is true.
+ *
+ * Pointers to state machine guards are used when a new state machine is defined:
+ * all the guards in the state machine must be defined as functions which conform
+ * to the <code>FwSmGuard_t</code> prototype and are loaded into the state machine
+ * as function pointers.
+ */
+typedef FwSmBool_t (*FwSmGuard_t)(FwSmDesc_t);
+
+/** Type used for unsigned counters with a "short" range. */
+typedef unsigned char FwSmCounterU1_t;
+
+/** Type used for unsigned counters with a "medium" range. */
+typedef unsigned short int FwSmCounterU2_t;
+
+/** Type used for unsigned counters with a "long" range. */
+typedef unsigned int FwSmCounterU3_t;
+
+/** Type used for unsigned counters with a "long int" range. */
+typedef long unsigned int FwSmCounterU4_t;
+
+/** Type used for signed counters with a "short" range. */
+typedef signed char FwSmCounterS1_t;
+
+/** Error codes and function return codes for the state machine functions. */
+typedef enum {
+  /**
+   * Return codes of a function which has completed execution without errors.
+   */
+  smSuccess = 1,
+  /**
+   * A call to <code>malloc</code> has failed (it has returned a NULL pointer).
+   */
+  smOutOfMemory = 2,
+  /**
+   * There is an undefined state in a state machine.
+   */
+  smNullPState = 9,
+  /**
+   * There is an undefined choice pseudo-state in a state machine.
+   */
+  smNullCState = 10,
+  /**
+   * There is an undefined transition in a state machine.
+   */
+  smNullTrans = 11,
+  /**
+   * A configuration error has been detected during the state machine configuration process.
+   */
+  smConfigErr = 16,
+  /**
+   * A state is added to a state machine with an illegal (out-of-range) identifier.
+   */
+  smIllStateId = 22,
+  /**
+   * A choice pseudo-state is added to a state machine with an illegal (out-of-range) identifier.
+   */
+  smIllChoiceId = 23,
+  /**
+   * A state is added twice to the same state machine.
+   */
+  smStateIdInUse = 26,
+  /**
+   * A choice pseudo-state is added twice to the same state machine.
+   */
+  smChoiceIdInUse = 27,
+  /**
+   * A transition is added to a state machine with a source (either a state or a
+   * choice pseudo-state) which has not yet been defined.
+   */
+  smUndefinedTransSrc = 28,
+  /**
+   * A transition is added to a state machine with an illegal (out-of-range) state destination.
+   */
+  smIllegalPDest = 29,
+  /**
+   * A transition is added to a state machine with an illegal (out-of-range) choice pseudo-state destination.
+   */
+  smIllegalCDest = 30,
+  /**
+   * A choice pseudo-state is added to a state machine with less than 1 out-going transitions.
+   */
+  smIllNOfOutTrans = 31,
+  /**
+   * A transition is added to a state machine with a source which has an illegal identifier.
+   */
+  smIllTransSrc = 34,
+  /**
+   * An error was encountered while executing a transition in a state machine (see
+   * <code>::FwSmMakeTrans</code>).
+   */
+  smTransErr = 35,
+  /**
+   * A transition from a certain source (either a state or a choice pseudo-state) is added
+   * to a state machine but there isn't space for it in the transition array of the
+   * state machine descriptor
+   * (because all the locations reserved for transitions from that source are already full).
+   * This error code is, for instance, generated if the same transition is added twice to
+   * the state machine or if an insufficient number of out-going transitions has been
+   * declared for a state or choice pseudo-state.
+   */
+  smTooManyTrans = 36,
+  /**
+   * A state or choice pseudo-state is added to a state machine which has more
+   * out-going transitions than fit into the transition array of the state machine descriptor.
+   */
+  smTooManyOutTrans = 37,
+  /**
+   * The number of actions added to the state machine exceeds the number of actions declared
+   * when the state machine descriptor was created.
+   */
+  smTooManyActions = 38,
+  /**
+   * The number of guards added to the state machine exceeds the number of guards declared
+   * when the state machine descriptor was created.
+   */
+  smTooManyGuards = 39,
+  /**
+   * The number of actions added to the state machine is smaller than the number of actions declared
+   * when the state machine descriptor was created.
+   */
+  smTooFewActions = 40,
+  /**
+   * The number of guards added to the state machine is smaller than the number of guards declared
+   * when the state machine descriptor was created.
+   */
+  smTooFewGuards = 41,
+  /**
+   * A state is added with a negative number of outgoing transitions.
+   */
+  smNegOutTrans = 42,
+  /**
+   * The overridden action in a derived state machine does not exist.
+   */
+  smUndefAction = 43,
+  /**
+   * The overridden guard in a derived state machine does not exist.
+   */
+  smUndefGuard = 44,
+  /**
+   * The state in a derived state machine to which an embedded state machine is added
+   * already holds an embedded state machine.
+   */
+  smEsmDefined = 45,
+  /**
+   * The state machine where an action or a guard is overridden or a state machine is embedded
+   * is not a derived state machine.
+   */
+  smNotDerivedSM = 46,
+  /**
+   * The number of actions in the base state machine is not the same as in the derived
+   * state machine.
+   */
+  smWrongNOfActions = 47,
+  /**
+   * The number of guards in the base state machine is not the same as in the derived
+   * state machine.
+   */
+  smWrongNOfGuards = 48,
+  /**
+   * The state machine has a state which is not a destination of any transition
+   */
+  smUnreachablePState = 49,
+  /**
+   * The state machine has a choice pseudo-state which is not a destination of any transition
+   */
+  smUnreachableCState = 50
+} FwSmErrCode_t;
+
+/**
+ * Identifier of "Execute" transition in a state machine.
+ * Transition commands to a state machine are identified by a non-negative integer.
+ * The value of zero is reserved for the "Execute" transition and should not be used
+ * by applications.
+ */
+#define FW_TR_EXECUTE 0
+
+#endif /* FWSM_CONSTANTS_H_ */
diff --git a/FwProfile/src/FwSmCore.c b/FwProfile/src/FwSmCore.c
new file mode 100644
index 0000000..d09a616
--- /dev/null
+++ b/FwProfile/src/FwSmCore.c
@@ -0,0 +1,271 @@
+/**
+ * @file
+ * @ingroup smGroup
+ * Implements the core functions of the FW State Machine Module.
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include "FwSmCore.h"
+#include "FwSmPrivate.h"
+#include <stdlib.h>
+
+/**
+ *  Private helper function implementing the transition logic from the point where the
+ *  transition action is executed to the end of the transition (see figure 4.3-3 of the
+ *  FW Profile Definition Document).
+ *  This operation may set the error code to #smTransErr if either of the following non-nominal
+ *  situations occurs:
+ *  - the transition encounters a choice pseudo-state which has no out-going transitions with a true
+ *    guard; or
+ *  - the transition encounters a transition which has a choice pseudo-state as both source and
+ *    destination of the same transition.
+ *  .
+ *  In both the above cases, the state machine may remain in an inconsistent state.
+ *  @param smDesc the descriptor of the state machine where the transition is executed
+ *  @param trans the transition which is executed
+ */
+static void ExecTrans(FwSmDesc_t smDesc, SmTrans_t* trans);
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void SmDummyAction(FwSmDesc_t smDesc) {
+  (void)(smDesc);
+  return;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwSmBool_t SmDummyGuard(FwSmDesc_t smDesc) {
+  (void)(smDesc);
+  return 1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwSmStart(FwSmDesc_t smDesc) {
+  SmTrans_t* trans;
+
+  if (smDesc->curState != 0) { /* Check if SM is already STARTED */
+    return;
+  }
+
+  /* Reset execution counters */
+  smDesc->smExecCnt    = 0;
+  smDesc->stateExecCnt = 0;
+
+  /* Execution transition into initial state */
+  trans = &(smDesc->smBase->trans[0]);
+  ExecTrans(smDesc, trans);
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwSmStop(FwSmDesc_t smDesc) {
+  SmPState_t*     pState;
+  SmBaseDesc_t*   smBase    = smDesc->smBase;
+  FwSmCounterS1_t iCurState = smDesc->curState;
+
+  /* check if state machine (SM) is already stopped */
+  if (iCurState == 0) {
+    return;
+  }
+
+  pState = &(smBase->pStates[iCurState - 1]); /* get current state */
+  /* If the current state (CS) has an embedded SM (ESM), stop it */
+  if (smDesc->esmDesc[iCurState - 1] != NULL) {
+    FwSmStop(smDesc->esmDesc[iCurState - 1]);
+  }
+  /* execute exit action of current state */
+  smDesc->smActions[pState->iExitAction](smDesc);
+  /* set state of SM to "undefined" */
+  smDesc->curState = 0;
+  return;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwSmMakeTrans(FwSmDesc_t smDesc, FwSmCounterU2_t transId) {
+  SmPState_t*     curState;
+  SmTrans_t*      trans;
+  FwSmCounterS1_t i;
+  FwSmDesc_t      esmDesc;
+  SmBaseDesc_t*   smBase = smDesc->smBase;
+
+  /* check if state machine (SM) is started */
+  if (smDesc->curState == 0) {
+    return;
+  }
+
+  /* get current state */
+  curState = &(smBase->pStates[(smDesc->curState) - 1]);
+
+  /* If this is the "execute" transition, increment execution counters and execute do-action */
+  if (transId == FW_TR_EXECUTE) {
+    smDesc->smExecCnt++;
+    smDesc->stateExecCnt++;
+    smDesc->smActions[curState->iDoAction](smDesc);
+  }
+
+  /* If there is an embedded SM (ESM), propagate transition trigger to it */
+  esmDesc = smDesc->esmDesc[(smDesc->curState) - 1];
+  if (esmDesc != NULL) {
+    FwSmMakeTrans(esmDesc, transId);
+  }
+
+  /* look for transition from CS matching transition trigger */
+  for (i = 0; i < curState->nOfOutTrans; i++) {
+    trans = &(smBase->trans[curState->outTransIndex + i]);
+    /* check if outgoing transition responds to trigger tr_id */
+    if (trans->id == transId) {
+      /* check if outgoing transition has a true guard */
+      if (smDesc->smGuards[trans->iTrGuard](smDesc) != 0) {
+        /* If CS has an ESM, stop it before exiting the CS */
+        if (esmDesc != NULL) {
+          FwSmStop(esmDesc);
+        }
+        /* Execute exit action of CS */
+        smDesc->smActions[curState->iExitAction](smDesc);
+        ExecTrans(smDesc, trans);
+        return;
+      }
+    }
+  }
+  return;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwSmExecute(FwSmDesc_t smDesc) {
+  FwSmMakeTrans(smDesc, FW_TR_EXECUTE);
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+static void ExecTrans(FwSmDesc_t smDesc, SmTrans_t* trans) {
+  SmPState_t*     pDest;
+  SmCState_t*     cDest;
+  SmTrans_t*      cTrans;
+  FwSmCounterS1_t i;
+  FwSmDesc_t      esmDesc;
+  SmBaseDesc_t*   smBase = smDesc->smBase;
+
+  /* execute transition action */
+  smDesc->smActions[trans->iTrAction](smDesc);
+
+  if (trans->dest > 0) { /* destination is a proper state */
+    smDesc->curState     = trans->dest;
+    smDesc->stateExecCnt = 0;
+    pDest                = &(smBase->pStates[(trans->dest) - 1]);
+    /* execute entry action of destination state */
+    smDesc->smActions[pDest->iEntryAction](smDesc);
+    esmDesc = smDesc->esmDesc[(trans->dest) - 1];
+    if (esmDesc != NULL) {
+      FwSmStart(esmDesc);
+    }
+    return;
+  }
+
+  if (trans->dest < 0) { /* destination is a choice pseudo-state */
+    cDest = &(smBase->cStates[-(trans->dest) - 1]);
+    for (i = 0; i < cDest->nOfOutTrans; i++) {
+      cTrans = &(smBase->trans[cDest->outTransIndex + i]);
+      if (smDesc->smGuards[cTrans->iTrGuard](smDesc) != 0) {
+        /* Execute transition from choice pseudo-state */
+        smDesc->smActions[cTrans->iTrAction](smDesc);
+        if (cTrans->dest > 0) { /* destination is a proper state */
+          smDesc->curState     = cTrans->dest;
+          smDesc->stateExecCnt = 0;
+          pDest                = &(smBase->pStates[(cTrans->dest) - 1]);
+          /* execute entry action of destination state */
+          smDesc->smActions[pDest->iEntryAction](smDesc);
+          esmDesc = smDesc->esmDesc[(cTrans->dest) - 1];
+          if (esmDesc != NULL) {
+            FwSmStart(esmDesc);
+          }
+          return;
+        }
+
+        if (cTrans->dest == 0) { /* destination is a final state */
+          smDesc->curState = 0;
+          return;
+        }
+
+        break; /* this point is reached only if there is a transition from a CPS to a CPS */
+      }
+    }
+    smDesc->errCode = smTransErr;
+  }
+  else { /* destination is a final pseudo-state */
+    smDesc->curState = 0;
+    return;
+  }
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwSmDesc_t FwSmGetEmbSmCur(FwSmDesc_t smDesc) {
+  if (smDesc->curState > 0) {
+    return smDesc->esmDesc[(smDesc->curState) - 1];
+  }
+
+  return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwSmDesc_t FwSmGetEmbSm(FwSmDesc_t smDesc, FwSmCounterS1_t i) {
+  return smDesc->esmDesc[i - 1];
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwSmCounterS1_t FwSmGetCurState(FwSmDesc_t smDesc) {
+  return smDesc->curState;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwSmCounterS1_t FwSmGetCurStateEmb(FwSmDesc_t smDesc) {
+  if (smDesc->curState == 0) {
+    return -1;
+  }
+
+  if (smDesc->esmDesc[(smDesc->curState) - 1] != NULL) {
+    return smDesc->esmDesc[(smDesc->curState) - 1]->curState;
+  }
+
+  return -1;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwSmBool_t FwSmIsStarted(FwSmDesc_t smDesc) {
+  if (smDesc->curState != 0) {
+    return 1;
+  }
+  return 0;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwSmErrCode_t FwSmGetErrCode(FwSmDesc_t smDesc) {
+  return smDesc->errCode;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwSmCounterU3_t FwSmGetExecCnt(FwSmDesc_t smDesc) {
+  return smDesc->smExecCnt;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwSmCounterU3_t FwSmGetStateExecCnt(FwSmDesc_t smDesc) {
+  return smDesc->stateExecCnt;
+}
diff --git a/FwProfile/src/FwSmCore.h b/FwProfile/src/FwSmCore.h
new file mode 100644
index 0000000..09f97b9
--- /dev/null
+++ b/FwProfile/src/FwSmCore.h
@@ -0,0 +1,226 @@
+/**
+ * @file
+ * @ingroup smGroup
+ * Declaration of the execution interface for a FW State Machine.
+ * The execution interface offers the functions to start and stop
+ * a state machine and to command a transition to a state machine.
+ * The functions declared in this header file, take a state machine descriptor
+ * as their first argument.
+ * This represents the state machine upon which the functions operate.
+ *
+ * The functions declared in this header file can only be used after a
+ * state machine has been fully configured.
+ * This is normally done using the configuration functions declared
+ * in <code>FwSmConfig.h</code>.
+ * The basic mode of use of the functions declared in this file is as follows:
+ * -# The state machine is started with function <code>::FwSmStart</code>.
+ * -# Transitions in the state machine are commanded with functions
+ *    <code>::FwSmExecute</code> or <code>::FwSmMakeTrans</code>.
+ * -# The state machine is stopped with function <code>::FwSmStop</code>.
+ * .
+ *
+ * The functions declared in this header file assume that they are passed
+ * a valid state machine descriptor representing a correctly configured
+ * state machine.
+ * Failure to comply with this assumption will result in undefined
+ * behaviour.
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef FWSM_CORE_H_
+#define FWSM_CORE_H_
+
+#include "FwSmConstants.h"
+
+/**
+ * Start a state machine. The semantics of this operation is defined by the activity
+ * diagram on the left-hand side of the following figure
+ * (this is figure 4.3-1 in the "FW Profile Definition Document"):
+ * @image html SM_StartStop.png
+ * This function executes a transition from the initial pseudo-state to some state.
+ * It can set the error code to #smTransErr if either of the following non-nominal
+ * situations occurs while performing the transition:
+ * - the transition encounters a choice pseudo-state which has no out-going transitions
+ *   with a true guard; or
+ * - the transition encounters a transition which has a choice pseudo-state as both source
+ *   and destination of the same transition.
+ * .
+ * @param smDesc the descriptor of the state machine to be started.
+ */
+void FwSmStart(FwSmDesc_t smDesc);
+
+/**
+ * Stop a state machine. The semantics of this operation is defined by the activity
+ * diagram on the right-hand side of the following figure
+ * (this is figure 4.3-1 in the "FW Profile Definition Document"):
+ * @image html SM_StartStop.png
+ * @param smDesc the descriptor of the state machine to be started.
+ */
+void FwSmStop(FwSmDesc_t smDesc);
+
+/**
+ * Trigger a transition in a state machine. The semantics of this function is defined
+ * by the following activity diagram (this is taken from figure 4.3-2 in the "FW Profile
+ * Definition Document"):
+ * @image html SM_CmdProcessing.png
+ * The logic to execute a transition is implemented by the following activity
+ * diagram (this is taken from figure 4.3-3 in the "FW Profile
+ * Definition Document"):
+ * @image html SM_TransitionExecution.png
+ * This operation is recursive because a transition request is propagated to the
+ * embedded state machine of the source state. The maximum depth of recursion is the
+ * maximum depth of nesting of embedded state machines.
+ *
+ * If there are two transitions out of the current state which are both activated by
+ * this operation, the transition that will actually be taken is the one which was
+ * added first to the state machine (i.e. transitions are evaluated in the order in
+ * which they were added to the state machine).
+ *
+ * Similarly, if the transition goes through a choice pseudo-state (CPS) and if
+ * there are two transitions out of the CPS which have guards which evaluate to true,
+ * the transition to be taken is the one which was added first to the state machine.
+ *
+ * The FW Profile stipulates that at least one of the transitions out of a CPS
+ * must have a guard evaluating to true. This constraint is not enforced by the
+ * State Machine Module. If the constraint is violated, the error code is set to
+ * #smTransErr.
+ *
+ * This operation sets the error code to #smTransErr if either of the following non-nominal
+ * situations occurs:
+ * - the transition encounters a choice pseudo-state which has no out-going transitions
+ *   with a true guard; or
+ * - the transition encounters a transition which has a choice pseudo-state as both source
+ *   and destination of the same transition.
+ * .
+ * In both the above cases, the state machine may remain in an inconsistent state.
+ * @param smDesc the descriptor of the state machine where the transition is triggered.
+ * @param transId the identifier of the transition trigger.
+ */
+void FwSmMakeTrans(FwSmDesc_t smDesc, FwSmCounterU2_t transId);
+
+/**
+ * Convenience method to execute a state machine. Executing a state machine is equivalent
+ * to sending it the "Execute" transition command with function
+ * <code>::FwSmMakeTrans</code>.
+ * The identifier of the "Execute" transition command is stored in #FW_TR_EXECUTE.
+ * @param smDesc the descriptor of the state machine which is executed.
+ */
+void FwSmExecute(FwSmDesc_t smDesc);
+
+/**
+ * Return the state machine embedded in the current state.
+ * @param smDesc the descriptor of the state machine.
+ * @return the descriptor of the state machine embedded in the current state
+ * or NULL if there is no embedded state machine.
+ */
+FwSmDesc_t FwSmGetEmbSmCur(FwSmDesc_t smDesc);
+
+/**
+ * Return the state machine embedded in the i-th state of the argument
+ * state machine.
+ * No check is made on the legality of the value of argument 'i'.
+ * If this does not correspond to an existing state in the argument state
+ * machine, the behaviour of this function is undefined.
+ * @param smDesc the descriptor of the state machine.
+ * @param i the identifier of the state whose embedded state machine is
+ * returned
+ * @return the descriptor of the state machine embedded in the i-th state
+ * or NULL if there is no embedded state machine in the i-th state .
+ */
+FwSmDesc_t FwSmGetEmbSm(FwSmDesc_t smDesc, FwSmCounterS1_t i);
+
+/**
+ * Return the identifier of the current state in a state machine (or zero
+ * if the state machine is stopped).
+ * @param smDesc the descriptor of the state machine.
+ * @return the identifier of the current state of the state machine (or zero
+ * if the state machine is stopped).
+ */
+FwSmCounterS1_t FwSmGetCurState(FwSmDesc_t smDesc);
+
+/**
+ * Return the identifier of the current state of the state machine
+ * embedded in the current state (the sub-state).
+ * If the current state is S and if there is a state machine embedded in this
+ * state, then this function returns the current state of the embedded
+ * state machine.
+ * More precisely, this function implements the following logic:
+ * - If the outer state machine is stopped, then the function returns -1.
+ * - If the current state of the outer state machine has an embedded
+ *   state machine, then this function returns the current state of the
+ *   embedded state machine (or zero if the embedded state machine is
+ *   stopped).
+ * - If the current state of the outer state machine has no embedded state
+ *   machine, then this function returns -1.
+ * .
+ * @param smDesc the descriptor of the state machine.
+ * @return the identifier of the current state of the embedded state machine
+ * (or zero if the embedded state machine is stopped, or -1 if the current
+ * state has no embedded state machine).
+ */
+FwSmCounterS1_t FwSmGetCurStateEmb(FwSmDesc_t smDesc);
+
+/**
+ * Check whether the state machine is started.
+ * @param smDesc the descriptor of the state machine.
+ * @return 1 if the state machine is STARTED or 0 if it is STOPPED.
+ */
+FwSmBool_t FwSmIsStarted(FwSmDesc_t smDesc);
+
+/**
+ * Return the error code of the argument state machine.
+ * The error code of a state machine holds either <code>#smSuccess</code> if the state
+ * machine never encountered an error or else it holds the code of the last error
+ * encountered by the state machine.
+ * If the error code is different from <code>#smSuccess</code>, the behaviour of
+ * the state machine is undefined.
+ * @param smDesc the descriptor of the state machine to be checked.
+ * @return either <code>#smSuccess</code> or the code of the last error encountered
+ * by the state machine.
+ */
+FwSmErrCode_t FwSmGetErrCode(FwSmDesc_t smDesc);
+
+/**
+ * Return the State Machine Execution Counter.
+ * The State Machine Execution Counter holds the number of execution cycles since
+ * the state machine was started.
+ * Note that the State Machine Execution Counter is not reset when the state
+ * machine is stopped (it is only reset when it is started).
+ * @param smDesc the descriptor of the state machine.
+ * @return the value of the State Machine Execution Counter.
+ */
+FwSmCounterU3_t FwSmGetExecCnt(FwSmDesc_t smDesc);
+
+/**
+ * Return the State Execution Counter.
+ * The State Execution Counter holds the number of execution cycles since
+ * the current state was entered.
+ * Note that the State Execution Counter is not reset when the state machine
+ * is stopped (it is only reset when the state machine is started).
+ * @param smDesc the descriptor of the state machine.
+ * @return the value of the Node Execution Counter.
+ */
+FwSmCounterU3_t FwSmGetStateExecCnt(FwSmDesc_t smDesc);
+
+#endif /* FWSM_CORE_H_ */
diff --git a/FwProfile/src/FwSmDCreate.c b/FwProfile/src/FwSmDCreate.c
new file mode 100644
index 0000000..8ad42de
--- /dev/null
+++ b/FwProfile/src/FwSmDCreate.c
@@ -0,0 +1,264 @@
+/**
+ * @file
+ * @ingroup smGroup
+ * Implements the dynamical creation functions for the FW State Machine Module.
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include "FwSmDCreate.h"
+#include "FwSmPrivate.h"
+#include <stdlib.h>
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwSmDesc_t FwSmCreate(FwSmCounterS1_t nOfStates, FwSmCounterS1_t nOfChoicePseudoStates, FwSmCounterS1_t nOfTrans,
+                      FwSmCounterS1_t nOfActions, FwSmCounterS1_t nOfGuards) {
+
+  FwSmCounterS1_t i;
+  SmBaseDesc_t*   smBase;
+  FwSmDesc_t      smDesc;
+
+  if (nOfTrans < 1) {
+    return NULL;
+  }
+
+  if (nOfStates < 0) {
+    return NULL;
+  }
+
+  if (nOfChoicePseudoStates < 0) {
+    return NULL;
+  }
+
+  if (nOfActions < 0) {
+    return NULL;
+  }
+
+  if (nOfGuards < 0) {
+    return NULL;
+  }
+
+  smDesc = (FwSmDesc_t)malloc(sizeof(struct FwSmDesc));
+  if (smDesc == NULL) {
+    return NULL;
+  }
+
+  smBase = (SmBaseDesc_t*)malloc(sizeof(SmBaseDesc_t));
+  if (smBase == NULL) {
+    return NULL;
+  }
+
+  if (nOfStates > 0) {
+    smBase->pStates = (SmPState_t*)malloc(((FwSmCounterU4_t)(nOfStates)) * sizeof(SmPState_t));
+    if (smBase->pStates == NULL) {
+      return NULL;
+    }
+    for (i = 0; i < nOfStates; i++) {
+      smBase->pStates[i].outTransIndex = 0;
+    }
+    smDesc->esmDesc = (struct FwSmDesc**)malloc(((FwSmCounterU4_t)(nOfStates)) * sizeof(FwSmDesc_t));
+    if (smDesc->esmDesc == NULL) {
+      return NULL;
+    }
+    for (i = 0; i < nOfStates; i++) {
+      smDesc->esmDesc[i] = NULL;
+    }
+  }
+  else {
+    smBase->pStates = NULL;
+    smDesc->esmDesc = NULL;
+  }
+
+  if (nOfChoicePseudoStates > 0) {
+    smBase->cStates = (SmCState_t*)malloc(((FwSmCounterU4_t)(nOfChoicePseudoStates)) * sizeof(SmCState_t));
+    if (smBase->cStates == NULL) {
+      return NULL;
+    }
+    for (i = 0; i < nOfChoicePseudoStates; i++) {
+      smBase->cStates[i].outTransIndex = 0;
+    }
+  }
+  else {
+    smBase->cStates = NULL;
+  }
+
+  smBase->trans = (SmTrans_t*)malloc(((FwSmCounterU4_t)(nOfTrans)) * sizeof(SmTrans_t));
+  if (smBase->trans == NULL) {
+    return NULL;
+  }
+  for (i = 0; i < nOfTrans; i++) {
+    smBase->trans[i].iTrAction = -1;
+  }
+
+  smDesc->smActions = (FwSmAction_t*)malloc(((FwSmCounterU4_t)(nOfActions + 1)) * sizeof(FwSmAction_t));
+  if (smDesc->smActions == NULL) {
+    return NULL;
+  }
+  smDesc->smActions[0] = &SmDummyAction;
+  for (i = 1; i <= nOfActions; i++) {
+    smDesc->smActions[i] = NULL;
+  }
+
+  smDesc->smGuards = (FwSmGuard_t*)malloc(((FwSmCounterU4_t)(nOfGuards + 1)) * sizeof(FwSmGuard_t));
+  if (smDesc->smGuards == NULL) {
+    return NULL;
+  }
+  smDesc->smGuards[0] = &SmDummyGuard;
+  for (i = 1; i <= nOfGuards; i++) {
+    smDesc->smGuards[i] = NULL;
+  }
+
+  smBase->nOfCStates   = nOfChoicePseudoStates;
+  smBase->nOfPStates   = nOfStates;
+  smBase->nOfTrans     = nOfTrans;
+  smDesc->smBase       = smBase;
+  smDesc->curState     = 0;
+  smDesc->smData       = NULL;
+  smDesc->transCnt     = 1;
+  smDesc->nOfActions   = (FwSmCounterS1_t)(nOfActions + 1);
+  smDesc->nOfGuards    = (FwSmCounterS1_t)(nOfGuards + 1);
+  smDesc->smExecCnt    = 0;
+  smDesc->stateExecCnt = 0;
+  smDesc->errCode      = smSuccess;
+
+  return smDesc;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+FwSmDesc_t FwSmCreateDer(FwSmDesc_t smDesc) {
+  FwSmCounterS1_t i;
+  SmBaseDesc_t*   smBase = smDesc->smBase;
+  FwSmDesc_t      extSmDesc;
+
+  /* Create descriptor for derived SM */
+  extSmDesc = (FwSmDesc_t)malloc(sizeof(struct FwSmDesc));
+  if (extSmDesc == NULL) {
+    return NULL;
+  }
+
+  /* Create array of embedded state machines in the derived SM */
+  if (smBase->nOfPStates > 0) {
+    extSmDesc->esmDesc = (struct FwSmDesc**)malloc(((FwSmCounterU4_t)(smBase->nOfPStates)) * sizeof(FwSmDesc_t));
+    if (extSmDesc->esmDesc == NULL) {
+      return NULL;
+    }
+  }
+  else {
+    extSmDesc->esmDesc = NULL;
+  }
+
+  /* Create array of actions in the derived SM */
+  extSmDesc->smActions = (FwSmAction_t*)malloc(((FwSmCounterU4_t)(smDesc->nOfActions)) * sizeof(FwSmAction_t));
+  if (extSmDesc->smActions == NULL) {
+    return NULL;
+  }
+  for (i = 0; i < smDesc->nOfActions; i++) {
+    extSmDesc->smActions[i] = smDesc->smActions[i];
+  }
+
+  /* Create array of guards in the derived SM */
+  extSmDesc->smGuards = (FwSmGuard_t*)malloc(((FwSmCounterU4_t)(smDesc->nOfGuards)) * sizeof(FwSmGuard_t));
+  if (extSmDesc->smGuards == NULL) {
+    return NULL;
+  }
+  for (i = 0; i < smDesc->nOfGuards; i++) {
+    extSmDesc->smGuards[i] = smDesc->smGuards[i];
+  }
+
+  /* Create embedded state machines */
+  for (i = 0; i < smBase->nOfPStates; i++) {
+    if (smDesc->esmDesc[i] != NULL) {
+      extSmDesc->esmDesc[i] = FwSmCreateDer(smDesc->esmDesc[i]);
+    }
+    else {
+      extSmDesc->esmDesc[i] = NULL;
+    }
+  }
+
+  extSmDesc->smBase       = smBase;
+  extSmDesc->curState     = 0;
+  extSmDesc->smData       = NULL;
+  extSmDesc->transCnt     = 0;
+  extSmDesc->nOfActions   = smDesc->nOfActions;
+  extSmDesc->nOfGuards    = smDesc->nOfGuards;
+  extSmDesc->errCode      = smDesc->errCode;
+  extSmDesc->smExecCnt    = 0;
+  extSmDesc->stateExecCnt = 0;
+
+  return extSmDesc;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwSmRelease(FwSmDesc_t smDesc) {
+  SmBaseDesc_t* smBase;
+
+  /* Release memory allocated to base descriptor */
+  smBase = smDesc->smBase;
+  free(smBase->pStates);
+  free(smBase->cStates);
+
+  /* Release pointer to transition array (note that the transition array is guaranteed to exist and to
+   * have at least one element, see operation FwSmCreate) */
+  free(smBase->trans);
+
+  /* Release memory allocated to base descriptor */
+  free(smDesc->smBase);
+
+  /* Release memory allocated to extension part of the state machine descriptor */
+  FwSmReleaseDer(smDesc);
+
+  return;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwSmReleaseDer(FwSmDesc_t smDesc) {
+
+  /* Release pointer to the action and guard arrays (note that both arrays are guaranteed to
+   * have non-zero length) */
+  free(smDesc->smActions);
+  free(smDesc->smGuards);
+  free(smDesc->esmDesc);
+
+  /* Release pointer to state machine descriptor */
+  free(smDesc);
+  smDesc = NULL;
+
+  return;
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwSmReleaseRec(FwSmDesc_t smDesc) {
+  FwSmCounterS1_t i;
+
+  /* Release memory used by the embedded state machines */
+  for (i = 0; i < smDesc->smBase->nOfPStates; i++) {
+    if (smDesc->esmDesc[i] != NULL) {
+      FwSmReleaseRec(smDesc->esmDesc[i]);
+    }
+  }
+
+  /* Release memory used by the embedding state machine */
+  FwSmRelease(smDesc);
+
+  return;
+}
diff --git a/FwProfile/src/FwSmDCreate.h b/FwProfile/src/FwSmDCreate.h
new file mode 100644
index 0000000..a959458
--- /dev/null
+++ b/FwProfile/src/FwSmDCreate.h
@@ -0,0 +1,235 @@
+/**
+ * @file
+ * @ingroup smGroup
+ * Declaration of the dynamical creation interface for a FW State Machine.
+ * A FW State Machine is described by a state machine descriptor.
+ * This interface declares the functions required to create and release
+ * a state machine descriptor dynamically.
+ * Dynamic creation and release of memory is done through calls to
+ * <code>malloc</code> and <code>free</code>.
+ *
+ * A state machine can be created in two ways:
+ * - It can be created from scratch, or
+ * - It can be created by extending an existing state machine.
+ * .
+ * The functions offered by this interface cover both creation of a new
+ * state machine descriptor from scratch (<code>::FwSmCreate</code>) and
+ * the extension of an existing state machine descriptor to create the
+ * descriptor for a derived state machine (<code>::FwSmCreateDer</code>).
+ *
+ * Both the creation and the extension functions create a new state machine
+ * descriptor and return a pointer to the newly created descriptor instance.
+ * The state machine descriptor returned by these functions is initialized
+ * (i.e. all its attributes have a well-defined value) but will normally
+ * need to be configured.
+ * Configuration can be done using the functions offered by the
+ * <code>FwSmConfig.h</code> file.
+ *
+ * The creation and the extension functions in this header file always check the
+ * success of calls to <code>malloc</code>.
+ * In case of failure, the caller aborts and returns a NULL pointer.
+ *
+ * Applications which do not wish to use dynamic memory allocation can
+ * create a state machine descriptor statically using the services offered
+ * by <code>FwSmSCreate.h</code>.
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef FWSM_DCREATE_H_
+#define FWSM_DCREATE_H_
+
+#include "FwSmCore.h"
+
+/**
+ * Create a new state machine descriptor.
+ * This function creates the state machine descriptor and its internal data structures
+ * dynamically through calls to <code>malloc</code>.
+ * If any of these calls fails, the function aborts and returns NULL.
+ * In this case, there may be a memory leak if part of the state machine descriptor memory
+ * had been allocated before the function was aborted.
+ *
+ * It is legal to create a state machine descriptor with no states or with no choice
+ * pseudo-states but it is not legal to create a state machine descriptor with no
+ * transitions.
+ * If the latter is attempted, the function is aborted and returns NULL.
+ * @param nOfStates the number of states in the new state machine (a non-negative number).
+ * @param nOfChoicePseudoStates the number of choice pseudo-states in the new state machine
+ * (a non-negative integer).
+ * @param nOfTrans the number of transitions in the new state machine (a
+ * positive integer).
+ * @param nOfActions the total number of actions (state actions + transition actions) which the
+ * user wishes to define for the state machine.
+ * The total number of actions must be a non-negative integer.
+ * If the same action appears more than once in a state machine, it is counted only once.
+ * @param nOfGuards the total number of transition guards which the
+ * user wishes to define for the state machine.
+ * The total number of guards must be a non-negative integer.
+ * If the same guard appears more than once in a state machine, it is counted only once.
+ * @return the descriptor of the new state machine (or NULL if creation of the
+ * data structures to hold the state machine descriptor failed or one of the
+ * function parameters had an illegal value).
+ */
+FwSmDesc_t FwSmCreate(FwSmCounterS1_t nOfStates, FwSmCounterS1_t nOfChoicePseudoStates, FwSmCounterS1_t nOfTrans,
+                      FwSmCounterS1_t nOfActions, FwSmCounterS1_t nOfGuards);
+
+/**
+ * Create the descriptor of a derived state machine.
+ * A derived state machine is a state machine which is created by extending
+ * another state machine.
+ * The state machine which is thus extended is called base state machine.
+ *
+ * This function takes a state machine as an argument and creates a derived
+ * state machine from it.
+ * The function returns the descriptor of the newly created derived state machine.
+ *
+ * The base state machine should be fully and correctly configured (i.e. it should
+ * pass the configuration check implemented by <code>::FwSmCheck</code>).
+ * Compliance with this constraint is not checked by this function.
+ * If the constraint is not satisfied, the behaviour of the derived state machine
+ * is undefined.
+ *
+ * After being created, the derived state machine has the following characteristics:
+ * - It has the same number of states, choice pseudo-states and transitions as
+ *   the base state machine.
+ * - Its states and choice pseudo-states are connected by the same transitions as
+ *   the base state machine.
+ * - Its states have the same actions as the homologous states of the base state
+ *   machine.
+ * - Its transitions have the same actions and guards and are triggered by the same
+ *   transition commands as the homologous transitions of the base state machine.
+ * - States whose homologous states in the base state machine have an embedded
+ *   state machine also have an embedded state machine: the derivation process
+ *   is applied recursively to the embedded state machines (i.e. if state S1 in
+ *   the base state machine has an embedded state machine SM1, then the homologous
+ *   state in the derived state machine has an embedded state machine which is
+ *   derived by extending SM1).
+ * .
+ * Thus, the derived state machine is a structural clone of its base state machine.
+ *
+ * The attributes of the derived state machine are initialized as
+ * follows:
+ * - The error code is the same as the error code of the base state machine.
+ * - No state machine data are associated to the derived state machine.
+ * - The state machine state is STOPPED.
+ * - The execution counters are equal to zero.
+ * - The <code>transCnt</code> field in the state machine descriptor is initialized
+ *   to zero.
+ * .
+ * After being created, the derived state machine is fully configured because it
+ * inherits the configuration of its base state machine.
+ * The configuration of a derived state machine can be modified by:
+ * - loading its state machine data;
+ * - overriding some or all of its actions and guards; and
+ * - embedding state machines in some or all of its states which do not
+ *   already hold embedded state machines.
+ * .
+ * The functions to perform these reconfiguration operations are defined in
+ * <code>FwSmConfig.h</code>.
+ *
+ * A state machine descriptor consists of two parts: the base descriptor and
+ * the extension descriptor (see <code>FwSmPrivate.h</code>).
+ * A derived state machine and its base state machine share the same base descriptor
+ * (which defines the topology of the state machine) but have different extension
+ * descriptors.
+ * The extension descriptor is linked to the base descriptor through a pointer.
+ * This function accordingly creates a new extension descriptor and links it to the
+ * base descriptor of the base state machine.
+ * @param smDesc the descriptor of the base state machine. The base state machine
+ * should be a fully and correctly configured state machine (i.e. it should pass
+ * the <code>::FwSmCheck</code> configuration check).
+ * @return the descriptor of the derived state machine (or NULL if creation of the
+ * data structures to hold the extended state machine descriptor failed).
+ */
+FwSmDesc_t FwSmCreateDer(FwSmDesc_t smDesc);
+
+/**
+ * Release the memory which was allocated when the state machine descriptor.
+ * After this operation is called, the state machine descriptor can no longer be used.
+ *
+ * This function releases the memory of both the base and the extension parts of the
+ * state machine descriptor.
+ * Hence, if the argument state machine descriptor acted as base for other state
+ * machine descriptors, the derived state machine descriptors are no longer usable
+ * after the function has been called.
+ *
+ * This function only releases the memory of the argument state machine.
+ * The memory allocated to embedded state machines is not affected.
+ *
+ * Use of this function is subject to the following constraints:
+ * - It should only be called on a state machine descriptor which was created using
+ *   function <code>FwSmCreate</code>.
+ * - It should only be called once on the same state machine descriptor.
+ * - It should only be called on a state machine descriptor which is correctly
+ *   configured.
+ * .
+ * Violation of any of the above constraints may result in memory corruption.
+ *
+ * @param smDesc the descriptor of the state machine.
+ */
+void FwSmRelease(FwSmDesc_t smDesc);
+
+/**
+ * Release the memory allocated to a derived state machine descriptor.
+ * After this operation is called, the argument state machine descriptor can no longer
+ * be used.
+ * The state machine descriptor of the base state machine is unaffected by this
+ * function.
+ *
+ * This function only releases the memory of the argument state machine.
+ * The memory allocated to embedded state machines is not affected.
+ *
+ * Use of this function is subject to the following constraints:
+ * - It should only be called on a state machine descriptor which was created using
+ *   function <code>FwSmCreateDer</code>.
+ * - It should only be called once on the same state machine descriptor.
+ * - It should only be called on a state machine descriptor which is correctly
+ *   configured.
+ * .
+ * Violation of any of the above constraints may result in memory corruption.
+ * @param smDesc the descriptor of the state machine.
+ */
+void FwSmReleaseDer(FwSmDesc_t smDesc);
+
+/**
+ * Recursively release the memory which was allocated when the state machine descriptor
+ * was created.
+ * After this operation is called, the state machine descriptor can no longer be used.
+ * This operation also (recursively) releases the memory of the state machines embedded
+ * in the argument state machine.
+ *
+ * The release of the memory for the state machine and its embedded state machines
+ * is done by means of function <code>FwSmRelease</code>.
+ * The same constraints defined for <code>FwSmRelease</code> therefore also apply
+ * to this function.
+ *
+ * As in the case of the <code>FwSmRelease</code>, both the the base and the extension
+ * parts of the argument state machine descriptor are released.
+ * Hence, if the argument state machine or any of its embedded state machines acted as
+ * bases for other state machines, the derived state machine descriptors are no longer
+ * usable after the function has been called.
+ * @param smDesc the descriptor of the state machine.
+ */
+void FwSmReleaseRec(FwSmDesc_t smDesc);
+
+#endif /* FWSM_DCREATE_H_ */
diff --git a/FwProfile/src/FwSmPrivate.h b/FwProfile/src/FwSmPrivate.h
new file mode 100644
index 0000000..c8f89f8
--- /dev/null
+++ b/FwProfile/src/FwSmPrivate.h
@@ -0,0 +1,341 @@
+/**
+ * @file
+ * @ingroup smGroup
+ * Declaration of the internal data structures of the FW State Machine
+ * Module.
+ * Users should not normally be concerned with these data structures.
+ *
+ * The data structures declared in this header file are used to define the state
+ * machine descriptor.
+ * A state machine descriptor holds all the information related to a certain state
+ * machine.
+ * A state machine descriptor consists of two parts: the base descriptor and
+ * the extension descriptor.
+ *
+ * The base descriptor holds the information which is not changed when the state
+ * machine is extended.
+ * This consists of:
+ * - The list of states in the state machine
+ * - The list of choice pseudo-states in the state machine
+ * - The list of transitions in the state machine
+ * .
+ *
+ * The extension descriptor holds the information which may be overridden when the
+ * state machine is extended.
+ * This consists of:
+ * - The list of actions used in the state machine (both the state actions and the
+ *   transition actions)
+ * - The list of transition guards used in the state machine
+ * - The list of state machines embedded in the state machine
+ * - The pointer to the state machine data (the data upon which the
+ *   state machine actions and guards operate)
+ * - The current state of the state machine
+ * - The execution counters of the state machine
+ * - The error code for the state machine
+ * .
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef FWSM_PRIVATE_H_
+#define FWSM_PRIVATE_H_
+
+#include "FwSmConstants.h"
+
+/**
+ * Enumerated type for the type of a state in a state machine.
+ */
+typedef enum {
+  /**
+   * A proper state in a state machine.
+   */
+  properState = 1,
+  /**
+   * A choice pseudo-state in a state machine.
+   */
+  choicePseudoState = 2,
+  /**
+   * Either the initial or the final pseudo-state.
+   */
+  stoppedState = 3
+} StateType_t;
+
+/**
+ * Dummy action which returns without doing anything.
+ * This action is used where nothing is specified for a state machine action (i.e. a
+ * state entry action, or a state do-action, or a state exit action, or a transition
+ * action).
+ * @param smDesc state machine descriptor. This parameter is unused in this dummy action.
+ * The parameter is retained for compatibility with the <code>::FwSmAction_t</code> type.
+ */
+void SmDummyAction(FwSmDesc_t smDesc);
+
+/**
+ * Dummy guard which always returns true.
+ * This guard is used where no transition guard is specified.
+ * @param smDesc state machine descriptor. This parameter is unused in this dummy guard.
+ * The parameter is retained for compatibility with the <code>::FwSmGuard_t</code> type.
+ * @return always return 1 (to signify that the guard is true).
+ */
+FwSmBool_t SmDummyGuard(FwSmDesc_t smDesc);
+
+/**
+ * Structure representing a proper state in state machine. A proper state is characterized by:
+ * - the set of out-going transitions from the state
+ * - the state machine embedded in the state
+ * - the entry action for the state
+ * - the do-action for the state
+ * - the exit action for the state
+ * .
+ * The first item - the set of out-going transitions from the state - is defined as
+ * follows.
+ * Transitions which originate from the same state are located in adjacent locations in
+ * the transition array of the base descriptor (see <code>::SmBaseDesc_t</code>).
+ * Field <code>outTransIndex</code> identifies the first location of this set of adjacent
+ * locations.
+ * Thus, for instance, if a state has 3 out-going transitions and if its
+ * <code>outTransIndex</code> field has value 4, then the three out-going transitions
+ * are located in elements 4, 5 and 6 of the array of transitions.
+ *
+ * The state actions are integers which identify locations in the action array
+ * of the state machine descriptor where the action is stored.
+ * Thus, for instance, if the <code>iEntryAction</code> field for state S is equal to 5,
+ * then the entry action of state S is the one stored at location 5 of the
+ * action array of that state machine.
+ * If an action is not defined, a value of zero is used to point to the first
+ * location of the action array where the dummy action <code>::SmDummyAction</code> is stored
+ * which returns without doing anything.
+ *
+ * By convention, the implementation treats a state as uninitialized if its
+ * <code>outTransIndex</code> field is equal to zero.
+ */
+typedef struct {
+  /** index of first out-going transition in the transition array of <code>::SmBaseDesc_t</code> */
+  FwSmCounterS1_t outTransIndex;
+  /** number of outgoing transitions */
+  FwSmCounterS1_t nOfOutTrans;
+  /** the entry action for the state */
+  FwSmCounterS1_t iEntryAction;
+  /** the do action for the state */
+  FwSmCounterS1_t iDoAction;
+  /** the exit action for the state */
+  FwSmCounterS1_t iExitAction;
+} SmPState_t;
+
+/**
+ * Structure representing a choice pseudo state in a state machine.
+ * A choice pseudo-state is characterized by the set of its out-going transitions.
+ * The set of out-going transitions is defined as follows.
+ * Transitions which originate from the same choice pseudo-state are located in adjacent locations in
+ * the transition array of the base descriptor (see <code>::SmBaseDesc_t</code>).
+ * Field <code>outTransIndex</code> identifies the first location of this set of adjacent
+ * locations.
+ * Thus, for instance, if a choice pseudo-state has 3 out-going transitions and if its
+ * <code>outTransIndex</code> field has value 4, then the three out-going transitions
+ * are located in elements 4, 5 and 6 of the array of transitions.
+ *
+ * By convention, the implementation treats a choice pseudo-state as uninitialized if its
+ * <code>outTransIndex</code> field is equal to zero.
+ */
+typedef struct {
+  /** index of first out-going transition in transition array of <code>::SmBaseDesc_t</code> */
+  FwSmCounterS1_t outTransIndex;
+  /** number of outgoing transitions from the choice pseudo-state */
+  FwSmCounterS1_t nOfOutTrans;
+} SmCState_t;
+
+/**
+ * Structure representing a transition.
+ * A transition is characterized by:
+ * - the destination of the transition
+ * - the name of the transition
+ * - the action associated to the transition
+ * - the guard associated to the transition
+ * .
+ * The destination of the transition may be either a proper state, or the final pseudo-state,
+ * or a choice pseudo-state. The type of the transition destination is identified as follows:
+ * - a value of zero means that the destination is the final pseudo-state
+ * - a positive value means that the destination is a proper state and the value of <code>dest</code>
+ *   is the identifier of the target state
+ * - a negative value means that the destination is a choice pseudo state and the value of
+ *   <code>-dest</code> is the identifier of the choice pseudo-state
+ * .
+ * The name of a transition is an non-negative integer.
+ * The value of zero is reserved for the pre-defined "Execute" transition (see
+ * #FW_TR_EXECUTE) and should not be used for user-defined transitions.
+ * The name of a transition is "don't care" in the case of transitions out of
+ * pseudo-states.
+ *
+ * The transition action is an integer which identifies the location in the
+ * action array of the state machine descriptor (see <code>FwSmDesc</code>)
+ * where the action is stored as a function pointer.
+ * If no action is associated to the transition, a value of zero is used to
+ * point to the first element of the action array which holds a dummy action
+ * which returns without doing anything.
+ *
+ * The guard is an integer which identifies the location in the
+ * guard array of the state machine descriptor (see <code>FwSmDesc</code>)
+ * where the guard is stored as a function pointer.
+ * If no guard is associated to the transition, a value of zero is used to
+ * point to the first element of the guard array which holds a dummy guard
+ * which always returns "true".
+ *
+ * By convention, the implementation treats a transition as uninitialized if its
+ * <code>trAction</code> field is equal to -1.
+ */
+typedef struct {
+  /** the index of the destination of the transition */
+  FwSmCounterS1_t dest;
+  /** the identifier (the "name") of the transition */
+  FwSmCounterU2_t id;
+  /** the index of the action associated to the transition */
+  FwSmCounterS1_t iTrAction;
+  /** the index of the guard associated to the transition */
+  FwSmCounterS1_t iTrGuard;
+} SmTrans_t;
+
+/**
+ * Structure representing the base descriptor of a state machine.
+ * The base descriptor holds the information which is not changed when the state
+ * machine is extended.
+ * This consists of:
+ * - The list of states in the state machine (array <code>pStates</code>)
+ * - The list of choice pseudo-states in the state machine (array <code>cStates</code>)
+ * - The list of transitions in the state machine (array <code>trans</code>)
+ * .
+ * Array <code>pStates</code> holds the proper states in the state machine.
+ * The proper states are identified by an integer in the range [1,N] (N is the total
+ * number of proper states).
+ * The i-th state is stored in the (i-1)-th location of <code>pStates</code>.
+ * The number of states is stored in field <code>nOfPStates</code>.
+ *
+ * Array <code>cStates</code> holds the choice pseudo-states in the state machine.
+ * The choice pseudo-states are identified by an integer in the range [1,M] (M is the total
+ * number of choice pseudo-states).
+ * The i-th choice pseudo-state is stored in the (i-1)-th location of <code>cStates</code>.
+ * The number of choice pseudo-states is stored in field <code>nOfCStates</code>.
+ *
+ * Array <code>trans</code> holds the transitions in the state machine.
+ * The transition out of the initial pseudo-state is stored in the first location of
+ * array <code>trans</code>.
+ * The other transitions are stored in groups of adjacent locations where each group
+ * holds the transitions out of the same state or choice pseudo-state (see also
+ * <code>::SmPState_t</code> and <code>::SmPState_t</code>).
+ * The number of transitions is stored in field <code>nOfTrans</code>.
+ */
+typedef struct {
+  /** array holding the proper states in the state machine */
+  SmPState_t* pStates;
+  /** array holding the choice pseudo-states in the state machine */
+  SmCState_t* cStates;
+  /** array holding the transitions in the state machine */
+  SmTrans_t* trans;
+  /** the number of states in the state machine */
+  FwSmCounterS1_t nOfPStates;
+  /** the number of choice pseudo-states in the state machine */
+  FwSmCounterS1_t nOfCStates;
+  /** the number of transitions in SM */
+  FwSmCounterS1_t nOfTrans;
+} SmBaseDesc_t;
+
+/**
+ * Structure representing a state machine descriptor.
+ * Field <code>smBase</code> points to the base descriptor for the state machine
+ * which holds the information about the states, choice pseudo-states and the
+ * transitions connecting them.
+ *
+ * Array <code>smActions</code> holds the list of all actions in the state machine
+ * (including both state and transition actions).
+ * The first element of the array holds a dummy action which returns without
+ * doing anything.
+ * Each distinct action only appears once in the action array.
+ * If the same action is used several times in a state machine, only one instance is
+ * registered in the action array.
+ *
+ * Array <code>smGuards</code> holds the list of all transition guards in the
+ * state machine.
+ * The first element of the array holds a dummy guard which always returns true.
+ * Each distinct guard only appears once in the guard array.
+ * If the same guard is used several times in a state machine, only one instance is
+ * registered in the guard array.
+ *
+ * The i-th element of array <code>esmDesc</code> holds the state machine embedded
+ * in the i-th state of the state machine (or NULL if no state machine is embedded).
+ *
+ * When a new state or choice pseudo-state is added to the state machine, field
+ * <code>transCnt</code> holds the position in the transition array where its
+ * first out-going transition will be stored.
+ *
+ * The identifier of the current state (which can only be a proper state) is
+ * stored in <code>curState</code>.
+ * If this is equal to zero, then the state machine is stopped.
+ *
+ * If during the creation, configuration or execution of the state machine, an error is
+ * encountered, the corresponding error code is stored in field <code>errCode</code>.
+ * This field is initialized to <code>#smSuccess</code> and should nominally remain
+ * unchanged throughout the life of the state machine.
+ * If the error code has a value other than <code>#smSuccess</code>, the behaviour of
+ * the state machine is undefined.
+ *
+ * There are two types of state machines: base state machines (i.e.
+ * state machines which are created from scratch using <code>::FwSmCreate</code> or
+ * <code>#FW_SM_INST</code>) and derived state machines (i.e. state
+ * machines which are created by extending a base state machine through calls
+ * to <code>::FwSmCreateDer</code> or <code>#FW_SM_INST_DER</code>).
+ * By convention, a derived state machine is characterized by field
+ * <code>transCnt</code> being equal to zero.
+ *
+ * Two counters are associated to a sttae machine: the State Machine Execution Counter
+ * and the State Execution Counter.
+ * The State Machine Execution Counter holds the number of execution cycles since
+ * the state machine was started and the State Execution Counter holds the number of cycle
+ * since the current state was entered.
+ */
+struct FwSmDesc {
+  /** pointer to the base descriptor */
+  SmBaseDesc_t* smBase;
+  /** the state machine actions (state and transition actions) */
+  FwSmAction_t* smActions;
+  /** the transition guards in the state machine */
+  FwSmGuard_t* smGuards;
+  /** the state machines embedded in the state machine */
+  struct FwSmDesc** esmDesc;
+  /** the number of actions (state actions + transition actions) in the state machine */
+  FwSmCounterS1_t nOfActions;
+  /** the number of guards in the state machine */
+  FwSmCounterS1_t nOfGuards;
+  /** the counter for the number of transitions added to the state machine */
+  FwSmCounterS1_t transCnt;
+  /** the current state of the state machine */
+  FwSmCounterS1_t curState;
+  /** the state machine execution counter */
+  FwSmCounterU3_t smExecCnt;
+  /** the state execution counter */
+  FwSmCounterU3_t stateExecCnt;
+  /** either 'success' or the code of the last error encountered by the state machine */
+  FwSmErrCode_t errCode;
+  /** the pointer to the data manipulated by the state machine actions and guards */
+  void* smData;
+};
+
+#endif /* FWSM_PRIVATE_H_ */
diff --git a/FwProfile/src/FwSmSCreate.c b/FwProfile/src/FwSmSCreate.c
new file mode 100644
index 0000000..8a21757
--- /dev/null
+++ b/FwProfile/src/FwSmSCreate.c
@@ -0,0 +1,110 @@
+/**
+ * @file
+ * @ingroup smGroup
+ * Implements the static initialization functions for the FW
+ * State Machine Module.
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#include "FwSmSCreate.h"
+#include "FwSmPrivate.h"
+#include <stdlib.h>
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwSmInit(FwSmDesc_t smDesc) {
+
+  FwSmCounterS1_t i;
+  SmBaseDesc_t*   smBase = smDesc->smBase;
+
+  for (i = 0; i < smBase->nOfPStates; i++) {
+    smBase->pStates[i].outTransIndex = 0;
+    smDesc->esmDesc[i]               = NULL;
+  }
+
+  for (i = 0; i < smBase->nOfCStates; i++) {
+    smBase->cStates[i].outTransIndex = 0;
+  }
+
+  for (i = 0; i < smBase->nOfTrans; i++) {
+    smBase->trans[i].iTrAction = -1;
+  }
+
+  smDesc->smActions[0] = &SmDummyAction;
+  for (i = 1; i < smDesc->nOfActions; i++) {
+    smDesc->smActions[i] = NULL;
+  }
+
+  smDesc->smGuards[0] = &SmDummyGuard;
+  for (i = 1; i < smDesc->nOfGuards; i++) {
+    smDesc->smGuards[i] = NULL;
+  }
+}
+
+/* ----------------------------------------------------------------------------------------------------------------- */
+void FwSmInitDer(FwSmDesc_t smDesc, FwSmDesc_t smDescBase) {
+  FwSmCounterS1_t i;
+  SmBaseDesc_t*   smBase = smDescBase->smBase;
+
+  if (smDesc->nOfActions != smDescBase->nOfActions) {
+    smDesc->errCode = smWrongNOfActions;
+    return;
+  }
+
+  if (smDesc->nOfGuards != smDescBase->nOfGuards) {
+    smDesc->errCode = smWrongNOfGuards;
+    return;
+  }
+
+  smDesc->smBase = smBase;
+
+  /* This cycle will always be executed at least once because
+   * the number of actions (nOfActions) is always greater than
+   * zero (since all state machines have at least the dummy
+   * action which returns without doing anything)
+   */
+  for (i = 0; i < smDesc->nOfActions; i++) {
+    smDesc->smActions[i] = smDescBase->smActions[i];
+  }
+
+  /* This cycle will always be executed at least once because
+   * the number of guards (nOfGuards) is always greater than
+   * zero (since all state machines have at least the dummy
+   * guard which always returns TRUE)
+   */
+  for (i = 0; i < smDesc->nOfGuards; i++) {
+    smDesc->smGuards[i] = smDescBase->smGuards[i];
+  }
+
+  for (i = 0; i < smBase->nOfPStates; i++) {
+    smDesc->esmDesc[i] = NULL;
+  }
+
+  smDesc->errCode      = smDescBase->errCode;
+  smDesc->smExecCnt    = 0;
+  smDesc->stateExecCnt = 0;
+  smDesc->transCnt     = 0;
+  smDesc->curState     = 0;
+
+  return;
+}
diff --git a/FwProfile/src/FwSmSCreate.h b/FwProfile/src/FwSmSCreate.h
new file mode 100644
index 0000000..6088f0a
--- /dev/null
+++ b/FwProfile/src/FwSmSCreate.h
@@ -0,0 +1,333 @@
+/**
+ * @file
+ * @ingroup smGroup
+ * Declaration of the static creation interface for a FW State Machine.
+ * A FW State Machine is described by a state machine descriptor.
+ * This interface allows a state machine descriptor to be created
+ * statically (i.e. without using dynamic memory allocation).
+ * In this sense, this interface is alternative to the dynamic creation
+ * interface defined in <code>FwSmDCreate.h</code>.
+ *
+ * A state machine can be created in two ways:
+ * - It can be created from scratch, or
+ * - It can be created by extending an existing state machine.
+ * .
+ * In both cases, creation of a state machine descriptor is done in two
+ * steps:
+ * - The state machine descriptor and its internal data structures are
+ *   instantiated.
+ * - The state machine descriptor and its internal data structures are
+ *   initialized.
+ * .
+ * Instantiation is done by means of the following macros.
+ * - <code>#FW_SM_INST</code> should be used to instantiate from scratch
+ *   a descriptor for a state machine with one or more choice
+ *   pseudo-states.
+ * - <code>#FW_SM_INST_NOCPS</code> should be used to instantiate from
+ *   scratch a descriptor for a state machine with no choice pseudo-states.
+ * - <code>#FW_SM_INST_DER</code> should be used to instantiate a
+ *   descriptor for a state machine which is derived by extending another
+ *   state machine.
+ * .
+ * Initialization is done by means of the following functions:
+ * - <code>::FwSmInit</code> should be used to initialize a descriptor
+ *   which has been created from scratch with either
+ *   <code>#FW_SM_INST</code> or <code>#FW_SM_INST_NOCPS</code>.
+ * - <code>::FwSmInitDer</code> should be used to initialize a descriptor
+ *   of a state machine which is derived by extending another state
+ *   machine.
+ * .
+ * Function <code>::FwSmInitDer</code> only initializes a descriptor
+ * in full if the base state machine (i.e. the state machine which is
+ * being extended) has no embedded state machines.
+ * If the base state machine has embedded state machines, additional
+ * initialization actions are required as described in the function
+ * documentation.
+ *
+ * After a state machine descriptor has been instantiated and
+ * initialized, it will normally need to be configured.
+ * Configuration of a state machine descriptor can be done using the
+ * functions described in the <code>FwSmConfig.h</code> file.
+ * @author Vaclav Cechticky <vaclav.cechticky@pnp-software.com>
+ * @author Alessandro Pasetti <pasetti@pnp-software.com>
+ * @copyright P&P Software GmbH, 2016, All Rights Reserved
+ * @version 1.3.0_UniWien
+ * Licensed to: Roland Ottensamer, Institut für Astrophysik, Türkenschanzstr. 17, A-1180 Wien
+ * Software Licence Agreement PP-SUA-COR-0028 *
+ * This file is part of FW Profile.
+ *
+ * FW Profile is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FW Profile 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FW Profile.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For information on alternative licensing, please contact P&P Software GmbH.
+ */
+
+#ifndef FWSM_SCREATE_H_
+#define FWSM_SCREATE_H_
+
+#include "FwSmCore.h"
+#include "FwSmPrivate.h"
+
+/**
+ * Instantiate a state machine descriptor and its internal data structure.
+ * This macro compiles correctly only if the number of states NS, the number
+ * of choice pseudo-states NCPS and the number of transitions NTRANS is positive.
+ * If there is a need to define a state machine with zero choice pseudo-states,
+ * the <code>::FW_SM_INST_NOCPS</code> macro should be used.
+ *
+ * The macro generates code that does the following:
+ * - It defines an array of NS elements of type <code>SmPState_t</code> to
+ *   represent the array holding the state machine states.
+ * - It defines an array of NS elements of to represent the array holding
+ *   the state machines embedded in the NS states.
+ * - It defines an array of NCPS elements of type <code>SmCState_t</code> to
+ *   represent the array holding the state machine choice pseudo-states.
+ * - It defines an array of NTRANS elements of type <code>SmTrans_t</code> to
+ *   represent the array holding the state machine transitions.
+ * - It defines an array of (NA+1) elements of type <code>SmAction_t</code> to
+ *   represent the array holding the state machine actions.
+ * - It defines an array of (NG+1) elements of type <code>SmGuard_t</code> to
+ *   represent the array holding the state machine guards.
+ * - It defines and initializes a variable of type <code>FwSmDescBase_t</code>
+ *   to represent the base part of the state machine descriptor.
+ * - It defines and initializes a variable with the name SM_DESC of type
+ *   <code>struct FwSmDesc</code> to represent the state machine descriptor.
+ * .
+ * All variables defined by this macro are <code>static</code>.
+ *
+ * The state machine descriptor instantiated by the macro is only partially
+ * initialized.
+ * Full initialization is performed using function <code>::FwSmInit</code>.
+ *
+ * Since the macro includes the declaration of several variables, it should be located
+ * in the section of a c-file where variable declaration is legal.
+ *
+ * @param SM_DESC the variable holding the state machine descriptor
+ * @param NS a positive integer representing the number of states
+ * @param NCPS a positive integer the number of choice pseudo-states
+ * @param NTRANS a positive integer representing the number of transitions
+ * @param NA a non-negative integer representing the number of actions (i.e. the
+ * number of transition or state actions which are defined on the state machine)
+ * @param NG a non-negative integer representing the number of guards (i.e. the
+ * number of transition actions which are defined on the state machine)
+ */
+#define FW_SM_INST(SM_DESC, NS, NCPS, NTRANS, NA, NG)                                                                 \
+  static SmPState_t   SM_DESC##_pState[(NS)];                                                                         \
+  static SmCState_t   SM_DESC##_cState[(NCPS)];                                                                       \
+  static SmTrans_t    SM_DESC##_trans[(NTRANS)];                                                                      \
+  static FwSmAction_t SM_DESC##_actions[(NA) + 1];                                                                    \
+  static FwSmGuard_t  SM_DESC##_guards[(NG) + 1];                                                                     \
+  static FwSmDesc_t   SM_DESC##_esm[(NS)];                                                                            \
+  static SmBaseDesc_t SM_DESC##_base = {(SM_DESC##_pState), (SM_DESC##_cState), (SM_DESC##_trans), NS, NCPS, NTRANS}; \
+  static struct FwSmDesc(SM_DESC)    = {&(SM_DESC##_base),                                                            \
+                                     (SM_DESC##_actions),                                                             \
+                                     (SM_DESC##_guards),                                                              \
+                                     (SM_DESC##_esm),                                                                 \
+                                     (NA) + 1,                                                                        \
+                                     (NG) + 1,                                                                        \
+                                     1,                                                                               \
+                                     0,                                                                               \
+                                     0,                                                                               \
+                                     0,                                                                               \
+                                     smSuccess,                                                                       \
+                                     NULL};
+
+/**
+ * Instantiate a state machine descriptor and its internal data structure.
+ * This macro compiles correctly only if the number of states NS and the number
+ * of transitions NTRANS is positive.
+ * This macro instantiates a descriptor for a state machine without choice
+ * pseudo-states.
+ * If there is a need to define a state machine with one or more choice
+ * pseudo-states, the <code>::FW_SM_INST</code> macro should be used.
+ *
+ * The macro generates code that does the following:
+ * - It defines an array of NS elements of type <code>SmPState_t</code> to
+ *   represent the array holding the state machine states.
+ * - It defines an array of NS elements of to represent the array holding
+ *   the state machines embedded in the NS states.
+ * - It defines an array of NTRANS elements of type <code>SmTrans_t</code> to
+ *   represent the array holding the state machine transitions.
+ * - It defines an array of (NA+1) elements of type <code>SmAction_t</code> to
+ *   represent the array holding the state machine actions.
+ * - It defines an array of (NG+1) elements of type <code>SmGuard_t</code> to
+ *   represent the array holding the state machine guards.
+ * - It defines and initializes a variable of type <code>FwSmDescBase_t</code>
+ *   to represent the base part of the state machine descriptor.
+ * - It defines and initializes a variable with the name SM_DESC of type
+ *   <code>struct FwSmDesc</code> to represent the state machine descriptor.
+ * .
+ * All variables defined by this macro are <code>static</code>.
+ *
+ * The state machine descriptor instantiated by the macro is only partially
+ * initialized.
+ * Full initialization is performed using function <code>::FwSmInit</code>.
+ *
+ * Since the macro includes the declaration of several variables, it should be located
+ * in the section of a c-file where variable declaration is legal.
+ *
+ * @param SM_DESC the variable holding the state machine descriptor
+ * @param NS a positive integer representing the number of states
+ * @param NTRANS a positive integer representing the number of transitions
+ * @param NA a non-negative integer representing the number of actions (i.e. the
+ * number of transition or state actions which are defined on the state machine)
+ * @param NG a non-negative integer representing the number of guards (i.e. the
+ * number of transition actions which are defined on the state machine)
+ */
+#define FW_SM_INST_NOCPS(SM_DESC, NS, NTRANS, NA, NG)                                                \
+  static SmPState_t   SM_DESC##_pState[(NS)];                                                        \
+  static SmTrans_t    SM_DESC##_trans[(NTRANS)];                                                     \
+  static FwSmAction_t SM_DESC##_actions[(NA) + 1];                                                   \
+  static FwSmGuard_t  SM_DESC##_guards[(NG) + 1];                                                    \
+  static FwSmDesc_t   SM_DESC##_esm[(NS)];                                                           \
+  static SmBaseDesc_t SM_DESC##_base = {(SM_DESC##_pState), NULL, (SM_DESC##_trans), NS, 0, NTRANS}; \
+  static struct FwSmDesc(SM_DESC)    = {&(SM_DESC##_base),                                           \
+                                     (SM_DESC##_actions),                                            \
+                                     (SM_DESC##_guards),                                             \
+                                     (SM_DESC##_esm),                                                \
+                                     (NA) + 1,                                                       \
+                                     (NG) + 1,                                                       \
+                                     1,                                                              \
+                                     0,                                                              \
+                                     0,                                                              \
+                                     0,                                                              \
+                                     smSuccess,                                                      \
+                                     NULL};
+
+/**
+ * Instantiate a descriptor for a derived state machine.
+ * A derived state machine is a state machine which is created by extending
+ * another state machine.
+ * The state machine which is thus extended is called base state machine.
+ *
+ * A state machine descriptor consists of two parts: the base descriptor and
+ * the extension descriptor (see <code>FwSmPrivate.h</code>).
+ * A derived state machine and its base state machine share the same base descriptor
+ * (which defines the topology of the state machine) but have different extension
+ * descriptors.
+ * This macro accordingly only instantiates a new extension descriptor.
+ * More precisely, this macro generates code that does the following:
+ * - It defines an array of (NA+1) elements of type <code>SmAction_t</code> to
+ *   represent the array holding the state machine actions.
+ * - It defines an array of (NG+1) elements of type <code>SmGuard_t</code> to
+ *   represent the array holding the state machine guards.
+ * - It defines and initializes a variable with the name SM_DESC of type
+ *   <code>struct FwSmDesc</code> to represent the state machine descriptor.
+ * .
+ * All variables defined by this macro are <code>static</code>.
+ *
+ * The state machine descriptor instantiated by the macro is only partially
+ * initialized.
+ * Full initialization is performed using function <code>::FwSmInitDer</code>.
+ *
+ * Since the macro includes the declaration of several variables, it should be located
+ * in the section of a c-file where variable declaration is legal.
+ *
+ * @param SM_DESC the variable holding the state machine descriptor
+ * @param NS a positive integer representing the number of states
+ * @param NA a non-negative integer representing the number of actions (i.e. the
+ * number of transition or state actions which are defined on the state machine)
+ * @param NG a non-negative integer representing the number of guards
+ */
+#define FW_SM_INST_DER(SM_DESC, NS, NA, NG)                                                                          \
+  static FwSmAction_t SM_DESC##_actions[(NA) + 1];                                                                   \
+  static FwSmGuard_t  SM_DESC##_guards[(NG) + 1];                                                                    \
+  static FwSmDesc_t   SM_DESC##_esm[(NS)];                                                                           \
+  static struct FwSmDesc(SM_DESC) =                                                                                  \
+      {                                                                                                              \
+          NULL, (SM_DESC##_actions), (SM_DESC##_guards), (SM_DESC##_esm), (NA) + 1, (NG) + 1, 1, 0, 0, 0, smSuccess, \
+          NULL};
+
+/**
+ * Initialize a state machine descriptor to represent an unconfigured state
+ * machine with no transitions, no actions, no guards and no embedded state
+ * machines.
+ * After this function has been executed, the argument state machine descriptor
+ * has the same content as a state machine descriptor which has been
+ * created by calling <code>::FwSmCreate</code>.
+ *
+ * This function is primarily intended to be used to initialize a state machine
+ * descriptor which has been statically instantiated with macro
+ * <code>#FW_SM_INST</code> or <code>#FW_SM_INST_NOCPS</code>.
+ *
+ * If the function is called upon a state machine descriptor that had already been
+ * initialized, the previous initialization values are lost.
+ * In such a case, a memory leak is possible due to the potential loss of the pointers
+ * to the arrays where the state machines states, choice pseudo-states, transitions and
+ * embedded state machines are stored.
+ * @param smDesc the state machine descriptor to be initialized.
+ */
+void FwSmInit(FwSmDesc_t smDesc);
+
+/**
+ * Initialize a state machine descriptor to extend another state machine (the
+ * base state machine).
+ * This function checks that the descriptor to be initialized satisfies
+ * the following constraints:
+ * - it has the same number of actions as the base state machine, and
+ * - it has the same number of guards as the base state machine.
+ * .
+ * If either constraint is not satisfied, the function reports an error
+ * by setting the error code of the descriptor to be initialized and then
+ * returns.
+ * If the first constraint is not satisfied, the function sets the error
+ * code to <code>#smWrongNOfActions</code>.
+ * If the second constraint is not satisfied, the function sets the error
+ * code to <code>#smWrongNOfGuards</code>.
+ *
+ * If both constraints are satisfied, this function initializes a descriptor
+ * as follows:
+ * - It links it to the descriptor of the base state machine.
+ * - It initializes its actions to be the same as the actions of the base state
+ *   machine.
+ * - It initializes its guards to be the same as the guards of the base state
+ *   machine.
+ * - It initializes its states to have no embedded state machines.
+ * - It initializes its error code to be the same as the error code of the base
+ *   state machine.
+ * - It initializes its <code>transCnt</code> field to zero.
+ * - It sets its state to STOPPED.
+ * .
+ * Thus, if the base state machine has no embedded state machines, then this
+ * function initializes a descriptor to represent its derived state machine.
+ * In this case, the descriptor initialized by this function represents
+ * exactly the same state machine as the descriptor created by calling
+ * function <code>::FwSmCreateDer</code>.
+ * If, instead, the base state machine has one or more embedded state machines,
+ * then, in order to achieve the same effect as the <code>::FwSmCreateDer</code>
+ * function, the descriptor initialized by this function must be further
+ * configured as follows:
+ * - The state machines embedded in the base state machine are extended.
+ *   The extension is done using, recursively, the <code>#FW_SM_INST_DER</code>
+ *   macro and the <code>::FwSmInitDer</code> function.
+ *   Let ESM(i) be the extension of the state machine embedded in the
+ *   i-th state of the base state machine.
+ * - The ESM(i) state machine is embedded within the i-th state of the
+ *   descriptor initialized by this function using the
+ *   <code>::FwSmEmbed</code> function.
+ * .
+ *
+ * This function is primarily intended to be used to initialize a state machine
+ * descriptor which has been statically instantiated with macro
+ * <code>#FW_SM_INST_DER</code>.
+ * If the function is called upon a state machine descriptor that had already been
+ * initialized, the previous initialization values are lost.
+ * In such a case, a memory leak is possible due to the potential loss of the pointers
+ * to the arrays where the state machines states, choice pseudo-states, transitions and
+ * embedded state machines are stored.
+ * @param smDesc the state machine descriptor to be initialized.
+ * @param smDescBase the state machine descriptor of the base state machine.
+ */
+void FwSmInitDer(FwSmDesc_t smDesc, FwSmDesc_t smDescBase);
+
+#endif /* FWSM_SCREATE_H_ */
diff --git a/IBSW/.gitignore b/IBSW/.gitignore
new file mode 100644
index 0000000..a35ea4d
--- /dev/null
+++ b/IBSW/.gitignore
@@ -0,0 +1,6 @@
+*~
+[#]*[#]
+./#*
+*.o
+*.lib
+*.a
diff --git a/IBSW/doc/Doxyfile b/IBSW/doc/Doxyfile
new file mode 100644
index 0000000..c73bc22
--- /dev/null
+++ b/IBSW/doc/Doxyfile
@@ -0,0 +1,2482 @@
+# Doxyfile 1.8.14
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See
+# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME           = "CHEOPS IBSW"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER         = 1.0
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          = "CHEOPS Instrument Basic Software"
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO           = "images/cheops-logo-with-additional3.png"
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       =
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS         = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES    = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES        = NO
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH        = ../
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH    = ../
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES  = YES
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines (in the resulting output). You can put ^^ in the value part of an
+# alias to insert a newline as if a physical newline was in the original file.
+
+ALIASES                =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST              =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C  = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
+# to that level are automatically included in the table of contents, even if
+# they do not have an id attribute.
+# Note: This feature currently applies only to Markdown headings.
+# Minimum value: 0, maximum value: 99, default value: 0.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+TOC_INCLUDE_HEADINGS   = 0
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE        = YES
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = YES
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC         = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    = "/bin/sh -c 'git log --pretty=\"format:%ci, author:%aN <%aE>, commit:%h\" -1 \"${1}\" || echo no git'"
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES         =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS               = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC       = YES
+
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered.
+# The default value is: NO.
+
+WARN_AS_ERROR          = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+INPUT                  = ../lib ../include ../test ./extradoc
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: https://www.gnu.org/software/libiconv/) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
+# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf.
+
+FILE_PATTERNS          = *.c \
+                         *.cc \
+                         *.cxx \
+                         *.cpp \
+                         *.c++ \
+                         *.java \
+                         *.ii \
+                         *.ixx \
+                         *.ipp \
+                         *.i++ \
+                         *.inl \
+                         *.idl \
+                         *.ddl \
+                         *.odl \
+                         *.h \
+                         *.hh \
+                         *.hxx \
+                         *.hpp \
+                         *.h++ \
+                         *.cs \
+                         *.d \
+                         *.php \
+                         *.php4 \
+                         *.php5 \
+                         *.phtml \
+                         *.inc \
+                         *.m \
+                         *.markdown \
+                         *.md \
+                         *.mm \
+                         *.dox \
+                         *.py \
+                         *.pyw \
+                         *.f90 \
+                         *.f95 \
+                         *.f03 \
+                         *.f08 \
+                         *.f \
+                         *.for \
+                         *.tcl \
+                         *.vhd \
+                         *.vhdl \
+                         *.ucf \
+                         *.qsf
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH           = ../example ../spin
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH             = images 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER         = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES         = YES
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION    = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see https://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX     = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            = header.html
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            = footer.html
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  = customdoxygen.css
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = YES
+
+# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
+# documentation will contain a main index with vertical navigation menus that
+# are dynamically created via Javascript. If disabled, the navigation index will
+# consists of multiple levels of tabs that are statically embedded in every HTML
+# page. Disable this option to support browsers that do not have Javascript,
+# like the Qt help browser.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_MENUS     = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: https://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See https://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP      = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE               =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION           =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI           = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING     =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://doc.qt.io/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://doc.qt.io/qt-4.8/qthelpproject.html#virtual-folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://doc.qt.io/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX          = YES
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW      = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH         = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# https://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from https://www.mathjax.org before deployment.
+# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        = https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE           = NO
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: https://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: https://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER           =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES      =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE        = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES     = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP        = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE    =
+
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE        = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION          = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT             = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK       = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
+# the structure of the code including all documentation. Note that this feature
+# is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION        = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF     =  NO
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH           = ../include
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED             = __attribute__(x)=1 __SPW_ROUTING__=1 __sparc__=1
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS        = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH               =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT               = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK               = YES
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH          = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH             = YES
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH           = YES
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT       = svg
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = YES
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS           =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH      = /opt/plantuml
+
+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
+# configuration file for plantuml.
+
+PLANTUML_CFG_FILE      =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH  =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT        = YES
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS      = YES
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP            = YES
diff --git a/IBSW/doc/DoxygenLayout.xml b/IBSW/doc/DoxygenLayout.xml
new file mode 100644
index 0000000..7479687
--- /dev/null
+++ b/IBSW/doc/DoxygenLayout.xml
@@ -0,0 +1,194 @@
+<doxygenlayout version="1.0">
+  <!-- Generated by doxygen 1.8.11 -->
+  <!-- Navigation index tabs for HTML output -->
+  <navindex>
+    <tab type="mainpage" visible="yes" title=""/>
+    <tab type="pages" visible="yes" title="" intro=""/>
+    <tab type="modules" visible="yes" title="" intro=""/>
+    <tab type="namespaces" visible="yes" title="">
+      <tab type="namespacelist" visible="yes" title="" intro=""/>
+      <tab type="namespacemembers" visible="yes" title="" intro=""/>
+    </tab>
+    <tab type="classes" visible="yes" title="">
+      <tab type="classlist" visible="yes" title="" intro=""/>
+      <tab type="classindex" visible="$ALPHABETICAL_INDEX" title=""/> 
+      <tab type="hierarchy" visible="yes" title="" intro=""/>
+      <tab type="classmembers" visible="yes" title="" intro=""/>
+    </tab>
+    <tab type="files" visible="yes" title="">
+      <tab type="filelist" visible="yes" title="" intro=""/>
+      <tab type="globals" visible="yes" title="" intro=""/>
+    </tab>
+    <tab type="examples" visible="yes" title="" intro=""/>  
+  </navindex>
+
+  <!-- Layout definition for a class page -->
+  <class>
+    <briefdescription visible="yes"/>
+    <includes visible="$SHOW_INCLUDE_FILES"/>
+    <inheritancegraph visible="$CLASS_GRAPH"/>
+    <collaborationgraph visible="$COLLABORATION_GRAPH"/>
+    <detaileddescription title=""/>
+    <memberdecl>
+      <nestedclasses visible="yes" title=""/>
+      <publictypes title=""/>
+      <services title=""/>
+      <interfaces title=""/>
+      <publicslots title=""/>
+      <signals title=""/>
+      <publicmethods title=""/>
+      <publicstaticmethods title=""/>
+      <publicattributes title=""/>
+      <publicstaticattributes title=""/>
+      <protectedtypes title=""/>
+      <protectedslots title=""/>
+      <protectedmethods title=""/>
+      <protectedstaticmethods title=""/>
+      <protectedattributes title=""/>
+      <protectedstaticattributes title=""/>
+      <packagetypes title=""/>
+      <packagemethods title=""/>
+      <packagestaticmethods title=""/>
+      <packageattributes title=""/>
+      <packagestaticattributes title=""/>
+      <properties title=""/>
+      <events title=""/>
+      <privatetypes title=""/>
+      <privateslots title=""/>
+      <privatemethods title=""/>
+      <privatestaticmethods title=""/>
+      <privateattributes title=""/>
+      <privatestaticattributes title=""/>
+      <friends title=""/>
+      <related title="" subtitle=""/>
+      <membergroups visible="yes"/>
+    </memberdecl>
+    <memberdef>
+      <inlineclasses title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <services title=""/>
+      <interfaces title=""/>
+      <constructors title=""/>
+      <functions title=""/>
+      <related title=""/>
+      <variables title=""/>
+      <properties title=""/>
+      <events title=""/>
+    </memberdef>
+    <allmemberslink visible="yes"/>
+    <usedfiles visible="$SHOW_USED_FILES"/>
+    <authorsection visible="yes"/>
+  </class>
+
+  <!-- Layout definition for a namespace page -->
+  <namespace>
+    <briefdescription visible="yes"/>
+    <detaileddescription title=""/>
+    <memberdecl>
+      <nestednamespaces visible="yes" title=""/>
+      <constantgroups visible="yes" title=""/>
+      <classes visible="yes" title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <functions title=""/>
+      <variables title=""/>
+      <membergroups visible="yes"/>
+    </memberdecl>
+    <memberdef>
+      <inlineclasses title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <functions title=""/>
+      <variables title=""/>
+    </memberdef>
+    <authorsection visible="yes"/>
+  </namespace>
+
+  <!-- Layout definition for a file page -->
+  <file>
+    <briefdescription visible="yes"/>
+    <includes visible="$SHOW_INCLUDE_FILES"/>
+    <includegraph visible="$INCLUDE_GRAPH"/>
+    <includedbygraph visible="$INCLUDED_BY_GRAPH"/>
+    <sourcelink visible="yes"/>
+    <detaileddescription title=""/>
+    <memberdecl>
+      <classes visible="yes" title=""/>
+      <namespaces visible="yes" title=""/>
+      <constantgroups visible="yes" title=""/>
+      <defines title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <functions title=""/>
+      <variables title=""/>
+      <membergroups visible="yes"/>
+    </memberdecl>
+    <memberdef>
+      <inlineclasses title=""/>
+      <defines title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <functions title=""/>
+      <variables title=""/>
+    </memberdef>
+    <authorsection/>
+  </file>
+
+  <!-- Layout definition for a group page -->
+  <group>
+    <briefdescription visible="yes"/>
+    <groupgraph visible="$GROUP_GRAPHS"/>
+    <detaileddescription title=""/>
+    <memberdecl>
+      <nestedgroups visible="yes" title=""/>
+      <dirs visible="yes" title=""/>
+      <files visible="yes" title=""/>
+      <namespaces visible="yes" title=""/>
+      <classes visible="yes" title=""/>
+      <defines title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <enumvalues title=""/>
+      <functions title=""/>
+      <variables title=""/>
+      <signals title=""/>
+      <publicslots title=""/>
+      <protectedslots title=""/>
+      <privateslots title=""/>
+      <events title=""/>
+      <properties title=""/>
+      <friends title=""/>
+      <membergroups visible="yes"/>
+    </memberdecl>
+    <memberdef>
+      <pagedocs/>
+      <inlineclasses title=""/>
+      <defines title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <enumvalues title=""/>
+      <functions title=""/>
+      <variables title=""/>
+      <signals title=""/>
+      <publicslots title=""/>
+      <protectedslots title=""/>
+      <privateslots title=""/>
+      <events title=""/>
+      <properties title=""/>
+      <friends title=""/>
+    </memberdef>
+    <authorsection visible="yes"/>
+  </group>
+
+  <!-- Layout definition for a directory page -->
+  <directory>
+    <briefdescription visible="yes"/>
+    <directorygraph visible="yes"/>
+    <memberdecl>
+      <dirs visible="yes"/>
+      <files visible="yes"/>
+    </memberdecl>
+    <detaileddescription title=""/>
+  </directory>
+</doxygenlayout>
diff --git a/IBSW/doc/Makefile b/IBSW/doc/Makefile
new file mode 100644
index 0000000..533632b
--- /dev/null
+++ b/IBSW/doc/Makefile
@@ -0,0 +1,16 @@
+CSSFILES = $(shell ls *.css)
+JSFILES = $(shell ls *.js)
+HTFILES = header.html footer.html
+
+.PHONY: all
+
+all:
+	@which plantuml
+	@test -d html || mkdir html
+	doxygen
+	cp $(CSSFILES) $(JSFILES) $(HTFILES) html/
+
+.PHONY: clean
+clean:
+	rm -rf html
+
diff --git a/IBSW/doc/README b/IBSW/doc/README
new file mode 100644
index 0000000..34dd873
--- /dev/null
+++ b/IBSW/doc/README
@@ -0,0 +1,5 @@
+
+be sure to copy the .js and .css files to the html/ directory or they will not be found by the browser
+
+
+doxygen requires plantuml to be installed in the current configuration
diff --git a/IBSW/doc/bootstrap.min.css b/IBSW/doc/bootstrap.min.css
new file mode 100644
index 0000000..4cf729e
--- /dev/null
+++ b/IBSW/doc/bootstrap.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
+/*# sourceMappingURL=bootstrap.min.css.map */
\ No newline at end of file
diff --git a/IBSW/doc/bootstrap.min.js b/IBSW/doc/bootstrap.min.js
new file mode 100644
index 0000000..e79c065
--- /dev/null
+++ b/IBSW/doc/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under the MIT license
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.6",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.6",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in"),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+e).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",a,b)};c.VERSION="3.3.6",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-m<o.top?"bottom":"right"==h&&k.right+l>o.width?"left":"left"==h&&k.left-l<o.left?"right":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");
+d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.6",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
\ No newline at end of file
diff --git a/IBSW/doc/customdoxygen.css b/IBSW/doc/customdoxygen.css
new file mode 100644
index 0000000..6a32ca7
--- /dev/null
+++ b/IBSW/doc/customdoxygen.css
@@ -0,0 +1,306 @@
+/*
+h1, .h1, h2, .h2, h3, .h3{
+    font-weight: 200 !important;
+}
+*/
+
+h1,.h1 {
+  font-size: 24px;
+}
+
+h2,.h2 {
+  font-size: 20px;
+}
+
+h3,.h3 {
+  font-size: 16px;
+}
+
+h4,.h4 {
+  font-size: 14px;
+}
+
+h5,.h5 {
+  font-size: 12px;
+}
+
+h6,.h6 {
+  font-size: 10px;
+}
+
+
+
+#navrow1, #navrow2, #navrow3, #navrow4, #navrow5{
+    border-bottom: 1px solid #706d6e;
+}
+
+.adjust-right {
+margin-left: 30px !important;
+font-size: 1.15em !important;
+}
+.navbar{
+ border: 0px solid #222 !important;
+}
+
+
+/* Sticky footer styles
+-------------------------------------------------- */
+html,
+body {
+    height: 100%;
+    /* The html and body elements cannot have any padding or margin. */
+}
+
+img {
+max-width:100%;
+max-height:100%;
+}
+
+/* Wrapper for page content to push down footer */
+#wrap {
+    min-height: 100%;
+    height: auto;
+    /* Negative indent footer by its height */
+    margin: 0 auto -60px;
+    /* Pad bottom by footer height */
+    padding: 0 0 60px;
+}
+
+/* Set the fixed height of the footer here */
+#footer {
+    font-size: 0.9em;
+    padding: 8px 0px;
+    background-color: #f5f5f5;
+}
+
+.footer-row {
+    line-height: 44px;
+}
+
+#footer > .container {
+    padding-left: 15px;
+    padding-right: 15px;
+}
+
+.footer-follow-icon {
+    margin-left: 3px;
+    text-decoration: none !important;
+}
+
+.footer-follow-icon img {
+    width: 20px;
+}
+
+.footer-link {
+    padding-top: 5px;
+    display: inline-block;
+    color: #999999;
+    text-decoration: none;
+}
+
+.footer-copyright {
+    text-align: center;
+}
+
+
+@media (min-width: 992px) {
+    .footer-row {
+        text-align: left;
+    }
+
+    .footer-icons {
+        text-align: right;
+    }
+}
+@media (max-width: 991px) {
+    .footer-row {
+        text-align: center;
+    }
+
+    .footer-icons {
+        text-align: center;
+    }
+}
+
+/* DOXYGEN Code Styles
+----------------------------------- */
+
+	
+div.ingroups {
+    font-size: 16pt;
+    width: 50%;
+    text-align: left;
+    padding-top: 10px;
+}
+
+a.qindex {
+    font-size:  8pt;
+}
+
+a.qindexHL {
+    font-size:  9pt;
+    font-weight: bold;
+    background-color: #9CAFD4;
+    color: #ffffff;
+    border: 1px double #869DCA;
+}
+
+.contents a.qindexHL:visited {
+    color: #ffffff;
+}
+
+a.code, a.code:visited, a.line, a.line:visited {
+    color: #4665A2;
+}
+
+a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {
+    color: #4665A2;
+}
+
+/* @end */
+
+dl.el {
+    margin-left: -1cm;
+}
+
+pre.fragment {
+    border: 1px solid #C4CFE5;
+    background-color: #FBFCFD;
+    padding: 4px 6px;
+    margin: 4px 8px 4px 2px;
+    overflow: auto;
+    word-wrap: break-word;
+    font-size:  8pt;
+    line-height: 125%;
+    font-family: monospace, fixed;
+}
+
+div.navtab {
+    text-align: left;
+    padding-left: 5px;
+    margin-right: 5px;
+}
+
+div.fragment {
+    padding: 4px 6px;
+    margin: 4px 8px 4px 2px;
+    border: 1px solid #C4CFE5;
+}
+
+div.line {
+    font-family: monospace, fixed;
+    font-size: 13px;
+    min-height: 13px;
+    line-height: 1.0;
+    text-wrap: unrestricted;
+    white-space: -moz-pre-wrap; /* Moz */
+    white-space: -pre-wrap;     /* Opera 4-6 */
+    white-space: -o-pre-wrap;   /* Opera 7 */
+    white-space: pre-wrap;      /* CSS3  */
+    word-wrap: break-word;      /* IE 5.5+ */
+    text-indent: -53px;
+    padding-left: 53px;
+    padding-bottom: 0px;
+    margin: 0px;
+    -webkit-transition-property: background-color, box-shadow;
+    -webkit-transition-duration: 0.5s;
+    -moz-transition-property: background-color, box-shadow;
+    -moz-transition-duration: 0.5s;
+    -ms-transition-property: background-color, box-shadow;
+    -ms-transition-duration: 0.5s;
+    -o-transition-property: background-color, box-shadow;
+    -o-transition-duration: 0.5s;
+    transition-property: background-color, box-shadow;
+    transition-duration: 0.5s;
+}
+
+div.line.glow {
+    background-color: cyan;
+    box-shadow: 0 0 10px cyan;
+}
+
+
+span.lineno {
+    padding-right: 4px;
+    text-align: right;
+    border-right: 2px solid #0F0;
+    background-color: #E8E8E8;
+    white-space: pre;
+}
+span.lineno a {
+    background-color: #D8D8D8;
+}
+
+span.lineno a:hover {
+    background-color: #C8C8C8;
+}
+
+div.groupHeader {
+    margin-left: 16px;
+    margin-top: 12px;
+    font-weight: bold;
+}
+
+div.groupText {
+    margin-left: 16px;
+    font-style: italic;
+}
+
+.caption {
+	font-weight: bold;
+	padding-top: 10px;
+	padding-bottom: 20px;
+}
+/* @group Code Colorization */
+
+span.keyword {
+    color: #008000
+}
+
+span.keywordtype {
+    color: #604020
+}
+
+span.keywordflow {
+    color: #e08000
+}
+
+span.comment {
+    color: #800000
+}
+
+span.preprocessor {
+    color: #806020
+}
+
+span.stringliteral {
+    color: #002080
+}
+
+span.charliteral {
+    color: #008080
+}
+
+span.vhdldigit {
+    color: #ff00ff
+}
+
+span.vhdlchar {
+    color: #000000
+}
+
+span.vhdlkeyword {
+    color: #700070
+}
+
+span.vhdllogic {
+    color: #ff0000
+}
+
+blockquote {
+    background-color: #F7F8FB;
+    border-left: 2px solid #9CAFD4;
+    margin: 0 24px 0 4px;
+    padding: 0 12px 0 16px;
+}
+
diff --git a/IBSW/doc/doxy-boot.js b/IBSW/doc/doxy-boot.js
new file mode 100644
index 0000000..f045d16
--- /dev/null
+++ b/IBSW/doc/doxy-boot.js
@@ -0,0 +1,121 @@
+$( document ).ready(function() {
+
+    $("div.headertitle").addClass("page-header");
+    $("div.title").addClass("h1");
+
+    $('li > a[href="index.html"] > span').before("<i class='fa fa-cog'></i> ");
+    $('li > a[href="index.html"] > span').text("CHEOPS IBSW");
+    $('li > a[href="modules.html"] > span').before("<i class='fa fa-square'></i> ");
+    $('li > a[href="namespaces.html"] > span').before("<i class='fa fa-bars'></i> ");
+    $('li > a[href="annotated.html"] > span').before("<i class='fa fa-list-ul'></i> ");
+    $('li > a[href="classes.html"] > span').before("<i class='fa fa-book'></i> ");
+    $('li > a[href="inherits.html"] > span').before("<i class='fa fa-sitemap'></i> ");
+    $('li > a[href="functions.html"] > span').before("<i class='fa fa-list'></i> ");
+    $('li > a[href="functions_func.html"] > span').before("<i class='fa fa-list'></i> ");
+    $('li > a[href="functions_vars.html"] > span').before("<i class='fa fa-list'></i> ");
+    $('li > a[href="functions_enum.html"] > span').before("<i class='fa fa-list'></i> ");
+    $('li > a[href="functions_eval.html"] > span').before("<i class='fa fa-list'></i> ");
+    $('img[src="ftv2ns.png"]').replaceWith('<span class="label label-danger">N</span> ');
+    $('img[src="ftv2cl.png"]').replaceWith('<span class="label label-danger">C</span> ');
+
+    $("ul.tablist").addClass("nav nav-pills nav-justified");
+    $("ul.tablist").css("margin-top", "0.5em");
+    $("ul.tablist").css("margin-bottom", "0.5em");
+    $("li.current").addClass("active");
+    $("iframe").attr("scrolling", "yes");
+
+    $("#nav-path > ul").addClass("breadcrumb");
+
+    $("table.params").addClass("table");
+    $("div.ingroups").wrapInner("<small></small>");
+    $("div.levels").css("margin", "0.5em");
+    $("div.levels > span").addClass("btn btn-default btn-xs");
+    $("div.levels > span").css("margin-right", "0.25em");
+
+    $("table.directory").addClass("table table-striped");
+    $("div.summary > a").addClass("btn btn-default btn-xs");
+    $("table.fieldtable").addClass("table");
+    $(".fragment").addClass("well");
+    $(".memitem").addClass("panel panel-default");
+    $(".memproto").addClass("panel-heading");
+    $(".memdoc").addClass("panel-body");
+    $("span.mlabel").addClass("label label-info");
+
+    $("table.memberdecls").addClass("table");
+    $("[class^=memitem]").addClass("active");
+
+    $("div.ah").addClass("btn btn-default");
+    $("span.mlabels").addClass("pull-right");
+    $("table.mlabels").css("width", "100%")
+    $("td.mlabels-right").addClass("pull-right");
+
+    $("div.ttc").addClass("panel panel-primary");
+    $("div.ttname").addClass("panel-heading");
+    $("div.ttname a").css("color", 'white');
+    $("div.ttdef,div.ttdoc,div.ttdeci").addClass("panel-body");
+
+    $('#MSearchBox').parent().remove();
+
+    $('div.fragment.well div.line:first').css('margin-top', '15px');
+    $('div.fragment.well div.line:last').css('margin-bottom', '15px');
+	
+	$('table.doxtable').removeClass('doxtable').addClass('table table-striped table-bordered').each(function(){
+		$(this).prepend('<thead></thead>');
+		$(this).find('tbody > tr:first').prependTo($(this).find('thead'));
+		
+		$(this).find('td > span.success').parent().addClass('success');
+		$(this).find('td > span.warning').parent().addClass('warning');
+		$(this).find('td > span.danger').parent().addClass('danger');
+	});
+	
+	
+
+    if($('div.fragment.well div.ttc').length > 0)
+    {
+        $('div.fragment.well div.line:first').parent().removeClass('fragment well');
+    }
+
+    $('table.memberdecls').find('.memItemRight').each(function(){
+        $(this).contents().appendTo($(this).siblings('.memItemLeft'));
+        $(this).siblings('.memItemLeft').attr('align', 'left');
+    });
+	
+	function getOriginalWidthOfImg(img_element) {
+		var t = new Image();
+		t.src = (img_element.getAttribute ? img_element.getAttribute("src") : false) || img_element.src;
+		return t.width;
+	}
+	
+	$('div.dyncontent').find('img').each(function(){
+		if(getOriginalWidthOfImg($(this)[0]) > $('#content>div.container').width())
+			$(this).css('width', '100%');
+	});
+	
+	$(".memitem").removeClass('memitem');
+    $(".memproto").removeClass('memproto');
+    $(".memdoc").removeClass('memdoc');
+	$("span.mlabel").removeClass('mlabel');
+	$("table.memberdecls").removeClass('memberdecls');
+    $("[class^=memitem]").removeClass('memitem');
+    $("span.mlabels").removeClass('mlabels');
+    $("table.mlabels").removeClass('mlabels');
+    $("td.mlabels-right").removeClass('mlabels-right');
+	$(".navpath").removeClass('navpath');
+	$("li.navelem").removeClass('navelem');
+	$("a.el").removeClass('el');
+	$("div.ah").removeClass('ah');
+	$("div.header").removeClass("header");
+	
+	$('.mdescLeft').each(function(){
+		if($(this).html()=="&nbsp;") {
+			$(this).siblings('.mdescRight').attr('colspan', 2);
+			$(this).remove();
+		}
+	});
+	$('td.memItemLeft').each(function(){
+		if($(this).siblings('.memItemRight').html()=="") {
+			$(this).attr('colspan', 2);
+			$(this).siblings('.memItemRight').remove();
+		}
+	});
+});
diff --git a/IBSW/doc/extradoc/mainpage.dox b/IBSW/doc/extradoc/mainpage.dox
new file mode 100644
index 0000000..ae24883
--- /dev/null
+++ b/IBSW/doc/extradoc/mainpage.dox
@@ -0,0 +1,58 @@
+/**
+
+@mainpage
+
+@section iaswdoc IBSW Documentation
+
+The documentation of the IBSW is provided in part externally and in part (especially the detailed design of the science data processing)
+through this Doxygen. If this is what you are interested in, <b>go to the <a href="modules.html">Modules</a> section</b>.
+
+@section sec_sources Source Code
+
+The source code may be found in the subdirectories _lib_ and _include_ in the
+topmost level of the source tree.
+A set of examples demonstrating the use of the various components may be found
+in the _examples_ subdirectory.
+
+@section sec_files Files
+
+The files and data structures can be browsed following these links: <a href="files.html">Files</a>, <a href="annotated.html">Data Structures</a>.
+
+@subsection sec_test_suite_prerequisites Prerequisites
+
+To build and run the test suite, you need the following prerequisities:
+
+ - gnu make
+
+ - a recent enough version of gcc capable of building 32 bit binaries
+	(https://gcc.gnu.org/install/download.html)
+ - a 32 bit version of CUnit
+	(http://cunit.sourceforge.net/)
+ - gcov (see https://gcc.gnu.org/onlinedocs/gcc/Gcov.html; ususally packaged
+   with gcc)
+ - to generate gcov html output, you need lcov
+	(http://ltp.sourceforge.net/coverage/lcov.php)
+
+@subsection sec_test_suite_build_run Building and Running the Tests
+
+To build and run the test suite, enter the *test* subdirectory in the topmost
+level of the source tree.
+
+ - if you have lcov installed:
+	- issue the command _make coverage_
+	- the test suite will be compiled and executed
+	- to view the lcov-generated html report, open the file _index.html_ in
+	  the _out_ subdirectory in a web browser if it did not open
+	  automatically
+
+ - if you do not have lcov installed:
+	- issue the command _make_
+	- execute the file _unittest_ and dump the output into a logfile
+	- to generate a coverage report, run
+	  gcov -s *subdirectory* *test_file.c* for each of the tests.
+	
+
+
+
+
+*/
diff --git a/IBSW/doc/footer.html b/IBSW/doc/footer.html
new file mode 100644
index 0000000..f2fa204
--- /dev/null
+++ b/IBSW/doc/footer.html
@@ -0,0 +1,26 @@
+<!-- HTML footer for doxygen 1.8.8-->
+<!-- start footer part -->
+<!--BEGIN GENERATE_TREEVIEW-->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    $navpath
+    <li class="footer">$generatedby
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="$relpath^doxygen.png" alt="doxygen"/></a> $doxygenversion </li>
+  </ul>
+</div>
+<!--END GENERATE_TREEVIEW-->
+</div>
+</div>
+</div>
+</div>
+</div>
+<!--BEGIN !GENERATE_TREEVIEW-->
+<hr class="footer"/><address class="footer"><small>
+$generatedby &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="$relpath^doxygen.png" alt="doxygen"/>
+</a> $doxygenversion
+</small></address>
+<!--END !GENERATE_TREEVIEW-->
+</body>
+</html>
diff --git a/IBSW/doc/header.html b/IBSW/doc/header.html
new file mode 100644
index 0000000..d4b85eb
--- /dev/null
+++ b/IBSW/doc/header.html
@@ -0,0 +1,47 @@
+<!-- HTML header for doxygen 1.8.8-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <meta http-equiv="X-UA-Compatible" content="IE=edge">
+        <!-- For Mobile Devices -->
+        <meta name="viewport" content="width=device-width, initial-scale=1">
+
+        <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+        <meta name="generator" content="Doxygen $doxygenversion"/>
+
+        <script type="text/javascript" src="jquery.js"></script>
+
+        <!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
+        <!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
+        <!--<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>-->
+        <script type="text/javascript" src="$relpath^dynsections.js"></script>
+        $treeview
+        $search
+        $mathjax
+        <link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
+
+	<link rel="stylesheet" href="$relpath^bootstrap.min.css">
+
+	$extrastylesheet
+
+        <script src="$relpath^bootstrap.min.js"></script>
+        <script type="text/javascript" src="$relpath^doxy-boot.js"></script>
+    </head>
+    <body>
+
+        <nav class="navbar navbar-default" role="navigation">
+            <div class="container">
+                <div class="navbar-header">
+			<a class="navbar-brand">
+				<img alt="Logo" align="left" style="margin-right: 1em;" src=$projectlogo/>
+				$projectname $projectnumber</a>
+                </div>
+            </div>
+        </nav>
+        <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+            <div class="content" id="content">
+                <div class="container">
+                    <div class="row">
+                        <div class="col-sm-12 panel panel-default" style="padding-bottom: 15px;">
+                            <div style="margin-bottom: 15px;">
+<!-- end header part -->
diff --git a/IBSW/doc/images/cheops-logo-with-additional3.png b/IBSW/doc/images/cheops-logo-with-additional3.png
new file mode 100644
index 0000000000000000000000000000000000000000..20e1b7978b60d6a269645f9fc35a4abb07c6107a
GIT binary patch
literal 11478
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

literal 0
HcmV?d00001

diff --git a/IBSW/doc/images/core1553brm_as250/irq_handler.graphml b/IBSW/doc/images/core1553brm_as250/irq_handler.graphml
new file mode 100644
index 0000000..4289886
--- /dev/null
+++ b/IBSW/doc/images/core1553brm_as250/irq_handler.graphml
@@ -0,0 +1,1669 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yEd 3.14.2-->
+  <key for="graphml" id="d0" yfiles.type="resources"/>
+  <key for="port" id="d1" yfiles.type="portgraphics"/>
+  <key for="port" id="d2" yfiles.type="portgeometry"/>
+  <key for="port" id="d3" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d4"/>
+  <key attr.name="description" attr.type="string" for="node" id="d5"/>
+  <key for="node" id="d6" yfiles.type="nodegraphics"/>
+  <key attr.name="Description" attr.type="string" for="graph" id="d7"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
+  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <data key="d7"/>
+    <node id="n0">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="60.0" width="60.0" x="170.0" y="820.0"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#27AE27" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="126.28515625" x="-33.142578125" y="83.91562499999998">MIL-STD-1553 IRQ<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="23.915624999999977" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_SIGNAL"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n1">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="113.19906334005373" x="297.9208984375" y="829.03125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="100.84375" x="6.177656670026863" y="5.0">Iterate Interrupt
+Log List</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="54.59953167002686" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n2">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="140.158203125" x="454.9208984375" y="829.03125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="107.171875" x="16.4931640625" y="11.984375">Select next entry</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="68.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n3">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="502.5" y="652.5"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n4">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="140.158203125" x="247.4208984375" y="654.03125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="127.890625" x="6.1337890625" y="5.0">Check Flags in
+Pending IRQ register</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="68.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n5">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="170.0" y="652.5"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n6">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="-20.727564560602474" y="654.03125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="100.580078125" x="1.7890625" y="5.0">Call
+Fault Handler(s)</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n7">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="16.351537001897526" y="735.0"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="44.5703125" x="-7.28515625" y="44.472987975045044">Return<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="14.4729879750451" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n8">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="472.9208984375" y="579.03125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="99.068359375" x="2.544921875" y="11.984375">Invalidate Entry</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n9">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="-136.7016822076613" y="506.85183823529405"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="66.337890625" x="18.91015625" y="5.0">Extract
+Descriptor</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n10">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="502.5" y="502.5"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n11">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="73.9375" width="108.158203125" x="470.9208984375" y="413.03125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="69.173828125" x="19.4921875" y="21.0">Check IRQ
+Fault Flags</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="52.0791015625" y="34.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n12">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="668.4591397849463" y="652.5"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n13">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="115.44055606617644" x="633.238861751858" y="829.03125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="100.580078125" x="7.430238970588221" y="5.0">Call 
+Fault Handler(s)</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="55.72027803308822" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n14">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="-11.701682207661293" y="345.11746323529405"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="92.3125" x="5.9228515625" y="5.0">Extract
+Address Offset</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n15">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="-11.701682207661293" y="431.85183823529405"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="79.251953125" x="12.453125" y="-1.984375">Extract
+Word Count/
+Mode Code</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n16">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="-136.7016822076613" y="106.85183823529405"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="58.568359375" x="22.794921875" y="5.0">Identify
+IRQ Type</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n17">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="17.877419354838707" y="105.32058823529405"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n18">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="802.5" y="102.5"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n19">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="802.5" y="277.5"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n20">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="802.5" y="352.5"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n21">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="-11.701682207661293" y="270.11746323529405"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="75.490234375" x="14.333984375" y="5.0">Identify
+Input Buffer</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n22">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="148.8227526767156" y="150.32058823529405"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="50.470703125" x="22.16310440049034" y="24.441406250000057">DD
+Circular
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n23">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="144.14210707720594" y="431.85183823529405"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="66.90625" x="18.6259765625" y="11.984375">Copy Data</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n24">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="938.7626953125" y="104.03125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="86.1015625" x="9.0283203125" y="5.0">Identify
+Output Buffer</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n25">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="953.4993934993752" y="589.3188235294118"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="44.224609375" x="25.286151275490283" y="24.441406250000114">AD
+Packet
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n26">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="149.27648269489225" x="926.2596081149193" y="483.5990255376345"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="125.921875" x="11.677303847446183" y="5.0">Move up to 1kiB in 
+packets to  ADB SAs</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="72.63824134744618" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n27">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="609.3009366599463" y="279.03125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="81.6484375" x="11.2548828125" y="5.0">Get optional 
+data word</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n28">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="472.9208984375" y="279.03125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="71.23046875" x="16.4638671875" y="5.0">Handle
+Mode Code</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n29">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="971.3778876848116" y="354.03125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="59.1953125" x="22.4814453125" y="11.984375">[ignored]</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n30">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="477.6015440370097" y="921.8172967069892"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="57.02734375" x="18.88478408799034" y="24.441406250000114">Interrupt
+Log
+List</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n31">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="146.04408602150613" x="750.2155220934131" y="483.59902553763453"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="120.16796875" x="12.938058635753123" y="5.0">Set up Acquisition
+Transfer Descriptor</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="71.02204301075312" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n32">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="86.8595330752687" width="322.392366795699" x="-33.70168220766129" y="944.7468261317206"/>
+          <y:Fill hasColor="false" transparent="false"/>
+          <y:BorderStyle color="#999999" type="line" width="1.0"/>
+          <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Liberation Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="58.375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="263.2421875" x="29.575089647849495" y="14.24226653763435">AD  ... Acquisition  Data
+DD  ... Distribution Data
+ADB ... Acquisition Data Buffer
+ATR ... Acquisition Transfer Request</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="159.1961833978495" y="41.42976653763435">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n33">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="149.27648269489248" x="278.30031020220594" y="431.85183823529405"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="135.677734375" x="6.799374159946183" y="5.0">Set up Distribution
+Transfer Confirmation</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="72.63824134744618" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n34">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="1076.453156502016" y="104.03125"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <edge id="e0" source="n0" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="30.0" sy="-0.0" tx="-56.59953167002686" ty="-0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e1" source="n30" target="n2">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="20.96875"/>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e2" source="n1" target="n2">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="56.59953167002686" sy="-0.0" tx="-70.0791015625" ty="-0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e3" source="n2" target="n3">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.96875" tx="0.0" ty="22.5"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e4" source="n3" target="n4">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-22.5" sy="-0.0" tx="70.0791015625" ty="-0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="79.22265625" x="-84.19461059570312" y="-8.984375">invalid entry<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="34.416129032257906" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e5" source="n4" target="n5">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-70.0791015625" sy="-0.0" tx="22.5" ty="-0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e6" source="n5" target="n6">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-22.5" sy="-0.0" tx="52.0791015625" ty="-0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="31.9375" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="57.390625" x="-62.348358154296875" y="-15.96875">Fault(s)
+detected<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e7" source="n6" target="n7">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="0.0" ty="-15.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e8" source="n5" target="n7">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="22.5" tx="15.0" ty="-0.0">
+            <y:Point x="192.5" y="750.0"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="60.28515625" x="-85.64552056155124" y="43.515625">No Faults<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="-1"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e9" source="n3" target="n8">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-22.5" tx="0.0" ty="20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e10" source="n8" target="n10">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.96875" tx="0.0" ty="22.5"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e11" source="n10" target="n9">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-22.5" sy="-0.0" tx="52.0791015625" ty="-0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="skewed_dash" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="99.384765625" x="-317.1814685452369" y="-7.574263987821723">Subaddress IRQ<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_DEFAULT_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e12" source="n10" target="n11">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-22.5" tx="0.0" ty="36.96875000000001"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e13" source="n12" target="n13">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="22.5" tx="0.0" ty="-20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" anchorX="-8.984402695522476" anchorY="5.0" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" upX="1.0" upY="1.8369701987210297E-16" visible="true" width="106.720703125" x="-8.984402695522496" y="5.0">Fault(s) detected<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="true" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e14" source="n11" target="n12">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="54.07910156249999" sy="-0.0" tx="0.0" ty="-22.50244140625">
+            <y:Point x="690.9591397849463" y="450.0"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e15" source="n13" target="n2">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-57.72027803308823" sy="-0.0" tx="70.0791015625" ty="-0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e16" source="n14" target="n15">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="0.0" ty="-20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e17" source="n9" target="n16">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.96875" tx="0.0" ty="20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e18" source="n16" target="n17">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="52.0791015625" sy="-0.0" tx="-22.5" ty="-0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e19" source="n17" target="n18">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="22.5" sy="-0.0" tx="-22.5" ty="-0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e20" source="n18" target="n19">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="22.5" tx="0.0" ty="-22.5"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e21" source="n19" target="n20">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="22.5" tx="0.0" ty="-22.5"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e22" source="n17" target="n21">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="22.5" tx="0.0" ty="-20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" anchorX="-8.984374163227692" anchorY="33.38574326459093" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" upX="1.0" upY="1.8369701987210297E-16" visible="true" width="53.025390625" x="-8.9843741632277" y="33.38574326459093">Data RX<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="true" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e23" source="n21" target="n14">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="0.0" ty="-20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e24" source="n23" target="n22">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.96875" tx="0.0" ty="47.39453125"/>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e25" source="n15" target="n23">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="52.0791015625" sy="-0.0" tx="-52.0791015625" ty="-0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e26" source="n33" target="n11">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="74.67837017325945" sy="0.0" tx="-54.10141429227957" ty="2.8205882352940534"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e27" source="n18" target="n24">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="22.5" sy="-0.0" tx="-52.0791015625" ty="-0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="52.017578125" x="5.0" y="-8.984375">Data TX<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e28" source="n25" target="n26">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="20.958343505859375"/>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e29" source="n19" target="n27">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-22.5" sy="-0.0" tx="52.0791015625" ty="-0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="31.9375" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="55.09375" x="-60.05029296875" y="-15.96875">Mode 
+Code RX<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e30" source="n27" target="n28">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-52.0791015625" sy="-0.0" tx="52.0791015625" ty="-0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e31" source="n28" target="n11">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="0.0" ty="-36.96875000000001"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e32" source="n20" target="n29">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="22.5" sy="-0.0" tx="-52.0791015625" ty="-0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="90.595703125" x="5.0" y="-8.984375">Mode Code TX<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e33" source="n20" target="n11">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-22.5" sy="-0.0" tx="25.960078006338012" ty="-36.96875000000001">
+            <y:Point x="550.0" y="375.0"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e34" source="n29" target="n11">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="54.07910156249999" ty="-22.038002980625937">
+            <y:Point x="1023.4569892473116" y="427.96199701937405"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e35" source="n12" target="n2">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="66.59301075268809" ty="-20.913365255376334">
+            <y:Point x="591.5930107526881" y="675.0"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="skewed_dash" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_DEFAULT_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e36" source="n24" target="n34">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e37" source="n34" target="n26">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="1098.953156502016" y="504.5677755376345"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e38" source="n23" target="n33">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e39" source="n26" target="n31">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="1.61619833669306" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e40" source="n31" target="n11">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="54.113318014705555" ty="-12.169999999999845">
+            <y:Point x="823.2375651041662" y="437.83000000000015"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d0">
+    <y:Resources>
+      <y:Resource id="1">&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
+&lt;!-- Created with Inkscape (http://www.inkscape.org/) --&gt;
+
+&lt;svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="181.51503"
+   height="181.50002"
+   id="svg6241"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="circular_buffer.svg"&gt;
+  &lt;defs
+     id="defs6243" /&gt;
+  &lt;sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4"
+     inkscape:cx="-191.78859"
+     inkscape:cy="95.848443"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1920"
+     inkscape:window-height="1014"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" /&gt;
+  &lt;metadata
+     id="metadata6246"&gt;
+    &lt;rdf:RDF&gt;
+      &lt;cc:Work
+         rdf:about=""&gt;
+        &lt;dc:format&gt;image/svg+xml&lt;/dc:format&gt;
+        &lt;dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /&gt;
+        &lt;dc:title&gt;&lt;/dc:title&gt;
+      &lt;/cc:Work&gt;
+    &lt;/rdf:RDF&gt;
+  &lt;/metadata&gt;
+  &lt;g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-745.67177,-616.55345)"&gt;
+    &lt;text
+       xml:space="preserve"
+       style="font-size:21.79795456px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Verdana;-inkscape-font-specification:Verdana"
+       x="383.44809"
+       y="710.9231"
+       id="text6873"
+       sodipodi:linespacing="125%"&gt;&lt;tspan
+         sodipodi:role="line"
+         id="tspan6875"
+         x="383.44809"
+         y="710.9231"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans Bold" /&gt;&lt;/text&gt;
+    &lt;path
+       transform="matrix(-0.94718199,-0.01879329,0.01879329,-0.94718199,929.26064,803.90098)"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       sodipodi:ry="80"
+       sodipodi:rx="80"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path6939-8-1"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       d="m 190,100 a 90,90 0 1 1 -180,0 90,90 0 1 1 180,0 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path4706-7-4"
+       style="fill:#f8f8f8;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:type="arc"
+       style="fill:#89acf3;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5917-9-6"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="90"
+       sodipodi:ry="90"
+       d="M 10,99.999996 A 90,90 0 1 1 145,177.94229 L 100,100 z"
+       sodipodi:start="3.1415927"
+       sodipodi:end="7.3303829" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:end="7.3303829"
+       sodipodi:start="5.2359878"
+       d="m 145,22.057716 a 90,90 0 0 1 0,155.884574 L 100,100 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path3653-6-2"
+       style="fill:#fbecd5;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,78"
+       id="path5943-6-2" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,-78"
+       id="path5953-2-0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 746.42177,707.30345 180,0"
+       id="path5921-6-0"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,797.30345 0,-180"
+       id="path5923-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,63"
+       id="path5925-7-9"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,-63"
+       id="path5927-9-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,-63"
+       id="path5929-2-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,63"
+       id="path5931-8-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,23"
+       id="path5933-1-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,45"
+       id="path5935-6-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,78"
+       id="path5937-5-4"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,87"
+       id="path5939-0-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,87"
+       id="path5941-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,45"
+       id="path5945-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,23"
+       id="path5947-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,-23"
+       id="path5949-9-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,-45"
+       id="path5951-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,-87 0,0"
+       id="path5955-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,-87"
+       id="path5957-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,-78"
+       id="path5959-8-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,-45"
+       id="path5961-4-1"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,-23"
+       id="path5963-6-8"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       sodipodi:type="arc"
+       style="fill:#c7e5f9;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5919-8-8"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="80"
+       sodipodi:ry="80"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       transform="matrix(0.90092879,0,0,0.90092879,746.3289,617.21058)" /&gt;
+    &lt;g
+       transform="translate(230.43873,464.77132)"
+       id="g8379"
+       style="fill:#1166ad;fill-opacity:1;stroke:none;display:inline"&gt;
+      &lt;path
+         style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#1166ad;fill-opacity:1;stroke:none;stroke-width:3.95015383;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+         d="m 525.52266,251.41302 a 2.0002,2.0002 0 0 0 -1.89866,2.31003 c 5.92694,43.90653 45.35328,75.43234 89.49019,71.57949 a 2.001176,2.001176 0 1 0 -0.34809,-3.98718 C 570.71635,324.986 533.25785,295.01535 527.61119,253.1851 a 2.0002,2.0002 0 0 0 -2.08853,-1.77208 z"
+         id="path7578-8-2"
+         inkscape:connector-curvature="0" /&gt;
+      &lt;path
+         style="fill:#1166ad;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         d="m 617.54256,322.91708 -6.54593,4.58663 -0.6957,-7.9697 7.24163,3.38307 z"
+         id="path8385"
+         inkscape:connector-curvature="0" /&gt;
+    &lt;/g&gt;
+    &lt;flowRoot
+       xml:space="preserve"
+       id="flowRoot3243"
+       style="font-size:8px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       transform="translate(264.88555,551.83968)"&gt;&lt;flowRegion
+         id="flowRegion3245"&gt;&lt;rect
+           id="rect3247"
+           width="219.28572"
+           height="286.42856"
+           x="419.28571"
+           y="53.187862" /&gt;&lt;/flowRegion&gt;&lt;flowPara
+         id="flowPara3249"&gt;&lt;/flowPara&gt;&lt;/flowRoot&gt;  &lt;/g&gt;
+&lt;/svg&gt;
+</y:Resource>
+    </y:Resources>
+  </data>
+</graphml>
diff --git a/IBSW/doc/images/core1553brm_as250/irq_handler.png b/IBSW/doc/images/core1553brm_as250/irq_handler.png
new file mode 100644
index 0000000000000000000000000000000000000000..54c72025ca669ea005561648bb3db58c64646428
GIT binary patch
literal 202249
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

literal 0
HcmV?d00001

diff --git a/IBSW/doc/images/core1553brm_as250/split_packetstreams.graphml b/IBSW/doc/images/core1553brm_as250/split_packetstreams.graphml
new file mode 100644
index 0000000..c02b155
--- /dev/null
+++ b/IBSW/doc/images/core1553brm_as250/split_packetstreams.graphml
@@ -0,0 +1,1221 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yEd 3.14.1-->
+  <key for="graphml" id="d0" yfiles.type="resources"/>
+  <key for="port" id="d1" yfiles.type="portgraphics"/>
+  <key for="port" id="d2" yfiles.type="portgeometry"/>
+  <key for="port" id="d3" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d4"/>
+  <key attr.name="description" attr.type="string" for="node" id="d5"/>
+  <key for="node" id="d6" yfiles.type="nodegraphics"/>
+  <key attr.name="Description" attr.type="string" for="graph" id="d7"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
+  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <data key="d7"/>
+    <node id="n0">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="60.0" width="60.0" x="826.6959602414554" y="674.8593750000002"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#27AE27" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="126.28515625" x="-156.3385383664554" y="21.015625">MIL-STD-1553 IRQ<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="0.0" nodeRatioX="-0.5" nodeRatioY="0.0" offsetX="-30.053382116455396" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_SIGNAL"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n1">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="113.19906334005373" x="800.0964285714285" y="591.9218750000002"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="80.458984375" x="16.370039482526863" y="11.984375">Peek Header</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="54.59953167002686" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n2">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="794.2975042784651" y="0.0"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="50.470703125" x="22.163104400490283" y="24.441406250000057">DD
+Circular
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n3">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="742.5963570668522" y="501.9218750000002"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n4">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="176.40085013079093" y="509.4218750000002"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="44.5703125" x="-58.039994959677415" y="8.03125">Return<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="0.5" nodeRatioX="-0.5" nodeRatioY="0.5" offsetX="-13.469682459677415" offsetY="-4.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n5">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="153.19906334005373" x="688.4968253968253" y="439.9843750000002"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="137.03125" x="8.083906670026863" y="11.984375">Inspect Packet Source</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="74.59953167002686" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n6">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="742.5963570668522" y="374.9843750000002"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n7">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="113.19906334005373" x="255.29937759835755" y="376.5156250000002"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="94.099609375" x="9.549726982526863" y="11.984375">Migrate packet</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="54.59953167002686" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n8">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="113.19906334005373" x="901.6960317460317" y="376.5156250000002"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="94.099609375" x="9.549726982526863" y="11.984375">Migrate packet</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="54.59953167002686" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n9">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="113.19906334005373" x="708.4968253968253" y="256.7265625000001"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="91.3984375" x="10.900312920026863" y="11.984375">Extract packet</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="54.59953167002686" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n10">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="230.40124695618775" y="213.2578125000001"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="50.470703125" x="22.16310440049034" y="24.441406250000057">GND
+Circular
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n11">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="876.7979011038619" y="213.2578125000001"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="50.470703125" x="22.163104400490283" y="24.441406250000057">OBC
+Circular
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n12">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="54.90286249777373" y="213.2578125000001"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="59.962890625" x="17.417010650490333" y="24.441406250000057">GND Size
+Circular
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n13">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="1076.5963138022748" y="213.2578125000001"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="58.50390625" x="18.146502837990283" y="24.441406250000057">OBC Size
+Circular
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n14">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="138.19906334005373" x="33.2017867907372" y="376.5156250000002"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="116.916015625" x="10.641523857526863" y="5.0">Register in Ground
+packet size buffer </y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="67.09953167002686" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n15">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="138.19906334005373" x="1054.8952380952383" y="376.5156250000002"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="115.3046875" x="11.447187920026863" y="5.0">Register in OBC
+packet size buffer </y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="67.09953167002686" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n16">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="121.19906334005373" x="554.2977620567716" y="256.7265625000001"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="114.244140625" x="3.477461357526863" y="11.984375">Check packet CRC</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="58.59953167002686" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n17">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="592.3972937267985" y="139.7890625000001"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n18">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="121.19906334005373" x="371.04853407527645" y="141.3203125000001"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="103.580078125" x="8.809492607526863" y="5.0">Undefined state,
+drop DD buffer</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="58.59953167002686" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n19">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="121.19906334005373" x="130.80131846076407" y="141.3203125000001"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="70.0" x="25.599531670026863" y="11.984375">Raise error</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="58.59953167002686" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n20">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="121.19906334005373" x="705.4968253968253" y="184.7890625000001"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="70.0" x="25.599531670026863" y="11.984375">Raise error</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="58.59953167002686" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n21">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="70.8595330752687" width="216.392366795699" x="976.701934639593" y="638.7468261317206"/>
+          <y:Fill hasColor="false" transparent="false"/>
+          <y:BorderStyle color="#999999" type="line" width="1.0"/>
+          <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Liberation Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="58.375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="198.431640625" x="8.980363085349381" y="6.24226653763435">Note: This function must
+be chained to the 1553 IRQ 
+so that it is executed 
+AFTER the 1553 driver ISR</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="106.19618339784938" y="33.42976653763435">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n22">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="81.8595330752687" width="278.392366795699" x="255.29937759835758" y="633.2468261317206"/>
+          <y:Fill hasColor="false" transparent="false"/>
+          <y:BorderStyle color="#999999" type="line" width="1.0"/>
+          <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Liberation Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="71.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="263.2421875" x="7.575089647849495" y="4.94539153763435">AD  ... Acquisition  Data
+DD  ... Distribution Data
+ATR ... Acquisition Transfer Request
+GND ... Ground
+OBC ... On-Board Computer</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="137.1961833978495" y="38.92976653763435">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <edge id="e0" source="n0" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-30.0" tx="0.0" ty="20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e1" source="n2" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="37.91876477039227" sy="28.425781250000057" tx="45.27962533602147" ty="-20.96875">
+            <y:Point x="879.6147250118477" y="109.78906250000011"/>
+            <y:Point x="1208.0943729398682" y="109.78906250000011"/>
+            <y:Point x="1208.0943729398682" y="554.4218750000002"/>
+            <y:Point x="901.9755855774769" y="554.4218750000002"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e2" source="n1" target="n3">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-22.639812668010748" sy="-20.96875" tx="22.50244140625" ty="0.0">
+            <y:Point x="834.0561475734446" y="524.4218750000002"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e3" source="n3" target="n4">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-22.5" sy="0.0" tx="15.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="82.9140625" x="-102.2245872781125" y="-8.984374999999773">Buffer empty<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.03235691986891812" segment="-1"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e4" source="n3" target="n5">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-22.5" tx="0.0" ty="20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="skewed_dash" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_DEFAULT_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e5" source="n5" target="n6">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.96875" tx="0.0" ty="22.5"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e6" source="n6" target="n7">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-22.5" sy="0.0" tx="56.59953167002686" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="48.40234375" x="-71.14019057040707" y="-8.98437499999983">Ground<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.056331115252694915" segment="-1"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e7" source="n6" target="n8">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="22.5" sy="0.0" tx="-56.59953167002686" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="30.056640625" x="22.999982555133442" y="-8.984374999999773">OBC<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.2431018694726752" segment="-1"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e8" source="n6" target="n9">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-22.5" tx="0.0" ty="20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" anchorX="8.984357555133442" anchorY="-19.12402343749983" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" upX="-1.0" upY="-6.123233995736766E-17" visible="true" width="38.072265625" x="-8.984392444866558" y="-57.19628906249983">Other<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="true" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e9" source="n2" target="n7">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-37.91876477039227" sy="30.363281250000057" tx="28.29976583501343" ty="-20.96875">
+            <y:Point x="803.7771954710631" y="109.78906250000011"/>
+            <y:Point x="340.19851244298764" y="109.78906250000011"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e10" source="n2" target="n8">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="18.959382385196136" sy="43.61328125000006" tx="28.29976583501343" ty="-20.96875">
+            <y:Point x="860.6553426266515" y="124.78906250000011"/>
+            <y:Point x="986.5951665906617" y="124.78906250000011"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e11" source="n2" target="n9">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="47.39453125000006" tx="56.616105780037515" ty="0.0">
+            <y:Point x="841.6959602414554" y="277.6953125000001"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e12" source="n7" target="n10">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-34.09920634920633" sy="-20.992187500000227" tx="0.0" ty="47.39453125000006"/>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e13" source="n8" target="n11">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-34.09920634920638" sy="-20.945312500000227" tx="0.0" ty="47.39453125000006"/>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e14" source="n7" target="n14">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-56.59953167002686" sy="0.0" tx="69.09953167002686" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e15" source="n8" target="n15">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="56.59953167002686" sy="0.0" tx="-69.09953167002686" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e16" source="n15" target="n13">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.96875" tx="0.0" ty="47.39453125000006"/>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e17" source="n14" target="n12">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.96875" tx="0.0" ty="47.39453125000006"/>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e18" source="n14" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="-45.27962533602147" ty="-20.96875">
+            <y:Point x="102.30131846076407" y="433.4531250000002"/>
+            <y:Point x="240.29930609378127" y="433.4531250000002"/>
+            <y:Point x="240.29930609378127" y="576.9218750000002"/>
+            <y:Point x="811.4163349054339" y="576.9218750000002"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e19" source="n15" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="22.63981266801079" ty="-20.96875">
+            <y:Point x="1123.9947697652651" y="539.4218750000002"/>
+            <y:Point x="879.3357729094662" y="539.4218750000002"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e20" source="n9" target="n16">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-56.57291956685219" sy="0.0" tx="60.5680552462095" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e21" source="n16" target="n17">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.96875" tx="0.0" ty="22.5"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e22" source="n17" target="n18">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-22.5" sy="0.0" tx="60.59953167002686" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="43.884765625" x="-71.96832591331076" y="-8.984374999999886">Invalid<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e23" source="n18" target="n19">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-60.59953167002686" sy="0.0" tx="60.59953167002686" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e24" source="n19" target="n4">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="0.0" ty="-15.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e25" source="n17" target="n20">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="22.5" sy="0.0" tx="0.0" ty="-20.958343505859375">
+            <y:Point x="766.0963570668522" y="162.2890625000001"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="33.84765625" x="16.728159094160446" y="-8.984374999999886">Valid<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.10983954449523646" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e26" source="n20" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="60.5680552462095" sy="0.0" tx="0.0" ty="-20.96875">
+            <y:Point x="856.6959602414554" y="205.7578125000001"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e27" source="n2" target="n18">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-18.959382385196136" sy="44.55078125000006" tx="0.0" ty="-20.96875">
+            <y:Point x="822.7365778562593" y="124.78906250000011"/>
+            <y:Point x="431.6480657453033" y="124.78906250000011"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d0">
+    <y:Resources>
+      <y:Resource id="1">&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
+&lt;!-- Created with Inkscape (http://www.inkscape.org/) --&gt;
+
+&lt;svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="181.51503"
+   height="181.50002"
+   id="svg6241"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="circular_buffer.svg"&gt;
+  &lt;defs
+     id="defs6243" /&gt;
+  &lt;sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4"
+     inkscape:cx="-191.78859"
+     inkscape:cy="95.848443"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1920"
+     inkscape:window-height="1014"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" /&gt;
+  &lt;metadata
+     id="metadata6246"&gt;
+    &lt;rdf:RDF&gt;
+      &lt;cc:Work
+         rdf:about=""&gt;
+        &lt;dc:format&gt;image/svg+xml&lt;/dc:format&gt;
+        &lt;dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /&gt;
+        &lt;dc:title&gt;&lt;/dc:title&gt;
+      &lt;/cc:Work&gt;
+    &lt;/rdf:RDF&gt;
+  &lt;/metadata&gt;
+  &lt;g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-745.67177,-616.55345)"&gt;
+    &lt;text
+       xml:space="preserve"
+       style="font-size:21.79795456px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Verdana;-inkscape-font-specification:Verdana"
+       x="383.44809"
+       y="710.9231"
+       id="text6873"
+       sodipodi:linespacing="125%"&gt;&lt;tspan
+         sodipodi:role="line"
+         id="tspan6875"
+         x="383.44809"
+         y="710.9231"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans Bold" /&gt;&lt;/text&gt;
+    &lt;path
+       transform="matrix(-0.94718199,-0.01879329,0.01879329,-0.94718199,929.26064,803.90098)"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       sodipodi:ry="80"
+       sodipodi:rx="80"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path6939-8-1"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       d="m 190,100 a 90,90 0 1 1 -180,0 90,90 0 1 1 180,0 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path4706-7-4"
+       style="fill:#f8f8f8;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:type="arc"
+       style="fill:#89acf3;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5917-9-6"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="90"
+       sodipodi:ry="90"
+       d="M 10,99.999996 A 90,90 0 1 1 145,177.94229 L 100,100 z"
+       sodipodi:start="3.1415927"
+       sodipodi:end="7.3303829" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:end="7.3303829"
+       sodipodi:start="5.2359878"
+       d="m 145,22.057716 a 90,90 0 0 1 0,155.884574 L 100,100 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path3653-6-2"
+       style="fill:#fbecd5;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,78"
+       id="path5943-6-2" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,-78"
+       id="path5953-2-0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 746.42177,707.30345 180,0"
+       id="path5921-6-0"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,797.30345 0,-180"
+       id="path5923-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,63"
+       id="path5925-7-9"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,-63"
+       id="path5927-9-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,-63"
+       id="path5929-2-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,63"
+       id="path5931-8-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,23"
+       id="path5933-1-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,45"
+       id="path5935-6-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,78"
+       id="path5937-5-4"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,87"
+       id="path5939-0-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,87"
+       id="path5941-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,45"
+       id="path5945-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,23"
+       id="path5947-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,-23"
+       id="path5949-9-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,-45"
+       id="path5951-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,-87 0,0"
+       id="path5955-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,-87"
+       id="path5957-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,-78"
+       id="path5959-8-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,-45"
+       id="path5961-4-1"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,-23"
+       id="path5963-6-8"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       sodipodi:type="arc"
+       style="fill:#c7e5f9;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5919-8-8"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="80"
+       sodipodi:ry="80"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       transform="matrix(0.90092879,0,0,0.90092879,746.3289,617.21058)" /&gt;
+    &lt;g
+       transform="translate(230.43873,464.77132)"
+       id="g8379"
+       style="fill:#1166ad;fill-opacity:1;stroke:none;display:inline"&gt;
+      &lt;path
+         style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#1166ad;fill-opacity:1;stroke:none;stroke-width:3.95015383;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+         d="m 525.52266,251.41302 a 2.0002,2.0002 0 0 0 -1.89866,2.31003 c 5.92694,43.90653 45.35328,75.43234 89.49019,71.57949 a 2.001176,2.001176 0 1 0 -0.34809,-3.98718 C 570.71635,324.986 533.25785,295.01535 527.61119,253.1851 a 2.0002,2.0002 0 0 0 -2.08853,-1.77208 z"
+         id="path7578-8-2"
+         inkscape:connector-curvature="0" /&gt;
+      &lt;path
+         style="fill:#1166ad;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         d="m 617.54256,322.91708 -6.54593,4.58663 -0.6957,-7.9697 7.24163,3.38307 z"
+         id="path8385"
+         inkscape:connector-curvature="0" /&gt;
+    &lt;/g&gt;
+    &lt;flowRoot
+       xml:space="preserve"
+       id="flowRoot3243"
+       style="font-size:8px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       transform="translate(264.88555,551.83968)"&gt;&lt;flowRegion
+         id="flowRegion3245"&gt;&lt;rect
+           id="rect3247"
+           width="219.28572"
+           height="286.42856"
+           x="419.28571"
+           y="53.187862" /&gt;&lt;/flowRegion&gt;&lt;flowPara
+         id="flowPara3249"&gt;&lt;/flowPara&gt;&lt;/flowRoot&gt;  &lt;/g&gt;
+&lt;/svg&gt;
+</y:Resource>
+    </y:Resources>
+  </data>
+</graphml>
diff --git a/IBSW/doc/images/core1553brm_as250/split_packetstreams_direct_buffer_drop.graphml b/IBSW/doc/images/core1553brm_as250/split_packetstreams_direct_buffer_drop.graphml
new file mode 100644
index 0000000..b74aef3
--- /dev/null
+++ b/IBSW/doc/images/core1553brm_as250/split_packetstreams_direct_buffer_drop.graphml
@@ -0,0 +1,1034 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yEd 3.14.1-->
+  <key for="graphml" id="d0" yfiles.type="resources"/>
+  <key for="port" id="d1" yfiles.type="portgraphics"/>
+  <key for="port" id="d2" yfiles.type="portgeometry"/>
+  <key for="port" id="d3" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d4"/>
+  <key attr.name="description" attr.type="string" for="node" id="d5"/>
+  <key for="node" id="d6" yfiles.type="nodegraphics"/>
+  <key attr.name="Description" attr.type="string" for="graph" id="d7"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
+  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <data key="d7"/>
+    <node id="n0">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="60.0" width="60.0" x="826.6959602414554" y="663.8593750000002"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#27AE27" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="126.28515625" x="-156.3385383664554" y="21.015625">MIL-STD-1553 IRQ<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="0.0" nodeRatioX="-0.5" nodeRatioY="0.0" offsetX="-30.053382116455396" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_SIGNAL"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n1">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="113.19906334005373" x="800.0964285714285" y="591.9218750000002"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="80.458984375" x="16.370039482526863" y="11.984375">Peek Header</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="54.59953167002686" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n2">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="794.2975042784651" y="19.234375"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="50.470703125" x="22.163104400490283" y="24.441406250000057">DD
+Circular
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n3">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="742.5963570668522" y="501.9218750000002"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n4">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="510.2976905521954" y="509.4218750000002"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="44.5703125" x="-58.039994959677415" y="8.03125">Return<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="0.5" nodeRatioX="-0.5" nodeRatioY="0.5" offsetX="-13.469682459677415" offsetY="-4.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n5">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="153.19906334005373" x="688.4968253968253" y="439.9843750000002"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="137.03125" x="8.083906670026863" y="11.984375">Inspect Packet Source</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="74.59953167002686" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n6">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="742.5963570668522" y="374.9843750000002"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n7">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="113.19906334005373" x="575.2977620567716" y="376.5156250000002"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="94.099609375" x="9.549726982526863" y="11.984375">Migrate packet</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="54.59953167002686" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n8">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="113.19906334005373" x="871.695888736879" y="376.5156250000002"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="94.099609375" x="9.549726982526863" y="11.984375">Migrate packet</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="54.59953167002686" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n9">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="550.3996314146018" y="232.4921875000001"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="50.470703125" x="22.16310440049034" y="24.441406250000057">GND
+Circular
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n10">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="908.7977580947093" y="232.4921875000001"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="50.470703125" x="22.163104400490283" y="24.441406250000057">OBC
+Circular
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n11">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="388.79970291917823" y="232.4921875000001"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="59.962890625" x="17.417010650490333" y="24.441406250000057">GND Size
+Circular
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n12">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="1037.4996620744523" y="232.4921875000001"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="58.50390625" x="18.146502837990283" y="24.441406250000057">OBC Size
+Circular
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n13">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="138.19906334005373" x="367.09862721214165" y="376.5156250000002"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="116.916015625" x="10.641523857526863" y="5.0">Register in Ground
+packet size buffer </y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="67.09953167002686" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n14">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="138.19906334005373" x="1015.7985863674157" y="376.5156250000002"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="115.3046875" x="11.447187920026863" y="5.0">Register in OBC
+packet size buffer </y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="67.09953167002686" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n15">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="121.19906334005373" x="704.4968253968253" y="160.5546875000001"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="103.580078125" x="8.809492607526863" y="5.0">Undefined state,
+drop DD buffer</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="58.59953167002686" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n16">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="121.19906334005373" x="464.6981588821685" y="160.5546875000001"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="74.25390625" x="23.472578545026863" y="5.0">Create 
+error report</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="58.59953167002686" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n17">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="70.8595330752687" width="216.392366795699" x="937.6052829117705" y="652.8593750000002"/>
+          <y:Fill hasColor="false" transparent="false"/>
+          <y:BorderStyle color="#999999" type="line" width="1.0"/>
+          <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Liberation Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="58.375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="198.431640625" x="8.980363085349381" y="6.24226653763435">Note: This function must
+be chained to the 1553 IRQ 
+so that it is executed 
+AFTER the 1553 driver ISR</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="106.19618339784938" y="33.42976653763435">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n18">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="81.8595330752687" width="278.392366795699" x="367.0986272121416" y="641.9998419247315"/>
+          <y:Fill hasColor="false" transparent="false"/>
+          <y:BorderStyle color="#999999" type="line" width="1.0"/>
+          <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Liberation Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="71.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="263.2421875" x="7.575089647849495" y="4.94539153763435">AD  ... Acquisition  Data
+DD  ... Distribution Data
+ATR ... Acquisition Transfer Request
+GND ... Ground
+OBC ... On-Board Computer</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="137.1961833978495" y="38.92976653763435">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <edge id="e0" source="n0" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-30.0" tx="0.0" ty="20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e1" source="n2" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="37.91876477039227" sy="28.425781250000057" tx="45.27962533602147" ty="-20.96875">
+            <y:Point x="879.6147250118477" y="129.0234375000001"/>
+            <y:Point x="1168.9977212120457" y="129.0234375000001"/>
+            <y:Point x="1168.9977212120457" y="554.4218750000002"/>
+            <y:Point x="901.9755855774769" y="554.4218750000002"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e2" source="n1" target="n3">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-22.639812668010748" sy="-20.96875" tx="22.50244140625" ty="0.0">
+            <y:Point x="834.0561475734446" y="524.4218750000002"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e3" source="n3" target="n4">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-22.5" sy="0.0" tx="15.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="82.9140625" x="-91.40405137045582" y="-8.984374999999773">Buffer empty<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.03235691986891812" segment="-1"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e4" source="n3" target="n5">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-22.5" tx="0.0" ty="20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="skewed_dash" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_DEFAULT_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e5" source="n5" target="n6">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.96875" tx="0.0" ty="22.5"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e6" source="n6" target="n7">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-22.5" sy="0.0" tx="56.59953167002686" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="48.40234375" x="-51.280858047476386" y="-8.98437499999983">Ground<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.056331115252694915" segment="-1"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e7" source="n6" target="n8">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="22.5" sy="0.0" tx="-56.59953167002686" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="30.056640625" x="15.706891705160842" y="-8.984374999999773">OBC<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.2431018694726752" segment="-1"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e8" source="n6" target="n15">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-22.5" tx="0.0" ty="20.958343505859375"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" anchorX="9.103856529624977" anchorY="-34.24735361486239" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" upX="-0.9999802378229391" upY="0.00628680869584734" visible="true" width="38.072265625" x="-9.103891419357819" y="-72.318866849008">Other<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="true" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="-0.006286850109850306" distance="30.0" distanceToCenter="true" position="center" ratio="0.23437313702842366" segment="-1"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e9" source="n2" target="n7">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-37.91876477039227" sy="30.363281250000057" tx="28.29976583501343" ty="-20.96875">
+            <y:Point x="803.7771954710631" y="129.0234375000001"/>
+            <y:Point x="660.1968969014017" y="129.0234375000001"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e10" source="n2" target="n8">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="18.959382385196136" sy="43.61328125000006" tx="-30.408633193554465" ty="-20.97604371076477">
+            <y:Point x="860.6553426266515" y="144.0234375000001"/>
+            <y:Point x="897.8867872133515" y="144.0234375000001"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e11" source="n7" target="n9">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-34.09920634920633" sy="-20.992187500000227" tx="0.0" ty="47.39453125000006"/>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e12" source="n8" target="n10">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="27.900793650793617" sy="-20.960937500000227" tx="0.0" ty="47.39453125000006"/>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e13" source="n7" target="n13">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-56.59953167002686" sy="0.0" tx="69.09953167002686" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e14" source="n8" target="n14">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="56.59953167002686" sy="0.0" tx="-69.09953167002686" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e15" source="n14" target="n12">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.96875" tx="0.0" ty="47.39453125000006"/>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e16" source="n13" target="n11">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.96875" tx="0.0" ty="47.39453125000006"/>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e17" source="n13" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="-45.27962533602147" ty="-20.96875">
+            <y:Point x="436.1981588821685" y="433.4531250000002"/>
+            <y:Point x="560.2976905521954" y="433.4531250000002"/>
+            <y:Point x="560.2976905521954" y="576.9218750000002"/>
+            <y:Point x="811.4163349054339" y="576.9218750000002"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e18" source="n14" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="22.63981266801079" ty="-20.96875">
+            <y:Point x="1084.8981180374426" y="539.4218750000002"/>
+            <y:Point x="879.3357729094662" y="539.4218750000002"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e19" source="n15" target="n16">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-60.59953167002686" sy="0.0" tx="60.59953167002686" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e20" source="n16" target="n4">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="0.0" ty="-15.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e21" source="n2" target="n15">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-18.959382385196136" sy="44.55078125000006" tx="0.0" ty="-20.96875">
+            <y:Point x="822.7365778562593" y="144.0234375000001"/>
+            <y:Point x="765.0963570668522" y="144.0234375000001"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d0">
+    <y:Resources>
+      <y:Resource id="1">&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
+&lt;!-- Created with Inkscape (http://www.inkscape.org/) --&gt;
+
+&lt;svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="181.51503"
+   height="181.50002"
+   id="svg6241"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="circular_buffer.svg"&gt;
+  &lt;defs
+     id="defs6243" /&gt;
+  &lt;sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4"
+     inkscape:cx="-191.78859"
+     inkscape:cy="95.848443"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1920"
+     inkscape:window-height="1014"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" /&gt;
+  &lt;metadata
+     id="metadata6246"&gt;
+    &lt;rdf:RDF&gt;
+      &lt;cc:Work
+         rdf:about=""&gt;
+        &lt;dc:format&gt;image/svg+xml&lt;/dc:format&gt;
+        &lt;dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /&gt;
+        &lt;dc:title&gt;&lt;/dc:title&gt;
+      &lt;/cc:Work&gt;
+    &lt;/rdf:RDF&gt;
+  &lt;/metadata&gt;
+  &lt;g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-745.67177,-616.55345)"&gt;
+    &lt;text
+       xml:space="preserve"
+       style="font-size:21.79795456px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Verdana;-inkscape-font-specification:Verdana"
+       x="383.44809"
+       y="710.9231"
+       id="text6873"
+       sodipodi:linespacing="125%"&gt;&lt;tspan
+         sodipodi:role="line"
+         id="tspan6875"
+         x="383.44809"
+         y="710.9231"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans Bold" /&gt;&lt;/text&gt;
+    &lt;path
+       transform="matrix(-0.94718199,-0.01879329,0.01879329,-0.94718199,929.26064,803.90098)"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       sodipodi:ry="80"
+       sodipodi:rx="80"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path6939-8-1"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       d="m 190,100 a 90,90 0 1 1 -180,0 90,90 0 1 1 180,0 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path4706-7-4"
+       style="fill:#f8f8f8;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:type="arc"
+       style="fill:#89acf3;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5917-9-6"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="90"
+       sodipodi:ry="90"
+       d="M 10,99.999996 A 90,90 0 1 1 145,177.94229 L 100,100 z"
+       sodipodi:start="3.1415927"
+       sodipodi:end="7.3303829" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:end="7.3303829"
+       sodipodi:start="5.2359878"
+       d="m 145,22.057716 a 90,90 0 0 1 0,155.884574 L 100,100 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path3653-6-2"
+       style="fill:#fbecd5;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,78"
+       id="path5943-6-2" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,-78"
+       id="path5953-2-0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 746.42177,707.30345 180,0"
+       id="path5921-6-0"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,797.30345 0,-180"
+       id="path5923-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,63"
+       id="path5925-7-9"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,-63"
+       id="path5927-9-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,-63"
+       id="path5929-2-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,63"
+       id="path5931-8-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,23"
+       id="path5933-1-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,45"
+       id="path5935-6-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,78"
+       id="path5937-5-4"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,87"
+       id="path5939-0-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,87"
+       id="path5941-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,45"
+       id="path5945-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,23"
+       id="path5947-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,-23"
+       id="path5949-9-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,-45"
+       id="path5951-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,-87 0,0"
+       id="path5955-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,-87"
+       id="path5957-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,-78"
+       id="path5959-8-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,-45"
+       id="path5961-4-1"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,-23"
+       id="path5963-6-8"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       sodipodi:type="arc"
+       style="fill:#c7e5f9;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5919-8-8"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="80"
+       sodipodi:ry="80"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       transform="matrix(0.90092879,0,0,0.90092879,746.3289,617.21058)" /&gt;
+    &lt;g
+       transform="translate(230.43873,464.77132)"
+       id="g8379"
+       style="fill:#1166ad;fill-opacity:1;stroke:none;display:inline"&gt;
+      &lt;path
+         style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#1166ad;fill-opacity:1;stroke:none;stroke-width:3.95015383;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+         d="m 525.52266,251.41302 a 2.0002,2.0002 0 0 0 -1.89866,2.31003 c 5.92694,43.90653 45.35328,75.43234 89.49019,71.57949 a 2.001176,2.001176 0 1 0 -0.34809,-3.98718 C 570.71635,324.986 533.25785,295.01535 527.61119,253.1851 a 2.0002,2.0002 0 0 0 -2.08853,-1.77208 z"
+         id="path7578-8-2"
+         inkscape:connector-curvature="0" /&gt;
+      &lt;path
+         style="fill:#1166ad;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         d="m 617.54256,322.91708 -6.54593,4.58663 -0.6957,-7.9697 7.24163,3.38307 z"
+         id="path8385"
+         inkscape:connector-curvature="0" /&gt;
+    &lt;/g&gt;
+    &lt;flowRoot
+       xml:space="preserve"
+       id="flowRoot3243"
+       style="font-size:8px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       transform="translate(264.88555,551.83968)"&gt;&lt;flowRegion
+         id="flowRegion3245"&gt;&lt;rect
+           id="rect3247"
+           width="219.28572"
+           height="286.42856"
+           x="419.28571"
+           y="53.187862" /&gt;&lt;/flowRegion&gt;&lt;flowPara
+         id="flowPara3249"&gt;&lt;/flowPara&gt;&lt;/flowRoot&gt;  &lt;/g&gt;
+&lt;/svg&gt;
+</y:Resource>
+    </y:Resources>
+  </data>
+</graphml>
diff --git a/IBSW/doc/images/core1553brm_as250/split_packetstreams_direct_buffer_drop.png b/IBSW/doc/images/core1553brm_as250/split_packetstreams_direct_buffer_drop.png
new file mode 100644
index 0000000000000000000000000000000000000000..93f29e054fb64150b9b20335962dfe80474aff6b
GIT binary patch
literal 73326
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

literal 0
HcmV?d00001

diff --git a/IBSW/doc/images/cpus_buffer/cpus_get_free.graphml b/IBSW/doc/images/cpus_buffer/cpus_get_free.graphml
new file mode 100644
index 0000000..6a1d3b6
--- /dev/null
+++ b/IBSW/doc/images/cpus_buffer/cpus_get_free.graphml
@@ -0,0 +1,559 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yEd 3.16-->
+  <key attr.name="Description" attr.type="string" for="graph" id="d0"/>
+  <key for="port" id="d1" yfiles.type="portgraphics"/>
+  <key for="port" id="d2" yfiles.type="portgeometry"/>
+  <key for="port" id="d3" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d4"/>
+  <key attr.name="description" attr.type="string" for="node" id="d5"/>
+  <key for="node" id="d6" yfiles.type="nodegraphics"/>
+  <key for="graphml" id="d7" yfiles.type="resources"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
+  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <data key="d0"/>
+    <node id="n0">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="40.0" width="40.0" x="-118.76230158730158" y="330.4375"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#27AE27" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="18.0" y="18.0"/>
+          <y:StyleProperties>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n1">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="-113.76230158730158" y="14.0"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="136.45703125" x="-53.228515625" y="-31.184375000000045">Return (1024 - usage)<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="-13.215625000000045" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n2">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="121.158203125" x="3.421161954365047" y="112.03125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="82.708984375" x="19.224609375" y="11.984375">usage - 1024</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="58.5791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n3">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="121.158203125" x="-159.34140314980158" y="222.0"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="105.21484375" x="7.9716796875" y="11.984375">Get buffer usage</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="58.5791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n4">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="-121.26230158730158" y="110.5"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n5">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="29.78245315338438" y="195.57421874999994"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="44.224609375" x="25.286151275490333" y="31.425781250000057">Packet
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n6">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="41.50026351686505" y="6.5"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n7">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="211.76282862103167" y="14.0"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="56.01953125" x="-13.009765625" y="-31.184375000000045">Return 0<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="-13.215625000000045" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <edge id="e0" source="n0" target="n3">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.009765625" tx="0.0" ty="-20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e1" source="n5" target="n3">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-47.39296339522297" sy="0.0" tx="60.59646205242229" ty="0.0"/>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e2" source="n3" target="n4">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.958343505859375" tx="0.0" ty="22.50244140625"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e3" source="n4" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-22.50244140625" tx="0.0" ty="14.990234375"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e4" source="n2" target="n6">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e5" source="n6" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e6" source="n4" target="n2">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="22.50244140625" sy="0.0" tx="-60.5964620524223" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="48.408203125" x="4.997555590432796" y="-8.984375">≥ 1024<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="2.0" distanceToCenter="false" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e7" source="n6" target="n7">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="22.502441406250014" sy="0.0" tx="-14.990234375" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="48.408203125" x="38.42473607138976" y="-8.984375">≥ 1024<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="2.0" distanceToCenter="false" position="center" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d7">
+    <y:Resources>
+      <y:Resource id="1">&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
+&lt;!-- Created with Inkscape (http://www.inkscape.org/) --&gt;
+
+&lt;svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="181.51503"
+   height="181.50002"
+   id="svg6241"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="circular_buffer.svg"&gt;
+  &lt;defs
+     id="defs6243" /&gt;
+  &lt;sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4"
+     inkscape:cx="-191.78859"
+     inkscape:cy="95.848443"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1920"
+     inkscape:window-height="1014"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" /&gt;
+  &lt;metadata
+     id="metadata6246"&gt;
+    &lt;rdf:RDF&gt;
+      &lt;cc:Work
+         rdf:about=""&gt;
+        &lt;dc:format&gt;image/svg+xml&lt;/dc:format&gt;
+        &lt;dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /&gt;
+        &lt;dc:title&gt;&lt;/dc:title&gt;
+      &lt;/cc:Work&gt;
+    &lt;/rdf:RDF&gt;
+  &lt;/metadata&gt;
+  &lt;g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-745.67177,-616.55345)"&gt;
+    &lt;text
+       xml:space="preserve"
+       style="font-size:21.79795456px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Verdana;-inkscape-font-specification:Verdana"
+       x="383.44809"
+       y="710.9231"
+       id="text6873"
+       sodipodi:linespacing="125%"&gt;&lt;tspan
+         sodipodi:role="line"
+         id="tspan6875"
+         x="383.44809"
+         y="710.9231"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans Bold" /&gt;&lt;/text&gt;
+    &lt;path
+       transform="matrix(-0.94718199,-0.01879329,0.01879329,-0.94718199,929.26064,803.90098)"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       sodipodi:ry="80"
+       sodipodi:rx="80"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path6939-8-1"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       d="m 190,100 a 90,90 0 1 1 -180,0 90,90 0 1 1 180,0 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path4706-7-4"
+       style="fill:#f8f8f8;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:type="arc"
+       style="fill:#89acf3;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5917-9-6"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="90"
+       sodipodi:ry="90"
+       d="M 10,99.999996 A 90,90 0 1 1 145,177.94229 L 100,100 z"
+       sodipodi:start="3.1415927"
+       sodipodi:end="7.3303829" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:end="7.3303829"
+       sodipodi:start="5.2359878"
+       d="m 145,22.057716 a 90,90 0 0 1 0,155.884574 L 100,100 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path3653-6-2"
+       style="fill:#fbecd5;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,78"
+       id="path5943-6-2" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,-78"
+       id="path5953-2-0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 746.42177,707.30345 180,0"
+       id="path5921-6-0"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,797.30345 0,-180"
+       id="path5923-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,63"
+       id="path5925-7-9"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,-63"
+       id="path5927-9-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,-63"
+       id="path5929-2-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,63"
+       id="path5931-8-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,23"
+       id="path5933-1-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,45"
+       id="path5935-6-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,78"
+       id="path5937-5-4"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,87"
+       id="path5939-0-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,87"
+       id="path5941-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,45"
+       id="path5945-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,23"
+       id="path5947-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,-23"
+       id="path5949-9-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,-45"
+       id="path5951-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,-87 0,0"
+       id="path5955-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,-87"
+       id="path5957-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,-78"
+       id="path5959-8-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,-45"
+       id="path5961-4-1"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,-23"
+       id="path5963-6-8"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       sodipodi:type="arc"
+       style="fill:#c7e5f9;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5919-8-8"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="80"
+       sodipodi:ry="80"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       transform="matrix(0.90092879,0,0,0.90092879,746.3289,617.21058)" /&gt;
+    &lt;g
+       transform="translate(230.43873,464.77132)"
+       id="g8379"
+       style="fill:#1166ad;fill-opacity:1;stroke:none;display:inline"&gt;
+      &lt;path
+         style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#1166ad;fill-opacity:1;stroke:none;stroke-width:3.95015383;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+         d="m 525.52266,251.41302 a 2.0002,2.0002 0 0 0 -1.89866,2.31003 c 5.92694,43.90653 45.35328,75.43234 89.49019,71.57949 a 2.001176,2.001176 0 1 0 -0.34809,-3.98718 C 570.71635,324.986 533.25785,295.01535 527.61119,253.1851 a 2.0002,2.0002 0 0 0 -2.08853,-1.77208 z"
+         id="path7578-8-2"
+         inkscape:connector-curvature="0" /&gt;
+      &lt;path
+         style="fill:#1166ad;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         d="m 617.54256,322.91708 -6.54593,4.58663 -0.6957,-7.9697 7.24163,3.38307 z"
+         id="path8385"
+         inkscape:connector-curvature="0" /&gt;
+    &lt;/g&gt;
+    &lt;flowRoot
+       xml:space="preserve"
+       id="flowRoot3243"
+       style="font-size:8px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       transform="translate(264.88555,551.83968)"&gt;&lt;flowRegion
+         id="flowRegion3245"&gt;&lt;rect
+           id="rect3247"
+           width="219.28572"
+           height="286.42856"
+           x="419.28571"
+           y="53.187862" /&gt;&lt;/flowRegion&gt;&lt;flowPara
+         id="flowPara3249"&gt;&lt;/flowPara&gt;&lt;/flowRoot&gt;  &lt;/g&gt;
+&lt;/svg&gt;
+</y:Resource>
+    </y:Resources>
+  </data>
+</graphml>
diff --git a/IBSW/doc/images/cpus_buffer/cpus_get_free.png b/IBSW/doc/images/cpus_buffer/cpus_get_free.png
new file mode 100644
index 0000000000000000000000000000000000000000..bbb82ed0c362320f0be9358e1abf474247cc754c
GIT binary patch
literal 26832
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

literal 0
HcmV?d00001

diff --git a/IBSW/doc/images/cpus_buffer/sliding_window_buffer.graphml b/IBSW/doc/images/cpus_buffer/sliding_window_buffer.graphml
new file mode 100644
index 0000000..433a825
--- /dev/null
+++ b/IBSW/doc/images/cpus_buffer/sliding_window_buffer.graphml
@@ -0,0 +1,880 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yEd 3.14.3-->
+  <key for="graphml" id="d0" yfiles.type="resources"/>
+  <key for="port" id="d1" yfiles.type="portgraphics"/>
+  <key for="port" id="d2" yfiles.type="portgeometry"/>
+  <key for="port" id="d3" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d4"/>
+  <key attr.name="description" attr.type="string" for="node" id="d5"/>
+  <key for="node" id="d6" yfiles.type="nodegraphics"/>
+  <key attr.name="Description" attr.type="string" for="graph" id="d7"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
+  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <data key="d7"/>
+    <node id="n0">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="40.0" width="40.0" x="241.23769841269842" y="0.0"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#27AE27" type="line" width="1.0"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n1">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="144.158203125" x="189.15859685019842" y="216.9375"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="105.21484375" x="19.4716796875" y="11.984375">Get buffer usage</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="70.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n2">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="144.158203125" x="189.15859685019842" y="381.84375"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="135.689453125" x="4.234375" y="11.984375">(2048 -  buffer usage)</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="70.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n3">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="238.73769841269842" y="446.72047057526834"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n4">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="144.158203125" x="189.15859685019842" y="585.3628906249999"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="100.26953125" x="21.9443359375" y="5.0">Add packet 
+to packet buffer</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="70.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n5">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="238.73769841269842" y="288.875"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n6">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="375.8757936507937" y="454.22047057526834"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="78.109375" x="-24.054687499999943" y="43.552734375">Return Error<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="1.887379141862766E-15" nodeRatioY="0.5" offsetX="0.0" offsetY="13.552734375" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n7">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="375.8757936507937" y="591.3316406249999"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="96.689453125" x="-33.3447265625" y="42.533862500000055">Return Success<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="12.533862500000055" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n8">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="68.36328125000006" width="144.158203125" x="23.669112723214297" y="572.1499999999999"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="106.919921875" x="18.619140625" y="11.228515625">Add empty 
+segment to next 
+frame boundary</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="70.0791015625" y="32.181640625">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-3.885780586188048E-16" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n9">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="144.158203125" x="15.000263516865076" y="381.84375"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="131.875" x="6.1416015625" y="11.984375">(1024 - buffer usage)</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="70.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n10">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="64.57936507936508" y="482.07207031249993"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n11">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="144.158203125" x="189.15859685019842" y="70.0"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="96.888671875" x="23.634765625" y="11.984375">Get packet size</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="70.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n12">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="238.73769841269842" y="141.9375"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n13">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="32.68090911637474" y="99.51328124999998"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="44.224609375" x="25.286151275490333" y="31.425781250000057">Packet
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <edge id="e0" source="n0" target="n11">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.0" tx="0.0" ty="-20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e1" source="n13" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="42.628443124857554" sy="0.0" tx="-72.0791015625" ty="0.0">
+            <y:Point x="189.15859685019842" y="146.90781250000003"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e2" source="n1" target="n5">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="0.0" ty="-22.5"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e3" source="n5" target="n6">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="22.5" sy="0.0" tx="0.0" ty="-15.0">
+            <y:Point x="390.8757936507937" y="311.375"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="48.408203125" x="43.966993834480434" y="-8.984375">≥ 2048<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="2.0" distanceToCenter="false" position="center" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e4" source="n5" target="n2">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="22.5" tx="0.0" ty="-20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="48.408203125" x="-24.204104565817204" y="5.0">≥ 1024<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="2.0" distanceToCenter="false" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e5" source="n2" target="n3">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="0.0" ty="-22.5"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e6" source="n3" target="n6">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="22.5" sy="0.0" tx="-15.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="58.474609375" x="4.999996996682796" y="-8.984363409106606">&lt; packet<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="1.9999999999997726" distanceToCenter="false" position="center" ratio="0.0" segment="-1"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e7" source="n3" target="n4">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e8" source="n4" target="n13">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.958343505859375" tx="-47.39296339522298" ty="0.0">
+            <y:Point x="261.2376984126985" y="717.9078125"/>
+            <y:Point x="-4.9997364831349245" y="717.9078125"/>
+            <y:Point x="-4.9997364831349245" y="146.90781250000003"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e9" source="n4" target="n7">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="72.0997576713562" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e10" source="n8" target="n13">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-8.668849206349222" sy="34.186718749999955" tx="-46.4160080003421" ty="11.081423338993375">
+            <y:Point x="87.07936507936508" y="711.445945866667"/>
+            <y:Point x="2.524263516865048" y="711.445945866667"/>
+            <y:Point x="2.524263516865048" y="157.9892358389934"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e11" source="n8" target="n4">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="72.09975767135622" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e12" source="n5" target="n9">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-22.5" sy="0.0" tx="0.0" ty="-20.96875">
+            <y:Point x="87.07936507936508" y="311.375"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="48.408203125" x="-114.5982889326792" y="-8.984375">&lt; 1024<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="1.9999999999998863" distanceToCenter="false" position="center" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e13" source="n9" target="n10">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="0.0" ty="-22.5"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e14" source="n10" target="n8">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="22.50244140625" tx="-8.668849206349222" ty="-5.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="58.474609375" x="-29.237308199443518" y="4.997546386718682">&lt; packet<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="20.697265624999737" distanceToCenter="false" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e15" source="n11" target="n12">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="0.0" ty="-22.5"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e16" source="n12" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="22.5" tx="0.0" ty="-20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="skewed_dash" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e17" source="n12" target="n6">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="22.5" sy="0.0" tx="15.0" ty="0.0">
+            <y:Point x="427.01979365079376" y="164.4375"/>
+            <y:Point x="427.01979365079376" y="469.22047057526834"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="48.408203125" x="16.674159277459523" y="-8.984375">&gt; 1024<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="2.0" distanceToCenter="false" position="center" ratio="0.10233491933575473" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e18" source="n10" target="n4">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="22.50244140625" sy="0.0" tx="-13.0" ty="-20.93215059166596">
+            <y:Point x="248.23769841269842" y="504.57207031249993"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d0">
+    <y:Resources>
+      <y:Resource id="1">&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
+&lt;!-- Created with Inkscape (http://www.inkscape.org/) --&gt;
+
+&lt;svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="181.51503"
+   height="181.50002"
+   id="svg6241"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="circular_buffer.svg"&gt;
+  &lt;defs
+     id="defs6243" /&gt;
+  &lt;sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4"
+     inkscape:cx="-191.78859"
+     inkscape:cy="95.848443"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1920"
+     inkscape:window-height="1014"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" /&gt;
+  &lt;metadata
+     id="metadata6246"&gt;
+    &lt;rdf:RDF&gt;
+      &lt;cc:Work
+         rdf:about=""&gt;
+        &lt;dc:format&gt;image/svg+xml&lt;/dc:format&gt;
+        &lt;dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /&gt;
+        &lt;dc:title&gt;&lt;/dc:title&gt;
+      &lt;/cc:Work&gt;
+    &lt;/rdf:RDF&gt;
+  &lt;/metadata&gt;
+  &lt;g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-745.67177,-616.55345)"&gt;
+    &lt;text
+       xml:space="preserve"
+       style="font-size:21.79795456px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Verdana;-inkscape-font-specification:Verdana"
+       x="383.44809"
+       y="710.9231"
+       id="text6873"
+       sodipodi:linespacing="125%"&gt;&lt;tspan
+         sodipodi:role="line"
+         id="tspan6875"
+         x="383.44809"
+         y="710.9231"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans Bold" /&gt;&lt;/text&gt;
+    &lt;path
+       transform="matrix(-0.94718199,-0.01879329,0.01879329,-0.94718199,929.26064,803.90098)"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       sodipodi:ry="80"
+       sodipodi:rx="80"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path6939-8-1"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       d="m 190,100 a 90,90 0 1 1 -180,0 90,90 0 1 1 180,0 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path4706-7-4"
+       style="fill:#f8f8f8;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:type="arc"
+       style="fill:#89acf3;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5917-9-6"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="90"
+       sodipodi:ry="90"
+       d="M 10,99.999996 A 90,90 0 1 1 145,177.94229 L 100,100 z"
+       sodipodi:start="3.1415927"
+       sodipodi:end="7.3303829" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:end="7.3303829"
+       sodipodi:start="5.2359878"
+       d="m 145,22.057716 a 90,90 0 0 1 0,155.884574 L 100,100 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path3653-6-2"
+       style="fill:#fbecd5;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,78"
+       id="path5943-6-2" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,-78"
+       id="path5953-2-0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 746.42177,707.30345 180,0"
+       id="path5921-6-0"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,797.30345 0,-180"
+       id="path5923-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,63"
+       id="path5925-7-9"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,-63"
+       id="path5927-9-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,-63"
+       id="path5929-2-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,63"
+       id="path5931-8-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,23"
+       id="path5933-1-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,45"
+       id="path5935-6-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,78"
+       id="path5937-5-4"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,87"
+       id="path5939-0-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,87"
+       id="path5941-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,45"
+       id="path5945-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,23"
+       id="path5947-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,-23"
+       id="path5949-9-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,-45"
+       id="path5951-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,-87 0,0"
+       id="path5955-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,-87"
+       id="path5957-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,-78"
+       id="path5959-8-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,-45"
+       id="path5961-4-1"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,-23"
+       id="path5963-6-8"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       sodipodi:type="arc"
+       style="fill:#c7e5f9;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5919-8-8"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="80"
+       sodipodi:ry="80"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       transform="matrix(0.90092879,0,0,0.90092879,746.3289,617.21058)" /&gt;
+    &lt;g
+       transform="translate(230.43873,464.77132)"
+       id="g8379"
+       style="fill:#1166ad;fill-opacity:1;stroke:none;display:inline"&gt;
+      &lt;path
+         style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#1166ad;fill-opacity:1;stroke:none;stroke-width:3.95015383;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+         d="m 525.52266,251.41302 a 2.0002,2.0002 0 0 0 -1.89866,2.31003 c 5.92694,43.90653 45.35328,75.43234 89.49019,71.57949 a 2.001176,2.001176 0 1 0 -0.34809,-3.98718 C 570.71635,324.986 533.25785,295.01535 527.61119,253.1851 a 2.0002,2.0002 0 0 0 -2.08853,-1.77208 z"
+         id="path7578-8-2"
+         inkscape:connector-curvature="0" /&gt;
+      &lt;path
+         style="fill:#1166ad;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         d="m 617.54256,322.91708 -6.54593,4.58663 -0.6957,-7.9697 7.24163,3.38307 z"
+         id="path8385"
+         inkscape:connector-curvature="0" /&gt;
+    &lt;/g&gt;
+    &lt;flowRoot
+       xml:space="preserve"
+       id="flowRoot3243"
+       style="font-size:8px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       transform="translate(264.88555,551.83968)"&gt;&lt;flowRegion
+         id="flowRegion3245"&gt;&lt;rect
+           id="rect3247"
+           width="219.28572"
+           height="286.42856"
+           x="419.28571"
+           y="53.187862" /&gt;&lt;/flowRegion&gt;&lt;flowPara
+         id="flowPara3249"&gt;&lt;/flowPara&gt;&lt;/flowRoot&gt;  &lt;/g&gt;
+&lt;/svg&gt;
+</y:Resource>
+    </y:Resources>
+  </data>
+</graphml>
diff --git a/IBSW/doc/images/cpus_buffer/sliding_window_buffer.png b/IBSW/doc/images/cpus_buffer/sliding_window_buffer.png
new file mode 100644
index 0000000000000000000000000000000000000000..1347b5dba653fda11fd063165ec4559c1fb6ad49
GIT binary patch
literal 38421
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
E50=WH3jhEB

literal 0
HcmV?d00001

diff --git a/IBSW/doc/images/ibsw_interface/GetLinkCapacity.graphml b/IBSW/doc/images/ibsw_interface/GetLinkCapacity.graphml
new file mode 100644
index 0000000..03afc67
--- /dev/null
+++ b/IBSW/doc/images/ibsw_interface/GetLinkCapacity.graphml
@@ -0,0 +1,592 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yEd 3.14.2-->
+  <key for="graphml" id="d0" yfiles.type="resources"/>
+  <key for="port" id="d1" yfiles.type="portgraphics"/>
+  <key for="port" id="d2" yfiles.type="portgeometry"/>
+  <key for="port" id="d3" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d4"/>
+  <key attr.name="description" attr.type="string" for="node" id="d5"/>
+  <key for="node" id="d6" yfiles.type="nodegraphics"/>
+  <key attr.name="Description" attr.type="string" for="graph" id="d7"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
+  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <data key="d7"/>
+    <node id="n0">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="40.0" width="40.0" x="255.0" y="405.0"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#27AE27" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="187.1640625" x="72.41796875" y="11.015625">CrIbMilBusGetLinkCapacity<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.0" nodeRatioX="0.5" nodeRatioY="0.0" offsetX="32.41796875" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n1">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="144.158203125" x="202.9208984375" y="329.03125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="105.21484375" x="19.4716796875" y="11.984375">Get buffer usage</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="70.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n2">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="439.60154403700966" y="302.60546874999994"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="50.470703125" x="22.16310440049034" y="24.441406250000057">AD
+Circular
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n3">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="252.5" y="227.39453125000006"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n4">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="569.0" y="140.39453125000006"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="56.01953125" x="-13.009765625" y="-27.378906250000057">Return 0<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="-9.410156250000057" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n5">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="144.158203125" x="377.9208984375" y="230.66796874999994"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="75.080078125" x="34.5390625" y="11.984375">usage-1024</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="70.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n6">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="36.8595330752687" width="211.2752849603495" x="323.1231710026408" y="445.0"/>
+          <y:Fill hasColor="false" transparent="false"/>
+          <y:BorderStyle color="#999999" type="line" width="1.0"/>
+          <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Liberation Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.59375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="169.626953125" x="20.824165917674748" y="9.63289153763435">AD ... Acquisition Data</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="103.63764248017475" y="16.42976653763435">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n7">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="260.0" y="140.39453125000006"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="136.45703125" x="-53.228515625" y="-31.378906250000057">Return (1024 - usage)<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="-13.410156250000057" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n8">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="427.5" y="132.89453125000006"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <edge id="e0" source="n0" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.0" tx="0.0" ty="20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e1" source="n3" target="n5">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="22.5" sy="-0.0" tx="-72.0791015625" ty="-0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="1.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="48.408203125" x="5.0" y="-8.351715807185087">≥ 1024<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="20.556479708812905" distanceToCenter="false" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_DEFAULT_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e2" source="n2" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e3" source="n1" target="n3">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e4" source="n3" target="n7">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e5" source="n5" target="n8">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e6" source="n8" target="n4">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="48.408203125" x="24.07080078125" y="-8.984374999999943">≥ 1024<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e7" source="n8" target="n7">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d0">
+    <y:Resources>
+      <y:Resource id="1">&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
+&lt;!-- Created with Inkscape (http://www.inkscape.org/) --&gt;
+
+&lt;svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="181.51503"
+   height="181.50002"
+   id="svg6241"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="circular_buffer.svg"&gt;
+  &lt;defs
+     id="defs6243" /&gt;
+  &lt;sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4"
+     inkscape:cx="-191.78859"
+     inkscape:cy="95.848443"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1920"
+     inkscape:window-height="1014"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" /&gt;
+  &lt;metadata
+     id="metadata6246"&gt;
+    &lt;rdf:RDF&gt;
+      &lt;cc:Work
+         rdf:about=""&gt;
+        &lt;dc:format&gt;image/svg+xml&lt;/dc:format&gt;
+        &lt;dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /&gt;
+        &lt;dc:title&gt;&lt;/dc:title&gt;
+      &lt;/cc:Work&gt;
+    &lt;/rdf:RDF&gt;
+  &lt;/metadata&gt;
+  &lt;g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-745.67177,-616.55345)"&gt;
+    &lt;text
+       xml:space="preserve"
+       style="font-size:21.79795456px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Verdana;-inkscape-font-specification:Verdana"
+       x="383.44809"
+       y="710.9231"
+       id="text6873"
+       sodipodi:linespacing="125%"&gt;&lt;tspan
+         sodipodi:role="line"
+         id="tspan6875"
+         x="383.44809"
+         y="710.9231"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans Bold" /&gt;&lt;/text&gt;
+    &lt;path
+       transform="matrix(-0.94718199,-0.01879329,0.01879329,-0.94718199,929.26064,803.90098)"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       sodipodi:ry="80"
+       sodipodi:rx="80"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path6939-8-1"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       d="m 190,100 a 90,90 0 1 1 -180,0 90,90 0 1 1 180,0 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path4706-7-4"
+       style="fill:#f8f8f8;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:type="arc"
+       style="fill:#89acf3;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5917-9-6"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="90"
+       sodipodi:ry="90"
+       d="M 10,99.999996 A 90,90 0 1 1 145,177.94229 L 100,100 z"
+       sodipodi:start="3.1415927"
+       sodipodi:end="7.3303829" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:end="7.3303829"
+       sodipodi:start="5.2359878"
+       d="m 145,22.057716 a 90,90 0 0 1 0,155.884574 L 100,100 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path3653-6-2"
+       style="fill:#fbecd5;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,78"
+       id="path5943-6-2" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,-78"
+       id="path5953-2-0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 746.42177,707.30345 180,0"
+       id="path5921-6-0"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,797.30345 0,-180"
+       id="path5923-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,63"
+       id="path5925-7-9"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,-63"
+       id="path5927-9-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,-63"
+       id="path5929-2-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,63"
+       id="path5931-8-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,23"
+       id="path5933-1-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,45"
+       id="path5935-6-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,78"
+       id="path5937-5-4"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,87"
+       id="path5939-0-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,87"
+       id="path5941-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,45"
+       id="path5945-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,23"
+       id="path5947-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,-23"
+       id="path5949-9-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,-45"
+       id="path5951-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,-87 0,0"
+       id="path5955-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,-87"
+       id="path5957-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,-78"
+       id="path5959-8-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,-45"
+       id="path5961-4-1"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,-23"
+       id="path5963-6-8"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       sodipodi:type="arc"
+       style="fill:#c7e5f9;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5919-8-8"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="80"
+       sodipodi:ry="80"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       transform="matrix(0.90092879,0,0,0.90092879,746.3289,617.21058)" /&gt;
+    &lt;g
+       transform="translate(230.43873,464.77132)"
+       id="g8379"
+       style="fill:#1166ad;fill-opacity:1;stroke:none;display:inline"&gt;
+      &lt;path
+         style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#1166ad;fill-opacity:1;stroke:none;stroke-width:3.95015383;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+         d="m 525.52266,251.41302 a 2.0002,2.0002 0 0 0 -1.89866,2.31003 c 5.92694,43.90653 45.35328,75.43234 89.49019,71.57949 a 2.001176,2.001176 0 1 0 -0.34809,-3.98718 C 570.71635,324.986 533.25785,295.01535 527.61119,253.1851 a 2.0002,2.0002 0 0 0 -2.08853,-1.77208 z"
+         id="path7578-8-2"
+         inkscape:connector-curvature="0" /&gt;
+      &lt;path
+         style="fill:#1166ad;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         d="m 617.54256,322.91708 -6.54593,4.58663 -0.6957,-7.9697 7.24163,3.38307 z"
+         id="path8385"
+         inkscape:connector-curvature="0" /&gt;
+    &lt;/g&gt;
+    &lt;flowRoot
+       xml:space="preserve"
+       id="flowRoot3243"
+       style="font-size:8px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       transform="translate(264.88555,551.83968)"&gt;&lt;flowRegion
+         id="flowRegion3245"&gt;&lt;rect
+           id="rect3247"
+           width="219.28572"
+           height="286.42856"
+           x="419.28571"
+           y="53.187862" /&gt;&lt;/flowRegion&gt;&lt;flowPara
+         id="flowPara3249"&gt;&lt;/flowPara&gt;&lt;/flowRoot&gt;  &lt;/g&gt;
+&lt;/svg&gt;
+</y:Resource>
+    </y:Resources>
+  </data>
+</graphml>
diff --git a/IBSW/doc/images/ibsw_interface/GetLinkCapacity.png b/IBSW/doc/images/ibsw_interface/GetLinkCapacity.png
new file mode 100644
index 0000000000000000000000000000000000000000..11fc08aa0de4d463b044f7b4a9fa7837b253dd7f
GIT binary patch
literal 51228
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

literal 0
HcmV?d00001

diff --git a/IBSW/doc/images/ibsw_logical_model.graphml b/IBSW/doc/images/ibsw_logical_model.graphml
new file mode 100644
index 0000000..43b153f
--- /dev/null
+++ b/IBSW/doc/images/ibsw_logical_model.graphml
@@ -0,0 +1,951 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yEd 3.16.1-->
+  <key attr.name="Description" attr.type="string" for="graph" id="d0"/>
+  <key for="port" id="d1" yfiles.type="portgraphics"/>
+  <key for="port" id="d2" yfiles.type="portgeometry"/>
+  <key for="port" id="d3" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d4"/>
+  <key attr.name="description" attr.type="string" for="node" id="d5"/>
+  <key for="node" id="d6" yfiles.type="nodegraphics"/>
+  <key for="graphml" id="d7" yfiles.type="resources"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
+  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <data key="d0"/>
+    <node id="n0">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="1406.0085199004977" y="319.95454545454555"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#DCBA00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="103.703125" x="-36.8515625" y="-21.96875">IFSW Entry Point<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="-4.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_INTERMEDIATE_CATCHING"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n1">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="94.0909090909091" width="142.8917910447761" x="1062.237165363658" y="287.909090909091"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="59.875" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="72.853515625" x="35.019137709888014" y="17.107954545454547">Syncpulse
+and
+Notification
+Timers</y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n2">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="94.0909090909091" width="142.8917910447761" x="603.5609748874674" y="287.909090909091"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="34.5390625" x="54.17636427238807" y="31.07670454545456">1553
+Link</y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n3">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="106.0909090909091" width="124.89179104477611" x="650.815873015873" y="885.9545454545455"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#DCBA00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="35.23046875" x="44.830661147388014" y="44.061079545454504">IASW</y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n4">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="185.0909090909091" width="181.0" x="1159.8751243781096" y="445.0000000000001"/>
+          <y:Fill color="#FFFFFFE6" color2="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#27AE27" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="49.2109375" x="65.89453125" y="76.5767045454545">IBSW
+(CPU 0)</y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n5">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="94.0909090909091" width="142.8917910447761" x="1082.5998637763564" y="801.6558922558925"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#DCBA00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="71.1484375" x="35.871676772388014" y="31.076704545454504">Event
+Translation</y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n6">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="94.0909090909091" width="142.8917910447761" x="458.92380952380955" y="490.5000000000001"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#DCBA00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="57.724609375" x="42.58359083488807" y="31.07670454545456">IBSW
+Interface</y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n7">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="94.0909090909091" width="142.8917910447761" x="756.4530383795309" y="287.909090909091"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="31.099609375" x="55.896090834888014" y="31.076704545454547">SpW
+Link</y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n8">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="94.0909090909091" width="142.8917910447761" x="909.3451018715946" y="287.909090909091"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="57.724609375" x="42.583590834888014" y="31.076704545454547">SysCtl
+Interface</y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n9">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="68.0909090909091" width="98.89179104477611" x="344.875" y="339.659090909091"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#CC99FF" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="51.578125" x="23.65683302238807" y="11.092329545454561">Sliding
+Window
+Buffer</y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n10">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="68.0909090909091" width="98.89179104477611" x="423.7670634920635" y="339.659090909091"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#CC99FF" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="44.224609375" x="27.33359083488807" y="11.092329545454561">PUS
+Packet
+Buffer</y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n11">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="94.0909090909091" width="142.8917910447761" x="976.9831971096899" y="490.5000000000001"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="51.25" x="45.820895522388014" y="24.09232954545456">EDAC
+Error
+Handler</y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n12">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="94.0909090909091" width="142.8917910447761" x="865.8455668088134" y="490.5000000000001"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="58.3046875" x="42.293551772388014" y="31.07670454545456">Memory
+Scrubber</y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n13">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="94.0909090909091" width="142.8917910447761" x="1357.0713545368399" y="741.0909090909092"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="45.291015625" x="48.80038770988813" y="31.076704545454504">FLASH
+Access</y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n14">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="94.0909090909091" width="142.8917910447761" x="641.8158730158732" y="490.5000000000001"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="64.703125" x="39.094333022388014" y="24.09232954545456">Time
+and
+Watchdog</y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n15">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="94.0909090909091" width="142.8917910447761" x="1215.1292288557215" y="287.909090909091"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="56.705078125" x="43.09335645988813" y="31.076704545454547">IRQ
+Dispatch</y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n16">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="77.0909090909091" width="107.0" x="853.1538320303248" y="900.4545454545455"/>
+          <y:Fill color="#FFFFFFE6" color2="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#27AE27" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="58.955078125" x="24.0224609375" y="22.576704545454504">Cyclical
+Activities</y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n17">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="77.0909090909091" width="107.0" x="853.1538320303248" y="807.0227272727273"/>
+          <y:Fill color="#FFFFFFE6" color2="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#27AE27" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="59.18359375" x="23.908203125" y="22.576704545454504">Error Log
+to FLASH</y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n18">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="77.0909090909091" width="107.0" x="853.1538320303248" y="713.5909090909092"/>
+          <y:Fill color="#FFFFFFE6" color2="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#27AE27" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.71875" x="21.640625" y="22.576704545454504">FBF
+Operation</y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n19">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="94.0909090909091" width="142.8917910447761" x="753.8307199123433" y="490.5000000000001"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="33.724609375" x="54.583590834888014" y="24.09232954545456">RAM
+Error
+Log</y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n20">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="94.0909090909091" width="142.8917910447761" x="1235.4919272684199" y="741.0909090909092"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="60.80078125" x="41.04550489738813" y="24.092329545454504">Memory
+Partitions
+Allocator</y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n21">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="116.03905723905724" width="100.0" x="971.3768479033406" y="790.6818181818182"/>
+          <y:Fill color="#FFFFFFE6" color2="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#27AE27" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="35.25390625" x="32.373046875" y="35.066403619528614">IBSW
+Main
+Loop</y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n22">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="94.0909090909091" width="142.8917910447761" x="1349.5626243781096" y="412.0000000000001"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="c" textColor="#000000" verticalTextPosition="bottom" visible="true" width="35.25390625" x="53.81894239738813" y="31.07670454545456">IBSW
+Init</y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n23">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="1406.008519900498" y="568.1363636363637"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="67.134765625" x="-18.5673828125" y="44.472987975045044">DPU Reset<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="14.4729879750451" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <edge id="e0" source="n1" target="n4">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="47.04545454545455" tx="0.0" ty="-90.5142045454545">
+            <y:Point x="1133.6830608860462" y="397.5000000000001"/>
+            <y:Point x="1250.3751243781096" y="397.5000000000001"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e1" source="n2" target="n10">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-26.68213064143538" sy="38.75" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e2" source="n3" target="n6">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-53.04068270596599" tx="0.0" ty="47.04545454545456">
+            <y:Point x="713.1378227908081" y="792.0"/>
+            <y:Point x="530.3697050461976" y="792.0"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="delta" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e3" source="n4" target="n5">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="33.9375" sy="83.9517045454545" tx="0.0" ty="-47.04545454545455">
+            <y:Point x="1284.3126243781096" y="725.5909090909092"/>
+            <y:Point x="1154.0457592987445" y="725.5909090909092"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e4" source="n4" target="n19">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-56.5625" sy="70.6392045454545" tx="0.0" ty="47.04545454545455">
+            <y:Point x="1193.8126243781096" y="661.5909090909092"/>
+            <y:Point x="825.2766154347312" y="661.5909090909092"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e5" source="n4" target="n15">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="36.200000000000045" sy="-82.9517045454545" tx="0.0" ty="47.04545454545455"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e6" source="n4" target="n14">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-33.9375" sy="83.9517045454545" tx="0.0" ty="47.04545454545455">
+            <y:Point x="1216.4376243781096" y="677.5909090909092"/>
+            <y:Point x="713.2617685382611" y="677.5909090909092"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e7" source="n4" target="n6">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-11.3125" sy="89.8267045454545" tx="33.467006398670605" ty="33.05586381392027">
+            <y:Point x="1239.0626243781096" y="693.5909090909092"/>
+            <y:Point x="578.000302061123" y="693.5909090909092"/>
+            <y:Point x="578.000302061123" y="584.5909090909092"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e8" source="n4" target="n7">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-72.40000000000009" sy="-54.326704545454504" tx="19.894621111472247" ty="42.6142271948936">
+            <y:Point x="1177.9751243781095" y="429.5000000000001"/>
+            <y:Point x="847.7935550133911" y="429.5000000000001"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e9" source="n4" target="n8">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-36.200000000000045" sy="-82.9517045454545" tx="35.72294776119395" ty="30.63920454545456">
+            <y:Point x="1214.1751243781096" y="413.5000000000001"/>
+            <y:Point x="1016.5139451551768" y="413.5000000000001"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e10" source="n4" target="n20">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="56.56246084253894" sy="70.63920454548975" tx="0.0" ty="-47.045454545454504"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e11" source="n4" target="n11">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-90.5" sy="0.0" tx="47.03964552238803" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e12" source="n4" target="n12">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-79.1875" sy="43.826704545454504" tx="0.0" ty="47.04545454545455">
+            <y:Point x="1171.1876243781096" y="645.5909090909092"/>
+            <y:Point x="937.2914623312013" y="645.5909090909092"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e13" source="n4" target="n13">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="79.1875" sy="43.826704545454504" tx="0.0" ty="-47.04545454545455">
+            <y:Point x="1329.5626243781096" y="645.5909090909092"/>
+            <y:Point x="1428.517250059228" y="645.5909090909092"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e14" source="n4" target="n21">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="11.3125" sy="89.8267045454545" tx="0.0" ty="-31.88316498316499">
+            <y:Point x="1261.6876243781096" y="709.5909090909092"/>
+            <y:Point x="1021.3768479033406" y="709.5909090909092"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e15" source="n4" target="n2">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-81.14579683361887" sy="-40.07701779000598" tx="0.0" ty="47.045787464488626">
+            <y:Point x="1169.2293275444908" y="440.6666666666668"/>
+            <y:Point x="675.0068704098553" y="440.6666666666668"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e16" source="n5" target="n3">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="47.04545454545455" tx="0.0" ty="53.04068270596599">
+            <y:Point x="1154.0457592987445" y="1035.4133522727273"/>
+            <y:Point x="713.2617685382611" y="1035.4133522727273"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e17" source="n6" target="n9">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-47.046139845207506" sy="0.0" tx="0.0" ty="34.02339311079541">
+            <y:Point x="394.32089552238807" y="537.5454545454547"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e18" source="n6" target="n18">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="22.50987793557431" sy="41.28579466901431" tx="-38.540283203125" ty="0.0">
+            <y:Point x="552.8795829817719" y="752.1363636363637"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e19" source="n7" target="n6">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-19.918171653741297" sy="42.60859472978407" tx="-20.010593562357144" ty="-42.6063560554399">
+            <y:Point x="792.175986140725" y="397.5000000000001"/>
+            <y:Point x="501.79134683724243" y="397.5000000000001"/>
+            <y:Point x="501.79134683724243" y="476.8181818181819"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="delta" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e20" source="n8" target="n6">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-35.722947761194064" sy="30.63920454545456" tx="0.0" ty="-47.04545454545455">
+            <y:Point x="945.0680496327884" y="413.5000000000001"/>
+            <y:Point x="530.3697050461976" y="413.5000000000001"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e21" source="n9" target="n2">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="394.32089552238807" y="334.95454545454555"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e22" source="n10" target="n6">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="34.04545454545455" tx="-36.309027372900914" ty="-29.88580877130653">
+            <y:Point x="473.2129886282872" y="490.5000000000001"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e23" source="n12" target="n6">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-47.04545454545455" tx="28.578358208955137" ty="-37.389204545454504">
+            <y:Point x="937.2914623312013" y="459.0000000000001"/>
+            <y:Point x="558.9480632551529" y="459.0000000000001"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e24" source="n14" target="n6">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-47.03964552238813" sy="0.0" tx="47.039645522388014" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="delta" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e25" source="n16" target="n3">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e26" source="n19" target="n6">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-47.04545454545455" tx="36.30902737290137" ty="-29.88580877130653">
+            <y:Point x="825.2766154347312" y="475.0000000000001"/>
+            <y:Point x="587.5264214641081" y="475.0000000000001"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e27" source="n21" target="n17">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e28" source="n21" target="n16">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e29" source="n21" target="n18">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e30" source="n0" target="n22">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e31" source="n4" target="n23">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e32" source="n22" target="n4">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d7">
+    <y:Resources/>
+  </data>
+</graphml>
diff --git a/IBSW/doc/images/ibsw_logical_model.png b/IBSW/doc/images/ibsw_logical_model.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ffd6d8a1c7ca276d6b5f0cc975f64bdcccfa9bb
GIT binary patch
literal 141016
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

literal 0
HcmV?d00001

diff --git a/IBSW/doc/images/irq_dispatch/irq_dispatch.graphml b/IBSW/doc/images/irq_dispatch/irq_dispatch.graphml
new file mode 100644
index 0000000..1d6abde
--- /dev/null
+++ b/IBSW/doc/images/irq_dispatch/irq_dispatch.graphml
@@ -0,0 +1,2138 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yEd 3.14.3-->
+  <key for="graphml" id="d0" yfiles.type="resources"/>
+  <key for="port" id="d1" yfiles.type="portgraphics"/>
+  <key for="port" id="d2" yfiles.type="portgeometry"/>
+  <key for="port" id="d3" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d4"/>
+  <key attr.name="description" attr.type="string" for="node" id="d5"/>
+  <key for="node" id="d6" yfiles.type="nodegraphics"/>
+  <key attr.name="Description" attr.type="string" for="graph" id="d7"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
+  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <data key="d7"/>
+    <node id="n0">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Artifact.withShadow">
+          <y:Geometry height="55.0" width="60.0" x="1594.5936507936508" y="637.234375"/>
+          <y:Fill color="#FF6600" transparent="false"/>
+          <y:BorderStyle color="#333333" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="94.8671875" x="-17.43359375" y="-30.499370155038832">IRL Queue Pool<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="-12.530620155038832" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ARTIFACT_TYPE_DATA_STORE"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n1">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Artifact.withShadow">
+          <y:Geometry height="55.0" width="60.0" x="557.7158730158731" y="257.8125"/>
+          <y:Fill color="#FF6600" transparent="false"/>
+          <y:BorderStyle color="#333333" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="106.36328125" x="-23.181640625" y="-28.804840970611053">IRL Callback Pool<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="-10.836090970611053" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ARTIFACT_TYPE_DATA_STORE"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n2">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.entityRelationship.big_entity">
+          <y:Geometry height="104.0" width="80.0" x="1592.027380952381" y="374.78125"/>
+          <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" backgroundColor="#B7C9E3" configuration="com.yworks.entityRelationship.label.name" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="34.01171875" x="22.994140625" y="4.0">IRL 1</y:NodeLabel>
+          <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="73.84375" modelName="custom" textColor="#000000" visible="true" width="54.2265625" x="2.0" y="29.96875">IRQ1_0
+IRQ1_1
+IRQ1_2
+....
+IRQ1_14<y:LabelModel>
+              <y:ErdAttributesNodeLabelModel/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:ErdAttributesNodeLabelModelParameter/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="java.lang.Boolean" name="y.view.ShadowNodePainter.SHADOW_PAINTING" value="true"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n3">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.entityRelationship.big_entity">
+          <y:Geometry height="104.0" width="80.0" x="1057.8630952380952" y="374.78125"/>
+          <y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" backgroundColor="#B7C9E3" configuration="com.yworks.entityRelationship.label.name" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="34.01171875" x="22.994140625" y="4.0">IRL 2</y:NodeLabel>
+          <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="73.84375" modelName="custom" textColor="#000000" visible="true" width="54.2265625" x="2.0" y="29.96875">IRQ2_0
+IRQ2_1
+IRQ2_2
+....
+IRQ2_31<y:LabelModel>
+              <y:ErdAttributesNodeLabelModel/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:ErdAttributesNodeLabelModelParameter/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="java.lang.Boolean" name="y.view.ShadowNodePainter.SHADOW_PAINTING" value="true"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n4">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="727.691533358135" y="264.34375"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="64.005859375" x="20.076171875" y="11.984375">Fetch Slot</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n5">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="757.270634920635" y="163.90625"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="65.388671875" x="49.0" y="-15.96875">IRL Slot
+Available?<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.0" nodeRatioX="0.5" nodeRatioY="-0.5" offsetX="4.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n6">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="660.4638068461354" y="171.40625"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="24.923828125" x="-39.57042435602261" y="8.03125">Fail<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="0.5" nodeRatioX="-0.5" nodeRatioY="0.5" offsetX="-14.646596231022613" offsetY="-4.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_TERMINATE"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n7">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="727.691533358135" y="335.078125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="67.5625" x="18.2978515625" y="11.984375">Map to IRL</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n8">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="1248.7400793650793" y="374.78125"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="63.396484375" x="49.0" y="-8.984375">Select IRL<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.0" nodeRatioX="0.5" nodeRatioY="-0.5" offsetX="4.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n9">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="1452.5805555555555" y="163.90625"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="71.88671875" x="-75.88671875" y="0.0">Identify IRL<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="-0.5" nodeRatioX="-0.5" nodeRatioY="-0.5" offsetX="-4.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n10">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="1856.1859778025794" y="643.765625"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="54.91796875" x="24.6201171875" y="5.0">Execute
+Callback</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n11">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="1722.027644469246" y="643.765625"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="70.234375" x="16.9619140625" y="5.0">Fetch
+Queue Slot</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n12">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="1751.606746031746" y="547.765625"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="54.91796875" x="-58.91796875" y="-22.93077097834555">Callback
+Priority?<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="0.21798891517324614" nodeRatioX="-0.5" nodeRatioY="-0.5" offsetX="-4.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n13">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="1617.027380952381" y="555.265625"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="44.5703125" x="-55.105947875235415" y="8.03125">Return<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="0.5" nodeRatioX="-0.5" nodeRatioY="0.5" offsetX="-10.535635375235415" offsetY="-4.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n14">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="86.33367139959432" width="62.1906693711976" x="98.1546653144012" y="482.6403206227087"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#FF6600" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="98.154296875" x="-98.154296875" y="50.39617139959432">Low Priority
+Callback Queue<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="0.5" nodeRatioX="-0.5" nodeRatioY="0.5" offsetX="0.0" offsetY="-4.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_TIMER"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n15">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="1722.027644469246" y="744.4324606997972"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="59.037109375" x="22.560546875" y="5.0">Attach to
+Queue</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n16">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="1722.027644469246" y="405.8125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="87.982421875" x="8.087890625" y="5.0">Iterate
+Callback Slots</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n17">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="1219.1609778025793" y="549.296875"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="54.91796875" x="24.6201171875" y="5.0">Execute
+Callback</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n18">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="1423.0014539930555" y="643.765625"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="70.234375" x="16.9619140625" y="5.0">Fetch
+Queue Slot</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n19">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="1452.5805555555555" y="547.765625"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="54.91796875" x="-54.91796875" y="-15.96875">Callback
+Priority?<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="0.0" nodeRatioX="-0.5" nodeRatioY="-0.5" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n20">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="1366.4391554972829" y="270.3125"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="44.5703125" x="-57.39614048746989" y="8.03125">Return<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="0.5" nodeRatioX="-0.5" nodeRatioY="0.5" offsetX="-12.825827987469893" offsetY="-4.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n21">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="1423.0014539930555" y="744.4324606997972"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="59.037109375" x="22.560546875" y="5.0">Attach to
+Queue</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n22">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="1423.0014539930555" y="405.8125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="87.982421875" x="8.087890625" y="5.0">Iterate
+Callback Slots</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n23">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="1452.5805555555555" y="262.8125"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="71.76953125" x="49.0" y="-8.984375">More IRQs?<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.0" nodeRatioX="0.5" nodeRatioY="-0.5" offsetX="4.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n24">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="861.8498666914683" y="405.8125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="46.884765625" x="28.63671875" y="5.0">Detach
+Slot</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n25">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="535.6367714533731" y="485.63357499198474"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="73.90234375" x="15.1279296875" y="4.999999999999943">Reattach to
+Pool</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n26">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="861.8498666914683" y="264.34375"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="76.322265625" x="13.91796875" y="5.0">Identify Slot
+by Callback</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n27">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="419.565873015873" y="262.8125"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="76.486328125" x="-80.486328125" y="-35.9375">Iterate
+Queue Slots<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="0.5" nodeRatioX="-0.5" nodeRatioY="-0.5" offsetX="-4.0" offsetY="-4.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n28">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="210.3458984375" y="504.8384063225059"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="63.47265625" x="20.3427734375" y="11.984375">Re-Queue</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n29">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="419.565873015873" y="503.3071563225059"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="54.91796875" x="-39.300495441917576" y="-35.9375">Execute
+Callback<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.2156217962252578" labelRatioY="0.5" nodeRatioX="-0.5" nodeRatioY="-0.5" offsetX="0.0" offsetY="-4.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n30">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="389.986771453373" y="700.6664804949104"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="73.90234375" x="15.1279296875" y="5.0">Reattach to
+Pool</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n31">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="389.986771453373" y="603.8643126450118"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="46.884765625" x="28.63671875" y="5.0">Detach
+Slot</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n32" yfiles.foldertype="group">
+      <data key="d6">
+        <y:ProxyAutoBoundsNode>
+          <y:Realizers active="0">
+            <y:GenericGroupNode configuration="com.yworks.bpmn.Activity.withShadow">
+              <y:Geometry height="236.09832655038775" width="336.0257936507933" x="966.2142857142858" y="-17.754576550387753"/>
+              <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+              <y:BorderStyle color="#123EA2" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="166.01289682539664" y="4.0">
+                <y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:StyleProperties>
+                <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+                <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+                <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+                <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+                <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+                <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+                <y:Property class="com.yworks.yfiles.bpmn.view.MarkerTypeEnum" name="com.yworks.bpmn.marker1" value="BPMN_MARKER_OPEN"/>
+              </y:StyleProperties>
+              <y:State autoResize="true" closed="false" closedHeight="55.0" closedWidth="85.0"/>
+              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+              <y:BorderInsets bottom="1" bottomF="0.96875" left="1" leftF="1.0003720238094047" right="1" rightF="0.9999999999997726" top="0" topF="0.0"/>
+            </y:GenericGroupNode>
+            <y:GenericGroupNode configuration="com.yworks.bpmn.Activity.withShadow">
+              <y:Geometry height="55.0" width="85.0" x="852.6209302325583" y="-148.75503875968997"/>
+              <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+              <y:BorderStyle color="#123EA2" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="40.5" y="25.5"/>
+              <y:StyleProperties>
+                <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+                <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+                <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+                <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+                <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+                <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+                <y:Property class="com.yworks.yfiles.bpmn.view.MarkerTypeEnum" name="com.yworks.bpmn.marker1" value="BPMN_MARKER_CLOSED"/>
+              </y:StyleProperties>
+              <y:State autoResize="true" closed="true" closedHeight="55.0" closedWidth="85.0"/>
+              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+            </y:GenericGroupNode>
+          </y:Realizers>
+        </y:ProxyAutoBoundsNode>
+      </data>
+      <graph edgedefault="directed" id="n32:">
+        <node id="n32::n0">
+          <data key="d6">
+            <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+              <y:Geometry height="71.59106976744192" width="71.59106976744192" x="1214.6490095976374" y="37.84643023255808"/>
+              <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+              <y:BorderStyle color="#27AE27" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="25.322265625" x="23.134402071220848" y="-40.60100678294583">IRQ<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="-22.63225678294583" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:StyleProperties>
+                <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_SIGNAL"/>
+                <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+                <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+                <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+                <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+              </y:StyleProperties>
+            </y:GenericNode>
+          </data>
+        </node>
+        <node id="n32::n1">
+          <data key="d6">
+            <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+              <y:Geometry height="30.0" width="30.0" x="1082.8630952380952" y="79.4375"/>
+              <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+              <y:BorderStyle color="#27AE27" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="80.0546875" x="-95.71313666251376" y="-5.9375">Register 
+IRQ Callback<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="-0.31409001956947163" nodeRatioX="-0.5" nodeRatioY="-0.5" offsetX="-15.658449162513762" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:StyleProperties>
+                <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+                <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+                <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+                <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+                <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+              </y:StyleProperties>
+            </y:GenericNode>
+          </data>
+        </node>
+        <node id="n32::n2">
+          <data key="d6">
+            <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+              <y:Geometry height="30.0" width="30.0" x="1082.8630952380952" y="171.40625"/>
+              <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+              <y:BorderStyle color="#27AE27" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="80.0546875" x="-94.72287309662238" y="-0.96875">De-Register 
+IRQ Callback<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="0.0" nodeRatioX="-0.5" nodeRatioY="0.0" offsetX="-14.66818559662238" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:StyleProperties>
+                <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+                <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+                <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+                <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+                <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+              </y:StyleProperties>
+            </y:GenericNode>
+          </data>
+        </node>
+        <node id="n32::n3">
+          <data key="d6">
+            <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+              <y:Geometry height="30.0" width="30.0" x="1082.8630952380952" y="0.0"/>
+              <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+              <y:BorderStyle color="#27AE27" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="custom" textColor="#000000" visible="true" width="96.6484375" x="-100.6484375" y="0.0">Execute
+Delayed Queue<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="0.4393346379647749" nodeRatioX="-0.5" nodeRatioY="0.5" offsetX="-4.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:StyleProperties>
+                <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+                <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+                <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+                <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+                <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+              </y:StyleProperties>
+            </y:GenericNode>
+          </data>
+        </node>
+      </graph>
+    </node>
+    <node id="n33">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.entityRelationship.big_entity">
+          <y:Geometry height="28.893347284898766" width="42.64620155038756" x="1360.116054722089" y="873.5680463995943"/>
+          <y:Fill color="#FF6600" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" backgroundColor="#993300" configuration="com.yworks.entityRelationship.label.name" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="4.0" x="19.32310077519378" y="4.0"/>
+          <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="2.0" y="16.0">
+            <y:LabelModel>
+              <y:ErdAttributesNodeLabelModel/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:ErdAttributesNodeLabelModelParameter/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="java.lang.Boolean" name="y.view.ShadowNodePainter.SHADOW_PAINTING" value="true"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n34">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="104.158203125" x="389.986771453373" y="405.8125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="82.169921875" x="10.994140625" y="5.0">Fetch 
+Queued Item</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="50.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n35">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.entityRelationship.big_entity">
+          <y:Geometry height="104.0" width="153.50263565891464" x="660.4638068461354" y="636.1890249839695"/>
+          <y:Fill color="#FF6600" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" backgroundColor="#993300" configuration="com.yworks.entityRelationship.label.name" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="91.720703125" x="30.89096626695732" y="4.0">IRLVectorElem</y:NodeLabel>
+          <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="59.875" modelName="custom" textColor="#000000" visible="true" width="111.560546875" x="2.0" y="29.96875">(*callback)()
+enum priority
+void *userdata
+list_head cb_node<y:LabelModel>
+              <y:ErdAttributesNodeLabelModel/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:ErdAttributesNodeLabelModelParameter/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="java.lang.Boolean" name="y.view.ShadowNodePainter.SHADOW_PAINTING" value="true"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n36">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.entityRelationship.big_entity">
+          <y:Geometry height="28.893347284898766" width="42.64620155038756" x="1020.601252167246" y="736.7930114161444"/>
+          <y:Fill color="#FF6600" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" backgroundColor="#993300" configuration="com.yworks.entityRelationship.label.name" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="4.0" x="19.32310077519378" y="4.0"/>
+          <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="2.0" y="16.0">
+            <y:LabelModel>
+              <y:ErdAttributesNodeLabelModel/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:ErdAttributesNodeLabelModelParameter/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="java.lang.Boolean" name="y.view.ShadowNodePainter.SHADOW_PAINTING" value="true"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n37">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.entityRelationship.big_entity">
+          <y:Geometry height="28.893347284898766" width="42.64620155038756" x="923.3618682660807" y="696.8850224903762"/>
+          <y:Fill color="#FF6600" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" backgroundColor="#993300" configuration="com.yworks.entityRelationship.label.name" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="4.0" x="19.32310077519378" y="4.0"/>
+          <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="2.0" y="16.0">
+            <y:LabelModel>
+              <y:ErdAttributesNodeLabelModel/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:ErdAttributesNodeLabelModelParameter/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="java.lang.Boolean" name="y.view.ShadowNodePainter.SHADOW_PAINTING" value="true"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n38">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.entityRelationship.big_entity">
+          <y:Geometry height="28.893347284898766" width="42.64620155038756" x="831.3802696902253" y="750.9545370573478"/>
+          <y:Fill color="#FF6600" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" backgroundColor="#993300" configuration="com.yworks.entityRelationship.label.name" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="4.0" x="19.32310077519378" y="4.0"/>
+          <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="2.0" y="16.0">
+            <y:LabelModel>
+              <y:ErdAttributesNodeLabelModel/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:ErdAttributesNodeLabelModelParameter/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="java.lang.Boolean" name="y.view.ShadowNodePainter.SHADOW_PAINTING" value="true"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n39">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.entityRelationship.big_entity">
+          <y:Geometry height="28.893347284898766" width="42.64620155038756" x="831.3802696902253" y="837.7188518297969"/>
+          <y:Fill color="#FF6600" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" backgroundColor="#993300" configuration="com.yworks.entityRelationship.label.name" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="4.0" x="19.32310077519378" y="4.0"/>
+          <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="2.0" y="16.0">
+            <y:LabelModel>
+              <y:ErdAttributesNodeLabelModel/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:ErdAttributesNodeLabelModelParameter/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="java.lang.Boolean" name="y.view.ShadowNodePainter.SHADOW_PAINTING" value="true"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n40">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.entityRelationship.big_entity">
+          <y:Geometry height="28.893347284898766" width="42.64620155038756" x="750.2675823240448" y="896.6121991146956"/>
+          <y:Fill color="#FF6600" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" backgroundColor="#993300" configuration="com.yworks.entityRelationship.label.name" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="4.0" x="19.32310077519378" y="4.0"/>
+          <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="2.0" y="16.0">
+            <y:LabelModel>
+              <y:ErdAttributesNodeLabelModel/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:ErdAttributesNodeLabelModelParameter/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="java.lang.Boolean" name="y.view.ShadowNodePainter.SHADOW_PAINTING" value="true"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n41">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="203.05963012256706" y="270.3125"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="44.5703125" x="-7.28515625" y="50.768195895129224">Return<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="20.768195895129224" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <edge id="e0" source="n32::n1" target="n5">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="1097.8630952380952" y="119.4375"/>
+            <y:Point x="779.770634920635" y="119.4375"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e1" source="n5" target="n6">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="22.421875" x="-27.43578597780254" y="-8.984375">NO<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e2" source="n5" target="n4">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="skewed_dash" target="delta"/>
+          <y:EdgeLabel alignment="center" anchorX="-8.984369962177425" anchorY="14.463348388671875" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" upX="1.0" upY="1.8369701987210297E-16" visible="true" width="26.529296875" x="-8.98436996217743" y="14.463348388671875">YES<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="true" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_DEFAULT_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e3" source="n1" target="n4">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="-52.0791015625" ty="0.0"/>
+          <y:LineStyle color="#808080" type="dashed" width="1.0"/>
+          <y:Arrows source="transparent_circle" target="white_delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" modelName="center_slider" preferredPlacement="anywhere" ratio="0.0" textColor="#000000" visible="true" width="4.0" x="10.154654754154308" y="-2.0">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_MESSAGE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e4" source="n4" target="n7">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="0.0" ty="-20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e5" source="n7" target="n8">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="52.0791015625" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="1271.2400793650793" y="356.046875"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dashed" width="1.0"/>
+          <y:Arrows source="transparent_circle" target="white_delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" modelName="center_slider" preferredPlacement="anywhere" ratio="0.0" textColor="#000000" visible="true" width="4.0" x="10.125005037822461" y="-2.0">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_MESSAGE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e6" source="n8" target="n2">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="22.50244140625" sy="0.0" tx="-39.98653021765631" ty="-29.5"/>
+          <y:LineStyle color="#808080" type="dashed" width="1.0"/>
+          <y:Arrows source="transparent_circle" target="white_delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="center_slider" preferredPlacement="anywhere" ratio="0.25" textColor="#000000" visible="true" width="34.01171875" x="71.12892136346727" y="-8.984375">IRL 1<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_MESSAGE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e7" source="n8" target="n3">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="39.97583747652175" ty="-29.5"/>
+          <y:LineStyle color="#808080" type="dashed" width="1.0"/>
+          <y:Arrows source="transparent_circle" target="white_delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="center_slider" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="30.197265625" x="-70.53215293278777" y="-8.984375">IRL2<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_MESSAGE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e8" source="n32::n0" target="n9">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="1271.2400793650793" y="119.4375"/>
+            <y:Point x="1475.0805555555555" y="119.4375"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e9" source="n12" target="n10">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="-34.719401041666664" ty="-20.96875">
+            <y:Point x="1873.545634920635" y="570.265625"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" ratio="0.5" textColor="#000000" visible="true" width="34.287109375" x="5.01946575830857" y="-8.984375">NOW<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="8.984375000000012" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="relative_to_edge_flow" angleRotationOnRightSide="co" distance="-1.0" placement="center" side="left|right" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e10" source="n12" target="n11">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" anchorX="21.07232220362107" anchorY="4.997802734375" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" ratio="0.5" textColor="#000000" upX="-1.2246467991473532E-16" upY="1.0" visible="true" width="42.14453125" x="-21.072209046378934" y="4.997802734374995">LATER<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="true" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="7.853981633974483" distance="8.984375" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="relative_to_edge_flow" angleRotationOnRightSide="co" distance="-1.0" placement="center" side="left|right" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e11" source="n0" target="n11">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="-52.0791015625" ty="0.0"/>
+          <y:LineStyle color="#808080" type="dashed" width="1.0"/>
+          <y:Arrows source="transparent_circle" target="white_delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" modelName="center_slider" preferredPlacement="anywhere" ratio="0.08333333333333333" textColor="#000000" visible="true" width="4.0" x="13.703669472346292" y="-2.0">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_MESSAGE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e12" source="n12" target="n13">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e13" source="n11" target="n15">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="0.0" ty="-20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e14" source="n15" target="n14">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="-15.5476673427994" ty="0.0">
+            <y:Point x="1774.106746031746" y="833.5680463995943"/>
+            <y:Point x="113.7023326572006" y="833.5680463995943"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dashed" width="1.0"/>
+          <y:Arrows source="transparent_circle" target="white_delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" modelName="center_slider" preferredPlacement="anywhere" ratio="0.0194852237040677" textColor="#000000" visible="true" width="4.0" x="-1.99994342137893" y="42.19811231756307">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_MESSAGE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e15" source="n9" target="n16">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-20.96875">
+            <y:Point x="1774.106746031746" y="186.40625"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="34.01171875" x="132.2383041139633" y="-8.984375">IRL 1<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="8.984374999999993" distanceToCenter="true" position="center" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e16" source="n16" target="n12">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e17" source="n15" target="n16">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="34.71940104166674" sy="-20.96875" tx="41.663281249999955" ty="20.96875">
+            <y:Point x="1808.8261470734128" y="695.703125"/>
+            <y:Point x="1975.3444444444444" y="695.703125"/>
+            <y:Point x="1975.3444444444444" y="462.75"/>
+            <y:Point x="1815.770027281746" y="462.75"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e18" source="n10" target="n16">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.96875" tx="20.83164062500009" ty="20.96875">
+            <y:Point x="1908.2650793650794" y="472.75"/>
+            <y:Point x="1794.9383866567462" y="472.75"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e19" source="n2" target="n16">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="-52.0791015625" ty="0.0"/>
+          <y:LineStyle color="#808080" type="dashed" width="1.0"/>
+          <y:Arrows source="transparent_circle" target="white_delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" modelName="center_slider" preferredPlacement="anywhere" ratio="0.0" textColor="#000000" visible="true" width="4.0" x="10.090735444568509" y="-2.0">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_MESSAGE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e20" source="n19" target="n17">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="52.053335543033654" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" anchorX="-47.4932469928076" anchorY="8.984375" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" ratio="0.5" rotationAngle="90.0" textColor="#000000" upX="-1.0" upY="-6.123233995736766E-17" visible="true" width="34.287109375" x="-81.7803563678076" y="-8.984375000000002">NOW<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="true" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="7.853981633974483" distance="8.984375" distanceToCenter="true" position="center" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="relative_to_edge_flow" angleRotationOnRightSide="co" distance="-1.0" placement="anywhere" side="left|right" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e21" source="n19" target="n18">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" anchorX="21.07225477430552" anchorY="4.997802734375" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" ratio="0.5" textColor="#000000" upX="-1.2246467991473532E-16" upY="1.0" visible="true" width="42.14453125" x="-21.072276475694483" y="4.997802734374995">LATER<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="true" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="7.853981633974483" distance="8.984375" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="relative_to_edge_flow" angleRotationOnRightSide="co" distance="-1.0" placement="center" side="left|right" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e22" source="n0" target="n18">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="52.0791015625" ty="0.0"/>
+          <y:LineStyle color="#808080" type="dashed" width="1.0"/>
+          <y:Arrows source="transparent_circle" target="white_delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" modelName="center_slider" preferredPlacement="anywhere" ratio="0.0" textColor="#000000" visible="true" width="4.0" x="-14.105079675099205" y="-2.0">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_MESSAGE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e23" source="n23" target="n20">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" anchorX="-4.95838487413198" anchorY="-8.984375" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" upX="-1.2246467991473532E-16" upY="1.0" visible="true" width="22.421875" x="-27.38025987413198" y="-8.984375000000004">NO<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="true" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e24" source="n18" target="n21">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="0.0" ty="-20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e25" source="n21" target="n14">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="15.5476673427994" ty="0.0">
+            <y:Point x="1475.0805555555555" y="823.5680463995943"/>
+            <y:Point x="144.7976673427994" y="823.5680463995943"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dashed" width="1.0"/>
+          <y:Arrows source="transparent_circle" target="white_delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" modelName="center_slider" preferredPlacement="anywhere" ratio="0.01750383315175686" textColor="#000000" visible="true" width="4.0" x="-2.00001085069448" y="32.19811231756307">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_MESSAGE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e26" source="n22" target="n19">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e27" source="n21" target="n22">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-52.106433391571045" sy="0.0" tx="-14.879743303571331" ty="20.96875">
+            <y:Point x="1364.29126984127" y="765.4012106997972"/>
+            <y:Point x="1364.29126984127" y="508.78125"/>
+            <y:Point x="1460.2008122519842" y="508.78125"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e28" source="n17" target="n22">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.96875" tx="-29.75948660714289" ty="20.96875">
+            <y:Point x="1271.2400793650793" y="498.78125"/>
+            <y:Point x="1445.3210689484126" y="498.78125"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e29" source="n9" target="n23">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="skewed_dash" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="34.01171875" x="-17.005870225694252" y="18.012008666992188">IRL 2<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="17.005859375" distanceToCenter="true" position="center" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e30" source="n23" target="n22">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="skewed_dash" target="delta"/>
+          <y:EdgeLabel alignment="center" anchorX="-8.98438585069448" anchorY="35.7298583984375" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" upX="1.0" upY="1.8369701987210297E-16" visible="true" width="26.529296875" x="-8.984385850694485" y="35.7298583984375">YES<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="true" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e31" source="n19" target="n23">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="1542.1599206349206" y="570.265625"/>
+            <y:Point x="1542.1599206349206" y="285.3125"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e32" source="n3" target="n22">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="39.990234375" sy="0.0" tx="-52.106433391571045" ty="0.0"/>
+          <y:LineStyle color="#808080" type="dashed" width="1.0"/>
+          <y:Arrows source="transparent_circle" target="white_delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" modelName="center_slider" preferredPlacement="anywhere" ratio="0.9500000000000001" textColor="#000000" visible="true" width="4.0" x="257.9438524615575" y="-2.0">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_MESSAGE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e33" source="n24" target="n25">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="19.204831330521188" tx="52.106433391571045" ty="0.0">
+            <y:Point x="913.9289682539683" y="506.60232499198474"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e34" source="n32::n2" target="n26">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-20.96875">
+            <y:Point x="1097.8630952380952" y="228.34375"/>
+            <y:Point x="913.9289682539683" y="228.34375"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e35" source="n3" target="n24">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-39.990234375" sy="0.0" tx="52.0791015625" ty="0.0"/>
+          <y:LineStyle color="#808080" type="dashed" width="1.0"/>
+          <y:Arrows source="transparent_circle" target="white_delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" modelName="center_slider" preferredPlacement="anywhere" ratio="0.0" textColor="#000000" visible="true" width="4.0" x="-14.089907691592316" y="-2.0">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_MESSAGE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e36" source="n25" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.96875" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="dashed" width="1.0"/>
+          <y:Arrows source="transparent_circle" target="white_delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" modelName="center_slider" preferredPlacement="anywhere" ratio="0.0" textColor="#000000" visible="true" width="4.0" x="-2.0000083317831923" y="-14.076080769734006">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_MESSAGE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e37" source="n26" target="n24">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="0.0" ty="-20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e38" source="n32::n3" target="n27">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="1097.8630952380952" y="41.9375"/>
+            <y:Point x="442.065873015873" y="41.9375"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e39" source="n14" target="n34">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="-52.106433391571045" ty="0.0">
+            <y:Point x="129.25" y="426.78125"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dashed" width="1.0"/>
+          <y:Arrows source="transparent_circle" target="white_delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" modelName="center_slider" preferredPlacement="anywhere" ratio="0.1566439481693563" textColor="#000000" visible="true" width="4.0" x="-2.0" y="-66.93524169921875">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_MESSAGE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e40" source="n27" target="n34">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-20.958343505859375"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="skewed_dash" target="delta"/>
+          <y:EdgeLabel alignment="center" anchorX="-8.984389435298851" anchorY="17.3441162109375" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" upX="1.0" upY="1.8369701987210297E-16" visible="true" width="63.296875" x="-8.984389435298864" y="17.3441162109375">Next Item<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="true" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e41" source="n28" target="n27">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.96875" tx="-10.674747139281635" ty="11.844272971727435">
+            <y:Point x="262.425" y="297.15677297172743"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e42" source="n28" target="n14">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-52.0791015625" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="dashed" width="1.0"/>
+          <y:Arrows source="transparent_circle" target="white_delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" modelName="center_slider" preferredPlacement="anywhere" ratio="0.0" textColor="#000000" visible="true" width="4.0" x="-14.085406494140614" y="-1.9999725837441247">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_MESSAGE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e43" source="n31" target="n30">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.958343505859375" tx="0.0" ty="-20.958343505859375"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e44" source="n29" target="n28">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="39.61820651822592" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="center_on_edge" ratio="0.5" textColor="#000000" visible="true" width="29.3359375" x="-56.55343638124975" y="-8.984347583744125">FAIL<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.33845992176542405" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="relative_to_edge_flow" angleRotationOnRightSide="co" distance="-1.0" placement="center" side="on_edge" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e45" source="n30" target="n27">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="52.106433391571045" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="509.1452380952381" y="721.6352304949104"/>
+            <y:Point x="509.1452380952381" y="285.3125"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e46" source="n30" target="n0">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.958343505859375" tx="0.0" ty="0.0">
+            <y:Point x="442.065873015873" y="853.5680463995943"/>
+            <y:Point x="1624.5936507936508" y="853.5680463995943"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dashed" width="1.0"/>
+          <y:Arrows source="transparent_circle" target="white_delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" modelName="center_slider" preferredPlacement="anywhere" ratio="0.1120480288739841" textColor="#000000" visible="true" width="4.0" x="59.82637445359006" y="108.94737989568807">
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_MESSAGE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e47" source="n35" target="n36">
+      <data key="d10">
+        <y:ArcEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="905.3323974609375" y="643.5370483398438"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="delta" target="delta"/>
+          <y:Arc height="77.79100799560547" ratio="1.0" type="fixedRatio"/>
+        </y:ArcEdge>
+      </data>
+    </edge>
+    <edge id="e48" source="n37" target="n39">
+      <data key="d10">
+        <y:ArcEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="822.3097534179688" y="731.8602905273438"/>
+          </y:Path>
+          <y:LineStyle color="#1266AC" type="line" width="1.0"/>
+          <y:Arrows source="delta" target="delta"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#1266AC" visible="true" width="71.201171875" x="-184.02154141109963" y="58.901081259692205">Bridge Gap<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="56.86133079356006" distanceToCenter="true" position="right" ratio="0.3954847698112248" segment="-1"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:Arc height="-91.23286437988281" ratio="-2.169492483139038" type="fixedRatio"/>
+        </y:ArcEdge>
+      </data>
+    </edge>
+    <edge id="e49" source="n37" target="n38">
+      <data key="d10">
+        <y:ArcEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="880.39404296875" y="707.234619140625"/>
+          </y:Path>
+          <y:LineStyle color="#339966" type="dotted" width="2.0"/>
+          <y:Arrows source="delta" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#339966" visible="true" width="46.884765625" x="-48.02153088995078" y="25.329840870029216">Detach<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="left" ratio="0.5283378724964316" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:Arc height="-36.11214828491211" ratio="-1.353827953338623" type="fixedRatio"/>
+        </y:ArcEdge>
+      </data>
+    </edge>
+    <edge id="e50" source="n39" target="n40">
+      <data key="d10">
+        <y:ArcEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="826.870361328125" y="901.890380859375"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="delta" target="delta"/>
+          <y:Arc height="25.059547424316406" ratio="1.0" type="fixedRatio"/>
+        </y:ArcEdge>
+      </data>
+    </edge>
+    <edge id="e51" source="n40" target="n35">
+      <data key="d10">
+        <y:ArcEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="698.6854858398438" y="808.2178344726562"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="delta" target="delta"/>
+          <y:Arc height="56.37633514404297" ratio="1.0" type="fixedRatio"/>
+        </y:ArcEdge>
+      </data>
+    </edge>
+    <edge id="e52" source="n36" target="n37">
+      <data key="d10">
+        <y:ArcEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="983.3276977539062" y="755.5955200195312"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="delta" target="delta"/>
+          <y:Arc height="26.277523040771484" ratio="1.0" type="fixedRatio"/>
+        </y:ArcEdge>
+      </data>
+    </edge>
+    <edge id="e53" source="n38" target="n33">
+      <data key="d10">
+        <y:ArcEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="1124.8521728515625" y="793.1549682617188"/>
+          </y:Path>
+          <y:LineStyle color="#FF0000" type="dashed_dotted" width="2.0"/>
+          <y:Arrows source="delta" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#FF0000" visible="true" width="53.236328125" x="224.1798095703125" y="18.89227294921875">Chain In<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="-1"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:Arc height="34.443363189697266" ratio="0.2538354992866516" type="fixedRatio"/>
+        </y:ArcEdge>
+      </data>
+    </edge>
+    <edge id="e54" source="n33" target="n0">
+      <data key="d10">
+        <y:ArcEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="1628.5328369140625" y="913.0631713867188"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="delta" target="delta"/>
+          <y:Arc height="-185.5752410888672" ratio="-2.2485899925231934" type="fixedRatio"/>
+        </y:ArcEdge>
+      </data>
+    </edge>
+    <edge id="e55" source="n38" target="n0">
+      <data key="d10">
+        <y:ArcEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="1272.187744140625" y="972.23974609375"/>
+          </y:Path>
+          <y:LineStyle color="#FF0000" type="dashed_dotted" width="2.0"/>
+          <y:Arrows source="delta" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#FF0000" visible="true" width="53.236328125" x="315.7693752943253" y="186.0041821233832">Chain In<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.8762555541432071" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:Arc height="-259.349853515625" ratio="-1.3326870203018188" type="fixedRatio"/>
+        </y:ArcEdge>
+      </data>
+    </edge>
+    <edge id="e56" source="n1" target="n35">
+      <data key="d10">
+        <y:ArcEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="689.1243286132812" y="476.85821533203125"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dashed_dotted" width="1.0"/>
+          <y:Arrows source="delta" target="delta"/>
+          <y:Arc height="28.435083389282227" ratio="0.2646845877170563" type="fixedRatio"/>
+        </y:ArcEdge>
+      </data>
+    </edge>
+    <edge id="e57" source="n38" target="n39">
+      <data key="d10">
+        <y:ArcEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="874.3944702148438" y="808.7833251953125"/>
+          </y:Path>
+          <y:LineStyle color="#339966" type="dotted" width="2.0"/>
+          <y:Arrows source="delta" target="delta"/>
+          <y:Arc height="21.691085815429688" ratio="1.0" type="fixedRatio"/>
+        </y:ArcEdge>
+      </data>
+    </edge>
+    <edge id="e58" source="n29" target="n31">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="442.065873015873" y="576.9878576952823"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="skewed_dash" target="delta"/>
+          <y:EdgeLabel alignment="center" anchorX="-8.984389435298851" anchorY="17.981998320282287" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" upX="1.0" upY="1.8369701987210297E-16" visible="true" width="21.314453125" x="-8.984389435298855" y="17.981998320282287">OK<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="true" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="1.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e59" source="n34" target="n29">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e60" source="n27" target="n41">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-22.50244140625" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" anchorX="-28.692381638879795" anchorY="-8.984374999999943" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" upX="-1.0106430996148606E-15" upY="1.0" visible="true" width="85.931640625" x="-114.62402226387981" y="-8.98437500000003">Queue Empty<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="true" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="8.881784197001252E-16" distance="28.859678864126106" distanceToCenter="false" position="center" ratio="0.26160543923384416" segment="-1"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d0">
+    <y:Resources/>
+  </data>
+</graphml>
diff --git a/IBSW/doc/images/irq_dispatch/irq_dispatch.png b/IBSW/doc/images/irq_dispatch/irq_dispatch.png
new file mode 100644
index 0000000000000000000000000000000000000000..899be673a85e60a5b7e90a4274f090152bdbb2b7
GIT binary patch
literal 155336
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
YC-aAw`u-QpgfiszEmir?vSxw*ANUk{C;$Ke

literal 0
HcmV?d00001

diff --git a/IBSW/doc/images/packet_tracker/CrIbGndPcktCollect.graphml b/IBSW/doc/images/packet_tracker/CrIbGndPcktCollect.graphml
new file mode 100644
index 0000000..8d84bcf
--- /dev/null
+++ b/IBSW/doc/images/packet_tracker/CrIbGndPcktCollect.graphml
@@ -0,0 +1,601 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yEd 3.14.1-->
+  <key for="graphml" id="d0" yfiles.type="resources"/>
+  <key for="port" id="d1" yfiles.type="portgraphics"/>
+  <key for="port" id="d2" yfiles.type="portgeometry"/>
+  <key for="port" id="d3" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d4"/>
+  <key attr.name="description" attr.type="string" for="node" id="d5"/>
+  <key for="node" id="d6" yfiles.type="nodegraphics"/>
+  <key attr.name="Description" attr.type="string" for="graph" id="d7"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
+  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <data key="d7"/>
+    <node id="n0">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="40.0" width="40.0" x="765.8983301313199" y="648.9453125000003"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#27AE27" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="134.65234375" x="57.57976810515879" y="11.015625">CrIbGndPcktCollect<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.0" nodeRatioX="0.5" nodeRatioY="0.0" offsetX="17.57976810515879" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n1">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="128.158203125" x="721.8192285688199" y="563.0078125000003"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="113.08984375" x="7.5341796875" y="5.0">Check GND
+Packet Size Buffer</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="62.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n2">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="583.7966602626398" y="536.5820312500002"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="59.962890625" x="17.417010650490283" y="24.44140625">GND Size
+Circular
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n3">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="763.3983301313199" y="474.00781250000034"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n4">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="893.2030880740194" y="481.50781250000034"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="79.609375" x="-24.8046875" y="44.50781249999966">Return False<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="14.507812499999659" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n5">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="770.8983301313199" y="228.13281250000034"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="75.63671875" x="-88.71668950631988" y="6.015625">Return True<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="0.0" nodeRatioX="-0.5" nodeRatioY="0.0" offsetX="-13.07997075631988" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n6">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="128.158203125" x="721.8192285688199" y="388.07031250000034"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="75.21484375" x="26.4716796875" y="5.0">Get size of
+next packet</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="62.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n7">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="128.158203125" x="721.8192285688199" y="302.13281250000034"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="84.408203125" x="21.875" y="5.0">Extract to
+packet buffer</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="62.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n8">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="583.7966602626398" y="275.7070312500003"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="50.470703125" x="22.163104400490283" y="24.441406250000057">GND
+Circular
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <edge id="e0" source="n0" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e1" source="n2" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e2" source="n1" target="n3">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e3" source="n3" target="n4">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="42.6953125" x="5.015761771944881" y="-8.984374999999659">Empty<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e4" source="n2" target="n6">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="631.3758876568102" y="409.03906250000034"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e5" source="n3" target="n6">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e6" source="n6" target="n7">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e7" source="n7" target="n5">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e8" source="n8" target="n7">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d0">
+    <y:Resources>
+      <y:Resource id="1">&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
+&lt;!-- Created with Inkscape (http://www.inkscape.org/) --&gt;
+
+&lt;svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="181.51503"
+   height="181.50002"
+   id="svg6241"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="circular_buffer.svg"&gt;
+  &lt;defs
+     id="defs6243" /&gt;
+  &lt;sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4"
+     inkscape:cx="-191.78859"
+     inkscape:cy="95.848443"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1920"
+     inkscape:window-height="1014"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" /&gt;
+  &lt;metadata
+     id="metadata6246"&gt;
+    &lt;rdf:RDF&gt;
+      &lt;cc:Work
+         rdf:about=""&gt;
+        &lt;dc:format&gt;image/svg+xml&lt;/dc:format&gt;
+        &lt;dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /&gt;
+        &lt;dc:title&gt;&lt;/dc:title&gt;
+      &lt;/cc:Work&gt;
+    &lt;/rdf:RDF&gt;
+  &lt;/metadata&gt;
+  &lt;g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-745.67177,-616.55345)"&gt;
+    &lt;text
+       xml:space="preserve"
+       style="font-size:21.79795456px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Verdana;-inkscape-font-specification:Verdana"
+       x="383.44809"
+       y="710.9231"
+       id="text6873"
+       sodipodi:linespacing="125%"&gt;&lt;tspan
+         sodipodi:role="line"
+         id="tspan6875"
+         x="383.44809"
+         y="710.9231"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans Bold" /&gt;&lt;/text&gt;
+    &lt;path
+       transform="matrix(-0.94718199,-0.01879329,0.01879329,-0.94718199,929.26064,803.90098)"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       sodipodi:ry="80"
+       sodipodi:rx="80"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path6939-8-1"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       d="m 190,100 a 90,90 0 1 1 -180,0 90,90 0 1 1 180,0 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path4706-7-4"
+       style="fill:#f8f8f8;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:type="arc"
+       style="fill:#89acf3;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5917-9-6"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="90"
+       sodipodi:ry="90"
+       d="M 10,99.999996 A 90,90 0 1 1 145,177.94229 L 100,100 z"
+       sodipodi:start="3.1415927"
+       sodipodi:end="7.3303829" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:end="7.3303829"
+       sodipodi:start="5.2359878"
+       d="m 145,22.057716 a 90,90 0 0 1 0,155.884574 L 100,100 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path3653-6-2"
+       style="fill:#fbecd5;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,78"
+       id="path5943-6-2" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,-78"
+       id="path5953-2-0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 746.42177,707.30345 180,0"
+       id="path5921-6-0"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,797.30345 0,-180"
+       id="path5923-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,63"
+       id="path5925-7-9"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,-63"
+       id="path5927-9-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,-63"
+       id="path5929-2-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,63"
+       id="path5931-8-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,23"
+       id="path5933-1-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,45"
+       id="path5935-6-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,78"
+       id="path5937-5-4"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,87"
+       id="path5939-0-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,87"
+       id="path5941-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,45"
+       id="path5945-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,23"
+       id="path5947-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,-23"
+       id="path5949-9-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,-45"
+       id="path5951-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,-87 0,0"
+       id="path5955-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,-87"
+       id="path5957-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,-78"
+       id="path5959-8-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,-45"
+       id="path5961-4-1"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,-23"
+       id="path5963-6-8"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       sodipodi:type="arc"
+       style="fill:#c7e5f9;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5919-8-8"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="80"
+       sodipodi:ry="80"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       transform="matrix(0.90092879,0,0,0.90092879,746.3289,617.21058)" /&gt;
+    &lt;g
+       transform="translate(230.43873,464.77132)"
+       id="g8379"
+       style="fill:#1166ad;fill-opacity:1;stroke:none;display:inline"&gt;
+      &lt;path
+         style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#1166ad;fill-opacity:1;stroke:none;stroke-width:3.95015383;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+         d="m 525.52266,251.41302 a 2.0002,2.0002 0 0 0 -1.89866,2.31003 c 5.92694,43.90653 45.35328,75.43234 89.49019,71.57949 a 2.001176,2.001176 0 1 0 -0.34809,-3.98718 C 570.71635,324.986 533.25785,295.01535 527.61119,253.1851 a 2.0002,2.0002 0 0 0 -2.08853,-1.77208 z"
+         id="path7578-8-2"
+         inkscape:connector-curvature="0" /&gt;
+      &lt;path
+         style="fill:#1166ad;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         d="m 617.54256,322.91708 -6.54593,4.58663 -0.6957,-7.9697 7.24163,3.38307 z"
+         id="path8385"
+         inkscape:connector-curvature="0" /&gt;
+    &lt;/g&gt;
+    &lt;flowRoot
+       xml:space="preserve"
+       id="flowRoot3243"
+       style="font-size:8px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       transform="translate(264.88555,551.83968)"&gt;&lt;flowRegion
+         id="flowRegion3245"&gt;&lt;rect
+           id="rect3247"
+           width="219.28572"
+           height="286.42856"
+           x="419.28571"
+           y="53.187862" /&gt;&lt;/flowRegion&gt;&lt;flowPara
+         id="flowPara3249"&gt;&lt;/flowPara&gt;&lt;/flowRoot&gt;  &lt;/g&gt;
+&lt;/svg&gt;
+</y:Resource>
+    </y:Resources>
+  </data>
+</graphml>
diff --git a/IBSW/doc/images/packet_tracker/CrIbGndPcktCollect.png b/IBSW/doc/images/packet_tracker/CrIbGndPcktCollect.png
new file mode 100644
index 0000000000000000000000000000000000000000..ca3ca19f57af71fcb2439dc6c148cb242ad5724d
GIT binary patch
literal 33514
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

literal 0
HcmV?d00001

diff --git a/IBSW/doc/images/packet_tracker/CrIbIsGrdPcktAvail.graphml b/IBSW/doc/images/packet_tracker/CrIbIsGrdPcktAvail.graphml
new file mode 100644
index 0000000..6978d7b
--- /dev/null
+++ b/IBSW/doc/images/packet_tracker/CrIbIsGrdPcktAvail.graphml
@@ -0,0 +1,480 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yEd 3.14.1-->
+  <key for="graphml" id="d0" yfiles.type="resources"/>
+  <key for="port" id="d1" yfiles.type="portgraphics"/>
+  <key for="port" id="d2" yfiles.type="portgeometry"/>
+  <key for="port" id="d3" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d4"/>
+  <key attr.name="description" attr.type="string" for="node" id="d5"/>
+  <key for="node" id="d6" yfiles.type="nodegraphics"/>
+  <key attr.name="Description" attr.type="string" for="graph" id="d7"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
+  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <data key="d7"/>
+    <node id="n0">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="40.0" width="40.0" x="719.0" y="530.0"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#27AE27" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="132.349609375" x="57.57976810515879" y="11.015625">CrIbIsObcPcktAvail<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.0" nodeRatioX="0.5" nodeRatioY="0.0" offsetX="17.57976810515879" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n1">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="128.158203125" x="674.9208984375" y="444.0625"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="113.08984375" x="7.5341796875" y="5.0">Check OBC
+Packet Size Buffer</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="62.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n2">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="536.8983301313199" y="417.63671874999994"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="58.50390625" x="18.146502837990283" y="24.441406250000057">OBC Size
+Circular
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n3">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="716.5" y="355.0625"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n4">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="846.3047579426994" y="362.5625"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="79.609375" x="48.89055455730056" y="4.0">Return False<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="-0.5" nodeRatioX="0.5" nodeRatioY="-0.5" offsetX="18.89055455730056" offsetY="4.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n5">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="724.0" y="281.0625"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="75.63671875" x="46.71484375" y="4.0">Return True<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="-0.5" nodeRatioX="0.5" nodeRatioY="-0.5" offsetX="16.71484375" offsetY="4.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <edge id="e0" source="n0" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e1" source="n2" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e2" source="n1" target="n3">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e3" source="n3" target="n5">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e4" source="n3" target="n4">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="42.6953125" x="5.0157470703125" y="-8.984375">Empty<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d0">
+    <y:Resources>
+      <y:Resource id="1">&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
+&lt;!-- Created with Inkscape (http://www.inkscape.org/) --&gt;
+
+&lt;svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="181.51503"
+   height="181.50002"
+   id="svg6241"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="circular_buffer.svg"&gt;
+  &lt;defs
+     id="defs6243" /&gt;
+  &lt;sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4"
+     inkscape:cx="-191.78859"
+     inkscape:cy="95.848443"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1920"
+     inkscape:window-height="1014"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" /&gt;
+  &lt;metadata
+     id="metadata6246"&gt;
+    &lt;rdf:RDF&gt;
+      &lt;cc:Work
+         rdf:about=""&gt;
+        &lt;dc:format&gt;image/svg+xml&lt;/dc:format&gt;
+        &lt;dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /&gt;
+        &lt;dc:title&gt;&lt;/dc:title&gt;
+      &lt;/cc:Work&gt;
+    &lt;/rdf:RDF&gt;
+  &lt;/metadata&gt;
+  &lt;g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-745.67177,-616.55345)"&gt;
+    &lt;text
+       xml:space="preserve"
+       style="font-size:21.79795456px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Verdana;-inkscape-font-specification:Verdana"
+       x="383.44809"
+       y="710.9231"
+       id="text6873"
+       sodipodi:linespacing="125%"&gt;&lt;tspan
+         sodipodi:role="line"
+         id="tspan6875"
+         x="383.44809"
+         y="710.9231"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans Bold" /&gt;&lt;/text&gt;
+    &lt;path
+       transform="matrix(-0.94718199,-0.01879329,0.01879329,-0.94718199,929.26064,803.90098)"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       sodipodi:ry="80"
+       sodipodi:rx="80"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path6939-8-1"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       d="m 190,100 a 90,90 0 1 1 -180,0 90,90 0 1 1 180,0 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path4706-7-4"
+       style="fill:#f8f8f8;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:type="arc"
+       style="fill:#89acf3;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5917-9-6"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="90"
+       sodipodi:ry="90"
+       d="M 10,99.999996 A 90,90 0 1 1 145,177.94229 L 100,100 z"
+       sodipodi:start="3.1415927"
+       sodipodi:end="7.3303829" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:end="7.3303829"
+       sodipodi:start="5.2359878"
+       d="m 145,22.057716 a 90,90 0 0 1 0,155.884574 L 100,100 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path3653-6-2"
+       style="fill:#fbecd5;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,78"
+       id="path5943-6-2" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,-78"
+       id="path5953-2-0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 746.42177,707.30345 180,0"
+       id="path5921-6-0"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,797.30345 0,-180"
+       id="path5923-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,63"
+       id="path5925-7-9"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,-63"
+       id="path5927-9-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,-63"
+       id="path5929-2-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,63"
+       id="path5931-8-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,23"
+       id="path5933-1-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,45"
+       id="path5935-6-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,78"
+       id="path5937-5-4"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,87"
+       id="path5939-0-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,87"
+       id="path5941-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,45"
+       id="path5945-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,23"
+       id="path5947-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,-23"
+       id="path5949-9-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,-45"
+       id="path5951-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,-87 0,0"
+       id="path5955-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,-87"
+       id="path5957-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,-78"
+       id="path5959-8-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,-45"
+       id="path5961-4-1"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,-23"
+       id="path5963-6-8"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       sodipodi:type="arc"
+       style="fill:#c7e5f9;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5919-8-8"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="80"
+       sodipodi:ry="80"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       transform="matrix(0.90092879,0,0,0.90092879,746.3289,617.21058)" /&gt;
+    &lt;g
+       transform="translate(230.43873,464.77132)"
+       id="g8379"
+       style="fill:#1166ad;fill-opacity:1;stroke:none;display:inline"&gt;
+      &lt;path
+         style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#1166ad;fill-opacity:1;stroke:none;stroke-width:3.95015383;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+         d="m 525.52266,251.41302 a 2.0002,2.0002 0 0 0 -1.89866,2.31003 c 5.92694,43.90653 45.35328,75.43234 89.49019,71.57949 a 2.001176,2.001176 0 1 0 -0.34809,-3.98718 C 570.71635,324.986 533.25785,295.01535 527.61119,253.1851 a 2.0002,2.0002 0 0 0 -2.08853,-1.77208 z"
+         id="path7578-8-2"
+         inkscape:connector-curvature="0" /&gt;
+      &lt;path
+         style="fill:#1166ad;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         d="m 617.54256,322.91708 -6.54593,4.58663 -0.6957,-7.9697 7.24163,3.38307 z"
+         id="path8385"
+         inkscape:connector-curvature="0" /&gt;
+    &lt;/g&gt;
+    &lt;flowRoot
+       xml:space="preserve"
+       id="flowRoot3243"
+       style="font-size:8px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       transform="translate(264.88555,551.83968)"&gt;&lt;flowRegion
+         id="flowRegion3245"&gt;&lt;rect
+           id="rect3247"
+           width="219.28572"
+           height="286.42856"
+           x="419.28571"
+           y="53.187862" /&gt;&lt;/flowRegion&gt;&lt;flowPara
+         id="flowPara3249"&gt;&lt;/flowPara&gt;&lt;/flowRoot&gt;  &lt;/g&gt;
+&lt;/svg&gt;
+</y:Resource>
+    </y:Resources>
+  </data>
+</graphml>
diff --git a/IBSW/doc/images/packet_tracker/CrIbIsGrdPcktAvail.png b/IBSW/doc/images/packet_tracker/CrIbIsGrdPcktAvail.png
new file mode 100644
index 0000000000000000000000000000000000000000..a3736cffbae357d2df073e93a6ab404b2384e118
GIT binary patch
literal 20478
zcmcG$1yGdX+dirYN=gZcG)joT64E77($XLef*>Fzy|7A1NlSNkcdm4I=hB@^F0p%F
z{C)rLA7{?YnKN^k;T>l8ee%AaJFe%t3H+!egNOYB`@w?;c(NZPRUbTfI0^iUVWI(_
zq@oW=K6s$qDJv<i?mBnS{6t&L<pu@2aJ!z_+NmvGoT|C7EUs?<WL15r!Q`}>Qb)!T
z)QJ&<s}n>^D<S!31&#dY17qKaR_r%eSXjRA9uwqv^UtBq?~o8aO5u=jBlNbB8>i$q
z(<|%i>&LS2KA}{{)M2;mhvEe2J2(cdjPD50#ZmN_-f0j*ba8?+kT)&nH5u^b|Jx6L
zxGNe}(rz1~k7hdV?e2cHva(9~sIRX$Fj0ecnGrw;^mvx#CSJr6uRuT$Zfp{1V)0ze
zQ_yC$<4UJeRkL*HY7L*zPn9lKOG6`Hou#eQ!WjK7n066kKzGQzvc@L(1*bQ>lWdN0
zcYAa{QzjctTuKTf;JE|mr{};FKTMn2YRJl7w|J_w`@5JdIg<{Z95aJJS}f5<#yxFm
zw$`%uy$v%N1~l8Rbr<gOn9WvrSANOH!U{^FWC&yG?;%iQ7MPkkQOhkTjd4CUl9dfq
zU@R;u@}>QaEj<Fogj2#vVD%DrheE3PMQpk(^?IuWl=gXe9R*)89N1ko?e2iJNIKkQ
zo$pDZ{ZwZu&dYm;@$!B@G+N9oEwjL;-M=Hcx|W(fV)?OU)P)G<7zT7t(EZf=W-9#D
z?F#(-J~Feiu}S@>O(07-zw^F!TY4b(m-qWN79!X(G0D|Yr4=N8@9AtA76*zHTMa!s
zpW?Ezvc7tTi{H_1e=jaU9B7fvJm$}?JGgxGyODbEeB==^qVIDBSKuqR&Y+rh`|%um
ze##H6W@cu`1VsVwfQ4mfw2XB~Ry;}<el4rtBI$3t1!uFBij0-HTk)?6HPV_+N}`PT
zfPUH5-Z+AD(nq}Han$T~y7_ZN$gqA(%r)V!3l1={J5jjlZh?j`A2&Ybb^`cezIuYO
zrK~lRdlxQgu*S!aA5~Systqtzorwb1dm>)0b%!09p)Q8H0KI^#`Wu=V8z;VnBBU9J
zoOD{Uv$I#dy|-<lHhYp!@dgJ5o?)Wf*^<$hHJmTkFS)Ma!ROl+7Qi!Q#y(H*mw=~g
z{(hYDJh_@@eRA^RNV<ff=efq}@afht1c})4d5rgh?;B;};8Z7+iZ8={BlITFmKRXR
zs!P!HU`P?KhjX=$GeYiDda0hQHQVNy<zt_S)Kq-J=QR(MjuIfo{pRN8rrn_oNMXm#
zf#2lZMwQ1|g<7S&yu62!-c)xtH%Cw$zxVKAKOD06AD#$Mi+O?De6a+tYZs;8mK52G
z-K)OvBBIP3&v<|yg8J4+rk=R5E@{p7b&^FeIVCxnjVN&WXLwHPH1rh><d#!AQd`ud
z19OIv6GR$J*DM+fsV{b-T2C#r?GV0o`P|`^1DUsxT<d#rNepOy59}Q)gR*HMGc&C_
zbpxwm+VW5`FKQ@0Dm?sw*e(JrI*M_kr~lWtXPK_PzMhy#2^SalRg4b<YP8R)wE6Mg
z-vdX4mM4uMM4hQ{r-Cr#CJ?Xy>$ZPu)&<BW9o+afaE_y*=H*^@g#-r&n{qrS&^P9p
zS$1@KSm+Vbz2<o~Ds#NgfjXZyjM9no-40?Pe``Uo&&`RCbs2xxHoRx3pCZ5JMGu?<
z%SR5Bn6X8|FO@)tp<tjhgo63}W61SuMn*;k1`IUTQH%vM6q<YttG&JbPjU~B8**;*
z&*tWBm*~NrTyNj{`q6-oAF|SErEnOxovd|7%b9t3wfy|~)8MY~p#JS4lQ&W-9D0Y-
z#vl_{q{-6zld6Hyuv~jUS^niI=!#E3K!Azq$)Wp_gx$egGE&luab+={DrapWLBY`H
zoM_%#moNwoCFR11d)Z#H%Mu+;n|Wn-2*r~(U_gh4hKAhFOKY~q>Qe8ISqdCv)Ay_`
zt|BQ3kfzs<t)-U5P1tNDV7IPf+gJWJmsM}E{d@;lQMmUFpV|4>wm9z}4;-xhOL}Yb
z@|f55bxf=x`eO)@2cM8q|9Pu6Cx>yk(~pC(y(i$zc6uG>6}#cmCd{-u010bqYGOYF
zZ1XjlTkAtq%*Ix&#&0|tgP7#Sjdh&kS?dZu0r*_?;e^<|$#!eaFD}O59!vF|n&7db
zy>(V>d7sX4u-sZR1hX8^$jAt|hPAb|u}}P0hd&jtk!*5u8Q^o0^r3~*twu&zQ_lyk
zTj?YrnQYa`VTey!NO8zNod}Sy3wI;Gxrk^cX!`qiD;ktKm=j7ap(*;2`PqvQ>EEaa
z_#HmB_Zw8@EdBu<E#c=wH+Jc+Kw>kZz)<*LuBxdQBD;9rWg;)&jh2at3GJ=9nOVeI
zs`1t%Kz0Op`UC_&NwEDm`1s7>pH*A2D!-7SV>q$H-aqxX{H7EtAdA>73~=1a$jl@r
zB8pRB<h&y1M1pF#|EsYiI{TY9YZbFqOpiVg5!=kYor-vg;IqZnDdI(7qc=@V?90ch
zI`0P{kvC8+<cj|Xrd&W6FG6Ax68cu`-i_$DATa><7ZEGfN}xiQ_g-(qq5e!QH)EpY
zed+jHn@_%_pjU?Bwhj&snwpx%#_8%ToqJF^K(pPPLFnije(xXB)uyG<CM$(;bB^}5
zt#wJw&8ad!V~I`(4-b!wM1yafB8URfOCi63-IUD5RAAO-kM;4U!}wxup2NsEwy==b
z=q#m}s)Rsn)x5NB_pcooPNA~2rrbGHiX$_zRaGVOX<fGC_XPv0@8raDA^gwX%C=Tl
zSNnR)%gJHm;E3l~^HR{;&<DgxH#+TUYHL3~$KvGVEH5wjbyHJQ<L2Um!{NT~jV&!-
z_mSQEO)XUp6++f%IVpO=u<l1VKDu=C26c9=^YcRaB<^q0%o(GwWCi&6$V^JLS=m7#
zrUt5yE&q-H#VU)PhK2@#uWrd#R#FMl$6KFtbaZreiA9=bXJ?nqM%ZKfNifmNlyr3B
z->3h5^zFWtdm0GM+s@34L7POC?UiAnCK?)=WbqG2VDj%qxZ-i)Tye1h&CG`PzFK6Q
z>Y=7zlGQmn1qB6W6Rnv^oY6>$T=x6ZduuX^6ALn|QC*uV)}>vT)BM<Y-~AazSa+rS
zi-5nX`OkD81Ir8WIypV9+<o`q17;2Gy?rpigFgTHFBZ|c>cqSkM3!wENZROrKu=OH
zPPBg>`{f4JgRKJ8>)8JC==)IU?D4XpHTwNKz{o(i|9Rez2>8$cJnwZ7c=JC`pj+VO
z|2+S1P5zy`|1S;y*Rg=V|KE=|0`2*GZo5dlySG>VFSOgHDziyuX78K*s4-AbP@tNx
z&cnm=pLokX*4D=0$Jp9k!a6bbu=2WJuS0!PMg|(Io~~~2zd$HM2BGQdr3cF4;pJ^>
zx?K&AT&NoxQw7vt=Q+tg)ds<fd+SwK?soLaw}5!3qir{-Fl{-bXge~JNS)(;-pxI=
z36}W1v43pkNxw;Tp2WI=S$oo+k&*RpIQ)AfJSFC6!*;H>HYa*_ceh~wP2N8diGU0>
zDx`wJg+cSZWCMj?F?@C7H~g`uWY%ic6NMips5fthJ<!Fv3vQ}|hs@8bv`iMOSF7si
z$S!1fd%&Og>lr+I_Q&nmC@9_d_H3srkeJx(hRtcR;J1XoZ>_CX@5Tu7nB>EAatd;w
zi#T{OcEb14Pji9bpFx_R%(+0B-i@=H6=&b4YHU<qN`Gv*dOt4-1cVpJyRjlx3u9Nd
zk+yBa^-dyjo9dtn>h*bT!~9^d>>u)$yycSg$PZ(e2f;5yn}|;fl$R|oMl&}|IGeDw
zAt6X914@MEFLpNr1dHs))?xe(gSk>@!5+`#NVvzLo{ou$lz{<8Drk7%Pe;f4+{~-N
z<ieIu3%|)T&c0_{h4B*-QV`z-<60vM+G2Q?il_Bkf}FDq-(&14$-45NHy(Y+uBiQ1
zyn50@jg>J}T0D_;?rSUS;1HC)0$U_B?XqicH{&92VlI2i@*L<!0ioId#wQo>8*t6P
zXdSpL+SBX(pCjQRRNOg9(mpXvZ)kex#YVn0E;*;9(jfkBr+TgCW=BUyr+be=dwxXQ
zE=y{xCmi;WG23QKby(9Zk}OP2oTVw(dt81ys;w`m`|rTE;0ip0SF!m!+*a2QHqNH}
zwvm~RZgVR&(7#(DQ8O-4p7}YopP|#X;pe{}wHPoEn&ZC#Q_u)9BqHzEmBA1LUmc^4
z)Rt+E?##c~!j`5&Zu&u!Qc_vq-f`Wz-q>v;rnw{wJGv0*oaL-XPlAGi(q>PlA77J^
z^TRbrUwg`&6@mLxJ`SCYNwtE~A^nk&J)(N#$w&o6<ls_C>nRvKS95wkt)pI`&H9UE
zxg4Yn>UdMStsk~+C>aJXmK7bXghv;o2YVa7LbX9}_m@(xud5~tv24xb<Eo-Sqbr5M
z;J_TEPZhp1>bEg$7#J7~3=Cxsu^w~=Zf!si&1btL{M3J(>Dpt%5;&qbOfWcQxUGJJ
zT3CN=6-l5ZT5SXKl@z?x@J$mF5AKV60?fIm$)2Z*)!GYGi1#?BrY3Vi-ZG&BCgtd8
z4;L_Ww?CmXIz0x#B3{aLh0(yYke#>p=OEgg1>}{bg(y(#I^LIT-9>t4KUyR#48=dv
zL4B&u7;HN>JY87q{aP6_ok0O-NZ>=(!UFKdKzcp>{XWu%4(OWG<ia}?woNCO9yujL
z|7YO+TxEVX{EGP7!T$cQr&QOwg{4H06fp?$bXbh$t;I;4{o0Im4ZEh_s}|RjRTr4&
zWpVA&rz#7=j$3CdX-Uc7)FLlxuymar9mnh1w+*u(J=0beo++s<8@h1xxY!*1iJWC;
z<Uy;^ygzc%d?jYczuF2*pA>OZ7@Odv*fP>&?RZ*4Uo)6kSyAEpo~{U2cP|uTeDhx+
z`;p*(LU#D+>B_8Dsez5Pb&+D-e`5A_g9sclc0KKnA0NCI_PV|D#UlQGa)d8-`!4-s
znpql#^Wj3h<#>*>mDlY__rr$|M}CYfQ}BJ8sJWjeD4(#as;8DV4~W!$IId{wx0dn1
zJ7&LJlabEN&AksI=lYBZ#ymJUfO#B=1PEAKTJG-g3kckY%XZT(o;S$b(_!bGeII<$
zAGt3zk$a_3(c5E*E6Di)ER^)|e3x>v+;&AqTAG>l&0#MYbDd{nv4m+W8fkFnhJ$f(
ziIaF9-;3vXtg=fyCLIC$`_?7~fDgXeJ2aeOIQOHE$SZ!6lkr}}WN!wAQ~c1fVUgSG
zdM7tDG!!ffJ*ARH(R;EO*1EVGwmbkoSgv_H>GP4peiC=}Lo++l?-=a{m)_%akni#c
zraXXx_k(u#2I9H>na8}z%M2QeTQirnI5=r&Xz&S($l$gzIPEBT(vV4(Xvtv-7a$&8
zTbnPSWmJ??R2&=}WN4r@TGQ``9+&(GQApzF<lqQz!jVLTX&QJO@Mz<GbGj^bCpx;N
zn<E|DIolb}ZFk`?{yY=nY?YIh_16j;*3#~ekB@~l`ft;1^R%L?d-%F@mDh3J?f%rY
zocP&ODL>hXo|-gt0|~_E7y#s`?ddg=CccXg<cu9)V`Dln<~)Mz!VX9l!@<U0!zm)b
zv3qp{KRGGiW&3MEXy_@m9l4D-$N{Iz-X|n<b)2Su)hM4nA#EdV7{MrF7rm<a0V6J>
z=twn$+*P|%GSW7Dmt7|Lnas4gvcY(FqaY(T4mAV<+t^sL+nW&+yTambawJT*_FL;W
zt9j!y(3lLexKzvjHrhbqsE;2{89!$U2hPUA;*I~={@Q8QuT_VWtd(#bfrd{l>}rmj
zG((PN%5(@1yt~+`tB!u7wFDd?6!Hiq9ZH!`-QdB566ELa=<F01W&-jY8xhkwA-LbB
zpXLVRtEvr{Aw*G5uCK4pyT*_0`#AJ(B!j%3o?d|4|IDVy9{<axUb#CNVbvo6r4OYM
zdx|psmr9A_Uz7cL@$4D8O>}H*EpT2#k@_uQH)-j|`xI9$J>hh7&VYwFi-)X?mkb<h
zxO%A?#!MnOFR5cew3{703rk;M6+eDIrXdN?I@Wd_1Ja~;i1Du;X!y`X?IRi~0`$be
zr3y3oBT9%GALuRD=)8O)f5b?(cfSo^P5WtIti}8S(;ZaBaq|ac1@;Wv4?Yz!*SG^K
zD=SO&x(?j0cmDpJlG6m;ci{+%66NQQ<L^2j5;_VG^RA%+GJF-^<^BByA7r!V4e$Ew
zG$5|ZVNsvO?QKH~H|>Wh?q}Ph&#<NDpJqZLS{^QivLQ8C<kdvpwem!Mw-E_*kF>47
zk+E#;HZe7oMYUxv*C!+<dUQZfHwRx{LyWt|#)wG0u2%ew=+6}ulLbk*2>0I|UB$iy
zAxJQ7QYsu6(&feXPOgD`&`9S~4Z>xy;TsScqUf*tpvNoz_yXX#PT7()BMr{rGg}~!
zkUl2-Pht=g)3svvm#`xq?Eqfdg*4Q^m7fr6x;bq0xIFZ{z2amQh9HIQJAUc0ad8o$
zP26k3?mYBhK)wb2xbkK9QcE$?Wtdt!JrRzv3PCjwLSte+qa>!UAwZOy0YbI;(}*4)
z)A=ixaxCe1*<&)-nWFFMAcC;t#)1t$qwhaJbai*<W@Y`LrM+$I3)i5_%)ilsWw$IX
zEy;vYPg>oTN}oplmH!x%tZ1O{Vf0hp2o=I16_<ff0L;(B`db+J*d`b$g`&S>NAr2H
zyaqrSm>61t@mUZL@s{Jgxc-fTRKL-eTQqyCu=@o8W`&mV4nek%JJ|FYL{JpYVM|Rn
zIFKpR_|otSFXC+7`f1--Hju6?7KurWKtI5k<F<tlWDySI;w?H_e9rVR=PkqSVW=cV
zUT*FeSSaK%5<m-Yb!+F`aev{*ay-|M0WmS>DYgLT`ULJRZO#=x(sn$<j{oo{kl8J1
z+DWOrh=+JcxA@f)rH<Bn$qUBXw#)M(KkJeNsm9m2a;7WI{dt|O_l<15Ur{b2lzMRr
zQTCOjiaS|}>1m4-;?@)h?9W2HqubQ!Q5QMjpEs9BV!LVql`8Id8Ds_>pQRx;HuKv%
z!DRB-*eS{_uV0s|<y85>QoS<tph}seV`F0hLr?Z^fgO9K+=?wOCxmjAYH52P4w`nU
zVTXHS(P2MaagkmMq4>kJ)h3Qj%D}Y83`^3j%`@$)>b*>~r56z~H8BY|*45UYNj_l$
zggn-beR!pNRlok`BDM20g_2lN9P!o4nI27IzG67}B?&HfQM-R921asEY`0O?{>;gx
z#<qA%P0g`LY+PKANjcyf1CN8Fp+J~r^d_$E7eSvEgz&i})?l3d`PYe_h%D7i=pC=q
z%>^Y54P7w9>S?+ShMSwPpvYdEUsknMuVbw4HCQGj=(|f;Xy~sTbB^Z#)N+j7h9gtO
z&C3NuTY1<qWQ^^p9X!6@|JVjYN(addDE;7*Dy<`oY4R3-_v7MbFmRAc)eQ<je(voJ
z00V+4!`=tKky4MFyv@LZ5fG<8rN`GVMmvwzGLF)~sfA?TAML!nyb5xeoHhr(B)TjK
z2L<DFEY;Q3Wo5krGFCW{cpfY2sHprD!3P3z3>7<azKCteJH&4FAQpy1Fo1q$`}%fJ
z3qET$5}%kU|5FNO6m)yN)}=yAo0y=AhL)$!6355MNjN7UA|e6;;YWgA8w&6L0s?hr
zj9MYe36&PV+M3upPf{``ij8?c1I&!U^x`x(92^`+N5}Ms<harf4qP3&7OHc^Mxu0d
zKb3NGb8;$Xtpl2csqqakui{l_1^+PgkpWqT1$GSSD+25(X2YdqA6mmtp9%VEg{T1I
zAeXQ1Et_uB+J-<N(x!j^25{8Q&s^f&b~vX5u5>SbGFzLD(OQ*>fyC<oxAeuo&VFFW
zxPfu88LiSkwp?2{a$))?x3-PUja;Gqd?1XY_-O=tz$ZbsD~dQcTlMu@E<%s;WFTh8
zDOn!7y>hP3!}v39R&vBBttXARFd|?q2@p@hSt>!NFgL<_3tGV0BOv3zus0O~3~228
z)(*3UPwNymhP&5Zs&)8%S~NOw1e~0LjzUHPO>ZS}Okdu=_MtUW_)~v`dx6hc+Y@G(
z0fD{D$3{RT8yaOCU7t4LV!w}1C9$6U2aB*}=I5CRJi67<9FXDw`Ly=*^}R>jC)+!C
z7#?nJ`pv8TD|Qu?m5vS$S76b9Z331^k`fcG0D;=r;B5ln5rIDg5!V0s3XFi8t**9A
zmm2!BvPSi?u&@NMF#q|NrF*unofM@QnVLRYAsdiSa`uBu-DBZ0x3{-N6Lo+GnR<T@
z?d(h*%S#*Os|T_9++zh=?I7|0-?4;i@mEBntHdRbmzwrz_8nF-&dHgG$JZ!o5Bc=I
zG#Pa+>Bu`P>y+7CXNWk)B(mz6Hh{-zC|u$W_^SC$kHDkz!~NYyebp4tSQPd2ewT9o
z11N@bT3TAl$~fM#_Kk1tijQZWk`*Vtby-``kb%G~DqVxuDyX)!jxIR`-A(-&I%n7|
zV@b|`5U-V4U5I*IEA{6onzt5SxPg{-t1K#;TOaSa6^63we=%`i{}Y_3bv($S^i5n}
zpQ>f)A2uS25f{<DhGBqT?$S`^7}k4hHosNGFYK`~8r_xRVQsnDV$wY#ohx)XuSgmz
zuVfhIqW3h)w5OR^R7!{~Gxm^Q%;mh?OnOu3GEsL{(9NJBAwF6S03blZz+w!XQJPv>
z+|L!hXbrQ?hirl7>s?RDKhy~+sSGTfhShD&qZhv2J&#8+F#3mk<d*!Qz9fxn`20<P
zu%d6qaW-aLT4+#do}VF?YbF0=Lk57*`?q1&*Vj!=;8+}kUxmDi$+gBiHI*LL7P%!K
zs3hhxN+x*(p4SK=tD%c_3%V9Al_dwmy64?Z*tMU0*?22->RYd_db#(1?<c$%01yCl
zxA<FKJ=XedPqU4N18&^kn)~+iM{!?C((G_;-1|~$Uxd1@yL3a1mP}J_of9#j?T=jM
zJJ?`uQ+A8rDv77ab?Rqc{shn}G8mL3I-1TnqLA+};rwQk=LuM0_>1-vO@5K$9wxP@
zc#jl`p5_t+S(O!4Uez(%lyhk|WY)|7&xX*@5VyAbVUe1K21yGApxJPfYcejz;LfG$
z%jMq)D^go~jv9GEC#gAEcfZ~Rna@<}vl=K~Z?H|3SklMaBocF+%|ZPJyOi1VN3yct
z!4iP>uS=cUDk>_z<=L!7yzxq@untp9()ck3|B8@>s>%%Z*4k7&{g`kQ)VOJgIV1ye
z5DFaTxLb+2S-Yy2Re2bBD=G7)vcB?5ii>mCCHlP_DN*m?PS9=cZxyXYW;vU&l22=o
zyl;jU@&tC6%CSmzi+-$J=yQjGb4M8G_X;w}+`7K3)+WOAT>g3nj`orV*PsNg5Lp6+
zo2;-(6aPVT?$pIx3H%g!(G|6`&o|Y8e1wLl$4L)3`Gh{|w;@rx=y)5mmYl7XUlavg
zjcoI?p25iPrA2t#=y?=T3W@vt{fv>H&<l=QeB`0=n6NG?0Q;fyVZuu>Wqn~MBuo3?
z&1Hg+cHLESBk2y=V9@#>#-Ojnz6C-%CP&B5Zu;qDD4U&cjjOHKQe-P*6%r~<d;<H8
zV}C2HH*UE0bmX6o6H6cq*w9gJXLY|yS<H146Iu1Gfpqg^@Lt*v_hA4SS05ZAjT8pp
z-tLmejk@OqKXpT)B8#?me*-yf2g@VG6jPuMg;6M~hPqHTNROtloWCq0E{=-@`6`zQ
zho)7KE$Wueb#`nJGBj2VRfvavtxcZw!|l#xvvsL-UQJSLIdl#Q(tF>s{vApWgN=J_
zp1nqDJvzR-pTW;9*c5jlMkVf4NPJDgHo*vgatou_hSpa|;lnDN(|(uw-|<yOgG22p
zE<~-lyO9TdS>U8s1tK&bbeiw}{;B^Z4RO`Q=y}(1tXSp{Ha}+e2L3$aU|n8ekOYzb
z@SCGoqF3*hs-hxZi#(u`Tt>ILT3X$o%X5cyc#*Xs&TO7flh2P+j$aFIcFu!YT@zZn
z*0$Ig0{0pU^%d1vwd}73{4ffg_eH5pb|X364zDS+^r*E?-(HjDJc-7zcVP$V^AC@=
zQ^}9t_s(&P)62)r?Qz(~10B$|vaipI!hUiyj~AnrH9ufG{HemTv|deJ$*nQek2;mU
zg26*MDPGWJbgEdo$afyUux{>levUALjM%~QAc%oXWFcCPp+yVmcno&ezX8Xawobji
z`R0gOlLAgmlMBJF!PBI&Q!udp+_EvUlbA1Dvl?MAc;oV=e0B7Ey=l=rS7C4<63E*7
z1lCXZ&UYe$a#_q}>t(~e`HJ*+JP=&>*c<KL9270xV((DQoK56ilB>B#^YymWw?;?i
zcip+AeKnLg28~;1ogW1&o9bN#=7-u^{!|@22}8fC*9y>vh!z{YZ{hNSza+U7Hxt(m
z@9x60dgN20rLMj#^!UE>QK+irtcqh|{hOy$wy&FP`kQK|HM*OwYS^4w6eZn!5DcTg
zBt(S<D8FUFJz!0{#0)ZD!EKw~!9L-{s4sX>#g@sY0wy>^%tEw%iM!zbTsZ&%lj3)$
z1D+9v(8^XtAfB*sELg5~Sn%nAn6G@5BNRVo-xdE7)2p05bmXi)|2-6SSqu(*U0=6S
zH!darMqc{%pnLMRo7Rw1txK71LtbH$VTWv3CxuHaGBq~X_QgH;{t`7cIoa9CL|!sq
zxf1r5d%BS4;)42g{ir6VWNFO~-d4RH`3p&FSOIF=k?S!&RZAB)sAzi@2S9*veTd%N
zFdF`?^^e}uZ{Gv=9jFsqY4eM&;;zROO1gUNQ@k&HPU3xG)A52&RCOvgkuMD$umgtY
z%-jbid*R|5KWl<8Ne{YGs1i%AZ`R8B@8^Sq>LbAxda^~1<3cIiJ;fWjZg1P#7Sf&k
zDB~vGt@kynM3ob)HIG2d2I;A-v3#^+_tzD;;(6TSbgw;^$dJ%L!<uiXP1D+*H;Pp>
zU94p$tqsIe27EddPwr-+92kt|N1}GLKGZpitt9k08|8NwU##Wi<c=48fHT^1R{D;a
zOT>N7sNK@W2O;?DEwZI|ZsNkEpsGBzzt)L4P)5`^&|g8(mokADBbRAuuB?k=e~7Bd
zn-Z|O*JDsR7kWI+`2C8|@;W^eilSZDg3ch3L*1uyBiI^uhAkZ(%#BA52cfeocO+5@
zicDr@@;H$TNlFRv)XXeI7hAD4Ezu2{U!Pzu!{&ZUFA@hlmdT}UUN=nt_<h~?V9e%=
zjdx+uqc;PdolLrq$McystgK_J?3%F{a=~dmm$E9KnwwqzS~{v#5UdU-wEe2scQB}^
z2(Z`cQo$bQEj1*R2supM`0MLz45LjiR4*v_`RJ<ls}b4(ZZV#XQo!>;@9jls#GknO
zUtNq};ycd0_P<T(7_f;QvhjN=9zGwlfHWE}6jitOVmy*>>G%;d>bB8cbddS}7BIX`
zr2|nos^Tr@W;*y9dfITU;^l<e@rP^r*+jBXcY#8yy`<L*Zc4A)73g8}PG9~iK8CpB
z)p`EPF<4J>k4VT>XTc&QCY7$Ibw9IJiP#RyjKP`GDR^Q4L>XU7v~;gXX)Z}i_?jDT
zIt0w2Vw*YkCjB(mYUGSJF0t!f@^Ioph8=tsoC%qryeRYHPv!&?*%zr+Ow$vS!!BtQ
z{M??}B(m9qkIHACtfDI(#1zC?M^z!wnyaeR(?9<36K{?4CiFy*E$L3oT;-qg9aSnH
zYTG;}72RMW=QgvKjLBNNnG~R1EsTIck=M}WDFKd1J!Bs-@@^CLJCW<uoJH$SWy^>8
zWeW{n*!5X(sZxW%VV%y`mIb4YUzcLnSLYDC7u?1y!Z`J_C7va#7#g|yO$*7ziErS&
zl~I$qv@pj+zT(*ajk}FyjSnR&7^K+c%8W6qC!Y(i9O+ogwSfTpUF&ftz?L~%H4My}
zXoC+FZ9ps<-A4*MQ@V%r6{C2an2%R+y-@9r(``|b)oCB%@a6g}ndBPkzFl(e*~*03
zTr%grN$>4EcNq&NE#ck0dU)k@y?@?_-}#LBxtXGY3lS5lChew~V0v{djQS=sDK*3G
zhn(3`6D$X~Nj{GXo9$4uuZ8b@^z-DYAMGcdQN_W=e%BiAt-(Ta@t)TG1QZp`x%k(j
z)~Tqb@RLG9ZA7Hn)QO0o$B7)b2OoS`Y=2>sRcDej&-)9CXB!Vb3?nV(2lz&aMidO?
zMoc|vFHk<Km6B5&C4OQttx~8gidrppS<<gEckHgrFb-^XNvph*wW+rFViQ^dD@$)^
zI0|cPb@}Vjc$kKMQ}c55^v;-^oLrc?w5sY)z~8**S^jtPV+aD`%RTFtGHfd@qcPmh
zEynrTFR;DDog<P|;mUC|g8NXa)1xKgFJ9M9K{Ya#NnHv_HD43$nRW9<q3fRy_a(Z%
zM2&yxR!k;|p;IC#AT82{ew%I$O~g}L)t>vbQOW$`PB%_Gnb!>rseAYMx>ii#m?$eN
z%Z{Hi;ICXZkxajY`x2Cas8=PJTfQcFoY^ojtw5kZL}Fa(1uU%;Wkrx#BwIXF6F5-6
zi#UVXB8PcC<=oH11pC>qL}yR_&)cY`^C98(YT&F<-FXPG*bMmQujjN}xv$$iP6c0u
z5C3vnU{#v}ANDDRo$|i$xAeDcP1^a>(<2I@TghbyW^~0zNB5Av>>X`*@8`+M$r+5_
zXJrt_Q*3k4QpGTxR3^klM~bElo<*Yh73{Mc2~m?j66d;e8~c7PqvDVyXt=A0B^v|g
zuh-##^JR8PZXg%maBYV`pci3~Dg}V$QrKGDg=c`9E+8;B5o7-Kth6>bI(<d;45Z`>
zv3&a?xO4Rsv9Yni5{(U@J6VvGyFXn<p()lDBxx3WLm-vgGS|vznGcbG(%jZqNHrp1
zv%y+lw^3}C4+ILtcH^RQ4{07X)Exp!qUKo{?nZ|&2vSfnw3#`!ZQ~AhdLAodeY6`v
z>Qb5PhAJQtF4>G;XZU?*sh)}&+t)=o*Y{*SsU1<ir642g{><ejYye!O19AH`*^Vp<
zpc=R%uI>a~`enrefoS`pq3_VVxc#89Bfh()wE#9vgO#&oMYYUG=W%>PBltwJYC;TM
zx=omMCk}$Ilj>hoV1PPa@~06%!02{qNQ-9|?EBTsDO?w26{2{%PTueya8q#GCtRD8
zmGBB~elK5?Sk~!MzBw>wiB<6ui%XHG#<GS;J0Ltgjvhd0zGUF64!=P96nHaA9WFYA
z7R0fwF%2hOzX7is5TU-ZqVHp%zP{1jZ*n+^Hwy+3C0c}*o?eCZ;6=6nt&Mkq(seWt
z-c{7;S-Vv)2$rF(1J0qYyG`G8<B>pe^NWiOKG@x9YH9mHz10epm{d4eCM*?qX!5EY
zwGVAq);}IUM&SPT^}V@<KK?oWh3)O{ftYPol-<nKd2p#rTjno_5cX|}O{%`nYxW^$
zY~xQ7Zq6aEBy>8M*GBv6&R94LRU)jc?0aThkNTGlZTx;*U)VC41t+Vs@2b`W0C-a*
z#O=0?Gm4bzbXBZA&iv)NVWAZ^4vfeVw#uM;KzZAy#&Bs+=GFW$=I`8&-kA-|!OKC4
zFtdeK_wEIGV1!n#Qv5B~m6k3Y?Q?<{e1!E3^l>xi*L~l;vnC~$TkVP`^H1X;w>w*?
z(~IRtF-ixN?mX;k?Q{|=xq+eo`#jXf<1(4poG|MPSLh|C3(39-ugDvlGt)qgkboi8
zNx5vWpFB`j)F24=hTdExwy@P4Q2|?zj{Zo=u<Vs^<#XJ|@c|;QmhY-7PY9j%vvvqR
z7_THGKbfGC`#c{iCMhUjJukbF!Tw)Tn(n^rJ7Zvc@rH&K+?n_^rCIdBlZ8>U3g^p9
z=z7M<m>ow5@<fO|_NMLT-|E5>V9w%`&wBOYGx=TE&|#!d5^m3~?ho~w*6!4+?y}TE
z>++~RDg8cD0AG3sKN=;D39jV_4qm?ewW$2?vBC+?4h(PuU{CgmSToDBqiYTMg$4HQ
zBPTfp1y&H~2p^$kN@vu#qzhLLA@NEZs(R{k(%zivb&@^$GjmwCW=3{n)iIha0}}CY
z8KyXYQ7p7xItslxu#`zEQ9U)g6OR=!7+!Z{8Xce4r&Ac;He}j+DV@l>d*p<Thj)H{
zevlQM34r80q-bAHOYc_zz5Qg0#L#;Gb_p`JQr|}^l&=R~s*nQkRoI<X+4nW2ev1&~
zq8rP^*qV9MvH-hNdaenh=M|aPWP`yO!Nx0#GuyP`S%4S`3{g;00$gYY2Lx>E-pgcS
z(-2sLN9b(T1u97J0wui_?Nf0{T|3$Qzi(1jyu4yk+>1M_vu+Y0SXpT1jIb@I8fpNV
z&YJF1D8$63nhD9YMf|1_Qz`{%SX%DPR({#}?oM+Jh$M{{^|k2Ov@d}#k@99cN*U(9
zwdkX{H7DYm074xF*t$>)6r0YPY()nTv+7C$=yNYrEHu?|K|XC1`o=lg5i8U$Oz$!{
zeqw9oC3fnhmZ7JH=}u&gvZ#P#q7J`R`pUcy%;U7U_RDkDkTorf1$d>h)#mHsq5ABO
zr3tXgkgu*-2vP-BN}9erGBOhS$Z7@A?TVy;uim(HY+C|(#*4c~>&E1p;w$Rc=I#Y$
zmPiu^j^xm6`QfvpY1o}B=i7%~@jyDQ`E9ZB^Br%9uGc2IZke4!aQ#}T4Q*AaKV%XI
z6sOK|es*?teEdV1|N0(0)kEIF8)d0L4!5sRg08-=&OUHPU4tbxu@GOn$Fjd%U*;2j
zlBy<f<@u%)yD~GFyztT%@%7BM`qf<_2x>8{X;Q9jO5yA%kjE=3y42bV(4G>Na>+<Y
zTDK_gfNKo{FskL`2=)7Rg=}y<&yal~U}x5ZF-}=aC^6G?XN>!9k0w#{Ti-zKl3VOH
zJ@|kIHBz_n#n4C^xg6JAc!?q8C0M=oC-DXHu+e9d0$cPaV9gIyzv8nG4-Phi5f#nN
z%^Gh22IIEjKc=9|P?EspCw{lNId0#n%1(uYv$^u`Sih6#>*c8%cD7;4(5t?&1G%QO
zAT|hQZSs?KrJRn81U02Yd%}ldg>F>2zZ`}}lz&xO6#|sq5Sy97jpNyiv$O9G4uH;Y
z*zp7O1Nw*$?6H^L5X0XpeMSxqMA%T@0EmnyHQ@HFQ0xXxb@}-_<%|o>V0Lsh!I&wR
z+_?P3+zeo?+b2;j2|A3iZ+*=IatC!MR7#H^XPn@_Kv;I1r-OsnxDPunGSMXq`|e)X
zh4jxTnlVm=lpJXlmXw6PPoJ5cWng5i5kk+EM?KPEIv#2~lF$_o-Wi6@P3@obXYD$i
zOofi;8iIG^We@nnkW$yx5a6B`;HB|g^U+@A^iPhwQnA4&<*vTbc4pQ0<`@3DkN%-m
zLX^U}qqRBHVCD5MJk(|?3VgSwEGA~XH)n=2P#$u0IA#72Hn|PkUmpQT5xcrAfQY|+
z`!<4naWvTp?ZD-f%)KT_aUX<=c*ReAF=*0QJDamAjc8WhJq7Og4R0=&TYXqbajb8)
zN7ot^@xLDOin(3|9NY3U%=I!chvtIm8ZX#oI2W3P8T1CH--qIyQrw(AZ*EbiH3aU*
zZKe}E*il6O^u2VuJTcolqH;Rj;zNQ@&u5eGSDdYGBavn)EPNb9D(FT}RY)=l4e+|N
zGBqV8C&#KO{#JKH^ium^Xn>#)6P1(2Ib3I$b9NY@*6iYRlE}FvO0Chk^Wx599Ol&Z
zd*|9Cd39|~Ur+CkoEg*3mD?#uKrX(ENMupw^*Db|e9i5=-+vFeqe`7AT6z%py+{+V
z1J~!JwY9aWsWda1I`bCxLZ~Ruh$&+|dbCp<jNIV{@i=$7JF6{^@!{!W+4$U1DD@Y%
z=^~wC==5uP`uDm{pUAEubh}FNr$TkrQU5(2FUom^E5AYSwZ=Sw1;7EeQO+{0roSc|
zErr;^S`L<%AJo`1p+;iakw(f_L;dkVbJE%XOUu%Djo|Fe>5ai}EU%c9@Ac1II~6m*
z#&gD1U9+?G_=Y`O2au1cZ~tv&e3$r8%B)(^jhU)by=p-X-AKwbbS~vX_gBDVXBeW!
zEUEzN05R25PB*yipb2TRydqh(lXy}^%{i7lke5AOAfgW;E-r&l)CWh@mRg)1DT{d-
ze*DPs?yj(0Qu$J)@9k5EoPM1}K?6pO*f-f<DbNn$Hv$hft3@J0ZQ1^fVgC8E^-S5%
zG8;|%^R~)-Q?}J_9P-O02?;Mius6;r53$}){$-;Z<435(^D2F*RDJEzUwQQA6o9NI
zHaxVt5c`$NHy3{Up^*P*$NiEXLs98nT4gw~vXdKf`E$SCd6>JIG`iU+`vPae590TJ
zWv<$4MSpT(fi+z7;KB^jAU4M9tES2B!>8vi9g|<L(Vh9`QJ(LIwfOE(ui9kFB6*x`
zZ1JyBgc2G9B@tPCf2!-QhF^#ZAvg0>#BlY1m~C|2^AA^uPf~o6=#7{y{^8Yc{W^sL
zb}hL{Ui3Nce&YE-D-U|W4T5gpM0|KkBZ_Owm945nADxV~0xn}(xRPs7*Ev02X@7!G
zO)2Pb`-1JI{+7zfwJw%Q_v`e$xv90jV%k*bR~(vxx^U-KsFAT5VdndeBBIKnB;hLO
zg9PM}Vbbxf>1U&x+KLK*$86OdMx&Llj)&)BTmA|br=n$GwE5v{fD#s;vhDO=yNdB*
zD?}~6e8AhJ+}OY6j?NqAV-q)&pY-%J9<Z0N8xJS&mPbX5jso|Y=sV=7wk^sfgZUbp
zMwcV%nV8o_Nn7E<hp*VUbfvFiqY}S3&!yvN(d{xZNKy&W==o$OQQ9Q1z<H?Md~StS
z_e!ghNda6Gm0=c6eG2-ht?deM2msq!W)r`=)cRm(#4|$ErA`Cy(zv(TBc$sI3iJ1{
z`5S6yHq?a;mP+I6P%Yy<FNE}u+L}K9LW5BEW;nsU+e(9=q#2_CW(8ukGuUW;^GO)m
z*ee)KNc>*-0D&eU;gzPvjB#OQpcIe(5$d3kC?mK1C{v!Wmo!&78b@dDRtPdw)zk9<
z$X);|#dnKC<MblL+}e6!VF9;>?a!nwT#lwe4F0~TtmWh(Ykq$5d^Kvs$({YiEwt@C
ziirOFHB0UOy3VEUGzg`mo2Sy!Ry30;9aaDote{o_J#%k|KJafBa9IBU&}U{YkUsuo
zYr!p|l+6p#5xR5E&q8D3s&4Ru|3o(GZ=(+8fes%|H@8QHCi8#NP03`t71W`bt+JN@
z7|PdVxu0d%m^=W>hP(r`M_5?+_U>*zv|hF#ww^<Do`yV}(ekU;%p4Bbc8`7S$Cbie
z^v13S0IVbJ=R)P`^A%ez*9FFNZxa#{=4eDsmtmYtCd>;j&WsEd5AFTb2HTf&=@JKj
zS*RKqgd(NRR$&173gC3Bsg3vb$(6D3PxE?TA|CchE7yEf!DlDH_On01Dy-c%@1@4=
z7$(ZRMRpP-oU}Bz?en`C?*ds(D6)CqYqK_foF}wvo(U<kJ-oEh-}k)C(DjkKT&!4}
z8M)hEHZFir&CN}`gmS3Y%T`T?M5J7TXo&)ol9PKelT@_@=2Jumd{>F1bzXfX&o8X6
zciS6kHZYcb#C2;fUvtFWYd%h`X<yheu)5%?fu(y_wdQU)<t;F7X>U&j!hkXT-O^(z
zeeU7i&@RMAuN<Ea_Ep;FIenZ(GF%yy^j(-$kdc>x!LNNKpwq<fy^5NePmnkOxX^NO
zjSUR^uA}T~&bjd~G4pKV1CP%Bd9Oo7x8V?Py|8Y{i4pYkJW%f0BqhJu5g55|SZz~d
zQ!)VBV)F5$=&MA16(QZ)wKLhkZXfFQ-8Z|xV<VF{>xxyCp-OM6-5dIm*cGowRS$Bd
zJw$~0A6Yww24r--VqnP5%{_H(0vNzomNUvNi4kPu&|^j+2(roF|H<tTaOWB%3rey|
zJzF~D*yAWEs3v{>VR#_Ptn5|w+0wfR+k~o}-&!N0QFo9jEFtGBZ}04dEH3K1OGM@K
z-&J1cdqkoK0L>go&W}F<m1||%tU$?3c=)?aaRr(ONg^IogM)0}(jE>{0DQDfzjYk=
zAi!F*HOn|nFDZFS;<MckeW$KI0eF9ad2zVZj8oH`pvraay8q<~^Rv)>K(~Fp?@BOi
zmcBeT*h9h1dTHDjW%ZiB>HByWp2Si3!U{}c{AQO9=4-Igy}iyq5fMH&(E=FlA6~IA
zGykAz1JE36-o(kHz<_|VuNc3(URb=t0kGaS7iyqX0A#<8*YdRd^xp3Q3|qpVM=)Cv
zMDfl~9lOIV#y`Ee#MpgbX{rs#OAxI-rlh%SizOU=hnH3;7MdrF<{+K&iY8`x-N8p!
zvE(kMgMHZwjFmJkNd$G680~vNAosWJn4#6yZyH)}w}Q4}2>dMlK%1*6D+9_gyxmsF
z=<cf(fXkLXve8D!Lrm7GsVRV&FF8k|_4auKhv*!|xBXOo9hh^rdwAPZQ{u3Bdj%aw
zF_EAQFl7pzL7fBMn~)sE7LMrCC>Lu3$BQE3&q+u`P+K>(=xy4Mpdf63ctFp-cggV_
z_YIGOqhtT$XUFD0oPSOIvK5V%^Xnzs5ka-dEOvHwPEL|6x%t}U*TYY8SH%{H59LAM
znqXr%C&w!i?6I}Rd+e~D33l9&DV)Wpt!GV&9#0K$j`t*6E<aN;CB_i5kBxI*p9W*o
zcwx2~J-nLpA<Hg+J%XlA+<6?#RTn(Oc+2&c2Yeu&DAAt@j#xUimDrQwR7w#hCn7>S
zWvlT#>!FK8!6Z~(4(6rDn<)<BCnhG+(SFRxz`wO$U|{AF*ItCI<G`LQ8O!QkQe!@C
z`4kyz2e@bX@!760b>Xi)+4}P#hYMIXR345-A7Mwmy}jkTKR&!Fps`3(3~xCBy~|c*
zV`Ytuj7&)QbWK^XoA~>#(*H2*c8YcLaiKbk+K241uC6X`v=YDS<Yt$TWL+zh-OoUI
z4s~D;7~Oc)y2Z#h3AdUm+CWyWm$_nAS4n@$?i%?T_3aL7MerXzQ&t`hMdD#&x5WTe
z0}W_mEohG(iMJAbp%%6v_mfd|b18*fbaxTLsMAyM`|}E{$U#>CgOI-bswjBgk}UOO
zOq%VmQfLoLdDF7XYL=VvH*A5nr|U2->Sm<`#1}<6w}FsUaS^c57SPH~n7YN%ogic-
zHVrkQ`SJtg64=dbP9QU|Ff~<ERfXqOpQUT-)Xs|RjNe6wQ3l%w6HhHPE2qTT_a5zH
z34MWDn5X`E%-wf*(_I!eSD)hO%tBVtd&-JAU&9<HU;0}12}ZmAYLaX4%Ns=ng^G%b
z6RL5X6|$E=S-=4{Q26KU?7TIcT3S#*e+_o@%Vv_m78QDjm}2eX*|f#b($w&ilGL6P
zns?R1GbX*5;~+eitbH#0=CY8<dfx{PT=+@{V#&hw2qX41(&`ntD*Ga`D!v!#slbQ>
zV{iUXeFv=M@78G;jhNTL91l>}h{V9rn&Qz}T=DYy0l$lQK5v)u&On*DuDqNxF>1}J
z_b4FRCt2A};iq2dB4L@mT<Am>w_Q8+xKGZLo$^|WXhiY^Vkv6t8OO`vB*7+_D_^ow
zw`06J_pJ#!P&TUn>gCHdAd5IWJj5&BAo!6{LpX4=k)F4bGb+8b16ZJM<32TqMiBvW
zA@$p9U)<rpt?d4!6pXK8urQ&7a&nUw*!8PL*UBu{K9L@nGi94E8@}f2g>NJEg=#)#
zX5O@8LP3v~_3n#P=GlPy4xq+IIf>uc$_nSSIK{K5$fhY$PZ)4W9sDLiPOI^l1`!$A
zpL3g<D5q4Iqh-%N%aC1)$SB>%+6u#a5v)m!Ht;Y-vCZ}Rn}7|SF!{jV{GcE?SLv58
zGfi_m{z&15!0#%5fd)c(7He%_Df(C^Re+-fX9Dbi&qi0VAMFebQha>cOY|Gp9Rwo0
z=}x))H2l#VkscghuU57-z9~RHd0E!4uC&)UzLk@gpWPwndw)n-TLY^&IyTmgHF9Uy
zMIIyYOL-7d-1tcj3r(>7Kbd=j9N0qKg$j(2<1(8ML2+?$QaEHIZKXfH3ia`U*uZNq
z+I^lV0{m|dL<TUAABfnrtgMdVVcW?94a%qf1TY`}us-$6lAM?U;V5)**E7!D6AFQa
zia8+gq80=Egn^zOKq7Ksq90q&>zuRkaEVW@usacPVQUNP!!^T+>TufCq6h*NHN^Lw
zKg|^~!1Bv$JYNnZkroP_Pr`eO)j!w|dL2E*x8QmE*5zmkxD<WdOS;u1#sHgZyRw6t
z1#c#o@iP!$mgfO^HtnNHC|<FY<>=^We=I00D2RUHGLHxI%QKC`Q+ZU|D~C9&jcK(L
z#)nB0ZG9e>G<mv2)JnNbK2OHuisp?84ZO65lNycO+Z@(HoBOB8*>oD+dOu~F?bSX%
z5U`tR>s#7b&9<7Bc$ptROKGg467fOr6_LnPs3bjN(Wv#je`t`zMrH-Lh3-~#DK==?
zt|%?7D#C?P0?{)03=$|b=J6RcrywU65E3HJHLsdV&Byj-m?md<tn@l{KiJo@V`bZn
z-BKJ^R^OC6URA32sm-@<EiOj}dp%s$(Ha`qeyWU7_WS~R)XI!eZ~pWZuxKdSu=!4Q
zbxCLNts(DjIyS_sPqs%hPq&7LlSH$bg`Tb_zQ;@Av+5(w46!DyEGWSKAEb==5kYo(
zNmU@216a`B!L5<BBS0<C<`euvibEzl5?wIYFRCmc1p#j(dpI}kYgU>T#uB*Vfoi4q
ziSPRR`T`1vEzu<n_4IJ34kcRw<_Zq!fS9wz^v}ga+|9wayi10vs@_iK_Y9EqTloj|
zk<yuLx;55!*XOTazwQulkaX&3mkINQyN?{!%9t$8Q(Yhr?d(o+Z(eTAjw>&*V-B-`
zN-Rb;4SzPZ6tn~`ym**pl&v}&*n(AJ2t`iD8kQK=@`}<uES>VZ=kiQJ(U&{Y($W~@
zW0FKYU%(mBHJqHL7Oh$mK2;p+VWY2vUH*bp@u5lLO8=Ta3hiKZG23rSl2xEsRCB(m
zVEwiQa+Ia;;&<Q6#`SVrl&Ds0bqwq@37G=~@GBSa`Wze_b?)aZ&iwaOo$O=K!|kJm
zdPl42lIHI_ssLEH*yutd`ueGrkXdE{BP$Q=jd)c*$g06+%x-)e^i-9WkT|)M1CKNG
z2bTHYQCf?-WE+`S4b<X_9SV7ukwJex=)Jd+&p;Fy9E<~g=<4RyyWs#Pz8`A?4iXm^
zf9N{`?4GNuYuT(dfxUdLon!wA-zxp5&yxx2P9Q;<%@;5ENmSn{<Y?*0pm7_S2P=1J
z<GfghjTJP8r5vLD3YnOgc+11nn)CMxsFpBVa@w1kou6NuLA#ev{@whDy9H2xI6OY?
zxYiW{u<M<ioB*o(>WM4vV;_E(!}xC4RYilkxS8jgkMjoJvE8wdH5()2V_%$kSh=Y`
z6bk(q;MWZFC5{pec}I(hi~E+B_m?DiwF3*=FES-%XvOXd-16ZS+KQ&S`j65h7!==~
z;r0f|YXQ~8tjG34Tjef#d^ptCXTlXvM@Pq`oU%}5Ilj{FFCihpc?=jH^t&7DzgaGa
z3j)sjGbth-3JMBJ$$}f(+uNI)&O2k-K<$X6j7)cTH>}Bx8z|dnXJ_Z);^OC@nV-M8
zMVtbTkCc=YpcBKIJ!*@K*%pFDn*L4Kx!lFOe`9Rt`w08?IZ)ibH&vX-V>LA_hPqXJ
z1MCGi2L~;@qOnov^U}nG`tOE+jqZzu{~u}$@7db_^PT^$Mg+?80D8jzEMNqf4uEj~
ztL70fTmMHBx7mCM+Ewi#*7;W>Vmjc<9peL{f@0t&KR+M9`~m}2MA92bw4Yu^N_R;E
zRBp^M{ZnrZ4W5FlG1o@Q#`YcmX@=578Zn6ZzJiadPsnQu{PL#)c9a(MpQNOuG~W0I
zkG9<}q9NMtHNzi?9e=OTYd1xB0?q;sUngHwe-sW2c96Q18;Kj%nD3s{G?gP2851j#
zXID!t$Fhp{Q~F1BP0jc0(m3}Ooo?Sw(UxZ!0_AacezmR|N%>@yM>iJdl}ca8WBx${
zl}roIHECcK5@8d6=8A9dE7!O$5f#>L@s?}V?3xm&5>Oe-+uYpD$;t63ew#-Hd3oa<
zcxd!v8?z*@;CSmsIYVhKs)<QCi7B?fwXKZO=f21>{7Vm+$<f)&j+c~I$R)+SM#Ym2
z;KbMJ&tZHxK$9E><;BEBX!KZDSevVUVYDO8Qq5P*_jOvP`%kT7!UhHF(-Z;`I;jY>
z^4M_D=={5wgoyasWM`lnv4@;CoQyw(OO*Bv;Or#RKmJYlPpcQ}6d#|J(Hj5E)0Dgr
zAaIHJc^MDK_*4ADCUE|<J^au1Yc1{)(*LE<@&c~NDxXBjU7uBgZUWGpGp_dQ*Kvk0
zhKXv?Wu;`-=(|+})XTMTAw*P!Gn@Ak`Shy4blnF`F89kFeoz5^sPkr{`0sB>3hFFx
zrwB}%Wu*P2<_8JkzgLADdChFX`9ILWF@UO+<%?IR>%4Qk)L~2!AB;R_UI3T!02$aU
z*7nb<ud=H|t3MJ&*Ks~%tJ>#ZY4w$+?|=OH?ty$jsF5`UP{gJt^=ZxF^g-DeCgRDb
zBJ747wm=!Py$9#sYUDNp@Xrk-W$XaZ;a@RtQ`5@jukBwd3533e6%$4OR}<$R4t4g&
z@pT!|j4&*zT+6K?8lnsau}dtQE*LW7QmUVFS;oE5FkxBuTyn{!lGQSp4T}*eqjgJ#
z!Va5?k%=K@n9H88XZLx2^XEL@nR&k7Ip@6JpU*k3cmD^t6V9MeY2@dM4|iE3?^g+0
zA-f>Y>FDPHG{u&F*5LQLy7WhDZ}JmdaN$9g*R$V(6~RGU;lFQdbv<W(<f`vXm*w9G
zi^M-w81k3+$W@oPI7<g`zvfe=6!}IPn)-MeGe!ECzcH`};07vhyIUPviKfwt!F%&h
zS}wTLZNtM?rysU^E_i~1$zT1kg!^ksxv`<)G}ZrUKgfRAT52Q##-!!a(3qpoyF=AA
zzO$G>AV_`rdsNYqA9)EkCf3(qDEcLSeN%NZl|9)cfop~fm)j2bm0K_q6qS38I)k9i
zgfVxF#-3V@JxEw?>P+N`t~Nl2Wa+434#Xcvp<MKpdILK~VPYJZ%pP?s?$*~Os%g#x
z&qrQWp-@jlUa<Y8TVvn8-5s*6CUP#)u;`&~6N#btm07!DW?Oh*Hg{rVB)ec6sIpY#
zH{krNaR?XoroqLpNZUp0`S_w5@8@R$6K0+@`UlNRWyACI9pZslI?-pvgM)*wRpk{>
zz7ruK!Ugo?q_(4djkL7<$L=|Yb_+HDWhgeVHC&FNhRysDMa`<ON44Jpf@647X?mbg
z1~iZQv((`G`SbbiM||5x*{W3v1R;RvMlU9E_i;bBj1Yu<>56J1JVD6knPB7AFSlKw
z62zM1aq8&pho@^8!TgDCA<TtvqN#6qc+WU#`S%H%t%ZZ&rJWfFt&Ce7;}{}w`g8BE
z_G8^$noJOwP?=e&Q=o&8I*7$;oKIfHHj=dXWH^H<TwdR8pCVX1Bm$(M;s$Y|;erW?
zGe3}3FWBrBQLxF$$^OiTXIY)GYXq${8D;zR^VxIMAb?Sohp2`{My6nU-cz5BDuso1
z1g8+sY=-JB!6n55n2e0OkEedRJTl=kFgVEX#|p(vS0d!2jc_#SaaR|Y<k-;A&|-XN
z%u${#@J0m%piORVWi{KNh9OpxK&wq%02jN4xafK=@mtkYfZ^DNT>m`CC;{uTgNjKA
zFSdSE$QvP%;RHF*psT1}6YjE~22cTLmw#z{2Wk~NKOpDw=9pNI;#8g4Hn+!!gw<y%
zD|*tW`-Q1)<03Ff=aid&eN0*bvK92X+&bQT@T8L-`;XW)U4DD;h<dSwiAfR<(&!MM
z7^B%EX_L^HtnMGiuY6{#<o3ygcIo0Zk71+i`y`!w0BcwHv=D@!lz(CdZ-|iA5-WFm
z`Cufx3_lh&4nR_kfVm?4jaVRcZXDy!u6jP>8`r9C@R#%5ZBAo_;{#hF;bu1$;FHa-
zD&JRt@<&0qzP6Se3mPKDcg?OK4bD%Vb9%dimfdG2{c+%uyQ^#2(ZJ_mjElf#kHY>G
z)pg^YtqD>lzv&P99qH~qC)QS>vF%W`TXtCkn+c*kG{G*%Qq)lQ$Y8gF;r&;OK&h#G
z5FkR)0sboSk|-1cAuYW{8_QFKPvP&M=Tc-@Q*)~^gf(J$FIBQo5e2H2CrDrw+9;zx
zT!*4-sFLF7&Rw&V@yU45x)f<!FXDe39GooaJ*@Ro1#!2_FQ@TGeFQ<uFw?iVtPCWh
zkY_ce=wQ}VA|_jDG#Z$FEH<+o6Wu$k*hK^4q~_^EyL=jiL?rC*F}gBFCX+XPWMpM2
z4>XrFq&u!mMRW*#FY5;ez8{Vn=WPMLtMc`;3>C%lk5oCT6<}OG8W|b+-{5gR%s(Kg
zLl*T8*A#;(T}PYQw7&zs!{6D}6~V{%4c9<}?60*ixGh|qYWZ=_cPV(VARhl7+nU~7
zhv5}5;($ew5ZI|FeCgVp{nWx1>g=_OF<C$gm$K^Z2Fom?SP)ITF%|k0k#J7_Pdjix
z3kxP;j7J+qO%s#$`?ZqU7q?L$awl==w^ke8yrP9gYcT84+Sha(tXgm4?OPt0@|tV`
zyW`7j;ewG?Qmhw8u*uAKxgq%K>4o<1mHb*;<55@h-7nf(*0gik(5!Hh+ny-)PiR@t
z9aJor>(a#Ev<)+3FVG(*&N9o&%8qP9c8Ot2c}QA$zoizWambRCzEU5`6PL=BVmGmY
zCB4u<f)ZWOQ~|s$AOBoK<(S*KSLZiI;hZ0aPYI9m``ft3n}w}KsY%dfW1F_DlqVhN
z@Qc3A2j=l;KFgg>p-_l2#HE81db+v*2C})!+&;MiWwtEFry<keW$+HwjsbqXCoiIX
z`b6$e!yY35ie+btl7L7CJ=s>Fp$v*#Gb@U9oev7?^?3I0qMXBcMt`?*xiQUaDspsS
z!{#rhEQm{e+WN?CaK@eF7D;z+<%C|p!Jc0kV4vLtr@rX>M9`f&iCAQPBUHHx#`vuK
zsYsiJlk_Jttn~Z2E?3NOSFaxS6Nv+MaqmqZZIjCuh5Io_<FxBj9Os$pMUC!xBaL(2
zQvH&z79+L!e}82{xfcp;I^xM!6VZte&eXzRz=F8T20Rb1f~L8^nd%uN61f*46)p&r
zx4s2Mdk`eAFT$j{aQASA+4$iij$O~i-y-q!v*uB_KH8bnwO}g~^f6jmTIT!$CZiBg
z#72+ww1>3VO{IdX6#+IzakxABvYbZRZ8l>QE#S1Jg)1w;L68e*!IhK@0CoRgWqgj!
zf4`+lLW&#o`B8txJWaHJow6Thk;b1o##2^OD$6<{%Zd7hNSSwGfRl~Af$0^y4CA3t
zEKUJgYvX5!YK&_1rSC_~GmqU{y}}Z{air&j8NW0ZD6dYD(_mt+lTuPrfa&(2N3<Vk
zHs8UH7-x1j)YWMzA#M$!7(clY)iqB1rT^Cgk-Z$?ylVQP^mge7yG^eH?J*JDpnm=D
zL2gd%E5M5piRMlvz~n7wSj$1q$qePCn}73&-JQj^i|5nN!)ug<2UgdBcanS1KlG^7
z0A^sNB{yGsAxEu9P2~xK>Q2KudLPqGKrkjO-&qzamx2WcJdTQriu`<us=f9!`>Le*
zj2*~{lbIzw3L?o2oXoLUEDD7xREXCV4&GXj&Ct)#b#&eL?a`}2T*ga<npy`}@4f9|
ziWgt0vPz_J4)*rqJ4J?h>CjwQn{R{Dp}bS~Pu<U3AlmM5TCumt^+2)@AJ&vEDkzYq
z^peTqD^~zMoId~wS4e4DnJY<r@F`L%xhJ3rZEC8uMvm>7k&jQe*=03*3)CA9o@p6K
zg=G7JqM~GHtpTvklG6ZE*YgZ?uDySIf~dXS*=aS}V5=#g@hqpjX9mPhOnyoNAH0XM
zE2fzgE9HfFd#k1uAK$&pQWu=Pv@*PT5AhD>jZ)e@*7@(1KFZglf6<P}B#3j*)Sc~(
z@B(bZi|2z-Udz2tjtKdQde79bBe}$vozNe#ULP1m{WlN~s*XSb2~zTQ${}drYwnax
g|MzB&uty}Z$udsw%EOg_T)%Ie9o-xn><Q$503YCZ1^@s6

literal 0
HcmV?d00001

diff --git a/IBSW/doc/images/packet_tracker/CrIbIsObcPcktAvail.graphml b/IBSW/doc/images/packet_tracker/CrIbIsObcPcktAvail.graphml
new file mode 100644
index 0000000..762b867
--- /dev/null
+++ b/IBSW/doc/images/packet_tracker/CrIbIsObcPcktAvail.graphml
@@ -0,0 +1,480 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yEd 3.14.1-->
+  <key for="graphml" id="d0" yfiles.type="resources"/>
+  <key for="port" id="d1" yfiles.type="portgraphics"/>
+  <key for="port" id="d2" yfiles.type="portgeometry"/>
+  <key for="port" id="d3" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d4"/>
+  <key attr.name="description" attr.type="string" for="node" id="d5"/>
+  <key for="node" id="d6" yfiles.type="nodegraphics"/>
+  <key attr.name="Description" attr.type="string" for="graph" id="d7"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
+  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <data key="d7"/>
+    <node id="n0">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="40.0" width="40.0" x="719.0" y="530.0"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#27AE27" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="132.349609375" x="57.57976810515879" y="11.015625">CrIbIsObcPcktAvail<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.0" nodeRatioX="0.5" nodeRatioY="0.0" offsetX="17.57976810515879" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n1">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="128.158203125" x="674.9208984375" y="444.0625"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="113.08984375" x="7.5341796875" y="5.0">Check OBC
+Packet Size Buffer</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="62.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n2">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="536.8983301313199" y="417.63671874999994"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="58.50390625" x="18.146502837990283" y="24.441406250000057">OBC Size
+Circular
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n3">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="716.5" y="355.0625"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n4">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="846.3047579426994" y="362.5625"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="79.609375" x="34.0" y="21.015625">Return False<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.0" nodeRatioX="0.5" nodeRatioY="0.5" offsetX="4.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n5">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="724.0" y="281.0625"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="75.63671875" x="24.181640625" y="-21.96875">Return True<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="-0.42307493673501007" labelRatioY="0.5" nodeRatioX="0.5" nodeRatioY="-0.5" offsetX="0.0" offsetY="-4.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <edge id="e0" source="n0" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e1" source="n2" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e2" source="n1" target="n3">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e3" source="n3" target="n5">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e4" source="n3" target="n4">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="42.6953125" x="5.0157470703125" y="-8.984375">Empty<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d0">
+    <y:Resources>
+      <y:Resource id="1">&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
+&lt;!-- Created with Inkscape (http://www.inkscape.org/) --&gt;
+
+&lt;svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="181.51503"
+   height="181.50002"
+   id="svg6241"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="circular_buffer.svg"&gt;
+  &lt;defs
+     id="defs6243" /&gt;
+  &lt;sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4"
+     inkscape:cx="-191.78859"
+     inkscape:cy="95.848443"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1920"
+     inkscape:window-height="1014"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" /&gt;
+  &lt;metadata
+     id="metadata6246"&gt;
+    &lt;rdf:RDF&gt;
+      &lt;cc:Work
+         rdf:about=""&gt;
+        &lt;dc:format&gt;image/svg+xml&lt;/dc:format&gt;
+        &lt;dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /&gt;
+        &lt;dc:title&gt;&lt;/dc:title&gt;
+      &lt;/cc:Work&gt;
+    &lt;/rdf:RDF&gt;
+  &lt;/metadata&gt;
+  &lt;g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-745.67177,-616.55345)"&gt;
+    &lt;text
+       xml:space="preserve"
+       style="font-size:21.79795456px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Verdana;-inkscape-font-specification:Verdana"
+       x="383.44809"
+       y="710.9231"
+       id="text6873"
+       sodipodi:linespacing="125%"&gt;&lt;tspan
+         sodipodi:role="line"
+         id="tspan6875"
+         x="383.44809"
+         y="710.9231"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans Bold" /&gt;&lt;/text&gt;
+    &lt;path
+       transform="matrix(-0.94718199,-0.01879329,0.01879329,-0.94718199,929.26064,803.90098)"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       sodipodi:ry="80"
+       sodipodi:rx="80"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path6939-8-1"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       d="m 190,100 a 90,90 0 1 1 -180,0 90,90 0 1 1 180,0 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path4706-7-4"
+       style="fill:#f8f8f8;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:type="arc"
+       style="fill:#89acf3;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5917-9-6"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="90"
+       sodipodi:ry="90"
+       d="M 10,99.999996 A 90,90 0 1 1 145,177.94229 L 100,100 z"
+       sodipodi:start="3.1415927"
+       sodipodi:end="7.3303829" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:end="7.3303829"
+       sodipodi:start="5.2359878"
+       d="m 145,22.057716 a 90,90 0 0 1 0,155.884574 L 100,100 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path3653-6-2"
+       style="fill:#fbecd5;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,78"
+       id="path5943-6-2" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,-78"
+       id="path5953-2-0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 746.42177,707.30345 180,0"
+       id="path5921-6-0"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,797.30345 0,-180"
+       id="path5923-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,63"
+       id="path5925-7-9"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,-63"
+       id="path5927-9-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,-63"
+       id="path5929-2-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,63"
+       id="path5931-8-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,23"
+       id="path5933-1-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,45"
+       id="path5935-6-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,78"
+       id="path5937-5-4"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,87"
+       id="path5939-0-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,87"
+       id="path5941-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,45"
+       id="path5945-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,23"
+       id="path5947-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,-23"
+       id="path5949-9-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,-45"
+       id="path5951-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,-87 0,0"
+       id="path5955-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,-87"
+       id="path5957-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,-78"
+       id="path5959-8-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,-45"
+       id="path5961-4-1"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,-23"
+       id="path5963-6-8"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       sodipodi:type="arc"
+       style="fill:#c7e5f9;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5919-8-8"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="80"
+       sodipodi:ry="80"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       transform="matrix(0.90092879,0,0,0.90092879,746.3289,617.21058)" /&gt;
+    &lt;g
+       transform="translate(230.43873,464.77132)"
+       id="g8379"
+       style="fill:#1166ad;fill-opacity:1;stroke:none;display:inline"&gt;
+      &lt;path
+         style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#1166ad;fill-opacity:1;stroke:none;stroke-width:3.95015383;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+         d="m 525.52266,251.41302 a 2.0002,2.0002 0 0 0 -1.89866,2.31003 c 5.92694,43.90653 45.35328,75.43234 89.49019,71.57949 a 2.001176,2.001176 0 1 0 -0.34809,-3.98718 C 570.71635,324.986 533.25785,295.01535 527.61119,253.1851 a 2.0002,2.0002 0 0 0 -2.08853,-1.77208 z"
+         id="path7578-8-2"
+         inkscape:connector-curvature="0" /&gt;
+      &lt;path
+         style="fill:#1166ad;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         d="m 617.54256,322.91708 -6.54593,4.58663 -0.6957,-7.9697 7.24163,3.38307 z"
+         id="path8385"
+         inkscape:connector-curvature="0" /&gt;
+    &lt;/g&gt;
+    &lt;flowRoot
+       xml:space="preserve"
+       id="flowRoot3243"
+       style="font-size:8px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       transform="translate(264.88555,551.83968)"&gt;&lt;flowRegion
+         id="flowRegion3245"&gt;&lt;rect
+           id="rect3247"
+           width="219.28572"
+           height="286.42856"
+           x="419.28571"
+           y="53.187862" /&gt;&lt;/flowRegion&gt;&lt;flowPara
+         id="flowPara3249"&gt;&lt;/flowPara&gt;&lt;/flowRoot&gt;  &lt;/g&gt;
+&lt;/svg&gt;
+</y:Resource>
+    </y:Resources>
+  </data>
+</graphml>
diff --git a/IBSW/doc/images/packet_tracker/CrIbIsObcPcktAvail.png b/IBSW/doc/images/packet_tracker/CrIbIsObcPcktAvail.png
new file mode 100644
index 0000000000000000000000000000000000000000..a36350b2d43bd8d336c9daebcb60f1c990993519
GIT binary patch
literal 20527
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
U|45r5_~?+azM0-%x{eY51B|wF_W%F@

literal 0
HcmV?d00001

diff --git a/IBSW/doc/images/packet_tracker/CrIbMilBusPckHandover_1kbuf.graphml b/IBSW/doc/images/packet_tracker/CrIbMilBusPckHandover_1kbuf.graphml
new file mode 100644
index 0000000..63ebf16
--- /dev/null
+++ b/IBSW/doc/images/packet_tracker/CrIbMilBusPckHandover_1kbuf.graphml
@@ -0,0 +1,745 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yEd 3.14.2-->
+  <key for="graphml" id="d0" yfiles.type="resources"/>
+  <key for="port" id="d1" yfiles.type="portgraphics"/>
+  <key for="port" id="d2" yfiles.type="portgeometry"/>
+  <key for="port" id="d3" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d4"/>
+  <key attr.name="description" attr.type="string" for="node" id="d5"/>
+  <key for="node" id="d6" yfiles.type="nodegraphics"/>
+  <key attr.name="Description" attr.type="string" for="graph" id="d7"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
+  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <data key="d7"/>
+    <node id="n0">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="40.0" width="40.0" x="255.0" y="405.0"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#27AE27" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="171.80078125" x="57.57976810515879" y="11.015625">CrIbMilBusPcktHandover<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.0" nodeRatioX="0.5" nodeRatioY="0.0" offsetX="17.57976810515879" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n1">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="144.158203125" x="202.9208984375" y="329.03125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="134.2421875" x="4.9580078125" y="5.0">Clear 1kiB acquisition
+data buffer</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="70.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n2">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="144.158203125" x="202.9208984375" y="254.03125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="139.7265625" x="2.2158203125" y="5.0">Copy Packet to
+acquisition data buffer</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="70.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n3">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="144.158203125" x="-9.0791015625" y="104.03125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="120.16796875" x="11.9951171875" y="5.0">Set Acquisition
+Transfer Descriptor</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="70.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n4">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="144.158203125" x="202.9208984375" y="179.03125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="135.75390625" x="4.2021484375" y="5.0">Fragment Acquisition 
+Data packets</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="70.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n5">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="15.60154403700966" y="-22.394531250000057"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="50.470703125" x="22.163104400490333" y="24.441406250000057">AD
+Circular
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n6">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="15.60154403700966" y="177.60546874999994"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="50.470703125" x="22.163104400490333" y="24.441406250000057">ATR
+Circular
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n7">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="252.5" y="102.5"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n8">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="144.158203125" x="377.9208984375" y="4.03125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="103.38671875" x="20.3857421875" y="5.0">Insert into 1553 
+packet structure</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="70.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n9">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="144.158203125" x="202.9208984375" y="4.03125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="113.212890625" x="15.47265625" y="11.984375">Copy 1553 packet</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="70.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n10">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="-77.0" y="110.0"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="44.5703125" x="-7.28515625" y="44.015625">Return<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="14.015625" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n11">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="144.158203125" x="377.9208984375" y="104.03125"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="130.404296875" x="6.876953125" y="11.984375">Fetch 32 1553 words</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="70.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n12">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="36.8595330752687" width="278.392366795699" x="-76.1961833978495" y="406.57023346236565"/>
+          <y:Fill hasColor="false" transparent="false"/>
+          <y:BorderStyle color="#999999" type="line" width="1.0"/>
+          <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Liberation Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.1875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="263.2421875" x="7.575089647849495" y="2.8360165376343502">AD  ... Acquisition  Data
+ATR ... Acquisition Transfer Request</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="137.1961833978495" y="16.42976653763435">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <edge id="e0" source="n0" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.0" tx="0.0" ty="20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e1" source="n1" target="n2">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.96875" tx="0.0" ty="20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e2" source="n9" target="n5">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-72.0791015625" sy="-0.0" tx="47.39845596299034" ty="-0.0"/>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e3" source="n2" target="n4">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.96875" tx="0.0" ty="20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e4" source="n3" target="n6">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="0.0" ty="-47.39453125000006"/>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e5" source="n4" target="n7">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.96875" tx="0.0" ty="22.5"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e6" source="n7" target="n11">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="22.5" sy="-0.0" tx="-72.0791015625" ty="-0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="skewed_dash" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_DEFAULT_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e7" source="n11" target="n8">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="-20.96875" tx="0.0" ty="20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e8" source="n8" target="n9">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-72.0791015625" sy="-0.0" tx="72.0791015625" ty="-0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e9" source="n7" target="n3">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-22.5" sy="-0.0" tx="72.0791015625" ty="-0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="82.9140625" x="-87.88539123535156" y="-8.984375">Buffer empty<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e10" source="n9" target="n7">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="0.0" ty="-22.5"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e11" source="n3" target="n10">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-72.0791015625" sy="-0.0" tx="15.0" ty="-0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d0">
+    <y:Resources>
+      <y:Resource id="1">&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
+&lt;!-- Created with Inkscape (http://www.inkscape.org/) --&gt;
+
+&lt;svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="181.51503"
+   height="181.50002"
+   id="svg6241"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="circular_buffer.svg"&gt;
+  &lt;defs
+     id="defs6243" /&gt;
+  &lt;sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4"
+     inkscape:cx="-191.78859"
+     inkscape:cy="95.848443"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1920"
+     inkscape:window-height="1014"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" /&gt;
+  &lt;metadata
+     id="metadata6246"&gt;
+    &lt;rdf:RDF&gt;
+      &lt;cc:Work
+         rdf:about=""&gt;
+        &lt;dc:format&gt;image/svg+xml&lt;/dc:format&gt;
+        &lt;dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /&gt;
+        &lt;dc:title&gt;&lt;/dc:title&gt;
+      &lt;/cc:Work&gt;
+    &lt;/rdf:RDF&gt;
+  &lt;/metadata&gt;
+  &lt;g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-745.67177,-616.55345)"&gt;
+    &lt;text
+       xml:space="preserve"
+       style="font-size:21.79795456px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Verdana;-inkscape-font-specification:Verdana"
+       x="383.44809"
+       y="710.9231"
+       id="text6873"
+       sodipodi:linespacing="125%"&gt;&lt;tspan
+         sodipodi:role="line"
+         id="tspan6875"
+         x="383.44809"
+         y="710.9231"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans Bold" /&gt;&lt;/text&gt;
+    &lt;path
+       transform="matrix(-0.94718199,-0.01879329,0.01879329,-0.94718199,929.26064,803.90098)"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       sodipodi:ry="80"
+       sodipodi:rx="80"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path6939-8-1"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       d="m 190,100 a 90,90 0 1 1 -180,0 90,90 0 1 1 180,0 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path4706-7-4"
+       style="fill:#f8f8f8;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:type="arc"
+       style="fill:#89acf3;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5917-9-6"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="90"
+       sodipodi:ry="90"
+       d="M 10,99.999996 A 90,90 0 1 1 145,177.94229 L 100,100 z"
+       sodipodi:start="3.1415927"
+       sodipodi:end="7.3303829" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:end="7.3303829"
+       sodipodi:start="5.2359878"
+       d="m 145,22.057716 a 90,90 0 0 1 0,155.884574 L 100,100 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path3653-6-2"
+       style="fill:#fbecd5;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,78"
+       id="path5943-6-2" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,-78"
+       id="path5953-2-0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 746.42177,707.30345 180,0"
+       id="path5921-6-0"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,797.30345 0,-180"
+       id="path5923-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,63"
+       id="path5925-7-9"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,-63"
+       id="path5927-9-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,-63"
+       id="path5929-2-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,63"
+       id="path5931-8-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,23"
+       id="path5933-1-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,45"
+       id="path5935-6-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,78"
+       id="path5937-5-4"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,87"
+       id="path5939-0-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,87"
+       id="path5941-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,45"
+       id="path5945-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,23"
+       id="path5947-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,-23"
+       id="path5949-9-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,-45"
+       id="path5951-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,-87 0,0"
+       id="path5955-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,-87"
+       id="path5957-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,-78"
+       id="path5959-8-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,-45"
+       id="path5961-4-1"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,-23"
+       id="path5963-6-8"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       sodipodi:type="arc"
+       style="fill:#c7e5f9;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5919-8-8"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="80"
+       sodipodi:ry="80"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       transform="matrix(0.90092879,0,0,0.90092879,746.3289,617.21058)" /&gt;
+    &lt;g
+       transform="translate(230.43873,464.77132)"
+       id="g8379"
+       style="fill:#1166ad;fill-opacity:1;stroke:none;display:inline"&gt;
+      &lt;path
+         style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#1166ad;fill-opacity:1;stroke:none;stroke-width:3.95015383;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+         d="m 525.52266,251.41302 a 2.0002,2.0002 0 0 0 -1.89866,2.31003 c 5.92694,43.90653 45.35328,75.43234 89.49019,71.57949 a 2.001176,2.001176 0 1 0 -0.34809,-3.98718 C 570.71635,324.986 533.25785,295.01535 527.61119,253.1851 a 2.0002,2.0002 0 0 0 -2.08853,-1.77208 z"
+         id="path7578-8-2"
+         inkscape:connector-curvature="0" /&gt;
+      &lt;path
+         style="fill:#1166ad;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         d="m 617.54256,322.91708 -6.54593,4.58663 -0.6957,-7.9697 7.24163,3.38307 z"
+         id="path8385"
+         inkscape:connector-curvature="0" /&gt;
+    &lt;/g&gt;
+    &lt;flowRoot
+       xml:space="preserve"
+       id="flowRoot3243"
+       style="font-size:8px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       transform="translate(264.88555,551.83968)"&gt;&lt;flowRegion
+         id="flowRegion3245"&gt;&lt;rect
+           id="rect3247"
+           width="219.28572"
+           height="286.42856"
+           x="419.28571"
+           y="53.187862" /&gt;&lt;/flowRegion&gt;&lt;flowPara
+         id="flowPara3249"&gt;&lt;/flowPara&gt;&lt;/flowRoot&gt;  &lt;/g&gt;
+&lt;/svg&gt;
+</y:Resource>
+    </y:Resources>
+  </data>
+</graphml>
diff --git a/IBSW/doc/images/packet_tracker/CrIbMilBusPcktHandover.graphml b/IBSW/doc/images/packet_tracker/CrIbMilBusPcktHandover.graphml
new file mode 100644
index 0000000..7335b5c
--- /dev/null
+++ b/IBSW/doc/images/packet_tracker/CrIbMilBusPcktHandover.graphml
@@ -0,0 +1,914 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yEd 3.14.2-->
+  <key for="graphml" id="d0" yfiles.type="resources"/>
+  <key for="port" id="d1" yfiles.type="portgraphics"/>
+  <key for="port" id="d2" yfiles.type="portgeometry"/>
+  <key for="port" id="d3" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d4"/>
+  <key attr.name="description" attr.type="string" for="node" id="d5"/>
+  <key for="node" id="d6" yfiles.type="nodegraphics"/>
+  <key attr.name="Description" attr.type="string" for="graph" id="d7"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
+  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <data key="d7"/>
+    <node id="n0">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="40.0" width="40.0" x="241.23769841269842" y="0.0"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#27AE27" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="171.80078125" x="-183.80536823769842" y="4.0">CrIbMilBusPcktHandover<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="-0.5" nodeRatioX="-0.5" nodeRatioY="-0.5" offsetX="-12.004586987698417" offsetY="4.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n1">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="144.158203125" x="189.15859685019842" y="216.9375"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="105.21484375" x="19.4716796875" y="11.984375">Get buffer usage</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="70.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n2">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="144.158203125" x="189.15859685019842" y="381.84375"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="135.689453125" x="4.234375" y="11.984375">(2048 -  buffer usage)</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="70.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n3">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="238.73769841269842" y="446.72047057526834"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n4">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="144.158203125" x="189.15859685019842" y="585.3628906249999"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="100.26953125" x="21.9443359375" y="5.0">Add packet 
+to packet buffer</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="70.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n5">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="36.8595330752687" width="186.2752849603495" x="273.1917225991903" y="682.1092169247313"/>
+          <y:Fill hasColor="false" transparent="false"/>
+          <y:BorderStyle color="#999999" type="line" width="1.0"/>
+          <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Liberation Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.59375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="169.626953125" x="8.324165917674748" y="9.63289153763435">AD ... Acquisition Data</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="91.13764248017475" y="16.42976653763435">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n6">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="238.73769841269842" y="288.875"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n7">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="375.8757936507937" y="454.22047057526834"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="78.109375" x="-24.054687499999943" y="43.552734375">Return Error<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="1.887379141862766E-15" nodeRatioY="0.5" offsetX="0.0" offsetY="13.552734375" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n8">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="375.8757936507937" y="591.3316406249999"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="96.689453125" x="-7.887799413293692" y="42.533862500000055">Return Success<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.848564238306877" nodeRatioY="0.5" offsetX="0.0" offsetY="12.533862500000055" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n9">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="68.36328125000006" width="144.158203125" x="23.669112723214297" y="572.1499999999999"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="106.919921875" x="18.619140625" y="11.228515625">Add empty 
+segment to next 
+frame boundary</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="70.0791015625" y="32.181640625">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-3.885780586188048E-16" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n10">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="144.158203125" x="15.000263516865076" y="381.84375"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="131.875" x="6.1416015625" y="11.984375">(1024 - buffer usage)</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="70.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n11">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="64.57936507936508" y="482.07207031249993"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n12">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="144.158203125" x="189.15859685019842" y="70.0"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="96.888671875" x="23.634765625" y="11.984375">Get packet size</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="70.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n13">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="238.73769841269842" y="141.9375"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n14">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="32.68090911637474" y="99.51328124999998"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="44.224609375" x="25.286151275490333" y="24.44140625">AD
+Packet
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <edge id="e0" source="n0" target="n12">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.0" tx="0.0" ty="-20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e1" source="n14" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="42.628443124857554" sy="0.0" tx="-72.0791015625" ty="0.0">
+            <y:Point x="189.15859685019842" y="146.90781250000003"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e2" source="n1" target="n6">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="0.0" ty="-22.5"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e3" source="n6" target="n7">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="22.5" sy="0.0" tx="0.0" ty="-15.0">
+            <y:Point x="390.8757936507937" y="311.375"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="48.408203125" x="43.966993834480434" y="-8.984375">≥ 2048<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="2.0" distanceToCenter="false" position="center" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e4" source="n6" target="n2">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="22.5" tx="0.0" ty="-20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="48.408203125" x="-24.204104565817204" y="5.0">≥ 1024<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="2.0" distanceToCenter="false" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e5" source="n2" target="n3">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="0.0" ty="-22.5"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e6" source="n3" target="n7">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="22.5" sy="0.0" tx="-15.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="58.474609375" x="4.999996996682796" y="-8.984363409106606">&lt; packet<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="1.9999999999997726" distanceToCenter="false" position="center" ratio="0.0" segment="-1"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e7" source="n3" target="n4">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e8" source="n4" target="n14">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.958343505859375" tx="-47.39296339522298" ty="0.0">
+            <y:Point x="261.2376984126985" y="717.9078125"/>
+            <y:Point x="-4.9997364831349245" y="717.9078125"/>
+            <y:Point x="-4.9997364831349245" y="146.90781250000003"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e9" source="n4" target="n8">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="72.0997576713562" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e10" source="n9" target="n14">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-8.668849206349222" sy="34.186718749999955" tx="-46.4160080003421" ty="11.081423338993375">
+            <y:Point x="87.07936507936508" y="711.445945866667"/>
+            <y:Point x="2.524263516865048" y="711.445945866667"/>
+            <y:Point x="2.524263516865048" y="157.9892358389934"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e11" source="n9" target="n4">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="72.09975767135622" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e12" source="n6" target="n10">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="-22.5" sy="0.0" tx="0.0" ty="-20.96875">
+            <y:Point x="87.07936507936508" y="311.375"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="48.408203125" x="-114.5982889326792" y="-8.984375">&lt; 1024<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="1.9999999999998863" distanceToCenter="false" position="center" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e13" source="n10" target="n11">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="0.0" ty="-22.5"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e14" source="n11" target="n9">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="22.50244140625" tx="-8.668849206349222" ty="-5.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="58.474609375" x="-29.237308199443518" y="4.997546386718682">&lt; packet<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="20.697265624999737" distanceToCenter="false" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e15" source="n12" target="n13">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="20.96875" tx="0.0" ty="-22.5"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e16" source="n13" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="22.5" tx="0.0" ty="-20.96875"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="skewed_dash" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e17" source="n13" target="n7">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="22.5" sy="0.0" tx="15.0" ty="0.0">
+            <y:Point x="427.01979365079376" y="164.4375"/>
+            <y:Point x="427.01979365079376" y="469.22047057526834"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="48.408203125" x="16.674159277459523" y="-8.984375">&gt; 1024<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="2.0" distanceToCenter="false" position="center" ratio="0.10233491933575473" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e18" source="n11" target="n4">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="22.50244140625" sy="0.0" tx="-13.0" ty="-20.93215059166596">
+            <y:Point x="248.23769841269842" y="504.57207031249993"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d0">
+    <y:Resources>
+      <y:Resource id="1">&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
+&lt;!-- Created with Inkscape (http://www.inkscape.org/) --&gt;
+
+&lt;svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="181.51503"
+   height="181.50002"
+   id="svg6241"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="circular_buffer.svg"&gt;
+  &lt;defs
+     id="defs6243" /&gt;
+  &lt;sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4"
+     inkscape:cx="-191.78859"
+     inkscape:cy="95.848443"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1920"
+     inkscape:window-height="1014"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" /&gt;
+  &lt;metadata
+     id="metadata6246"&gt;
+    &lt;rdf:RDF&gt;
+      &lt;cc:Work
+         rdf:about=""&gt;
+        &lt;dc:format&gt;image/svg+xml&lt;/dc:format&gt;
+        &lt;dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /&gt;
+        &lt;dc:title&gt;&lt;/dc:title&gt;
+      &lt;/cc:Work&gt;
+    &lt;/rdf:RDF&gt;
+  &lt;/metadata&gt;
+  &lt;g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-745.67177,-616.55345)"&gt;
+    &lt;text
+       xml:space="preserve"
+       style="font-size:21.79795456px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Verdana;-inkscape-font-specification:Verdana"
+       x="383.44809"
+       y="710.9231"
+       id="text6873"
+       sodipodi:linespacing="125%"&gt;&lt;tspan
+         sodipodi:role="line"
+         id="tspan6875"
+         x="383.44809"
+         y="710.9231"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans Bold" /&gt;&lt;/text&gt;
+    &lt;path
+       transform="matrix(-0.94718199,-0.01879329,0.01879329,-0.94718199,929.26064,803.90098)"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       sodipodi:ry="80"
+       sodipodi:rx="80"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path6939-8-1"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       d="m 190,100 a 90,90 0 1 1 -180,0 90,90 0 1 1 180,0 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path4706-7-4"
+       style="fill:#f8f8f8;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:type="arc"
+       style="fill:#89acf3;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5917-9-6"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="90"
+       sodipodi:ry="90"
+       d="M 10,99.999996 A 90,90 0 1 1 145,177.94229 L 100,100 z"
+       sodipodi:start="3.1415927"
+       sodipodi:end="7.3303829" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:end="7.3303829"
+       sodipodi:start="5.2359878"
+       d="m 145,22.057716 a 90,90 0 0 1 0,155.884574 L 100,100 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path3653-6-2"
+       style="fill:#fbecd5;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,78"
+       id="path5943-6-2" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,-78"
+       id="path5953-2-0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 746.42177,707.30345 180,0"
+       id="path5921-6-0"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,797.30345 0,-180"
+       id="path5923-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,63"
+       id="path5925-7-9"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,-63"
+       id="path5927-9-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,-63"
+       id="path5929-2-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,63"
+       id="path5931-8-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,23"
+       id="path5933-1-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,45"
+       id="path5935-6-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,78"
+       id="path5937-5-4"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,87"
+       id="path5939-0-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,87"
+       id="path5941-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,45"
+       id="path5945-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,23"
+       id="path5947-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,-23"
+       id="path5949-9-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,-45"
+       id="path5951-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,-87 0,0"
+       id="path5955-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,-87"
+       id="path5957-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,-78"
+       id="path5959-8-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,-45"
+       id="path5961-4-1"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,-23"
+       id="path5963-6-8"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       sodipodi:type="arc"
+       style="fill:#c7e5f9;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5919-8-8"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="80"
+       sodipodi:ry="80"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       transform="matrix(0.90092879,0,0,0.90092879,746.3289,617.21058)" /&gt;
+    &lt;g
+       transform="translate(230.43873,464.77132)"
+       id="g8379"
+       style="fill:#1166ad;fill-opacity:1;stroke:none;display:inline"&gt;
+      &lt;path
+         style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#1166ad;fill-opacity:1;stroke:none;stroke-width:3.95015383;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+         d="m 525.52266,251.41302 a 2.0002,2.0002 0 0 0 -1.89866,2.31003 c 5.92694,43.90653 45.35328,75.43234 89.49019,71.57949 a 2.001176,2.001176 0 1 0 -0.34809,-3.98718 C 570.71635,324.986 533.25785,295.01535 527.61119,253.1851 a 2.0002,2.0002 0 0 0 -2.08853,-1.77208 z"
+         id="path7578-8-2"
+         inkscape:connector-curvature="0" /&gt;
+      &lt;path
+         style="fill:#1166ad;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         d="m 617.54256,322.91708 -6.54593,4.58663 -0.6957,-7.9697 7.24163,3.38307 z"
+         id="path8385"
+         inkscape:connector-curvature="0" /&gt;
+    &lt;/g&gt;
+    &lt;flowRoot
+       xml:space="preserve"
+       id="flowRoot3243"
+       style="font-size:8px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       transform="translate(264.88555,551.83968)"&gt;&lt;flowRegion
+         id="flowRegion3245"&gt;&lt;rect
+           id="rect3247"
+           width="219.28572"
+           height="286.42856"
+           x="419.28571"
+           y="53.187862" /&gt;&lt;/flowRegion&gt;&lt;flowPara
+         id="flowPara3249"&gt;&lt;/flowPara&gt;&lt;/flowRoot&gt;  &lt;/g&gt;
+&lt;/svg&gt;
+</y:Resource>
+    </y:Resources>
+  </data>
+</graphml>
diff --git a/IBSW/doc/images/packet_tracker/CrIbMilBusPcktHandover.png b/IBSW/doc/images/packet_tracker/CrIbMilBusPcktHandover.png
new file mode 100644
index 0000000000000000000000000000000000000000..87a388b50acd2838dfdc03db13e2c78ae0ad55af
GIT binary patch
literal 115460
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%0A|+KnAy){Y3i`Ft-ssbO&0B;
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

literal 0
HcmV?d00001

diff --git a/IBSW/doc/images/packet_tracker/CrIbObcPcktCollect.graphml b/IBSW/doc/images/packet_tracker/CrIbObcPcktCollect.graphml
new file mode 100644
index 0000000..6b4b566
--- /dev/null
+++ b/IBSW/doc/images/packet_tracker/CrIbObcPcktCollect.graphml
@@ -0,0 +1,601 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yEd 3.14.1-->
+  <key for="graphml" id="d0" yfiles.type="resources"/>
+  <key for="port" id="d1" yfiles.type="portgraphics"/>
+  <key for="port" id="d2" yfiles.type="portgeometry"/>
+  <key for="port" id="d3" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d4"/>
+  <key attr.name="description" attr.type="string" for="node" id="d5"/>
+  <key for="node" id="d6" yfiles.type="nodegraphics"/>
+  <key attr.name="Description" attr.type="string" for="graph" id="d7"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
+  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <data key="d7"/>
+    <node id="n0">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="40.0" width="40.0" x="765.8983301313199" y="648.9453125000003"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#27AE27" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="133.57421875" x="57.57976810515879" y="11.015625">CrIbObcPcktCollect<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.0" nodeRatioX="0.5" nodeRatioY="0.0" offsetX="17.57976810515879" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n1">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="128.158203125" x="721.8192285688199" y="563.0078125000003"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="113.08984375" x="7.5341796875" y="5.0">Check OBC
+Packet Size Buffer</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="62.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n2">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="583.7966602626398" y="536.5820312500002"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="58.50390625" x="18.146502837990283" y="24.441406250000057">OBC Size
+Circular
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n3">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Gateway.withShadow">
+          <y:Geometry height="45.0" width="45.0" x="763.3983301313199" y="474.00781250000034"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#E38B00" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="20.5" y="20.5"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="GATEWAY_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n4">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="893.2030880740194" y="481.50781250000034"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="79.609375" x="-24.8046875" y="44.50781249999966">Return False<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="14.507812499999659" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n5">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
+          <y:Geometry height="30.0" width="30.0" x="770.8983301313199" y="228.13281250000034"/>
+          <y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
+          <y:BorderStyle color="#B11F1F" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="75.63671875" x="-88.71668950631988" y="6.015625">Return True<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="0.0" nodeRatioX="-0.5" nodeRatioY="0.0" offsetX="-13.07997075631988" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_END"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n6">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="128.158203125" x="721.8192285688199" y="388.07031250000034"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="75.21484375" x="26.4716796875" y="5.0">Get size of
+next packet</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="62.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n7">
+      <data key="d6">
+        <y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
+          <y:Geometry height="41.9375" width="128.158203125" x="721.8192285688199" y="302.13281250000034"/>
+          <y:Fill color="#C7E5F9" transparent="false"/>
+          <y:BorderStyle color="#1266AC" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="84.408203125" x="21.875" y="5.0">Extract to
+packet buffer</y:NodeLabel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" textColor="#000000" visible="true" width="4.0" x="62.0791015625" y="18.96875">
+            <y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
+            <y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
+            <y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
+          </y:StyleProperties>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n8">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="94.78906250000011" width="94.79691192598067" x="583.7966602626398" y="275.7070312500003"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="45.90625" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="50.470703125" x="22.163104400490283" y="24.441406250000057">OBC
+Circular
+Buffer</y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <edge id="e0" source="n0" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e1" source="n2" target="n1">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e2" source="n1" target="n3">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e3" source="n3" target="n4">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="42.6953125" x="5.015761771944881" y="-8.984374999999659">Empty<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e4" source="n2" target="n6">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="631.3758876568102" y="409.03906250000034"/>
+          </y:Path>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e5" source="n3" target="n6">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e6" source="n6" target="n7">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e7" source="n7" target="n5">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="line" width="1.0"/>
+          <y:Arrows source="none" target="delta"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+    <edge id="e8" source="n8" target="n7">
+      <data key="d10">
+        <y:GenericEdge configuration="com.yworks.bpmn.Connection">
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#808080" type="dotted" width="2.0"/>
+          <y:Arrows source="none" target="concave"/>
+          <y:StyleProperties>
+            <y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="CONNECTION_TYPE_SEQUENCE_FLOW"/>
+          </y:StyleProperties>
+        </y:GenericEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d0">
+    <y:Resources>
+      <y:Resource id="1">&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
+&lt;!-- Created with Inkscape (http://www.inkscape.org/) --&gt;
+
+&lt;svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="181.51503"
+   height="181.50002"
+   id="svg6241"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="circular_buffer.svg"&gt;
+  &lt;defs
+     id="defs6243" /&gt;
+  &lt;sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4"
+     inkscape:cx="-191.78859"
+     inkscape:cy="95.848443"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1920"
+     inkscape:window-height="1014"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" /&gt;
+  &lt;metadata
+     id="metadata6246"&gt;
+    &lt;rdf:RDF&gt;
+      &lt;cc:Work
+         rdf:about=""&gt;
+        &lt;dc:format&gt;image/svg+xml&lt;/dc:format&gt;
+        &lt;dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /&gt;
+        &lt;dc:title&gt;&lt;/dc:title&gt;
+      &lt;/cc:Work&gt;
+    &lt;/rdf:RDF&gt;
+  &lt;/metadata&gt;
+  &lt;g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-745.67177,-616.55345)"&gt;
+    &lt;text
+       xml:space="preserve"
+       style="font-size:21.79795456px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Verdana;-inkscape-font-specification:Verdana"
+       x="383.44809"
+       y="710.9231"
+       id="text6873"
+       sodipodi:linespacing="125%"&gt;&lt;tspan
+         sodipodi:role="line"
+         id="tspan6875"
+         x="383.44809"
+         y="710.9231"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans Bold" /&gt;&lt;/text&gt;
+    &lt;path
+       transform="matrix(-0.94718199,-0.01879329,0.01879329,-0.94718199,929.26064,803.90098)"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       sodipodi:ry="80"
+       sodipodi:rx="80"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path6939-8-1"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       d="m 190,100 a 90,90 0 1 1 -180,0 90,90 0 1 1 180,0 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path4706-7-4"
+       style="fill:#f8f8f8;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:type="arc"
+       style="fill:#89acf3;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5917-9-6"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="90"
+       sodipodi:ry="90"
+       d="M 10,99.999996 A 90,90 0 1 1 145,177.94229 L 100,100 z"
+       sodipodi:start="3.1415927"
+       sodipodi:end="7.3303829" /&gt;
+    &lt;path
+       transform="translate(736.42177,607.30346)"
+       sodipodi:end="7.3303829"
+       sodipodi:start="5.2359878"
+       d="m 145,22.057716 a 90,90 0 0 1 0,155.884574 L 100,100 z"
+       sodipodi:ry="90"
+       sodipodi:rx="90"
+       sodipodi:cy="100"
+       sodipodi:cx="100"
+       id="path3653-6-2"
+       style="fill:#fbecd5;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       sodipodi:type="arc" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,78"
+       id="path5943-6-2" /&gt;
+    &lt;path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 45,-78"
+       id="path5953-2-0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 746.42177,707.30345 180,0"
+       id="path5921-6-0"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,797.30345 0,-180"
+       id="path5923-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,63"
+       id="path5925-7-9"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,-63"
+       id="path5927-9-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 63,-63"
+       id="path5929-2-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -63,63"
+       id="path5931-8-6"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,23"
+       id="path5933-1-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,45"
+       id="path5935-6-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,78"
+       id="path5937-5-4"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,87"
+       id="path5939-0-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,87"
+       id="path5941-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,45"
+       id="path5945-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,23"
+       id="path5947-8-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 87,-23"
+       id="path5949-9-7"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 78,-45"
+       id="path5951-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 23,-87 0,0"
+       id="path5955-5-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -23,-87"
+       id="path5957-0-5"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -45,-78"
+       id="path5959-8-3"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -78,-45"
+       id="path5961-4-1"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       style="opacity:0.30449829;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.66528931;stroke-dasharray:none;display:inline"
+       d="m 836.42177,707.30345 -87,-23"
+       id="path5963-6-8"
+       inkscape:connector-curvature="0" /&gt;
+    &lt;path
+       sodipodi:type="arc"
+       style="fill:#c7e5f9;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path5919-8-8"
+       sodipodi:cx="100"
+       sodipodi:cy="100"
+       sodipodi:rx="80"
+       sodipodi:ry="80"
+       d="m 180,100 a 80,80 0 1 1 -160,0 80,80 0 1 1 160,0 z"
+       transform="matrix(0.90092879,0,0,0.90092879,746.3289,617.21058)" /&gt;
+    &lt;g
+       transform="translate(230.43873,464.77132)"
+       id="g8379"
+       style="fill:#1166ad;fill-opacity:1;stroke:none;display:inline"&gt;
+      &lt;path
+         style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#1166ad;fill-opacity:1;stroke:none;stroke-width:3.95015383;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+         d="m 525.52266,251.41302 a 2.0002,2.0002 0 0 0 -1.89866,2.31003 c 5.92694,43.90653 45.35328,75.43234 89.49019,71.57949 a 2.001176,2.001176 0 1 0 -0.34809,-3.98718 C 570.71635,324.986 533.25785,295.01535 527.61119,253.1851 a 2.0002,2.0002 0 0 0 -2.08853,-1.77208 z"
+         id="path7578-8-2"
+         inkscape:connector-curvature="0" /&gt;
+      &lt;path
+         style="fill:#1166ad;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         d="m 617.54256,322.91708 -6.54593,4.58663 -0.6957,-7.9697 7.24163,3.38307 z"
+         id="path8385"
+         inkscape:connector-curvature="0" /&gt;
+    &lt;/g&gt;
+    &lt;flowRoot
+       xml:space="preserve"
+       id="flowRoot3243"
+       style="font-size:8px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       transform="translate(264.88555,551.83968)"&gt;&lt;flowRegion
+         id="flowRegion3245"&gt;&lt;rect
+           id="rect3247"
+           width="219.28572"
+           height="286.42856"
+           x="419.28571"
+           y="53.187862" /&gt;&lt;/flowRegion&gt;&lt;flowPara
+         id="flowPara3249"&gt;&lt;/flowPara&gt;&lt;/flowRoot&gt;  &lt;/g&gt;
+&lt;/svg&gt;
+</y:Resource>
+    </y:Resources>
+  </data>
+</graphml>
diff --git a/IBSW/doc/images/packet_tracker/CrIbObcPcktCollect.png b/IBSW/doc/images/packet_tracker/CrIbObcPcktCollect.png
new file mode 100644
index 0000000000000000000000000000000000000000..38e62eba958001589a4f1b99375e5b8df8004912
GIT binary patch
literal 33508
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

literal 0
HcmV?d00001

diff --git a/IBSW/include/ahb.h b/IBSW/include/ahb.h
new file mode 100644
index 0000000..fb7f0bf
--- /dev/null
+++ b/IBSW/include/ahb.h
@@ -0,0 +1,40 @@
+/**
+ * @file   ahb.h
+ * @ingroup ahb
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   March, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef AHB_H
+#define AHB_H
+
+#include <stdint.h>
+
+/**
+ * @see GR712-UM v2.3 p. 71
+ */
+#define AHB_STATUS_HSIZE	0x00000007
+#define AHB_STATUS_HMASTER	0x00000078
+#define AHB_STATUS_HWRITE	0x00000080
+#define AHB_STATUS_NE		0x00000100
+#define AHB_STATUS_CE		0x00000200
+
+
+void ahbstat_clear_new_error(void);
+uint32_t ahbstat_get_status(void);
+uint32_t ahbstat_new_error(void);
+uint32_t ahbstat_correctable_error(void);
+uint32_t ahbstat_get_failing_addr(void);
+
+#endif /* AHB_H */
diff --git a/IBSW/include/asm/leon.h b/IBSW/include/asm/leon.h
new file mode 100644
index 0000000..311934f
--- /dev/null
+++ b/IBSW/include/asm/leon.h
@@ -0,0 +1,208 @@
+/**
+ * @file asm/leon.h
+ *
+ * @author  Armin Luntzer (armin.luntzer@univie.ac.at)
+ * @date    2015
+ *
+ * @copyright GPLv2
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief assembly functions for the leon3 target
+ *
+ */
+
+#ifndef ASM_LEON_H
+#define ASM_LEON_H
+
+#include <stdint.h>
+
+#if (__sparc__)
+
+
+#define ASI_LEON3_SYSCTRL	0x02
+
+#define ASI_LEON3_SYSCTRL_CCR	0x00
+#define ASI_LEON3_SYSCTRL_ICFG	0x08
+#define ASI_LEON3_SYSCTRL_DCFG	0x0c
+
+
+
+
+__attribute__((unused))
+static uint32_t leon3_asr17()
+{
+	uint32_t asr17;
+
+	__asm__ __volatile__ (
+			"rd	%%asr17, %0	\n\t"
+			:"=r" (asr17)
+			);
+
+	return asr17;
+}
+
+__attribute__((unused))
+static uint32_t leon3_cpuid()
+{
+	uint32_t cpuid;
+
+	__asm__ __volatile__ (
+			"rd	%%asr17, %0	\n\t"
+			"srl	%0, 28, %0	\n\t"
+			:"=r" (cpuid)
+			:
+			:"l1");
+        return cpuid;
+}
+
+__attribute__((unused))
+static void leon3_powerdown_safe(uint32_t phys_memaddr)
+{
+	__asm__ __volatile__(
+			"wr	%%g0, %%asr19	\n\t"
+			"lda	[%0] 0x1c, %%g0	\n\t"
+			:
+			:"r" (phys_memaddr)
+			:"memory");
+}
+
+__attribute__((unused))
+static void leon3_flush()
+{
+	__asm__ __volatile__(
+			"flush			\n\t"
+			"set	0x81000f, %%g1	\n\t"
+			"sta	%%g1, [%0] %1	\n\t"
+			:
+			: "r" (ASI_LEON3_SYSCTRL_CCR),
+			  "i" (ASI_LEON3_SYSCTRL)
+			: "g1");
+}
+
+__attribute__((unused))
+static void leon3_enable_icache()
+{
+	__asm__ __volatile__(
+			"lda	[%0] %1, %%l1		\n\t"
+			"set	0x3,     %%l2		\n\t"
+			"or	%%l2,	  %%l1,	%%l2	\n\t"
+			"sta	%%l2, [%0] %1		\n\t"
+			:
+			: "r" (ASI_LEON3_SYSCTRL_CCR),
+			  "i" (ASI_LEON3_SYSCTRL)
+			: "l1", "l2");
+}
+
+__attribute__((unused))
+static void leon3_enable_dcache()
+{
+	__asm__ __volatile__(
+			"lda	[%0] %1, %%l1		\n\t"
+			"set	0xc,     %%l2		\n\t"
+			"or	%%l2,	  %%l1,	%%l2	\n\t"
+			"sta	%%l2, [%0] %1		\n\t"
+			:
+			: "r" (ASI_LEON3_SYSCTRL_CCR),
+			  "i" (ASI_LEON3_SYSCTRL)
+			: "l1", "l2");
+}
+
+
+__attribute__((unused))
+static void leon3_enable_snooping()
+{
+	__asm__ __volatile__(
+			"lda	[%0] %1, %%l1		\n\t"
+			"set	0x800000, %%l2		\n\t"
+			"or	%%l2,	  %%l1,	%%l2	\n\t"
+			"sta	%%l2, [%0] %1		\n\t"
+			:
+			: "r" (ASI_LEON3_SYSCTRL_CCR),
+			  "i" (ASI_LEON3_SYSCTRL)
+			: "l1", "l2");
+}
+
+__attribute__((unused))
+static void leon3_enable_fault_tolerant()
+{
+	__asm__ __volatile__(
+			"lda	[%0] %1, %%l1		\n\t"
+			"set	0x80000, %%l2		\n\t"
+			"or	%%l2,	  %%l1,	%%l2	\n\t"
+			"sta	%%l2, [%0] %1		\n\t"
+			:
+			: "r" (ASI_LEON3_SYSCTRL_CCR),
+			  "i" (ASI_LEON3_SYSCTRL)
+			: "l1", "l2");
+}
+
+
+
+
+__attribute__((unused))
+static void leon_set_sp(uint32_t stack_addr)
+{
+	__asm__ __volatile__(
+			"mov %0, %%sp\n\t"
+			:
+			:"r"(stack_addr)
+			:"memory");
+}
+
+__attribute__((unused))
+static void leon_set_fp(uint32_t stack_addr)
+{
+	__asm__ __volatile__(
+			"mov %0, %%fp\n\t"
+			:
+			:"r" (stack_addr)
+			:"memory");
+}
+
+__attribute__((unused))
+static void leon_reg_win_flush(void)
+{
+	__asm__ __volatile__("ta 3");
+}
+
+#else /* dummy functions */
+
+#if (__unused__)
+__attribute__((unused))
+static uint32_t leon3_asr17()
+{
+	return 0;
+}
+#endif
+
+__attribute__((unused))
+static uint32_t leon3_cpuid()
+{
+	return 0;
+}
+
+#if (__unused__)
+__attribute__((unused))
+static void leon3_powerdown_safe(__attribute__((unused)) uint32_t phys_memaddr)
+{
+}
+#endif
+
+__attribute__((unused))
+static void leon_reg_win_flush(void)
+{
+}
+
+
+#endif
+
+
+#endif /* ASM_LEON_H */
diff --git a/IBSW/include/byteorder.h b/IBSW/include/byteorder.h
new file mode 100644
index 0000000..b039705
--- /dev/null
+++ b/IBSW/include/byteorder.h
@@ -0,0 +1,273 @@
+/**
+ * @file   byteorder.h
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * This is a set of macros for consistent endianess conversion. They work
+ * for both little and big endian cpus.
+ *
+ * conversion of XX-bit integers (16- or 32-) between native CPU format
+ * and little/big endian format:
+ *	cpu_to_[bl]eXX(uintXX_t x)
+ *	[bl]eXX_to_cpu(uintXX_t x)
+ *
+ * the same, but change in situ:
+ *	cpu_to_[bl]eXXs(uintXX_t x)
+ *	[bl]eXX_to_cpus(uintXX_t x)
+ *
+ *
+ * This is based on the byte order macros from the linux kernel, see:
+ * include/linux/byteorder/generic.h
+ * include/uapi/linux/swab.h
+ * include/uapi/linux/byteorder/big_endian.h
+ * include/uapi/linux/byteorder/little_endian.h
+ * by @author Linus Torvalds et al.
+ *
+ */
+#ifndef BYTEORDER_H
+#define BYTEORDER_H
+
+#include <stdint.h>
+
+
+
+#ifdef __BIG_ENDIAN
+#undef __BIG_ENDIAN
+#endif
+
+#ifdef __LITTLE_ENDIAN
+#undef __LITTLE_ENDIAN
+#endif
+
+#if (__sparc__)
+#ifndef __BIG_ENDIAN
+#define __BIG_ENDIAN 4321
+#endif
+#endif
+
+#if (__i386__ || __x86_64__)
+#ifndef __LITTLE_ENDIAN
+#define __LITTLE_ENDIAN 1234
+#endif
+#endif
+
+
+#define ___constant_swab16(x) ((uint16_t)(			\
+	(((uint16_t)(x) & (uint16_t)0x00ffU) << 8) |		\
+	(((uint16_t)(x) & (uint16_t)0xff00U) >> 8)))
+
+#define ___constant_swab32(x) ((uint32_t)(			\
+	(((uint32_t)(x) & (uint32_t)0x000000ffUL) << 24) |	\
+	(((uint32_t)(x) & (uint32_t)0x0000ff00UL) <<  8) |	\
+	(((uint32_t)(x) & (uint32_t)0x00ff0000UL) >>  8) |	\
+	(((uint32_t)(x) & (uint32_t)0xff000000UL) >> 24)))
+
+
+#ifdef USE_BUILTIN_BSWAP
+#if GCC_VERSION >= 40400
+#define __HAVE_BUILTIN_BSWAP32__
+#endif
+#if GCC_VERSION >= 40800
+#define __HAVE_BUILTIN_BSWAP16__
+#endif
+#endif /* USE_BUILTIN_BSWAP */
+
+
+static inline __attribute__((const)) uint16_t __fswab16(uint16_t val)
+{
+#ifdef __HAVE_BUILTIN_BSWAP16__
+	return __builtin_bswap16(val);
+#else
+	return ___constant_swab16(val);
+#endif
+}
+
+
+static inline __attribute__((const)) uint32_t __fswab32(uint32_t val)
+{
+#ifdef __HAVE_BUILTIN_BSWAP32__
+	return __builtin_bswap32(val);
+#else
+	return ___constant_swab32(val);
+#endif
+}
+
+
+/**
+ * @brief return a byteswapped 16-bit value
+ * @param x value to byteswap
+ */
+
+#define __swab16(x)				\
+	(__builtin_constant_p((uint16_t)(x)) ?	\
+	___constant_swab16(x) :			\
+	__fswab16(x))
+
+
+/**
+ * @brief return a byteswapped 32-bit value
+ * @param x a value to byteswap
+ */
+
+#define __swab32(x)				\
+	(__builtin_constant_p((uint32_t)(x)) ?	\
+	___constant_swab32(x) :			\
+	__fswab32(x))
+
+
+/**
+ * @brief return a byteswapped 16-bit value from a pointer
+ * @param p a pointer to a naturally-aligned 16-bit value
+ */
+static inline uint16_t __swab16p(const uint16_t *p)
+{
+	return __swab16(*p);
+}
+
+
+/**
+ * @brief return a byteswapped 32-bit value from a pointer
+ * @param p a pointer to a naturally-aligned 32-bit value
+ */
+static inline uint32_t __swab32p(const uint32_t *p)
+{
+	return __swab32(*p);
+}
+
+
+/**
+ * @brief byteswap a 16-bit value in-place
+ * @param p a pointer to a naturally-aligned 16-bit value
+ */
+
+static inline void __swab16s(uint16_t *p)
+{
+	*p = __swab16p(p);
+}
+
+
+/**
+ * @brief byteswap a 32-bit value in-place
+ * @param p a pointer to a naturally-aligned 32-bit value
+ */
+
+static inline void __swab32s(uint32_t *p)
+{
+	*p = __swab32p(p);
+}
+
+
+
+#ifdef __BIG_ENDIAN
+
+#define __cpu_to_le16(x)   ((uint16_t)__swab16((x)))
+#define __cpu_to_le32(x)   ((uint32_t)__swab32((x)))
+
+#define __cpu_to_le16s(x)  __swab16s((x))
+#define __cpu_to_le32s(x)  __swab32s((x))
+
+#define __cpu_to_be16(x)   ((uint16_t)(x))
+#define __cpu_to_be32(x)   ((uint32_t)(x))
+
+#define __cpu_to_be16s(x)  { (void)(x); }
+#define __cpu_to_be32s(x)  { (void)(x); }
+
+
+
+#define __le16_to_cpu(x)   __swab16((uint16_t)(x))
+#define __le32_to_cpu(x)   __swab32((uint32_t)(x))
+
+#define __le16_to_cpus(x)  __swab16s((x))
+#define __le32_to_cpus(x)  __swab32s((x))
+
+#define __be16_to_cpu(x)   ((uint16_t)(x))
+#define __be32_to_cpu(x)   ((uint32_t)(x))
+
+#define __be16_to_cpus(x)  { (void)(x); }
+#define __be32_to_cpus(x)  { (void)(x); }
+
+#endif /* __BIG_ENDIAN */
+
+
+#ifdef __LITTLE_ENDIAN
+
+#define __cpu_to_le16(x)   ((uint16_t)(x))
+#define __cpu_to_le32(x)   ((uint32_t)(x))
+
+#define __cpu_to_le16s(x)  { (void)(x); }
+#define __cpu_to_le32s(x)  { (void)(x); }
+
+#define __cpu_to_be16(x)   ((uint16_t)__swab16((x)))
+#define __cpu_to_be32(x)   ((uint32_t)__swab32((x)))
+
+#define __cpu_to_be16s(x)  __swab16s((x))
+#define __cpu_to_be32s(x)  __swab32s((x))
+
+
+
+#define __le16_to_cpu(x)  ((uint16_t)(x))
+#define __le32_to_cpu(x)  ((uint32_t)(x))
+
+#define __le32_to_cpus(x) { (void)(x); }
+#define __le16_to_cpus(x) { (void)(x); }
+
+#define __be16_to_cpu(x)  __swab16((uint16_t)(uint16_t)(x))
+#define __be32_to_cpu(x)  __swab32((uint32_t)(uint32_t)(x))
+
+#define __be16_to_cpus(x) __swab16s((x))
+#define __be32_to_cpus(x) __swab32s((x))
+
+#endif /* __LITTLE_ENDIAN */
+
+
+
+/** these are the conversion macros */
+
+/** convert cpu order to little endian */
+#define cpu_to_le16  __cpu_to_le16
+#define cpu_to_le32  __cpu_to_le32
+
+/** in-place convert cpu order to little endian */
+#define cpu_to_le16s __cpu_to_le16s
+#define cpu_to_le32s __cpu_to_le32s
+
+/** convert cpu order to big endian */
+#define cpu_to_be16  __cpu_to_be16
+#define cpu_to_be32  __cpu_to_be32
+
+/** in-place convert cpu order to big endian */
+#define cpu_to_be16s __cpu_to_be16s
+#define cpu_to_be32s __cpu_to_be32s
+
+
+/* same, but in reverse */
+
+/** convert little endian to cpu order*/
+#define le16_to_cpu  __le16_to_cpu
+#define le32_to_cpu  __le32_to_cpu
+
+/** in-place convert little endian to cpu order*/
+#define le16_to_cpus __le16_to_cpus
+#define le32_to_cpus __le32_to_cpus
+
+/** convert big endian to cpu order*/
+#define be16_to_cpu  __be16_to_cpu
+#define be32_to_cpu  __be32_to_cpu
+
+/** in-place convert big endian to cpu order*/
+#define be16_to_cpus __be16_to_cpus
+#define be32_to_cpus __be32_to_cpus
+
+
+
+#endif /* BYTEORDER_H */
diff --git a/IBSW/include/circular_buffer16.h b/IBSW/include/circular_buffer16.h
new file mode 100644
index 0000000..0bd045b
--- /dev/null
+++ b/IBSW/include/circular_buffer16.h
@@ -0,0 +1,45 @@
+/**
+ * @file    circular_buffer16.h
+ * @ingroup circular_buffer16
+ * @author  Armin Luntzer (armin.luntzer@univie.ac.at)
+ * @date    October, 2013
+ *
+ * @copyright 
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef CIRCULAR_BUFFER16_H
+#define CIRCULAR_BUFFER16_H
+
+#include <stdint.h>
+
+struct circular_buffer16 {
+	uint16_t *p_buf_start;
+	uint32_t   num_elem;
+	uint32_t   read_pos;
+	uint32_t   write_pos;
+};
+
+int32_t cbuf_init16(struct circular_buffer16 *p_buf, uint16_t* p_buf_start, uint32_t buffer_size);
+void cbuf_reset16(struct circular_buffer16 *p_buf);
+
+uint32_t cbuf_read16 (struct circular_buffer16 *p_buf, uint16_t* dest, uint32_t elem);
+uint32_t cbuf_write16(struct circular_buffer16 *p_buf, uint16_t* src,  uint32_t elem);
+uint32_t cbuf_peek16 (struct circular_buffer16 *p_buf, uint16_t* dest, uint32_t elem);
+
+uint32_t cbuf_get_used16(struct circular_buffer16 *p_buf);
+uint32_t cbuf_get_free16(struct circular_buffer16 *p_buf);
+
+uint32_t cbuf_forward16(struct circular_buffer16 *p_buf, uint32_t elem);
+
+
+
+#endif
diff --git a/IBSW/include/circular_buffer8.h b/IBSW/include/circular_buffer8.h
new file mode 100644
index 0000000..c18bec8
--- /dev/null
+++ b/IBSW/include/circular_buffer8.h
@@ -0,0 +1,45 @@
+/**
+ * @file    circular_buffer8.h
+ * @ingroup circular_buffer8
+ * @author  Armin Luntzer (armin.luntzer@univie.ac.at)
+ * @date    October, 2013
+ *
+ * @copyright 
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef CIRCULAR_BUFFER8_H
+#define CIRCULAR_BUFFER8_H
+
+#include <stdint.h>
+
+struct circular_buffer8 {
+	uint8_t *p_buf_start;
+	uint32_t   num_elem;
+	uint32_t   read_pos;
+	uint32_t   write_pos;
+};
+
+int32_t cbuf_init8(struct circular_buffer8 *p_buf, uint8_t* p_buf_start, uint32_t buffer_size);
+void cbuf_reset8(struct circular_buffer8 *p_buf);
+
+uint32_t cbuf_read8 (struct circular_buffer8 *p_buf, uint8_t* dest, uint32_t elem);
+uint32_t cbuf_write8(struct circular_buffer8 *p_buf, uint8_t* src,  uint32_t elem);
+uint32_t cbuf_peek8 (struct circular_buffer8 *p_buf, uint8_t* dest, uint32_t elem);
+
+uint32_t cbuf_get_used8(struct circular_buffer8 *p_buf);
+uint32_t cbuf_get_free8(struct circular_buffer8 *p_buf);
+
+uint32_t cbuf_forward8(struct circular_buffer8 *p_buf, uint32_t elem);
+
+
+
+#endif
diff --git a/IBSW/include/clkgate.h b/IBSW/include/clkgate.h
new file mode 100644
index 0000000..bc629ce
--- /dev/null
+++ b/IBSW/include/clkgate.h
@@ -0,0 +1,50 @@
+/**
+ * @file   clkgate.h
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   September, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief description of the clock gating register on the GR712RC
+ */
+
+#ifndef CLKGATE_H
+#define CLKGATE_H
+
+
+
+#define CLKGATE_GRETH		0x00000001
+#define CLKGATE_GRSPW0		0x00000002
+#define CLKGATE_GRSPW1		0x00000004
+#define CLKGATE_GRSPW2		0x00000008
+#define CLKGATE_GRSPW3		0x00000010
+#define CLKGATE_GRSPW4		0x00000020
+#define CLKGATE_GRSPW5		0x00000040
+#define CLKGATE_CAN		0x00000080
+
+/* bit 8 is proprietary */
+
+#define CLKGATE_CCSDS_TM	0x00000200
+#define CLKGATE_CCSDS_TC	0x00000400
+#define CLKGATE_1553BRM		0x00000800
+
+#define CLKGATE_BASE		0x80000D00
+
+__attribute__((unused))
+static struct gr712_clkgate {
+	uint32_t unlock;
+	uint32_t clk_enable;
+	uint32_t core_reset;
+} *clkgate = (struct gr712_clkgate *) CLKGATE_BASE;
+
+
+
+#endif
diff --git a/IBSW/include/compiler.h b/IBSW/include/compiler.h
new file mode 100644
index 0000000..7bf73af
--- /dev/null
+++ b/IBSW/include/compiler.h
@@ -0,0 +1,46 @@
+/**
+ * @file   compiler.h
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief a collection of preprocessor macros
+ */
+
+
+#ifndef COMPILER_H
+#define COMPILER_H
+
+
+/**
+ * Compile time check usable outside of function scope.
+ * Stolen from Linux (hpi_internal.h)
+ */
+#define compile_time_assert(cond, msg) typedef char ASSERT_##msg[(cond) ? 1 : -1]
+
+
+/**
+ * same with the stuff below
+ */
+
+#define likely(x)      __builtin_expect(!!(x), 1)
+#define unlikely(x)    __builtin_expect(!!(x), 0)
+
+
+#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
+
+/* optimisation barrier */
+#define barrier() __asm__ __volatile__("": : :"memory")
+
+#define cpu_relax() barrier()
+
+#endif
diff --git a/IBSW/include/core1553brm_as250.h b/IBSW/include/core1553brm_as250.h
new file mode 100644
index 0000000..3c2dc77
--- /dev/null
+++ b/IBSW/include/core1553brm_as250.h
@@ -0,0 +1,766 @@
+/**
+ * @file   core1553brm_as250.h
+ * @ingroup core1553brm_as250
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   July, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef CORE_1553_AS250_BRM_H
+#define CORE_1553_AS250_BRM_H
+
+
+
+/* compile time check usable outside of function scope
+ * stolen from Linux (hpi_internal.h)
+ */
+#define compile_time_assert(cond, msg)\
+		typedef char ASSERT_##msg[(cond) ? 1 : -1]
+
+
+
+/*
+ * AS250 protocol related
+ */
+
+
+#define AS250_TRANSFER_FRAME_SIZE 1024
+
+
+#define AS250_INITIALIZATION_COMPLETE	0x0001
+#define AS250_RT_NOT_SYNCHRIONIZED	0x0800
+
+#define AS250_MC_RESET_RT		8
+#define AS250_MC_SYNC_W_DWORD		17
+
+/* RX SA assignment */
+#define AS250_SA_RX_TERMCFG	1
+#define AS250_SA_RX_DDB_01	11
+#define AS250_SA_RX_DDB_02	12
+#define AS250_SA_RX_DDB_03	13
+#define AS250_SA_RX_DDB_04	14
+#define AS250_SA_RX_DDB_05	15
+#define AS250_SA_RX_DDB_06	16
+#define AS250_SA_RX_DDB_07	17
+#define AS250_SA_RX_DDB_08	18
+#define AS250_SA_RX_DDB_09	19
+#define AS250_SA_RX_DDB_10	20
+#define AS250_SA_RX_DDB_11	21
+#define AS250_SA_RX_DDB_12	22
+#define AS250_SA_RX_DDB_13	23
+#define AS250_SA_RX_DDB_14	24
+#define AS250_SA_RX_DDB_15	25
+#define AS250_SA_RX_DDB_16	26
+#define AS250_SA_RX_DTD		27
+#define AS250_SA_RX_TIME	29
+#define AS250_SA_RX_DWRAP	30
+
+/* TX SA assignment */
+#define AS250_SA_TX_HLTHMON	1
+#define AS250_SA_TX_ADB_01	11
+#define AS250_SA_TX_ADB_02	12
+#define AS250_SA_TX_ADB_03	13
+#define AS250_SA_TX_ADB_04	14
+#define AS250_SA_TX_ADB_05	15
+#define AS250_SA_TX_ADB_06	16
+#define AS250_SA_TX_ADB_07	17
+#define AS250_SA_TX_ADB_08	18
+#define AS250_SA_TX_ADB_09	19
+#define AS250_SA_TX_ADB_10	20
+#define AS250_SA_TX_ADB_11	21
+#define AS250_SA_TX_ADB_12	22
+#define AS250_SA_TX_ADB_13	23
+#define AS250_SA_TX_ADB_14	24
+#define AS250_SA_TX_ADB_15	25
+#define AS250_SA_TX_ADB_16	26
+#define AS250_SA_TX_DTC		27
+#define AS250_SA_TX_ATR		28
+#define AS250_SA_TX_DWRAP	30
+
+/* mode codes */
+#define BRM_MC_DYNAMIC_BUS_CONTROL			0b00000
+#define BRM_MC_SYNCHRONIZE				0b00001
+#define BRM_MC_TRANSMIT_STATUS_WORD			0b00010
+#define BRM_MC_INITIATE_SELF_TEST			0b00011
+#define BRM_MC_TRANSMITTER_SHUTDOWN			0b00100
+#define BRM_MC_OVERRIDE_TRANSMITTER_SHUTDOWN		0b00101
+#define BRM_MC_INHIBIT_TERMINAL_FLAG_BIT		0b00110
+#define BRM_MC_OVERRIDE_INHIBIT_TERMINAL_FLAG_BIT	0b00111
+#define BRM_MC_RESET_REMOTE_TERMINAL			0b01000
+
+#define BRM_MC_TRANSMIT_VECTOR_WORD			0b10000
+#define BRM_MC_SYNCHRONIZE_WITH_DATA_WORD		0b10001
+#define BRM_MC_TRANSMIT_LAST_COMMAND_WORD		0b10010
+#define BRM_MC_TRANSMIT_BUILTIN_TEST_WORD		0b10011
+#define BMR_MC_SELECTED_TRANSMITTER_SHUTDOWN		0b10100
+#define BRM_MC_OVERRIDE_SLECTED_TRANSMITTER_SHUTDOWN	0b10101
+
+/*
+ *
+ * NOTE: can't safely use sizeof() for memcpy here, use the define
+ */
+
+#define TIME_PACKET_BYTES			10
+
+__extension__
+#define AS250_SA_TX_ADB_01	11
+#define AS250_SA_TX_ADB_02	12
+#define AS250_SA_TX_ADB_03	13
+#define AS250_SA_TX_ADB_04	14
+#define AS250_SA_TX_ADB_05	15
+#define AS250_SA_TX_ADB_06	16
+#define AS250_SA_TX_ADB_07	17
+#define AS250_SA_TX_ADB_08	18
+#define AS250_SA_TX_ADB_09	19
+#define AS250_SA_TX_ADB_10	20
+#define AS250_SA_TX_ADB_11	21
+#define AS250_SA_TX_ADB_12	22
+#define AS250_SA_TX_ADB_13	23
+#define AS250_SA_TX_ADB_14	24
+#define AS250_SA_TX_ADB_15	25
+#define AS250_SA_TX_ADB_16	26
+#define AS250_SA_TX_DTC		27
+#define AS250_SA_TX_ATR		28
+#define AS250_SA_TX_DWRAP	30
+
+
+struct time_packet {
+	union {
+		uint16_t word0;
+		struct {
+			uint8_t  null_field;
+			union {
+				struct {
+					uint8_t  extension                   :1;
+					uint8_t  time_code_id                :3;
+					uint8_t  num_bytes_coarse_time_min_1 :2;
+					uint8_t  num_bytes_fine_time         :2;
+				};
+				uint8_t  p_field; /*always 0b00101111 or 0x2f*/
+			};
+		};
+	};
+
+	union {
+		struct {
+			uint16_t word1;
+			uint16_t word2;
+		};
+		uint32_t coarse_time;
+	};
+
+	union {
+		uint32_t fine_time32;
+		uint16_t word3;
+		uint16_t word4;
+		struct {
+			uint32_t fine_time :24;
+			uint8_t  unused;	/* always 0x0*/
+		};
+	};
+}__attribute__((packed));
+
+
+/* see DIV.SP.00030.T.ASTR Issue 1 Rev 1, p34 */
+#define AS250_TIME_PACKET_SIZE	10
+
+compile_time_assert((sizeof(struct time_packet)
+		     == AS250_TIME_PACKET_SIZE),
+		    TIME_PACKET_STRUCT_WRONG_SIZE);
+
+
+
+#define swap_time(x) ((uint32_t)(                          \
+	(((uint32_t)(x) & (uint32_t)0x000000ffUL) << 16) | \
+	(((uint32_t)(x) & (uint32_t)0x0000ff00UL) << 16) | \
+	(((uint32_t)(x) & (uint32_t)0x00ff0000UL) >> 16) | \
+	(((uint32_t)(x) & (uint32_t)0xff000000UL) >> 16)))
+
+
+/*
+ * AS250 p.36
+ */
+
+#define AS250_TRANSFER_DESCRIPTOR_SIZE	0x4		/* 2x 16 bit words */
+
+__extension__
+struct transfer_descriptor {
+
+	union{
+		struct {
+			uint16_t unused                    :4;
+			uint16_t transfer_size             :12;
+		};
+		uint16_t word0;
+	};
+
+	union{
+		struct {
+			uint8_t qos_err                    :1;
+			uint8_t reset                      :1;
+			uint8_t mode                       :1;
+			uint8_t subaddress                 :5;
+			uint8_t block_counter;
+		};
+		uint16_t word1;
+	};
+
+};
+
+/*
+ * check whether the descriptor structure was actually aligned
+ * to be the same size
+ */
+compile_time_assert((sizeof(struct transfer_descriptor)
+		     == AS250_TRANSFER_DESCRIPTOR_SIZE),
+		    TRANSFER_DESC_STRUCT_WRONG_SIZE);
+
+
+
+/**
+ *	BRM related
+ */
+
+
+#define BRM_RTA_BITS	0x1F		/* the RTA is at most 5 bits         */
+#define BRM_WCMC_BITS	0x1F		/* the WC/MC field is at most 5 bits */
+#define BRM_WCMC_SHIFT	0x0B		/* the WC/MC field starts at bit 11  */
+
+
+/*
+ * memory structure in RT mode (see Core1553BRM v4.0 Handbook, pp.54)
+ * 128k mode
+ */
+/* NOTE: eventually make this configurable by mode and number of
+ * buffers used (requires custome determination of log list position)
+ * (for CHEOPS we'll just use it in this predetermined form) */
+/* 20 kiB is just enough with 2 buffers per SA, we waste only ~1.6kiB
+ * (along with the 128 needed for alignment */
+#define BRM_MEM_BLOCK_SIZE_KBYTES			           20
+
+#define BRM_MEM_BLOCK_SIZE_BYTES   (BRM_MEM_BLOCK_SIZE_KBYTES * 1024)
+
+/* brm memory must be aligned to a boundary of 128 kiB
+ * (see GR712RC UM p. 160 */
+#define BRM_MEM_BLOCK_ALIGN_SIZE			   (128 * 1024)
+#define BRM_MEM_BLOCK_ALIGN		 (BRM_MEM_BLOCK_ALIGN_SIZE - 1)
+#define BRM_NUM_SUBADDR					             32
+#define BRM_NUM_DATAWORDS					     32
+#define BRM_NUM_DATABYTES		        (BRM_NUM_DATAWORDS * 2)
+#define BRM_HEADER_WORDS					      2
+					/* +2: compensate overflow */
+#define BRM_RT_MEMMAP_DESCRIPTOR_BLOCK_MAX_SIZE	(BRM_NUM_DATAWORDS + 2)
+#define BRM_RT_MEMMAP_DESCRIPTOR_BLOCK_ENTRIES			    128
+#define BRM_CBUF_PAGES						      2
+#define BRM_CBUF_PAGES_MIN					      2
+#define BRM_CBUF_PAGES_MAX					      8
+#define BRM_IRQ_LOG_ENTRY_PAGES					     16
+
+
+/*
+ *	Interrupt Mask Register, see Core1553BRM v4.0 Handbook, pp.75
+ */
+
+#define BRM_IRQ_MBC		0x0001  /* Monitor Block Counter	*/
+#define BRM_IRQ_CBA		0x0002  /* Command Block Accessed	*/
+#define BRM_IRQ_RTF		0x0004  /* Retry Fail			*/
+#define BRM_IRQ_ILLOP		0x0008  /* Illogical Opcode		*/
+#define BRM_IRQ_BC_ILLCMD	0x0010  /* BC Illocigal Command		*/
+#define BRM_IRQ_EOL		0x0020  /* End Of List			*/
+#define BRM_IRQ_RT_ILLCMD	0x0080  /* RT Illegal Command		*/
+#define BRM_IRQ_IXEQ0		0x0100  /* Index Equal Zero		*/
+#define BRM_IRQ_BDRCV		0x0200  /* Broadcast Command Received	*/
+#define BRM_IRQ_SUBAD		0x0400  /* Subaddress Accessed		*/
+#define BRM_IRQ_MERR		0x0800  /* Message Error		*/
+#define BRM_IRQ_BITF		0x1000  /* Bit Fail			*/
+#define BRM_IRQ_TAPF		0x2000  /* Terminal Address Parity Fail	*/
+#define BRM_IRQ_WRAPF		0x4000  /* Wrap Fail			*/
+#define BRM_IRQ_DMAF		0x8000  /* DMA Fail			*/
+
+
+/*
+ *	interrupt message acknowledge
+ *	controls intackh/intackm input signals of core
+ */
+
+#define IRQ_ACK_HW		0x0002  /* acknowledge hardware interrupts */
+#define IRQ_ACK_MSG		0x0004  /* acknowledge message  interrupts */
+
+
+/*
+ *	RT mode control word flags, see Core1553BRM v4.0 Handbook, p.56
+ */
+
+#define BRM_RT_CW_FLAGS_NII	0x0001	/* Notice II                    */
+#define BRM_RT_CW_FLAGS_BRD	0x0002	/* Broadcast                    */
+#define BRM_RT_CW_FLAGS_AB	0x0004	/* A or B Buffer                */
+#define BRM_RT_CW_FLAGS_LAB	0x0008	/* Last A or B Buffer           */
+#define BRM_RT_CW_FLAGS_BAC	0x0010	/* Block Accessed               */
+#define BRM_RT_CW_FLAGS_IBRD	0x0020	/* Interrupt Broadcast Received */
+#define BRM_RT_CW_FLAGS_IWA	0x0040	/* Interrupt When Accessed      */
+#define BRM_RT_CW_FLAGS_INTX	0x0080	/* Interrupt Equals Zero        */
+
+#define BRM_RT_CW_INDX_MASK	0xFF00	/* Index: depth of multi-msg buffer */
+
+/**
+ * common control register (reg 0) flags
+ */
+
+#define BRM_CCR_XMTSW		0x0001  /* transmit word status enable	     */
+#define BRM_CCR_INEN		0x0002  /* interrupt log list enable	     */
+#define BRM_CCR_PPEN		0x0004  /* ping pong enable		     */
+#define BRM_CCR_DYNBC		0x0008  /* dynamic bus controll acceptance   */
+#define BRM_CCR_BCEN		0x0010  /* broadcast enable		     */
+#define BRM_CCR_BMC		0x0020  /* bus monitor control		     */
+#define BRM_CCR_DUMMY		0x0040	/* bit 6 = unused		     */
+#define BRM_CCR_BUF_NCM0	0x0000  /* non-circular buffer mode 0	     */
+#define BRM_CCR_BUF_NCM1	0x0080  /* non-circular buffer mode 0	     */
+#define BRM_CCR_BUF_CBCS	0x0100  /* (combined storage)		     */
+#define BRM_CCR_BUF_CBSS	0x0180  /* (segregated storage)		     */
+#define BRM_CCR_MSGTO		0x0200  /* message timeout		     */
+#define BRM_CCR_ETCE		0x0400  /* external timer clock enable	     */
+#define BRM_CCR_BBEN		0x0800  /* Bus B enable			     */
+#define BRM_CCR_BAEN		0x1000  /* Bus A enable			     */
+#define BRM_CCR_SRST		0x2000  /* software reset		     */
+#define BRM_CCR_SBIT		0x4000  /* enable start BIT
+					   (LOW = init core op)		     */
+#define BRM_CCR_STEX		0x8000  /* start execution		     */
+
+#define BRM_CCR_BUF_CLR		0xFE7F  /* buffer mode clear mask	     */
+
+#define BRM_CCR_MSEL_CLR	0xFCFF  /* mode select clear mask
+					   [LOW = BC mode]		     */
+#define BRM_CCR_RTA_MASK	0xF800  /* remote terminal address bitmask   */
+#define BRM_CCR_RTPTY_MASK	0x0001  /* remote terminal address parity    */
+#define BRM_CCR_RTPTY_REG	    10  /* remote terminal address parity bit*/
+#define BRM_CCR_RTA_REG		    11  /* remote terminal address
+					   bitfield base		     */
+
+			/* remote terminal address + parity */
+#define BRM_CCR_RTA(x) ((x << BRM_CCR_RTA_REG) & BRM_CCR_RTA_MASK)
+
+
+/*
+ * operation and status register (reg 1) flags
+ */
+
+#define BRM_OSR_TERACT		0x0001  /* terminal active,	   [RO]	*/
+#define BRM_OSR_READY		0x0002  /* READY status,	   [RO]	*/
+#define BRM_OSR_TAPF		0x0004  /* RT Address Parity Fail, [RO]	*/
+#define BRM_OSR_EX		0x0008  /* Core Executing,	   [RO]	*/
+#define BRM_OSR_SSYSF		0x0010  /* SSYSF Status,	   [RO]	*/
+#define BRM_OSR_DUMMY		0x0020  /* bit 5 = unused		*/
+#define BRM_OSR_LOCK		0x0040  /* LOCK status		   [RO]	*/
+#define BRM_OSR_ABSTD		0x0080  /* set MIL-STD-1553(A),
+					   (LOW = 1553(B))              */
+#define BRM_OSR_MSEL_BC		0x0000  /* mode select: BC		*/
+#define BRM_OSR_MSEL_RT		0x0100  /* mode select: RT		*/
+#define BRM_OSR_MSEL_BM		0x0200  /* mode select: BM		*/
+#define BRM_OSR_MSEL_BMRT	0x0300  /* mode select: BM & RT		*/
+#define BRM_OSR_RTPTY		0x0400  /* RT address odd parity if HIGH*/
+
+
+/*
+ * command legalisation registers
+ */
+#define BMR_LEG_CMDS			16
+#define BMR_LEG_CMDS_PER_REGISTER	16
+
+#define BRM_LEG_CMD_LEGAL		0UL
+#define BRM_LEG_CMD_ILLEGAL		1UL
+
+#define BRM_LEG_CMD_LEGALIZE(field, cmd) do { \
+	field &= (typeof(field)) ~(BRM_LEG_CMD_ILLEGAL << cmd); \
+} while (0)
+
+#define BRM_LEG_CMD_ILLEGALIZE(field, cmd) do { \
+	field &= ((typeof(field)) BRM_LEG_CMD_ILLEGAL << cmd); \
+} while (0)
+
+#define BRM_LEG_CMD_ILLEGALIZE_ALL(field) do {				\
+	field = ((typeof(field)) (BRM_LEG_CMD_ILLEGAL			\
+				  << BMR_LEG_CMDS_PER_REGISTER) - 1UL);	\
+} while (0)
+
+#define BRM_LEG_CMD_LEGALIZE_ALL(field) do { \
+	field = (typeof(field)) BRM_LEG_CMD_LEGAL; \
+} while (0)
+
+
+#define BRM_LEG_CMD_SA_RX__0_15		0
+#define BRM_LEG_CMD_SA_RX_16_31		1
+#define BRM_LEG_CMD_SA_TX__0_15		2
+#define BRM_LEG_CMD_SA_TX_16_31		3
+#define BRM_LEG_CMD_SA_BC_RX__0_15	4
+#define BRM_LEG_CMD_SA_BC_RX_16_31	5
+#define BRM_LEG_CMD_SA_BC_TX__0_15	6
+#define BRM_LEG_CMD_SA_BC_TX_16_31	7
+#define BRM_LEG_CMD_MC_RX__0_15		8
+#define BRM_LEG_CMD_MC_RX_16_31		9
+#define BRM_LEG_CMD_MC_TX__0_15		10
+#define BRM_LEG_CMD_MC_TX_16_31		11
+#define BRM_LEG_CMD_MC_BC_RX__0_15	12
+#define BRM_LEG_CMD_MC_BC_RX_16_31	13
+#define BRM_LEG_CMD_MC_BC_TX__0_15	14
+#define BRM_LEG_CMD_MC_BC_TX_16_31	15
+
+/*
+ * enhanced register flags
+ * (incomplete)
+ */
+
+#define BRM_FREQ_12MHZ		0x0
+#define BRM_FREQ_16MHZ		0x1
+#define BRM_FREQ_20MHZ		0x2
+#define BRM_FREQ_24MHZ		0x3
+#define BRM_FREQ_MASK		0x3
+
+
+
+
+/*
+ *	BRM register map
+ *	registers are mapped to be 4-byte aligned, but only lower
+ *	2 bytes are used (see GR712RC-UM, p. 162)
+ */
+struct brm_reg {
+	uint32_t ctrl;            /* 0x00 */
+	uint32_t oper;            /* 0x04 */
+	uint32_t cur_cmd;         /* 0x08 */
+	uint32_t imask;           /* 0x0C */
+	uint32_t ipend;           /* 0x10 */
+	uint32_t ipoint;          /* 0x14 */
+	uint32_t bit_reg;         /* 0x18 */
+	uint32_t ttag;            /* 0x1C */
+	uint32_t dpoint;          /* 0x20 */
+	uint32_t sw;              /* 0x24 */
+	uint32_t initcount;       /* 0x28 */
+	uint32_t mcpoint;         /* 0x2C */
+	uint32_t mdpoint;         /* 0x30 */
+	uint32_t mbc;             /* 0x34 */
+	uint32_t mfilta;          /* 0x38 */
+	uint32_t mfiltb;          /* 0x3C */
+	uint32_t rt_cmd_leg[BMR_LEG_CMDS];  /* 0x40-0x80 */
+	uint32_t enhanced;        /* 0x84 */
+
+	uint32_t dummy[31];
+
+	uint32_t w_ctrl;          /* 0x100 */
+	uint32_t w_irqctrl;       /* 0x104 */
+	uint32_t w_ahbaddr;       /* 0x108 */
+};
+
+
+
+/*
+ * interrupt log list structure
+ *
+ * (see Core1553BRM v4.0 Handbook, p.86)
+ *
+ */
+
+struct brm_irq_log_entry {
+	uint16_t IIW;			/* interrupt information word */
+	uint16_t IAW;			/* interrupt address word     */
+};
+
+
+/*
+ * data buffer structure
+ *
+ * (see Core1553BRM v4.0 Handbook, p.54 and pp. 57)
+ *
+ * GNU extensions:	*) unnamed structs/unions
+ *
+ */
+
+__extension__
+struct brm_data_buffer {
+	union {
+		struct {
+			uint16_t MIW;
+			uint16_t timetag;
+			uint16_t data[BRM_NUM_DATAWORDS];
+		};
+		uint16_t block[BRM_RT_MEMMAP_DESCRIPTOR_BLOCK_MAX_SIZE];
+	};
+};
+
+/*
+ * data buffer structures in circular buffer mode 1
+ *
+ * (see Core1553BRM v4.0 Handbook, p.61)
+ */
+
+struct brm_message_circular_buffer {
+	struct brm_data_buffer page[BRM_CBUF_PAGES];
+};
+
+
+/*
+ * descriptor block for different RT modes
+ *  for circular buffer combined storage (mode 1):
+ *	cw | top buffer | current buffer | bottom buffer
+ *  for indexed/ping-pong mode:
+ *	cw | data ptr A |   data ptr B   | bcast data ptr
+ *
+ * (see Core1553BRM v4.0 Handbook, p.55,  pp.61)
+ *
+ * GNU extensions:	*) unnamed structs/unions
+ *
+ */
+
+__extension__
+struct brm_descriptor_table {
+	uint16_t CW;
+	union {
+		uint16_t top;
+		uint16_t buf_A;
+	};
+	union {
+		uint16_t current;
+		uint16_t buf_B;
+	};
+	union {
+		uint16_t bottom;
+		uint16_t bcast;
+	};
+};
+
+
+/*
+ * Remote Terminal Memory Map
+ * GNU extensions:	*) unnamed structs/unions
+ *			*) zero-length array
+ */
+
+__extension__
+struct brm_rt_mem_map {
+
+	union {
+		struct {
+			/* RX sub address descriptor block */
+			struct brm_descriptor_table sa_rx[BRM_NUM_SUBADDR];
+			/* TX sub address descriptor block */
+			struct brm_descriptor_table sa_tx[BRM_NUM_SUBADDR];
+			/* RX mode code descriptor bocks */
+			struct brm_descriptor_table mc_rx[BRM_NUM_SUBADDR];
+			/* TX mode code descriptor bocks */
+			struct brm_descriptor_table mc_tx[BRM_NUM_SUBADDR];
+		};
+
+		/* RX sub address descriptor block */
+		struct brm_descriptor_table descriptors[BRM_NUM_SUBADDR * 4];
+	};
+
+	union {
+		struct {
+			/* RX Sub Address messages */
+			struct brm_message_circular_buffer
+					sa_msgs_rx[BRM_NUM_SUBADDR];
+			/* RX Sub Address messages */
+			struct brm_message_circular_buffer
+					sa_msgs_tx[BRM_NUM_SUBADDR];
+			/* RX mode code messages */
+			struct brm_message_circular_buffer
+					mc_msgs_rx[BRM_NUM_SUBADDR];
+			/* TX mode code messages */
+			struct brm_message_circular_buffer
+					mc_msgs_tx[BRM_NUM_SUBADDR];
+			};
+		struct brm_message_circular_buffer
+					messages[BRM_NUM_SUBADDR * 4];
+	};
+
+
+	/**
+	 * track the index of the read pointer in rt circular
+	 * buffer or pp mode for each entry
+	 */
+	union {
+		struct {
+			uint16_t sa_rx[BRM_NUM_SUBADDR];
+			uint16_t sa_tx[BRM_NUM_SUBADDR];
+			uint16_t mc_rx[BRM_NUM_SUBADDR];
+			uint16_t mc_tx[BRM_NUM_SUBADDR];
+		};
+		uint16_t block[BRM_RT_MEMMAP_DESCRIPTOR_BLOCK_ENTRIES];
+	} desc_block_rd_ptr;
+
+	union {
+		uint16_t sa_tx[BRM_NUM_SUBADDR];
+		uint16_t block[BRM_NUM_SUBADDR];
+	} desc_block_wr_ptr;
+
+
+	/* compute unused offset to log list section (64 bytes from bottom) */
+#define BRM_RT_NUM_BYTES_OFFSET (BRM_MEM_BLOCK_SIZE_BYTES		    \
+	 - 4 * BRM_NUM_SUBADDR * sizeof(struct brm_descriptor_table)	    \
+	 - 4 * BRM_NUM_SUBADDR * sizeof(struct brm_message_circular_buffer) \
+	 -     BRM_IRQ_LOG_ENTRY_PAGES * sizeof(struct brm_irq_log_entry)   \
+	 - 4 * BRM_NUM_SUBADDR * sizeof(uint16_t)			    \
+	 -     BRM_NUM_SUBADDR * sizeof(uint16_t)			    \
+	)
+
+	/* zero-sized arrays are allowed in gnu89, so this is always ok */
+	uint16_t unused[BRM_RT_NUM_BYTES_OFFSET >> 1];
+
+	/* interrupt log at 64 bytes from end */
+	struct brm_irq_log_entry irq_log[BRM_IRQ_LOG_ENTRY_PAGES];
+};
+
+/* check if brm_rt_mem_map wants to occupy larger memory block than possible */
+compile_time_assert((BRM_RT_NUM_BYTES_OFFSET >= 0), RT_MEM_BLOCK_TOO_LARGE);
+
+
+/*
+ * offset to bottom address of circular buffer msgs
+ */
+
+#define CBUF_BOTTOM_ADDR_OFFSET_ADJUST(x) ((uint16_t)   \
+	(((((x) * sizeof(struct brm_data_buffer)) >> 1) \
+	- sizeof(uint16_t)) & 0xFFFF))
+
+
+
+
+/*
+ * manage log list and circular message buffers
+ */
+
+#define BRM_IIW_PATTERN_INVALID 0xFFFF
+
+#define BRM_LOGLIST_INCREMENT_READPOS(cbuf_readpos, BRM_LOGLIST_NUM_ELEMENTS) \
+	do {								      \
+		cbuf_readpos++;						      \
+		if (cbuf_readpos >= BRM_LOGLIST_NUM_ELEMENTS) {		      \
+			cbuf_readpos = 0;				      \
+		}							      \
+	} while (0)
+
+/* word count for 1553brm circular buffers: data words + MIW + time stamp */
+#define BRM_WORDCOUNT(x) ((x) ? (BRM_HEADER_WORDS+(x)) :\
+			  (BRM_HEADER_WORDS+BRM_NUM_DATAWORDS))
+
+#define BRM_DATAWORDCOUNT(x) ((x) ? ((x)) : (BRM_NUM_DATAWORDS))
+
+#define BRM_GET_WCMC(x)	 (((x) >> BRM_WCMC_SHIFT) & BRM_WCMC_BITS)
+
+#define BRM_SET_WCMC(x)	 (((x) & BRM_WCMC_BITS) << BRM_WCMC_SHIFT)
+
+
+/*
+ *  32bit address to 16bit core base addressing scheme
+ *  (see p78 Core1553BRM Manual, "Register 05 – Interrupt Pointer")
+ *  (see also p57, "Data Pointer A and B")
+ */
+
+#define BASE_ADDR(x)   ((((uint32_t) (&x)) & 0x0001FFFF) >> 1)
+
+#define BRM_CALC_SA_RX_DESC(x)		(x)
+#define BRM_CALC_SA_TX_DESC(x)		((x) - BRM_NUM_SUBADDR)
+#define BRM_CALC_MC_RX_DESC(x)		((x) - BRM_NUM_SUBADDR * 2)
+#define BRM_CALC_MC_TX_DESC(x)		((x) - BRM_NUM_SUBADDR * 3)
+
+
+
+/*
+ * data exchange buffers
+ */
+
+struct brm_interface_buffers {
+	uint8_t			*adb_ddb;
+	struct cpus_buffers	*atr_cpus;
+	struct packet_tracker	*pkt_gnd;
+	struct packet_tracker	*pkt_obc;
+};
+
+/*
+ * tracked as250 values
+ */
+
+struct as250_param {
+	struct transfer_descriptor atr;
+	uint8_t atd_blk_cnt;
+	uint8_t dtd_blk_cnt;
+};
+
+
+/*
+ * 1553/as250 driver configuration
+ * ping-pong is now the only supported mode
+ */
+
+struct brm_config {
+	uint16_t				  *brm_mem;
+	struct brm_reg				  *regs;
+	struct brm_rt_mem_map			  *rt_mem;
+	struct brm_interface_buffers		   buf;
+	struct as250_param			   as250;
+	enum   {PING_PONG, CBUF_COMBINED_STORAGE}  mode;
+	void *set_time_userdata;
+	void *rt_sync_with_dword_userdata;
+	void *rt_reset_userdata;
+	void (*set_time)(uint32_t coarse_time,
+			 uint32_t fine_time,
+			 void *userdata);
+	void (*rt_sync_with_dword)(uint16_t frame_num, void *userdata);
+	void (*rt_reset)(void *userdata);
+};
+
+
+
+/* forward-declarations */
+struct cpus_buffers;
+struct packet_tracker;
+
+void gr712_set_core_freq(void);
+
+int32_t brm_1553_enable(struct brm_config *brm);
+uint32_t brm_rt_init(struct brm_config *brm,
+		     uint8_t rt_address,
+		     uint32_t core_freq);
+
+int32_t brm_set_packet_tracker_obc(struct brm_config *brm,
+				   struct packet_tracker *pkt_obc);
+
+int32_t brm_set_packet_tracker_gnd(struct brm_config *brm,
+				   struct packet_tracker *pkt_gnd);
+
+int32_t brm_set_adb_ddb_buffer(struct brm_config *brm, uint8_t *p_buf);
+
+
+int32_t as250_set_time_callback(struct brm_config *brm,
+				void (*callback)(uint32_t coarse_time,
+						 uint32_t fine_time,
+						 void *userdata),
+				void *userdata);
+
+int32_t as250_set_rt_reset_callback(struct brm_config *brm,
+				    void (*callback)(void *userdata),
+				    void *userdata);
+
+int32_t as250_set_sync_with_dword_callback(struct brm_config *brm,
+					  void (*callback)(uint16_t frame_num,
+							   void *userdata),
+					  void *userdata);
+
+int32_t as250_set_atr_cpus_buffers(struct brm_config *brm,
+				   struct cpus_buffers *p_cpus);
+
+void as250_desynchronized(struct brm_config *brm);
+void as250_synchronized(struct brm_config *brm);
+
+
+#endif
+
diff --git a/IBSW/include/cpus_buffers.h b/IBSW/include/cpus_buffers.h
new file mode 100644
index 0000000..36d8595
--- /dev/null
+++ b/IBSW/include/cpus_buffers.h
@@ -0,0 +1,73 @@
+/**
+ * @file   cpus_buffers.h
+ * @ingroup cpus_buffer
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   June, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef CPUS_BUFFERS_H
+#define CPUS_BUFFERS_H
+
+
+#include <circular_buffer8.h>
+#include <circular_buffer16.h>
+#include <core1553brm_as250.h>
+#include <stdint.h>
+
+#define CBUF_PUS_FRAMES			2
+#define CBUF_PUS_OVERFLOW_FRAMES	1
+
+#ifndef PUS_PKT_MIN_SIZE
+#define	PUS_PKT_MIN_SIZE		12
+#endif
+
+
+#define CBUF_PKTS_ELEM		(AS250_TRANSFER_FRAME_SIZE * \
+				(CBUF_PUS_FRAMES+CBUF_PUS_OVERFLOW_FRAMES))
+
+#define CBUF_SIZE_ELEM		(CBUF_PKTS_ELEM/PUS_PKT_MIN_SIZE)
+#define CBUF_VALID_ELEM		(CBUF_PKTS_ELEM/PUS_PKT_MIN_SIZE)
+
+#define CBUF_PUS_VALID		0x00
+#define CBUF_PUS_INVALID	0xFF
+
+
+
+struct cpus_buffers {
+	struct circular_buffer8  pus_pkts;
+	struct circular_buffer16 pus_size;
+	struct circular_buffer8  pus_valid;
+};
+
+
+void cpus_init(struct cpus_buffers *p_cpus,
+	       uint8_t  *p_buf_pkts,
+	       uint16_t *p_buf_size,
+	       uint8_t  *p_buf_valid);
+
+void cpus_reset(struct cpus_buffers *p_cpus);
+
+uint32_t cpus_get_free(struct cpus_buffers *p_cpus);
+
+int32_t cpus_next_valid_pkt_size(struct cpus_buffers *p_cpus);
+
+int32_t cpus_push_packet(struct cpus_buffers *p_cpus,
+			 uint8_t *pus_pkt,
+			 uint16_t size);
+
+int32_t cpus_pop_packet(struct cpus_buffers *p_cpus,
+			uint8_t *pus_pkt);
+
+
+#endif
diff --git a/IBSW/include/edac.h b/IBSW/include/edac.h
new file mode 100644
index 0000000..30f1c50
--- /dev/null
+++ b/IBSW/include/edac.h
@@ -0,0 +1,34 @@
+/**
+ * @file   edac.h
+ * @ingroup edac
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   March, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+
+#ifndef EDAC_H
+#define EDAC_H
+
+#include <stdint.h>
+
+uint8_t edac_checkbits(const uint32_t value);
+
+void edac_trap(void);
+int32_t edac_ahb_irq(void *userdata);
+
+int32_t edac_set_reset_callback(void (*callback)(void *userdata),
+				void *userdata);
+int32_t edac_init_sysctl(void);
+
+#endif /* EDAC_H */
diff --git a/IBSW/include/error_log.h b/IBSW/include/error_log.h
new file mode 100644
index 0000000..16ed9c3
--- /dev/null
+++ b/IBSW/include/error_log.h
@@ -0,0 +1,83 @@
+/**
+ * @file   error_log.h
+ * @ingroup error_log
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   September, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef ERROR_LOG_H
+#define ERROR_LOG_H
+
+
+#include <stdint.h>
+#if (__sparc__)
+#include <CrIaDataPool.h>
+#else
+#define ERR_LOG_N2	12	/* DBS-SRS-FN-1745 */
+#endif
+
+/**
+ * @note
+ * BELG-9/A/T requires that the error log should hold ERR_LOG_N1 entries,
+ * which is defined to be 60 in CHEOPS-PNP-INST-ICD-002 rev 5
+ * In CHEOPS-IWF-INST-ICD-009 issue 2.2, DPU-SICD-IF-3540 and DPU-SICD-IF-3960
+ * suggest that the log should be the size of 64 entries, as does
+ * DBS-SRS-FN-1708 in CHEOPS-IWF-INST-RS-013 isse 2.0
+ *
+ * For the sake of compatibility to the DBS, we will use a size of 64 entries
+ */
+
+#define RAM_ERROR_LOG_BASE	0x40050000
+#define RAM_ERROR_LOG_SIZE	0x04000000
+#define ERROR_LOG_MAX_ENTRIES	64
+#define ERROR_LOG_MAX_USABLE	(ERROR_LOG_MAX_ENTRIES - 1)
+#define SIZEOF_ERR_LOG_ENTRY 20
+
+
+__extension__
+struct event_time {
+	uint32_t coarse_time;
+	uint16_t fine_time;
+}__attribute__((packed));
+
+struct error_log_entry {
+	struct event_time time;
+	uint16_t err_evt_id;
+	uint8_t  err_log_info[ERR_LOG_N2];
+}__attribute__((packed));
+
+/* CHEOPS-IWF-INST-ICD-009: DPU-SICD-IF-3540 */
+struct error_log {
+	uint32_t err_log_next;
+	uint32_t err_log_next_unsaved;
+	struct error_log_entry entry[ERROR_LOG_MAX_ENTRIES];
+};
+
+
+void error_log_init(struct error_log **log);
+
+void error_log_add_entry(struct error_log *log, struct event_time *time,
+			 uint16_t error_id, uint8_t *error_log_info);
+
+uint32_t error_log_read_entry_raw(struct error_log *log,
+				  struct error_log_entry *log_entry);
+
+uint32_t error_log_read_entry(struct error_log *log, struct event_time *time,
+			 uint16_t *error_id, uint8_t *error_log_info);
+
+uint32_t error_log_num_entries(struct error_log *log);
+
+void error_log_dump_reverse(struct error_log *log, uint8_t *buf);
+
+#endif
diff --git a/IBSW/include/errors.h b/IBSW/include/errors.h
new file mode 100644
index 0000000..c2f7e75
--- /dev/null
+++ b/IBSW/include/errors.h
@@ -0,0 +1,377 @@
+/**
+ * @file   errors.h
+ * @ingroup grspw2
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief this extends errno.h definitions for more detailed error tracking
+ *
+ * The BCC errno.h implementation sets an offset after which custom error
+ * number may be defined. We set up classes of errors for some of the
+ * software in the IBSW package, each offset by 100 from each other.
+ */
+
+#ifndef ERRORS_H
+#define ERRORS_H
+
+
+#include <errno.h>
+
+/*
+ * start counting up from last errno value + 1
+ */
+#ifdef __ELASTERROR
+#define ERR_BASE (__ELASTERROR)
+#else
+#define ERR_BASE 2000
+#endif
+
+
+/*
+ *	detailed errno definitions go below
+ */
+
+
+/**
+ * @def E_CPUS_PKT_SIZE_LIMIT
+ *	attempted to push a packet larger than the transfer frame size of the
+ *	AS250 protocol
+ *
+ * @def E_CPUS_FORWARD_WRITE
+ *	could not forward the write position of the underlying circular buffer
+ *
+ * @def E_CPUS_PATTERN_WRITE
+ *	could not write (in)valid pattern marker
+ *
+ * @def E_CPUS_SIZE_WRITE
+ *	could not write of size of packet
+ *
+ * @def E_CPUS_PKT_READ
+ *	error reading packet data from buffer
+ *
+ * @def E_CPUS_PKT_WRITE
+ *	could not write packet data
+ *
+ * @def E_CPUS_FULL
+ *	buffer full, could not accept packet data
+ *
+ * @def E_CPUS_PUSH_INVALID
+ *	could not write invalid pattern
+ *
+ * @def E_CPUS_WRITE
+ *	could not write packet to buffer
+ */
+
+/*
+ *	circularly buffered PUS frame constructor errors
+ */
+
+#define ERR_CPUS_OFF	100
+#define ERR_CPUS(x)   (x+ERR_BASE+ERR_CPUS_OFF)
+
+#define E_CPUS_PKT_SIZE_LIMIT		ERR_CPUS(1)
+#define E_CPUS_FORWARD_WRITE		ERR_CPUS(2)
+#define E_CPUS_PATTERN_WRITE		ERR_CPUS(3)
+/* error 4 removed */
+#define E_CPUS_SIZE_WRITE		ERR_CPUS(5)
+#define E_CPUS_PKT_READ			ERR_CPUS(6)
+#define E_CPUS_PKT_WRITE		ERR_CPUS(7)
+#define E_CPUS_FULL			ERR_CPUS(8)
+#define E_CPUS_PUSH_INVALID		ERR_CPUS(9)
+#define E_CPUS_WRITE			ERR_CPUS(10)
+/* error 11 removed */
+/* error 12 removed */
+
+
+
+/**
+ * @def E_PTRACK_PKT_SIZE_LIMIT
+ *	packet size excceds buffer size
+ *
+ * @def E_PTRACK_PKT_WRITE
+ *	could not write packet data
+ *
+ * @def E_PTRACK_SIZE_WRITE
+ *	could not write of size of packet
+ *
+ * @def E_PTRACK_PKT_READ
+ *	error while reading a packet (size mismatch)
+ *
+ * @def E_PTRACK_NOPKT
+ *	there was no packet
+ *
+ * @def E_PTRACK_INVALID
+ *	the packet tracker reference was not a valid pointer
+ */
+
+/*
+ *	circularly buffered pus packet tracker
+ */
+
+#define ERR_PTRACK_OFF	200
+#define ERR_PTRACK(x)   (x+ERR_BASE+ERR_PTRACK_OFF)
+
+#define E_PTRACK_PKT_SIZE_LIMIT		ERR_PTRACK(1)
+#define E_PTRACK_PKT_WRITE		ERR_PTRACK(2)
+#define E_PTRACK_SIZE_WRITE		ERR_PTRACK(3)
+#define E_PTRACK_PKT_READ		ERR_PTRACK(4)
+#define E_PTRACK_NOPKT			ERR_PTRACK(5)
+#define E_PTRACK_INVALID		ERR_PTRACK(6)
+
+
+/**
+ * @def E_BRM_MEM_ADDR_ALIGN
+ *	the supplied memory block is not properly aligned
+ *
+ * @def E_BRM_INVALID_COREFREQ
+ *	the specified 1553 core frequency is not valid
+ *
+ * @def E_BRM_INVALID_PKT_SIZE
+ *	the size field of an alleged packet exceeded the allowed size
+ *
+ * @def E_BRM_INVALID_PKT_ID
+ *	the packet's PUS id was invalid
+ *
+ * @def E_BRM_IRQ_RT_ILLCMD
+ *	the bus controller wrote an illegal 1553 command
+ *
+ * @def E_BRM_IRQ_ILLOP
+ *	the bus controller wrote an illegal 1553 operation
+ *
+ * @def E_BRM_IRQ_MERR
+ *	a message error occured on the bus
+ *
+ * @def E_BRM_IRQ_DMAF
+ *	a DMA fault occured
+ *
+ * @def E_BRM_IRQ_WRAPF
+ *	a wrap fault occured
+ *
+ * @def E_BRM_IRQ_TAPF
+ *	a terminal address parity fault occured
+ *
+ * @def E_BRM_IRQ_BITF
+ *	a BIT fail occured
+ *
+ * @def E_BRM_IRQ_IXEQ0
+ *	an Index Equal Zero occured
+ *
+ * @def E_BRM_CW_BAC_FLAG
+ *	an block access was reported, but the block access flag was not set
+ *
+ * @def E_BRM_INVALID_TRANSFER_SIZE
+ *	the specified transfer size did not match the total size of the packets
+ */
+
+/*
+ *	1553BRM/AS250 errors
+ */
+
+#define ERR_BRM_OFF	300
+#define ERR_BRM(x)   (x+ERR_BASE+ERR_BRM_OFF)
+
+#define E_BRM_MEM_ADDR_ALIGN		ERR_BRM(1)
+#define E_BRM_INVALID_COREFREQ		ERR_BRM(2)
+#define E_BRM_INVALID_PKT_SIZE		ERR_BRM(3)
+#define E_BRM_INVALID_PKT_ID		ERR_BRM(4)
+#define E_BRM_IRQ_RT_ILLCMD		ERR_BRM(5)
+#define E_BRM_IRQ_ILLOP			ERR_BRM(6)
+#define E_BRM_IRQ_MERR			ERR_BRM(7)
+#define E_BRM_IRQ_DMAF			ERR_BRM(8)
+#define E_BRM_IRQ_WRAPF			ERR_BRM(9)
+#define E_BRM_IRQ_TAPF			ERR_BRM(10)
+#define E_BRM_IRQ_BITF			ERR_BRM(11)
+#define E_BRM_IRQ_IXEQ0			ERR_BRM(12)
+#define E_BRM_CW_BAC_FLAG		ERR_BRM(13)
+#define E_BRM_INVALID_TRANSFER_SIZE	ERR_BRM(14)
+
+
+/**
+ * @def E_IRQ_QUEUE_BUSY
+ *	a deferred interrupt could not be queued
+ *
+ * @def E_IRQ_EXCEEDS_IRL_SIZE
+ *	the requested IRQ number exceeds the nominal number of interrupt lines
+ *
+ * @def E_IRQ_POOL_EMPTY
+ *	all available ISR callback slots are used
+ *
+ * @def E_IRQ_DEREGISTER
+ *	the removal of the specified ISR callback was unsuccessful
+ */
+
+/*
+ *	irq dispatch errors
+ */
+
+#define ERR_IRQ_OFF	400
+#define ERR_IRQ(x)   (x+ERR_BASE+ERR_IRQ_OFF)
+
+#define E_IRQ_QUEUE_BUSY		ERR_IRQ(1)
+#define E_IRQ_EXCEEDS_IRL_SIZE		ERR_IRQ(2)
+#define E_IRQ_POOL_EMPTY		ERR_IRQ(3)
+#define E_IRQ_DEREGISTER		ERR_IRQ(4)
+
+
+
+/**
+ * @def E_SPW_NO_RX_DESC_AVAIL
+ *	there are no free RX descriptors available
+ *
+ * @def E_SPW_NO_TX_DESC_AVAIL
+ *	there are no free TX descriptors available
+ *
+ * @def E_SPW_CLOCKS_INVALID
+ *	the specified clock dividers are invalid
+ *
+ * @def E_SPW_INVALID_ADDR_ERROR
+ *	an invalid address error occured
+ *
+ * @def E_SPW_PARITY_ERROR
+ *	a parity error occured
+ *
+ * @def E_SPW_DISCONNECT_ERROR
+ *	a disconnect error occured
+ *
+ * @def E_SPW_ESCAPE_ERROR
+ *	an escape error occured
+ *
+ * @def E_SPW_CREDIT_ERROR
+ *	a creadit error occured
+ *
+ * @def E_SPW_RX_AHB_ERROR
+ *	a RX DMA error occured
+ *
+ * @def E_SPW_TX_AHB_ERROR
+ *	a TX DMA error occured
+ *
+ * @def E_SPW_RX_DESC_TABLE_ALIGN
+ *	the supplied RX descriptor table is incorrectly aligned
+ *
+ * @def E_SPW_TX_DESC_TABLE_ALIGN
+ *	the supplied TX descriptor table is incorrectly aligned
+ */
+
+/*
+ *	grspw2 errors
+ */
+
+#define ERR_SPW_OFF	500
+#define ERR_SPW(x)   (x+ERR_BASE+ERR_SPW_OFF)
+
+#define E_SPW_NO_RX_DESC_AVAIL		ERR_SPW(1)
+#define E_SPW_NO_TX_DESC_AVAIL		ERR_SPW(2)
+/* error 3 removed */
+/* error 4 removed */
+#define E_SPW_CLOCKS_INVALID		ERR_SPW(5)
+#define E_SPW_INVALID_ADDR_ERROR	ERR_SPW(6)
+#define E_SPW_PARITY_ERROR		ERR_SPW(7)
+#define E_SPW_DISCONNECT_ERROR		ERR_SPW(8)
+#define E_SPW_ESCAPE_ERROR		ERR_SPW(9)
+#define E_SPW_CREDIT_ERROR		ERR_SPW(10)
+#define E_SPW_RX_AHB_ERROR		ERR_SPW(11)
+#define E_SPW_TX_AHB_ERROR		ERR_SPW(12)
+#define E_SPW_RX_DESC_TABLE_ALIGN	ERR_SPW(13)
+#define E_SPW_TX_DESC_TABLE_ALIGN	ERR_SPW(14)
+
+
+/*
+ *	timing errors
+ */
+
+/* timing errors removed */
+
+
+/**
+ * @def ERR_FLASH_BLOCKS_EXCEEDED
+ *	the specified flash block exceeds the number of blocks per chip
+ *
+ * @def ERR_FLASH_PAGES_EXCEEDED
+ *	the specified page exceeds the number of pages per block
+ *
+ * @def ERR_FLASH_PAGESIZE_EXCEEDED
+ *	the specified page offset exceeds the size of a page
+ *
+ * @def ERR_FLASH_DISABLED
+ *	the flash is diabled
+ *
+ * @def ERR_FLASH_READ_PAGE_EXCEEDED
+ *	the specified read offset would have exceed the flash page size
+ *
+ * @def ERR_FLASH_BLOCK_INVALID
+ *	a flash block was invalid
+ *
+ * @def ERR_FLASH_ADDR_EMPTY
+ *	a read failed because the flash was marked empty at the given address
+ *
+ * @def ERR_FLASH_DATA_WRITE_ERROR
+ *	a write to the data flash failed
+ *
+ * @def ERR_FLASH_EDAC_WRITE_ERROR
+ *	a write to the eadc flash failed
+ *
+ * @def ERR_FLASH_DATA_ERASE_ERROR
+ *	a data flash erase failed
+ *
+ * @def ERR_FLASH_EDAC_ERASE_ERROR
+ *	an edac flash erase failed
+ *
+ * @def ERR_FLASH_WRITE_PAGE_EXCEEDED
+ *	the current write would have exceeded the flash page size
+ *
+ * @def ERR_FLASH_EDAC_READ_ERROR
+ *	the flash edac status could not be read
+ */
+
+/*
+ *	flash errors
+ */
+
+#define ERR_FLASH_OFF	700
+
+#define ERR_FLASH(x)   (x+ERR_BASE+ERR_FLASH_OFF)
+
+#define ERR_FLASH_BLOCKS_EXCEEDED	ERR_FLASH(1)
+#define ERR_FLASH_PAGES_EXCEEDED	ERR_FLASH(2)
+#define ERR_FLASH_PAGESIZE_EXCEEDED	ERR_FLASH(3)
+#define ERR_FLASH_DISABLED		ERR_FLASH(4)
+#define ERR_FLASH_READ_PAGE_EXCEEDED	ERR_FLASH(5)
+#define ERR_FLASH_BLOCK_INVALID		ERR_FLASH(6)
+#define ERR_FLASH_ADDR_EMPTY		ERR_FLASH(7)
+#define ERR_FLASH_DATA_WRITE_ERROR	ERR_FLASH(8)
+#define ERR_FLASH_EDAC_WRITE_ERROR	ERR_FLASH(9)
+#define ERR_FLASH_DATA_ERASE_ERROR	ERR_FLASH(10)
+#define ERR_FLASH_EDAC_ERASE_ERROR	ERR_FLASH(11)
+#define ERR_FLASH_WRITE_PAGE_EXCEEDED	ERR_FLASH(12)
+#define ERR_FLASH_EDAC_READ_ERROR	ERR_FLASH(13)
+
+
+/**
+ * @def	ERR_DSU_CWP_INVALID
+ *	the requested CPU window exceeds the valid range
+ */
+
+/*
+ *	DSU errors
+ */
+
+#define ERR_DSU_OFF	800
+
+#define ERR_DSU(x)   (x+ERR_BASE+ERR_DSU_OFF)
+
+#define ERR_DSU_CWP_INVALID		ERR_DSU(1)
+
+
+
+
+#endif
diff --git a/IBSW/include/event_report.h b/IBSW/include/event_report.h
new file mode 100644
index 0000000..4ca5c98
--- /dev/null
+++ b/IBSW/include/event_report.h
@@ -0,0 +1,65 @@
+/**
+ * @file    event_report.h
+ * @ingroup event_report
+ * @author  Roland Ottensamer (roland.ottensamer@univie.ac.at),
+ *          Armin Luntzer (roland.ottensamer@univie.ac.at)
+ * @date    August, 2015
+ *
+ * @copyright 
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+
+
+#ifndef EVENT_REPORT__H
+#define EVENT_REPORT__H
+
+
+#include <stdint.h>
+
+#if (__sparc__) && !NO_IASW
+#include <CrIaIasw.h>
+#include <Services/General/CrIaConstants.h>
+#else
+
+#define CRIA_SERV5_EVT_NORM		  1
+#define CRIA_SERV5_EVT_ERR_LOW_SEV	  2
+#define CRIA_SERV5_EVT_ERR_MED_SEV	  3
+#define CRIA_SERV5_EVT_ERR_HIGH_SEV	  4
+#define CRIA_SERV5_EVT_INIT_SUCC	301
+#define CRIA_SERV5_EVT_INIT_FAIL	302
+#define CRIA_SERV5_EVT_NOTIF_ERR	304
+#define CRIA_SERV5_EVT_SPW_ERR		300
+#define CRIA_SERV5_EVT_SPW_ERR_L	315
+#define CRIA_SERV5_EVT_SPW_ERR_M	316
+#define CRIA_SERV5_EVT_SPW_ERR_H	317
+#define CRIA_SERV5_EVT_1553_ERR		310
+#define CRIA_SERV5_EVT_1553_ERR_L	311
+#define CRIA_SERV5_EVT_1553_ERR_M	312
+#define CRIA_SERV5_EVT_1553_ERR_H	313
+#define CRIA_SERV5_EVT_FL_FBF_ERR	325
+#define CRIA_SERV5_EVT_SBIT_ERR		330
+#define CRIA_SERV5_EVT_DBIT_ERR		335
+#define CRIA_SERV5_EVT_FL_EL_ERR	320
+#define CRIA_SERV5_EVT_SYNC_LOSS	350
+
+void CrIaEvtRaise(uint8_t subtype, uint16_t id, uint16_t *data, uint32_t size);
+
+#endif
+
+
+enum error_class {INIT, NOTIFY, FBF, EDAC, CORE1553BRM, GRSPW2, ERRLOG, SYNC};
+enum error_severity {NORMAL, LOW, MEDIUM, HIGH};
+
+void event_report(enum error_class c, enum error_severity s, uint32_t err);
+
+#endif
+
diff --git a/IBSW/include/exchange_area.h b/IBSW/include/exchange_area.h
new file mode 100644
index 0000000..2ab0f3a
--- /dev/null
+++ b/IBSW/include/exchange_area.h
@@ -0,0 +1,79 @@
+/**
+ * @file    exchange_area.h
+ * @ingroup irq_dispatch
+ * @author  Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @date    September, 2016
+ *
+ * @copyright GPLv2
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief description of the exchange area used by the DBS
+ *
+ * See CHEOPS-IWF-INST-ICD-009: DPU-SICD-IF-7400 and DPU-SICD-IF-3520 for
+ * details.
+ *
+ */
+
+
+#ifndef EXCHANGE_AREA_H
+#define EXCHANGE_AREA_H
+
+#include <error_log.h>
+
+#define EXCHANGE_AREA_BASE_ADDR		0x40040000
+#define STACKTRACE_MAX_ENTRIES 7
+
+
+
+/* CHEOPS-IWF-INST-ICD-009: DPU-SICD-IF-7400 */
+
+#define RESET_UNKNOWN_CAUSE	0x0000
+#define RESET_POWER_ON		0x0001
+#define RESET_WATCHDOG		0x0002
+#define RESET_EXCEPTION		0x0003
+#define RESET_TC_RESET		0x0004
+#define RESET_CPU_ERROR		0x0005
+#define RESET_RESET_MILBUS	0x0006
+
+
+
+struct cpu_reginfo {
+	uint32_t psr;
+	uint32_t wim;
+	uint32_t pc;
+	uint32_t npc;
+	uint32_t fsr;
+};
+
+
+/* CHEOPS-IWF-INST-ICD-009: DPU-SICD-IF-3520 */
+
+struct exchange_area {
+
+	uint8_t reset_type;
+	uint8_t hk_dbs_status_byte1;
+	uint8_t hk_dbs_status_byte2;
+	uint8_t hk_dbs_status_byte3;
+	struct event_time reset_time;
+	uint8_t trapnum_core0;		/* if reset_type == EXCEPTION_RESET */
+	uint8_t trapnum_core1;		/* " */
+
+	struct cpu_reginfo regs_cpu0;	/* 0 if reset_type == RESET_REQUIRED */
+	struct cpu_reginfo regs_cpu1;	/* " */
+	uint32_t ahb_status_reg;	/* " */
+	uint32_t ahb_failing_addr_reg;	/* " */
+
+	uint32_t stacktrace_cpu0[STACKTRACE_MAX_ENTRIES]; /* 0 if unused */
+	uint32_t stacktrace_cpu1[STACKTRACE_MAX_ENTRIES]; /* " */
+};
+
+
+#endif
diff --git a/IBSW/include/grspw2.h b/IBSW/include/grspw2.h
new file mode 100644
index 0000000..aa189d5
--- /dev/null
+++ b/IBSW/include/grspw2.h
@@ -0,0 +1,567 @@
+/**
+ * @file   grspw2.h
+ * @ingroup grspw2
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef GRSPW2_H
+#define GRSPW2_H
+
+
+#include <stdint.h>
+#include <list.h>
+#include <compiler.h>
+#include <sysctl.h>
+
+/**
+ * core addresses and IRQs in the GR712
+ * (does not actually belong here...)
+ */
+
+#define GRSPW2_BASE_CORE_0	0x80100800
+#define GRSPW2_BASE_CORE_1	0x80100900
+#define GRSPW2_BASE_CORE_2      0x80100A00
+#define GRSPW2_BASE_CORE_3      0x80100B00
+#define GRSPW2_BASE_CORE_4      0x80100C00
+#define GRSPW2_BASE_CORE_5      0x80100D00
+
+#define GRSPW2_IRQ_CORE0		22
+#define GRSPW2_IRQ_CORE1		23
+#define GRSPW2_IRQ_CORE2		24
+#define GRSPW2_IRQ_CORE3		25
+#define GRSPW2_IRQ_CORE4		26
+#define GRSPW2_IRQ_CORE5		27
+
+
+/* default setting for maximum transfer unit (4 hdr bytes + 1 kiB payload) */
+#define GRSPW2_DEFAULT_MTU	0x0000404
+
+/* maximum transfer unit hardware limitation (yes, it's a tautology) */
+#define GRSPW2_MAX_MTU		0x1FFFFFC
+
+
+
+/**
+ * GRSPW2 control register bit masks
+ * see GR712RC-UM, p. 126
+ */
+
+
+#define GRSPW2_CTRL_LD		0x00000001	/* Link Disable               */
+#define GRSPW2_CTRL_LS		0x00000002	/* Link Start                 */
+#define GRSPW2_CTRL_AS		0x00000004	/* Autostart                  */
+#define GRSPW2_CTRL_IE		0x00000008	/* Interrupt Enable           */
+#define GRSPW2_CTRL_TI		0x00000010	/* Tick In                    */
+#define GRSPW2_CTRL_PM		0x00000020	/* Promiscuous Mode           */
+#define GRSPW2_CTRL_RS		0x00000040	/* Reset                      */
+#define GRSPW2_CTRL_DUMMY1	0x00000080	/* bit 7 == unused            */
+#define GRSPW2_CTRL_TQ		0x00000100	/* Tick-out IRQ               */
+#define GRSPW2_CTRL_LI		0x00000200	/* Link error IRQ             */
+#define GRSPW2_CTRL_TT		0x00000400	/* Time Tx Enable             */
+#define GRSPW2_CTRL_TR		0x00000800	/* Time Rx Enable             */
+#define GRSPW2_CTRL_DUMMY2	0x00001000	/* bit 12 == unused           */
+#define GRSPW2_CTRL_DUMMY3	0x00002000	/* bit 13 == unused           */
+#define GRSPW2_CTRL_DUMMY4	0x00004000	/* bit 14 == unused           */
+#define GRSPW2_CTRL_DUMMY5	0x00008000	/* bit 15 == unused           */
+#define GRSPW2_CTRL_RE		0x00010000	/* RMAP Enable                */
+#define GRSPW2_CTRL_RD		0x00020000	/* RMAP buffer disable        */
+#define GRSPW2_CTRL_DUMMY6	0x00040000	/* bit 18 == unused           */
+#define GRSPW2_CTRL_DUMMY7	0x00080000	/* bit 19 == unused           */
+#define GRSPW2_CTRL_NP		0x00100000	/* No port force              */
+#define GRSPW2_CTRL_PS		0x00200000	/* Port select                */
+#define GRSPW2_CTRL_DUMMY8	0x00400000	/* bit 22 == unused           */
+#define GRSPW2_CTRL_DUMMY9	0x00800000	/* bit 23 == unused           */
+#define GRSPW2_CTRL_DUMMY10	0x01000000	/* bit 24 == unused           */
+#define GRSPW2_CTRL_DUMMY11	0x02000000	/* bit 25 == unused           */
+#define GRSPW2_CTRL_PO		0x04000000	/* Number of ports - 1        */
+#define GRSPW2_CTRL_NCH		0x18000000	/* Number of DMA channels - 1 */
+#define GRSPW2_CTRL_RC		0x20000000	/* RMAP CRC available         */
+#define GRSPW2_CTRL_RX		0x40000000	/* RX unaligned access        */
+#define GRSPW2_CTRL_RA		0x80000000	/* RMAP available             */
+
+#define GRSPW2_CTRL_RX_BIT		30
+#define GRSPW2_CTRL_RX_BIT_MASK        0x1
+
+#define GRSPW2_CTRL_NCH_BIT		27
+#define GRSPW2_CTRL_NCH_BIT_MASK       0x3
+
+#define GRSPW2_CTRL_PO_BIT		26
+#define GRSPW2_CTRL_PO_BIT_MASK        0x1
+
+
+#define GRSPW2_CTRL_GET_RX(x)	\
+	(((x >> GRSPW2_CTRL_RX_BIT)  & GRSPW2_CTRL_RX_BIT_MASK))
+
+#define GRSPW2_CTRL_GET_NCH(x)	\
+	(((x >> GRSPW2_CTRL_NCH_BIT) & GRSPW2_CTRL_NCH_BIT_MASK) + 1)
+
+#define GRSPW2_CTRL_GET_PO(x)	\
+	(((x >> GRSPW2_CTRL_PO_BIT)  & GRSPW2_CTRL_PO_BIT_MASK)  + 1)
+
+
+/**
+ * GRSPW2 control register bit masks
+ * see GR712RC-UM, p. 127
+ */
+
+
+#define GRSPW2_STATUS_TO	0x00000001	/* Tick Out             */
+#define GRSPW2_STATUS_CE	0x00000002	/* Credit Error         */
+#define GRSPW2_STATUS_ER	0x00000004	/* Escape Error         */
+#define GRSPW2_STATUS_DE	0x00000008	/* Disconnect Error     */
+#define GRSPW2_STATUS_PE	0x00000010	/* Parity Error         */
+#define GRSPW2_STATUS_DUMMY1	0x00000020	/* bit 5 == unused      */
+#define GRSPW2_STATUS_DUMMY2	0x00000040	/* bit 6 == unused      */
+#define GRSPW2_STATUS_IA	0x00000080	/* Invalid Address      */
+#define GRSPW2_STATUS_EE	0x00000100	/* Early EOP/EEP        */
+#define GRSPW2_STATUS_AP	0x00000200	/* Active port          */
+/* bits 10-20 = unused  */
+#define GRSPW2_STATUS_LS	0x00E00000
+						/* bits 24-31 == unused */
+
+#define GRSPW2_STATUS_CLEAR_MASK     0x19F	/* TO|CE|ER|DE|PE|IA|EE */
+#define GRSPW2_STATUS_LS_BIT		21
+#define GRSPW2_STATUS_LS_MASK	       0x7
+
+#define GRSPW2_STATUS_GET_LS(x)	\
+	((x >> GRSPW2_STATUS_LS_BIT) & GRSPW2_STATUS_LS_MASK)
+
+#define GRSPW2_STATUS_LS_ERROR_RESET	0x0
+#define GRSPW2_STATUS_LS_ERROR_WAIT	0x1
+#define GRSPW2_STATUS_LS_READY		0x2
+#define GRSPW2_STATUS_LS_STARTED	0x3
+#define GRSPW2_STATUS_LS_CONNECTING	0x4
+#define GRSPW2_STATUS_LS_RUN		0x5
+
+
+
+/**
+ * GRSPW2 default address register bit masks
+ * see GR712RC-UM, p. 127
+ */
+
+#define GRSPW2_DEFAULT_ADDR_DEFADDR_BITS         0x00FF
+#define GRSPW2_DEFAULT_ADDR_DEFADDR_RESETVAL        254
+
+#define GRSPW2_DEFAULT_ADDR_DEFMASK_BITS	 0x00FF
+#define GRSPW2_DEFAULT_ADDR_DEFMASK              0xFF00
+
+
+/**
+ * GRSPW2 clock divisior register bit masks
+ * see GR712RC-UM, p. 127
+ */
+
+#define GRSPW2_CLOCKDIV_RUN_MASK		0x00FF
+#define GRSPW2_CLOCKDIV_START_MASK		0xFF00
+#define GRSPW2_CLOCKDIV_START_BIT		     8
+
+
+/**
+ * GRSPW2 destination key register
+ * see GR712RC-UM, p. 128
+ */
+
+#define GRSPW2_DESTKEY_MASK			0x00FF
+
+
+/**
+ * GRSPW2 time register
+ * see GR712RC-UM, p. 128
+ */
+
+#define GRSPW2_TIME_TCTRL_BIT			     6
+#define GRSPW2_TIME_TCTRL			0x00C0
+#define GRSPW2_TIME_TIMECNT			0x003F
+
+
+/**
+ * GRSPW2 DMA control register
+ * see GR712RC-UM, p. 128-129
+ */
+
+#define GRSPW2_DMACONTROL_TE	0x00000001	/* Transmitter enable       */
+#define GRSPW2_DMACONTROL_RE	0x00000002	/* Receiver enable          */
+#define GRSPW2_DMACONTROL_TI	0x00000004	/* Transmit interrupt       */
+#define GRSPW2_DMACONTROL_RI	0x00000008	/* Receive interrupt        */
+#define GRSPW2_DMACONTROL_AI	0x00000010	/* AHB error interrup       */
+#define GRSPW2_DMACONTROL_PS	0x00000020	/* Packet sent              */
+#define GRSPW2_DMACONTROL_PR	0x00000040	/* Packet received          */
+#define GRSPW2_DMACONTROL_TA	0x00000080	/* TX AHB error             */
+#define GRSPW2_DMACONTROL_RA	0x00000100	/* RX AHB error             */
+#define GRSPW2_DMACONTROL_AT	0x00000200	/* Abort TX                 */
+#define GRSPW2_DMACONTROL_RX	0x00000400	/* RX active                */
+#define GRSPW2_DMACONTROL_RD	0x00000800	/* RX descriptors available */
+#define GRSPW2_DMACONTROL_NS	0x00001000	/* No spill                 */
+#define GRSPW2_DMACONTROL_EN	0x00002000	/* Enable addr              */
+#define GRSPW2_DMACONTROL_SA	0x00004000	/* Strip addr               */
+#define GRSPW2_DMACONTROL_SP	0x00008000	/* Strip pid                */
+#define GRSPW2_DMACONTROL_LE	0x00010000	/* Link error disable       */
+						/* bits 17-31 == unused     */
+
+/**
+ * GRSPW2 RX maximum length register
+ * see GR712RC-UM, p. 129
+ */
+
+#define GRSPW2_RX_MAX_LEN_MASK	 0xFFFFFF
+
+
+/**
+ * GRSPW2 transmitter descriptor table address register
+ * see GR712RC-UM, p. 129
+ */
+
+#define GRSWP2_TX_DESCRIPTOR_TABLE_DESCBASEADDR_BIT			10
+#define GRSWP2_TX_DESCRIPTOR_TABLE_DESCBASEADDR_REG_MASK	0xFFFFFC00
+#define GRSWP2_TX_DESCRIPTOR_TABLE_DESCBASEADDR_BIT_MASK	  0xFFFFFC
+
+#define GRSWP2_TX_DESCRIPTOR_TABLE_DESCSEL_BIT				 4
+#define GRSPW2_TX_DESCRIPTOR_TABLE_DESCSEL_REG_MASK		     0x3F0
+#define GRSPW2_TX_DESCRIPTOR_TABLE_DESCSEL_BIT_MASK		      0x3F
+
+#define GRSPW2_TX_DESCRIPTOR_TABLE_GET_DESCSEL(x)	\
+	(((x) >> GRSWP2_TX_DESCRIPTOR_TABLE_DESCSEL_BIT)\
+	 & GRSPW2_TX_DESCRIPTOR_TABLE_DESCSEL_BIT_MASK)
+
+
+/**
+ * GRSPW2 receiver descriptor table address register
+ * see GR712RC-UM, p. 129
+ */
+
+#define GRSWP2_RX_DESCRIPTOR_TABLE_DESCBASEADDR_BIT			10
+#define GRSWP2_RX_DESCRIPTOR_TABLE_DESCBASEADDR_REG_MASK	0xFFFFFC00
+#define GRSWP2_RX_DESCRIPTOR_TABLE_DESCBASEADDR_BIT_MASK	  0xFFFFFC
+
+#define GRSWP2_RX_DESCRIPTOR_TABLE_DESCSEL_BIT				 4
+#define GRSPW2_RX_DESCRIPTOR_TABLE_DESCSEL_REG_MASK		     0x3F0
+#define GRSPW2_RX_DESCRIPTOR_TABLE_DESCSEL_BIT_MASK		      0x3F
+
+#define GRSPW2_RX_DESCRIPTOR_TABLE_GET_DESCSEL(x)	\
+	(((x) >> GRSWP2_RX_DESCRIPTOR_TABLE_DESCSEL_BIT)\
+	 & GRSPW2_RX_DESCRIPTOR_TABLE_DESCSEL_BIT_MASK)
+
+
+/**
+ * GRSPW2 dma channel address register
+ * see GR712RC-UM, p. 129
+ */
+
+#define GRSPW2_DMA_CHANNEL_MASK_BIT		     8
+#define GRSPW2_DMA_CHANNEL_MASK_BIT_MASK	0x00FF
+#define GRSPW2_DMA_CHANNEL_MASK_REG_MASK	0xFF00
+
+#define GRSPW2_DMA_CHANNEL_ADDR_REG_MASK	0x00FF
+
+
+
+
+
+/* Maximum number of TX Descriptors */
+#define GRSPW2_TX_DESCRIPTORS				   64
+
+/* Maximum number of RX Descriptors */
+#define GRSPW2_RX_DESCRIPTORS				  128
+
+#define GRSPW2_RX_DESC_SIZE				    8
+#define GRSPW2_TX_DESC_SIZE				   16
+
+/* BD Table Size (RX or TX) */
+#define GRSPW2_DESCRIPTOR_TABLE_SIZE			0x400
+
+/* alignment of a descriptor table (1024 bytes) */
+#define GRSPW2_DESCRIPTOR_TABLE_MEM_BLOCK_ALIGN		0x3FF
+
+/**
+ * GRSPW2 RX descriptor control bits
+ * see GR712RC-UM, p. 112
+ */
+
+#define GRSPW2_RX_DESC_PKTLEN_MASK	0x01FFFFFF
+/* descriptor is enabled */
+#define GRSPW2_RX_DESC_EN		0x02000000
+/* wrap back to start of table */
+#define GRSPW2_RX_DESC_WR		0x04000000
+/* packet interrupt enable */
+#define GRSPW2_RX_DESC_IE		0x08000000
+/* packet ended with error EOP */
+#define GRSPW2_RX_DESC_EP		0x10000000
+/* header CRC error detected */
+#define GRSPW2_RX_DESC_HC		0x20000000
+/* data CRC error detected */
+#define GRSPW2_RX_DESC_DC		0x40000000
+/* Packet was truncated	*/
+#define GRSPW2_RX_DESC_TR		0x80000000
+
+
+/**
+ * GRSPW2 TX descriptor control bits
+ * see GR712RC-UM, p. 115
+ * NOTE: incomplete
+ */
+
+
+/* descriptor is enabled       */
+#define GRSPW2_TX_DESC_EN	0x00001000
+/* wrap back to start of table */
+#define GRSPW2_TX_DESC_WR	0x00002000
+/* packet interrupt enabled    */
+#define GRSPW2_TX_DESC_IE	0x00004000
+
+
+
+/**
+ *	GRSPW2 register map, repeating DMA Channels 1-4 are in separate struct
+ *	see GR712RC-UM, p. 125
+ */
+
+struct grspw2_dma_regs {
+	uint32_t ctrl_status;
+	uint32_t rx_max_pkt_len;
+	uint32_t tx_desc_table_addr;
+	uint32_t rx_desc_table_addr;
+	uint32_t addr;
+	uint32_t dummy[3];
+};
+
+struct grspw2_regs {
+	uint32_t ctrl;			/* 0x00 */
+	uint32_t status;                /* 0x04 */
+	uint32_t nodeaddr;              /* 0x08 */
+	uint32_t clkdiv;                /* 0x0C */
+	uint32_t destkey;               /* 0x10 */
+	uint32_t time;                  /* 0x14 */
+	uint32_t dummy[2];              /* 0x18 - 0x1C */
+
+	struct grspw2_dma_regs dma[4];  /* 0x20 - 0x9C */
+};
+
+
+/**
+ * GRSPW2 RX descriptor word layout, see GR712-UM, p. 112
+ */
+
+__extension__
+struct grspw2_rx_desc {
+	union {
+		struct {
+			uint32_t truncated       : 1;
+			uint32_t crc_error_data  : 1;
+			uint32_t crc_error_header: 1;
+			uint32_t EEP_termination : 1;
+			uint32_t interrupt_enable: 1;
+			uint32_t wrap            : 1;
+			uint32_t enable          : 1;
+			uint32_t pkt_size        :25;
+		};
+		uint32_t pkt_ctrl;
+	};
+
+	uint32_t pkt_addr;
+};
+
+
+
+/**
+ * check whether the descriptor structure was actually aligned to be the same
+ * size as a rx descriptor block as used by the grspw2 core
+ */
+compile_time_assert((sizeof(struct grspw2_rx_desc) == GRSPW2_RX_DESC_SIZE),
+		    RXDESC_STRUCT_WRONG_SIZE);
+
+/**
+ * GRSPW2 TX descriptor word layout, see GR712-UM, pp. 115
+ */
+__extension__
+struct grspw2_tx_desc {
+	union {
+		struct {
+			uint32_t reserved1        :14;
+			uint32_t append_data_crc  : 1;
+			uint32_t append_header_crc: 1;
+			uint32_t link_error       : 1;
+			uint32_t interrupt_enable : 1;
+			uint32_t wrap             : 1;
+			uint32_t enable           : 1;
+			uint32_t non_crc_bytes    : 4;
+			uint32_t hdr_size         : 8;
+		};
+		uint32_t pkt_ctrl;
+	};
+
+	uint32_t hdr_addr;
+
+	union {
+		struct {
+			uint32_t reserved2      : 8;
+			uint32_t data_size      :24;
+		};
+		uint32_t data_size_reg;
+	};
+
+	uint32_t data_addr;
+};
+
+/**
+ * check whether the descriptor structure was actually aligned to be the same
+ * size as a tx descriptor block as used by the grspw2 core
+ */
+compile_time_assert((sizeof(struct grspw2_tx_desc) == GRSPW2_TX_DESC_SIZE),
+		    TXDESC_STRUCT_WRONG_SIZE);
+
+
+/**
+ * the descriptor ring elements are tracked in a doubly linked list
+ */
+
+
+struct grspw2_rx_desc_ring_elem {
+	struct grspw2_rx_desc	*desc;
+	struct list_head	 node;
+};
+
+
+struct grspw2_tx_desc_ring_elem {
+	struct grspw2_tx_desc	*desc;
+	struct list_head	 node;
+};
+
+
+
+/**
+ * grspw2 core configuration structure
+ * since we are not able to malloc(), it's easiest to create our lists on
+ * the stack
+ */
+
+struct grspw2_core_cfg {
+
+	/** NOTE: actual memory buffers we use could be referenced here */
+
+	/* points to the register map of a grspw2 core */
+	struct grspw2_regs *regs;
+
+	/* the core's interrupt */
+	uint32_t core_irq;
+
+	/* the ahb interrupt */
+	uint32_t ahb_irq;
+
+	uint32_t strip_hdr_bytes; /* bytes to strip from the RX packets */
+
+	uint32_t rx_bytes;
+	uint32_t tx_bytes;
+
+	struct sysobj sobj;
+
+	/* routing node, we currently support only one device and only
+	 * blind routing (i.e. address bytes are ignored */
+	struct grspw2_core_cfg *route[1];
+
+	/**
+	 * the rx and tx descriptor pointers in these arrays must point to the
+	 * descriptors in the same order as they are used by the grspw2 core so
+	 * they may be sequentially accessed at any time
+	 */
+	struct grspw2_rx_desc_ring_elem	rx_desc_ring[GRSPW2_RX_DESCRIPTORS];
+	struct grspw2_tx_desc_ring_elem	tx_desc_ring[GRSPW2_TX_DESCRIPTORS];
+
+	/**
+	 * we use two list heads for each descriptor type to manage active and
+	 * inactive descriptors
+	 * spin-lock protection is fine as long as the lists are only modified
+	 * outside of an ISR or if the ISR may schedule itself to be
+	 * re-executed at a later time when the lock has been released
+	 */
+	struct list_head		rx_desc_ring_used;
+	struct list_head		rx_desc_ring_free;
+
+	struct list_head		tx_desc_ring_used;
+	struct list_head		tx_desc_ring_free;
+
+	struct  {
+		uint32_t *rx_desc_tbl;
+		uint32_t *tx_desc_tbl;
+		uint8_t *rx_descs;
+		uint8_t *tx_descs;
+		uint8_t *tx_hdr;
+		uint32_t tx_hdr_size;
+	} alloc;
+
+};
+
+
+
+void grspw2_set_promiscuous(struct grspw2_core_cfg *cfg);
+void grspw2_unset_promiscuous(struct grspw2_core_cfg *cfg);
+
+int32_t grspw2_tx_desc_table_init(struct grspw2_core_cfg *cfg,
+				  uint32_t *mem,      uint32_t  tbl_size,
+				  uint8_t *hdr_buf,  uint32_t  hdr_size,
+				  uint8_t *data_buf, uint32_t  data_size);
+
+int32_t grspw2_rx_desc_table_init(struct grspw2_core_cfg *cfg,
+				  uint32_t *mem,     uint32_t  tbl_size,
+				  uint8_t  *pkt_buf, uint32_t  pkt_size);
+
+
+uint32_t grspw2_get_num_pkts_avail(struct grspw2_core_cfg *cfg);
+uint32_t grspw2_get_num_free_tx_desc_avail(struct grspw2_core_cfg *cfg);
+
+uint32_t grspw2_get_pkt(struct grspw2_core_cfg *cfg, uint8_t *pkt);
+uint32_t grspw2_drop_pkt(struct grspw2_core_cfg *cfg);
+uint32_t grspw2_get_next_pkt_size(struct grspw2_core_cfg *cfg);
+
+void grspw2_tick_in(struct grspw2_core_cfg *cfg);
+uint32_t grspw2_get_timecnt(struct grspw2_core_cfg *cfg);
+uint32_t grspw2_get_link_status(struct grspw2_core_cfg *cfg);
+
+void grspw2_tick_out_interrupt_enable(struct grspw2_core_cfg *cfg);
+void grspw2_set_time_rx(struct grspw2_core_cfg *cfg);
+
+int32_t grspw2_add_pkt(struct grspw2_core_cfg *cfg,
+			const void *hdr,  uint32_t hdr_size,
+			const void *data, uint32_t data_size);
+
+
+void grspw2_core_start(struct grspw2_core_cfg *cfg);
+
+
+int32_t grspw2_core_init(struct grspw2_core_cfg *cfg, uint32_t core_addr,
+			 uint8_t node_addr, uint8_t link_start,
+			 uint8_t link_run, uint32_t mtu,
+			 uint32_t core_irq, uint32_t ahb_irq,
+			 uint32_t strip_hdr_bytes);
+
+
+int32_t grspw2_enable_routing(struct grspw2_core_cfg *cfg,
+			      struct grspw2_core_cfg *route);
+
+int32_t grspw2_enable_routing_noirq(struct grspw2_core_cfg *cfg,
+				    struct grspw2_core_cfg *route);
+int32_t grspw2_route(void *userdata);
+
+int32_t grspw2_disable_routing(struct grspw2_core_cfg *cfg);
+
+void set_gr712_spw_clock(void);
+
+
+void grspw2_set_link_error_irq(struct grspw2_core_cfg *cfg);
+void grspw2_unset_link_error_irq(struct grspw2_core_cfg *cfg);
+void grspw2_spw_hardreset(struct grspw2_regs *regs);
+
+
+#endif
diff --git a/IBSW/include/ibsw.h b/IBSW/include/ibsw.h
new file mode 100644
index 0000000..4589540
--- /dev/null
+++ b/IBSW/include/ibsw.h
@@ -0,0 +1,73 @@
+/**
+ * @file   ibsw.h
+ * @ingroup ibsw_config
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   September, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#ifndef IBSW_H
+#define IBSW_H
+
+#include <stdint.h>
+#include <sys/types.h>
+
+#include <timing.h>
+#include <cpus_buffers.h>
+#include <packet_tracker.h>
+#include <grspw2.h>
+#include <error_log.h>
+
+
+struct ibsw_config;
+
+
+
+ssize_t ibsw_configure_cpus(struct cpus_buffers *pus_buf);
+
+ssize_t ibsw_configure_ptrack(struct packet_tracker *pkt, uint32_t pkts);
+
+ssize_t ibsw_configure_spw(struct grspw2_core_cfg *spw, uint32_t spw_core_addr,
+			   uint32_t spw_core_irq, uint32_t spw_addr,
+			   uint32_t tx_hdr_size, uint32_t spw_strip_hdr_bytes,
+			   uint32_t gate);
+
+ssize_t ibsw_configure_1553(struct brm_config *brm,
+			    struct cpus_buffers *pus_buf,
+			    struct packet_tracker *pkt_gnd,
+			    struct packet_tracker *pkt_obc,
+			    struct time_keeper *timer);
+
+void ibsw_configure_timing(struct time_keeper *timer,
+			   struct brm_config *brm,
+			   struct grspw2_core_cfg *spw);
+
+void ibsw_configure_1553_sync(struct brm_config __attribute__((unused)) *brm,
+			      struct time_keeper *timer);
+
+void ibsw_configure_error_log(struct error_log **error_log);
+
+int32_t ibsw_configure_edac(void);
+
+int32_t ibsw_update_cpu_0_idle(void *userdata);
+
+void ibsw_init_cpu_0_idle_timing(struct ibsw_config *cfg);
+
+void cyclical_notification(void *userdata);
+
+void ibsw_mainloop(struct ibsw_config *cfg);
+
+
+ssize_t ibsw_init(struct ibsw_config *cfg);
+
+
+#endif
diff --git a/IBSW/include/ibsw_interface.h b/IBSW/include/ibsw_interface.h
new file mode 100644
index 0000000..3ad7819
--- /dev/null
+++ b/IBSW/include/ibsw_interface.h
@@ -0,0 +1,213 @@
+/**
+ * @file    ibsw_interface.h
+ * @author  Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @author  Armin Luntzer (armin.luntzer@univie.ac.at)
+ * @date    August, 2015
+ *
+ * @copyright
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef IBSW_INTERFACE_H
+#define IBSW_INTERFACE_H
+
+#include <circular_buffer8.h>
+#include <circular_buffer16.h>
+#include <cpus_buffers.h>
+#include <packet_tracker.h>
+#include <grspw2.h>
+#include <timing.h>
+#include <core1553brm_as250.h>
+
+#if (__sparc__)
+
+#include <CrIaIasw.h>
+#include <CrFwConstants.h>
+#include <CrFwUserConstants.h>
+#include <Pckt/CrFwPckt.h>
+#include <FwProfile/FwRtConstants.h>
+#include <FwProfile/FwRtConfig.h>
+#include <FwProfile/FwRtCore.h>
+#include <CrIaDataPoolId.h>
+#include <CrIaDataPool.h>
+
+#else
+
+/* dummy definitions for testing */
+typedef int CrFwBool_t;
+typedef unsigned char CrFwDestSrc_t;
+typedef char* CrFwPckt_t;
+typedef int FwRtOutcome_t;
+
+struct FwRtDesc  {
+	int dummy;
+	int errCode;
+	int cnt;
+};
+
+typedef struct FwRtDesc* FwRtDesc_t;
+typedef unsigned short int CrFwPcktLength_t;
+typedef struct CrFwTimeStamp {
+	unsigned char t[6];
+} CrFwTimeStamp_t;
+
+#endif /* __sparc__ */
+
+
+#define RTCONT_CYC 1
+#define RTCONT_ERRLOG 2
+#define RTCONT_FLASH 3
+#define RTCONT_ACQ 4
+#define RTCONT_CMPR 5
+
+#define DEADLINE_CYC 0.125f
+#define DEADLINE_ERRLOG 0.020f
+#define DEADLINE_FLASH 0.0f
+/**
+ * DEADLINE_FLASH is the deadline for the RT container which executes
+ * flash read/write operations. It is set to zero because these operations
+ * are performed as a background task which uses the remaining time in
+ * an 8 Hz cycle. This logic is implemented in the while-loop in function
+ * flash_functional_behaviour
+ */
+#define DEADLINE_ACQ 0.0f
+#define DEADLINE_CMPR 0.0f
+
+#define RUNBEFORE_ERRLOG 0.100f /* Mantis 2159, 2175 */
+#define RUNBEFORE_FLASH 0.100f
+
+
+/* 
+   CrIbIsObcPcktAvail, CrIbIsGrdPcktAvail, CrIbObcPcktCollect 
+   and CrIbGrdPcktCollect are defined int CrIaIasw as wrappers
+   to CrIbIsMilBusPcktAvail and CrIbMilBusPcktCollect
+*/ 
+CrFwBool_t CrIbIsMilBusPcktAvail(CrFwDestSrc_t src);
+CrFwPckt_t CrIbMilBusPcktCollect(CrFwDestSrc_t src);
+CrFwBool_t CrIbMilBusPcktHandover(CrFwPckt_t pckt);
+uint32_t CrIbMilBusGetLinkCapacity(void);
+
+
+void execute_cyclical(void);
+void execute_flash_op(struct grtimer_uptime t0);
+void execute_log_move_to_flash(void);
+
+void run_rt(uint32_t rt_id, float deadline, void (*behaviour) (void));
+void execute_acquisition(void);
+void execute_compression(void);
+
+void rt_reset(void *userdata);
+void fdir_reset(void *userdata);
+void shutdown(void);
+void CrIbEnableWd(void);
+void CrIbDisableWd(void);
+void CrIbResetWd(void);
+
+void CrIbSetSyncFlag(uint32_t sync);
+
+void CrIbFbfOpen(uint32_t fbf);
+
+void CrIbFbfClose(uint32_t fbf);
+
+uint32_t CrIbFbfReadBlock(uint32_t fbf, uint32_t fbf_block, uint32_t *buf);
+
+uint32_t CrIbFbfWriteBlock(uint32_t fbf, uint32_t *buf);
+
+int32_t CrIbFlashTriggerRead(uint8_t fbf, uint16_t block, uint32_t *mem);
+
+int32_t CrIbFlashTriggerWrite(uint8_t fbf, uint32_t *mem);
+
+uint8_t CrIbFlashIsReady(void);
+
+uint32_t CrIbGetDpuBoardId(void);
+
+enum sem_op {SWITCH_ON, SWITCH_OFF, HEATER_ON, HEATER_OFF,
+	     GET_STATUS_ON, GET_FAILURE, GET_STATUS_HEATER_ON};
+
+uint32_t CrIbSemLowLevelOp(enum sem_op op);
+
+CrFwBool_t CrIbIsSEMLinkRunning(void);
+CrFwBool_t CrIbIsEGSELinkRunning(void);
+
+CrFwBool_t CrIbIsSemPcktAvail(__attribute__((unused)) CrFwDestSrc_t src);
+CrFwPckt_t CrIbSemPcktCollect(__attribute__((unused)) CrFwDestSrc_t src);
+CrFwBool_t CrIbSemPcktHandover(CrFwPckt_t pckt);
+
+void CrIbDisableSemSpWLinkErrorIRQ(void);
+void CrIbEnableSemSpWLinkErrorIRQ(void);
+
+#if (__SPW_ROUTING__)
+void CrIbDisableMonSpWLinkErrorIRQ(void);
+void CrIbEnableMonSpWLinkErrorIRQ(void);
+void CrIbEnableSpWRouting(void);
+void CrIbEnableSpWRoutingNOIRQ(void);
+void CrIbSpWRoute(void);
+void CrIbDisableSpWRouting(void);
+#endif
+
+void CrIbResetSEMSpW(void);
+
+void CrIbLogError(unsigned short evtId, unsigned char *evtData);
+void CrIbDumpRamErrorLog(unsigned char *buf);
+uint32_t CrIbDumpFlashErrorLog(unsigned int unit, unsigned int addr, char *buf);
+uint32_t get_error_log_entires_made_since_IBSW_IASW_started(void);
+int32_t error_log_move_to_flash(void);
+
+CrFwTimeStamp_t CrIbGetCurrentTime(void);
+CrFwTimeStamp_t CrIbGetNextTime(void);
+void CrIbDisableSpWTick(void);
+
+enum scrubmem {SRAM1_ID, SRAM2_ID};
+uint32_t CrIbScrubMemory(enum scrubmem memId, uint32_t scrubLen);
+uint32_t CrIbMemRepair(void);
+void CrIbResetDPU(unsigned char reset_type);
+
+uint32_t CrIbGetNotifyCnt(void);
+
+void CrIbUpdateDataPoolVariablesWithValuesFromIbswSysctlTree(uint32_t hz);
+
+void CrIbInjectFault(uint32_t mem_value, uint32_t edac_value, void *addr);
+
+
+struct flash_operation {
+	uint8_t            fbf;
+	uint16_t           block;
+	uint32_t          *mem;
+	uint8_t            isReady;
+	enum {READ, WRITE} op;
+	uint32_t           error;
+};
+
+extern struct flash_operation flash_operation;
+
+struct ibsw_config {
+	uint32_t cpu0_load;
+	uint32_t cpu1_load;
+	struct grtimer_uptime cpu_0_idle_exit;
+	struct grtimer_uptime cpu_1_idle_exit;
+	struct brm_config brm;
+	struct grspw2_core_cfg spw0;
+	struct grspw2_core_cfg spw1;
+	struct cpus_buffers pus_buf;
+	struct packet_tracker pkt_gnd;
+	struct packet_tracker pkt_obc;
+	struct time_keeper timer;
+	struct error_log *error_log;
+	uint32_t isErrLogValid;
+};
+
+extern struct ibsw_config ibsw_cfg;
+
+void CrIbUpdateDataPoolVariablesWithValuesFromIbswSysctlTree(uint32_t hz);
+
+void CrIbUpdateDataPoolVariablesWithFpgaValues(void);
+
+#endif
diff --git a/IBSW/include/io.h b/IBSW/include/io.h
new file mode 100644
index 0000000..d7f6d16
--- /dev/null
+++ b/IBSW/include/io.h
@@ -0,0 +1,141 @@
+/**
+ * @file    io.h
+ *
+ * @copyright GPLv2
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief a collection of accessor functions and macros to perform unbuffered
+ *        access to memory or hardware registers
+ */
+
+#ifndef _IO_H_
+#define _IO_H_
+
+#include <stdint.h>
+
+
+/*
+ * raw "register" io
+ * convention/calls same as in linux kernel (see arch/sparc/include/asm/io_32.h)
+ * @note: SPARSE macros are removed, we probably won't use it for the foreseeable
+ *        future
+ * @note need only big endian functions for now
+ */
+
+
+#if (__sparc__)
+
+#define ASI_LEON_NOCACHE        0x01	/* force cache miss */
+
+static inline uint8_t __raw_readb(const volatile void *addr)
+{
+	uint8_t ret;
+
+	__asm__ __volatile__("lduba	[%1] %2, %0\n\t"
+			     : "=r" (ret)
+			     : "r" (addr), "i" (ASI_LEON_NOCACHE));
+
+	return ret;
+}
+
+static inline uint16_t __raw_readw(const volatile void *addr)
+{
+	uint16_t ret;
+
+	__asm__ __volatile__("lduha	[%1] %2, %0\n\t"
+			     : "=r" (ret)
+			     : "r" (addr), "i" (ASI_LEON_NOCACHE));
+
+	return ret;
+}
+
+
+static inline uint32_t __raw_readl(const volatile void *addr)
+{
+	uint32_t ret;
+
+	__asm__ __volatile__("lda	[%1] %2, %0\n\t"
+			     : "=r" (ret)
+			     : "r" (addr), "i" (ASI_LEON_NOCACHE));
+
+	return ret;
+}
+
+static inline void __raw_writeb(uint8_t w, const volatile void *addr)
+{
+	__asm__ __volatile__("stba	%r0, [%1] %2\n\t"
+			     :
+			     : "Jr" (w), "r" (addr), "i" (ASI_LEON_NOCACHE));
+}
+
+static inline void __raw_writew(uint16_t w, const volatile void *addr)
+{
+	__asm__ __volatile__("stha	%r0, [%1] %2\n\t"
+			     :
+			     : "Jr" (w), "r" (addr), "i" (ASI_LEON_NOCACHE));
+}
+
+
+static inline void __raw_writel(uint32_t l, const volatile void *addr)
+{
+	__asm__ __volatile__("sta	%r0, [%1] %2\n\t"
+			     :
+			     : "Jr" (l), "r" (addr), "i" (ASI_LEON_NOCACHE));
+}
+
+
+#else
+
+static inline uint8_t __raw_readb(const volatile void *addr)
+{
+        return *(const volatile uint8_t *)addr;
+}
+
+static inline uint16_t __raw_readw(const volatile void *addr)
+{
+        return *(const volatile uint16_t *)addr;
+}
+
+static inline uint32_t __raw_readl(const volatile void *addr)
+{
+        return *(const volatile uint32_t *)addr;
+}
+
+static inline void __raw_writeb(uint8_t w, volatile void *addr)
+{
+        *(volatile uint8_t *)addr = w;
+}
+
+static inline void __raw_writew(uint16_t w, volatile void *addr)
+{
+        *(volatile uint16_t *)addr = w;
+}
+
+static inline void __raw_writel(uint32_t l, volatile void *addr)
+{
+        *(volatile uint32_t *)addr = l;
+}
+
+#endif
+
+
+#define ioread8(X)                      __raw_read8(X)
+#define iowrite8(X)                     __raw_write8(X)
+
+#define ioread16be(X)                   __raw_readw(X)
+#define ioread32be(X)                   __raw_readl(X)
+
+#define iowrite16be(val,X)              __raw_writew(val,X)
+#define iowrite32be(val,X)              __raw_writel(val,X)
+
+
+
+#endif
diff --git a/IBSW/include/iwf_flash.h b/IBSW/include/iwf_flash.h
new file mode 100644
index 0000000..beadc37
--- /dev/null
+++ b/IBSW/include/iwf_flash.h
@@ -0,0 +1,128 @@
+/**
+ * @file iwf_flash.h
+ * @ingroup iwf_flash
+ *
+ * @author  Armin Luntzer (armin.luntzer@univie.ac.at)
+ * @date    2015
+ *
+ * @copyright GPLv2
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @see CHEOPS-IWF-INST-IRD-020
+ * @see K9F8G08UXM 1G x 8 Bit/ 2G x 8 Bit NAND Flash Memory
+ *
+ */
+
+
+#ifndef IWF_FLASH_H
+#define IWF_FLASH_H
+
+#include <stdint.h>
+#include <compiler.h>
+
+
+
+#define FLASH_UNITS			   4
+
+#define FLASH_BLOCKS_PER_CHIP		4096
+#define FLASH_PAGES_PER_BLOCK		  64
+#define FLASH_PAGE_SIZE			4096
+
+
+#define FLASH_LOGICAL_PAGE_OFFSET_SHIFT	   2 /* see IWF-INST-IRD-020 */
+#define FLASH_LOGICAL_PAGE_ADDR_SHIFT	  14
+#define FLASH_LOGICAL_PAGE_OFFSET_BITS	  12
+
+/* a real flash page is wider than 4096 bytes... */
+#define FLASH_PAGE_OFFSET_BITS		  13
+#define FLASH_PAGE_ADDR_BITS		  18
+#define FLASH_PAGE_ADDR_SHIFT		  FLASH_PAGE_OFFSET_BITS
+
+#define FLASH_MAX_BYTES_PER_WRITE (FLASH_PAGES_PER_BLOCK * FLASH_PAGE_SIZE)
+
+
+#define FLASH_BAD_BLOCK_BYTE		4096	/* regular 0-4095 (+1) */
+#define FLASH_BAD_BLOCK_PAGES	      {0, 1}
+#define FLASH_BLOCK_VALID	  0xffffffff	/* 4 parallel flash chips */
+#define FLASH_EDAC_BLOCK_VALID		0xff
+
+
+
+#define FLASH_CMD_READ_SEQ_1		0x00000000
+#define FLASH_CMD_READ_SEQ_2		0x30303030
+#define FLASH_CMD_READ_UPDATE_ADDR_1	0x05050505
+#define FLASH_CMD_READ_UPDATE_ADDR_2	0xe0e0e0e0
+
+#define FLASH_CMD_RESET			0xffffffff
+
+#define FLASH_CMD_BLOCK_ERASE_SEQ_1	0x60606060
+#define FLASH_CMD_BLOCK_ERASE_SEQ_2	0xd0d0d0d0
+
+#define FLASH_CMD_PAGE_PROGRAM_SEQ_1	0x80808080
+#define FLASH_CMD_PAGE_PROGRAM_SEQ_2	0x10101010
+
+#define FLASH_CMD_READ_STATUS		0x70707070
+
+#define FLASH_STATUS_FAIL		0x01010101
+#define FLASH_EDAC_STATUS_FAIL		0x1
+
+__extension__
+struct iwf_flash_address {
+	union {
+		struct {
+			uint32_t skip	:1;
+			uint32_t byte5	:2;
+			uint32_t byte4	:8;
+			uint32_t byte3	:8;
+			uint32_t byte2	:5;
+			uint32_t byte1	:8;
+		};
+		uint32_t phys_addr;
+	};
+};
+
+compile_time_assert((sizeof(struct iwf_flash_address) == 4),
+		     IWF_FPGA_FLASH_ADDRESS_WRONG_SIZE);
+
+
+void flash_get_read_addr(uint32_t unit,  uint32_t *block,
+			 uint32_t *page, uint32_t *offset);
+
+void flash_get_write_addr(uint32_t unit,  uint32_t *block,
+			  uint32_t *page, uint32_t *offset);
+
+uint32_t flash_gen_phys_addr(uint32_t block, uint32_t page, uint32_t offset);
+uint32_t flash_gen_logical_addr(uint32_t block, uint32_t page, uint32_t offset);
+
+void flash_reverse_logical_addr(uint32_t addr,  uint32_t *block,
+			uint32_t *page, uint32_t *offset);
+
+int32_t flash_init_read(uint32_t unit, uint32_t block,
+			uint32_t page, uint32_t offset);
+
+uint32_t flash_read_word(uint32_t unit, uint32_t offset);
+int32_t flash_read(uint32_t unit, uint32_t offset, uint32_t *buf, uint32_t len);
+int32_t flash_read_bypass_edac(uint32_t unit, uint32_t offset,
+			       uint32_t *buf, uint32_t len);
+
+int32_t flash_stop_write(uint32_t unit);
+
+int32_t flash_init_write(uint32_t unit, uint32_t block,
+			 uint32_t page, uint32_t offset);
+
+int32_t flash_write_word(uint32_t unit, uint32_t word);
+int32_t flash_write(uint32_t unit, uint32_t *buf, uint32_t len);
+
+int32_t flash_erase_block(uint32_t unit, uint32_t block);
+
+
+
+#endif /* IWF_FLASH_H */
diff --git a/IBSW/include/iwf_fpga.h b/IBSW/include/iwf_fpga.h
new file mode 100644
index 0000000..b3bf921
--- /dev/null
+++ b/IBSW/include/iwf_fpga.h
@@ -0,0 +1,351 @@
+/**
+ * @file iwf_fpga.h
+ * @ingroup iwf_fpga
+ *
+ * @author  Armin Luntzer (armin.luntzer@univie.ac.at)
+ * @date    2015
+ *
+ * @copyright GPLv2
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief a description of the IWF's FPGA registers as used in their DPU
+ *
+ * For details, see IWF-INST-IRD-020 DPU HW-SW Interface Requirements 5.2.4.2
+ *
+ */
+
+
+#ifndef IWF_FPGA_H
+#define IWF_FPGA_H
+
+#include <stdint.h>
+#include <compiler.h>
+
+/*
+ * helper macro to fill unused 4-byte slots with "unusedXX" variables
+ * yes, this needs to be done exactly like that, or __COUNTER__ will not be expanded
+ */
+
+#define CONCAT(x, y)            x##y
+#define MACRO_CONCAT(x, y)      CONCAT(x, y)
+#define UNUSED_UINT32_SLOT       uint32_t MACRO_CONCAT(unused, __COUNTER__)
+
+
+
+/* see IWF-INST-IRD-020 DPU HW SW Interface Requirements 5.2.4.2 (p22 or so) */
+
+
+#define IWF_FPGA_BASE			0x20000000
+#define IWF_FPGA_DPU_BASE		0x20000004
+#define IWF_FPGA_RESET_BASE		0x20000010
+#define IWF_FPGA_IRQ_BASE		0x20000020
+#define IWF_FPGA_SEM_BASE		0x20000030
+#define IWF_FPGA_HEATER_BASE		0x20000040
+#define IWF_FPGA_ADC_CTRL_BASE		0x20000050
+#define IWF_FPGA_ADC_VAL_BASE		0x20000100
+#define IWF_FPGA_MEM_CTRL_BASE		0x20000200
+#define IWF_FPGA_FLASH_CMD_BASE		0x20001100
+#define IWF_FPGA_FLASH_ADDR_BASE	0x20001200
+#define IWF_FPGA_FLASH_STATUS_BASE	0x20001300
+
+#define IWF_FPGA_FLASH_1_DATA_BASE	0x01fffff0
+#define IWF_FPGA_FLASH_2_DATA_BASE	0x01fffff4
+#define IWF_FPGA_FLASH_3_DATA_BASE	0x01fffff8
+#define IWF_FPGA_FLASH_4_DATA_BASE	0x01fffffc
+
+#define FLASH_CHIPS_PER_DEVICE			 4
+#define FLASH_DEVICES				 4
+
+
+
+struct iwf_fpga_version {
+	uint32_t version;
+};
+
+struct iwf_fpga_dpu {
+	uint32_t status;
+	uint32_t addr;
+};
+
+struct iwf_fpga_reset {
+	uint32_t ctrl;
+	uint32_t status;
+};
+
+struct iwf_fpga_irq {
+	uint32_t status;
+};
+
+struct iwf_fpga_sem {
+	uint32_t ctrl;
+	uint32_t status;
+};
+
+struct iwf_fpga_heater {
+	uint32_t ctrl;
+	uint32_t status;
+};
+
+struct iwf_fpga_adc_ctrl {
+	uint32_t ctrl;
+	uint32_t status;
+};
+
+struct iwf_fpga_adc_val {
+  uint32_t adc_p3v3__adc_p5v;
+  uint32_t adc_p1v8__adc_p2v5;
+  uint32_t adc_n5v__adc_pgnd;
+  uint32_t adc_tempoh1a__adc_temp1;
+  uint32_t adc_tempoh2a__adc_tempoh1b;
+  uint32_t adc_tempoh3a__adc_tempoh2b;
+  uint32_t adc_tempoh4a__adc_tempoh3b;
+  uint32_t spare_01__adc_tempoh4b;
+  uint32_t sem_p15v__sem_p30v;
+  uint32_t sem_p5v0__sem_p7v0;
+  uint32_t spare_02__sem_n5v0;
+  uint32_t spare_03__spare_04;
+  uint32_t spare_05__spare_06;
+  uint32_t spare_07__spare_08;
+  uint32_t spare_09__spare_10;
+  uint32_t spare_11__spare_12;
+};
+
+__extension__
+struct iwf_fpga_mem_ctrl {
+	union {
+		struct {
+			uint32_t spare0		:23;
+			uint32_t sram_flash	: 1; /* write only */
+			uint32_t spare1		: 6;
+			uint32_t reserved	: 1;
+			uint32_t write_protect	: 1; /* write only */
+		} mem_ctrl;
+
+		uint32_t ctrl;
+	};
+
+	union {
+		struct {
+			uint32_t spare0		:23;
+			uint32_t sram_flash	: 1;
+			uint32_t spare1		: 5;
+			uint32_t empty		: 1;
+			uint32_t ready_busy	: 1;
+			uint32_t write_protect	: 1;
+		} mem_status;
+
+		uint32_t status;
+	};
+
+	UNUSED_UINT32_SLOT;
+
+	union {
+		struct {
+			uint32_t spare0		:24;
+			uint32_t write_protect	: 1;
+			uint32_t ready_busy	: 1;
+			uint32_t spare1		: 5;
+			uint32_t pass_fail	: 1;
+		} mem_flash_edac;
+
+		uint32_t flash_edac;
+	};
+};
+
+compile_time_assert((sizeof(struct iwf_fpga_mem_ctrl) == 16),
+		     IWF_FPGA_MEM_CTRL_WRONG_SIZE);
+
+__extension__
+struct iwf_fpga_flash_cmd {
+	union {
+		uint8_t  cmd_chip[FLASH_CHIPS_PER_DEVICE];
+		uint32_t cmd;
+	};
+};
+
+__extension__
+struct iwf_fpga_flash_addr {
+	union {
+		uint8_t  addr_chip[FLASH_CHIPS_PER_DEVICE];
+		uint32_t addr;
+	};
+};
+
+__extension__
+struct iwf_fpga_flash_status {
+	union {
+		uint8_t  status_chip[FLASH_CHIPS_PER_DEVICE];
+		uint32_t stats;
+	};
+};
+
+
+
+struct iwf_fpga_map {
+	struct iwf_fpga_version      *fpga;
+	struct iwf_fpga_dpu          *dpu;
+	struct iwf_fpga_reset        *reset;
+	struct iwf_fpga_irq          *irq;
+	struct iwf_fpga_sem          *sem;
+	struct iwf_fpga_heater       *heater;
+	struct iwf_fpga_adc_ctrl     *adc_ctrl;
+	struct iwf_fpga_adc_val      *adc_val;
+	struct iwf_fpga_mem_ctrl     *mem_ctrl;
+	struct iwf_fpga_flash_cmd    *flash_cmd;
+	struct iwf_fpga_flash_addr   *flash_addr;
+	struct iwf_fpga_flash_status *flash_status;
+
+	uint32_t *flash_data[FLASH_DEVICES];
+};
+
+
+
+extern struct iwf_fpga_map fpga;
+
+
+
+#define SEM_ON				0x00000001
+#define SEM_OFF				0xfffffffe
+
+#define SEM_HEATER_ON			0x00000010
+#define SEM_HEATER_OFF			0xffffffef
+
+#define SEM_STATUS_ON			0x00000001
+#define SEM_STATUS_FAILURE		0x00000002
+#define SEM_STATUS_HEATER_ON		0x00000010
+
+/* use one of the folllowing reset types to
+   trigger a reset using fpga_reset_ctrl_set */
+#define RESET_CTRL_UN			0x00000004 /* unknown, FDIR */
+#define RESET_CTRL_CO			0x00000008 /* commanded reset */
+#define RESET_CTRL_MB			0x00000020 /* RESET_RT mode code */
+
+/* these are the types that are reported in the 
+   DBS exchange area as reset information */
+#define DBS_EXCHANGE_RESET_TYPE_UN      0x00000000      
+#define DBS_EXCHANGE_RESET_TYPE_PO      0x00000001      
+#define DBS_EXCHANGE_RESET_TYPE_WD      0x00000002
+#define DBS_EXCHANGE_RESET_TYPE_EX      0x00000003
+#define DBS_EXCHANGE_RESET_TYPE_CO      0x00000004
+#define DBS_EXCHANGE_RESET_TYPE_CP      0x00000005
+#define DBS_EXCHANGE_RESET_TYPE_MB      0x00000006
+
+#define MEM_CTRL_SRAM_FLASH_ACTIVE	0x00000100
+#define MEM_CTRL_PROM_ACTIVE		0xfffffeff
+
+#define MEM_CTRL_WRITE_PROTECT_OFF	0x00000001
+#define MEM_CTRL_WRITE_PROTECT_ON	0xfffffffe
+
+#define MEM_CTRL_FLASH_READY		0x00000002
+#define MEM_CTRL_FLASH_EDAC_READY	0x00000004
+
+#define MEM_CTRL_FLASH_EMPTY		0x00000004
+
+
+#define FLASH_EDAC_WRITE_UNPROTECTED	0x00000080
+#define FLASH_EDAC_READ			0x00000040
+#define FLASH_EDAC_FAIL			0x00000001
+
+#define PT2_BOARD     0x00000002
+#define EM_BOARD      0x00000003
+#define EQM_BOARD_NOM 0x00000005
+#define EQM_BOARD_RED 0x00000006
+#define FM_BOARD_NOM  0x00000009
+#define FM_BOARD_RED  0x0000000A
+
+enum heater {HEATER_1, HEATER_2, HEATER_3, HEATER_4};
+
+
+
+uint32_t fpga_version_reg_get(void);
+uint32_t fpga_dpu_status_reg_get(void);
+uint32_t fpga_dpu_addr_reg_get(void);
+uint32_t fpga_sem_status_reg_get(void);
+uint32_t fpga_oper_heater_status_reg_get(void);
+
+
+void fpga_sem_switch_on(uint8_t);
+void fpga_sem_switch_off(uint8_t);
+
+void fpga_sem_heater_on(void);
+void fpga_sem_heater_off(void);
+
+uint32_t fpga_sem_get_status_on(void);
+uint32_t fpga_sem_get_status_failure(void);
+uint32_t fpga_sem_get_status_heater_on(void);
+
+/* getter functions for the BEE FPGA analog values */
+uint16_t fpga_adc_get_adc_p3v3(void);
+uint16_t fpga_adc_get_adc_p5v(void);
+uint16_t fpga_adc_get_adc_p1v8(void);
+uint16_t fpga_adc_get_adc_p2v5(void);
+uint16_t fpga_adc_get_adc_n5v(void);
+uint16_t fpga_adc_get_adc_pgnd(void);
+uint16_t fpga_adc_get_adc_tempoh1a(void);
+uint16_t fpga_adc_get_adc_temp1(void);
+uint16_t fpga_adc_get_adc_tempoh2a(void);
+uint16_t fpga_adc_get_adc_tempoh1b(void);
+uint16_t fpga_adc_get_adc_tempoh3a(void);
+uint16_t fpga_adc_get_adc_tempoh2b(void);
+uint16_t fpga_adc_get_adc_tempoh4a(void);
+uint16_t fpga_adc_get_adc_tempoh3b(void);
+uint16_t fpga_adc_get_spare_01(void);
+uint16_t fpga_adc_get_adc_tempoh4b(void);
+uint16_t fpga_adc_get_sem_p15v(void);
+uint16_t fpga_adc_get_sem_p30v(void);
+uint16_t fpga_adc_get_sem_p5v0(void);
+uint16_t fpga_adc_get_sem_p7v0(void);
+uint16_t fpga_adc_get_spare_02(void);
+uint16_t fpga_adc_get_sem_n5v0(void);
+
+
+uint32_t fpga_dpu_get_board_serial(void);
+uint32_t fpga_dpu_get_core_power_status(void);
+uint32_t fpga_dpu_get_dpu_power_status(void);
+
+
+uint16_t fpga_dpu_get_rt_addr(void);
+
+void fpga_reset_ctrl_set(uint32_t flag);
+uint32_t fpga_reset_status_get(void);
+
+void fpga_heater_on(enum heater h);
+void fpga_heater_off(enum heater h);
+
+uint32_t fpga_heater_status(enum heater h);
+
+uint32_t fpga_flash_ready(void);
+
+uint32_t fpga_flash_read_edac_status(void);
+
+uint32_t fpga_flash_edac_ready(void);
+
+uint32_t fpga_flash_empty(void);
+
+void fpga_flash_set_cmd(uint32_t unit, uint32_t cmd);
+
+void fpga_flash_write_addr(uint32_t unit, uint32_t addr);
+
+uint32_t fpga_flash_read_word(uint32_t unit);
+
+void fpga_flash_write_word(uint32_t unit, uint32_t word);
+
+uint32_t fpga_flash_read_status(uint32_t unit);
+
+void fpga_flash_enable_write_protect(void);
+void fpga_flash_disable_write_protect(void);
+
+uint32_t fpga_mem_ctrl_sram_flash_enabled(void);
+void fpga_mem_ctrl_sram_flash_set_enabled(void);
+void fpga_mem_ctrl_sram_flash_clear_enabled(void);
+
+
+#endif /* IWF_FPGA_H */
diff --git a/IBSW/include/leon/irq.h b/IBSW/include/leon/irq.h
new file mode 100644
index 0000000..cd79460
--- /dev/null
+++ b/IBSW/include/leon/irq.h
@@ -0,0 +1,110 @@
+/**
+ * @file leon/irq.h
+ *
+ * @author  Armin Luntzer (armin.luntzer@univie.ac.at)
+ * @date    2015
+ *
+ * @copyright GPLv2
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief a list of IRQ numbers used in the GR712RC
+ */
+
+
+#ifndef IRQ_H
+#define IRQ_H
+
+/**
+ * Note: some IRQs are shared betweend devices; these devices cannot usually be used a the same time and
+ * are selected by programming the appropriate jumpers on the board
+ */
+
+/**
+ *  IRQs 1-15 are external I/O interrupts
+ */
+
+#define GR712_IRL1_AHBSTAT	1	/* AHB status register, bus error				*/
+#define GR712_IRL1_APBUART_0	2	/* UART0 RX/TX interrupt (uart0)				*/
+#define GR712_IRL1_GRGPIO_0	3	/* GPIO0							*/
+#define GR712_IRL1_GRGPIO_1	4	/* GPIO1							*/
+#define GR712_IRL1_CANOC_0	5	/* OC CAN AHB interface (core 1)				*/
+#define GR712_IRL1_CANOC_1	6	/* OC CAN AHB interface (core 2)				*/
+#define GR712_IRL1_GRTIMER	7	/* Timer Unit with Latches (grtimer0); underflow		*/
+#define GR712_IRL1_GPTIMER_0	8	/* Modular Timer Unit 0 (gptimer0)				*/
+#define GR712_IRL1_GPTIMER_1	9	/* Modular Timer Unit 1						*/
+#define GR712_IRL1_GPTIMER_2	10	/* Modular Timer Unit 2						*/
+#define GR712_IRL1_GPTIMER_3	11	/* Modular Timer Unit 3						*/
+#define GR712_IRL1_IRQMP	12	/* Multi-Processor Interrupt Control (chained IRQ controller)	*/
+#define GR712_IRL1_SPICTRL	13	/* SPI Controller	(spi0)					*/
+#define GR712_IRL1_SLINK	13	/* SLINK Master		(adev14)				*/
+#define GR712_IRL1_B1553BRM	14	/* AMBA Wrapper for Core1553BRM (b1553brm0)			*/
+#define GR712_IRL1_GRETH	14	/* GR Ethernet MAC (greth0)					*/
+#define GR712_IRL1_GRTC		14	/* CCSDS Telecommand Decoder (grtc0)				*/
+#define GR712_IRL1_SATCAN	14	/* SatCAN controller (satcan0)					*/
+/* IRQ 15 is not maskable and not mapped to a particular function in GR712 */
+
+
+/**
+ * IRQ 16-31 are generated as IRQ 12 on the chained interrupt controller
+ */
+
+#define GR712_IRL2_ASCS		16	/* ASCS Master (adev27)						*/
+#define GR712_IRL2_APBUART_1	17	/* UART1 RX/TX interrupt (uart1)				*/
+#define GR712_IRL2_APBUART_2	18	/* UART2 RX/TX interrupt (uart2)				*/
+#define GR712_IRL2_APBUART_3	19	/* UART3 RX/TX interrupt (uart3)				*/
+#define GR712_IRL2_APBUART_4	20	/* UART4 RX/TX interrupt (uart4)				*/
+#define GR712_IRL2_APBUART_5	21	/* UART5 RX/TX interrupt (uart5)				*/
+#define GR712_IRL2_GRSPW2_0	22	/* GRSPW2 SpaceWire Serial Link RX/TX data interrupt (grspw0)	*/
+#define GR712_IRL2_GRSPW2_1	23	/* GRSPW2 SpaceWire Serial Link RX/TX data interrupt (grspw1)	*/
+#define GR712_IRL2_GRSPW2_2	24	/* GRSPW2 SpaceWire Serial Link RX/TX data interrupt (grspw2)	*/
+#define GR712_IRL2_GRSPW2_3	25	/* GRSPW2 SpaceWire Serial Link RX/TX data interrupt (grspw3)	*/
+#define GR712_IRL2_GRSPW2_4	26	/* GRSPW2 SpaceWire Serial Link RX/TX data interrupt (grspw4)	*/
+#define GR712_IRL2_GRSPW2_5	27	/* GRSPW2 SpaceWire Serial Link RX/TX data interrupt (grspw5)	*/
+#define GR712_IRL2_I2CMST	28	/* AMBA Wrapper for OC I2C-Master  (i2cmst0)			*/
+#define GR712_IRL2_GRTM		29	/* CCSDS Telemetry Encoder interrupt				*/
+#define GR712_IRL2_GRTMTS	30	/* CCSDS Telemetry Encoder time strobe interrupt		*/
+
+
+/**
+ * chained IRQ controller interrupt
+ */
+
+#define IRL1_EXTENDED_INT	GR712_IRL1_IRQMP
+
+
+/** aliases */
+
+#define GR712_IRL1_GPIO1	1
+#define GR712_IRL1_GPIO2	2
+#define GR712_IRL1_GPIO3	3
+#define GR712_IRL1_GPIO4	4
+#define GR712_IRL1_GPIO5	5
+#define GR712_IRL1_GPIO6	6
+#define GR712_IRL1_GPIO7	7
+#define GR712_IRL1_GPIO8	8
+#define GR712_IRL1_GPIO9	9
+#define GR712_IRL1_GPIO10	10
+#define GR712_IRL1_GPIO11	11
+#define GR712_IRL1_GPIO12	12
+#define GR712_IRL1_GPIO13	13
+#define GR712_IRL1_GPIO14	14
+#define GR712_IRL1_GPIO15	15
+
+
+
+
+
+
+
+
+
+
+#endif
diff --git a/IBSW/include/leon/irq_dispatch.h b/IBSW/include/leon/irq_dispatch.h
new file mode 100644
index 0000000..f00a6b3
--- /dev/null
+++ b/IBSW/include/leon/irq_dispatch.h
@@ -0,0 +1,40 @@
+/**
+ * @file    leon/irq_dispatch.h
+ * @ingroup irq_dispatch
+ * @author  Armin Luntzer (armin.luntzer@univie.ac.at)
+ * @date    December, 2013
+ *
+ * @copyright GPLv2
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef IRQ_DISPATCH_H
+#define IRQ_DISPATCH_H
+
+#include <stdint.h>
+
+enum prty {PRIORITY_NOW, PRIORITY_LATER};
+
+int32_t irq_dispatch_enable();
+
+void irq_queue_execute();
+
+void irq_set_level(uint32_t irq_mask, uint32_t level);
+
+int32_t irl1_register_callback(int32_t irq, enum prty priority, int32_t (* callback)(void *userdata), void *userdata);
+int32_t irl2_register_callback(int32_t irq, enum prty priority, int32_t (* callback)(void *userdata), void *userdata);
+
+int32_t irl1_deregister_callback(int32_t irq, int32_t(* callback)(void *userdata), void *userdata);
+int32_t irl2_deregister_callback(int32_t irq, int32_t(* callback)(void *userdata), void *userdata);
+
+
+#endif
diff --git a/IBSW/include/leon/leon_reg.h b/IBSW/include/leon/leon_reg.h
new file mode 100644
index 0000000..9ab3fd9
--- /dev/null
+++ b/IBSW/include/leon/leon_reg.h
@@ -0,0 +1,172 @@
+/**
+ * @file leon/leon_reg.h
+ *
+ * @author  Armin Luntzer (armin.luntzer@univie.ac.at)
+ * @date    2015
+ *
+ * @copyright GPLv2
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief layout of some registers in the GR712RC
+ *
+ */
+
+#ifndef LEON_REG_H
+#define LEON_REG_H
+
+#include <stdint.h>
+
+/**
+ * helper macro to fill unused 4-byte slots with "unusedXX" variables
+ * yes, this needs to be done exactly like that, or __COUNTER__ will not be expanded
+ */
+#define CONCAT(x, y)		x##y
+#define MACRO_CONCAT(x, y) 	CONCAT(x, y)
+#define UNUSED_UINT32_SLOT	 uint32_t MACRO_CONCAT(unused, __COUNTER__)
+
+
+#define CORE1553BRM_REG_BASE		0xFFF00000
+
+/* LEON3 APB base address is at 0x80000000
+ * documentation appears to be  conflicting sometimes, your mileage may vary
+ * offsets from base are indicated to the right for orientation
+ */
+
+#define LEON3_BASE_ADDRESS_APB		0x80000000
+
+#define LEON3_BASE_ADDRESS_FTMCTRL	0x80000000
+#define LEON3_BASE_ADDRESS_APBUART	0x80000100
+#define LEON3_BASE_ADDRESS_IRQMP	0x80000200
+#define LEON3_BASE_ADDRESS_GPTIMER	0x80000300
+#define LEON3_BASE_ADDRESS_GRGPIO_1	0x80000900
+#define LEON3_BASE_ADDRESS_GRGPIO_2	0x80000A00
+#define LEON3_BASE_ADDRESS_AHBSTAT	0x80000F00
+#define LEON3_BASE_ADDRESS_GRTIMER	0x80100600
+
+/* FTMCTRL Memory Controller Registers [p. 44] */
+
+struct leon3_ftmctrl_registermap {
+	 uint32_t mcfg1;
+	 uint32_t mcfg2;
+	 uint32_t mcfg3;
+};
+
+struct leon3_apbuart_registermap {
+	 uint32_t data;
+	 uint32_t status;
+	 uint32_t ctrl;
+	 uint32_t scaler;
+};
+
+struct leon3_grgpio_registermap {
+	uint32_t ioport_data;
+	uint32_t ioport_output_value;
+	uint32_t ioport_direction;
+	uint32_t irq_mask;
+	uint32_t irq_polarity;
+	uint32_t irq_edge;
+};
+
+struct leon3_irqctrl_registermap {
+	uint32_t irq_level;			/* 0x00	*/
+	uint32_t irq_pending;			/* 0x04 */
+	uint32_t irq_force;			/* 0x08 */
+	uint32_t irq_clear;			/* 0x0C */
+	uint32_t mp_status;			/* 0x10 */
+	uint32_t mp_broadcast;			/* 0x14 */
+	UNUSED_UINT32_SLOT;			/* 0x18 */
+	UNUSED_UINT32_SLOT;			/* 0x1C */
+	UNUSED_UINT32_SLOT;			/* 0x20 */
+	UNUSED_UINT32_SLOT;			/* 0x24 */
+	UNUSED_UINT32_SLOT;			/* 0x28 */
+	UNUSED_UINT32_SLOT;			/* 0x2C */
+	UNUSED_UINT32_SLOT;			/* 0x30 */
+	UNUSED_UINT32_SLOT;			/* 0x34 */
+	UNUSED_UINT32_SLOT;			/* 0x38 */
+	UNUSED_UINT32_SLOT;			/* 0x3C */
+	uint32_t irq_mpmask[2];			/* 0x40 CPU 0 */
+						/* 0x44 CPU 1 */
+	UNUSED_UINT32_SLOT;			/* 0x48 */
+	UNUSED_UINT32_SLOT;			/* 0x4C */
+	UNUSED_UINT32_SLOT;			/* 0x50 */
+	UNUSED_UINT32_SLOT;			/* 0x54 */
+	UNUSED_UINT32_SLOT;			/* 0x58 */
+	UNUSED_UINT32_SLOT;			/* 0x5C */
+	UNUSED_UINT32_SLOT;			/* 0x60 */
+	UNUSED_UINT32_SLOT;			/* 0x64 */
+	UNUSED_UINT32_SLOT;			/* 0x68 */
+	UNUSED_UINT32_SLOT;			/* 0x6C */
+	UNUSED_UINT32_SLOT;			/* 0x70 */
+	UNUSED_UINT32_SLOT;			/* 0x74 */
+	UNUSED_UINT32_SLOT;			/* 0x78 */
+	UNUSED_UINT32_SLOT;			/* 0x7C */
+	uint32_t irq_mpforce[2];		/* 0x80 CPU 0*/
+						/* 0x84 CPU 1*/
+	UNUSED_UINT32_SLOT;			/* 0x88 */
+	UNUSED_UINT32_SLOT;			/* 0x8C */
+	UNUSED_UINT32_SLOT;			/* 0x90 */
+	UNUSED_UINT32_SLOT;			/* 0x94 */
+	UNUSED_UINT32_SLOT;			/* 0x98 */
+	UNUSED_UINT32_SLOT;			/* 0x9C */
+	UNUSED_UINT32_SLOT;			/* 0xA0 */
+	UNUSED_UINT32_SLOT;			/* 0xA4 */
+	UNUSED_UINT32_SLOT;			/* 0xA8 */
+	UNUSED_UINT32_SLOT;			/* 0xAC */
+	UNUSED_UINT32_SLOT;			/* 0xB0 */
+	UNUSED_UINT32_SLOT;			/* 0xB4 */
+	UNUSED_UINT32_SLOT;			/* 0xB8 */
+	UNUSED_UINT32_SLOT;			/* 0xBC */
+	uint32_t extended_irq_id[2];		/* 0xC0 CPU 0*/
+						/* 0xC4 CPU 1*/
+};
+
+
+
+struct leon3_ahbstat_registermap {
+	uint32_t status;
+	uint32_t failing_address;
+};
+
+
+
+struct gptimer_timer {
+	uint32_t value;
+	uint32_t reload;
+	uint32_t ctrl;
+	uint32_t unused;
+};
+
+struct gptimer_unit {
+	uint32_t scaler;
+	uint32_t scaler_reload;
+	uint32_t config;
+	uint32_t unused;
+	struct gptimer_timer timer[4];
+};
+
+struct grtimer_timer {
+	uint32_t value;
+	uint32_t reload;
+	uint32_t ctrl;
+	uint32_t latch_value;
+};
+
+struct grtimer_unit {
+	uint32_t scaler;
+	uint32_t scaler_reload;
+	uint32_t config;
+
+	uint32_t irq_select;
+
+	struct grtimer_timer timer[2];
+};
+
+#endif
diff --git a/IBSW/include/leon3_dsu.h b/IBSW/include/leon3_dsu.h
new file mode 100644
index 0000000..8725222
--- /dev/null
+++ b/IBSW/include/leon3_dsu.h
@@ -0,0 +1,263 @@
+/**
+ * @file    leon3_dsu.h
+ * @ingroup leon3_dsu
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   February, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef LEON3_DSU_H
+#define LEON3_DSU_H
+
+
+/*
+ * helper macro to fill unused 4-byte slots with "unusedXX" variables
+ * yes, this needs to be done exactly like that, or __COUNTER__ will not be expanded
+ */
+
+#define CONCAT(x, y)            x##y
+#define MACRO_CONCAT(x, y)      CONCAT(x, y)
+#define UNUSED_UINT32_SLOT       uint32_t MACRO_CONCAT(unused, __COUNTER__)
+
+
+
+#ifndef NWINDOWS
+#define NWINDOWS	8	/* number of register windows */
+#endif
+
+
+/**
+ * @see GR712-UM v2.3 pp. 81
+ */
+
+
+#define DSU_CTRL		0x90000000
+#define DSU_TIMETAG		0x90000008
+
+#define DSU_BREAK_STEP		0x90000020	/* mapped only in CPU0 DSU */
+#define DSU_MODE_MASK		0x90000024	/* mapped only in CPU0 DSU */
+
+#define DSU_AHB_TRACE_CTRL	0x90000040
+#define DSU_AHB_TRACE_IDX	0x90000044
+
+#define DSU_AHB_BP_ADDR_1	0x90000050
+#define DSU_AHB_MASK_1		0x90000054
+#define DSU_AHB_BP_ADDR_2	0x90000058
+#define DSU_AHB_MASK_2		0x9000005c
+
+#define DSU_INST_TRCE_BUF_START	0x90100000
+#define DSU_INST_TRCE_BUF_LINES	256
+#define DSU_INST_TRCE_CTRL	0x90110000
+
+#define DSU_AHB_TRCE_BUF_START	0x90200000
+#define DSU_AHB_TRCE_BUF_LINES	256
+
+#define DSU_IU_REG		0x90300000
+
+#define DSU_IU_REG_CHECKBITS	0x90300800
+
+#define DSU_FPU_REG		0x90301000
+
+#define DSU_IU_SPECIAL_REG	0x90400000
+
+#define DSU_REG_Y		0x90400000
+#define DSU_REG_PSR		0x90400004
+#define DSU_REG_WIM		0x90400008
+#define DSU_REG_TBR		0x9040000C
+#define DSU_REG_PC		0x90400010
+#define DSU_REG_NPC		0x90400014
+#define DSU_REG_FSR		0x90400018
+#define DSU_REG_CPSR		0x9040001C
+
+
+
+
+#define DSU_OFFSET_CPU(x)	((x & 0x07) << 24)
+#define DSU_BASE(x)		(DSU_CTRL + DSU_OFFSET_CPU(x))
+
+
+/**
+ * @see GR712-UM v2.3 p. 82
+ */
+#define DSU_CTRL_TE		(1 <<  0)	/* trace enable            */
+#define DSU_CTRL_BE		(1 <<  1)	/* break on error          */
+#define DSU_CTRL_BW		(1 <<  2)	/* break on IU watchpoint  */
+#define DSU_CTRL_BS		(1 <<  3)	/* break on s/w breakpoint */
+#define DSU_CTRL_BX		(1 <<  4)	/* break on any trap       */
+#define DSU_CTRL_BZ		(1 <<  5)	/* break on error trap     */
+#define DSU_CTRL_DM		(1 <<  6)	/* RO: debug mode status   */
+						/* bits 7, 8 are unused    */
+#define DSU_CTRL_PE		(1 <<  9)	/* processor error mode    */
+#define DSU_CTRL_HL		(1 << 10)	/* processor halt mode     */
+#define DSU_CTRL_PW		(1 << 11)	/* processor power mode    */
+
+
+
+
+
+
+/**
+ * maps the break and step register
+ * @see GR712-UM v2.3 p.82
+ */
+__extension__
+struct dsu_break_step {
+	union {
+		struct {
+			uint16_t single_step;
+			uint16_t break_now;
+		};
+		uint32_t reg;
+	};
+};
+
+/**
+ * maps the debug mode maskregister
+ * @see GR712-UM v2.3 p.83
+ */
+__extension__
+struct dsu_mode_mask {
+	union {
+		struct {
+			uint16_t debug_mode;
+			uint16_t enter_debug;
+		};
+		uint32_t reg;
+	};
+};
+
+
+
+/**
+ * maps the AHB trace buffer registers from DSU_AHB_TRACE_CTRL to DSU_AHB_MASK_2
+ * must be pointed to DSU_AHB_TRACE_CTRL
+ */
+
+struct ahb_bp_reg {
+	uint32_t addr;
+	uint32_t mask;
+};
+
+struct dsu_ahb_trace_ctrl {
+	uint32_t ctrl;
+	uint32_t idx;
+	UNUSED_UINT32_SLOT;
+	UNUSED_UINT32_SLOT;
+	UNUSED_UINT32_SLOT;
+	struct ahb_bp_reg bp[2];
+};
+
+
+/**
+ * a single line in the instruction trace buffer, see GR712-UM v2.3 p.80
+ */
+__extension__
+struct instr_trace_buffer_line {
+
+	union {
+		struct {
+			uint32_t unused		  :1;
+			uint32_t multi_cycle_inst :1;
+			uint32_t timetag	  :30;
+			uint32_t load_store_param :32;
+			uint32_t program_cntr	  :30;
+			uint32_t instr_trap	  :1;
+			uint32_t proc_error_mode  :1;
+			uint32_t opcode		  :32;
+		};
+		uint32_t field[4];
+	};
+}__attribute__((packed));
+
+/**
+ * maps the instruction trace buffer, must be pointed to DSU_INST_TRCE_BUF_START
+ */
+
+struct dsu_instr_trace_buffer {
+	struct instr_trace_buffer_line line[DSU_INST_TRCE_BUF_LINES];
+};
+
+
+/**
+ * a single line in the AHB trace buffer, see GR712-UM v2.3 p.79
+ */
+__extension__
+struct ahb_trace_buffer_line {
+
+	union {
+		struct {
+			uint32_t ahb_bp_hi	  :1;
+			uint32_t unused1	  :1;
+			uint32_t timetag	  :30;
+			uint32_t unused2	  :1;
+			uint32_t hirq		  :15;
+			uint32_t hwrite		  :1;
+			uint32_t htrans		  :2;
+			uint32_t hsize		  :3;
+			uint32_t hburst		  :3;
+			uint32_t hmaster	  :4;
+			uint32_t hmastlock	  :1;
+			uint32_t hresp		  :2;
+			uint32_t load_store_data  :32;
+			uint32_t load_store_addr  :32;
+		};
+		uint32_t field[4];
+	};
+}__attribute__((packed));
+
+
+/**
+ * maps the AHB trace buffer, must be pointed to DSU_AHB_TRCE_BUF_START
+ */
+
+struct dsu_ahb_trace_buffer {
+	struct ahb_trace_buffer_line line[DSU_AHB_TRCE_BUF_LINES];
+};
+
+
+
+
+
+void dsu_set_noforce_debug_mode(uint32_t cpu);
+void dsu_set_cpu_debug_on_error(uint32_t cpu);
+void dsu_set_cpu_break_on_iu_watchpoint(uint32_t cpu);
+void dsu_set_cpu_break_on_breakpoint(uint32_t cpu);
+void dsu_set_cpu_break_on_trap(uint32_t cpu);
+void dsu_set_cpu_break_on_error_trap(uint32_t cpu);
+void dsu_set_force_debug_on_watchpoint(uint32_t cpu);
+uint32_t dsu_get_reg_psr(uint32_t cpu);
+uint32_t dsu_get_reg_tbr(uint32_t cpu);
+void dsu_set_reg_psr(uint32_t cpu, uint32_t val);
+
+uint32_t dsu_get_reg_wim(uint32_t cpu);
+uint32_t dsu_get_reg_pc(uint32_t cpu);
+uint32_t dsu_get_reg_sp(uint32_t cpu, uint32_t cwp);
+uint32_t dsu_get_reg_fsr(uint32_t cpu);
+
+
+void dsu_set_reg_tbr(uint32_t cpu, uint32_t val);
+void dsu_set_reg_pc(uint32_t cpu, uint32_t val);
+void dsu_set_reg_npc(uint32_t cpu, uint32_t val);
+uint32_t dsu_get_reg_npc(uint32_t cpu);
+void dsu_clear_iu_reg_file(uint32_t cpu);
+void dsu_clear_cpu_debug_on_error(uint32_t cpu);
+void dsu_clear_cpu_break_on_iu_watchpoint(uint32_t cpu);
+void dsu_clear_cpu_break_on_breakpoint(uint32_t cpu);
+void dsu_clear_cpu_break_on_trap(uint32_t cpu);
+void dsu_clear_cpu_break_on_error_trap(uint32_t cpu);
+void dsu_clear_force_debug_on_watchpoint(uint32_t cpu);
+void dsu_set_reg_wim(uint32_t cpu, uint32_t val);
+void dsu_set_reg_sp(uint32_t cpu, uint32_t cwp, uint32_t val);
+void dsu_set_reg_fp(uint32_t cpu, uint32_t cwp, uint32_t val);
+
+#endif /* LEON3_DSU_H */
diff --git a/IBSW/include/leon3_gptimer.h b/IBSW/include/leon3_gptimer.h
new file mode 100644
index 0000000..be128eb
--- /dev/null
+++ b/IBSW/include/leon3_gptimer.h
@@ -0,0 +1,70 @@
+/**
+ * @file   leon3_gptimer.h
+ * @ingroup timing
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   July, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef LEON3_GPTIMER_H
+#define LEON3_GPTIMER_H
+
+#include <io.h>
+#include <leon/leon_reg.h>
+
+
+
+
+void gptimer_set_scaler_reload(struct gptimer_unit *ptu, uint32_t value);
+uint32_t gptimer_get_scaler_reload(struct gptimer_unit *ptu);
+
+void gptimer_set_interrupt_enabled(struct gptimer_unit *ptu, uint32_t timer);
+void gptimer_clear_interrupt_enabled(struct gptimer_unit *ptu, uint32_t timer);
+
+void gptimer_set_load(struct gptimer_unit *ptu, uint32_t timer);
+void gptimer_clear_load(struct gptimer_unit *ptu, uint32_t timer);
+
+void gptimer_set_enabled(struct gptimer_unit *ptu, uint32_t timer);
+void gptimer_clear_enabled(struct gptimer_unit *ptu, uint32_t timer);
+
+void gptimer_set_restart(struct gptimer_unit *ptu, uint32_t timer);
+void gptimer_clear_restart(struct gptimer_unit *ptu, uint32_t timer);
+
+void gptimer_set_chained(struct gptimer_unit *ptu, uint32_t timer);
+void gptimer_clear_chained(struct gptimer_unit *ptu, uint32_t timer);
+
+uint32_t gptimer_get_interrupt_pending_status(struct gptimer_unit *ptu,
+					      uint32_t timer);
+void gptimer_clear_interrupt_pending_status(struct gptimer_unit *ptu,
+					    uint32_t timer);
+
+uint32_t gptimer_get_num_implemented(struct gptimer_unit *ptu);
+uint32_t gptimer_get_first_timer_irq_id(struct gptimer_unit *ptu);
+
+void gptimer_set_value(struct gptimer_unit *ptu,
+		       uint32_t timer,
+		       uint32_t value);
+uint32_t gptimer_get_value(struct gptimer_unit *ptu, uint32_t timer);
+
+void gptimer_set_reload(struct gptimer_unit *ptu,
+			uint32_t timer,
+			uint32_t reload);
+uint32_t gptimer_get_reload(struct gptimer_unit *ptu, uint32_t timer);
+
+void gptimer_start(struct gptimer_unit *ptu, uint32_t timer, uint32_t value);
+
+void gptimer_start_cyclical(struct gptimer_unit *ptu,
+			    uint32_t timer,
+			    uint32_t value);
+
+#endif /* LEON3_GPTIMER_H */
diff --git a/IBSW/include/leon3_grtimer.h b/IBSW/include/leon3_grtimer.h
new file mode 100644
index 0000000..9462060
--- /dev/null
+++ b/IBSW/include/leon3_grtimer.h
@@ -0,0 +1,73 @@
+/**
+ * @file   leon3_grtimer.h
+ * @ingroup timing
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   July, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef LEON3_GRTIMER_H
+#define LEON3_GRTIMER_H
+
+#include <io.h>
+#include <leon/leon_reg.h>
+
+
+#define LEON3_GRTIMER_CFG_LATCH		0x800
+
+
+void grtimer_set_scaler_reload(struct grtimer_unit *rtu, uint32_t value);
+uint32_t grtimer_get_scaler_reload(struct grtimer_unit *rtu);
+
+void grtimer_set_interrupt_enabled(struct grtimer_unit *rtu, uint32_t timer);
+void grtimer_clear_interrupt_enabled(struct grtimer_unit *rtu, uint32_t timer);
+
+void grtimer_set_load(struct grtimer_unit *rtu, uint32_t timer);
+void grtimer_clear_load(struct grtimer_unit *rtu, uint32_t timer);
+
+void grtimer_set_enabled(struct grtimer_unit *rtu, uint32_t timer);
+void grtimer_clear_enabled(struct grtimer_unit *rtu, uint32_t timer);
+
+void grtimer_set_restart(struct grtimer_unit *rtu, uint32_t timer);
+void grtimer_clear_restart(struct grtimer_unit *rtu, uint32_t timer);
+
+void grtimer_set_chained(struct grtimer_unit *rtu, uint32_t timer);
+void grtimer_clear_chained(struct grtimer_unit *rtu, uint32_t timer);
+
+uint32_t grtimer_get_interrupt_pending_status(struct grtimer_unit *rtu,
+					      uint32_t timer);
+void grtimer_clear_interrupt_pending_status(struct grtimer_unit *rtu,
+					    uint32_t timer);
+
+uint32_t grtimer_get_num_implemented(struct grtimer_unit *rtu);
+
+uint32_t grtimer_get_first_timer_irq_id(struct grtimer_unit *rtu);
+
+void grtimer_set_value(struct grtimer_unit *rtu,
+		       uint32_t timer,
+		       uint32_t value);
+uint32_t grtimer_get_value(struct grtimer_unit *rtu, uint32_t timer);
+
+
+void grtimer_set_reload(struct grtimer_unit *rtu,
+			uint32_t timer,
+			uint32_t reload);
+uint32_t grtimer_get_reload(struct grtimer_unit *rtu, uint32_t timer);
+
+void grtimer_set_latch_irq(struct grtimer_unit *rtu, uint32_t irq);
+void grtimer_clear_latch_irq(struct grtimer_unit *rtu, uint32_t irq);
+void grtimer_enable_latch(struct grtimer_unit *rtu);
+
+uint32_t grtimer_get_latch_value(struct grtimer_unit *rtu, uint32_t timer);
+
+#endif /* LEON3_GRTIMER_H */
diff --git a/IBSW/include/leon3_grtimer_longcount.h b/IBSW/include/leon3_grtimer_longcount.h
new file mode 100644
index 0000000..20e35e1
--- /dev/null
+++ b/IBSW/include/leon3_grtimer_longcount.h
@@ -0,0 +1,51 @@
+/**
+ * @file   leon3_grtimer_longcount.h
+ * @ingroup timing
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   July, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef LEON3_GRTIMER_LONGCOUNT_H
+#define LEON3_GRTIMER_LONGCOUNT_H
+
+#include <leon/leon_reg.h>
+#include <leon3_grtimer.h>
+
+/**
+ * "coarse" contains the counter of the secondary (chained) timer in
+ * multiples of seconds and is chained
+ * to the "fine" timer, which should hence underflow in a 1-second cycle
+ */
+
+struct grtimer_uptime {
+	uint32_t coarse;
+	uint32_t fine;
+};
+
+
+int32_t grtimer_longcount_start(struct grtimer_unit *rtu,
+				uint32_t scaler_reload,
+				uint32_t fine_ticks_per_sec,
+				uint32_t coarse_ticks_max);
+
+void grtimer_longcount_get_uptime(struct grtimer_unit *rtu,
+				  struct grtimer_uptime *up);
+
+double grtimer_longcount_difftime(struct grtimer_unit *rtu,
+				  struct grtimer_uptime time1,
+				  struct grtimer_uptime time0);
+
+uint32_t grtimer_longcount_get_latch_time_diff(struct grtimer_unit *rtu);
+
+#endif /* LEON3_GRTIMER_LONGCOUNT_H */
diff --git a/IBSW/include/leon3_timers.h b/IBSW/include/leon3_timers.h
new file mode 100644
index 0000000..58d75fb
--- /dev/null
+++ b/IBSW/include/leon3_timers.h
@@ -0,0 +1,35 @@
+/**
+ * @file   leon3_timers.h
+ * @ingroup timing
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   July, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+
+#ifndef LEON3_TIMERS_H
+#define LEON3_TIMERS_H
+
+
+#define LEON3_TIMER_EN	0x00000001       /* enable counting */
+#define LEON3_TIMER_RS	0x00000002       /* restart from timer reload value */
+#define LEON3_TIMER_LD	0x00000004       /* load counter    */
+#define LEON3_TIMER_IE	0x00000008       /* irq enable      */
+#define LEON3_TIMER_IP	0x00000010       /* irq pending (clear by writing 0 */
+#define LEON3_TIMER_CH	0x00000020       /* chain with preceeding timer */
+
+#define LEON3_CFG_TIMERS_MASK	0x00000007
+#define LEON3_CFG_IRQNUM_MASK	0x000000f8
+#define LEON3_CFG_IRQNUM_SHIFT	       0x3
+
+#endif
diff --git a/IBSW/include/list.h b/IBSW/include/list.h
new file mode 100644
index 0000000..68466b8
--- /dev/null
+++ b/IBSW/include/list.h
@@ -0,0 +1,349 @@
+/**
+.  @file list.h
+ * @ingroup linked_list
+ *
+ * @note This list implementation was shamelessly stolen and modified from the
+ *       linux kernel's include/linux/list.h
+ *       Its API (if you will) is used in this (currently non-GPL) project as
+ *       under the assumption that the inclusion of header files does not
+ *       automatically imply derivative work, see
+ *       http://lkml.iu.edu//hypermail/linux/kernel/0301.1/0362.html
+ *
+ *       No explicit copyright or author statement is given in the original
+ *       file, so we assume per the Linux COPYING file:
+ *
+ * @author Linus Torvalds (and others who actually wrote the linux kernel
+ *         version)
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at) (local modifications or
+ *         extensions)
+ *
+ * @copyright
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @defgroup linked_list Linked Lists
+ * @brief a modified doubly-linked list implementation from the linux kernel
+ *
+ *
+ * This is a (slightly modified) doubly-linked list implementation from the
+ * Linux kernel. An easy to understand explanation of
+ * how it works and is used can be found here
+ * http://kernelnewbies.org/FAQ/LinkedLists
+ *
+ * Be smart
+ * -----
+ * It is a valid to criticise linked lists as generally performing badly
+ * if you traverse their entries at high frequency rather than just
+ * manipulating them. This can be especially true (and has been demonstrated
+ * numerous times) for implementations like std:list.
+ *
+ * Please consider the following though: linked lists are not inherently
+ * slow because of how they work algorithmically (*the opposite is true*),
+ * but rather because how their cache hit (or miss) rate is in
+ * configurations where entries are randomly scattered in memory rather
+ * than layed out in one big chunk.
+ *
+ * Be smart. Don't do that. Allocate a pool in a __single chunk__ and enjoy the
+ * cache performance. Do not use larger chunks than the page size of your
+ * platform if you have MMU support. If you need more than that, you probably
+ * need to redesign your program anyways.
+ *
+ * This does of course not apply as long as you do access your lists only
+ * at slow rates (i.e. in the order of several tens of ms) or if performance
+ * is not at all critial.
+ *
+ */
+
+#ifndef LIST_H
+#define LIST_H
+
+#ifdef LIST_HEAD
+#undef LIST_HEAD
+#endif
+
+struct list_head {
+	struct list_head *next, *prev;
+};
+
+#define LIST_HEAD_INIT(name) { &(name), &(name) }
+
+#define LIST_HEAD(name) \
+	struct list_head name = LIST_HEAD_INIT(name)
+
+static inline void __list_add(struct list_head *new, struct list_head *prev, struct list_head *next)
+{
+	next->prev = new;
+	new->next  = next;
+	new->prev  = prev;
+	prev->next = new;
+}
+
+/**
+ * @brief add a new entry
+ * @param new: new entry to be added
+ * @param head: list head to add it after
+ *
+ * Insert a new entry after the specified head.
+ * This is good for implementing stacks.
+ */
+
+static inline void list_add(struct list_head *new, struct list_head *head)
+{
+	__list_add(new, head, head->next);
+}
+
+static inline void INIT_LIST_HEAD(struct list_head *list)
+{
+	list->next = list;
+	list->prev = list;
+}
+
+
+/**
+ * @brief get the struct for this entry
+ * @param ptr:	the &struct list_head pointer.
+ * @param type:	the type of the struct this is embedded in.
+ * @param member:	the name of the list_struct within the struct.
+ */
+#define list_entry(ptr, type, member) \
+	((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
+
+
+/**
+ * @brief iterate over list of given type
+ * @param pos:	the type * to use as a loop counter.
+ * @param head:	the head for your list.
+ * @param member:	the name of the list_struct within the struct.
+ * @param note	modified to use __typeof__()
+ */
+
+#define list_for_each_entry(pos, head, member)				\
+	for (pos = list_entry((head)->next, __typeof__(*pos), member);	\
+	     &pos->member != (head); 					\
+	     pos = list_entry(pos->member.next, __typeof__(*pos), member))
+
+
+/**
+ * @brief iterate over list of given type safe against removal of list entry
+ * @param pos:	the type * to use as a loop counter.
+ * @param n:		another type * to use as temporary storage
+ * @param head:	the head for your list.
+ * @param member:	the name of the list_struct within the struct.
+ */
+#define list_for_each_entry_safe(pos, n, head, member)			\
+	for (pos = list_entry((head)->next, __typeof__(*pos), member),	\
+	     n = list_entry(pos->member.next, __typeof__(*pos), member);\
+	     &pos->member != (head); 					\
+	     pos = n, n = list_entry(n->member.next, __typeof__(*pos), member))
+
+
+/**
+ * @brief iterator wrapper start
+ * @param pos:	the type * to use as a loop counter.
+ * @param head:	the head for your list.
+ * @param member:	the name of the list_struct within the struct.
+ * @param type:	the type of struct
+ * @param warning	requires list_entry_while() to close statement
+ * @param note	this construction is necessary for a truly circular list that is "headless"
+ * @param note	and can be iterated from any starting element without additional overhead
+ * @param note	compared to the LIST_HEAD/list_for_each_entry approach
+ * @param note	check if this is functional for all targets (confirmed: gcc 4.8.2)
+ */
+
+#define list_entry_do(pos, head, member, type)		\
+	{						\
+	pos = list_entry((head), type, member);		\
+	do						\
+	{						\
+
+
+/**
+ * @brief list iterator wrapper stop
+ * @param pos:	the type * to use as a loop counter.
+ * @param head:	the head for your list.
+ * @param member:	the name of the list_struct within the struct.
+ * @param type:	the type of struct
+ * @param warning	requires list_entry_do() to open statement
+ * @param note	see list_entry_while()
+ */
+
+#define list_entry_while(pos, head, member, type)		\
+	}							\
+	while (pos = list_entry(pos->member.next, type, member),\
+	       &pos->member != head); 				\
+	}
+
+/**
+ * @brief the list entry do-while equivalent fo a code block
+ * @param pos:	the type * to use as a loop counter.
+ * @param head:	the head for your list.
+ * @param member:	the name of the list_struct within the struct.
+ * @param type:	the type of struct
+ * @param _CODE_:	a code segment
+ * @param note	see list_entry_while(), list_entry_do()
+ */
+
+#define list_entry_do_while(pos, head, member, type, _CODE_) \
+	list_entry_do(pos,head,member,type)		     \
+	{						     \
+		_CODE_;					     \
+	} list_entry_while(pos,head,member,type)
+
+
+/**
+ * @brief reverse iterate over list of given type
+ * @param pos:	the type * to use as a loop counter.
+ * @param head:	the head for your list.
+ * @param member:	the name of the list_struct within the struct.
+ * (slightly modified in case there is no typeof() functionality in target compiler)
+ */
+
+#define list_for_each_entry_rev(pos, head, member)			\
+	for (pos = list_entry((head)->prev, __typeof__(*pos), member);	\
+	     &pos->member != (head); 					\
+	     pos = list_entry(pos->member.prev, __typeof(*pos), member))
+
+
+/*
+ * @brief delete a list entry by making the prev/next entries
+ *        point to each other.
+ *
+ * This is only for internal list manipulation where we know
+ * the prev/next entries already!
+ */
+static inline void __list_del(struct list_head *prev, struct list_head *next)
+{
+	next->prev = prev;
+	prev->next = next;
+}
+
+
+/**
+ * @brief deletes entry from list.
+ * @param entry: the element to delete from the list.
+ * @note list_empty on entry does not return true after this,
+ *       the entry is in an undefined state.
+ */
+
+static inline void list_del(struct list_head *entry)
+{
+	__list_del(entry->prev, entry->next);
+	entry->next = (void *) 0;
+	entry->prev = (void *) 0;
+}
+
+
+/**
+ * @brief deletes entry from list.
+ * @param entry: the element to delete from the list.
+ * @brief list_empty() on entry does not return true after this, the entry is
+ *        in an undefined state.
+ */
+
+static inline void __list_del_entry(struct list_head *entry)
+{
+	__list_del(entry->prev, entry->next);
+}
+
+/**
+ * @brief deletes entry from list and reinitialize it.
+ * @param entry: the element to delete from the list.
+ */
+static inline void list_del_init(struct list_head *entry)
+{
+	__list_del_entry(entry);
+	INIT_LIST_HEAD(entry);
+}
+
+/**
+ * @brief add a new entry
+ * @param new: new entry to be added
+ * @param head: list head to add it before
+ *
+ * Insert a new entry before the specified head.
+ * This is useful for implementing queues.
+ */
+
+static inline void list_add_tail(struct list_head *new, struct list_head *head)
+{
+	__list_add(new, head->prev, head);
+}
+
+
+/**
+ * @brief replace old entry by new one
+ * @param old : the element to be replaced
+ * @param new : the new element to insert
+ *
+ * If @param old was empty, it will be overwritten.
+ */
+
+static inline void list_replace(struct list_head *old,
+				struct list_head *new)
+{
+	new->next = old->next;
+	new->next->prev = new;
+	new->prev = old->prev;
+	new->prev->next = new;
+}
+
+
+/**
+ * @brief tests whether a list is empty
+ * @param head: the list to test.
+ */
+
+static inline int list_empty(struct list_head *head)
+{
+	return head->next == head;
+}
+
+/**
+ * @brief tests whether there is at least one element in the list
+ * @param head: the list to test.
+ */
+
+static inline int list_filled(struct list_head *head)
+{
+	return head->next != head;
+}
+
+
+/**
+ * @brief delete from one list and add as another's tail
+ * @param list: the entry to move
+ * @param head: the head that will follow our entry
+ */
+
+static inline void list_move_tail(struct list_head *list,
+				  struct list_head *head)
+{
+        __list_del(list->prev, list->next);
+        list_add_tail(list, head);
+}
+
+
+/**
+ * @brief rotate the list to the left
+ * @param head: the head of the list
+ */
+
+static inline void list_rotate_left(struct list_head *head)
+{
+        struct list_head *first;
+
+        if (!list_empty(head)) {
+                first = head->next;
+                list_move_tail(first, head);
+        }
+}
+
+
+#endif
diff --git a/IBSW/include/memcfg.h b/IBSW/include/memcfg.h
new file mode 100644
index 0000000..7dc53b2
--- /dev/null
+++ b/IBSW/include/memcfg.h
@@ -0,0 +1,108 @@
+/**
+ * @file   memcfg.h
+ * @ingroup memcfg
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   March, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef MEMCFG_H
+#define MEMCFG_H
+
+#include <stdint.h>
+
+
+/**
+ * @see GR712-UM v2.3 pp. 66
+ */
+
+
+
+#define MCFG1_PROM_READ_WS_MASK		0x0000000F
+
+#define MCFG1_PROM_WRITE_WS_OFF		         4
+#define MCFG1_PROM_WRITE_WS_MASK	0x000000F0
+
+#define MCFG1_PROM_WIDTH_OFF		         8
+#define MCFG1_PROM_WIDTH_MASK		0x00000300
+
+#define MCFG1_PWEN			0x00000800
+
+#define MCFG1_ROMBANKSZ_OFF		        14
+#define MCFG1_ROMBANKSZ_MASK		0x00003C00
+
+#define MCFG1_IOEN			0x00080000
+
+#define MCFG1_IO_WAITSTATES_OFF		        20
+#define MCFG1_IO_WAITSTATES_MASK	0x00F00000
+
+#define MCFG1_BEXCN			0x02000000
+#define MCFG1_IBRDY			0x04000000
+
+#define MCFG1_IOBUSW_OFF			27
+#define MCFG1_IOBUSW_MASK		0x18000000
+
+#define MCFG1_ABRDY			0x20000000
+#define MCFG1_PBRDY			0x40000000
+
+
+
+
+#define MCFG2_RAM_READ_WS_MASK		0x00000003
+
+#define MCFG2_RAM_WRITE_WS_OFF		         2
+#define MCFG2_RAM_WRITE_WS_MASK		0x0000000C
+
+#define MCFG2_RAM_WIDTH_OFF		         4
+#define MCFG2_RAM_WIDTH_MASK		0x00000030
+
+#define MCFG2_RMW			0x00000040
+
+#define MCFG2_RAM_BANK_SIZE_OFF		         9
+#define MCFG2_RAM_BANK_SIZE_MASK	0x00001E00
+
+#define MCFG2_SI			0x00002000
+#define MCFG2_SE			0x00004000
+
+
+#define MCFG3_PROM_EDAC			0x00000100
+#define MCFG3_RAM_EDAC			0x00000200
+#define MCFG3_RB_EDAC			0x00000400
+#define MCFG3_WB_EDAC			0x00000800
+#define MCFG3_TCB			0x0000007F
+
+
+
+/* memory configuration for flash + SRAM */
+#define MEMCFG1_FLASH 0x101aca11
+#define MEMCFG2_SRAM  0x00001665
+#define MEMCFG3_SRAM  0x08000300
+
+#define MEMCFG1_PROMACCESS 0x10180011
+
+
+
+void memcfg_enable_ram_edac(void);
+void memcfg_disable_ram_edac(void);
+
+void memcfg_enable_edac_write_bypass(void);
+void memcfg_disable_edac_write_bypass(void);
+
+void memcfg_enable_edac_read_bypass(void);
+void memcfg_disable_edac_read_bypass(void);
+
+uint32_t memcfg_bypass_read(void *addr, uint8_t *tcb);
+void memcfg_bypass_write(void *addr, uint32_t value, uint8_t tcb);
+
+void memcfg_configure_sram_flash_access(void);
+#endif /* MEMCFG_H */
diff --git a/IBSW/include/memscrub.h b/IBSW/include/memscrub.h
new file mode 100644
index 0000000..510bfdc
--- /dev/null
+++ b/IBSW/include/memscrub.h
@@ -0,0 +1,31 @@
+/**
+ * @file   memscrub.h
+ * @ingroup memscrub
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   March, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef MEMSCRUB_H
+#define MEMSCRUB_H
+
+#include <stdint.h>
+
+uint32_t *memscrub(uint32_t *addr, uint32_t n);
+uint32_t memscrub_get_num_log_entries(void);
+uint32_t memscrub_repair(void);
+
+void memscrub_init(void);
+
+
+#endif /* MEMSCRUB_H */
diff --git a/IBSW/include/packet_tracker.h b/IBSW/include/packet_tracker.h
new file mode 100644
index 0000000..b0fc1de
--- /dev/null
+++ b/IBSW/include/packet_tracker.h
@@ -0,0 +1,92 @@
+/**
+ * @file   packet_tracker.h
+ * @ingroup packet_tracker
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   July, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef	PACKET_TRACKER_H
+#define	PACKET_TRACKER_H
+
+
+#include <circular_buffer8.h>
+#include <circular_buffer16.h>
+#include <stdint.h>
+
+
+#define PTRACK_PUS_TMTC_HEADER_BYTES	6
+
+#ifndef PUS_PKT_MIN_SIZE
+#define	PUS_PKT_MIN_SIZE		12
+#endif
+
+/* ecss say: data length = (Number of octets in packet data field) - 1 */
+#define PTRACK_PUS_DATA_LENGTH_ADJUST(x)	((x)+1)
+
+/* packet size fields */
+#define PUS_LEN_LO_OFFSET	0x04
+#define PUS_LEN_HI_OFFSET	0x05
+
+#define PUS_LEN_LO_LSHIFT	0x08
+#define PUS_LEN_HI_MASK		0x00ff
+
+
+/* source/dest ids */
+#define PUS_SRC_ID_OFFSET	0x09
+
+#define PUS_ID_GND		0x00
+#define	PUS_ID_OBC		0x0c
+#define PUS_ID_DPU		0x14
+#define PUS_ID_SEM		0x3c
+#define PUS_ID_HK		0x15
+
+
+
+struct packet_tracker {
+	struct circular_buffer8  pus_pkts;
+	struct circular_buffer16 pus_size;
+};
+
+
+void ptrack_init(struct packet_tracker *p_pkt,
+		uint8_t* p_buf_pkts,
+		uint32_t pkts_elem,
+		uint16_t *p_buf_size,
+		uint32_t size_elem);
+
+void ptrack_reset(struct packet_tracker *p_pkt);
+	
+int32_t ptrack_add_pkt(struct packet_tracker *p_pkt,
+	       	       uint8_t *packet_buffer,
+		       uint32_t packet_buffer_size);
+
+uint16_t ptrack_peek_next_pkt_size(struct packet_tracker *p_pkt);
+uint16_t ptrack_get_next_pkt(struct packet_tracker *p_pkt, uint8_t *p_buf);
+
+uint16_t ptrack_get_pkt_size(uint8_t *packet_buffer);
+
+int32_t ptrack_add_single_pkt(struct packet_tracker *p_pkt,
+			      uint8_t *packet_buffer,
+			      uint32_t packet_buffer_size);
+
+int32_t ptrack_add_multiple_pkts(struct packet_tracker *p_pkt,
+				 uint8_t *packet_buffer,
+				 uint32_t packet_buffer_size);
+
+uint8_t ptrack_get_next_pkt_src_id(uint8_t *packet_buffer);
+
+
+uint32_t ptrack_get_packets_in_buffer(struct packet_tracker *p_pkt);
+
+#endif
diff --git a/IBSW/include/spinlock.h b/IBSW/include/spinlock.h
new file mode 100644
index 0000000..50644f5
--- /dev/null
+++ b/IBSW/include/spinlock.h
@@ -0,0 +1,257 @@
+/**
+ * @file    spinlock.h
+ * @author  Armin Luntzer (armin.luntzer@univie.ac.at)
+ * @date    December, 2013
+ * @brief   MPPB Spin Locking Mechanism
+ *
+ * @copyright Armin Luntzer (armin.luntzer@univie.ac.at)
+ * @copyright David S. Miller (davem@caip.rutgers.edu), 1997  (some parts)
+ *
+ * @copyright  
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef SPINLOCK_H
+#define SPINLOCK_H
+
+#include <stdint.h>
+#include <compiler.h>
+
+struct spinlock {
+	volatile uint8_t	lock;
+	volatile uint32_t	lock_recursion;
+};
+
+
+/* the sparc PIL field	*/
+#define PSR_PIL 0x00000f00
+
+
+#if (__sparc__)
+
+
+
+/**
+ * @brief save and disable the processor interrupt level state
+ * @return PSR
+ * @warning make sure to call a save/restore pair from within the same stack frame
+ */
+
+static uint32_t spin_lock_save_irq()
+{
+	uint32_t psr;
+	uint32_t tmp;
+	/**
+	 * @note RDPSR and WRPSR are only available privileged mode and will trap otherwise
+	 * @note The three NOPs after WRPSR could in principle be left out,
+	 * @note but we keep them nonetheless, as the SPARC (V7.0) instruction manual states:
+	 * @note 3. If any of the three instructions after a WRPSR instruction reads
+	 * @note the modified PSR, the value read is unpredictable. 
+	 */
+	__asm__ __volatile__(
+			"rd     %%psr, %0        \n\t"
+			"or        %0, %2, %1    \n\t"
+			"wr        %1,  0, %%psr \n\t"
+			"nop                     \n\t"
+			"nop                     \n\t"
+			"nop                     \n\t"
+			: "=&r" (psr), "=r" (tmp)
+			: "i"   (PSR_PIL)
+			: "memory");
+	return psr;
+}
+
+/**
+ * @brief Restore the processor interrupt level state
+ */
+
+static void spin_lock_restore_irq(uint32_t psr)
+{
+	uint32_t tmp;
+
+	__asm__ __volatile__(
+			"rd     %%psr, %0        \n\t"
+			"and       %2, %1, %2    \n\t"
+			"andn      %0, %1, %0    \n\t"
+			"wr        %0, %2, %%psr \n\t"
+			"nop                     \n\t"
+			"nop                     \n\t"
+			"nop                     \n\t"
+			: "=&r" (tmp)
+			: "i"   (PSR_PIL), "r" (psr)
+			: "memory");
+}
+
+
+/**
+ * @brief	MPPB LEON-side spin lock
+ * @param 	p_lock a struct spinlock
+ *
+ * @warning	will silently fail AND deadlock everytime YOU are stupid
+ * @note	it is, however, save to use with interrupts (sort of)
+ */
+__attribute__((unused))
+static void spin_lock(struct spinlock *p_lock)
+{
+	uint32_t psr_flags;
+
+	if (unlikely(p_lock->lock_recursion))
+		return;
+
+	psr_flags = spin_lock_save_irq();
+
+	p_lock->lock_recursion = 1;
+
+	__asm__ __volatile__(
+			"1:                      \n\t"
+			"ldstub [%0], %%g2       \n\t"
+			"andcc  %%g2, %%g2, %%g2 \n\t"
+			"bnz,a    1b             \n\t"
+			" nop		         \n\n"
+			:
+			: "r" (&p_lock->lock)
+			: "g2", "memory", "cc");
+
+	p_lock->lock_recursion = 0;
+
+	spin_lock_restore_irq(psr_flags);
+}
+
+/**
+ * @brief	MPPB LEON-side spin lock which does not care about interrupts
+ * @param 	p_lock a struct spinlock
+ *
+ * @warning	will silently fail AND deadlock everytime YOU are stupid
+ */
+
+__attribute__((unused))
+static void spin_lock_raw(struct spinlock *p_lock)
+{
+	if (unlikely(p_lock->lock_recursion))
+		return;
+
+	p_lock->lock_recursion = 1;
+
+	__asm__ __volatile__(
+			"1:                      \n\t"
+			"ldstub [%0], %%g2       \n\t"
+			"andcc  %%g2, %%g2, %%g2 \n\t"
+			"bnz,a    1b             \n\t"
+			" nop		         \n\n"
+			:
+			: "r" (&p_lock->lock)
+			: "g2", "memory", "cc");
+
+	p_lock->lock_recursion = 0;
+}
+
+/**
+ *@brief 	lock check
+ *@returns	success or failure
+ */
+
+static int spin_is_locked(struct spinlock *p_lock)
+{
+	return (p_lock->lock != 0);
+}
+
+/**
+ *@brief 	spins until lock opens
+ */
+
+__attribute__((unused))
+static void spin_unlock_wait(struct spinlock *p_lock)
+{
+	__asm__ __volatile__ ("" : : : "memory");	/* optimization barrier, just in case */
+	while(spin_is_locked(p_lock));
+}
+
+/**
+ * @brief	MPPB LEON-side spin lock
+ * @param 	p_lock a struct spinlock
+ * @return	success or failure
+ *
+ * @note
+ */
+
+__attribute__((unused))
+static int spin_try_lock(struct spinlock *p_lock)
+{
+	uint32_t retval;
+
+	__asm__ __volatile__("ldstub [%1], %0" : "=r" (retval) : "r"  (&p_lock->lock) : "memory");
+
+	return (retval == 0);
+}
+
+/**
+ * @brief	MPPB LEON-side spin-unlock
+ * @param 	p_lock a struct spinlock
+ */
+
+__attribute__((unused))
+static void spin_unlock(struct spinlock *p_lock)
+{
+	__asm__ __volatile__("swap [%0], %%g0       \n\t" : : "r" (&p_lock->lock) : "memory");
+}
+
+
+#else /*!(__sparc__)*/
+
+__attribute__((unused))
+static uint32_t spin_lock_save_irq()
+{
+	return 0;
+}
+
+__attribute__((unused))
+static void spin_lock_restore_irq(__attribute__((unused)) uint32_t psr)
+{
+}
+
+#if (__unused__)
+__attribute__((unused))
+static void spin_lock(__attribute__((unused)) struct spinlock *p_lock)
+{
+}
+
+__attribute__((unused))
+static void spin_lock_raw(__attribute__((unused)) struct spinlock *p_lock)
+{
+}
+
+__attribute__((unused))
+static int spin_is_locked(__attribute__((unused)) struct spinlock *p_lock)
+{
+	return 0;
+}
+
+__attribute__((unused))
+static void spin_unlock_wait(__attribute__((unused)) struct spinlock *p_lock)
+{
+}
+
+__attribute__((unused))
+static int spin_try_lock(__attribute__((unused)) struct spinlock *p_lock)
+{
+	return 0;
+}
+
+__attribute__((unused))
+static void spin_unlock(__attribute__((unused)) struct spinlock *p_lock)
+{
+}
+#endif /* (__unused__) */
+
+#endif /*!(__sparc__)*/
+
+
+#endif
diff --git a/IBSW/include/stacktrace.h b/IBSW/include/stacktrace.h
new file mode 100644
index 0000000..020bc53
--- /dev/null
+++ b/IBSW/include/stacktrace.h
@@ -0,0 +1,160 @@
+/**
+ * @file   stacktrace.h
+ * @ingroup stacktrace
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at)
+ * @author Linus Torvalds et al.
+ * @date   September, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @note The stack tracing was inspired by __save_stack_trace() in
+ *       linux/asm/sparc/kernel/stacktrace.c. Not particular author was given
+ *       in the file, hence the generic credit.
+ */
+
+#ifndef STACKTRACE_H
+#define STACKTRACE_H
+
+#include <stdint.h>
+
+
+/* reg window offset */
+#define RW_L0     0x00
+#define RW_L1     0x04
+#define RW_L2     0x08
+#define RW_L3     0x0c
+#define RW_L4     0x10
+#define RW_L5     0x14
+#define RW_L6     0x18
+#define RW_L7     0x1c
+#define RW_I0     0x20
+#define RW_I1     0x24
+#define RW_I2     0x28
+#define RW_I3     0x2c
+#define RW_I4     0x30
+#define RW_I5     0x34
+#define RW_I6     0x38
+#define RW_I7     0x3c
+
+/* stack frame offsets */
+#define SF_L0     0x00
+#define SF_L1     0x04
+#define SF_L2     0x08
+#define SF_L3     0x0c
+#define SF_L4     0x10
+#define SF_L5     0x14
+#define SF_L6     0x18
+#define SF_L7     0x1c
+#define SF_I0     0x20
+#define SF_I1     0x24
+#define SF_I2     0x28
+#define SF_I3     0x2c
+#define SF_I4     0x30
+#define SF_I5     0x34
+#define SF_FP     0x38
+#define SF_PC     0x3c
+#define SF_RETP   0x40
+#define SF_XARG0  0x44
+#define SF_XARG1  0x48
+#define SF_XARG2  0x4c
+#define SF_XARG3  0x50
+#define SF_XARG4  0x54
+#define SF_XARG5  0x58
+#define SF_XXARG  0x5c
+
+
+
+#define UREG_G0        0
+#define UREG_G1        1
+#define UREG_G2        2
+#define UREG_G3        3
+#define UREG_G4        4
+#define UREG_G5        5
+#define UREG_G6        6
+#define UREG_G7        7
+#define UREG_I0        8
+#define UREG_I1        9
+#define UREG_I2        10
+#define UREG_I3        11
+#define UREG_I4        12
+#define UREG_I5        13
+#define UREG_I6        14
+#define UREG_I7        15
+#define UREG_FP        UREG_I6
+#define UREG_RETPC     UREG_I7
+
+
+
+/* These for pt_regs32. */
+#define PT_PSR    0x0
+#define PT_PC     0x4
+#define PT_NPC    0x8
+#define PT_Y      0xc
+#define PT_G0     0x10
+#define PT_WIM    PT_G0
+#define PT_G1     0x14
+#define PT_G2     0x18
+#define PT_G3     0x1c
+#define PT_G4     0x20
+#define PT_G5     0x24
+#define PT_G6     0x28
+#define PT_G7     0x2c
+#define PT_I0     0x30
+#define PT_I1     0x34
+#define PT_I2     0x38
+#define PT_I3     0x3c
+#define PT_I4     0x40
+#define PT_I5     0x44
+#define PT_I6     0x48
+#define PT_FP     PT_I6
+#define PT_I7     0x4c
+
+
+
+/* modified from linux/arch/sparc */
+struct pt_regs {
+        uint32_t psr;
+        uint32_t pc;
+        uint32_t npc;
+        uint32_t y;
+        uint32_t u_regs[16]; /* globals and ins */
+};
+
+struct leon_reg_win {
+        uint32_t locals[8];
+        uint32_t ins[8];
+};
+
+/* a stack frame */
+struct sparc_stackf {
+        uint32_t             locals[8];
+        uint32_t             ins[6];
+        struct sparc_stackf *fp;	 /* %i6 = %fp */
+        uint32_t             callers_pc; /* %i7 = ret %pc */
+        uint8_t             *structptr;
+        uint32_t             xargs[6];
+        uint32_t             xxargs[1];
+};
+
+struct stack_trace {
+        uint32_t nr_entries;
+	uint32_t max_entries;
+        uint32_t *entries;
+};
+
+
+
+void save_stack_trace(struct stack_trace *trace, uint32_t sp, uint32_t pc);
+
+/* part of libgloss */
+void __flush_windows(void);
+
+#endif
diff --git a/IBSW/include/syncpulse.h b/IBSW/include/syncpulse.h
new file mode 100644
index 0000000..3ca2a66
--- /dev/null
+++ b/IBSW/include/syncpulse.h
@@ -0,0 +1,42 @@
+/**
+ * @file   syncpulse.h
+ * @ingroup timing
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   July, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef SYNCPULSE_H
+#define SYNCPULSE_H
+
+
+#include <timing.h>
+
+
+
+void syncpulse_configure_gpio(uint32_t port, uint32_t gpio_base_addr);
+
+void syncpulse_status_set_callback(struct time_keeper *time,
+				   void (*sync_status)(uint32_t sync));
+
+int32_t syncpulse_notification_timer_underflow(void *userdata);
+int32_t syncpulse_missed(void *userdata);
+int32_t syncpulse(void *userdata);
+
+void syncpulse_enable_spw_tick(struct time_keeper *time);
+void syncpulse_disable_spw_tick(struct time_keeper *time);
+void syncpulse_spw_get_next_time(struct time_keeper *time,
+				 uint32_t *coarse_time,
+				 uint32_t *fine_time);
+
+#endif /* SYNCPULSE_H */
diff --git a/IBSW/include/sysctl.h b/IBSW/include/sysctl.h
new file mode 100644
index 0000000..15b4761
--- /dev/null
+++ b/IBSW/include/sysctl.h
@@ -0,0 +1,84 @@
+#ifndef SYSOBJ_H
+#define SYSOBJ_H
+
+#include <sys/types.h>
+#include <list.h>
+
+#ifdef offsetof
+#undef offsetof
+#endif
+/* linux/stddef.h */
+#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
+
+/* linux/kernel.h */
+#define container_of(ptr, type, member) ({			\
+        typeof( ((type *)0)->member ) *__mptr = (ptr);		\
+        (type *)( (char *)__mptr - offsetof(type,member) );})
+
+/* Indirect stringification.  Doing two levels allows the parameter to be a
+ * macro itself.  For example, compile with -DFOO=bar, __stringify(FOO)
+ * converts to "bar".
+ */
+__extension__
+#define __stringify_1(x...)     #x
+#define __stringify(x...)       __stringify_1(x)
+
+/* sysfs.h, modified */
+#define __ATTR(_name, _show, _store) {                          \
+	.name = __stringify(_name),                             \
+	.show  = _show,                                         \
+	.store = _store,                                        \
+}
+
+
+
+struct sysobj {
+        const char             *name;
+        struct list_head        entry;
+
+	struct sysobj          *parent;
+	struct sysobj          *child;
+
+        struct sysset          *sysset;
+
+	struct sobj_attribute **sattr;
+};
+
+struct sysset {
+	struct list_head list;
+	struct sysobj sobj;
+};
+
+
+struct sobj_attribute {
+	const char *name;
+	ssize_t (*show) (struct sysobj *sobj, struct sobj_attribute *sattr, char *buf);
+	ssize_t (*store)(struct sysobj *sobj, struct sobj_attribute *sattr, const char *buf, size_t len);
+};
+
+extern struct sysset *sys_set;
+extern struct sysset *driver_set;
+
+
+struct sysobj *sysobj_create(void);
+void sysobj_init(struct sysobj *sobj);
+int32_t sysobj_add(struct sysobj *sobj, struct sysobj *parent,
+		   struct sysset *sysset, const char *name);
+
+struct sysobj *sysobj_create_and_add(const char *name, struct sysobj *parent);
+
+void sysobj_show_attr(struct sysobj *sobj, const char *name, char *buf);
+void sysobj_store_attr(struct sysobj *sobj, const char *name, const char *buf, size_t len);
+
+struct sysset *sysset_create_and_add(const char *name,
+				     struct sysobj *parent_sobj,
+				     struct sysset *parent_sysset);
+
+void sysset_show_tree(struct sysset *sysset);
+struct sysobj *sysset_find_obj(struct sysset *sysset, const char *path);
+
+
+int32_t sysctl_init(void);
+
+
+#endif
diff --git a/IBSW/include/timing.h b/IBSW/include/timing.h
new file mode 100644
index 0000000..d3b8af8
--- /dev/null
+++ b/IBSW/include/timing.h
@@ -0,0 +1,134 @@
+/**
+ * @file   timing.h
+ * @ingroup timing
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   August, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef TIMING_H
+#define TIMING_H
+
+#include <compiler.h>
+#include <io.h>
+#include <leon/leon_reg.h>
+#include <grspw2.h>
+#include <core1553brm_as250.h>
+#include <leon3_grtimer_longcount.h>
+
+
+/* IASW/IBSW timer configuration below */
+
+
+#define CPU_CPS			25000000
+
+#define GPTIMER_RELOAD		4
+#define GRTIMER_RELOAD		4	/* use 5 instead of 3 cycle minimum for
+					   round number of clock ticks */
+#define GPTIMER_MAX		0xffffffff
+#define GRTIMER_MAX		0xffffffff
+
+#define GPTIMER_TICKS_PER_SEC	((CPU_CPS / (GPTIMER_RELOAD + 1)))
+#define GPTIMER_TICKS_PER_MSEC	(GPTIMER_TICKS_PER_SEC / 1000)
+#define GPTIMER_TICKS_PER_USEC	(GPTIMER_TICKS_PER_SEC / 1000000)
+#define GPTIMER_USEC_PER_TICK	(1000000.0 / GPTIMER_TICKS_PER_SEC)
+
+#define GRTIMER_TICKS_PER_SEC	((CPU_CPS / (GRTIMER_RELOAD + 1)))
+#define GRTIMER_TICKS_PER_MSEC	(GRTIMER_TICKS_PER_SEC / 1000)
+#define GRTIMER_TICKS_PER_USEC	(GRTIMER_TICKS_PER_SEC / 1000000)
+#define GRTIMER_USEC_PER_TICK	(1000000.0 / GRTIMER_TICKS_PER_SEC)
+
+#define GPTIMER_CYCLES_PER_SEC	CPU_CPS
+#define GPTIMER_CYCLES_PER_MSEC	(GPTIMER_CYCLES_PER_SEC / 1000)
+#define GPTIMER_CYCLES_PER_USEC	(GPTIMER_CYCLESS_PER_SEC / 1000000)
+#define GPTIMER_USEC_PER_CYCLE	(1000000.0 / GPTIMER_CYCLES_PER_SEC)
+
+#define GRTIMER_CYCLES_PER_SEC	CPU_CPS
+#define GRTIMER_CYCLES_PER_MSEC	(GRTIMER_CYCLES_PER_SEC / 1000)
+#define GRTIMER_CYCLES_PER_USEC	(GRTIMER_CYCLESS_PER_SEC / 1000000)
+#define GRTIMER_SEC_PER_CYCLE	(      1.0 / GRTIMER_CYCLES_PER_SEC)
+#define GRTIMER_MSEC_PER_CYCLE	(   1000.0 / GRTIMER_CYCLES_PER_SEC)
+#define GRTIMER_USEC_PER_CYCLE	(1000000.0 / GRTIMER_CYCLES_PER_SEC)
+
+
+
+#define IASW_CPS                8
+#define T_CYC                   ( 125 * GPTIMER_TICKS_PER_MSEC)  /* 125 ms */
+#define T_CYC1                  (  15 * GPTIMER_TICKS_PER_MSEC)  /*  15 ms */
+#define T_SYNC_TOL              (   1 * GPTIMER_TICKS_PER_MSEC)  /*   1 ms */
+#define T_WATCHDOG		(1800 * GPTIMER_TICKS_PER_MSEC)	 /* 1.8  s */
+
+
+
+struct time_keeper {
+
+	uint32_t mil_cuc_coarse;
+	uint32_t mil_cuc_fine;
+
+	uint32_t cuc_coarse;
+	uint32_t cuc_fine;
+
+	uint32_t pulse_desync_cnt;
+	uint32_t miltime_desync_cnt;
+
+	uint32_t notify_cnt;
+
+	uint32_t tick_in;
+
+	uint32_t watchdog_enabled;
+
+	uint32_t synced;
+
+	uint32_t pulse_missed;
+
+	uint32_t cuc_recv;
+
+	struct grtimer_uptime synctime;
+	struct gptimer_unit *ptu;
+	struct grtimer_unit *rtu;
+
+	struct brm_config *brm;
+	struct grspw2_core_cfg *spw;
+
+	void (*bark)(void);
+
+	void (*signal)(void *userdata);
+	void *userdata;
+
+	void (*sync_status)(uint32_t sync);
+};
+
+
+void timekeeper_init(struct time_keeper *time,
+		     struct gptimer_unit *ptu,
+		     struct grtimer_unit *rtu,
+		     struct brm_config *brm,
+		     struct grspw2_core_cfg *spw);
+
+void timekeeper_get_current_time(struct time_keeper *time,
+				 uint32_t *coarse_time,
+				 uint32_t *fine_time);
+
+void timekeeper_set_1553_time(uint32_t coarse_time,
+			      uint32_t fine_time,
+			      void *userdata);
+
+
+void timekeeper_set_signal_callback(struct time_keeper *time,
+				    void (*signal)(void *userdata),
+				    void *userdata);
+
+void timekeeper_set_cuc_time(struct time_keeper *time);
+
+
+#endif /* TIMING_H */
diff --git a/IBSW/include/traps.h b/IBSW/include/traps.h
new file mode 100644
index 0000000..f09700c
--- /dev/null
+++ b/IBSW/include/traps.h
@@ -0,0 +1,36 @@
+/**
+ * @file   traps.h
+ * @ingroup traps
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at)
+ * @date   February, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+
+#ifndef TRAPS_H
+#define TRAPS_H
+
+#include <stdint.h>
+
+
+
+
+void trap_handler_install(uint32_t trap, void (*handler)());
+
+void data_access_exception_trap(void);
+void data_access_exception_trap_ignore(void);
+
+void floating_point_exception_trap(void);
+void reset_trap(void);
+
+#endif /* TRAPS_H */
diff --git a/IBSW/include/watchdog.h b/IBSW/include/watchdog.h
new file mode 100644
index 0000000..7cbc80f
--- /dev/null
+++ b/IBSW/include/watchdog.h
@@ -0,0 +1,29 @@
+/**
+ * @file   watchdog.h
+ * @ingroup timing
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   July, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#ifndef WATCHDOG_H
+#define WATCHDOG_H
+
+#include <timing.h>
+
+void watchdog_enable(struct time_keeper *time, void (*shutdown_callback)(void));
+void watchdog_disable(struct time_keeper *time);
+void watchdog_feed(struct time_keeper *time);
+
+
+#endif /* WATCHDOG_H */
diff --git a/IBSW/include/wrap_malloc.h b/IBSW/include/wrap_malloc.h
new file mode 100644
index 0000000..96cef2f
--- /dev/null
+++ b/IBSW/include/wrap_malloc.h
@@ -0,0 +1,105 @@
+/**
+ * @file    wrap_malloc.h
+ * @author  Armin Luntzer (armin.luntzer@univie.ac.at),
+ *	    Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @date    August, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @note needs linker flags to override: -Wl,--wrap=malloc
+ */
+
+#ifndef WRAP_MALLOC_H
+#define WRAP_MALLOC_H
+
+#include <compiler.h>
+#include <stddef.h>
+#include <stdint.h>
+
+
+#define SRAM1_ADDR		0x40000000UL	/* regular SRAM on dpu */
+#define SRAM1_SIZE		0x02000000UL
+#define SRAM2_OFF               0x00000000UL    /* if SRAM2 should not start at 0 */
+#define SRAM2_ADDR		(0x04000000UL + SRAM2_OFF)	/* RMW-disabled SRAM */
+#define SRAM2_SIZE		(0x01FFFFF0UL - SRAM2_OFF)
+#define FPGA_ADDR               0x20000000UL
+#define FPGA_SIZE               0x0000FFFFUL
+
+#define AHBRAM_ADDR             0xA0000000UL
+#define AHBRAM_SIZE             0x00030000UL    /* 192 kiB */
+#define REG1_ADDR               0x80000000UL
+#define REG1_SIZE               0x20000000UL
+#define REG2_ADDR               0xFFF00000UL
+#define REG2_SIZE               0x000FFFFFUL
+
+#define FLASH_BLOCKSIZE         1048576         
+
+/* SRAM 1 memory map */
+
+#define SRAM1_DBS_FLASH_BUFFER  0x40080000UL
+
+/* 10 MiB - 256 kiB for the Software */
+#define SRAM1_DBS_SIZE		0x00480000UL    /* 4608 kiB see DPU-SICD-IF-3110 */
+#define SRAM1_SW_SIZE		0x00100000UL    /* 1 MiB for software */
+#define SRAM1_CPU_0_STACK_SIZE  0x00020000UL    /* 128 kiB */
+#define SRAM1_CPU_1_STACK_SIZE  0x00020000UL    /* 128 kiB */
+#define SRAM1_HEAP_SIZE		0x00400000UL	/* 4 MiB generic heap for IBSW/IASW */
+
+/* 256 kiB + 22 MiB various IASW buffers */
+#define SRAM1_SEMEVTS_SIZE	0x00000000UL    /* NOTE: removed in 1.0 */ /* 0x00040000UL 256 kiB for SEM events */
+#define SRAM1_HKSTORE_SIZE	0x00000000UL	/* NOTE: removed in 1.0 */ /* 0x00200000UL 2 MiB for HK store */
+#define SRAM1_FLASH_SIZE	0x00420000UL	/* 4 MiB + 128 kiB for flash exchange */
+#define SRAM1_AUX_SIZE          0x00420000UL    /* 4 MiB + 128 kiB for e.g. Centroiding */
+#define SRAM1_RES_SIZE          0x00800000UL    /* 8 MiB reserved (for the GIB) */
+#define SRAM1_SWAP_SIZE	        0x00600000UL	/* 6 MiB for swap buffers */
+
+/* calculate absolute addresses from the sizes defined above */
+#define SRAM1_SW_ADDR		(SRAM1_ADDR             + SRAM1_DBS_SIZE)
+#define SRAM1_CPU_0_STACK_ADDR	(SRAM1_SW_ADDR	        + SRAM1_SW_SIZE)
+#define SRAM1_CPU_1_STACK_ADDR	(SRAM1_CPU_0_STACK_ADDR + SRAM1_CPU_0_STACK_SIZE)
+#define SRAM1_HEAP_ADDR		(SRAM1_CPU_1_STACK_ADDR + SRAM1_CPU_1_STACK_SIZE)
+#define SRAM1_SEMEVTS_ADDR	(SRAM1_HEAP_ADDR	+ SRAM1_HEAP_SIZE)
+#define SRAM1_HKSTORE_ADDR	(SRAM1_SEMEVTS_ADDR     + SRAM1_SEMEVTS_SIZE)
+#define SRAM1_FLASH_ADDR	(SRAM1_HKSTORE_ADDR     + SRAM1_HKSTORE_SIZE)
+#define SRAM1_AUX_ADDR	        (SRAM1_FLASH_ADDR       + SRAM1_FLASH_SIZE)
+#define SRAM1_RES_ADDR	        (SRAM1_AUX_ADDR	        + SRAM1_AUX_SIZE)
+#define SRAM1_SWAP_ADDR	        (SRAM1_RES_ADDR	        + SRAM1_RES_SIZE)
+							  
+#define SRAM1_END	        (SRAM1_SWAP_ADDR        + SRAM1_SWAP_SIZE)
+
+/* stack base is at the end of the stack */
+#define SRAM1_CPU_0_STACK_BASE	(SRAM1_CPU_0_STACK_ADDR + SRAM1_CPU_0_STACK_SIZE)
+#define SRAM1_CPU_1_STACK_BASE	(SRAM1_CPU_1_STACK_ADDR + SRAM1_CPU_1_STACK_SIZE)
+
+/* SRAM 2 memory map */
+#define SRAM2_SDB_ADDR     SRAM2_ADDR
+#define SRAM2_SDB_SIZE     SRAM2_SIZE          /* use all of SRAM 2 */
+#define SRAM2_END          (SRAM2_SDB_ADDR + SRAM2_SDB_SIZE)
+
+compile_time_assert((SRAM1_END <= (SRAM1_ADDR + SRAM1_SIZE)),
+		    HEAP1_MEM_OOB);
+compile_time_assert((SRAM2_END <= (SRAM2_ADDR + SRAM2_SIZE)),
+		    HEAP2_MEM_OOB);
+
+
+#define MEM_ALIGN			 8UL	/* align to quadword so stack
+						   space can be allocated by
+						   pthreads */
+
+
+enum ram_block {DBS, HEAP, SEMEVTS, HKSTORE, FLASH, AUX, RES, SWAP, SDB};
+
+int32_t malloc_enable_syscfg(void);
+
+void *alloc(uint32_t size, enum ram_block ram);
+void release(enum ram_block ram);
+
+#endif
diff --git a/IBSW/lib/ahb.c b/IBSW/lib/ahb.c
new file mode 100644
index 0000000..5895670
--- /dev/null
+++ b/IBSW/lib/ahb.c
@@ -0,0 +1,142 @@
+/**
+ * @file   ahb.c
+ * @ingroup ahb
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at)
+ * @date   March, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @defgroup ahb Advanced High-performance Bus (AHB)
+ * @brief Access to the AHB registers
+ *
+ *
+ * ## Overview
+ *
+ * This components implements functionality to access or modify the AHB status
+ * registers of the GR712RC.
+ *
+ * @see _GR712-UM v2.7 chapter 7_
+ *
+ * ## Mode of Operation
+ *
+ * None
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ * ## Notes
+ *
+ * - functionality will be added as needed
+ *
+ */
+
+#include <io.h>
+#include <ahb.h>
+#include <leon_reg.h>
+
+
+
+/**
+ * @brief deassert the new error bit in the AHB status register
+ * @see GR712-UM v2.3 p. 71
+ */
+
+void ahbstat_clear_new_error(void)
+{
+	uint32_t tmp;
+
+	struct leon3_ahbstat_registermap *ahbstat =
+		(struct leon3_ahbstat_registermap *) LEON3_BASE_ADDRESS_AHBSTAT;
+
+
+	tmp  = ioread32be(&ahbstat->status);
+	tmp &= ~AHB_STATUS_NE;
+	iowrite32be(tmp, &ahbstat->status);
+}
+
+
+/**
+ * @brief retrieve the AHB status register
+ *
+ * @return the contents of the AHB status register
+ *
+ * @see GR712-UM v2.3 p. 71
+ *
+ */
+
+uint32_t ahbstat_get_status(void)
+{
+	struct leon3_ahbstat_registermap const *ahbstat =
+		(struct leon3_ahbstat_registermap *) LEON3_BASE_ADDRESS_AHBSTAT;
+
+
+	return ioread32be(&ahbstat->status);
+}
+
+
+/**
+ * @brief check the new error bit in the AHB status register
+ *
+ * @return not 0 if new error bit is set
+ *
+ * @see GR712-UM v2.3 p. 71
+ *
+ */
+
+uint32_t ahbstat_new_error(void)
+{
+	struct leon3_ahbstat_registermap const *ahbstat =
+		(struct leon3_ahbstat_registermap *) LEON3_BASE_ADDRESS_AHBSTAT;
+
+
+	return (ioread32be(&ahbstat->status) & AHB_STATUS_NE);
+}
+
+
+/**
+ * @brief check if the last error reported via the AHB status register is
+ *        correctable
+ *
+ * @return not 0 if correctable error bit is set
+ *
+ * @see GR712-UM v2.3 p. 71
+ *
+ */
+
+uint32_t ahbstat_correctable_error(void)
+{
+	struct leon3_ahbstat_registermap const *ahbstat =
+		(struct leon3_ahbstat_registermap *) LEON3_BASE_ADDRESS_AHBSTAT;
+
+
+	return (ioread32be(&ahbstat->status) & AHB_STATUS_CE);
+}
+
+
+/**
+ * @brief get the AHB failing address
+ *
+ * @return the HADDR signal of the AHB transaction that caused the error
+ *
+ * @see GR712-UM v2.3 p. 72
+ *
+ */
+
+uint32_t ahbstat_get_failing_addr(void)
+{
+	struct leon3_ahbstat_registermap const *ahbstat =
+		(struct leon3_ahbstat_registermap *) LEON3_BASE_ADDRESS_AHBSTAT;
+
+
+	return ioread32be(&ahbstat->failing_address);
+}
+
diff --git a/IBSW/lib/asm/data_access_exception_trap.S b/IBSW/lib/asm/data_access_exception_trap.S
new file mode 100644
index 0000000..9352910
--- /dev/null
+++ b/IBSW/lib/asm/data_access_exception_trap.S
@@ -0,0 +1,75 @@
+/**
+ * @file asm/data_access_exception_trap.S
+ * @ingroup edac
+ * @brief this is a function that is called by a custom trap handler to handle
+ *        an EDAC error
+ */
+
+
+
+#define SAVE_ALL_HEAD \
+        sethi   %hi(leonbare_trapsetup), %l4; \
+        jmpl    %l4 + %lo(leonbare_trapsetup), %l6;
+#define SAVE_ALL \
+        SAVE_ALL_HEAD \
+         nop;
+
+
+#define FW_REGS_SZ     0x90 /* 36*4 */
+#define SF_REGS_SZ     0x60 /* 24*4 */
+
+/* All traps low-level code here must end with this macro. */
+#define RESTORE_ALL b leonbare_trapreturn; clr %l6;
+
+
+
+	.text
+	.align 4
+	.globl  data_access_exception_trap
+
+
+
+#define PSR_ET        0x00000020         /* enable traps field */
+#define PSR_PIL_MASK  0x00000F00	/* processor interrupt level */
+
+data_access_exception_trap:
+
+	/* Since we do not overwrite values either in RAM or in FLASH, we cannot
+	 * continue from the original instruction or the same trap will occur,
+	 * hence we have to point %pc to %npc and increment %npc to the
+	 * following instruction
+         */
+	
+	mov	%l2, %l1
+	add	%l2, 4, %l2
+
+	rd	%wim, %l3	/* trap setup needs the %wim in %l3 */
+	
+	SAVE_ALL	/* create a trap window */
+
+	/* re-enable traps but not interrupts (set level to max) */
+	or %l0, PSR_PIL_MASK, %o0
+	wr %o0, PSR_ET, %psr
+	nop
+	nop
+	nop
+
+	call edac_trap
+	 add	%sp, FW_REGS_SZ + 8 + SF_REGS_SZ , %o1
+
+
+	RESTORE_ALL	/* also returns */
+
+
+
+
+
+	.globl  data_access_exception_trap_ignore
+
+data_access_exception_trap_ignore:
+
+	/* see above */
+	mov	%l2, %l1
+	add	%l2, 4, %l2
+	jmp	%l1
+	rett	%l2
diff --git a/IBSW/lib/asm/floating_point_exception_trap.S b/IBSW/lib/asm/floating_point_exception_trap.S
new file mode 100644
index 0000000..66b790d
--- /dev/null
+++ b/IBSW/lib/asm/floating_point_exception_trap.S
@@ -0,0 +1,70 @@
+/**
+ * @file asm/floating_point_exception_trap.S
+ * @ingroup edac
+ * @brief this is a function that is called by a custom trap handler to handle
+ *        a floating point exception
+ */
+
+
+
+#define SAVE_ALL_HEAD \
+        sethi   %hi(leonbare_trapsetup), %l4; \
+        jmpl    %l4 + %lo(leonbare_trapsetup), %l6;
+#define SAVE_ALL \
+        SAVE_ALL_HEAD \
+         nop;
+
+
+#define FW_REGS_SZ     0x90 /* 36*4 */
+#define SF_REGS_SZ     0x60 /* 24*4 */
+
+/* All traps low-level code here must end with this macro. */
+#define RESTORE_ALL b leonbare_trapreturn; clr %l6;
+
+
+
+	.text
+	.align 4
+	.globl  floating_point_exception_trap
+
+
+
+#define PSR_ET        0x00000020         /* enable traps field */
+#define PSR_PIL_MASK  0x00000F00	/* processor interrupt level */
+
+floating_point_exception_trap:
+
+
+	mov	%l2, %l1
+	add	%l2, 4, %l2
+
+	rd	%wim, %l3	/* trap setup needs the %wim in %l3 */
+	
+	SAVE_ALL	/* create a trap window */
+
+	/* re-enable traps but not interrupts (set level to max) */
+	or %l0, PSR_PIL_MASK, %o0
+	wr %o0, PSR_ET, %psr
+	nop
+	nop
+	nop
+
+	call fpe_trap
+	 add	%sp, FW_REGS_SZ + 8 + SF_REGS_SZ , %o1
+
+
+	RESTORE_ALL	/* also returns */
+
+
+
+
+
+	.globl  floating_point_exception_trap_ignore
+
+floating_point_exception_trap_ignore:
+
+	/* see above */
+	mov	%l2, %l1
+	add	%l2, 4, %l2
+	jmp	%l1
+	rett	%l2
diff --git a/IBSW/lib/asm/reset_trap.S b/IBSW/lib/asm/reset_trap.S
new file mode 100644
index 0000000..764fa68
--- /dev/null
+++ b/IBSW/lib/asm/reset_trap.S
@@ -0,0 +1,75 @@
+/**
+ * @file asm/reset_trap.S
+ * @ingroup edac
+ * @brief this is a function that is called by a custom trap handler to handle
+ *        an EDAC error
+ */
+
+
+
+#define SAVE_ALL_HEAD \
+        sethi   %hi(leonbare_trapsetup), %l4; \
+        jmpl    %l4 + %lo(leonbare_trapsetup), %l6;
+#define SAVE_ALL \
+        SAVE_ALL_HEAD \
+         nop;
+
+
+#define FW_REGS_SZ     0x90 /* 36*4 */
+#define SF_REGS_SZ     0x60 /* 24*4 */
+
+/* All traps low-level code here must end with this macro. */
+#define RESTORE_ALL b leonbare_trapreturn; clr %l6;
+
+
+
+	.text
+	.align 4
+	.globl  reset_trap
+
+
+
+#define PSR_ET        0x00000020         /* enable traps field */
+#define PSR_PIL_MASK  0x00000F00	/* processor interrupt level */
+
+reset_trap:
+
+	/* Since we do not overwrite values either in RAM or in FLASH, we cannot
+	 * continue from the original instruction or the same trap will occur,
+	 * hence we have to point %pc to %npc and increment %npc to the
+	 * following instruction
+         */
+	
+	mov	%l2, %l1
+	add	%l2, 4, %l2
+
+	rd	%wim, %l3	/* trap setup needs the %wim in %l3 */
+	
+	SAVE_ALL	/* create a trap window */
+
+	/* re-enable traps but not interrupts (set level to max) */
+	or %l0, PSR_PIL_MASK, %o0
+	wr %o0, PSR_ET, %psr
+	nop
+	nop
+	nop
+
+	call reset
+	 add	%sp, FW_REGS_SZ + 8 + SF_REGS_SZ , %o1
+
+
+	RESTORE_ALL	/* also returns */
+
+
+
+
+
+	.globl  reset_trap_ignore
+
+reset_trap_ignore:
+
+	/* see above */
+	mov	%l2, %l1
+	add	%l2, 4, %l2
+	jmp	%l1
+	rett	%l2
diff --git a/IBSW/lib/asm/trace_trap.S b/IBSW/lib/asm/trace_trap.S
new file mode 100644
index 0000000..373532d
--- /dev/null
+++ b/IBSW/lib/asm/trace_trap.S
@@ -0,0 +1,33 @@
+/**
+ * @file asm/trace_trap.S
+ * @ingroup stack_trace
+ * @brief this is a function that is called by a custom trap handler to perform
+ *        a backtrace
+ */
+
+	.text                                                                   
+	.align 4                                                                
+	.globl  trace_trap
+
+#define PSR_ET      0x00000020         /* enable traps field         */
+
+trace_trap:
+	/* re-enable traps */
+	rd %psr, %l0
+	wr %l0, PSR_ET,%psr
+	nop
+	nop
+	nop
+
+	/* %sp of trapped function */
+	mov %fp, %o0
+
+	/* %pc of trapped function is stored in %l1 */
+	mov %l1, %o1
+	call trace
+	 nop
+	call die
+	 nop
+/* if we wanted to return from this: */
+#	jmp  %l1
+#	rett %l2
diff --git a/IBSW/lib/circular_buffer16.c b/IBSW/lib/circular_buffer16.c
new file mode 100644
index 0000000..9068930
--- /dev/null
+++ b/IBSW/lib/circular_buffer16.c
@@ -0,0 +1,286 @@
+/**
+ * @file   circular_buffer16.c
+ * @ingroup circular_buffer16
+ * @author Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @date   September, 2013
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ *
+ * @defgroup circular_buffer16 Circular Buffer (16 bit version)
+ *
+ * @brief 16 bit data type circular buffer
+ *
+ * @note no spinlocks, effectively limited to one producer, one consumer
+ *
+ * @note its probably a good idea to rewrite the core functionalities of
+ *       both 16 and 16 bit buffers as typeof() macros and just create wrapper
+ *       for the particular type for easier maintenance
+ */
+
+#include <stdlib.h>
+#include <circular_buffer16.h>
+
+/**
+ * @name	Declare a circular buffer
+ * @brief	Declares a circular buffers and initializes with zeros
+ * @param	p_buf a pointer to a struct circular_buffer structure
+ * @param	p_buffer_start a pointer to a memory pool
+ * @param	buffer_size number of buffer elements
+ * @param	ptDMAchannel2 DMA channel reserved for circular buffer writes
+ */
+
+int32_t cbuf_init16(struct circular_buffer16 *p_buf,
+		   uint16_t *p_buffer_start,
+		   uint32_t buffer_size)
+{
+	if (p_buf == NULL)
+		return -1;
+
+	if (p_buffer_start == NULL)
+		return -1;
+
+	p_buf->p_buf_start = p_buffer_start;
+	p_buf->num_elem	   = buffer_size;
+	p_buf->read_pos	   = 0;
+	p_buf->write_pos   = 0;
+
+	return 0;
+}
+
+/**
+ * @brief	resets a circular buffer
+ * @param	p_buf a pointer to a struct circular_buffer structure
+ */
+
+void cbuf_reset16(struct circular_buffer16 *p_buf)
+{
+	p_buf->read_pos		= 0;
+	p_buf->write_pos	= 0;
+}
+
+/**
+ * @name	Read from circular buffer
+ * @brief	Reads elements words from a circular buffer to dest
+ * @param	p_buf a pointer to a struct circular_buffer structure
+ * @param out	dest a pointer to the target memory
+ * @param in	elements number of elements to read from the buffer
+ *
+ * @returns	number of elements read
+ */
+
+uint32_t cbuf_read16(struct circular_buffer16 *p_buf,
+		    uint16_t *dest,
+		    uint32_t elem)
+{
+	uint32_t i, j;
+	uint16_t *cbuf_pos;
+
+
+	/* check if size of data already written corresponds to the required
+	 * dump size
+	 */
+	if (cbuf_get_used16(p_buf) >= elem) {
+		if ((p_buf->num_elem - p_buf->read_pos) >= elem) {
+			cbuf_pos = p_buf->p_buf_start + p_buf->read_pos;
+
+			for (i = 0; i < elem; i++)
+				*(dest + i) = *((uint16_t *) cbuf_pos + i);
+
+			p_buf->read_pos += i;
+
+			return i;
+		}
+		/* else read to the end */
+		cbuf_pos = p_buf->p_buf_start + p_buf->read_pos;
+		j = p_buf->num_elem - p_buf->read_pos;
+
+		for (i = 0; i < j; i++)
+			*(dest + i) = *((uint16_t *) cbuf_pos + i);
+
+		cbuf_pos = p_buf->p_buf_start;
+
+		dest += j;
+
+		for (i = 0; i < (elem - j); i++)
+			*(dest + i) = *((uint16_t *) cbuf_pos + i);
+
+		p_buf->read_pos = i;
+
+		return i+j;
+	}
+
+	return 0;
+}
+
+
+/**
+ * @name	Write to circular buffer
+ * @brief	Writes elements words from src to a circular buffer
+ *
+ * @param	p_buf a pointer to a struct circular_buffer structure
+ * @param in	dest a pointer to the source memory
+ * @param in	elements number of elements to write to the circular buffer
+ *
+ * @returns	number of elements written
+ */
+
+uint32_t cbuf_write16(struct circular_buffer16 *p_buf, uint16_t *src,
+		     uint32_t elem)
+{
+	uint32_t i, j;
+	uint16_t *cbuf_pos;
+
+
+	if (cbuf_get_free16(p_buf) > elem) {
+		if ((p_buf->num_elem - p_buf->write_pos) >= elem) {
+			cbuf_pos = p_buf->p_buf_start + p_buf->write_pos;
+
+			for (i = 0; i < elem; i++)
+				(*((uint16_t *) cbuf_pos + i)) = (*(src + i));
+
+			p_buf->write_pos += i;
+
+			return i;
+		}
+
+		cbuf_pos = p_buf->p_buf_start + p_buf->write_pos;
+		j = p_buf->num_elem - p_buf->write_pos;
+
+		for (i = 0; i < j; i++)
+			(*((uint16_t *) cbuf_pos + i)) = (*(src + i));
+
+		cbuf_pos = p_buf->p_buf_start;
+
+		src += j;
+
+		for (i = 0; i < (elem - j); i++)
+			(*((uint16_t *) cbuf_pos + i)) = (*(src + i));
+
+		p_buf->write_pos = i;
+
+		return i + j;
+	}
+
+	return 0;
+}
+
+/**
+ * @name	peek into circular buffer
+ * @brief	Reads elements words from a circular buffer to dest without
+ *		incrementing the read pointer
+ * @param	p_buf a pointer to a struct circular_buffer structure
+ * @param out	dest a pointer to the target memory
+ * @param in	elements number of elements to read from the buffer
+ *
+ * @returns	number of elements read
+ */
+
+uint32_t cbuf_peek16(struct circular_buffer16 *p_buf, uint16_t *dest,
+		    uint32_t elem)
+{
+	uint32_t i, j;
+	uint16_t *cbuf_pos;
+
+
+	/* check if size of data already written corresponds to the required
+	 * dump size
+	 */
+	if (cbuf_get_used16(p_buf) >= elem) {
+		if ((p_buf->num_elem - p_buf->read_pos) >= elem) {
+			cbuf_pos = p_buf->p_buf_start + p_buf->read_pos;
+
+			for (i = 0; i < elem; i++)
+				*(dest + i) = *((uint16_t *) cbuf_pos + i);
+
+			return i;
+		}
+		/* else read to the end */
+		cbuf_pos = p_buf->p_buf_start + p_buf->read_pos;
+		j = p_buf->num_elem - p_buf->read_pos;
+
+		for (i = 0; i < j; i++)
+			*(dest + i) = *((uint16_t *) cbuf_pos + i);
+
+		cbuf_pos = p_buf->p_buf_start;
+
+		dest += j;
+
+		for (i = 0; i < (elem - j); i++)
+			*(dest + i) = *((uint16_t *) cbuf_pos + i);
+
+		return i + j;
+	}
+
+	return 0;
+}
+
+
+
+
+/**
+ * @name	Free space in circular buffer
+ * @brief	Returns the free space in a circular buffer
+ *
+ * @param	p_buf a pointer to a struct circular_buffer structure
+ *
+ * @returns	number of free elements in the buffer
+ */
+
+uint32_t cbuf_get_free16(struct circular_buffer16 *p_buf)
+{
+	return  p_buf->num_elem - (p_buf->write_pos
+				   + (p_buf->read_pos > p_buf->write_pos)
+				   * p_buf->num_elem
+				   - p_buf->read_pos);
+}
+
+/**
+ * @name	Used space in circular buffer
+ * @brief	Returns the used space in a circular buffer
+ *
+ * @param	p_buf a pointer to a struct circular_buffer structure
+ *
+ * @returns	number of used elements in the buffer
+ */
+
+uint32_t cbuf_get_used16(struct circular_buffer16 *p_buf)
+{
+	return p_buf->num_elem - cbuf_get_free16(p_buf);
+}
+
+
+/**
+ * @name	Forward the read position
+ * @brief	Forwards the read position, effectively removing values from
+ *		the "top"
+ *
+ * @param	p_buf a pointer to a struct circular_buffer structure
+ * @param in	elements number of elements to forward the buffer's read
+ *		position
+ *
+ * @returns	number of elements forwarded or 0 if the requested jump
+ *		was too far
+ */
+
+uint32_t cbuf_forward16(struct circular_buffer16 *p_buf, uint32_t elem)
+{
+	if (cbuf_get_used16(p_buf) >= elem) {
+		if ((p_buf->num_elem - p_buf->read_pos) >= elem)
+			p_buf->read_pos += elem;
+		else
+			p_buf->read_pos += elem - p_buf->num_elem;
+
+		return elem;
+	}
+
+	return 0;
+}
diff --git a/IBSW/lib/circular_buffer8.c b/IBSW/lib/circular_buffer8.c
new file mode 100644
index 0000000..2d6458c
--- /dev/null
+++ b/IBSW/lib/circular_buffer8.c
@@ -0,0 +1,286 @@
+/**
+ * @file   circular_buffer8.c
+ * @ingroup circular_buffer8
+ * @author Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @date   September, 2013
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ *
+ * @defgroup circular_buffer8 Circular Buffer (8 bit version)
+ *
+ * @brief 8 bit data type circular buffer
+ *
+ * @note no spinlocks, effectively limited to one producer, one consumer
+ *
+ * @note its probably a good idea to rewrite the core functionalities of
+ *       both 8 and 16 bit buffers as typeof() macros and just create wrapper
+ *       for the particular type for easier maintenance
+ */
+
+#include <stdlib.h>
+#include <circular_buffer8.h>
+
+/**
+ * @name	Declare a circular buffer
+ * @brief	Declares a circular buffers and initializes with zeros
+ * @param	p_buf a pointer to a struct circular_buffer structure
+ * @param	p_buffer_start a pointer to a memory pool
+ * @param	buffer_size number of buffer elements
+ * @param	ptDMAchannel2 DMA channel reserved for circular buffer writes
+ */
+
+int32_t cbuf_init8(struct circular_buffer8 *p_buf,
+		   uint8_t *p_buffer_start,
+		   uint32_t buffer_size)
+{
+	if (p_buf == NULL)
+		return -1;
+
+	if (p_buffer_start == NULL)
+		return -1;
+
+	p_buf->p_buf_start = p_buffer_start;
+	p_buf->num_elem	   = buffer_size;
+	p_buf->read_pos	   = 0;
+	p_buf->write_pos   = 0;
+
+	return 0;
+}
+
+/**
+ * @brief	resets a circular buffer
+ * @param	p_buf a pointer to a struct circular_buffer structure
+ */
+
+void cbuf_reset8(struct circular_buffer8 *p_buf)
+{
+	p_buf->read_pos		= 0;
+	p_buf->write_pos	= 0;
+}
+
+/**
+ * @name	Read from circular buffer
+ * @brief	Reads elements words from a circular buffer to dest
+ * @param	p_buf a pointer to a struct circular_buffer structure
+ * @param out	dest a pointer to the target memory
+ * @param in	elements number of elements to read from the buffer
+ *
+ * @returns	number of elements read
+ */
+
+uint32_t cbuf_read8(struct circular_buffer8 *p_buf,
+		    uint8_t *dest,
+		    uint32_t elem)
+{
+	uint32_t i, j;
+	uint8_t *cbuf_pos;
+
+
+	/* check if size of data already written corresponds to the required
+	 * dump size
+	 */
+	if (cbuf_get_used8(p_buf) >= elem) {
+		if ((p_buf->num_elem - p_buf->read_pos) >= elem) {
+			cbuf_pos = p_buf->p_buf_start + p_buf->read_pos;
+
+			for (i = 0; i < elem; i++)
+				*(dest + i) = *((uint8_t *) cbuf_pos + i);
+
+			p_buf->read_pos += i;
+
+			return i;
+		}
+		/* else read to the end */
+		cbuf_pos = p_buf->p_buf_start + p_buf->read_pos;
+		j = p_buf->num_elem - p_buf->read_pos;
+
+		for (i = 0; i < j; i++)
+			*(dest + i) = *((uint8_t *) cbuf_pos + i);
+
+		cbuf_pos = p_buf->p_buf_start;
+
+		dest += j;
+
+		for (i = 0; i < (elem - j); i++)
+			*(dest + i) = *((uint8_t *) cbuf_pos + i);
+
+		p_buf->read_pos = i;
+
+		return i+j;
+	}
+
+	return 0;
+}
+
+
+/**
+ * @name	Write to circular buffer
+ * @brief	Writes elements words from src to a circular buffer
+ *
+ * @param	p_buf a pointer to a struct circular_buffer structure
+ * @param in	dest a pointer to the source memory
+ * @param in	elements number of elements to write to the circular buffer
+ *
+ * @returns	number of elements written
+ */
+
+uint32_t cbuf_write8(struct circular_buffer8 *p_buf, uint8_t *src,
+		     uint32_t elem)
+{
+	uint32_t i, j;
+	uint8_t *cbuf_pos;
+
+
+	if (cbuf_get_free8(p_buf) > elem) {
+		if ((p_buf->num_elem - p_buf->write_pos) >= elem) {
+			cbuf_pos = p_buf->p_buf_start + p_buf->write_pos;
+
+			for (i = 0; i < elem; i++)
+				(*((uint8_t *) cbuf_pos + i)) = (*(src + i));
+
+			p_buf->write_pos += i;
+
+			return i;
+		}
+
+		cbuf_pos = p_buf->p_buf_start + p_buf->write_pos;
+		j = p_buf->num_elem - p_buf->write_pos;
+
+		for (i = 0; i < j; i++)
+			(*((uint8_t *) cbuf_pos + i)) = (*(src + i));
+
+		cbuf_pos = p_buf->p_buf_start;
+
+		src += j;
+
+		for (i = 0; i < (elem - j); i++)
+			(*((uint8_t *) cbuf_pos + i)) = (*(src + i));
+
+		p_buf->write_pos = i;
+
+		return i + j;
+	}
+
+	return 0;
+}
+
+/**
+ * @name	peek into circular buffer
+ * @brief	Reads elements words from a circular buffer to dest without
+ *		incrementing the read pointer
+ * @param	p_buf a pointer to a struct circular_buffer structure
+ * @param out	dest a pointer to the target memory
+ * @param in	elements number of elements to read from the buffer
+ *
+ * @returns	number of elements read
+ */
+
+uint32_t cbuf_peek8(struct circular_buffer8 *p_buf, uint8_t *dest,
+		    uint32_t elem)
+{
+	uint32_t i, j;
+	uint8_t *cbuf_pos;
+
+
+	/* check if size of data already written corresponds to the required
+	 * dump size
+	 */
+	if (cbuf_get_used8(p_buf) >= elem) {
+		if ((p_buf->num_elem - p_buf->read_pos) >= elem) {
+			cbuf_pos = p_buf->p_buf_start + p_buf->read_pos;
+
+			for (i = 0; i < elem; i++)
+				*(dest + i) = *((uint8_t *) cbuf_pos + i);
+
+			return i;
+		}
+		/* else read to the end */
+		cbuf_pos = p_buf->p_buf_start + p_buf->read_pos;
+		j = p_buf->num_elem - p_buf->read_pos;
+
+		for (i = 0; i < j; i++)
+			*(dest + i) = *((uint8_t *) cbuf_pos + i);
+
+		cbuf_pos = p_buf->p_buf_start;
+
+		dest += j;
+
+		for (i = 0; i < (elem - j); i++)
+			*(dest + i) = *((uint8_t *) cbuf_pos + i);
+
+		return i + j;
+	}
+
+	return 0;
+}
+
+
+
+
+/**
+ * @name	Free space in circular buffer
+ * @brief	Returns the free space in a circular buffer
+ *
+ * @param	p_buf a pointer to a struct circular_buffer structure
+ *
+ * @returns	number of free elements in the buffer
+ */
+
+uint32_t cbuf_get_free8(struct circular_buffer8 *p_buf)
+{
+	return  p_buf->num_elem - (p_buf->write_pos
+				   + (p_buf->read_pos > p_buf->write_pos)
+				   * p_buf->num_elem
+				   - p_buf->read_pos);
+}
+
+/**
+ * @name	Used space in circular buffer
+ * @brief	Returns the used space in a circular buffer
+ *
+ * @param	p_buf a pointer to a struct circular_buffer structure
+ *
+ * @returns	number of used elements in the buffer
+ */
+
+uint32_t cbuf_get_used8(struct circular_buffer8 *p_buf)
+{
+	return p_buf->num_elem - cbuf_get_free8(p_buf);
+}
+
+
+/**
+ * @name	Forward the read position
+ * @brief	Forwards the read position, effectively removing values from
+ *		the "top"
+ *
+ * @param	p_buf a pointer to a struct circular_buffer structure
+ * @param in	elements number of elements to forward the buffer's read
+ *		position
+ *
+ * @returns	number of elements forwarded or 0 if the requested jump
+ *		was too far
+ */
+
+uint32_t cbuf_forward8(struct circular_buffer8 *p_buf, uint32_t elem)
+{
+	if (cbuf_get_used8(p_buf) >= elem) {
+		if ((p_buf->num_elem - p_buf->read_pos) >= elem)
+			p_buf->read_pos += elem;
+		else
+			p_buf->read_pos += elem - p_buf->num_elem;
+
+		return elem;
+	}
+
+	return 0;
+}
diff --git a/IBSW/lib/core1553brm_as250.c b/IBSW/lib/core1553brm_as250.c
new file mode 100644
index 0000000..7bf5824
--- /dev/null
+++ b/IBSW/lib/core1553brm_as250.c
@@ -0,0 +1,2255 @@
+/**
+ * @file   core1553brm_as250.c
+ * @ingroup core1553brm_as250
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   July, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief Driver for the MicroSemi Core 1553 BRM implementing the AS250
+ *        protocol layer
+ *
+ * @defgroup core1553brm_as250 Core1553BRM/AS250 device/protocol driver
+ *
+ *
+ *
+ * ## Overview
+ *
+ * This is a driver for the MicroSemi Core1553BRM implementing the
+ * __AS250 MIL-STD-1553__ Bus Protocol as specified in
+ * __DIV.SP.00030.T.ASTR__ _Issue 1 Revision 1_, tailored as specified in
+ * __CHEOPS-ECE-CSW-ICD-049__ _Issue 4.x_.
+ *
+ * The AS250 1553 protocol specification is based on the __ECSS-E-ST-50-13C__
+ * standard.
+ *
+ * The main differences in this protocol variant are:
+ *
+ * - twice as many Acquisition Transfer Requests (ATR) are allowed for the
+ *   Remote Terminal (RT) per major frame
+ * - the doubled ATR rate results in an increased transfer volume of
+ *   128kbits per second
+ * - no confirmations of ATRs are written by the Bus Controller
+ * - the transfer block counter wraps from 255 to 0 instead of 1
+ * - a transfer will be accepted as new as long as the block counter differs
+ *   from the previous one
+ *
+ *
+ * ## Mode of Operation
+ *
+ * @see _Core1553BRM v4.1 Handbook_ for a description of the hardware
+ * interface
+ *
+ * Since the protocol requires an response to a data write by the
+ * _Bus Controller_ (the spacecraft) in the next 1553 minor frame, the least
+ * involved approach is to operate the 1553 core in _ping-pong_ mode.
+ * This mode is a double-buffering scheme, in which two buffers are assigned
+ * per RX and TX subaddress. As the core operates, it will use one of the
+ * buffers for ongoing transfers, while the other is available to the software
+ * for reading or writing. In the next minor frame, the buffers will be
+ * switched and so on.
+ *
+ * The interaction with the 1553 core is triggered by interrupts that are
+ * generated by the former based on its subaddress configuration. The attached
+ * interrupt service routine (ISR) of the driver then inspects the interrupt log
+ * list of the 1553 core and processes recorded events. If a transfer occured,
+ * it reads or writes data from/to the subaddress buffers and handles the
+ * protocol response. Telecommands (_Distribution Data_ or __DD__) written by
+ * the spacecraft are stored in @ref packet_tracker buffers that are queried by
+ * the application software. Telemetry data (_Acquisition Data_ or __AD__) are
+ * extracted from a @ref cpus_buffer that accepts at most 2 kiB of PUS packets
+ * from the IASW at any given time.
+ *
+ * @image html core1553brm_as250/irq_handler.png "Core1553BRM driver ISR"
+ *
+ *
+ * ### Acquisition Packets
+ *
+ * The IASW is by design not able to supply prefabricated transfer frames of
+ * telemetry packets to the driver directly. Instead, it tries to hand off as
+ * many of packets as possible in one polling cycle. Therefore, the IBSW
+ * therefore supplies the @ref cpus_buffer that acts as an intermediate to the
+ * 1553 driver by properly packing TM data into transfer frames that do not
+ * split PUS packets across a minor frame transfer, as required by the
+ * communication protocol.
+ *
+ * Aquisition Transfers are issued every time TX subaddress (__SA__) 28 is read
+ * by the Bus Controller. The inactive ping-pong buffer is determined and a
+ * frame is constructed and loaded into TX subaddresses 11-26, then the block
+ * counter in the Acquisition Transfer Request message is updated and the latter
+ * loaded into SA 28.
+ *
+ * @startuml {AT_generation.svg} "Acquisition Transfer Generation" width=10
+ *
+ * start
+ *
+ * :get last ATR;
+ *
+ * :create transfer frame;
+ *
+ * if (no packet) then (yes)
+ *
+ * while (packet fits?)
+ *	:add packet;
+ * endwhile
+ *
+ * :update block counter;
+ *
+ * while (bytes left?)
+ *	:write SA;
+ *	:next SA;
+ * endwhile
+ *
+ * :write ATR;
+ *
+ * endif
+ * stop
+ *
+ * @enduml
+ *
+ *
+ * ### Distribution Packets
+ *
+ * Telecommand packets written by the Bus Controller are directed into different
+ * buffers by inspecting their PUS header for their source ID and stored in two
+ * @ref packet_tracker buffers. This has to be done in the driver, because the
+ * the IASW cannot determine the source of a packet itself. Instead, it requires
+ * an interface supplied by the IBSW for each packet sources it allows.
+ *
+ * @image html core1553brm_as250/split_packetstreams_direct_buffer_drop.png "Packet redirection into buffers based on ID"
+ *
+ * ## Error Handling
+ *
+ * Most errors reported by the 1553 core during run time are either non-critical
+ * or usually non-recoverable. The latter usually result from breakage on the
+ * physical layer of the 1553 bus, or from severe misconfiguration of the core.
+ * In either case, no reports on the state of the device can be expected to
+ * reach the bus controller.
+ *
+ * Errors that may have been raised are reported via the event reporting
+ * interface. If a critical errors warranting a FDIR response occured, an
+ * optional, user-supplied reset function is called, which can for example
+ * result in entering safe mode, where there is a chance to handle
+ * misconfiguration via the boot software.
+ *
+ * Errors in the @ref cpus_buffer or @ref packet_tracker are not critical to
+ * core operation and result in a full reset of the buffers issued by the driver
+ * itself, accompanied by an error report.
+ *
+ *
+ * ## Notes
+ *
+ * The implementation of the protocol in the driver layer was necessitated due
+ * to the low-frequency polling-style operating of the application software,
+ * which would have been too slow to operate the exchange by itself.
+ * A separate dedicated thread was not an option, because of the FIFO
+ * scheduling policy selected for the IFSW and also the requirement to allow
+ * packet priorisation within the IASW.
+ *
+ *
+ *
+ * @example demo1553_as250.c
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <stdint.h>
+
+#include <errno.h>
+
+#include <core1553brm_as250.h>
+#include <irq.h>
+#include <irq_dispatch.h>
+
+#include <cpus_buffers.h>
+#include <packet_tracker.h>
+
+#include <errors.h>
+#include <compiler.h>
+#include <io.h>
+
+#include <event_report.h>
+#include <sysctl.h>
+
+
+/*
+ * NOTE: we assume untranslated addresses for now, so there is no need for
+ *	 alternate space loads. This needs to be added if the MMU and/or
+ *	 priviledged memory access is going to be used with the driver
+ */
+
+
+
+
+
+static struct {
+	uint32_t rx_bytes;
+	uint32_t tx_bytes;
+	uint32_t bytes_dropped;
+} brmstat;
+
+#if (__sparc__)
+#define UINT32_T_FORMAT		"%lu"
+#else
+#define UINT32_T_FORMAT		"%u"
+#endif
+
+static ssize_t rxtx_show(__attribute__((unused)) struct sysobj *sobj,
+			 __attribute__((unused)) struct sobj_attribute *sattr,
+			 char *buf)
+{
+	if (!strcmp(sattr->name, "rx_bytes"))
+		return sprintf(buf, UINT32_T_FORMAT, brmstat.rx_bytes);
+
+	if (!strcmp(sattr->name, "tx_bytes"))
+		return sprintf(buf, UINT32_T_FORMAT, brmstat.tx_bytes);
+
+	if (!strcmp(sattr->name, "bytes_dropped"))
+		return sprintf(buf, UINT32_T_FORMAT, brmstat.bytes_dropped);
+
+	return 0;
+}
+
+static ssize_t rxtx_store(__attribute__((unused)) struct sysobj *sobj,
+			  __attribute__((unused)) struct sobj_attribute *sattr,
+			  __attribute__((unused)) const char *buf,
+			  __attribute__((unused)) size_t len)
+{
+	if (!strcmp(sattr->name, "rx_bytes")) {
+		brmstat.rx_bytes = 0;
+		return 0;
+	}
+
+	if (!strcmp(sattr->name, "tx_bytes")) {
+		brmstat.tx_bytes = 0;
+		return 0;
+	}
+
+	if (!strcmp(sattr->name, "bytes_dropped")) {
+		brmstat.bytes_dropped = 0;
+		return 0;
+	}
+
+	return 0;
+}
+
+__extension__
+static struct sobj_attribute rx_bytes_attr = __ATTR(rx_bytes,
+						    rxtx_show,
+						    rxtx_store);
+__extension__
+static struct sobj_attribute tx_bytes_attr = __ATTR(tx_bytes,
+						    rxtx_show,
+						    rxtx_store);
+__extension__
+static struct sobj_attribute dropped_bytes_attr = __ATTR(bytes_dropped,
+							 rxtx_show,
+							 rxtx_store);
+
+__extension__
+static struct sobj_attribute *brm_attributes[] = {&rx_bytes_attr,
+						  &tx_bytes_attr,
+						  &dropped_bytes_attr,
+						  NULL};
+
+
+
+
+/**
+ * @brief central driver error handling
+ * @param brm a struct brm_config
+ * @param s the error severity
+ */
+
+static void brm_handle_error(struct brm_config *brm, enum error_severity s)
+{
+	event_report(CORE1553BRM, s, (uint32_t) errno);
+
+	if (s == HIGH)
+		if (brm->rt_reset)
+			brm->rt_reset(brm->rt_reset_userdata);
+}
+
+
+/**
+ * @brief computes the parity bit for the given RT address
+ * @retval 1 : for multiple-of-two numbers of high bits
+ * @retval 0 : otherwise
+ */
+
+static uint8_t rt_parity_bit(uint8_t rt_address)
+{
+	/* 1) make sure only valid RTA bits are selected
+	 * 2) xor upper nibble with lower nibble to eliminate pairs
+	 * 3) take the lower nibble only, it contains all non-pairs in the byte
+	 * 4) determine parity from precalculated bit field suitable for the
+	 *   RTPTY flag. For dumbos:
+	 *   1 = 1 bit, 2 = 1 bit, 3 = 2 bits, 4 = 1 bit, 5 = 2 bits etc...
+	 */
+
+	rt_address &= BRM_RTA_BITS;
+	rt_address ^= (rt_address >> 4);
+	rt_address &= 0x0F;
+
+	return ((0x9669 >> rt_address) & 0x1);
+}
+
+
+/**
+ * @brief queries the MSGTO bit to determine whether ping-pong mode is
+ *        disabled or enabled
+ * @param brm a struct brm_config
+ * @retval 1 : enabled
+ * @retval 0 : disabled
+ */
+
+static int32_t brm_pp_enabled(struct brm_config *brm)
+{
+	return ioread32be(&brm->regs->ctrl) & BRM_CCR_MSGTO;
+}
+
+
+/**
+ * @brief disable ping-pong mode
+ * @param brm a struct brm_config
+ * @note success of operation should always be checked via brm_pp_enabled()
+ * @see Core1553BRM v4.0 Handbook, p.61
+ */
+
+static void brm_disable_pp(struct brm_config *brm)
+{
+	uint32_t ctrl;
+
+	ctrl = ioread32be(&brm->regs->ctrl) & ~BRM_CCR_PPEN;
+
+	iowrite32be(ctrl, &brm->regs->ctrl);
+}
+
+
+/**
+ * @brief enable ping-pong mode
+ * @param brm a struct brm_config
+ * @note success of operation should always be checked via brm_pp_enabled()
+ * @see Core1553BRM v4.0 Handbook, p.61
+ *
+ */
+
+static void brm_enable_pp(struct brm_config *brm)
+{
+	uint32_t ctrl;
+
+	ctrl = ioread32be(&brm->regs->ctrl) | BRM_CCR_PPEN;
+
+	iowrite32be(ctrl, &brm->regs->ctrl);
+}
+
+
+/**
+ * @brief gets offset to currently non-active (secondary) ping-pong data buffer
+ *        of a RX subaddress
+ * @param brm a struct brm_config
+ * @param sa a subaddress number
+ * @returns offset into the buffer
+ */
+
+static uint32_t brm_get_offset_pp_rx_prev(struct brm_config *brm, uint32_t sa)
+{
+	uint32_t offset;
+
+	if (ioread16be(&brm->rt_mem->sa_rx[sa].CW) & BRM_RT_CW_FLAGS_AB)
+		offset = (uint32_t) ioread16be(&brm->rt_mem->sa_rx[sa].buf_A);
+	else
+		offset = (uint32_t) ioread16be(&brm->rt_mem->sa_rx[sa].buf_B);
+
+
+	return (offset + BRM_HEADER_WORDS);
+}
+
+
+/**
+ * @brief gets offset to currently non-active (seconardy) ping-pong data buffer
+ *        of a TX subaddress
+ * @param brm a struct brm_config
+ * @param sa a subaddress number
+ * @returns offset into the buffer
+ * @note this buffer will be read by the core next when it is polled by the bus
+ *       controller
+ */
+
+static uint32_t brm_get_offset_pp_tx_next(struct brm_config *brm, uint32_t sa)
+{
+	uint32_t offset;
+
+	if (ioread16be(&brm->rt_mem->sa_tx[sa].CW) & BRM_RT_CW_FLAGS_AB)
+		offset = (uint32_t) ioread16be(&brm->rt_mem->sa_tx[sa].buf_B);
+	else
+		offset = (uint32_t) ioread16be(&brm->rt_mem->sa_tx[sa].buf_A);
+
+	return (offset + BRM_HEADER_WORDS);
+}
+
+
+/**
+ * @brief gets offset to currently active (primary) ping-pong data buffer
+ *        of a TX subaddress
+ * @param brm a struct brm_config
+ * @param sa a subaddress number
+ * @returns offset into the buffer
+ * @note this buffer is currently marked for reading by the core
+ */
+
+static uint32_t brm_get_offset_pp_tx_curr(struct brm_config *brm, uint32_t sa)
+{
+	uint32_t offset;
+
+	if (ioread16be(&brm->rt_mem->sa_tx[sa].CW) & BRM_RT_CW_FLAGS_AB)
+		offset = (uint32_t) ioread16be(&brm->rt_mem->sa_tx[sa].buf_A);
+	else
+		offset = (uint32_t) ioread16be(&brm->rt_mem->sa_tx[sa].buf_B);
+
+	return (offset + BRM_HEADER_WORDS);
+}
+
+
+/*
+ * @brief gets offset to currently non-active (secondary) ping-pong data buffer
+ *        of a mode code RX subaddress
+ * @param brm a struct brm_config
+ * @param sa a subaddress number
+ * @returns offset into the buffer
+ */
+
+__attribute__((unused))
+static uint32_t brm_get_offset_pp_mc_rx_prev(struct brm_config *brm,
+					     uint32_t sa)
+{
+	uint32_t offset;
+
+	if (ioread16be(&brm->rt_mem->mc_rx[sa].CW) & BRM_RT_CW_FLAGS_AB)
+		offset = (uint32_t) ioread16be(&brm->rt_mem->mc_rx[sa].buf_A);
+	 else
+		offset = (uint32_t) ioread16be(&brm->rt_mem->mc_rx[sa].buf_B);
+
+
+	return (offset + BRM_HEADER_WORDS);
+}
+
+
+/**
+ * @brief gets number of data words in a descriptor
+ * @param brm a struct brm_config
+ * @param descriptor a descriptor number
+ * @returns data word count
+ * @note the Message Information Word and Time Tag entries are not included in
+ *       the count; this is only sensible to use with RX subaddresses;
+ */
+
+static uint32_t brm_get_wordcount(struct brm_config *brm, uint32_t descriptor)
+{
+	uint32_t wc;
+	uint32_t offset;
+
+	if (ioread16be(&brm->rt_mem->descriptors[descriptor].CW) &
+		 BRM_RT_CW_FLAGS_AB)
+		offset = (uint32_t)
+			ioread16be(&brm->rt_mem->descriptors[descriptor].buf_A);
+	else
+		offset = (uint32_t)
+			ioread16be(&brm->rt_mem->descriptors[descriptor].buf_B);
+
+
+	wc = (uint32_t) BRM_DATAWORDCOUNT(BRM_GET_WCMC(brm->brm_mem[offset]));
+
+	return wc;
+}
+
+
+/**
+ * @brief redirects PUS packets into buffers by source ID
+ * @param brm a struct brm_config
+ * @param rx_bytes number of bytes in the internal buffer
+ * @retval  0 : success
+ * @retval -1 : error
+ */
+
+static int32_t as250_split_packet_stream(struct brm_config *brm,
+					 uint32_t rx_bytes)
+{
+	int32_t ret;
+	uint32_t i = 0;
+	uint32_t bytes;
+
+	struct packet_tracker *p_pkt = NULL;
+
+	while (i < rx_bytes) {
+
+		bytes = (uint32_t) ptrack_get_pkt_size(&brm->buf.adb_ddb[i]);
+
+		if (bytes > (AS250_TRANSFER_FRAME_SIZE-i)) {
+			/* discard remaining buffer and return */
+			errno = E_BRM_INVALID_PKT_SIZE;
+			return -1;
+		}
+
+		switch (ptrack_get_next_pkt_src_id(&brm->buf.adb_ddb[i])) {
+
+		case PUS_ID_GND:
+			p_pkt = brm->buf.pkt_gnd;
+			break;
+
+		case PUS_ID_OBC:
+			p_pkt = brm->buf.pkt_obc;
+			break;
+
+		default:
+			/* discard remaining buffer and return */
+			errno = E_BRM_INVALID_PKT_ID;
+			return -1;
+		}
+
+		ret = ptrack_add_single_pkt(p_pkt, &brm->buf.adb_ddb[i],
+					    (rx_bytes-i));
+
+		if (ret < 0) {
+			brmstat.bytes_dropped += rx_bytes;
+			ptrack_reset(p_pkt);	/* reset buffers */
+			return -1;	/* errno set by call to ptrack_add */
+		}
+
+		i += (uint32_t) ret;
+	}
+
+	return 0;
+}
+
+
+/**
+ * @brief handles bus controller access to the AS250 DTD subaddress
+ * @param brm a struct brm_config
+ * @retval  0 : success
+ * @retval -1 : error
+ * @note ping-pong mode must already be disabled when this function is called
+ * @note There are unnecessary copy operations when collecting the (packet)
+ *       data. Unfortunately, this is not easily avoided, so we won't try and
+ *       implement a zero-copy approach given the low data rate
+ */
+
+static int32_t as250_handle_dtd_irq(struct brm_config *brm)
+{
+
+	uint32_t i;
+	uint32_t bytes;
+	uint32_t rx_bytes_left;
+	uint32_t offset;
+	uint32_t rx_bytes = 0;
+
+	struct transfer_descriptor dtd;
+
+
+	offset = brm_get_offset_pp_rx_prev(brm, AS250_SA_RX_DTD);
+	memcpy(&dtd, &brm->brm_mem[offset], AS250_TRANSFER_DESCRIPTOR_SIZE);
+
+	/*  MIL-228/T; CIS-SW-ICD-035 & CIS-SW-ICD-036 protocol reset */
+	if (unlikely(dtd.reset)) {
+		brm->as250.dtd_blk_cnt = dtd.block_counter;
+
+		dtd.qos_err   = 0x0;	/* MIL-228/T */
+		dtd.reset     = 0x1;	/* MIL-228/T */
+
+		goto send_dtc;
+	}
+
+	/*  variation from MIL-231/T in CIS-SW-ICD-033:
+	 *  accept all block counters not identical to the last one as new
+	 */
+	if (likely(dtd.block_counter == brm->as250.dtd_blk_cnt))
+		return 0;
+
+	brm->as250.dtd_blk_cnt = dtd.block_counter;
+
+	dtd.qos_err = 0x0;	/* default: no error detected */
+
+	rx_bytes_left = dtd.transfer_size;
+
+	for (i = AS250_SA_RX_DDB_01; i <= AS250_SA_RX_DDB_16; i++) {
+
+		if (!rx_bytes_left)
+			break;
+
+		offset = brm_get_offset_pp_rx_prev(brm, i);
+
+		if (rx_bytes_left > 64)
+			bytes = 64;
+		else
+			bytes = rx_bytes_left;
+
+		memcpy(&brm->buf.adb_ddb[rx_bytes],
+		       &brm->brm_mem[offset], bytes);
+
+		rx_bytes       += bytes;
+		rx_bytes_left  -= bytes;
+	}
+
+
+send_dtc:	/* common exit */
+
+	offset = brm_get_offset_pp_tx_next(brm, AS250_SA_TX_DTC);
+
+	memcpy(&brm->brm_mem[offset], &dtd, AS250_TRANSFER_DESCRIPTOR_SIZE);
+
+	brmstat.rx_bytes += rx_bytes;
+
+	if (as250_split_packet_stream(brm, rx_bytes) < 0)
+		return -1; /* errno set in call */
+
+	return 0;
+}
+
+
+/**
+ * @brief writes a protocol reset ATR
+ * @param brm a struct brm_config
+ * @retval 0 : success
+ * @retval 1 : error occured
+ *
+ */
+
+static uint32_t as250_reset_protocol(struct brm_config *brm)
+{
+	uint32_t offset;
+	uint16_t pp_enabled = 0;
+
+
+	if (brm_pp_enabled(brm)) {
+		pp_enabled = 1;
+
+		brm_disable_pp(brm);
+#if (__sparc__) /* This is impossible to unit-test as long as we have static
+		 * functions and must include the c file in the unit test file.
+		 * We can also not just remove it, because it is mandated by
+		 * hardware manual, see Core1553BRM v4.0 Handbook, p.61
+		 */
+
+		if (brm_pp_enabled(brm)) {
+			errno = EFAULT;
+			return 1;
+		}
+#endif
+	}
+
+
+	brm->as250.atr.word0     = 0x0000;
+	brm->as250.atr.word1     = 0x4000; /* reset = 1 CIS-SW-ICD-036 */
+
+	brm->as250.atd_blk_cnt = 0x1;
+
+	offset = brm_get_offset_pp_tx_next(brm, AS250_SA_TX_ATR);
+	memcpy(&brm->brm_mem[offset], &brm->as250.atr,
+	       AS250_TRANSFER_DESCRIPTOR_SIZE);
+
+	offset = brm_get_offset_pp_tx_curr(brm, AS250_SA_TX_ATR);
+	memcpy(&brm->brm_mem[offset], &brm->as250.atr,
+	       AS250_TRANSFER_DESCRIPTOR_SIZE);
+
+	brm->as250.atr.word0     = 0x0;
+	brm->as250.atr.word1     = 0x0;
+
+	if (pp_enabled) {
+		brm_enable_pp(brm);
+
+#if (__sparc__) /* see above */
+		if (!brm_pp_enabled(brm)) {
+			errno = EFAULT;
+			return 1;
+		}
+#endif
+	}
+
+	return 0;
+}
+
+
+/**
+ * @brief creates a AS250 transfer frame
+ * @param brm a struct brm_config
+ * @param atr a struct transfer_descriptor
+ * @retval -1 : error
+ * @retval  0 : success
+ */
+
+static int32_t as250_create_transfer_frame(struct brm_config *brm,
+					   struct transfer_descriptor *atr)
+{
+	int32_t ret;
+	int32_t bytes;
+	int32_t tx_bytes_left;
+
+	struct cpus_buffers *p_buf;
+
+
+	p_buf = brm->buf.atr_cpus;
+
+	tx_bytes_left     = AS250_TRANSFER_FRAME_SIZE;
+	atr->transfer_size = 0;
+
+	while ((bytes = cpus_next_valid_pkt_size(p_buf))) {
+
+		if (unlikely(bytes < 0)) {
+			/* no point in counting dropped bytes here, as the
+			 * buffer is not valid and it has to be reset as a
+			 * whole
+			 */
+			cpus_reset(p_buf);
+			return -1; /* errno set in call */
+		}
+
+		if (bytes > tx_bytes_left)
+			break;
+
+		ret = cpus_pop_packet(p_buf,
+				      &brm->buf.adb_ddb[atr->transfer_size]);
+
+		if (unlikely(ret < 1)) {
+			cpus_reset(p_buf);
+			return -1; /* errno set in call */
+		}
+
+		atr->transfer_size += ret;
+		tx_bytes_left     -= ret;
+	}
+
+	return 0;
+}
+
+
+/**
+ * @brief prepares the AS250 acquisition data buffer
+ * @param brm a struct brm_config
+ * @param atr a struct transfer_descriptor
+ */
+
+static void as250_prepare_adb(struct brm_config *brm,
+			      const struct transfer_descriptor *atr)
+{
+	int32_t bytes;
+	int32_t tx_bytes_left;
+	int32_t tx_bytes;
+
+	uint32_t offset;
+	uint32_t sa = AS250_SA_TX_ADB_01;
+
+
+	tx_bytes_left = atr->transfer_size;
+	tx_bytes = 0;
+
+	/* CIS-SW-ICD-042
+	 * if data bytes transferred are not a multiple of two,
+	 * there is one padding byte, clear in ADB
+	 */
+	if (tx_bytes_left & 0x1) {
+		tx_bytes_left += 1;
+		brm->buf.adb_ddb[tx_bytes_left] = 0x0;
+	}
+
+	do {
+		if (!tx_bytes_left)
+			break;
+
+		offset = brm_get_offset_pp_tx_next(brm, sa);
+
+		if (tx_bytes_left >= BRM_NUM_DATABYTES)
+			bytes = BRM_NUM_DATABYTES;
+		else
+			bytes = tx_bytes_left;
+
+		memcpy(&brm->brm_mem[offset],
+		       &brm->buf.adb_ddb[tx_bytes], (size_t) bytes);
+
+		tx_bytes      += bytes;
+		tx_bytes_left -= bytes;
+
+	} while (sa++ < AS250_SA_TX_ADB_16);
+}
+
+/**
+ * @brief handles bus controller access to the AS250 ATR subaddress
+ * @param brm a struct brm_config
+ * @retval -1 : error
+ * @retval  0 : success
+ * @note ping-pong mode must already be disabled when this function is called
+ * @note There are unnecessary copy operations when writing the data. This is
+ *       relatively easy to fix, we just need a partial read-out mechanism
+ *       for the buffers. It is however not an issue given the data rates.
+ */
+
+static int32_t as250_handle_atr_irq(struct brm_config *brm)
+{
+	int32_t ret;
+
+	uint32_t offset;
+
+
+	/* Set the last buffer accessed to the last valid ATR, otherwise the
+	 * BC will consider the toggling block counter as an error because of
+	 * the PP buffers.
+	 */
+	offset = brm_get_offset_pp_tx_next(brm, AS250_SA_TX_ATR);
+	memcpy(&brm->brm_mem[offset], &brm->as250.atr,
+	       AS250_TRANSFER_DESCRIPTOR_SIZE);
+
+	ret = as250_create_transfer_frame(brm, &brm->as250.atr);
+	if (ret)
+		return -1; /* errno set in call */
+
+	if (!brm->as250.atr.transfer_size)
+		return 0;
+
+	/**
+	 * CIS-SW-ICD-030
+	 * CIS-SW-ICD-031
+	 *  MIL-224/T:     mode = 0 is default
+	 *  MIL-223/T: set mode = 0 for SA 11-26 transfers
+	 *		    qos = 1 verified data length
+	 *
+	 * note: MIL-251 / T states (n+1) modulo 256, but CASA wants wrap to 1
+	 */
+
+	/* AS250_USE_COUNTER_AS_SPECIFIED_NOT_AS_INTENDED_BY_CASA */
+	brm->as250.atr.word1 = (0x8B00 | brm->as250.atd_blk_cnt++);
+
+	as250_prepare_adb(brm, &brm->as250.atr);
+
+	/* set the ATR */
+	offset = brm_get_offset_pp_tx_next(brm, AS250_SA_TX_ATR);
+	memcpy(&brm->brm_mem[offset], &brm->as250.atr,
+	       AS250_TRANSFER_DESCRIPTOR_SIZE);
+
+	brmstat.tx_bytes += brm->as250.atr.transfer_size;
+
+	return 0;
+}
+
+
+/**
+ * @brief handles bus controller access to the wrap-around subaddress
+ * @param brm a struct brm_config
+ */
+
+static void as250_handle_wrap_irq(struct brm_config *brm)
+{
+	uint32_t bytes;
+	uint32_t offset_rx;
+	uint32_t offset_tx;
+
+	offset_rx = brm_get_offset_pp_rx_prev(brm, AS250_SA_RX_DWRAP);
+	offset_tx = brm_get_offset_pp_tx_next(brm, AS250_SA_TX_DWRAP);
+
+	bytes = brm_get_wordcount(brm, AS250_SA_RX_DWRAP) * sizeof(uint16_t);
+
+	memcpy(&brm->brm_mem[offset_tx], &brm->brm_mem[offset_rx], bytes);
+}
+
+
+/**
+ * @brief handles direct time message subaddress access
+ * @param brm a struct brm_config
+ */
+
+static void as250_handle_time_message_irq(struct brm_config *brm)
+{
+	uint32_t offset_rx;
+	struct time_packet time;
+
+	offset_rx = brm_get_offset_pp_rx_prev(brm, AS250_SA_RX_TIME);
+
+	memcpy(&time, &brm->brm_mem[offset_rx], AS250_TIME_PACKET_SIZE);
+
+	if (brm->set_time != NULL)
+		brm->set_time(time.coarse_time, time.fine_time,
+			      brm->set_time_userdata);
+}
+
+
+/**
+ * @brief sets the first word in the RT_Health subaddress
+ * @param brm a struct brm_config
+ * @param mask a bit mask to set
+ */
+
+static void as250_rt_health_set(struct brm_config *brm, uint16_t mask)
+{
+	uint32_t offset;
+
+	/* must always set both, they are not updated on access */
+	offset  = (uint32_t)
+		ioread16be(&brm->rt_mem->sa_tx[AS250_SA_TX_HLTHMON].buf_A);
+	offset += BRM_HEADER_WORDS;
+	brm->brm_mem[offset] = mask;
+
+	offset  = (uint32_t)
+		ioread16be(&brm->rt_mem->sa_tx[AS250_SA_TX_HLTHMON].buf_B);
+	offset += BRM_HEADER_WORDS;
+	brm->brm_mem[offset] = mask;
+}
+
+
+/**
+ * @brief sets rt_health bits by mask
+ * @param brm a struct brm_config
+ * @param mask a mask with bits to toggle set HIGH
+ */
+
+static void as250_rt_health_set_bits(struct brm_config *brm, uint16_t mask)
+{
+	uint32_t offset;
+
+	/* must always set both, they are not updated on access */
+	offset  = (uint32_t)
+		ioread16be(&brm->rt_mem->sa_tx[AS250_SA_TX_HLTHMON].buf_A);
+	offset += BRM_HEADER_WORDS;
+	brm->brm_mem[offset] |= mask;
+
+	offset  = (uint32_t)
+		ioread16be(&brm->rt_mem->sa_tx[AS250_SA_TX_HLTHMON].buf_B);
+	offset += BRM_HEADER_WORDS;
+	brm->brm_mem[offset] |= mask;
+}
+
+
+/**
+ * @brief unsets rt_health bits by mask
+ * @param brm a struct brm_config
+ * @param mask a mask with bits to clear set HIGH
+ */
+
+static void as250_rt_health_unset_bits(struct brm_config *brm, uint16_t mask)
+{
+	uint32_t offset;
+
+	/* must always set both, they are not updated on access */
+	offset  = (uint32_t)
+		ioread16be(&brm->rt_mem->sa_tx[AS250_SA_TX_HLTHMON].buf_A);
+	offset += BRM_HEADER_WORDS;
+	brm->brm_mem[offset] &= ~mask;
+
+	offset  = (uint32_t)
+		ioread16be(&brm->rt_mem->sa_tx[AS250_SA_TX_HLTHMON].buf_B);
+	offset += BRM_HEADER_WORDS;
+	brm->brm_mem[offset] &= ~mask;
+}
+
+
+/**
+ * @brief handles terminal configuration commands as per MIL-345/T to MIL-350/T
+ * @param brm a struct brm_config
+ */
+
+static void as250_handle_termcfg(struct brm_config *brm)
+{
+	uint16_t rt_health_mask;
+	uint32_t offset;
+
+	/* no need to check for wordcount here */
+	offset  = brm_get_offset_pp_rx_prev(brm, AS250_SA_RX_TERMCFG);
+	rt_health_mask = brm->brm_mem[offset];
+
+	as250_rt_health_unset_bits(brm, rt_health_mask);
+}
+
+
+/**
+ * @brief RX subaddress IRQ handler for AS250 & ping-pong mode
+ * @param brm a struct brm_config
+ * @param descriptor a subaddress/mode code descriptor
+ */
+
+static void as250_handle_rx_irq(struct brm_config *brm, uint32_t descriptor)
+{
+	uint16_t flags;
+
+	switch (BRM_CALC_SA_RX_DESC(descriptor)) {
+
+	case AS250_SA_RX_TERMCFG:
+		as250_handle_termcfg(brm);
+		break;
+
+	/* This is another case of the driver acting too fast. It appears that
+	 * in cases where the DTD SA interrupt is raised by the 1553 core and
+	 * the driver deactivates ping-pong mode, a race condition may occur,
+	 * where the buffer A/B bit may have been toggled by the core, but the
+	 * corresponding buffer is not, so the data may end up in the wrong
+	 * buffer and is consequently not read by the driver.
+	 * T̶h̶i̶s̶ ̶i̶s̶ ̶f̶i̶x̶e̶d̶ ̶b̶y̶ ̶c̶h̶a̶n̶g̶i̶n̶g̶ ̶t̶h̶e̶ ̶i̶n̶t̶e̶r̶r̶u̶p̶t̶i̶n̶g̶ ̶s̶u̶b̶a̶d̶d̶r̶e̶s̶s̶ ̶t̶o̶ ̶D̶T̶D̶
+	 * s̶u̶b̶a̶d̶d̶r̶e̶s̶s̶ ̶1̶6̶.̶
+	 * ^- This was a misinterpretation of the minor frame SA access scheme
+	 *    and has since been reverted to the previous (correct) trigger on
+	 *    DTD SA access.
+	 *
+	 * Note that this behaviour is only observed with the CHEOPS spacecraft
+	 * platform simulator and is p̶o̶s̶s̶i̶b̶l̶y̶ definitely related to the
+	 * asynchronous messaging scheme used, as the ADB/DDB SAs are only
+	 * accessed conditionally if the transfer descriptors change and if a
+	 * transfer fits into the data field of a the first subaddress, only
+	 * that particular subaddress is read. This pattern does not continue,
+	 * i.e. all transfers > 64 bytes will be executed as a read of all 16
+	 * DDB subaddresses. This is most likely the reason why the race
+	 * condition is usually only observed with packets <= 64 bytes.
+	 *
+	 * An optional delay has been added for such transfers. For performance
+	 * reasons, this may be left out once we have final confirmation
+	 * whether the actual spacecraft link will use asynchronous messaging
+	 * the same way the platform simulator does.
+	 *
+	 * milFrameDelay is an external global and its information is defined 
+	 * in the data pool. The global is constantly updated by the cyclical 
+	 * task. 
+	 */
+
+	case AS250_SA_RX_DTD:
+		if (as250_handle_dtd_irq(brm) < 0)
+			brm_handle_error(brm, LOW);
+
+		break;
+
+	case AS250_SA_RX_TIME:
+		/* CIS-SW-ICD-037 */
+		flags  = ioread16be(&brm->rt_mem->sa_rx[AS250_SA_RX_TIME].CW)
+			 & BRM_RT_CW_FLAGS_BRD;
+
+		if (!flags)
+			as250_handle_time_message_irq(brm);
+
+		break;
+
+	case AS250_SA_RX_DWRAP:
+		as250_handle_wrap_irq(brm);
+		break;
+
+	default:
+		break;
+	}
+}
+
+
+/**
+ * @brief TX subaddress IRQ handler for AS250 & ping-pong mode
+ * @param brm a struct brm_config
+ * @param descriptor a subaddress/mode code descriptor
+ */
+
+static void as250_handle_tx_irq(__attribute__((unused)) struct brm_config *brm,
+				uint32_t descriptor)
+{
+	switch (BRM_CALC_SA_TX_DESC(descriptor)) {
+
+	case AS250_SA_TX_ATR:
+		break;
+
+	default:
+		break;
+	}
+}
+
+/**
+ * @brief mode-code RX subaddress IRQ handler for AS250 & ping-pong mode#
+ * @param brm a struct brm_config
+ * @param descriptor a subaddress/mode code descriptor
+ */
+
+static void as250_handle_mc_rx_irq(struct brm_config *brm, uint32_t descriptor)
+{
+	uint16_t frame_num;
+
+	switch (BRM_CALC_MC_RX_DESC(descriptor)) {
+
+	case AS250_MC_RESET_RT:
+		if (brm->rt_reset)
+			brm->rt_reset(brm->rt_reset_userdata);
+
+		break;
+
+	case AS250_MC_SYNC_W_DWORD:
+		frame_num = brm->brm_mem[brm_get_offset_pp_mc_rx_prev(brm,
+						 AS250_MC_SYNC_W_DWORD)];
+		if (brm->rt_sync_with_dword)
+			brm->rt_sync_with_dword(frame_num,
+					brm->rt_sync_with_dword_userdata);
+	/* The driver is too fast for the hardware, at least on the GR712RC
+	 * development board. We would overwrite the ADB SA buffers
+	 * before the hardware reads it, because the the ATR SA irq is tripped
+	 * and its handler executed before the 1553 core can ping-pong even
+	 * the first buffer.
+	 * Usually, we would act after the core accesses the last ADB SA, but
+	 * since the PS polls the ADB SAs only on condition a ATR has been set
+	 * (which the real OBC probably won't do), we can't do that and the
+	 * sync-with-dataword modecode is the only other option.
+	 * Note: this occurs only with high transfer rates, i.e. when setting an
+	 * ATR every minor frame
+	 */
+
+		if (as250_handle_atr_irq(brm) < 0)
+			brm_handle_error(brm, LOW);
+
+		break;
+
+	default:
+		break;
+	}
+}
+
+
+/**
+ * @brief subaddress IRQ handler for ping-pong mode
+ * @param brm a struct brm_config
+ * @param descriptor a subaddress/mode code descriptor
+ * @retval -1 : error
+ * @retval  0 : success
+ * @note uses GNU extension: range expression in switch-statement
+ */
+
+extern unsigned int milFrameDelay;
+
+__extension__
+static int32_t brm_irq_subad_pp(struct brm_config *brm, uint32_t descriptor)
+{
+	uint16_t cw;
+	struct brm_descriptor_table *brm_descriptor;
+
+
+	brm_descriptor = &brm->rt_mem->descriptors[descriptor];
+
+	cw = ioread16be(&brm_descriptor->CW);
+
+	if (!(cw & BRM_RT_CW_FLAGS_BAC)) {
+		errno = E_BRM_CW_BAC_FLAG;
+		return -1;
+	}
+
+	/* see as250_handle_rx_irq() */
+	/* 4000 amounts to about 160 µs */
+	/* yes, this must be volatile */
+	{
+	  volatile uint32_t i = 0;
+	  volatile uint32_t EXTRA_DELAY_BEFORE_PP_DISABLE;
+
+	  EXTRA_DELAY_BEFORE_PP_DISABLE = milFrameDelay;
+
+	  while (i++ < EXTRA_DELAY_BEFORE_PP_DISABLE)
+	    __asm__ __volatile__("nop");
+	}
+
+
+	brm_disable_pp(brm);
+
+#if (__sparc__) /* see as250_reset_protocol() for rationale */
+	if (brm_pp_enabled(brm)) {
+		errno = EFAULT;
+		return -1;
+	}
+#endif
+
+	/*  see Core1553BRM v4.0 Handbook, pp.55 for magic numbers */
+	switch (descriptor) {
+	case  1 ...  32:
+		as250_handle_rx_irq(brm, descriptor);
+		break;
+	case 33 ...  64:
+		as250_handle_tx_irq(brm, descriptor);
+		break;
+	case 65 ...  96:
+		as250_handle_mc_rx_irq(brm, descriptor);
+		break;
+	case 97 ... 128:
+		/* unused (?) */
+		/* as250_handle_mc_tx_irq(brm); */
+		break;
+	default:
+		break;
+	}
+
+	cw &= ~BRM_RT_CW_FLAGS_BAC;
+
+	iowrite16be(cw, &brm_descriptor->CW);
+
+	brm_enable_pp(brm);
+
+#if (__sparc__) /* see above */
+	if (!brm_pp_enabled(brm)) {
+		errno = EFAULT;
+		return -1;
+	}
+#endif
+
+	return 0;
+}
+
+
+/**
+ * @brief checks and handles error flags set in a irq log entry
+ * @param brm a struct brm_config
+ * @param BRM_IRQ error flags to check
+ */
+
+__attribute__((noinline))
+static void brm_handle_log_error(struct brm_config *brm, uint16_t BRM_IRQ)
+{
+	if (BRM_IRQ & BRM_IRQ_RT_ILLCMD) {
+		errno = E_BRM_IRQ_RT_ILLCMD;
+		brm_handle_error(brm, MEDIUM);
+	}
+
+	if (BRM_IRQ & BRM_IRQ_ILLOP) {
+		errno = E_BRM_IRQ_ILLOP;
+		brm_handle_error(brm, MEDIUM);
+	}
+
+	if (BRM_IRQ & BRM_IRQ_MERR) {
+		errno = E_BRM_IRQ_MERR;
+		brm_handle_error(brm, MEDIUM);
+	}
+}
+
+
+/**
+ * @brief checks and handles error flags set in the hw irq register
+ * @param brm a struct brm_config
+ * @param BRM_IRQ error flags to check
+ */
+
+__attribute__((noinline))
+static void brm_handle_irq_error(struct brm_config *brm, uint16_t BRM_IRQ)
+{
+	if (BRM_IRQ & BRM_IRQ_DMAF) {
+		errno = E_BRM_IRQ_DMAF;
+		brm_handle_error(brm, HIGH);
+	}
+
+	if (BRM_IRQ & BRM_IRQ_WRAPF) {
+		errno = E_BRM_IRQ_WRAPF;
+		brm_handle_error(brm, HIGH);
+	}
+
+	if (BRM_IRQ & BRM_IRQ_TAPF) {
+		errno = E_BRM_IRQ_TAPF;
+		brm_handle_error(brm, HIGH);
+	}
+
+	if (BRM_IRQ & BRM_IRQ_BITF) {
+		errno = E_BRM_IRQ_BITF;
+		brm_handle_error(brm, HIGH);
+	}
+
+	if (BRM_IRQ & BRM_IRQ_MERR) {
+		errno = E_BRM_IRQ_MERR;
+		brm_handle_error(brm, HIGH);
+	}
+
+	if (BRM_IRQ & BRM_IRQ_IXEQ0) {
+		errno = E_BRM_IRQ_IXEQ0;
+		brm_handle_error(brm, HIGH);
+	}
+
+	if (BRM_IRQ & BRM_IRQ_RT_ILLCMD) {
+		errno = E_BRM_IRQ_RT_ILLCMD;
+		brm_handle_error(brm, HIGH);
+	}
+
+	if (BRM_IRQ & BRM_IRQ_ILLOP) {
+		errno = E_BRM_IRQ_ILLOP;
+		brm_handle_error(brm, HIGH);
+	}
+}
+
+
+/**
+ * @brief the main IRQ handler
+ * @param userdata a pointer to arbitrary data
+ * @retval 0 : always
+ */
+
+__attribute__((unused))
+static int32_t brm_irq_handler(void *userdata)
+{
+	uint16_t BRM_IRQ;
+
+	uint32_t descriptor;
+	uint32_t flags;
+
+	int32_t ret;
+
+	static uint32_t pos;
+
+	struct brm_config *brm;
+	struct brm_irq_log_entry *log;
+
+
+	brm = (struct brm_config *) userdata;
+	log = brm->rt_mem->irq_log;
+
+	while ((BRM_IRQ = ioread16be(&log[pos].IIW))
+			!= BRM_IIW_PATTERN_INVALID) {
+
+		iowrite16be(BRM_IIW_PATTERN_INVALID, &log[pos].IIW);
+
+		flags = BRM_IRQ_MERR | BRM_IRQ_RT_ILLCMD | BRM_IRQ_ILLOP;
+
+		if (BRM_IRQ & flags)
+			brm_handle_log_error(brm, BRM_IRQ);
+
+		if (BRM_IRQ & BRM_IRQ_SUBAD) {
+			/* offset to address */
+			descriptor = ioread16be(&log[pos].IAW) >> 2;
+
+			ret = brm_irq_subad_pp(brm, descriptor);
+			if (ret < 0)
+				brm_handle_error(brm, MEDIUM);
+
+		}
+
+		BRM_LOGLIST_INCREMENT_READPOS(pos, BRM_IRQ_LOG_ENTRY_PAGES);
+	}
+
+
+	/*  handle hardware IRQs (processing cannot be deferred,
+	 *  they are not logged)
+	 */
+
+	BRM_IRQ = ioread16be(&brm->regs->ipend);
+
+	flags = BRM_IRQ_DMAF | BRM_IRQ_WRAPF | BRM_IRQ_TAPF | BRM_IRQ_BITF
+		| BRM_IRQ_MERR | BRM_IRQ_IXEQ0 | BRM_IRQ_RT_ILLCMD;
+
+	/* this will be called often, so do one quick check and detailed
+	 * ones only if needed
+	 */
+
+	if (BRM_IRQ & flags)
+		brm_handle_irq_error(brm, BRM_IRQ);
+
+	return 0;
+}
+
+
+/**
+ * @brief sets the function to call when a time message arrives
+ * @param brm a struct brm_config
+ * @param callback a callback function
+ * @param userdata a pointer to arbitrary data supplied to the callback function
+ * @retval  0 : success
+ * @retval -1 : error
+ */
+
+int32_t as250_set_time_callback(struct brm_config *brm,
+				void (*callback)(uint32_t coarse_time,
+						 uint32_t fine_time,
+						 void *userdata),
+				void *userdata)
+{
+	if (!callback) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	brm->set_time = callback;
+	brm->set_time_userdata = userdata;
+
+	return 0;
+}
+
+/**
+ * @brief sets the function to call when a Reset RT mode code arrives
+ * @param brm a struct brm_config
+ * @param callback a callback function
+ * @param userdata a pointer to arbitrary data supplied to the callback function
+ * @retval  0 : success
+ * @retval -1 : error
+ */
+
+int32_t as250_set_rt_reset_callback(struct brm_config *brm,
+				    void (*callback)(void *userdata),
+				    void *userdata)
+{
+	if (!callback) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	brm->rt_reset = callback;
+	brm->rt_reset_userdata = userdata;
+
+	return 0;
+}
+
+/**
+ * @brief sets the function to call when a Sync With Dataword mode code arrives
+ * @param brm a struct brm_config
+ * @param callback a callback function
+ * @param userdata a pointer to arbitrary data supplied to the callback function
+ * @retval  0 : success
+ * @retval -1 : error
+ */
+
+int32_t as250_set_sync_with_dword_callback(struct brm_config *brm,
+					   void (*callback)(uint16_t frame_num,
+							    void *userdata),
+					   void *userdata)
+{
+	if (callback == NULL) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	brm->rt_sync_with_dword = callback;
+	brm->rt_sync_with_dword_userdata = userdata;
+
+	return 0;
+
+}
+
+
+/**
+ * @brief sets up the ping pong buffers addresses and interrupt flags as
+ *	  needed for AS250
+ * @param brm a struct brm_config
+ */
+
+static void brm_rt_configure_pp_buffers(struct brm_config *brm)
+{
+	uint32_t i, j;
+	uint16_t flags;
+
+	struct brm_message_circular_buffer *msg_buf[4];
+	struct brm_descriptor_table        *desc[4];
+
+
+	msg_buf[0] = brm->rt_mem->sa_msgs_rx;
+	msg_buf[1] = brm->rt_mem->sa_msgs_tx;
+	msg_buf[2] = brm->rt_mem->mc_msgs_rx;
+	msg_buf[3] = brm->rt_mem->mc_msgs_tx;
+
+	desc[0] = brm->rt_mem->sa_rx;
+	desc[1] = brm->rt_mem->sa_tx;
+	desc[2] = brm->rt_mem->mc_rx;
+	desc[3] = brm->rt_mem->mc_tx;
+
+
+	for (i = 0; i < 4; i++) {
+		for (j = 0; j < BRM_NUM_SUBADDR; j++) {
+			desc[i][j].buf_A = BASE_ADDR(msg_buf[i][j].page[0]);
+
+			desc[i][j].buf_B = BASE_ADDR(msg_buf[i][j].page[1]);
+
+			desc[i][j].bcast = BASE_ADDR(msg_buf[i][j].page[0]);
+		}
+	}
+
+	flags = BRM_RT_CW_FLAGS_IWA | BRM_RT_CW_FLAGS_AB;
+
+	iowrite16be(flags, &brm->rt_mem->sa_rx[AS250_SA_RX_DTD].CW);
+	iowrite16be(flags, &brm->rt_mem->sa_rx[AS250_SA_RX_TIME].CW);
+	iowrite16be(flags, &brm->rt_mem->sa_rx[AS250_SA_RX_TERMCFG].CW);
+	iowrite16be(flags, &brm->rt_mem->sa_rx[AS250_SA_RX_DWRAP].CW);
+
+	iowrite16be(flags, &brm->rt_mem->mc_rx[AS250_MC_SYNC_W_DWORD].CW);
+
+	flags = BRM_RT_CW_FLAGS_AB;
+
+	iowrite16be(flags, &brm->rt_mem->sa_tx[AS250_SA_TX_HLTHMON].CW);
+
+	flags = BRM_RT_CW_FLAGS_IWA | BRM_RT_CW_FLAGS_IBRD | BRM_RT_CW_FLAGS_AB;
+	iowrite16be(flags, &brm->rt_mem->mc_rx[AS250_MC_RESET_RT].CW);
+
+
+	flags  = BRM_CCR_BAEN | BRM_CCR_BBEN | BRM_CCR_BCEN
+		 | BRM_CCR_INEN | BRM_CCR_PPEN;
+
+	iowrite32be(flags, &brm->regs->ctrl);
+}
+
+
+/**
+ * @brief sets desynchronized flag in rt_health
+ * @param brm a struct brm_config
+ * @note to be called by external timing management
+ */
+
+void as250_desynchronized(struct brm_config *brm)
+{
+	as250_rt_health_set_bits(brm, AS250_RT_NOT_SYNCHRIONIZED);
+}
+
+
+/**
+ * @brief unsets desynchronized flag in rt_health
+ * @param brm a struct brm_config
+ * @note to be called by external timing management
+ */
+
+void as250_synchronized(struct brm_config *brm)
+{
+	as250_rt_health_unset_bits(brm, AS250_RT_NOT_SYNCHRIONIZED);
+}
+
+
+/**
+ * @brief configures the remote terminal address and parity bit
+ * @param brm a struct brm_config
+ * @param rt_address the remote terminal address to set
+ */
+
+static void brm_rt_config_addr(struct brm_config *brm, uint8_t rt_address)
+{
+	uint32_t flags;
+
+	flags = BRM_CCR_RTA(rt_address)
+	      | (rt_parity_bit(rt_address) << BRM_CCR_RTPTY_REG)
+	      | BRM_OSR_MSEL_RT;
+
+	iowrite32be(flags, &brm->regs->oper);
+}
+
+
+/**
+ * @brief configures the remote terminal's irq mask
+ * @param brm a struct brm_config
+ */
+
+static void brm_rt_config_irqmask(struct brm_config *brm)
+{
+	uint32_t flags;
+
+	flags = BRM_IRQ_RT_ILLCMD | BRM_IRQ_SUBAD | BRM_IRQ_TAPF
+		| BRM_IRQ_DMAF | BRM_IRQ_WRAPF | BRM_IRQ_MERR;
+
+	iowrite32be(flags, &brm->regs->imask);
+}
+
+
+/**
+ * @brief configures descriptor/command block pointer
+ * @param brm a struct brm_config
+ */
+
+static void brm_setup_desc_pointer(struct brm_config *brm)
+{
+	/* point to base of memory area */
+	iowrite32be(0x0, &brm->regs->dpoint);
+}
+
+
+/**
+ * @brief configures irq log list pointer
+ * @param brm a struct brm_config
+ */
+
+static void brm_setup_irq_pointer(struct brm_config *brm)
+{
+	uint32_t addr;
+
+	/* see p78 Core1553BRM Manual */
+	addr = BASE_ADDR(brm->rt_mem->irq_log[0]);
+
+	iowrite32be(addr, &brm->regs->ipoint);
+}
+
+
+/**
+ * @brief informs 1553 core about configured core frequency
+ * @param brm a struct brm_config
+ * @param core_freq the core frequency to set
+ * @retval -1 : error
+ * @retval  0 : success
+ */
+
+static uint32_t brm_setup_core_freq(struct brm_config *brm, uint32_t core_freq)
+{
+	switch (core_freq) {
+	case BRM_FREQ_12MHZ:
+	case BRM_FREQ_16MHZ:
+	case BRM_FREQ_20MHZ:
+	case BRM_FREQ_24MHZ:
+		break;	/* all legal */
+	default:
+		errno = E_BRM_INVALID_COREFREQ;
+		return 1;
+	}
+
+	iowrite32be(core_freq, &brm->regs->enhanced);
+
+	return 0;
+}
+
+
+/**
+ * @brief sets up hardware and message irq acknowledge
+ * @param brm a struct brm_config
+ * @note see GR712UM, p.162
+ */
+
+static void gr712_setup_1553_intack(struct brm_config *brm)
+{
+	uint32_t flags;
+
+	flags = IRQ_ACK_MSG | IRQ_ACK_HW;
+
+	iowrite32be(flags, &brm->regs->w_irqctrl);
+}
+
+
+/**
+ * @brief sets up AHB page address register (i.e. 1553 base memory area)
+ * @param brm a struct brm_config
+ * @note see GR712UM, p.162
+ */
+
+static void gr712_setup_1553_ahbaddr(struct brm_config *brm)
+{
+	uint32_t addr;
+
+	addr = (uint32_t) brm->brm_mem;
+
+	iowrite32be(addr, &brm->regs->w_ahbaddr);
+}
+
+/**
+ * @brief pulls up sub-system flag bit (toggles bit in 1553 core low),
+ * @param brm a struct brm_config
+ * @note see GR172UM, p.162
+ */
+
+static void gr712_set_ssysfn(struct brm_config *brm)
+{
+	uint32_t flags;
+
+	flags  = ioread32be(&brm->regs->w_ctrl);
+	flags |= 0x1;
+
+	iowrite32be(flags, &brm->regs->w_ctrl);
+}
+
+#if (__sparc__)
+/**
+ * @brief configures core frequency on GR712RC eval board
+ * @param brm a struct brm_config
+ */
+
+void gr712_set_core_freq(void)
+{
+	/* WONTFIX: magic numbers */
+	uint32_t *gpreg = (uint32_t *) 0x80000600;
+	uint32_t reg;
+
+	/* set core frequency to 20 MHz */
+	reg = ioread32be(gpreg) | (((2 << 16) | (0 << 14)) & (~(0 << 18)));
+
+	iowrite32be(reg, gpreg);
+}
+#endif
+
+
+/**
+ * @brief illegalize all RT commands
+ *
+ * @param brm a struct brm_config
+ */
+
+static void brm_rt_illegalize_all(struct brm_config *brm)
+{
+	uint32_t i;
+	uint32_t flags;
+
+
+	for (i = 0; i < ARRAY_SIZE(brm->regs->rt_cmd_leg); i++) {
+		BRM_LEG_CMD_ILLEGALIZE_ALL(flags);
+		iowrite32be(flags, &brm->regs->rt_cmd_leg[i]);
+	}
+}
+
+
+/**
+ * @brief legalize a RT command
+ *
+ * @param brm a struct brm_config
+ * @param reg the command register offset
+ * @param cmd the command to legalize
+ */
+
+static void brm_rt_legalize_cmd(struct brm_config *brm,
+				uint32_t reg, uint32_t cmd)
+{
+	uint32_t flags;
+
+	flags =	ioread32be(&brm->regs->rt_cmd_leg[reg]);
+	BRM_LEG_CMD_LEGALIZE(flags, cmd);
+	iowrite32be(flags, &brm->regs->rt_cmd_leg[reg]);
+}
+
+
+/**
+ * @brief legalize a rx subaddress
+ *
+ * @param brm a struct brm_config
+ * @param sa the subaddress to legalize
+ */
+
+static void brm_rt_legalize_sa_rx(struct brm_config *brm, uint32_t sa)
+{
+	uint32_t reg = BRM_LEG_CMD_SA_RX__0_15;
+
+	if (sa >= BMR_LEG_CMDS_PER_REGISTER) {
+		reg = BRM_LEG_CMD_SA_RX_16_31;
+		sa -= BMR_LEG_CMDS_PER_REGISTER;
+	}
+
+	brm_rt_legalize_cmd(brm, reg, sa);
+}
+
+
+/**
+ * @brief legalize a tx subaddress
+ *
+ * @param brm a struct brm_config
+ * @param sa the subaddress to legalize
+ */
+
+static void brm_rt_legalize_sa_tx(struct brm_config *brm, uint32_t sa)
+{
+	uint32_t reg = BRM_LEG_CMD_SA_TX__0_15;
+
+	if (sa >= BMR_LEG_CMDS_PER_REGISTER) {
+		reg = BRM_LEG_CMD_SA_TX_16_31;
+		sa -= BMR_LEG_CMDS_PER_REGISTER;
+	}
+
+	brm_rt_legalize_cmd(brm, reg, sa);
+}
+
+
+/**
+ * @brief legalize a broadcast rx subaddress
+ *
+ * @param brm a struct brm_config
+ * @param sa the subaddress to legalize
+ */
+
+static void brm_rt_legalize_sa_bc_rx(struct brm_config *brm, uint32_t sa)
+{
+	uint32_t reg = BRM_LEG_CMD_SA_BC_RX__0_15;
+
+	if (sa >= BMR_LEG_CMDS_PER_REGISTER) {
+		reg = BRM_LEG_CMD_SA_BC_RX_16_31;
+		sa -= BMR_LEG_CMDS_PER_REGISTER;
+	}
+
+	brm_rt_legalize_cmd(brm, reg, sa);
+}
+
+
+/**
+ * @brief legalize a broadcast tx subaddress
+ *
+ * @param brm a struct brm_config
+ * @param sa the subaddress to legalize
+ */
+
+__attribute__((unused))
+static void brm_rt_legalize_sa_bc_tx(struct brm_config *brm, uint32_t sa)
+{
+	uint32_t reg = BRM_LEG_CMD_SA_BC_TX__0_15;
+
+	if (sa >= BMR_LEG_CMDS_PER_REGISTER) {
+		reg = BRM_LEG_CMD_SA_BC_TX_16_31;
+		sa -= BMR_LEG_CMDS_PER_REGISTER;
+	}
+
+	brm_rt_legalize_cmd(brm, reg, sa);
+}
+
+
+/**
+ * @brief legalize a rx mode code
+ *
+ * @param brm a struct brm_config
+ * @param mc the mode code to legalize
+ */
+
+static void brm_rt_legalize_mc_rx(struct brm_config *brm, uint32_t mc)
+{
+	uint32_t reg = BRM_LEG_CMD_MC_RX__0_15;
+
+	if (mc >= BMR_LEG_CMDS_PER_REGISTER) {
+		reg = BRM_LEG_CMD_MC_RX_16_31;
+		mc -= BMR_LEG_CMDS_PER_REGISTER;
+	}
+
+	brm_rt_legalize_cmd(brm, reg, mc);
+}
+
+
+/**
+ * @brief legalize a tx mode code
+ *
+ * @param brm a struct brm_config
+ * @param mc the mode code to legalize
+ */
+
+__attribute__((unused))
+static void brm_rt_legalize_mc_tx(struct brm_config *brm, uint32_t mc)
+{
+	uint32_t reg = BRM_LEG_CMD_MC_TX__0_15;
+
+	if (mc >= BMR_LEG_CMDS_PER_REGISTER) {
+		reg = BRM_LEG_CMD_MC_TX_16_31;
+		mc -= BMR_LEG_CMDS_PER_REGISTER;
+	}
+
+	brm_rt_legalize_cmd(brm, reg, mc);
+}
+
+
+/**
+ * @brief legalize a broadcast rx mode code
+ *
+ * @param brm a struct brm_config
+ * @param mc the mode code to legalize
+ */
+
+static void brm_rt_legalize_bc_mc_rx(struct brm_config *brm, uint32_t mc)
+{
+	uint32_t reg = BRM_LEG_CMD_MC_BC_RX__0_15;
+
+	if (mc >= BMR_LEG_CMDS_PER_REGISTER) {
+		reg = BRM_LEG_CMD_MC_BC_RX_16_31;
+		mc -= BMR_LEG_CMDS_PER_REGISTER;
+	}
+
+	brm_rt_legalize_cmd(brm, reg, mc);
+}
+
+
+/**
+ * @brief legalize a broadcast tx mode code
+ *
+ * @param brm a struct brm_config
+ * @param mc the mode code to legalize
+ */
+
+__attribute__((unused))
+static void brm_rt_legalize_bc_mc_tx(struct brm_config *brm, uint32_t mc)
+{
+	uint32_t reg = BRM_LEG_CMD_MC_BC_TX__0_15;
+
+	if (mc >= BMR_LEG_CMDS_PER_REGISTER) {
+		reg = BRM_LEG_CMD_MC_BC_TX_16_31;
+		mc -= BMR_LEG_CMDS_PER_REGISTER;
+	}
+
+	brm_rt_legalize_cmd(brm, reg, mc);
+}
+
+
+/**
+ * @brief sets up legal RT commands
+ * @param brm a struct brm_config
+ * @note see Core1553BRM v4.0 Handbook, pp.83
+ *
+ * @note uses GNU extension: binary constants
+ */
+
+__extension__
+static void brm_rt_legalize_as250_commands(struct brm_config *brm)
+{
+	brm_rt_illegalize_all(brm);
+
+	/* subaddresses according to table 6.7-1 in DIV.SP.00030.T.ASTR */
+
+	brm_rt_legalize_sa_rx(brm, AS250_SA_RX_TERMCFG);
+	brm_rt_legalize_sa_rx(brm, AS250_SA_RX_DDB_01);
+	brm_rt_legalize_sa_rx(brm, AS250_SA_RX_DDB_02);
+	brm_rt_legalize_sa_rx(brm, AS250_SA_RX_DDB_03);
+	brm_rt_legalize_sa_rx(brm, AS250_SA_RX_DDB_04);
+	brm_rt_legalize_sa_rx(brm, AS250_SA_RX_DDB_05);
+	brm_rt_legalize_sa_rx(brm, AS250_SA_RX_DDB_06);
+	brm_rt_legalize_sa_rx(brm, AS250_SA_RX_DDB_07);
+	brm_rt_legalize_sa_rx(brm, AS250_SA_RX_DDB_08);
+	brm_rt_legalize_sa_rx(brm, AS250_SA_RX_DDB_09);
+	brm_rt_legalize_sa_rx(brm, AS250_SA_RX_DDB_10);
+	brm_rt_legalize_sa_rx(brm, AS250_SA_RX_DDB_11);
+	brm_rt_legalize_sa_rx(brm, AS250_SA_RX_DDB_12);
+	brm_rt_legalize_sa_rx(brm, AS250_SA_RX_DDB_13);
+	brm_rt_legalize_sa_rx(brm, AS250_SA_RX_DDB_14);
+	brm_rt_legalize_sa_rx(brm, AS250_SA_RX_DDB_15);
+	brm_rt_legalize_sa_rx(brm, AS250_SA_RX_DDB_16);
+	brm_rt_legalize_sa_rx(brm, AS250_SA_RX_DTD);
+	brm_rt_legalize_sa_rx(brm, AS250_SA_RX_TIME);
+	brm_rt_legalize_sa_rx(brm, AS250_SA_RX_DWRAP);
+
+	brm_rt_legalize_sa_tx(brm, AS250_SA_TX_HLTHMON);
+	brm_rt_legalize_sa_tx(brm, AS250_SA_TX_ADB_01);
+	brm_rt_legalize_sa_tx(brm, AS250_SA_TX_ADB_02);
+	brm_rt_legalize_sa_tx(brm, AS250_SA_TX_ADB_03);
+	brm_rt_legalize_sa_tx(brm, AS250_SA_TX_ADB_04);
+	brm_rt_legalize_sa_tx(brm, AS250_SA_TX_ADB_05);
+	brm_rt_legalize_sa_tx(brm, AS250_SA_TX_ADB_06);
+	brm_rt_legalize_sa_tx(brm, AS250_SA_TX_ADB_07);
+	brm_rt_legalize_sa_tx(brm, AS250_SA_TX_ADB_08);
+	brm_rt_legalize_sa_tx(brm, AS250_SA_TX_ADB_09);
+	brm_rt_legalize_sa_tx(brm, AS250_SA_TX_ADB_10);
+	brm_rt_legalize_sa_tx(brm, AS250_SA_TX_ADB_11);
+	brm_rt_legalize_sa_tx(brm, AS250_SA_TX_ADB_12);
+	brm_rt_legalize_sa_tx(brm, AS250_SA_TX_ADB_13);
+	brm_rt_legalize_sa_tx(brm, AS250_SA_TX_ADB_14);
+	brm_rt_legalize_sa_tx(brm, AS250_SA_TX_ADB_15);
+	brm_rt_legalize_sa_tx(brm, AS250_SA_TX_ADB_16);
+	brm_rt_legalize_sa_tx(brm, AS250_SA_TX_DTC);
+	brm_rt_legalize_sa_tx(brm, AS250_SA_TX_ATR);
+	brm_rt_legalize_sa_tx(brm, AS250_SA_TX_DWRAP);
+
+	brm_rt_legalize_sa_bc_rx(brm, AS250_SA_RX_TIME);
+
+	/* mandatory mode codes according to table 6.3-1 in
+	 * DIV.SP.00030.T.ASTR
+	 */
+
+
+	brm_rt_legalize_mc_rx(brm, BRM_MC_TRANSMIT_STATUS_WORD);
+	brm_rt_legalize_mc_rx(brm, BRM_MC_TRANSMITTER_SHUTDOWN);
+	brm_rt_legalize_mc_rx(brm, BRM_MC_OVERRIDE_TRANSMITTER_SHUTDOWN);
+	brm_rt_legalize_mc_rx(brm, BRM_MC_RESET_REMOTE_TERMINAL);
+
+	/* UVIE bus controller emulation has a broadcast address issue, this may
+	 * be driver related
+	 */
+	brm_rt_legalize_mc_rx(brm, BRM_MC_SYNCHRONIZE_WITH_DATA_WORD);
+
+	/* sync with dataword marks the start of a frame, see CIS-SW-ICD-032
+	 * in CHEOPS-ECE-CSW-ICD-049
+	 */
+	brm_rt_legalize_bc_mc_rx(brm, BRM_MC_SYNCHRONIZE_WITH_DATA_WORD);
+}
+
+
+/**
+ * @brief clears RT irq log
+ * @param brm a struct brm_config
+ */
+
+static void brm_rt_clear_irq_log(struct brm_config *brm)
+{
+	size_t i;
+
+	for (i = 0; i < ARRAY_SIZE(brm->rt_mem->irq_log); i++) {
+		iowrite16be(BRM_IIW_PATTERN_INVALID,
+			    &brm->rt_mem->irq_log[i].IIW);
+		iowrite16be(0x0, &brm->rt_mem->irq_log[i].IAW);
+	}
+}
+
+
+/**
+ * @brief configures the desired RT operating mode
+ * @param brm a struct brm_config
+ * @retval 1 : error
+ * @retval 0 : success
+ * @note  only ping-pong is enabled in this version of the driver
+ */
+
+static uint32_t brm_rt_configure_mode(struct brm_config *brm)
+{
+
+	switch (brm->mode) {
+	case PING_PONG:
+		brm_rt_configure_pp_buffers(brm);
+		break;
+	default:
+		errno = EINVAL;
+		return 1;
+	}
+
+	return 0;
+}
+
+
+/**
+ * @brief soft-resets remote terminal
+ * @param brm a struct brm_config
+ */
+
+static void brm_rt_softreset(struct brm_config *brm)
+{
+	uint32_t flags;
+
+	flags  = ioread32be(&brm->regs->ctrl);
+	flags |= BRM_CCR_SRST;
+
+	iowrite32be(flags, &brm->regs->ctrl);
+}
+
+/**
+ * @brief starts remote terminal execution
+ * @param brm a struct brm_config
+ */
+
+static void brm_rt_start(struct brm_config *brm)
+{
+	uint32_t flags;
+
+	flags  = ioread32be(&brm->regs->ctrl);
+	flags |= BRM_CCR_STEX;
+
+	iowrite32be(flags, &brm->regs->ctrl);
+}
+
+
+/**
+ * @brief points rt memory to allocated brm memory block
+ * @param brm a struct brm_config
+ */
+
+static void brm_rt_set_mem(struct brm_config *brm)
+{
+	brm->rt_mem = (void *) brm->brm_mem;
+}
+
+
+/**
+ * @brief intialises remote terminal
+ * @param brm a struct brm_config
+ * @param rt_address the address of the remote terminal
+ * @param core_freq the core frequency to set
+ * @retval 1 : error
+ * @retval 0 : success
+ */
+
+uint32_t brm_rt_init(struct brm_config *brm,
+		     uint8_t rt_address, uint32_t core_freq)
+{
+	__attribute__((unused))
+	uint32_t ret;
+
+
+	if (brm->buf.adb_ddb == NULL) {
+		errno = EINVAL;
+		return 1;
+	}
+
+	if (brm->buf.atr_cpus == NULL) {
+		errno = EINVAL;
+		return 1;
+	}
+
+	brm_rt_set_mem(brm);
+
+	as250_rt_health_set(brm, 0x0);
+
+	brm_rt_softreset(brm);
+
+	gr712_set_ssysfn(brm);
+
+	brm_rt_config_addr(brm, rt_address);
+
+	brm_rt_config_irqmask(brm);
+
+	brm_setup_desc_pointer(brm);
+
+	brm_setup_irq_pointer(brm);
+
+	if (brm_setup_core_freq(brm, core_freq))
+		return 1; /* errno set in call */
+
+	gr712_setup_1553_intack(brm);
+
+	gr712_setup_1553_ahbaddr(brm);
+
+	brm_rt_legalize_as250_commands(brm);
+
+	brm_rt_clear_irq_log(brm);
+
+	if (brm_rt_configure_mode(brm))
+		return 1; /* errno set in call */
+
+
+	brm_rt_start(brm);
+
+	as250_rt_health_set_bits(brm, AS250_INITIALIZATION_COMPLETE);
+
+	/**
+	 * CIS-SW-ICD-034
+	 * issue a protocol reset immediately at startup
+	 */
+
+	ret = as250_reset_protocol(brm);
+#if (__sparc__) /* return value of failed brm_pp_enabled, cannot be tested
+		 * see as250_reset_protocol() for rationale
+		 */
+	if (ret)
+		return ret;
+#endif
+
+	return 0;
+}
+
+
+/**
+ * @brief set the 1kib working buffer
+ * @param brm a struct brm_config
+ * @param p_buf the buffer to assign
+ * @retval -1 : error
+ * @retval  0 : success
+ */
+
+int32_t brm_set_adb_ddb_buffer(struct brm_config *brm, uint8_t *p_buf)
+{
+	if (p_buf != NULL) {
+		brm->buf.adb_ddb = p_buf;
+	} else {
+		errno = EINVAL;
+		return -1;
+	}
+
+	return 0;
+}
+
+/**
+ * @brief set the packet tracker for OBC packets
+ * @param brm a struct brm_config
+ * @param packet_tracker a struct packet_tracker
+ * @retval -1 : error
+ * @retval  0 : success
+ */
+
+int32_t brm_set_packet_tracker_obc(struct brm_config *brm,
+				   struct packet_tracker *pkt_obc)
+{
+	if (pkt_obc != NULL) {
+		brm->buf.pkt_obc = pkt_obc;
+	} else {
+		errno = EINVAL;
+		return -1;
+	}
+
+	return 0;
+}
+
+/**
+ * @brief sets the packet tracker for GND packets
+ * @param brm a struct brm_config
+ * @param packet_tracker a struct packet_tracker
+ * @retval -1 : error
+ * @retval  0 : success
+ */
+
+int32_t brm_set_packet_tracker_gnd(struct brm_config *brm,
+				   struct packet_tracker *pkt_gnd)
+{
+	if (pkt_gnd != NULL) {
+		brm->buf.pkt_gnd = pkt_gnd;
+	} else {
+		errno = EINVAL;
+		return -1;
+	}
+
+	return 0;
+}
+
+/**
+ * @brief sets the sliding window circular PUS packet buffer
+ * @param brm a struct brm_config
+ * @param p_cpus a strct cpus_buffers
+ * @retval -1 : error
+ * @retval  0 : success
+ */
+
+int32_t as250_set_atr_cpus_buffers(struct brm_config *brm,
+				   struct cpus_buffers *p_cpus)
+{
+	if (p_cpus != NULL) {
+		brm->buf.atr_cpus = p_cpus;
+	} else {
+		errno = EINVAL;
+		return -1;
+	}
+
+	return 0;
+}
+
+
+
+/**
+ * @brief enables Core1553BRM
+ * @param brm a struct brm_config
+ * @retval -1 : error
+ * @retval  0 : success
+ */
+
+int32_t brm_1553_enable(struct brm_config *brm)
+{
+	struct sysobj *sobj;
+#if (__sparc__)
+	/**
+	 * Basic Moron Protector (BMP)â„¢
+	 * (assume single device, ignore error case)
+	 */
+	static enum  {DISABLED, ENABLED} brm1553;
+
+
+	if (brm1553)
+		return -1;
+
+	brm1553 = ENABLED;
+#endif
+	if (!brm->regs) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	if (!brm->brm_mem) {
+		errno = EINVAL;
+		return -1;
+	}
+
+
+	if (((uint32_t) brm->brm_mem) & BRM_MEM_BLOCK_ALIGN)	{
+		errno = E_BRM_MEM_ADDR_ALIGN;
+		return -1;
+	}
+
+	/* explicitly set them null in case the user forgot
+	 * to zero  brm_config
+	 */
+	brm->set_time           = NULL;
+	brm->rt_reset           = NULL;
+	brm->rt_sync_with_dword = NULL;
+
+
+
+
+	sobj = sysobj_create();
+
+	if (!sobj)
+		return -1;
+
+	sobj->sattr = brm_attributes;
+
+	sysobj_add(sobj, NULL, driver_set, "1553");
+
+
+#if (__sparc__)
+	irq_dispatch_enable();
+
+	irl1_register_callback(GR712_IRL1_B1553BRM, PRIORITY_NOW,
+			       &brm_irq_handler, (void *) brm);
+#endif
+	return 0;
+}
diff --git a/IBSW/lib/cpus_buffer.c b/IBSW/lib/cpus_buffer.c
new file mode 100644
index 0000000..10b3e42
--- /dev/null
+++ b/IBSW/lib/cpus_buffer.c
@@ -0,0 +1,603 @@
+/**
+ * @file   cpus_buffer.c
+ * @ingroup cpus_buffer
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   June, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ *
+ *
+ * @defgroup cpus_buffer Circular Sliding Window Buffer
+ *
+ * @brief a sliding window buffer for AS250 PUS input packets
+ *
+ *
+ * ## Overview
+ *
+ * This module implements functionality to create 1kiB sized frames from
+ * supplied packets for use with the @ref core1553brm_as250 in order to provide
+ * a "bandwidth limiting" function to the application software.
+ *
+ *
+ * ## Mode of Operation
+ *
+ * ### Buffer Model
+ *
+ * The sliding window buffer is implemented using 3 circular buffers:
+ * one to hold the actual packet data (__Packet__, __[P]__), one to hold the
+ * size of the next packet (__Size__, __[S]__) and one to set whether the next
+ * packet is an actual packet or just there for padding a frame to the next
+ * 1024 byte boundary (__Validity__, __[V]__).
+ *
+ * While it may at first glance appear as an issue, the problem of synchronicity
+ * between the buffers becomes trivial if one considers that the [S]
+ * buffer as a meta-buffer of the [P] and [V] buffers, as [S] is only written
+ * after [P] and [V] which in turn are only read after the corresponding
+ * contents of [S] appear to the reader.
+ *
+ *
+ * @startuml "[S] is a metabuffer \"containing\" [P] and [V]" width=5
+ * node "[S]" {
+ *	node "[V]" {
+ *	}
+ *	node "[P]" {
+ *	}
+ * }
+ * @enduml
+ *
+ * For the @ref circular_buffer16 it is established, that a single
+ * producer/consumer use of a circular buffer does not necessitate locks,
+ * it is obvious why there will be no desynchronisation as long as all
+ * components work correctly and in the right order. The critical section is
+ * in the access to buffer [S], in particular the read and write pointers of
+ * the circular buffer, which are however only ever written to by the reader and
+ * writer respectively and conversely only read by the other, which makes it to
+ * be not critical at all.
+ *
+ * @startuml{valid_packet_exchange.svg} "Example: valid packet exchange" width=10
+ *	participant Writer
+ *	database Packet
+ *	database Validity
+ *	database Size
+ *	participant Reader
+ *	control "No Action"
+ *
+ *	Writer -> Packet	: put packet
+ *	activate Packet
+ *
+ *	Reader      <-- Size	: get packet size
+ *	"No Action" <-- Reader	: not ready
+ *
+ *	Packet -> Validity	: put validity
+ *	activate Validity
+ *
+ *	Reader      <-- Size	: get packet size
+ *	"No Action" <-- Reader  : not ready
+ *
+ *	Validity -> Size	: put size
+ *	activate Size
+ *
+ *	Reader   <-- Size	: get packet size
+ *	Reader   -->  Packet	: fetch
+ *	Packet   ->  Validity	: pop packet
+ *	Validity ->  Size	: pop validity
+ *	Size     ->  Reader	: pop size
+ * @enduml
+ *
+ *
+ *
+ * ### ECSS-E-ST-50-13C/AS250 Transfer frame shaping
+ * The communication scheme used with @ref core1553brm_as250 allows at most
+ * 1 kiB of telecommand packet data in each 1553 minor frame. Therefore, if a
+ * packet is added to a buffer, that would make the current fill level exceed
+ * 1024 bytes, the remaining bytes to the 1024 byte boundary are marked and the
+ * packet is placed in the following 1025-2048 byte sized segment, thereby
+ * starting a new transfer frame segment. If a packet exceeds 1024 bytes or
+ * would fill the buffer beyond the 2048 byte limit, it is refused.
+ *
+ * @image html cpus_buffer/sliding_window_buffer.png "Sliding Window Buffer"
+ *
+ *
+ * ### Transfer Frame Size
+ *
+ * The legal transfer frame size is limited to 1 kiB of unsegemented PUS packet
+ * data. The sliding window buffer will fill at most 2 such frames. To query the
+ * remaining capacity of the current reference frame, cpus_get_free() may be
+ * called.
+ *
+ * @image html cpus_buffer/cpus_get_free.png "Remaining Frame Size"
+ *
+ *
+ * ### Buffer Read/Write Sequences in Detail
+ *
+ *
+ *
+ * Below are the sequences how the different buffers are written and read.
+ *
+ *
+ @verbatim
+			push			pop
+
+	valid		[P]->[V]->[S]		[P]->[V]->[S] [1]
+
+	invalid		[P]->[S]->[V]		[S]->[P]->[V]
+ @endverbatim
+ * [1] Note: [S] is read first, but not removed from the buffer until the packet
+ *     is extracted
+ *
+ *
+ * A packet push will hence consist of the following two possible sequences:
+ *
+ *
+ *         push invalid -> write valid
+ *         or
+ *         [P]->[S]->[V] : [P]->[V]->[S]
+ *
+ * and
+ *         write valid
+ *         or
+ *         [P]->[V]->[S]
+ *
+ * which is obviously only a subset of the first sequence.
+ *
+ *
+ * A packet pop will again consist of two possible sequences:
+ *
+ *         pop invalid -> read valid
+ *         or:
+ *         [S]->[P]->[V] : [P]->[V]->[S]
+ *
+ * and
+ *
+ *         read valid
+ *         or:
+ *         [P]->[V]->[S]
+ *
+ * which again is a subset of the first sequence.
+ *
+ *
+ * Since we can ignore the case where the reader is interrupted, we only have to
+ * look at the (longest possible) write sequence:
+ *
+ *
+ *
+ @verbatim
+   W: [S]->[P]->[V]:[P]->[V]->[S]
+   ----------------------------------------
+   R:  |    |    |   |    |    |
+       |    |    |   |    |    -> pop invalid -> (no) -> next valid (yes) -> get size -> read
+       |    |    |   |    |
+       |    |    |   |    ->  pop invalid -> (no) -> next valid -> (yes) -> get size -> (no)
+       |    |    |   |
+       |    |    |   - > pop invalid -> (no) \
+       |    |    |                            \
+       |    |    -> pop invalid -> (yes) -> next valid -> (no)
+       |    |
+       |    |
+       |    v
+       |
+       -> pop invalid -> (no) -> next valid -> (no)
+ @endverbatim
+ *
+ *
+ * ## PROMELA Model
+ *
+ * @verbinclude sliding_window.pml
+ *
+ *
+ * ## Notes
+ *
+ * If these buffers need to be accessible from multiple readers/writers,
+ * locks must be implement to ensure atomicity.
+ *
+ * This could have been implemented more efficiently with a
+ * circular buffer that adds packet information in a custom header per entry,
+ * but would of course have required extra effort in creating such a buffer.
+ * Given that the performance overhead is negligible for this particular
+ * application, this is not necessary.
+ * A more sensible approach would be to build the transfer frames in the
+ * application software by concatenating packets into 1024 byte sized
+ * buffers and handing them over to the driver. The packing could be done
+ * in a flat buffer and a few lines of code. Now we have effectively >1000
+ * sloc (including the circular buffer implementation) and twice the number of
+ * memory accesses for performing the same task.
+ */
+
+
+#include <compiler.h>
+#include <errors.h>
+#include <cpus_buffers.h>
+
+#include <stdlib.h>
+
+
+
+/**
+ * @brief forwards the write position without adding elements, effectively
+ *        creating an undefined segment
+ * @note  this is an extension to the circular buffer handling functions
+ * @param p_buf a struct circular_buffer
+ * @param elem the number of elements to forward the buffer's
+ *        write position
+ * @retval -1 : error
+ * @retval  0 : success
+ */
+
+static int32_t cbuf_forward_write8(struct circular_buffer8 *p_buf,
+				   const uint32_t elem)
+{
+	if (cbuf_get_free8(p_buf) < elem) {
+		errno = E_CPUS_FORWARD_WRITE;
+		return -1;
+	}
+
+	if ((p_buf->num_elem - p_buf->write_pos) >= elem)
+		p_buf->write_pos += elem;
+	else
+		p_buf->write_pos += elem - p_buf->num_elem;
+
+	return 0;
+}
+
+
+/**
+ * @brief add an invalid padding entry to the buffer
+ *
+ * @param cpus a struct cpus_buffers
+ * @param size the size of the padding
+ * @retval -1 : error
+ * @retval  0 : success
+ */
+
+static int32_t cpus_push_invalid(struct cpus_buffers *cpus, uint16_t size)
+{
+	uint8_t invalid_pattern = CBUF_PUS_INVALID;
+
+
+	if (cbuf_forward_write8(&(cpus->pus_pkts), (uint32_t) size))
+		return -1;	/* errno set in call */
+
+	if (!cbuf_write16(&(cpus->pus_size), &size, 1)) {
+		/* no data written (this is critical as buffers
+		 * are now out of sync)
+		 */
+		errno = E_CPUS_SIZE_WRITE;
+		return -1;
+	}
+
+	if (!cbuf_write8(&(cpus->pus_valid), &invalid_pattern, 1)) {
+		/* no data written (this is critical as buffers
+		 * are now out of sync)
+		 */
+		errno = E_CPUS_PATTERN_WRITE;
+		return -1;
+	}
+
+	return 0;
+}
+
+
+/**
+ * @brief check if the next packet in the buffer is a vaild one
+ *
+ * @param cpus a struct cpus_buffers
+ * @retval  1 : valid
+ * @retval  0 : invalid/empty
+ */
+
+static int32_t cpus_next_is_valid(struct cpus_buffers *cpus)
+{
+	uint8_t pattern;
+
+	if (!cbuf_peek8(&(cpus->pus_valid), &pattern, 1))
+		return 0;	/* empty buffer == invalid */
+
+	if (pattern == CBUF_PUS_VALID)
+		return 1;
+
+	return 0;
+}
+
+/**
+ * @brief try to pop the next invalid entry from the buffer
+ *
+ * @param cpus a struct cpus_buffers
+ * @retval -1 : error
+ * @retval  0 : success
+ */
+
+static int32_t cpus_pop_invalid(struct cpus_buffers *cpus)
+{
+	uint16_t size;
+
+	if (cpus_next_is_valid(cpus))
+		return 0;
+
+	if (!cbuf_read16(&(cpus->pus_size), &size, 1))
+		return -1; /* no data in buffer, not critical */
+
+	/* NOTE: there is no no error checking performed in these functions,
+	 * if we want to detect more desync errors, we have to add them there
+	 */
+
+	cbuf_forward8(&(cpus->pus_pkts),  (uint32_t) size);
+	cbuf_forward8(&(cpus->pus_valid), 1);
+
+	return 0;
+}
+
+/**
+ * @brief try to read a valid packet from the buffer
+ *
+ * @param cpus a struct cpus_buffers
+ * @param pus_pkt a buffer to store the packet into
+ * @retval >0 : packet size
+ * @retval -1 : error
+ * @retval  0 : success
+ */
+
+static int32_t cpus_read(struct cpus_buffers *cpus, uint8_t *pus_pkt)
+{
+	uint16_t size;
+	uint32_t ret;
+
+	if (!cpus_next_is_valid(cpus))
+		return 0;
+
+	/* no size yet */
+	if (!cbuf_peek16(&(cpus->pus_size), &size, 1))
+		return 0;
+
+	ret = cbuf_read8(&(cpus->pus_pkts), pus_pkt, (uint32_t) size);
+
+	if (ret != (uint32_t) size) {
+		/* no data in buffer (this is critical as buffers
+		 * are now out of sync)
+		 */
+		errno = E_CPUS_PKT_READ;
+		return -1;
+	}
+
+	/* NOTE: there is no no error checking performed in these functions,
+	 * if we want to detect more desync errors, we have to add them there
+	 */
+
+	cbuf_forward8(&(cpus->pus_valid),  1);
+	cbuf_forward16(&(cpus->pus_size),  1);
+
+	return (int32_t) size;
+}
+
+
+/**
+ * @brief try to write a packet to the buffer
+ *
+ * @param cpus a struct cpus_buffers
+ * @param pus_pkt a buffer to fetch the packet from
+ * @param size the size of the packet
+ * @retval -1 : error
+ * @retval  0 : success
+ */
+
+static int32_t cpus_write(struct cpus_buffers *cpus,
+			  uint8_t *pus_pkt,
+			  uint16_t size)
+{
+	uint8_t valid_pattern = CBUF_PUS_VALID;
+
+	uint32_t ret;
+
+
+	ret = cbuf_write8(&(cpus->pus_pkts), pus_pkt, (uint32_t) size);
+
+	if (ret != size) {
+		/* no data written (this is NOT critical) */
+		errno = E_CPUS_PKT_WRITE;
+		return -1;
+	}
+
+	if (!cbuf_write8(&(cpus->pus_valid), &valid_pattern, 1)) {
+		/* no data written (this is critical as buffers
+		 * are now out of sync)
+		 */
+		errno = E_CPUS_PATTERN_WRITE;
+		return -1;
+	}
+
+	if (!cbuf_write16(&(cpus->pus_size), &size, 1)) {
+		/* no data written (this is critical as buffers
+		 * are now out of sync)
+		 */
+		errno = E_CPUS_SIZE_WRITE;
+		return -1;
+	}
+
+	return 0;
+}
+
+
+/**
+ * @brief sets up the circular buffers to track pus packets
+ * @note  all buffers must be least the defined sizes!
+ * @param cpus a struct cpus_buffers
+ * @param p_buf_pkts a 3*1024 byte sized buffer that will hold the pus packets
+ * @param p_buf_size a 3*1024/12 byte sized buffer that will hold the sizes of
+ *        the pus packets
+ * @param p_buf_size a 3*1024/12 byte sized buffer that will hold the validity
+ *        flags of the pus packets
+ */
+
+void cpus_init(struct cpus_buffers *cpus,
+	       uint8_t *p_buf_pkts,
+	       uint16_t *p_buf_size,
+	       uint8_t *p_buf_valid)
+{
+	cbuf_init8(&(cpus->pus_pkts),   p_buf_pkts,  CBUF_PKTS_ELEM);
+	cbuf_init8(&(cpus->pus_valid),  p_buf_valid, CBUF_VALID_ELEM);
+	cbuf_init16(&(cpus->pus_size),  p_buf_size,  CBUF_SIZE_ELEM);
+}
+
+
+/**
+ * @brief resets the cpus buffers
+ * @param cpus a struct cpus_buffers
+ */
+
+void cpus_reset(struct cpus_buffers *cpus)
+{
+	cbuf_reset8(&(cpus->pus_pkts));
+	cbuf_reset8(&(cpus->pus_valid));
+	cbuf_reset16(&(cpus->pus_size));
+}
+
+
+/**
+ * @brief get free space in cpus buffer
+ * @param cpus a struct cpus_buffers
+ *
+ * @returns free space in bytes
+ */
+
+uint32_t cpus_get_free(struct cpus_buffers *cpus)
+{
+	uint32_t usage;
+
+	usage = cbuf_get_used8(&(cpus->pus_pkts));
+
+	if (usage >= AS250_TRANSFER_FRAME_SIZE)
+		usage = usage - AS250_TRANSFER_FRAME_SIZE;
+
+	if (usage < AS250_TRANSFER_FRAME_SIZE)
+		usage =	AS250_TRANSFER_FRAME_SIZE - usage;
+	else
+		usage = 0;
+
+	return usage;
+}
+
+/**
+ * @brief tries to read a valid packet from the buffer
+ * @param cpus a struct cpus_buffers
+ * @note  if the next packet is invalid, it is popped from the buffer
+ *
+ * @retval >0 : packet size
+ * @retval  0 : success
+ */
+
+int32_t cpus_pop_packet(struct cpus_buffers *cpus, uint8_t *pus_pkt)
+{
+	if (cpus_pop_invalid(cpus))
+		return 0;
+
+	/* errno/retval set from call */
+	return cpus_read(cpus, pus_pkt);
+}
+
+
+/**
+ * @brief try to push a packet into the buffer
+ *
+ * @param cpus a struct cpus_buffers
+ * @param pus_pkt a buffer holding the packet
+ * @param size the size of the packet
+ *
+ * @retval -1 : error
+ * @retval  0 : success
+ */
+
+int32_t cpus_push_packet(struct cpus_buffers *cpus,
+			 uint8_t *pus_pkt,
+			 uint16_t size)
+{
+	uint16_t free_bytes;
+	uint32_t usage;
+
+
+	if (size > AS250_TRANSFER_FRAME_SIZE) {
+		errno = E_CPUS_PKT_SIZE_LIMIT;
+		return -1;
+	}
+
+	usage = cbuf_get_used8(&(cpus->pus_pkts));
+
+	if (usage > (CBUF_PUS_FRAMES * AS250_TRANSFER_FRAME_SIZE)) {
+		errno = E_CPUS_FULL;
+		return -1;
+	}
+
+	if (usage < AS250_TRANSFER_FRAME_SIZE) {
+
+		free_bytes = (AS250_TRANSFER_FRAME_SIZE - usage);
+
+		if (size > free_bytes) {
+			if (cpus_push_invalid(cpus, free_bytes)) {
+				/* could be critical error requiring reset */
+				errno = E_CPUS_PUSH_INVALID;
+				return -1;
+			}
+		}
+
+		if (cpus_write(cpus, pus_pkt, size)) {
+			/* could be critical error requiring reset */
+			errno = E_CPUS_WRITE;
+			return -1;
+		}
+	}
+
+	if (usage >= AS250_TRANSFER_FRAME_SIZE) {
+
+		free_bytes = AS250_TRANSFER_FRAME_SIZE*CBUF_PUS_FRAMES - usage;
+
+		if (size > free_bytes) {
+			errno = E_CPUS_FULL;
+			return -1;
+		}
+
+		if (cpus_write(cpus, pus_pkt, size)) {
+			/* could be critical error requiring reset */
+			errno = E_CPUS_WRITE;
+			return -1;
+		}
+	}
+
+	return 0;
+}
+
+
+/**
+ * @brief get size of next valid packet
+ *
+ * @note if current packet is invalid it will be popped from the buffer
+ *
+ * @param cpus a struct cpus_buffers
+ *
+ * @retval >0 : packet size
+ * @retval  0 : success
+ */
+
+int32_t cpus_next_valid_pkt_size(struct cpus_buffers *cpus)
+{
+	uint16_t size;
+
+
+	if (cpus_pop_invalid(cpus))
+		return 0;
+
+	if (!cpus_next_is_valid(cpus))
+		return 0;
+
+
+	if (!cbuf_peek16(&(cpus->pus_size), &size, 1))
+		return 0;
+
+	return (int32_t) size;
+}
diff --git a/IBSW/lib/edac.c b/IBSW/lib/edac.c
new file mode 100644
index 0000000..d7c3478
--- /dev/null
+++ b/IBSW/lib/edac.c
@@ -0,0 +1,410 @@
+/**
+ * @file   edac.c
+ * @ingroup edac
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at)
+ * @date   February, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @defgroup edac EDAC error handling
+ * @brief Implements EDAC error handling and utility functions
+ *
+ *
+ * ## Overview
+ *
+ * This module implements handling of double-bit EDAC errors raised either via
+ * SPARC v8 data access exception trap 0x9 or the AHB STATUS IRQ 0x1.
+ *
+ * ## Mode of Operation
+ *
+ * The @ref traps module is needed to install the custom data access exception
+ * trap handler, the AHB irq handler must be installed via @ref irq_dispatch.
+ *
+ * If an error is detected in normal memory, its location is reported. If the
+ * source of the double bit error is the @ref iwf_flash, the last flash read
+ * address is identified and reported.
+ *
+ *
+ * @startuml {edac_handler.svg} "EDAC trap handler" width=10
+ * :IRQ/trap;
+ * if (EDAC) then (yes)
+ *	-[#blue]->
+ *	if (correctable) then (yes)
+ *		:read address;
+ *		if (FLASH) then (yes)
+ *			:get logical address;
+ *		endif
+ *		: report address;
+ *	endif
+ * endif
+ * end
+ * @enduml
+ *
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ * ## Notes
+ *
+ * - This module provides EDAC checkbit generation that is used in @ref memcfg
+ *   to inject single or double bit errors.
+ *
+ */
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <io.h>
+#include <iwf_fpga.h>
+#include <iwf_flash.h>
+#include <ahb.h>
+#include <errors.h>
+#include <sysctl.h>
+#include <wrap_malloc.h>
+
+#include <event_report.h>
+
+/**
+ * the reset function to call when a critical error is encountered
+ */
+
+static void (*do_reset)(void *userdata);
+
+/**
+ * the user data to supply to the reset function
+ */
+
+static void *reset_userdata;
+
+
+static struct {
+	uint32_t edac_single;
+	uint32_t edac_double;
+	uint32_t edac_last_single_addr;
+	uint32_t edac_last_double_addr;
+	uint32_t flash_errors;
+} edacstat;
+
+#if (__sparc__)
+#define UINT32_T_FORMAT		"%lu"
+#else
+#define UINT32_T_FORMAT		"%u"
+#endif
+
+static ssize_t edac_show(__attribute__((unused)) struct sysobj *sobj,
+			 __attribute__((unused)) struct sobj_attribute *sattr,
+			 char *buf)
+{
+	if (!strcmp(sattr->name, "singlefaults"))
+		return sprintf(buf, UINT32_T_FORMAT, edacstat.edac_single);
+
+	if (!strcmp(sattr->name, "doublefaults"))
+		return sprintf(buf, UINT32_T_FORMAT, edacstat.edac_double);
+
+	if (!strcmp(sattr->name, "lastsingleaddr"))
+		return sprintf(buf, UINT32_T_FORMAT,
+			       edacstat.edac_last_single_addr);
+
+	if (!strcmp(sattr->name, "lastdoubleaddr"))
+		return sprintf(buf, UINT32_T_FORMAT,
+			       edacstat.edac_last_double_addr);
+
+	if (!strcmp(sattr->name, "flash_errors"))
+		return sprintf(buf, UINT32_T_FORMAT,
+			       edacstat.flash_errors);
+
+
+	return 0;
+}
+
+
+__extension__
+static struct sobj_attribute singlefaults_attr = __ATTR(singlefaults,
+							edac_show,
+							NULL);
+__extension__
+static struct sobj_attribute doublefaults_attr = __ATTR(doublefaults,
+							edac_show,
+							NULL);
+__extension__
+static struct sobj_attribute lastsingleaddr_attr = __ATTR(lastsingleaddr,
+							  edac_show,
+							  NULL);
+__extension__
+static struct sobj_attribute lastdoubleaddr_attr = __ATTR(lastdoubleaddr,
+							  edac_show,
+							  NULL);
+__extension__
+static struct sobj_attribute flash_errors_attr = __ATTR(flash_errors,
+							edac_show,
+							NULL);
+__extension__
+static struct sobj_attribute *edac_attributes[] = {&singlefaults_attr,
+						   &doublefaults_attr,
+						   &doublefaults_attr,
+						   &lastsingleaddr_attr,
+						   &lastdoubleaddr_attr,
+						   &flash_errors_attr,
+						   NULL};
+
+
+
+/**
+ * @brief generate an BCH EDAC checkbit
+ *
+ * @param value the 32 bit value to generate the checkbit for
+ * @param bits an array of bit indices to XOR
+ * @param len the lenght of the bit index array
+ *
+ * @return a checkbit
+ *
+ * @note see GR712-UM v2.3 p. 60
+ */
+
+static uint8_t edac_checkbit_xor(const uint32_t value,
+				 const uint32_t *bits,
+				 const uint32_t len)
+{
+	uint8_t val = 0;
+
+	uint32_t i;
+
+
+	for (i = 0; i < len; i++)
+		val ^= (value >> bits[i]);
+
+	return (val & 0x1);
+}
+
+
+/**
+ * @brief generate BCH EDAC checkbits
+ *
+ * @param value the 32 bit value to generate the checkbits for
+ *
+ * @return bch the checkbits
+ *
+ * @note see GR712-UM v2.3 p. 60
+ *
+ */
+
+uint8_t edac_checkbits(const uint32_t value)
+{
+	uint8_t bch = 0;
+
+	static const uint32_t CB[8][16] = {
+		{0, 4,  6,  7,  8,  9, 11, 14, 17, 18, 19, 21, 26, 28, 29, 31},
+		{0, 1,  2,  4,  6,  8, 10, 12, 16, 17, 18, 20, 22, 24, 26, 28},
+		{0, 3,  4,  7,  9, 10, 13, 15, 16, 19, 20, 23, 25, 26, 29, 31},
+		{0, 1,  5,  6,  7, 11, 12, 13, 16, 17, 21, 22, 23, 27, 28, 29},
+		{2, 3,  4,  5,  6,  7, 14, 15, 24, 25, 26, 27, 28, 29, 30, 31},
+		{8, 9, 10, 11, 12, 13, 14, 15, 24, 25, 26, 27, 28, 29, 30, 31},
+		{0, 1,  2,  3,  4,  5,  6, 7,  24, 25, 26, 27, 28, 29, 30, 31},
+	};
+
+
+	bch |=   edac_checkbit_xor(value, &CB[0][0], 16)        << 0;
+	bch |=   edac_checkbit_xor(value, &CB[1][0], 16)        << 1;
+	bch |= (~edac_checkbit_xor(value, &CB[2][0], 16) & 0x1) << 2;
+	bch |= (~edac_checkbit_xor(value, &CB[3][0], 16) & 0x1) << 3;
+	bch |=   edac_checkbit_xor(value, &CB[4][0], 16)	<< 4;
+	bch |=   edac_checkbit_xor(value, &CB[5][0], 16)	<< 5;
+	bch |=   edac_checkbit_xor(value, &CB[6][0], 16)        << 6;
+	bch |=   edac_checkbit_xor(value, &CB[7][0], 16)        << 7;
+
+
+	return bch & 0x7f;
+}
+
+
+/**
+ * @brief check if the failing address is in a critical segment
+ *
+ * @param addr the address to check
+ *
+ * @return 0 if not critical, not null otherwise
+ *
+ * @note critical sections are: CPU stack space, SW image in RAM
+ */
+
+static uint32_t edac_error_in_critical_section(uint32_t addr)
+{
+
+	/* stack grows down */
+	if ((SRAM1_CPU_0_STACK_BASE - addr) < SRAM1_CPU_0_STACK_SIZE)
+		return 1;
+
+	if ((SRAM1_CPU_1_STACK_BASE - addr) < SRAM1_CPU_1_STACK_SIZE)
+		return 1;
+
+	if ((addr - SRAM1_SW_ADDR) < SRAM1_SW_SIZE)
+		return 1;
+
+
+	return 0;
+}
+
+
+/**
+ * @brief investigate AHB status for source of error
+ *
+ * @return 1 if source was edac error, 0 otherwise
+ *
+ * @note turns out the AHB irq is raised on single bit errors after all;
+ *       sections 5.10.3 and 7 in the GR712-UM docs are a bit ambiguous
+ *       regarding that; since we should not correct errors while the other
+ *       CPU is running, we'll continue to use the scrubbing mechanism as before
+ */
+
+static uint32_t edac_error(void)
+{
+	static uint32_t addr;
+
+	uint32_t block, page, offset;
+
+
+	/* was not EDAC related, ignore */
+	if (!ahbstat_new_error())
+		return 0;
+
+
+	addr = ahbstat_get_failing_addr();
+
+	ahbstat_clear_new_error();
+
+	/* ignore correctable errors, but update statistics */
+	if (ahbstat_correctable_error()) {
+		edacstat.edac_single++;
+		edacstat.edac_last_single_addr = addr;
+		return 0;
+	}
+
+
+
+	edacstat.edac_double++;
+	edacstat.edac_last_double_addr = addr;
+
+	switch (addr) {
+	case IWF_FPGA_FLASH_1_DATA_BASE:
+		edacstat.flash_errors++;
+		flash_get_read_addr(0, &block, &page, &offset);
+		addr = flash_gen_logical_addr(block, page, offset);
+		event_report(EDAC, MEDIUM, addr);
+		break;
+	case IWF_FPGA_FLASH_2_DATA_BASE:
+		edacstat.flash_errors++;
+		flash_get_read_addr(1, &block, &page, &offset);
+		addr = flash_gen_logical_addr(block, page, offset);
+		event_report(EDAC, MEDIUM, addr);
+		break;
+	case IWF_FPGA_FLASH_3_DATA_BASE:
+		edacstat.flash_errors++;
+		flash_get_read_addr(2, &block, &page, &offset);
+		addr = flash_gen_logical_addr(block, page, offset);
+		event_report(EDAC, MEDIUM, addr);
+		break;
+	case IWF_FPGA_FLASH_4_DATA_BASE:
+		edacstat.flash_errors++;
+		flash_get_read_addr(3, &block, &page, &offset);
+		addr = flash_gen_logical_addr(block, page, offset);
+		event_report(EDAC, MEDIUM, addr);
+		break;
+	default:
+		event_report(EDAC, MEDIUM, addr);
+		if (edac_error_in_critical_section(addr))
+			if (do_reset)
+				do_reset(reset_userdata);
+		break;
+	}
+
+
+	return 1;
+}
+
+
+/**
+ * set up:
+ *
+ *	trap_handler_install(0x9, data_access_exception_trap);
+ *	register edac trap to ahb irq
+ *
+ *	for testing with grmon:
+ *	dsu_clear_cpu_break_on_trap(0);
+ *	dsu_clear_cpu_break_on_error_trap(0);
+ *
+ * @note this is not triggered for single faults in RAM (needs manual checking)
+ *       but still raised by the FPGA if the FLASH error is correctable
+ */
+
+void edac_trap(void)
+{
+	edac_error();
+}
+
+
+/**
+ * @brief AHB irq handler for EDAC interrupts
+ */
+
+int32_t edac_ahb_irq(__attribute__((unused)) void *userdata)
+{
+	edac_error();
+
+	return 0;
+}
+
+
+/**
+ * @brief set the reset function to call on critical error
+ *
+ * @param callback a callback function
+ * @param userdata a pointer to arbitrary data supplied to the callback function
+ */
+
+int32_t edac_set_reset_callback(void (*callback)(void *userdata),
+				void *userdata)
+{
+	if (!callback) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	do_reset = callback;
+	reset_userdata = userdata;
+
+	return 0;
+}
+
+
+/**
+ * @brief initialise the sysctl entries for the edac module
+ *
+ * @return -1 on error, 0 otherwise
+ */
+
+int32_t edac_init_sysctl(void)
+{
+	struct sysobj *sobj;
+
+
+	sobj = sysobj_create();
+
+	if (!sobj)
+		return -1;
+
+	sobj->sattr = edac_attributes;
+
+	sysobj_add(sobj, NULL, sys_set, "edac");
+
+	return 0;
+}
diff --git a/IBSW/lib/error_log.c b/IBSW/lib/error_log.c
new file mode 100644
index 0000000..f02bc70
--- /dev/null
+++ b/IBSW/lib/error_log.c
@@ -0,0 +1,243 @@
+/**
+ * @file   error_log.c
+ * @ingroup error_log
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   September, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @defgroup error_log Error Log Management
+ * @brief Manages the RAM/Flash error log
+ *
+ *
+ * ## Overview
+ *
+ * This component implements access to the Error Log stores in RAM.
+ *
+ * ## Mode of Operation
+ *
+ * The error log consists of ERROR_LOG_MAX_ENTRIES that store timestamps,
+ * error id and ERR_LOG_N2 bytes of extra information per error.
+ *
+ * The log is accessed like a ring buffer, with one entry acting as a guard
+ * for the read and write pointer, thus reducing the real number of entries to
+ * be at most ERROR_LOG_MAX_USABLE.
+ *
+ * As the log is circular, the oldest entry will be overwritten if a new entry
+ * is added when the log is full.
+ *
+ *
+ *
+ * @startuml {error_log_add_entry.svg} "Adding an error to the log" width=10
+ * start
+ * if (write pointer invalid) then (yes)
+ *	:reset log;
+ * endif
+ * :add entry;
+ * :forward write pointer;
+ * if (write == read) then (yes)
+ *	:forward read pointer;
+ * endif
+ *
+ * stop
+ * @enduml
+ *
+ *
+ *
+ *
+ * @see
+ *	_CHEOPS-IWF-INST-ICD-009 Section 5.3.3_ and _DPU-SICD-IF-3540_ for how
+ *	to use the error log.
+ *
+ * ## Error Handling
+ *
+ * If corrupted memory modifies the log index beyond legal size, the log is
+ * reset to prevent corruption of memory by the mechanism itself.
+ *
+ * ## Notes
+ *
+ * Access to the error log for the IASW was dumbed down on request. An
+ * uncoditional reverse-dump of all entries starting from the last written entry
+ * has been added. The original per-entry access functionality has been kept for
+ * the the error log transfer to flash in order to avoid a coding mess by
+ * keeping log management contained in this component.
+ *
+ * @example demo_error_log.c
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <error_log.h>
+
+
+
+/**
+ * @brief initialises the error log location
+ *
+ * @param log a struct error log pointer location
+ *
+ * @note Ignores retval on malloc, log location is at a fixed position
+ *       for regular operation. Index values are NOT set (DBS initialises the
+ *       table)
+ */
+
+void error_log_init(struct error_log **log)
+{
+	(*log) = (struct error_log *) RAM_ERROR_LOG_BASE;
+}
+
+static void error_log_forward_index(uint32_t *idx)
+{
+	if ((*idx) < ERROR_LOG_MAX_USABLE)
+		(*idx)++;
+	else
+		(*idx) = 0;
+}
+
+
+/**
+ * @brief adds an entry to the error log
+ * @param error_log a pointer to the error log
+ * @param[in] time a time stamp
+ * @param[in] error_id an error or event id
+ * @param[in] error_log_info a pointer to a buffer of size ERR_LOG_N2,
+ *        unused bytes must be zero
+ * @note  the error log is a circular fifo
+ */
+
+void error_log_add_entry(struct error_log *log, struct event_time *time,
+			 uint16_t error_id, uint8_t *error_log_info)
+{
+	uint32_t idx;
+
+
+	idx = log->err_log_next;
+
+	log->entry[idx].err_evt_id = error_id;
+
+	memcpy(&log->entry[idx].time, time, sizeof(struct event_time));
+
+	memcpy(log->entry[idx].err_log_info, error_log_info,
+	       ERR_LOG_N2);
+
+	error_log_forward_index(&log->err_log_next);
+
+	if (log->err_log_next == log->err_log_next_unsaved)
+		error_log_forward_index(&log->err_log_next_unsaved);
+}
+
+
+/**
+ * @brief read the next unsaved entry in the error log
+ * @param error_log a pointer to the error log
+ * @param[out] log_entry a struct error_log_entry
+ *
+ * @return     0: no entry read, 1: entry read
+ */
+
+uint32_t error_log_read_entry_raw(struct error_log *log,
+				  struct error_log_entry *log_entry)
+{
+	uint32_t idx;
+
+
+	idx = log->err_log_next_unsaved;
+
+	if (idx == log->err_log_next)
+		return 0;
+
+	memcpy(log_entry, &log->entry[idx], sizeof(struct error_log_entry));
+	
+	error_log_forward_index(&log->err_log_next_unsaved);
+
+	return 1;
+}
+
+
+/**
+ * @brief read out the next unsaved entry in the error log
+ * @param error_log a pointer to the error log
+ * @param[out] time a time stamp
+ * @param[out] error_id an error or event id
+ * @param[out] error_log_info a pointer to a buffer of size ERR_LOG_N2
+ *
+ * @return     0: no entry read, 1: entry read
+ */
+
+uint32_t error_log_read_entry(struct error_log *log, struct event_time *time,
+			      uint16_t *error_id, uint8_t *error_log_info)
+{
+	struct error_log_entry log_entry;
+
+
+	if (!error_log_read_entry_raw(log, &log_entry))
+		return 0;
+
+
+	(*error_id) = log_entry.err_evt_id;
+
+	memcpy(time, &log_entry.time, sizeof(struct event_time));
+
+	memcpy(error_log_info, log_entry.err_log_info, ERR_LOG_N2);
+
+	return 1;
+}
+
+
+/**
+ * @brief count the number of entries in the error log
+ * @param error_log a pointer to the error log
+ *
+ * @return number of active entries in log
+ */
+
+uint32_t error_log_num_entries(struct error_log *log)
+{
+	int32_t num;
+
+
+	num = log->err_log_next - log->err_log_next_unsaved;
+
+	if (num < 0)
+		return (ERROR_LOG_MAX_USABLE + num);
+	else
+		return num;
+}
+
+
+
+/**
+ * @brief dump the error log in reverse, starting from the last write
+ * @param error_log a pointer to the error log
+ * @param buf a buffer where the error log will be dumped into
+ */
+
+void error_log_dump_reverse(struct error_log *log, uint8_t *buf)
+{
+	int32_t idx;
+
+	uint32_t i;
+
+
+	idx = (int32_t) log->err_log_next - 1;
+
+	for (i = 0; i < ERROR_LOG_MAX_ENTRIES; i++) {
+
+		if (idx < 0)
+			idx = ERROR_LOG_MAX_USABLE;
+
+		memcpy(buf + i * sizeof(struct error_log_entry),
+		       (uint8_t *) &log->entry[idx],
+		       sizeof(struct error_log_entry));
+
+		idx--;
+	}
+}
diff --git a/IBSW/lib/event_report.c b/IBSW/lib/event_report.c
new file mode 100644
index 0000000..97f19a7
--- /dev/null
+++ b/IBSW/lib/event_report.c
@@ -0,0 +1,276 @@
+/**
+ * @file   event_report.c
+ * @ingroup event_report
+ * @author Roland Ottensamer (roland.ottensamer@univie.ac.at),
+ *          Armin Luntzer (roland.ottensamer@univie.ac.at)
+ * @date   2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @defgroup event_report Central event report transation interface to IASW
+ *
+ * @brief IBSW error translation to IASW events
+ *
+ *
+ * ## Overview
+ *
+ * Since it is required that a horizontal hierarchial topology with partially
+ * reverse dependencies is forced on what is clearly vertical partitioning in
+ * the supplied abstraction levels of hardware and software functionality of
+ * the IBSW component, it is sensible to at least minimise the adaption points.
+ *
+ * This component provides a central translation interface and submission of
+ * event reports generated by the IBSW to the IASW event reporting interface.
+ *
+ *
+ * ## Mode of Operation
+ *
+ * This report arguments passed to this interface are (for obvious reasons)
+ * similar to those used in the IASW. Since the IASW will crash if a
+ * combination of error id and severity is not defined, the arguments are
+ * filtered, so only legal combinations are passed to the IASW interface.
+ *
+ * If IASW definitions are changed, these filters must be updated accordingly.
+ *
+ * Given that the IASW errors do not actually contain useful information by
+ * themselves, relevant error information (defined as errno-extensions) are
+ * passed via the event data payload of an error.
+ *
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ *
+ * ## Notes
+ *
+ * From a design perspective, the IBSW should rather maintain its own
+ * independent error message buffer, which is queried by the IASW as desired.
+ * Instead, any error reported by the IBSW must invoke IASW functionality even
+ * from interrupt contexts wich makes such calls unpredictable and effectively
+ * destabilises the IBSW, as all IASW defects regarding event report and/or
+ * packet manangement immediately-back propagate or even halt the operation of
+ * the IBSW.
+ *
+ */
+
+
+#include <event_report.h>
+
+
+#if (!__sparc__)
+
+void CrIaEvtRaise(__attribute__((unused)) uint8_t subtype,
+		__attribute__((unused)) uint16_t id,
+		__attribute__((unused)) uint16_t *data,
+		__attribute__((unused)) uint32_t data_size)
+{
+}
+
+#endif
+
+
+/**
+ * @brief translate normal level errors
+ * @param errno an error number
+ *
+ * @return the IASW level identifier of the error class
+ */
+
+static uint16_t event_report_translate_class_norm(enum error_class c)
+{
+	uint16_t id = 0;
+
+	switch (c) {
+	case INIT:
+		id = CRIA_SERV5_EVT_INIT_SUCC;
+		break;
+	case NOTIFY:
+		break;
+	case FBF:
+		break;
+	case EDAC:
+		break;
+	case CORE1553BRM:
+		break;
+	case GRSPW2:
+		break;
+	case ERRLOG:
+		break;
+	case SYNC:
+		break;
+	}
+
+	return id;
+}
+
+
+/**
+ * @brief translate low level errors
+ * @param c the error class
+ *
+ * @return the IASW level identifier of the error class
+ */
+
+static uint16_t event_report_translate_class_low(enum error_class c)
+{
+	uint16_t id = 0;
+
+	switch (c) {
+	case INIT:
+		break;
+	case NOTIFY:
+		break;
+	case FBF:
+		break;
+	case EDAC:
+		id = CRIA_SERV5_EVT_SBIT_ERR;
+		break;
+	case CORE1553BRM:
+		id = CRIA_SERV5_EVT_1553_ERR_L;
+		break;
+	case GRSPW2:
+		id = CRIA_SERV5_EVT_SPW_ERR_L;
+		break;
+	case ERRLOG:
+		break;
+	case SYNC:
+		break;
+	}
+
+	return id;
+}
+
+
+/**
+ * @brief translate medium level errors
+ * @param c the error class
+ *
+ * @return the IASW level identifier of the error class
+ */
+
+static uint16_t event_report_translate_class_med(enum error_class c)
+{
+	uint16_t id = 0;
+
+	switch (c) {
+	case INIT:
+		break;
+	case NOTIFY:
+		break;
+	case FBF:
+		break;
+	case EDAC:
+		id = CRIA_SERV5_EVT_DBIT_ERR;
+		break;
+	case CORE1553BRM:
+		id = CRIA_SERV5_EVT_1553_ERR_M;
+		break;
+	case GRSPW2:
+		id = CRIA_SERV5_EVT_SPW_ERR_M;
+		break;
+	case ERRLOG:
+		break;
+	case SYNC:
+		id = CRIA_SERV5_EVT_SYNC_LOSS;
+		break;
+	}
+
+	return id;
+}
+
+
+/**
+ * @brief translate high level errors
+ * @param c the error class
+ *
+ * @return the IASW level identifier of the error class
+ */
+
+static uint16_t event_report_translate_class_high(enum error_class c)
+{
+	uint16_t id = 0;
+
+	switch (c) {
+	case INIT:
+		id = CRIA_SERV5_EVT_INIT_FAIL;
+		break;
+	case NOTIFY:
+		break;
+	case FBF:
+		id = CRIA_SERV5_EVT_FL_FBF_ERR;
+		break;
+	case EDAC:
+		break;
+	case CORE1553BRM:
+		id = CRIA_SERV5_EVT_1553_ERR_H;
+		break;
+	case GRSPW2:
+		id = CRIA_SERV5_EVT_SPW_ERR_H;
+		break;
+	case ERRLOG:
+		id = CRIA_SERV5_EVT_FL_EL_ERR;
+		break;
+	case SYNC:
+		break;
+	}
+
+	return id;
+}
+
+
+/**
+ * @brief event report interface to IASW
+ * @param c the error class
+ * @param s the erorr severity
+ * @param errno an error number
+ *
+ */
+
+void event_report(enum error_class c, enum error_severity s, uint32_t err)
+{
+	uint16_t class_id;
+	uint16_t event_data[2] = {0, 0};
+
+
+	event_data[0] = (uint16_t) (err >> 16) & 0xffff;
+	event_data[1] = (uint16_t) err & 0xffff;
+
+
+	switch (s) {
+	case NORMAL:
+		class_id = event_report_translate_class_norm(c);
+		if (class_id)
+			CrIaEvtRaise(CRIA_SERV5_EVT_NORM,
+				   class_id, event_data, 4);
+		break;
+	case LOW:
+		class_id = event_report_translate_class_low(c);
+		if (class_id)
+			CrIaEvtRaise(CRIA_SERV5_EVT_ERR_LOW_SEV,
+				   class_id, event_data, 4);
+		break;
+	case MEDIUM:
+		class_id = event_report_translate_class_med(c);
+		if (class_id)
+			CrIaEvtRaise(CRIA_SERV5_EVT_ERR_MED_SEV,
+				   class_id, event_data, 4);
+		break;
+	case HIGH:
+		class_id = event_report_translate_class_high(c);
+		if (class_id)
+			CrIaEvtRaise(CRIA_SERV5_EVT_ERR_HIGH_SEV,
+				   class_id, event_data, 4);
+		break;
+	default:
+		break;
+	}
+}
diff --git a/IBSW/lib/fpe.c b/IBSW/lib/fpe.c
new file mode 100644
index 0000000..6a89ccf
--- /dev/null
+++ b/IBSW/lib/fpe.c
@@ -0,0 +1,447 @@
+/**
+ * @file   fpe.c
+ * @ingroup edac
+ * @author Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @date   September, 2018
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <io.h>
+
+#include <event_report.h>
+
+#include "CrIaDataPool.h"
+#include "CrIaDataPoolId.h"
+#include "Services/General/CrIaConstants.h"
+#include "CrIaIasw.h"
+
+#include <ibsw_interface.h>
+#include <iwf_fpga.h>
+
+#include <asm/leon.h>
+
+/**
+ * @brief high level floating point exception trap handler.
+ * signals a trap by setting the IRL1 and 2 in the data pool.
+ */
+
+#define MAX_FQ 8
+
+unsigned int TrapThres = 3;
+
+/* NOTE: in case the CPU2 traps also need to be handled, duplicate the whole function */
+
+void fpe_trap(void)
+{
+  unsigned short fpTraps;
+  uint16_t event_data[2] = {0, 0};
+  unsigned int i;
+
+  struct doubleword {
+    unsigned int hi;
+    unsigned int lo;
+  } ;
+
+  typedef union {
+    double d;
+    struct doubleword ww;
+  } dqueue ;
+     
+  volatile unsigned int fsrval = 0; 
+  volatile dqueue dval; 
+  volatile unsigned int value = 0;
+  volatile float fzero = 0.0f;
+  
+  dval.ww.hi = 0;
+  dval.ww.lo = 0;
+
+  /* the FQ must be emptied until the FSR says empty */
+  for (i=0; i < MAX_FQ; i++)
+    {  
+      /* read FSR */
+      __asm__ __volatile__("st %%fsr, [%0] \n\t"
+			   "nop; nop \n\t"			   
+			   ::"r"(&fsrval));
+  
+      if (fsrval & 0x00002000) /* FQ is set in FSR */
+	{
+	  /* read FQ */	  
+	  __asm__ __volatile__("std %%fq, [%0] \n\t"
+			       "nop; nop \n\t"
+			       ::"r"(&dval.d));      
+
+	  /* for the first trap, we report the PC of the origin of the trap */
+	  if (i == 0)
+	    {
+	      /* raise event for dval.ww.hi (has the PC) */
+	      event_data[0] = (uint16_t) (dval.ww.hi >> 16) & 0xffff;
+	      event_data[1] = (uint16_t) dval.ww.hi & 0xffff;
+	      CrIaEvtRaise(CRIA_SERV5_EVT_ERR_HIGH_SEV, CRIA_SERV5_EVT_INIT_FAIL, event_data, 4);
+	    }
+	}
+      else
+	{
+	  break;
+	}
+    }  
+  
+  /* cure all denormalized numbers in the 32 f registers 
+     by checking if (for nonzero numbers) the exponent is all 0, then setting to 0.0 */
+
+  /* f0 */
+  __asm__ __volatile__("st %%f0, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f0 \n\t"
+			   ::"r"(&fzero));
+    }
+  
+  /* f1 */
+  __asm__ __volatile__("st %%f1, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f1 \n\t"
+			   ::"r"(&fzero));
+    }
+
+  /* f2 */
+  __asm__ __volatile__("st %%f2, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f2 \n\t"
+			   ::"r"(&fzero));
+    }
+  
+  /* f3 */
+  __asm__ __volatile__("st %%f3, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f3 \n\t"
+			   ::"r"(&fzero));
+    }
+  
+  /* f4 */
+  __asm__ __volatile__("st %%f4, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f4 \n\t"
+			   ::"r"(&fzero));
+    }
+  
+  /* f5 */
+  __asm__ __volatile__("st %%f5, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f5 \n\t"
+			   ::"r"(&fzero));
+    }
+  
+  /* f6 */
+  __asm__ __volatile__("st %%f6, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f6 \n\t"
+			   ::"r"(&fzero));
+    }
+  
+  /* f7 */
+  __asm__ __volatile__("st %%f7, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f7 \n\t"
+			   ::"r"(&fzero));
+    }
+  
+  /* f8 */
+  __asm__ __volatile__("st %%f8, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f8 \n\t"
+			   ::"r"(&fzero));
+    }
+  
+  /* f9 */
+  __asm__ __volatile__("st %%f9, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f9 \n\t"
+			   ::"r"(&fzero));
+    }
+  
+  /* f10 */
+  __asm__ __volatile__("st %%f10, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f10 \n\t"
+			   ::"r"(&fzero));
+    }
+  
+  /* f11 */
+  __asm__ __volatile__("st %%f11, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f11 \n\t"
+			   ::"r"(&fzero));
+    }
+
+  /* f12 */
+  __asm__ __volatile__("st %%f12, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f12 \n\t"
+			   ::"r"(&fzero));
+    }
+
+  /* f13 */
+  __asm__ __volatile__("st %%f13, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f13 \n\t"
+			   ::"r"(&fzero));
+    }
+  
+  /* f14 */
+  __asm__ __volatile__("st %%f14, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f14 \n\t"
+			   ::"r"(&fzero));
+    }
+
+  /* f15 */
+  __asm__ __volatile__("st %%f15, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f15 \n\t"
+			   ::"r"(&fzero));
+    }
+
+  /* f16 */
+  __asm__ __volatile__("st %%f16, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f16 \n\t"
+			   ::"r"(&fzero));
+    }
+  
+  /* f17 */
+  __asm__ __volatile__("st %%f17, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f17 \n\t"
+			   ::"r"(&fzero));
+    }
+
+  /* f18 */
+  __asm__ __volatile__("st %%f18, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f18 \n\t"
+			   ::"r"(&fzero));
+    }
+
+  /* f19 */
+  __asm__ __volatile__("st %%f19, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f19 \n\t"
+			   ::"r"(&fzero));
+    }
+
+  /* f20 */
+  __asm__ __volatile__("st %%f20, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f20 \n\t"
+			   ::"r"(&fzero));
+    }
+
+  /* f21 */
+  __asm__ __volatile__("st %%f21, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f21 \n\t"
+			   ::"r"(&fzero));
+    }
+
+  /* f22 */
+  __asm__ __volatile__("st %%f22, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f22 \n\t"
+			   ::"r"(&fzero));
+    }
+
+  /* f23 */
+  __asm__ __volatile__("st %%f23, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f23 \n\t"
+			   ::"r"(&fzero));
+    }
+
+  /* f24 */
+  __asm__ __volatile__("st %%f24, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f24 \n\t"
+			   ::"r"(&fzero));
+    }
+
+  /* f25 */
+  __asm__ __volatile__("st %%f25, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f25 \n\t"
+			   ::"r"(&fzero));
+    }
+
+  /* f26 */
+  __asm__ __volatile__("st %%f26, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f26 \n\t"
+			   ::"r"(&fzero));
+    }
+
+  /* f27 */
+  __asm__ __volatile__("st %%f27, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f27 \n\t"
+			   ::"r"(&fzero));
+    }
+
+    /* f28 */
+  __asm__ __volatile__("st %%f28, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f28 \n\t"
+			   ::"r"(&fzero));
+    }
+
+  /* f29 */
+  __asm__ __volatile__("st %%f29, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f29 \n\t"
+			   ::"r"(&fzero));
+    }
+
+    /* f30 */
+  __asm__ __volatile__("st %%f30, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f30 \n\t"
+			   ::"r"(&fzero));
+    }
+
+    /* f31 */
+  __asm__ __volatile__("st %%f31, [%0] \n\t"
+		       "nop; nop \n\t"
+		       ::"r"(&value));
+  if ((value & 0x7fffffff) & ((value & 0x7F800000) == 0))
+    {
+      __asm__ __volatile__("ld [%0], %%f31 \n\t"
+			   ::"r"(&fzero));
+    }
+
+
+  /* Reporting */
+  if (leon3_cpuid() == 0)
+    {
+      /* update nr of traps in IRL1 */
+      CrIaCopy(IRL1_ID, &fpTraps);
+      fpTraps += 1;
+      CrIaPaste(IRL1_ID, &fpTraps);
+    }
+  else
+    {
+      /* update nr of traps in IRL2 */
+      CrIaCopy(IRL2_ID, &fpTraps);
+      fpTraps += 1;
+      CrIaPaste(IRL2_ID, &fpTraps);	
+    }
+    
+  /* Command a SW reset of EXCEPTION type */
+  if ((TrapThres != 0) && fpTraps >= TrapThres)
+    CrIbResetDPU(DBS_EXCHANGE_RESET_TYPE_EX);    
+  
+  return;
+}
diff --git a/IBSW/lib/grspw2.c b/IBSW/lib/grspw2.c
new file mode 100644
index 0000000..9bb7f7f
--- /dev/null
+++ b/IBSW/lib/grspw2.c
@@ -0,0 +1,1787 @@
+/**
+ * @file   grspw2.c
+ * @ingroup grspw2
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @defgroup grspw2 GRSPW2 driver
+ * @brief Driver for the GRSPW2 IP core
+ *
+ * ## Overview
+ *
+ * This is a driver for the GRSPW2 IP core that operates without interrupts
+ * in normal mode and with internally managed interrupts in packet routing mode.
+ * It maintains its own ring-buffer-like tables of transfer descriptors that are
+ * used by the GRSPW2 core. These can store up to 64 TX and 128 RX packets at a
+ * time.
+ *
+ * ## Mode of Operation
+ *
+ * @see _GR712RC user manual v2.7 chapter 16_ for information on the SpW IP core
+ *
+ * The transfer descriptors are managed by tracking their usage status in
+ * doubly-linked lists and moving their references between a free and a busy
+ * list.
+ *
+ * @startuml{grspw2_add_pkt.svg} "add TX packet" width=10
+ *	actor User
+ *	database Free
+ *	database Busy
+ *	entity SpW
+ *
+ *	Free <- Busy		: free
+ *	note left
+ *		processed descriptors
+ *		are moved to free list
+ *	end note
+ *
+ *	User <- Free		: retrieve
+ *	User -> Busy		: activate
+ *
+ *	Busy --> SpW		: send
+ *	note left
+ *		SpW core is notified
+ *		about new descriptors
+ *	end note
+ * @enduml
+ *
+ *
+ * TX packets are sent (and hence freed) as fast as possible by the core.
+ * RX packets are accumulated by the device until all unused descriptors
+ * are filled up, after which the core will no longer accept packets on its link
+ * interface, until at least one stored entry is fetched by the user. Because of
+ * how the SpaceWire protocol works, no packet loss will occur on the link
+ * level. Transfers just pause until continued.
+ *
+ * @startuml{grspw2_get_pkt.svg} "get RX packet" width=10
+ *	actor User
+ *	database Free
+ *	database Busy
+ *	entity SpW
+ *
+ *	Busy <- SpW		: receive
+ *
+ *	note right
+ *		used descriptors are
+ *		marked by the core
+ *	end note
+ *
+ *	hnote over SpW: ...
+ *
+ *	User <-- Busy		: check status
+ *
+ *	hnote over User: ...
+ *
+ *	User <-  Busy		: fetch
+ *	User ->  Free		: release
+ *	Free --> Busy		: reactivate
+ *
+ *	note left
+ *		during typical
+ *		operation
+ *	end note
+ *
+ *
+ *
+ *
+ * @enduml
+ *
+ * While not strictly necessary, RX descriptors are tracked in a free/busy list
+ * as well to allow the same level of control as with TX descriptors.
+ *
+ *
+ * ### Routing mode
+ *
+ * There is support for direct routing of packets between SpW cores. Since
+ * immediate re-transmission is required for low-latency, low packet rate
+ * configurations, the routing is by default set up to generate one interrupt
+ * per received packet. For alternative applications with either constant high
+ * packet rates or high latency tolerance, the routing could be reconfigured to
+ * swap whole packet buffers on a table-basis rather than of individual
+ * descriptors.
+ *
+ * A route is configured by linking the configuration of one SpaceWire core to
+ * another and activating interrupt controlled mode. Incoming packets are then
+ * passed into the outgoing queue of the "routing" link. Routes are always
+ * defined unidirectionally.
+ *
+ * The number of TX descriptors in a basic setup effectively limits the use of
+ * the RX descriptors to be the same, otherwise stalls may occur when the number
+ * of RX packets exceed the supply of TX descriptors.
+ *
+ *
+ * ## Error Handling
+ *
+ * Configuration errors are indicated during setup. If an operational error
+ * (e.g. DMA, cable disconnect, ...) occurs, it is reported and cleared. The
+ * core is not reset or reconfigured, persistent faults will therefore raise
+ * errors periodically.
+ *
+ *
+ * ## Notes
+ *
+ * - there is currently support for only one DMA channel, as the core is not
+ *   implemented with more channels on the GR712RC
+ * - if more 64 TX or 128 RX packet slots are needed, descriptor table switching
+ *   must be implemented
+ * - routing is implemented inefficiently, since incoming packets are always
+ *   copied to the output. The conceivably much faster zero-copy method of
+ *   exchanging descriptors is not possible due to the differing descriptor
+ *   layouts. Another solution would be the exchange of data buffer references,
+ *   but this requires one of either:
+ *	- the use of the MMU with a functioning malloc/free system
+ *	- a pointer tracking system within the driver
+ *	.
+ *   In CHEOPS, the routing functionality is needed only for testing and
+ *   calibration purposes on ground, so the copy implementation is sufficient.
+ *
+ *
+ *
+ * @example demo_spw.c
+ */
+
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <io.h>
+#include <errors.h>
+#include <compiler.h>
+#include <grspw2.h>
+#include <irq_dispatch.h>
+#include <sysctl.h>
+#include <leon/irq.h>
+
+#include <event_report.h>
+#include <stdio.h>
+
+
+#if (__sparc__)
+#define UINT32_T_FORMAT		"%lu"
+#else
+#define UINT32_T_FORMAT		"%u"
+#endif
+
+__extension__
+static ssize_t rxtx_show(__attribute__((unused)) struct sysobj *sobj,
+			 __attribute__((unused)) struct sobj_attribute *sattr,
+			 char *buf)
+{
+	struct grspw2_core_cfg *cfg;
+
+
+	cfg = container_of(sobj, struct grspw2_core_cfg,  sobj);
+
+	if (!strcmp(sattr->name, "rx_bytes"))
+		return sprintf(buf, UINT32_T_FORMAT, cfg->rx_bytes);
+
+	if (!strcmp(sattr->name, "tx_bytes"))
+		return sprintf(buf, UINT32_T_FORMAT, cfg->tx_bytes);
+
+	return 0;
+}
+
+__extension__
+static ssize_t rxtx_store(__attribute__((unused)) struct sysobj *sobj,
+			  __attribute__((unused)) struct sobj_attribute *sattr,
+			  __attribute__((unused)) const char *buf,
+			  __attribute__((unused)) size_t len)
+{
+	struct grspw2_core_cfg *cfg;
+
+
+	cfg = container_of(sobj, struct grspw2_core_cfg,  sobj);
+
+	if (!strcmp(sattr->name, "rx_bytes")) {
+		cfg->rx_bytes = 0;
+		return 0;
+	}
+
+	if (!strcmp(sattr->name, "tx_bytes")) {
+		cfg->tx_bytes = 0;
+		return 0;
+	}
+
+	return 0;
+}
+
+__extension__
+static struct sobj_attribute rx_bytes_attr = __ATTR(rx_bytes,
+						    rxtx_show,
+						    rxtx_store);
+__extension__
+static struct sobj_attribute tx_bytes_attr = __ATTR(tx_bytes,
+						    rxtx_show,
+						    rxtx_store);
+
+__extension__
+static struct sobj_attribute *grspw2_attributes[] = {&rx_bytes_attr,
+						    &tx_bytes_attr,
+						    NULL};
+
+
+/**
+ * @brief central error handling
+ */
+
+static void grspw2_handle_error(enum error_severity s)
+{
+	event_report(GRSPW2, s, (uint32_t) errno);
+}
+
+
+/**
+ * @brief dma error interrupt callback
+ * @note the error bits are cleared by *writing* with a 1, see GR712RC-UM p.128
+ */
+
+static int32_t grspw2_dma_error(void *userdata)
+{
+	uint32_t dmactrl;
+	struct grspw2_core_cfg *cfg;
+
+
+	cfg = (struct grspw2_core_cfg *) userdata;
+
+	dmactrl = ioread32be(&cfg->regs->dma[0].ctrl_status);
+
+	if (dmactrl & GRSPW2_DMACONTROL_RA) {
+		errno = E_SPW_RX_AHB_ERROR;
+		grspw2_handle_error(MEDIUM);
+		dmactrl &= GRSPW2_DMACONTROL_RA;
+	}
+
+	if (dmactrl & GRSPW2_DMACONTROL_TA) {
+		errno = E_SPW_TX_AHB_ERROR;
+		grspw2_handle_error(MEDIUM);
+		dmactrl &= GRSPW2_DMACONTROL_TA;
+	}
+
+	iowrite32be(dmactrl, &cfg->regs->dma[0].ctrl_status);
+
+	return 0;
+}
+
+
+/**
+ * @brief link error interrupt callback
+ */
+
+static int32_t grspw2_link_error(void *userdata)
+{
+	uint32_t tmp;
+	uint32_t status;
+	struct grspw2_core_cfg *cfg;
+
+
+	cfg = (struct grspw2_core_cfg *) userdata;
+
+	status = ioread32be(&cfg->regs->status);
+
+	/* fast check if any bit is set, check details later */
+	tmp = status & (GRSPW2_STATUS_IA | GRSPW2_STATUS_PE | GRSPW2_STATUS_DE
+			| GRSPW2_STATUS_ER | GRSPW2_STATUS_CE);
+
+	if (!tmp)
+		return 0;
+
+
+	if (status & GRSPW2_STATUS_IA) {
+		errno = E_SPW_INVALID_ADDR_ERROR;
+		grspw2_handle_error(MEDIUM);
+		status &= GRSPW2_STATUS_IA;
+	}
+
+	if (status & GRSPW2_STATUS_PE) {
+		errno = E_SPW_PARITY_ERROR;
+		grspw2_handle_error(MEDIUM);
+		status &= GRSPW2_STATUS_PE;
+	}
+
+	if (status & GRSPW2_STATUS_DE) {
+		errno = E_SPW_DISCONNECT_ERROR;
+		grspw2_handle_error(MEDIUM);
+		status &= GRSPW2_STATUS_DE;
+	}
+
+	if (status & GRSPW2_STATUS_ER) {
+		errno = E_SPW_ESCAPE_ERROR;
+		grspw2_handle_error(MEDIUM);
+		status &= GRSPW2_STATUS_ER;
+	}
+
+	if (status & GRSPW2_STATUS_CE) {
+		errno = E_SPW_CREDIT_ERROR;
+		grspw2_handle_error(MEDIUM);
+		status &= GRSPW2_STATUS_CE;
+	}
+
+	iowrite32be(status, &cfg->regs->status);
+
+	return 0;
+}
+
+
+/**
+ *
+ * @brief stop DMA channel operation
+ *	- preserve channel settings (bits 12-16)
+ *	- set abort TX bit (9)
+ *	- clear status and descriptor bits (all others)
+ */
+
+static void grspw2_dma_stop(struct grspw2_regs *regs, uint32_t channel)
+{
+	uint32_t dmactrl;
+
+
+	dmactrl  = ioread32be(&regs->dma[channel].ctrl_status);
+	dmactrl &= (GRSPW2_DMACONTROL_LE | GRSPW2_DMACONTROL_SP
+		    | GRSPW2_DMACONTROL_SA | GRSPW2_DMACONTROL_EN
+		    | GRSPW2_DMACONTROL_NS);
+	dmactrl |= GRSPW2_DMACONTROL_AT;
+
+	iowrite32be(dmactrl, &regs->dma[channel].ctrl_status);
+}
+
+
+/**
+ * @brief reset a DMA channel
+ */
+
+static void grspw2_dma_reset(struct grspw2_regs *regs, uint32_t channel)
+{
+	uint32_t dmactrl;
+
+
+	dmactrl  = ioread32be(&regs->dma[channel].ctrl_status);
+	dmactrl &= (GRSPW2_DMACONTROL_LE | GRSPW2_DMACONTROL_EN);
+
+	iowrite32be(dmactrl,		&regs->dma[channel].ctrl_status);
+
+	iowrite32be(GRSPW2_DEFAULT_MTU,	&regs->dma[channel].rx_max_pkt_len);
+	iowrite32be(0x0,		&regs->dma[channel].tx_desc_table_addr);
+	iowrite32be(0x0,		&regs->dma[channel].rx_desc_table_addr);
+}
+
+
+/**
+ * @brief enable AHB error interrupt generation
+ */
+static void grspw2_set_ahb_irq(struct grspw2_core_cfg *cfg)
+{
+	uint32_t dmactrl;
+
+	dmactrl  = ioread32be(&cfg->regs->dma[0].ctrl_status);
+	dmactrl |= GRSPW2_DMACONTROL_AI;
+	iowrite32be(dmactrl, &cfg->regs->dma[0].ctrl_status);
+}
+
+#if (__unused__)
+/**
+ * @brief disable AHB error interrupt generation
+ */
+static void grspw2_unset_ahb_irq(struct grspw2_core_cfg *cfg)
+{
+	uint32_t dmactrl;
+
+	dmactrl  = ioread32be(&cfg->regs->dma[0].ctrl_status);
+	dmactrl &= ~GRSPW2_DMACONTROL_AI;
+}
+#endif
+
+/**
+ * @brief soft reset a SpW core
+ *	- do NOT touch control register!
+ *	- clear status bits
+ *	- clear timer register
+ */
+
+static void grspw2_spw_softreset(struct grspw2_regs *regs)
+{
+	uint32_t ctrl, status, i;
+
+
+	ctrl = ioread32be(&regs->ctrl);
+
+	for (i = 0; i < GRSPW2_CTRL_GET_NCH(ctrl); i++)
+		grspw2_dma_reset(regs, i);
+
+	status  = ioread32be(&regs->status);
+	status |= (GRSPW2_STATUS_TO | GRSPW2_STATUS_CE | GRSPW2_STATUS_ER
+		   | GRSPW2_STATUS_DE | GRSPW2_STATUS_PE | GRSPW2_STATUS_IA
+		   | GRSPW2_STATUS_EE);
+
+	iowrite32be(status, &regs->status);
+	iowrite32be(0x0,    &regs->time);
+}
+
+
+/**
+ * @brief hard reset a SpW core
+ *	- set reset bit high
+ *	- clear timer register
+ */
+
+void grspw2_spw_hardreset(struct grspw2_regs *regs)
+{
+	uint32_t ctrl;
+
+
+	ctrl  = ioread32be(&regs->ctrl);
+	ctrl |= GRSPW2_CTRL_RS;
+
+	iowrite32be(ctrl, &regs->ctrl);
+	iowrite32be(0x0,  &regs->time);
+}
+
+/**
+ * stop operation on a particular SpW link
+ *	- stop all of the links DMA channels
+ *	- keep link enabled (and do not touch the reset bit)
+ *	- disable interrrupts
+ *	- disable promiscuous mode
+ *	- disable timecode reception/transmission
+ *	- keep port force/select setting
+ *	=> RMAP operation is not stopped on RMAP-capable links
+ */
+
+static void grspw2_spw_stop(struct grspw2_regs *regs)
+{
+	uint32_t ctrl, i;
+
+
+	ctrl = ioread32be(&regs->ctrl);
+
+	for (i = 0; i < GRSPW2_CTRL_GET_NCH(ctrl); i++)
+		grspw2_dma_stop(regs, i);
+
+	ctrl &= (GRSPW2_CTRL_LD | GRSPW2_CTRL_LS | GRSPW2_CTRL_NP
+		 | GRSPW2_CTRL_AS | GRSPW2_CTRL_RE | GRSPW2_CTRL_RD
+		 | GRSPW2_CTRL_PS | GRSPW2_CTRL_NP);
+
+	iowrite32be(ctrl, &regs->ctrl);
+}
+
+/**
+ * @brief set the address of a SpW node
+ */
+
+static void grspw2_set_node_addr(struct grspw2_regs *regs, uint8_t nodeaddr)
+{
+	iowrite32be((nodeaddr & GRSPW2_DMA_CHANNEL_ADDR_REG_MASK),
+		    &regs->nodeaddr);
+}
+
+
+/**
+ * @brief enable promiscuous mode
+ */
+
+void grspw2_set_promiscuous(struct grspw2_core_cfg *cfg)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&cfg->regs->ctrl);
+	ctrl |= GRSPW2_CTRL_PM;
+
+	iowrite32be(ctrl, &cfg->regs->ctrl);
+}
+
+
+/**
+ * @brief disable promiscuous mode
+ */
+
+void grspw2_unset_promiscuous(struct grspw2_core_cfg *cfg)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&cfg->regs->ctrl);
+	ctrl &= ~GRSPW2_CTRL_PM;
+
+	iowrite32be(ctrl, &cfg->regs->ctrl);
+}
+
+
+/**
+ * @brief enable autostart
+ */
+
+static void grspw2_set_autostart(struct grspw2_core_cfg *cfg)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&cfg->regs->ctrl);
+	ctrl |= GRSPW2_CTRL_AS;
+	iowrite32be(ctrl, &cfg->regs->ctrl);
+}
+
+
+#if (__unused__)
+/**
+ * @brief disable autostart
+ */
+
+static void grspw2_unset_autostart(struct grspw2_core_cfg *cfg)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&cfg->regs->ctrl);
+	ctrl &= ~GRSPW2_CTRL_AS;
+	iowrite32be(ctrl, &cfg->regs->ctrl);
+}
+#endif
+
+
+/**
+ * @brief enable linkstart
+ */
+
+static void grspw2_set_linkstart(struct grspw2_core_cfg *cfg)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&cfg->regs->ctrl);
+	ctrl |= GRSPW2_CTRL_LS;
+	iowrite32be(ctrl, &cfg->regs->ctrl);
+}
+
+
+#if (__unused__)
+/**
+ * @brief disable linkstart
+ */
+
+static void grspw2_unset_linkstart(struct grspw2_core_cfg *cfg)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&cfg->regs->ctrl);
+	ctrl &= ~GRSPW2_CTRL_LS;
+	iowrite32be(ctrl, &cfg->regs->ctrl);
+}
+#endif
+
+
+/**
+ * @brief enable link error interrupts
+ */
+
+void grspw2_set_link_error_irq(struct grspw2_core_cfg *cfg)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&cfg->regs->ctrl);
+	ctrl |= GRSPW2_CTRL_LI | GRSPW2_CTRL_IE;
+	iowrite32be(ctrl, &cfg->regs->ctrl);
+}
+
+
+/**
+ * @brief disable link error interrupts
+ */
+
+void grspw2_unset_link_error_irq(struct grspw2_core_cfg *cfg)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&cfg->regs->ctrl);
+	ctrl &= ~(GRSPW2_CTRL_LI | GRSPW2_CTRL_IE);
+	iowrite32be(ctrl, &cfg->regs->ctrl);
+}
+
+
+/**
+ * @brief enable time code reception
+ */
+
+void grspw2_set_time_rx(struct grspw2_core_cfg *cfg)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&cfg->regs->ctrl);
+	ctrl |= GRSPW2_CTRL_TR;
+	iowrite32be(ctrl, &cfg->regs->ctrl);
+}
+
+
+/**
+ * @brief enable time code transmission
+ */
+
+static void grspw2_set_time_tx(struct grspw2_core_cfg *cfg)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&cfg->regs->ctrl);
+	ctrl |= GRSPW2_CTRL_TT;
+	iowrite32be(ctrl, &cfg->regs->ctrl);
+}
+
+
+#if (__unused__)
+/**
+ * @brief disable time code transmission
+ */
+
+static void grspw2_unset_time_tx(struct grspw2_core_cfg *cfg)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&cfg->regs->ctrl);
+	ctrl &= ~GRSPW2_CTRL_TT;
+	iowrite32be(ctrl, &cfg->regs->ctrl);
+}
+#endif
+
+
+
+/**
+ * @brief clear status register bits
+ */
+
+static void grspw2_clear_status(struct grspw2_core_cfg *cfg)
+{
+	uint32_t status;
+
+	status  = ioread32be(&cfg->regs->status);
+	status |= GRSPW2_STATUS_CLEAR_MASK;
+	iowrite32be(status, &cfg->regs->status);
+}
+
+/**
+ * @brief set Receive Interrupt enable bit in the DMA register
+ */
+__attribute__((unused))
+static void grspw2_rx_interrupt_enable(struct grspw2_core_cfg *cfg)
+{
+	uint32_t flags;
+
+	flags  = ioread32be(&cfg->regs->dma[0].ctrl_status);
+	flags |= GRSPW2_DMACONTROL_RI;
+
+	iowrite32be(flags, &cfg->regs->dma[0].ctrl_status);
+}
+
+/**
+ * @brief clear Receive Interrupt enable bit in the DMA register
+ */
+
+__attribute__((unused))
+static void grspw2_rx_interrupt_disable(struct grspw2_core_cfg *cfg)
+{
+	uint32_t flags;
+
+	flags  = ioread32be(&cfg->regs->dma[0].ctrl_status);
+	flags &= ~GRSPW2_DMACONTROL_RI;
+
+	iowrite32be(flags, &cfg->regs->dma[0].ctrl_status);
+}
+
+
+#if (__unused__)
+/**
+ * @brief set Transmit Interrupt enable bit in the DMA register
+ */
+
+static void grspw2_tx_interrupt_enable(struct grspw2_core_cfg *cfg)
+{
+	uint32_t flags;
+
+	flags  = ioread32be(&cfg->regs->dma[0].ctrl_status);
+	flags |= GRSPW2_DMACONTROL_TI;
+
+	iowrite32be(flags, &cfg->regs->dma[0].ctrl_status);
+}
+#endif
+
+
+#if (__unused__)
+/**
+ * @brief clear Transmit Interrupt enable bit in the DMA register
+ */
+
+static void grspw2_tx_interrupt_disable(struct grspw2_core_cfg *cfg)
+{
+	uint32_t flags;
+
+	flags  = ioread32be(&cfg->regs->dma[0].ctrl_status);
+	flags &= ~GRSPW2_DMACONTROL_TI;
+
+	iowrite32be(flags, &cfg->regs->dma[0].ctrl_status);
+}
+#endif
+
+
+/**
+ * @brief enable tick out interrupt
+ */
+
+void grspw2_tick_out_interrupt_enable(struct grspw2_core_cfg *cfg)
+{
+	uint32_t flags;
+
+	flags  = ioread32be(&cfg->regs->ctrl);
+	flags |= GRSPW2_CTRL_TQ;
+
+	iowrite32be(flags, &cfg->regs->ctrl);
+
+}
+
+
+/**
+ * @brief set SpW clock divisor
+ *
+ * Note: divides the external clock
+ * Note: inputs are ACTUAL divisor values
+ */
+
+static int32_t grspw2_set_clockdivs(struct grspw2_regs *regs,
+				    uint8_t link_start,
+				    uint8_t link_run)
+{
+	uint32_t clkdiv;
+
+	if (link_start && link_run) {
+		/** (actual divisor value = reg value + 1) */
+		clkdiv  = ((link_start - 1) << GRSPW2_CLOCKDIV_START_BIT)
+			& GRSPW2_CLOCKDIV_START_MASK;
+		clkdiv |= (link_run - 1) & GRSPW2_CLOCKDIV_RUN_MASK;
+
+		iowrite32be(clkdiv, &regs->clkdiv);
+
+		return 0;
+
+	} else {
+		errno = E_SPW_CLOCKS_INVALID;
+		return -1;
+	}
+}
+
+
+/**
+ * @brief set the rx descriptor table address; can be used to
+ *        switch between multiple descriptor tables
+ */
+
+static int32_t grspw2_set_rx_desc_table_addr(struct grspw2_core_cfg *cfg,
+					     uint32_t *mem)
+{
+	if (!mem) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	if (((uint32_t) mem) & GRSPW2_DESCRIPTOR_TABLE_MEM_BLOCK_ALIGN) {
+		errno = E_SPW_RX_DESC_TABLE_ALIGN;
+		return -1;
+	}
+
+	iowrite32be(((uint32_t) mem), &cfg->regs->dma[0].rx_desc_table_addr);
+
+	return 0;
+}
+
+
+/**
+ * @brief set the tx descriptor table address; can be used to
+ *        switch between multiple descriptor tables
+ */
+
+static int32_t grspw2_set_tx_desc_table_addr(struct grspw2_core_cfg *cfg,
+					     uint32_t *mem)
+{
+	if (!mem) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	if (((uint32_t) mem) & GRSPW2_DESCRIPTOR_TABLE_MEM_BLOCK_ALIGN) {
+		errno = E_SPW_TX_DESC_TABLE_ALIGN;
+		return -1;
+	}
+
+	iowrite32be(((uint32_t) mem), &cfg->regs->dma[0].tx_desc_table_addr);
+
+	return 0;
+}
+
+
+/**
+ * @brief init rx descriptor table pointers and attach to "free" list
+ */
+
+int32_t grspw2_rx_desc_table_init(struct grspw2_core_cfg *cfg,
+				  uint32_t *mem,     uint32_t  tbl_size,
+				  uint8_t  *pkt_buf, uint32_t  pkt_size)
+{
+	size_t i;
+
+	uint32_t idx;
+	uint32_t num_desc;
+
+
+	if (!pkt_buf) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	if (grspw2_set_rx_desc_table_addr(cfg, mem))
+		return -1; /* errno set in call */
+
+	INIT_LIST_HEAD(&cfg->rx_desc_ring_used);
+	INIT_LIST_HEAD(&cfg->rx_desc_ring_free);
+
+	num_desc = tbl_size / GRSPW2_RX_DESC_SIZE;
+
+	if (num_desc > GRSPW2_RX_DESCRIPTORS)
+		num_desc = GRSPW2_RX_DESCRIPTORS;
+
+	for (i = 0; i < num_desc; i++) {
+
+		idx = i * GRSPW2_RX_DESC_SIZE / sizeof(uint32_t);
+		cfg->rx_desc_ring[i].desc = (struct grspw2_rx_desc *) &mem[idx];
+
+		idx = i * pkt_size;
+		cfg->rx_desc_ring[i].desc->pkt_addr = (uint32_t) &pkt_buf[idx];
+
+		/* control flags must be set elsewhere */
+		cfg->rx_desc_ring[i].desc->pkt_ctrl = pkt_size;
+
+		list_add_tail(&cfg->rx_desc_ring[i].node,
+			      &cfg->rx_desc_ring_free);
+	}
+
+	return 0;
+}
+
+
+/**
+ * @brief init tx descriptor table pointers and attach to "free" list
+ */
+
+int32_t grspw2_tx_desc_table_init(struct grspw2_core_cfg *cfg,
+				  uint32_t *mem,     uint32_t  tbl_size,
+				  uint8_t *hdr_buf,  uint32_t  hdr_size,
+				  uint8_t *data_buf, uint32_t  data_size)
+{
+	uint32_t i;
+	uint32_t idx;
+	uint32_t num_desc;
+
+
+	if (!data_buf) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	if (hdr_size && !hdr_buf) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	if (grspw2_set_tx_desc_table_addr(cfg, mem))
+		return -1; /* errno set in call */
+
+	INIT_LIST_HEAD(&cfg->tx_desc_ring_used);
+	INIT_LIST_HEAD(&cfg->tx_desc_ring_free);
+
+	num_desc = tbl_size / GRSPW2_TX_DESC_SIZE;
+
+	if (num_desc > GRSPW2_TX_DESCRIPTORS)
+		num_desc = GRSPW2_TX_DESCRIPTORS;
+
+	for (i = 0; i < num_desc; i++) {
+
+		idx = i * GRSPW2_TX_DESC_SIZE / sizeof(uint32_t);
+		cfg->tx_desc_ring[i].desc = (struct grspw2_tx_desc *) &mem[idx];
+
+		idx = i * hdr_size;
+		cfg->tx_desc_ring[i].desc->hdr_addr = (uint32_t) &hdr_buf[idx];
+
+		idx = i * data_size;
+		cfg->tx_desc_ring[i].desc->data_addr = (uint32_t)
+								&data_buf[idx];
+
+		cfg->tx_desc_ring[i].desc->hdr_size  = hdr_size;
+		cfg->tx_desc_ring[i].desc->data_size = data_size;
+
+		/* clear packet control field, so random bits do not
+		 * mark the descriptor as enabled
+		 */
+		cfg->tx_desc_ring[i].desc->pkt_ctrl  = 0;
+
+		list_add_tail(&cfg->tx_desc_ring[i].node,
+			      &cfg->tx_desc_ring_free);
+	}
+
+	return 0;
+}
+
+/**
+ * @brief inform the core that new rx descriptors are available
+ */
+
+
+static void grspw2_rx_desc_new_avail(struct grspw2_core_cfg *cfg)
+{
+	uint32_t flags;
+
+	flags  = ioread32be(&cfg->regs->dma[0].ctrl_status);
+	flags |= GRSPW2_DMACONTROL_RD | GRSPW2_DMACONTROL_RE;
+
+	iowrite32be(flags, &cfg->regs->dma[0].ctrl_status);
+}
+
+
+/**
+ * @brief inform the core that new tx descriptors are available
+ */
+
+static void grspw2_tx_desc_new_avail(struct grspw2_core_cfg *cfg)
+{
+	uint32_t flags;
+
+	flags  = ioread32be(&cfg->regs->dma[0].ctrl_status);
+	flags |= GRSPW2_DMACONTROL_TE;
+
+	iowrite32be(flags, &cfg->regs->dma[0].ctrl_status);
+}
+
+
+/**
+ * @brief	move a rx descriptor to the free ring
+ */
+
+static void grspw2_rx_desc_move_free(struct grspw2_core_cfg *cfg,
+			      struct grspw2_rx_desc_ring_elem *p_elem)
+{
+	list_move_tail(&p_elem->node, &cfg->rx_desc_ring_free);
+}
+
+
+/**
+ * @brief	move a tx descriptor to the free ring
+ */
+
+static void grspw2_tx_desc_move_free(struct grspw2_core_cfg *cfg,
+			      struct grspw2_tx_desc_ring_elem *p_elem)
+{
+	list_move_tail(&p_elem->node, &cfg->tx_desc_ring_free);
+}
+
+
+/**
+ * @brief	move all inactive tx descriptors to the free ring
+ */
+
+__attribute__((unused))
+static void grspw2_tx_desc_move_free_all(struct grspw2_core_cfg *cfg)
+{
+	struct grspw2_tx_desc_ring_elem *p_elem;
+	struct grspw2_tx_desc_ring_elem *p_tmp;
+
+	list_for_each_entry_safe(p_elem, p_tmp,
+				 &cfg->tx_desc_ring_used, node) {
+
+		if (p_elem->desc->pkt_ctrl & GRSPW2_TX_DESC_EN)
+			break;
+
+		grspw2_tx_desc_move_free(cfg, p_elem);
+	}
+}
+
+
+/*
+ * @brief	clear the busy ring of all rx descriptors (and move them
+ *		to the free ring)
+ */
+
+__attribute__((unused))
+static void grspw2_rx_desc_clear_all(struct grspw2_core_cfg *cfg)
+{
+	struct grspw2_rx_desc_ring_elem *p_elem;
+	struct grspw2_rx_desc_ring_elem *p_tmp;
+
+	list_for_each_entry_safe(p_elem, p_tmp,
+				 &cfg->rx_desc_ring_used, node) {
+
+		grspw2_rx_desc_move_free(cfg, p_elem);
+	}
+}
+
+
+/**
+ * @brief	move a rx descriptor to the busy ring
+ */
+
+static void grspw2_rx_desc_move_busy(struct grspw2_core_cfg *cfg,
+			      struct grspw2_rx_desc_ring_elem *p_elem)
+{
+	list_move_tail(&p_elem->node, &cfg->rx_desc_ring_used);
+}
+
+
+/**
+ * @brief	move a tx descriptor to the busy ring
+ */
+
+static void grspw2_tx_desc_move_busy(struct grspw2_core_cfg *cfg,
+			      struct grspw2_tx_desc_ring_elem *p_elem)
+{
+	list_move_tail(&p_elem->node, &cfg->tx_desc_ring_used);
+
+}
+
+
+
+/**
+ * @brief	retrieve a free rx descriptor
+ */
+
+static struct grspw2_rx_desc_ring_elem
+	*grspw2_rx_desc_get_next_free(struct grspw2_core_cfg *cfg)
+{
+	struct grspw2_rx_desc_ring_elem *p_elem;
+
+	if (likely(list_filled(&cfg->rx_desc_ring_free))) {
+		p_elem = list_entry((&cfg->rx_desc_ring_free)->next,
+				    struct grspw2_rx_desc_ring_elem, node);
+		return p_elem;
+	} else {
+		return NULL;
+	}
+}
+
+/**
+ * @brief	retrieve a busy rx descriptor
+ */
+
+static struct grspw2_rx_desc_ring_elem
+	*grspw2_rx_desc_get_next_used(struct grspw2_core_cfg *cfg)
+{
+	struct grspw2_rx_desc_ring_elem *p_elem;
+
+	if (likely(list_filled(&cfg->rx_desc_ring_used))) {
+		p_elem = list_entry((&cfg->rx_desc_ring_used)->next,
+				    struct grspw2_rx_desc_ring_elem, node);
+		return p_elem;
+	} else {
+		return NULL;
+	}
+}
+
+
+/**
+ * @brief	retrieve a free tx descriptor
+ */
+
+static struct grspw2_tx_desc_ring_elem
+		*grspw2_tx_desc_get_next_free(struct grspw2_core_cfg *cfg)
+{
+	struct grspw2_tx_desc_ring_elem *p_elem;
+
+	if (likely(list_filled(&cfg->tx_desc_ring_free))) {
+		p_elem = list_entry((&cfg->tx_desc_ring_free)->next,
+				    struct grspw2_tx_desc_ring_elem, node);
+		return p_elem;
+	} else {
+		return NULL;
+	}
+}
+
+
+/**
+ * @brief	set tx descriptor active
+ * @note	per-packet interrupt are enabled by default, enable rx irq
+ *		in dma control register to have them actually fire
+ */
+
+static void grspw2_rx_desc_set_active(struct grspw2_rx_desc_ring_elem *p_elem)
+{
+	p_elem->desc->pkt_ctrl |= GRSPW2_RX_DESC_IE | GRSPW2_RX_DESC_EN;
+}
+
+
+/**
+ * @brief	set tx descriptor active
+ */
+
+static void grspw2_tx_desc_set_active(struct grspw2_tx_desc_ring_elem *p_elem)
+{
+	p_elem->desc->pkt_ctrl |= GRSPW2_TX_DESC_IE | GRSPW2_TX_DESC_EN;
+}
+
+/**
+ * @brief	check if there are rx descriptors in the free ring
+ *
+ * @return	1 if available, 0 if ring is empty
+ */
+
+static int32_t grspw2_rx_desc_avail(struct grspw2_core_cfg *cfg)
+{
+	if (likely(list_filled(&cfg->rx_desc_ring_free)))
+		return 1;
+	else
+		return 0;
+}
+
+
+#if (__unused__)
+/**
+ * @brief	check if there are tx descriptors in the free ring
+ *
+ * @return	1 if available, 0 if ring is empty
+ */
+
+static int32_t grspw2_tx_desc_avail(struct grspw2_core_cfg *cfg)
+{
+	if (likely(list_filled(&cfg->tx_desc_ring_free)))
+		return 1;
+	else
+		return 0;
+}
+#endif
+
+
+/**
+ * @brief	try to activate a free descriptor
+ * @return	0 on success, -1 if no descriptor is available
+ *
+ * @note There is no check for NULL on grspw2_rx_desc_get_next_free(), because
+ *       it would be redundant, since a positive return on
+ *       grspw2_rx_desc_avail() guarantees the availability of a descriptor
+ *       element. (Unless someone maliciously fiddles with our lists
+ *       externally). We could of course check anyway, but this function should
+ *       be snappy, if we can avoid something clearly useless, we should.
+ */
+
+static int32_t grspw2_rx_desc_add(struct grspw2_core_cfg *cfg)
+{
+	struct grspw2_rx_desc_ring_elem *p_elem;
+
+
+	if (!grspw2_rx_desc_avail(cfg))
+		return -1;
+	/* 
+	   The case p_elem == NULL is taken care for by the above check. 
+	   Also see the note in the function description.
+	*/
+	p_elem = grspw2_rx_desc_get_next_free(cfg);
+
+	grspw2_rx_desc_set_active(p_elem);
+
+	grspw2_rx_desc_move_busy(cfg, p_elem);
+
+	grspw2_rx_desc_new_avail(cfg);
+
+	return 0;
+}
+
+
+static void grswp2_rx_desc_add_all(struct grspw2_core_cfg *cfg)
+{
+	size_t i;
+
+	for (i = 0; i < GRSPW2_RX_DESCRIPTORS; i++) {
+		if (grspw2_rx_desc_add(cfg))
+			break;
+	}
+}
+
+
+#if (__unused__)
+/**
+ * @brief set up a RX descriptor with a custom address and control field
+ *
+ * @return 0 on success, -1 if no descriptors were available
+ */
+
+static int32_t grspw2_rx_desc_add_custom(struct grspw2_core_cfg *cfg,
+				  uint32_t pkt_ctrl,
+				  uint32_t pkt_addr)
+{
+
+	struct grspw2_rx_desc_ring_elem *p_elem;
+
+	p_elem = grspw2_rx_desc_get_next_free(cfg);
+
+	if (unlikely(!p_elem)) {
+		errno = E_SPW_NO_RX_DESC_AVAIL;
+		return -1;
+	}
+
+	/* ALWAYS set packet address first! */
+	p_elem->desc->pkt_addr = pkt_addr;
+	p_elem->desc->pkt_ctrl = pkt_ctrl;
+
+	list_move_tail(&p_elem->node, &cfg->rx_desc_ring_used);
+
+	grspw2_rx_desc_new_avail(cfg);
+
+	return 0;
+}
+#endif
+
+
+/**
+ * @brief	release and try to reactivate a descriptor
+ * @return	0 on success, -1 if no descriptor is available
+ */
+
+static int32_t grspw2_rx_desc_readd(struct grspw2_core_cfg *cfg,
+			     struct grspw2_rx_desc_ring_elem *p_elem)
+{
+	grspw2_rx_desc_move_free(cfg, p_elem);
+
+	return grspw2_rx_desc_add(cfg);
+}
+
+/**
+ * @brief	try to activate a free descriptor and copy the data from the
+ *		supplied buffer
+ *
+ * @return	0 on success, -1 on failure
+ *
+ * @note	USE WITH CARE: does not perform any size checks on the buffers
+ *
+ */
+
+static int32_t grspw2_tx_desc_add_pkt(struct grspw2_core_cfg *cfg,
+			       const void *hdr_buf,
+			       uint32_t hdr_size,
+			       const void *data_buf,
+			       uint32_t data_size)
+{
+	struct grspw2_tx_desc_ring_elem *p_elem;
+
+
+	/* this is a little excessive, remove on your own risk */
+
+	if (hdr_size && !hdr_buf) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	if (data_size && !data_buf) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	grspw2_tx_desc_move_free_all(cfg);
+
+	p_elem = grspw2_tx_desc_get_next_free(cfg);
+
+
+	if (unlikely(!p_elem)) {
+		errno = E_SPW_NO_TX_DESC_AVAIL;
+		return -1;
+	}
+
+	if (hdr_buf != NULL)
+		memcpy((void *) p_elem->desc->hdr_addr,  hdr_buf,  hdr_size);
+
+	if (data_buf != NULL)
+		memcpy((void *) p_elem->desc->data_addr, data_buf, data_size);
+
+	p_elem->desc->hdr_size  = hdr_size;
+	p_elem->desc->data_size = data_size;
+
+	grspw2_tx_desc_set_active(p_elem);
+
+	grspw2_tx_desc_move_busy(cfg, p_elem);
+
+	grspw2_tx_desc_new_avail(cfg);
+
+	return 0;
+
+}
+
+
+#if (__unused__)
+/**
+ * @brief set up a TX descriptor with a custom header/data and control field.
+ *
+ * @return 0 on success, -1 if no descriptors were available
+ */
+
+static int32_t grspw2_tx_desc_add_custom(struct grspw2_core_cfg *cfg,
+				  uint32_t pkt_ctrl,
+				  uint32_t hdr_size,
+				  uint32_t hdr_addr,
+				  uint32_t data_size,
+				  uint32_t data_addr)
+{
+	struct grspw2_tx_desc_ring_elem *p_elem;
+
+
+	grspw2_tx_desc_move_free_all(cfg);
+
+	p_elem = grspw2_tx_desc_get_next_free(cfg);
+
+	if (unlikely(!p_elem)) {
+		errno = E_SPW_NO_TX_DESC_AVAIL;
+		return -1;
+	}
+
+	p_elem->desc->hdr_size = hdr_size;
+	p_elem->desc->hdr_addr = hdr_addr;
+
+	p_elem->desc->data_size = data_size;
+	p_elem->desc->data_addr = data_addr;
+
+	p_elem->desc->pkt_ctrl = pkt_ctrl;
+
+	list_move_tail(&p_elem->node, &cfg->tx_desc_ring_used);
+
+	grspw2_tx_desc_new_avail(cfg);
+
+	return 0;
+}
+#endif
+
+/**
+ *  @brief configure maximum transmission unit
+ */
+
+static void grspw2_set_mtu(struct grspw2_core_cfg *cfg, uint32_t mtu)
+{
+	iowrite32be(mtu, &cfg->regs->dma[0].rx_max_pkt_len);
+}
+
+
+/**
+ * @brief default dma configuration, see GR712RC UM, p.128 for flags
+ */
+
+static void grspw2_configure_dma(struct grspw2_core_cfg *cfg)
+{
+	uint32_t flags;
+
+	flags = GRSPW2_DMACONTROL_AI | GRSPW2_DMACONTROL_PS
+		| GRSPW2_DMACONTROL_PR | GRSPW2_DMACONTROL_TA
+		| GRSPW2_DMACONTROL_RA | GRSPW2_DMACONTROL_NS;
+
+	iowrite32be(flags, &cfg->regs->dma[0].ctrl_status);
+}
+
+
+/**
+ * @brief get timecnt field of grspw2 time register
+ */
+
+uint32_t grspw2_get_timecnt(struct grspw2_core_cfg *cfg)
+{
+	return ioread32be(&cfg->regs->time) & GRSPW2_TIME_TIMECNT;
+}
+
+
+
+/**
+ * @brief get link status
+ */
+
+uint32_t grspw2_get_link_status(struct grspw2_core_cfg *cfg)
+{
+	return GRSPW2_STATUS_GET_LS(ioread32be(&cfg->regs->status));
+}
+
+
+
+/**
+ * @brief transmit a SpW time code; there should be at least 4 system
+ *        clocks and 25 transmit clocks inbetween calls, see GR712RC UM, p.108
+ */
+
+void grspw2_tick_in(struct grspw2_core_cfg *cfg)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&cfg->regs->ctrl);
+	ctrl |= GRSPW2_CTRL_TI;
+
+	iowrite32be(ctrl, &cfg->regs->ctrl);
+}
+
+#if (__SPW_ROUTING__)
+/**
+ * @brief	interrupt handler for packet routing
+ * @note	only a single node is supported at the moment
+ */
+
+int32_t grspw2_route(void *userdata)
+{
+	int32_t ret;
+
+	struct grspw2_core_cfg *cfg;
+
+	struct grspw2_rx_desc_ring_elem *p_elem;
+	struct grspw2_rx_desc_ring_elem *p_tmp;
+
+	cfg = (struct grspw2_core_cfg *) userdata;
+
+	list_for_each_entry_safe(p_elem, p_tmp, &cfg->rx_desc_ring_used, node) {
+
+		if (p_elem->desc->pkt_ctrl & GRSPW2_RX_DESC_EN)
+			break;
+
+		/* copy to output if there is a free tx descriptor */
+		ret = grspw2_tx_desc_add_pkt(cfg->route[0],
+					     NULL,
+					     0,
+					     (void *) p_elem->desc->pkt_addr,
+					     p_elem->desc->pkt_size);
+
+		if (unlikely(ret))
+			break;
+
+		grspw2_rx_desc_readd(cfg, p_elem);
+	}
+
+	grspw2_tx_desc_move_free_all(cfg->route[0]);
+
+	return 0;
+}
+
+
+/**
+ * @brief enable routing between SpW cores
+ */
+
+int32_t grspw2_enable_routing(struct grspw2_core_cfg *cfg,
+			      struct grspw2_core_cfg *route)
+{
+	size_t i;
+
+
+	cfg->route[0] = route;
+
+	irl2_register_callback(cfg->core_irq, PRIORITY_NOW,
+			       grspw2_route, (void *) cfg);
+
+
+	grspw2_set_promiscuous(cfg);
+	grspw2_rx_interrupt_enable(cfg);
+
+	/* only allow as many rx descriptors as there are tx descriptors
+	 * or we could run into a jam, because we do not use interrupts on TX
+	 * and hence do not reload the ring if it happens
+	 */
+	grspw2_rx_desc_clear_all(cfg);
+
+	for (i = 0; i < GRSPW2_TX_DESCRIPTORS; i++)
+		grspw2_rx_desc_add(cfg);
+
+	return 0;
+}
+
+
+/**
+ * @brief enable interactive routing between SpW cores
+ * @note call grspw2_route() to route received descriptors
+ */
+
+int32_t grspw2_enable_routing_noirq(struct grspw2_core_cfg *cfg,
+                                   struct grspw2_core_cfg *route)
+{
+	cfg->route[0] = route;
+
+	grspw2_set_promiscuous(cfg);
+
+	return 0;
+}
+
+
+
+/**
+ * @brief disable routing between SpW cores
+ */
+
+int32_t grspw2_disable_routing(struct grspw2_core_cfg *cfg)
+{
+	irl2_deregister_callback(cfg->core_irq, grspw2_route,
+				 (void *) cfg->route[0]);
+
+	grspw2_unset_promiscuous(cfg);
+	grspw2_rx_interrupt_disable(cfg);
+
+	return 0;
+}
+#endif /* (__SPW_ROUTING__) */
+
+
+/**
+ * @brief retrieve number of packets available
+ */
+
+uint32_t grspw2_get_num_pkts_avail(struct grspw2_core_cfg *cfg)
+{
+	uint32_t i = 0;
+
+	struct grspw2_rx_desc_ring_elem *p_elem;
+	struct grspw2_rx_desc_ring_elem *p_tmp;
+
+	list_for_each_entry_safe(p_elem, p_tmp, &cfg->rx_desc_ring_used, node) {
+		if (p_elem->desc->pkt_ctrl & GRSPW2_RX_DESC_EN)
+			break;
+		i++;
+	}
+
+	return i;
+}
+
+
+/**
+ * @brief get number of available free tx descriptors
+ */
+
+uint32_t grspw2_get_num_free_tx_desc_avail(struct grspw2_core_cfg *cfg)
+{
+	uint32_t i = 0;
+
+	struct grspw2_tx_desc_ring_elem *p_elem;
+	struct grspw2_tx_desc_ring_elem *p_tmp;
+
+	list_for_each_entry_safe(p_elem, p_tmp, &cfg->tx_desc_ring_free, node) {
+		i++;
+	}
+
+	return i;
+}
+
+
+/**
+ * @brief retrieve the size of the next packet
+ */
+
+uint32_t grspw2_get_next_pkt_size(struct grspw2_core_cfg *cfg)
+{
+	uint32_t pkt_size;
+
+	struct grspw2_rx_desc_ring_elem *p_elem;
+
+
+	p_elem = grspw2_rx_desc_get_next_used(cfg);
+
+	if (!p_elem)
+		return 0;
+
+	/* still active */
+	if (p_elem->desc->pkt_ctrl & GRSPW2_RX_DESC_EN)
+		return 0;
+
+	pkt_size = p_elem->desc->pkt_size - cfg->strip_hdr_bytes;
+
+	return pkt_size;
+}
+
+
+
+/**
+ * @brief retrieve a packet
+ */
+
+uint32_t grspw2_get_pkt(struct grspw2_core_cfg *cfg, uint8_t *pkt)
+{
+	uint32_t pkt_size;
+
+	struct grspw2_rx_desc_ring_elem *p_elem;
+
+
+	p_elem = grspw2_rx_desc_get_next_used(cfg);
+
+	if (!p_elem)
+		return 0;
+
+	/* still active */
+	if (p_elem->desc->pkt_ctrl & GRSPW2_RX_DESC_EN)
+		return 0;
+
+	pkt_size = p_elem->desc->pkt_size - cfg->strip_hdr_bytes;
+
+	cfg->rx_bytes += p_elem->desc->pkt_size;
+
+	memcpy((void *) pkt,
+	       (void *) (p_elem->desc->pkt_addr + cfg->strip_hdr_bytes),
+	       pkt_size);
+
+	grspw2_rx_desc_readd(cfg, p_elem);
+
+	return pkt_size;
+}
+
+/**
+ * @brief drop a packet
+ * @return 1 if packet was dropped, 0 otherwise
+ */
+
+uint32_t grspw2_drop_pkt(struct grspw2_core_cfg *cfg)
+{
+	struct grspw2_rx_desc_ring_elem *p_elem;
+
+
+	p_elem = grspw2_rx_desc_get_next_used(cfg);
+
+	if (!p_elem)
+		return 0;
+
+	/* still active */
+	if (p_elem->desc->pkt_ctrl & GRSPW2_RX_DESC_EN)
+		return 0;
+
+	cfg->rx_bytes += p_elem->desc->pkt_size;
+
+	grspw2_rx_desc_readd(cfg, p_elem);
+
+	return 1;
+}
+
+
+
+/**
+ * @brief add a packet
+ */
+
+int32_t grspw2_add_pkt(struct grspw2_core_cfg *cfg,
+			const void *hdr,  uint32_t hdr_size,
+			const void *data, uint32_t data_size)
+{
+	int32_t ret;
+
+	ret = grspw2_tx_desc_add_pkt(cfg, hdr, hdr_size, data, data_size);
+
+	if (unlikely(ret)) {
+		grspw2_handle_error(LOW);
+		return -1;
+	}
+
+	cfg->tx_bytes += hdr_size + data_size;
+
+	return 0;
+}
+
+
+/**
+  * @brief start core operation
+ */
+
+void grspw2_core_start(struct grspw2_core_cfg *cfg)
+{
+	grswp2_rx_desc_add_all(cfg);
+	grspw2_clear_status(cfg);
+	grspw2_set_linkstart(cfg);
+	grspw2_set_autostart(cfg);
+}
+
+
+/**
+ * @brief (re)initialise a grswp2 core
+ */
+#define SYSCTL_STRING_SIZE 8
+
+#if (__sparc__)
+#define SYSCTL_NAME_FORMAT	"spw%lu"
+#else
+#define SYSCTL_NAME_FORMAT	"spw%u"
+#endif
+
+
+int32_t grspw2_core_init(struct grspw2_core_cfg *cfg, uint32_t core_addr,
+			 uint8_t node_addr, uint8_t link_start,
+			 uint8_t link_run, uint32_t mtu,
+			 uint32_t core_irq, uint32_t ahb_irq,
+			 uint32_t strip_hdr_bytes)
+{
+	int32_t ret;
+
+	char *buf;
+
+
+	irq_dispatch_enable();
+
+	cfg->regs = (struct grspw2_regs *) core_addr;
+	cfg->core_irq = core_irq;
+	cfg->ahb_irq  = ahb_irq;
+
+	cfg->strip_hdr_bytes = strip_hdr_bytes;
+
+	grspw2_spw_stop(cfg->regs);
+	grspw2_spw_softreset(cfg->regs);
+	grspw2_set_node_addr(cfg->regs, node_addr);
+
+
+	irl1_deregister_callback(cfg->ahb_irq,  grspw2_dma_error,  cfg);
+	irl2_deregister_callback(cfg->core_irq, grspw2_link_error, cfg);
+
+
+	ret = grspw2_set_clockdivs(cfg->regs, link_start, link_run);
+	if (ret)
+		return -1;
+
+	grspw2_set_mtu(cfg, mtu);
+	grspw2_configure_dma(cfg);
+	grspw2_set_time_tx(cfg);
+
+	grspw2_set_ahb_irq(cfg);
+	grspw2_set_link_error_irq(cfg);
+
+	irl1_register_callback(cfg->ahb_irq, PRIORITY_NOW,
+			       grspw2_dma_error, cfg);
+
+	irl2_register_callback(cfg->core_irq, PRIORITY_NOW,
+			       grspw2_link_error, cfg);
+
+	cfg->rx_bytes = 0;
+	cfg->tx_bytes = 0;
+
+	/* as sysctl does not provide a _remove() function, make
+	 * sure that we do not re-add the same object to the sysctl tree
+	 */
+	if (cfg->sobj.sattr)
+		return 0;
+
+	sysobj_init(&cfg->sobj);
+
+	cfg->sobj.sattr = grspw2_attributes;
+
+	/* derive the spw link number from the interrupt number */
+	buf = (char *) malloc(SYSCTL_STRING_SIZE * sizeof(char));
+
+	snprintf(buf, SYSCTL_STRING_SIZE * sizeof(char), SYSCTL_NAME_FORMAT,
+		 core_irq - GR712_IRL2_GRSPW2_0);
+
+	sysobj_add(&cfg->sobj, NULL, driver_set, buf);
+
+	return 0;
+
+	/* NOTE: here CLANG scan-view reports a false positive
+	 *  about buf being a memory leak
+	 */
+}
+
+
+#if (__sparc__)
+/**
+ * set the external clock to the grspw2 core
+ * does not actually belong here...
+ */
+
+void set_gr712_spw_clock(void)
+{
+	uint32_t *gpreg = (uint32_t *) 0x80000600;
+
+	/** set input clock to 100 MHz INCLK */
+	(*gpreg) = (ioread32be(gpreg) & (0xFFFFFFF8));
+}
+#endif
diff --git a/IBSW/lib/ibsw_init/ibsw_init.c b/IBSW/lib/ibsw_init/ibsw_init.c
new file mode 100644
index 0000000..d9689cb
--- /dev/null
+++ b/IBSW/lib/ibsw_init/ibsw_init.c
@@ -0,0 +1,158 @@
+/**
+ * @file   ibsw.c
+ * @ingroup ibsw_config
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   September, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @defgroup ibsw_config IBSW initialisation
+ * @brief Setup and init functions for the various IBSW components
+ *
+ * This is the default IBSW configuration procedure:
+ *
+ * - configure IBSW timers
+ * - initialise interrupts
+ * - configure the error log location
+ * - configure SpaceWire devices
+ * - set up packet buffers
+ * - configure the 1553 core
+ * - run CrIaInit()
+ * - configure memscrub
+ * - enable edac
+ * - set up cyclical timing and sync pulse
+ * - enable FBF operations
+ * - enable CPU load measurements
+ * - enable watchdog
+ *
+ */
+
+
+#include <stdint.h>
+#include <stdlib.h>
+
+
+#include <string.h>
+#include <stdio.h>
+
+
+#include <leon/irq.h>
+#include <leon/irq_dispatch.h>
+
+#include <ibsw.h>
+#include <memcfg.h>
+#include <iwf_fpga.h>
+#include <wrap_malloc.h>
+#include <sysctl.h>
+#include <clkgate.h>
+#include <memscrub.h>
+
+#include <ibsw_interface.h>
+
+
+#define	GND_PKTS	(32 * 1024)
+#define OBC_PKTS	(32 * 1024)
+#define SPW_1_ADDR	36
+#define SPW_1_STRIP_HDR_BYTES 4
+
+#if (__SPW_ROUTING__)
+#define SPW_0_ADDR	0x15
+#define SPW_0_STRIP_HDR_BYTES 0
+#endif
+
+#define SES_HEADER_BYTES 4
+
+
+
+
+/**
+ * @brief ibsw initalisation
+ * @return 0 on success, otherwise error
+ */
+
+ssize_t ibsw_init(struct ibsw_config *cfg)
+{
+	struct grtimer_uptime time0, time1;
+
+
+	/* clear the configuration structure*/
+	bzero(cfg, sizeof(struct ibsw_config));
+
+	sysctl_init();
+
+	if (malloc_enable_syscfg())
+		return -1;
+
+	ibsw_configure_timing(&cfg->timer, &cfg->brm,
+			      &cfg->spw1);
+
+	/* measure boot time from timer initialisation */
+	grtimer_longcount_get_uptime(cfg->timer.rtu, &time0);
+
+	irq_dispatch_enable();
+
+	ibsw_configure_error_log(&cfg->error_log);
+
+	if (ibsw_configure_spw(&cfg->spw1, GRSPW2_BASE_CORE_1,
+			   GR712_IRL2_GRSPW2_1, SPW_1_ADDR, SES_HEADER_BYTES,
+			   SPW_1_STRIP_HDR_BYTES, CLKGATE_GRSPW1))
+		return -1;
+
+#if (__SPW_ROUTING__)
+	if (ibsw_configure_spw(&cfg->spw0, GRSPW2_BASE_CORE_0,
+			   GR712_IRL2_GRSPW2_0, SPW_0_ADDR, SES_HEADER_BYTES,
+			   SPW_0_STRIP_HDR_BYTES, CLKGATE_GRSPW0))
+		return -1;
+#endif
+
+
+	if (ibsw_configure_cpus(&cfg->pus_buf))
+		return -1;
+
+	if (ibsw_configure_ptrack(&cfg->pkt_gnd, GND_PKTS))
+		return -1;
+
+	if (ibsw_configure_ptrack(&cfg->pkt_obc, OBC_PKTS))
+		return -1;
+
+	if (ibsw_configure_1553(&cfg->brm, &cfg->pus_buf,
+				&cfg->pkt_gnd, &cfg->pkt_gnd,
+				&cfg->timer))
+		return -1;
+
+
+	if (CrIaInit() != 0)
+		return -1;
+
+	/* ... scrubbing is carried out at the end of the cyclical
+	 * thread instead
+	 */
+	memscrub_init();
+
+	ibsw_configure_1553_sync(&cfg->brm, &cfg->timer);
+
+	if (ibsw_configure_edac())
+		return -1;
+
+	timekeeper_set_signal_callback(&cfg->timer, &cyclical_notification,
+				       &cfg->timer);
+
+	/* enable FBF operations */
+	flash_operation.isReady = 1;
+
+	grtimer_longcount_get_uptime(cfg->timer.rtu, &time1);
+
+	ibsw_init_cpu_0_idle_timing(cfg);
+
+	CrIbEnableWd();
+
+	return 0;
+}
diff --git a/IBSW/lib/ibsw_init/ibsw_mainloop.c b/IBSW/lib/ibsw_init/ibsw_mainloop.c
new file mode 100644
index 0000000..5862474
--- /dev/null
+++ b/IBSW/lib/ibsw_init/ibsw_mainloop.c
@@ -0,0 +1,287 @@
+/**
+ * @file   ibsw_mainloop.c
+ * @ingroup ibsw_config
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   September, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief IBSW main loop running on CPU 0
+ *
+ *
+ * ## Overview
+ *
+ * This is the main loop of the IBSW. It is entered after initialisation
+ * has completed. Since the IFSW does not use threads, it functions as a
+ * collaborative scheduler stand-in. It represents the "highest priority"
+ * thread and hence controls the sleep state of the CPU and measures the CPU
+ * load.
+ *
+ * ## Mode of Operation
+ *
+ *
+ * ### Main Loop
+ *
+ * @startuml {ibsw_mainloop.svg} "IBSW Mainloop" width=10
+ * start
+ *
+ * repeat
+ *	 if (reset sampling window) then (yes)
+ *		:record sampling start time stamp;
+ *	endif
+ *
+ *	:record power down timestamp;
+ *	:issue CPU power down;
+ *
+ *	note
+ *	The CPU is now powered down until an interrupt occurs.
+ *	end note
+ *
+ *	if (IASW tick) then (yes)
+ *		:execute IASW cyclical;
+ *		:execute error log flush;
+ *		:execute FBF operation;
+ *	endif
+ *
+ *	:update sampling time window;
+ *	:update idle time;
+ *
+ *	if (sampling time > 125 ms) then (yes)
+ *	:update CPU load;
+ *	endif
+ *
+ * repeat while ()
+ *
+ *
+ * @enduml
+ *
+ * By default, the loop enters CPU power down mode. If woken by any interrupt,
+ * the "notification" counter for the IASW cycle is checked. If a value is set,
+ * a IASW cycle is executed and the counter is decremented, followed by an
+ * @ref error_log flush to @ref  iwf_flash and a flash-based-file read or write
+ * cycle (see @ref ibsw_interface, execute_flash_op(), CrIbFbfReadBlock(),
+ * CrIbFbfWriteBlock()).
+ *
+ * The CPU load is measured by recording the CPU power down time. Before the
+ * power down command is issued, the current time is recorded. The wake up time
+ * is taken in ibsw_update_cpu_0_idle() which is attached to the interrupts used
+ * in the IFSW and set at most once after a wake up from power down. This
+ * ensures that the timestamp is no updated in any subsequent interrupts while
+ * the CPU is busy. The power down time measurements are stacked withing a
+ * sampling window of at least 125 ms (the granularity of a IASW cycle is
+ * sufficient) and the load is calculated from
+ *
+ * \f[
+ *	load = int \left(100.0 \times \left[1.0 - \frac{t_{idle}}{t_{window}}\right]\right)
+ * \f]
+ *
+ *
+ * ### Cyclical Notifications
+ *
+ * A call to cyclical_notification() increments the notification counter used
+ * in the main loop. This function records a time stamp that is passed to
+ * execute_flash_op() as a cycle start reference together with a run time limit.
+ * This ensures that flash operations will not exceed the IASW cycle time window
+ * that starts with the notification (not the actual execution start time of the
+ * IASW cyclical activities).
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ * ## Notes
+ *
+ * None
+ *
+ */
+
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <leon/irq.h>
+#include <leon/irq_dispatch.h>
+#include <asm/leon.h>
+#include <core1553brm_as250.h>
+#include <grspw2.h>
+#include <cpus_buffers.h>
+#include <packet_tracker.h>
+
+#include <leon3_gptimer.h>
+#include <leon3_grtimer.h>
+#include <watchdog.h>
+#include <syncpulse.h>
+
+#include <error_log.h>
+#include <clkgate.h>
+#include <sysctl.h>
+
+#include <traps.h>
+#include <edac.h>
+#include <leon3_dsu.h>
+#include <memcfg.h>
+#include <memscrub.h>
+#include <iwf_fpga.h>
+#include <wrap_malloc.h>
+#include <ibsw_interface.h>
+
+
+
+
+#include <timing.h>
+#include <leon3_grtimer_longcount.h>
+
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+
+
+static uint32_t iasw_tick;
+static struct grtimer_uptime cyc_start;
+
+
+/**
+ * @brief cyclical notification callback
+ *
+ * @brief userdata a pointer to arbitrary userdata
+ */
+
+void cyclical_notification(void *userdata)
+{
+	struct time_keeper *timer = (struct time_keeper *) userdata;
+
+	/* get the time of the cyclical notification for cycle overrun detection */
+	if (!iasw_tick)
+		grtimer_longcount_get_uptime(timer->rtu, &cyc_start);
+
+	iasw_tick++;
+}
+
+
+/**
+ * @brief the main IBSW loop
+ *
+ * @param ibsw_cfg a struct ibsw_config
+ *
+ * This is the main IBSW loop after initalisation is complete.
+ * It will power down the LEON while no interrupts and/or threads are running.
+ * CPU load is measured via the processor idle time. A timestamp is taken before
+ * issuing powerdown mode, any subsequent (registered) interrupt will update
+ * the time of the wakeup. The idle times are accumulated until the
+ * sampling window is at least one second long. The computed cpu load is then
+ * stored as an integer with a load granularity of 1 percent
+ */
+
+void ibsw_mainloop(struct ibsw_config *cfg)
+{
+	uint32_t reset = 1;
+
+	double idle = 0.0;
+	double window, tmp;
+	double trem;
+
+	struct grtimer_uptime in;
+	struct grtimer_uptime out;
+	struct grtimer_uptime start;
+
+
+	while (1) {
+
+		if (reset) {
+			/* IASW polling rate = 8 Hz */
+			grtimer_longcount_get_uptime(cfg->timer.rtu,
+						     &start);
+
+			reset = 0;
+			idle  = 0.0;
+		}
+
+
+		grtimer_longcount_get_uptime(cfg->timer.rtu, &in);
+		leon3_powerdown_safe(0x40000000);
+
+
+		if (iasw_tick) {
+			/* execute RTCONT_CYC */
+			execute_cyclical();
+
+			/* execute RTCONT_ERRLOG only if enough time is left */
+			grtimer_longcount_get_uptime(cfg->timer.rtu, &out);
+
+			trem = grtimer_longcount_difftime(ibsw_cfg.timer.rtu,
+							  out, cyc_start);
+			if (trem < RUNBEFORE_ERRLOG)
+				execute_log_move_to_flash();
+
+			/* execute RTCONT_FLASH only if enough time is left */
+
+			/* NOTE: the block erase operation can take up to 10ms, 
+			   plus 3 ms per page write. Consequently, we have to 
+			   allow at least 13 ms here (1 erase + 1 page write). 
+			   This is, because the CrIbFbfWriteBlock writes at most
+			   1 page (4 kw = 16 kB) per call and at the beginning
+			   of a block this can result in one block erase plus
+			   one page write. */
+
+			grtimer_longcount_get_uptime(cfg->timer.rtu, &out);
+
+			trem = grtimer_longcount_difftime(ibsw_cfg.timer.rtu,
+							  out, cyc_start);
+			if (trem < RUNBEFORE_FLASH)
+				execute_flash_op(cyc_start);
+
+			iasw_tick--;
+		}
+
+		/* get the "wake up" time when main() actually continues to
+		 * determine the size of the sampling window;
+		 * the time stamp when actually leaving power down mode will be
+		 * registered in ibsw_update_cpu_0_idle()
+		 */
+		grtimer_longcount_get_uptime(cfg->timer.rtu, &out);
+
+
+		/* in case we are woken by something that is not covered
+		 * by the ISR
+		 */
+		if (!cfg->cpu_0_idle_exit.coarse)
+			if (!cfg->cpu_0_idle_exit.fine)
+				continue;
+
+		idle += grtimer_longcount_difftime(cfg->timer.rtu,
+						   cfg->cpu_0_idle_exit,
+						   in);
+
+		tmp = grtimer_longcount_difftime(cfg->timer.rtu,
+						 out, start);
+
+		/* IASW polling rate = 8 Hz */
+		if (tmp > (1.0/8.0)) {
+
+			window = grtimer_longcount_difftime(cfg->timer.rtu,
+							    out,
+							    start);
+
+			tmp = 100.0 * (1.0 - idle / window);
+
+			cfg->cpu0_load = (uint32_t) tmp;
+
+			reset = 1;
+		}
+
+		/* reset wake-up timestamp */
+		cfg->cpu_0_idle_exit.coarse = 0;
+		cfg->cpu_0_idle_exit.fine   = 0;
+	}
+}
diff --git a/IBSW/lib/ibsw_init/init_1553.c b/IBSW/lib/ibsw_init/init_1553.c
new file mode 100644
index 0000000..4ea562a
--- /dev/null
+++ b/IBSW/lib/ibsw_init/init_1553.c
@@ -0,0 +1,182 @@
+/**
+ * @file   init_1553.c
+ * @ingroup ibsw_config
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   September, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief Configuration of the 1553 interface
+ *
+ *
+ * ## Overview
+ *
+ * This is the configuration procedure of the 1553 interface.
+ * The device is ungated and configured as a remote terminal in ping-pong
+ * buffer mode with the address read from the @ref iwf_fpga.
+ * The run-time memory block of the 1553 device must be aligned properly,
+ * so a memory are of size (BRM_MEM_BLOCK_SIZE_BYTES + BRM_MEM_BLOCK_ALIGN_SIZE)
+ * is allocated and aligned to BRM_MEM_BLOCK_ALIGN.
+ *
+ * ## Mode of Operation
+ *
+ * None
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ * ## Notes
+ *
+ * None
+ *
+ */
+
+
+#include <stdint.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <ibsw_interface.h>
+
+#include <timing.h>
+#include <errors.h>
+#include <clkgate.h>
+#include <core1553brm_as250.h>
+#include <iwf_fpga.h>
+
+
+/**
+ * @brief configures the 1553 interface
+ *
+ * @param brm a struct brm_config
+ * @param pus_buf a struct cpus_buffers
+ * @param pkt_gnd a struct packet_tracker
+ * @param pkt_obc a struct packet_tracker
+ * @param timer a struct time_keeper
+ *
+ * @return -1 on error, 0 otherwise
+ */
+
+ssize_t ibsw_configure_1553(struct brm_config *brm,
+			    struct cpus_buffers *pus_buf,
+			    struct packet_tracker *pkt_gnd,
+			    struct packet_tracker *pkt_obc,
+			    struct time_keeper *timer)
+{
+	uint8_t *adb_ddb;
+	uint16_t rt_addr;
+	uint32_t flags;
+	uint32_t mem;
+
+
+	mem = (uint32_t) malloc(BRM_MEM_BLOCK_SIZE_BYTES
+				+ BRM_MEM_BLOCK_ALIGN_SIZE);
+
+	if (!mem) {
+		errno = ENOMEM;
+		return -1;
+	}
+
+	bzero((void *) mem,
+	      BRM_MEM_BLOCK_SIZE_BYTES + BRM_MEM_BLOCK_ALIGN_SIZE);
+
+	adb_ddb = (uint8_t *) malloc(AS250_TRANSFER_FRAME_SIZE
+				     * sizeof(uint8_t));
+
+	if (!adb_ddb) {
+		errno = ENOMEM;
+		return -1;
+	}
+
+
+	/* address to brm devices register */
+	brm->regs = (struct brm_reg *) CORE1553BRM_REG_BASE;
+
+	/* operating mode */
+	brm->mode = PING_PONG;
+
+	/* align memory to boundary */
+	brm->brm_mem = (uint16_t *) ((mem + BRM_MEM_BLOCK_ALIGN)
+				     & ~BRM_MEM_BLOCK_ALIGN);
+
+
+	/* ungate the 1553 core, see GR712RC UM pp. 228  */
+	flags  = ioread32be(&clkgate->unlock);
+	flags |= CLKGATE_1553BRM;
+	iowrite32be(flags, &clkgate->unlock);
+
+	flags  = ioread32be(&clkgate->core_reset);
+	flags |= CLKGATE_1553BRM;
+	iowrite32be(flags, &clkgate->core_reset);
+
+	flags  = ioread32be(&clkgate->clk_enable);
+	flags |= CLKGATE_1553BRM;
+	iowrite32be(flags, &clkgate->clk_enable);
+
+	flags  = ioread32be(&clkgate->core_reset);
+	flags &= ~CLKGATE_1553BRM;
+	iowrite32be(flags, &clkgate->core_reset);
+
+	flags  = ioread32be(&clkgate->unlock);
+	flags &= ~CLKGATE_1553BRM;
+	iowrite32be(flags, &clkgate->unlock);
+
+
+	/* enable the brm */
+	if (brm_1553_enable(brm))
+		return -1;
+
+	/* assign the sliding pus buffer */
+	if (as250_set_atr_cpus_buffers(brm, pus_buf))
+		return -1;
+
+	/* assign the packet buffers */
+	if (brm_set_packet_tracker_gnd(brm, pkt_gnd))
+		return -1;
+
+	if (brm_set_packet_tracker_obc(brm, pkt_obc))
+		return -1;
+
+	/* assign the work buffer */
+	if (brm_set_adb_ddb_buffer(brm, adb_ddb))
+		return -1;
+
+	/* set callback for time message */
+	if (as250_set_time_callback(brm, &timekeeper_set_1553_time, timer))
+		return -1;
+
+	/* set callback for rt-reset modecode */
+	if (as250_set_rt_reset_callback(brm, &rt_reset, NULL))
+		return -1;
+
+	rt_addr = fpga_dpu_get_rt_addr();
+
+	/* allow only 9 (nominal) or 10 (redundant), otherwise fall back to
+	 * nominal address (e.g. if address selector is not plugged in
+	 */
+
+	switch (rt_addr) {
+	case 9:
+	case 10:
+		break;
+	default:
+		rt_addr = 9;
+		break;
+	}
+
+	if (brm_rt_init(brm, rt_addr, BRM_FREQ_20MHZ))
+		return -1;
+
+
+	return 0;
+}
diff --git a/IBSW/lib/ibsw_init/init_cpu_0_idle_timing.c b/IBSW/lib/ibsw_init/init_cpu_0_idle_timing.c
new file mode 100644
index 0000000..e355028
--- /dev/null
+++ b/IBSW/lib/ibsw_init/init_cpu_0_idle_timing.c
@@ -0,0 +1,94 @@
+/**
+ * @file   init_cpu_0_idle_timing.c
+ * @ingroup ibsw_config
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   September, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief CPU 0 idle time recording
+ *
+ * ## Overview
+ *
+ * Here the CPU power down exit time stamp is recorded.
+ *
+ * ## Mode of Operation
+ *
+ * The function ibsw_update_cpu_0_idle() is attached to a set of interrupts
+ * during init. It is subsequently called every time one of these interrupts
+ * is raised. If the timestamp is not set, it is updated. The timestamp
+ * is reset in ibsw_mainloop().
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ * ## Notes
+ *
+ * None
+ */
+
+
+#include <stdint.h>
+
+#include <leon/irq.h>
+#include <leon/irq_dispatch.h>
+
+#include <ibsw.h>
+#include <leon3_grtimer_longcount.h>
+
+#include <ibsw_interface.h>
+
+
+/**
+ * @brief ISR to record time when cpu 0 exits idle mode
+ *
+ * @param userdata a pointer to arbitrary user data
+ */
+
+int32_t ibsw_update_cpu_0_idle(void *userdata)
+{
+	struct ibsw_config *cfg = (struct ibsw_config *) userdata;
+
+	if (!cfg->cpu_0_idle_exit.coarse)
+		if (!cfg->cpu_0_idle_exit.fine)
+			grtimer_longcount_get_uptime(cfg->timer.rtu,
+					   &cfg->cpu_0_idle_exit);
+
+	return 0;
+}
+
+
+/**
+ * @brief initialise CPU 0 idle timing interrupts
+ *
+ * @param ibsw_cfg a struct ibsw_config
+ */
+
+void ibsw_init_cpu_0_idle_timing(struct ibsw_config *cfg)
+{
+	cfg->cpu_0_idle_exit.coarse = 0;
+	cfg->cpu_0_idle_exit.fine   = 0;
+
+	irl1_register_callback(GR712_IRL1_GPIO6,     PRIORITY_NOW,
+			       ibsw_update_cpu_0_idle, cfg);
+	irl1_register_callback(GR712_IRL1_AHBSTAT,   PRIORITY_NOW,
+			       ibsw_update_cpu_0_idle, cfg);
+	irl1_register_callback(GR712_IRL1_GPTIMER_0, PRIORITY_NOW,
+			       ibsw_update_cpu_0_idle, cfg);
+	irl1_register_callback(GR712_IRL1_GPTIMER_1, PRIORITY_NOW,
+			       ibsw_update_cpu_0_idle, cfg);
+	irl1_register_callback(GR712_IRL1_GPTIMER_2, PRIORITY_NOW,
+			       ibsw_update_cpu_0_idle, cfg);
+	irl1_register_callback(GR712_IRL1_B1553BRM,  PRIORITY_NOW,
+			       ibsw_update_cpu_0_idle, cfg);
+}
+
diff --git a/IBSW/lib/ibsw_init/init_cpus.c b/IBSW/lib/ibsw_init/init_cpus.c
new file mode 100644
index 0000000..361e191
--- /dev/null
+++ b/IBSW/lib/ibsw_init/init_cpus.c
@@ -0,0 +1,74 @@
+/**
+ * @file   init_cpus.c
+ * @ingroup ibsw_config
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at)
+ * @date   September, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief configures the sliding window tx buffers for the 1553 interface
+ *
+ * ## Overview
+ *
+ * Here the buffers for use with the @ref cpus_buffer are allocated and
+ * configured.
+ *
+ * ## Mode of Operation
+ *
+ * None
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ * ## Notes
+ *
+ * None
+ *
+ */
+
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <sys/types.h>
+
+#include <errors.h>
+#include <cpus_buffers.h>
+
+
+/**
+ * @brief configures the sliding window tx buffers for the 1553 interface
+ *
+ * @param pus_buf a reference to a struct cpus_buffers
+ *
+ * @return -1 on error, 0 otherwise
+ */
+
+ssize_t ibsw_configure_cpus(struct cpus_buffers *pus_buf)
+{
+	uint8_t *p_pkts;
+	uint8_t *p_valid;
+
+	uint16_t *p_size;
+
+	p_pkts  = (uint8_t  *) malloc(CBUF_PKTS_ELEM  * sizeof(uint8_t));
+	p_valid = (uint8_t  *) malloc(CBUF_VALID_ELEM * sizeof(uint8_t));
+	p_size  = (uint16_t *) malloc(CBUF_SIZE_ELEM  * sizeof(uint16_t));
+
+	if (!p_pkts || !p_valid || !p_size) {
+		errno = ENOMEM;
+		return -1;
+	}
+
+	cpus_init(pus_buf, p_pkts, p_size, p_valid);
+
+	return 0;
+}
diff --git a/IBSW/lib/ibsw_init/init_edac.c b/IBSW/lib/ibsw_init/init_edac.c
new file mode 100644
index 0000000..d2513f2
--- /dev/null
+++ b/IBSW/lib/ibsw_init/init_edac.c
@@ -0,0 +1,75 @@
+/**
+ * @file   init_edac.c
+ * @ingroup ibsw_config
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   September, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief configures the EDAC and error trap handlers
+ *
+ * ## Overview
+ *
+ * Here the memory EDAC is enabled. A trap handler is installed to handle data
+ * exception traps and the AHBSTAT interrupt is enabled.
+ * Trap handlers for FP exception and traps that must trigger a controlled reset
+ * are also enabled here.
+ *
+ * ## Mode of Operation
+ *
+ * None
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ * ## Notes
+ *
+ * None
+ */
+
+#include <stdlib.h>
+
+#include <leon/irq.h>
+#include <leon/irq_dispatch.h>
+
+#include <ibsw_interface.h>
+
+#include <traps.h>
+#include <edac.h>
+#include <leon3_dsu.h>
+#include <memcfg.h>
+#include <traps.h>
+
+
+/**
+ * @brief configure EDAC and error trap handlers
+ */
+
+int32_t ibsw_configure_edac(void)
+{
+	edac_set_reset_callback(&fdir_reset, NULL);
+
+	if (edac_init_sysctl())
+		return -1;
+
+	memcfg_enable_ram_edac();
+	trap_handler_install(0x9, data_access_exception_trap); /* EDAC */
+
+	trap_handler_install(0x8, floating_point_exception_trap);
+
+	trap_handler_install(0x2, reset_trap);
+
+	irl1_register_callback(GR712_IRL1_AHBSTAT, PRIORITY_NOW,
+			       edac_ahb_irq, NULL);
+
+	return 0;
+}
diff --git a/IBSW/lib/ibsw_init/init_error_log.c b/IBSW/lib/ibsw_init/init_error_log.c
new file mode 100644
index 0000000..ebc9519
--- /dev/null
+++ b/IBSW/lib/ibsw_init/init_error_log.c
@@ -0,0 +1,47 @@
+/**
+ * @file   init_error_log.c
+ * @ingroup ibsw_config
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   September, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief initialises the error log
+ *
+ * ## Overview
+ *
+ * Here the @ref error_log is configured.
+ *
+ * ## Mode of Operation
+ *
+ * None
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ * ## Notes
+ *
+ * None
+ */
+
+#include <error_log.h>
+
+
+/**
+ * @brief init the error log
+ * @param error log a pointer to the error log
+ */
+
+void ibsw_configure_error_log(struct error_log **error_log)
+{
+	error_log_init(error_log);
+}
diff --git a/IBSW/lib/ibsw_init/init_ptrack.c b/IBSW/lib/ibsw_init/init_ptrack.c
new file mode 100644
index 0000000..e20bef5
--- /dev/null
+++ b/IBSW/lib/ibsw_init/init_ptrack.c
@@ -0,0 +1,76 @@
+/**
+ * @file   init_ptrack.c
+ * @ingroup ibsw_config
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   September, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief configures the rx packet buffers for the 1553 interface
+ *
+ * ## Overview
+ *
+ * Here the buffers for use with the @ref packet_tracker are allocated and
+ * configured.
+ *
+ * ## Mode of Operation
+ *
+ * None
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ * ## Notes
+ *
+ * None
+ */
+
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <sys/types.h>
+
+#include <errors.h>
+#include <packet_tracker.h>
+
+/**
+ * @brief configures the rx packet buffers for the 1553 interface
+ *
+ * @param pkt a reference to a struct packet_tracker
+ *
+ * @param pkts the number of packets to allocate space for
+ *
+ * @return -1 on error, 0 otherwise
+ */
+
+ssize_t ibsw_configure_ptrack(struct packet_tracker *pkt, uint32_t pkts)
+{
+	uint8_t *p_pkts;
+
+	uint16_t *p_size;
+
+
+	p_pkts = (uint8_t  *) malloc(pkts * PUS_PKT_MIN_SIZE * sizeof(uint8_t));
+	p_size = (uint16_t *) malloc(pkts * sizeof(uint16_t));
+
+
+	if (!p_pkts || !p_size) {
+		errno = ENOMEM;
+		return -1;
+	}
+
+	ptrack_init(pkt,
+		    p_pkts, pkts * PUS_PKT_MIN_SIZE,
+		    p_size, pkts);
+
+	return 0;
+}
diff --git a/IBSW/lib/ibsw_init/init_spw.c b/IBSW/lib/ibsw_init/init_spw.c
new file mode 100644
index 0000000..6120237
--- /dev/null
+++ b/IBSW/lib/ibsw_init/init_spw.c
@@ -0,0 +1,186 @@
+/**
+ * @file   init_spw.c
+ * @ingroup ibsw_config
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   September, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief configures the SpW cores
+ *
+ * ## Overview
+ *
+ * This is the configuration procedure of the SpW interface.
+ * The device is ungated and the descriptor tables are allocated.
+ * The descriptor tables of the SpW device must be aligned properly,
+ * so memory blocks of size
+ * (GRSPW2_DESCRIPTOR_TABLE_SIZE + GRSPW2_DESCRIPTOR_TABLE_MEM_BLOCK_ALIGN)
+ * are allocated and aligned to GRSPW2_DESCRIPTOR_TABLE_MEM_BLOCK_ALIGN.
+ *
+ * ## Mode of Operation
+ *
+ * None
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ * ## Notes
+ *
+ * None
+ *
+ */
+
+#include <stdint.h>
+#include <stdlib.h>
+
+#include <io.h>
+#include <clkgate.h>
+#include <grspw2.h>
+#include <errors.h>
+#include <leon/irq.h>
+
+
+/**
+ * @brief configure the SpW cores
+ *
+ * @param spw a struct grspw2_core_cfg
+ * @param spw_core_addr the SpW core (hardware) address
+ * @param spw_core_irq the IRQ number of the SpW core
+ * @param spw_addr the SpW node address
+ * @param tx_hdr_size the size of the transmission header
+ * @param spw_strip_hdr_bytes the number of header bytes to strip in RX packets
+ * @param gate the SpW core's clock gate in the GR712RC
+ *
+ * @return -1 on error, 0 otherwise
+ */
+
+ssize_t ibsw_configure_spw(struct grspw2_core_cfg *spw, uint32_t spw_core_addr,
+			   uint32_t spw_core_irq, uint32_t spw_addr,
+			   uint32_t tx_hdr_size, uint32_t spw_strip_hdr_bytes,
+			   uint32_t gate)
+{
+	uint32_t flags;
+	uint32_t mem;
+	uint32_t *rx_desc_tbl;
+	uint32_t *tx_desc_tbl;
+	uint8_t *rx_descs;
+	uint8_t *tx_descs;
+	uint8_t *tx_hdr = NULL;
+
+
+	/* ungate the spw cores, see GR712RC UM pp. 228  */
+
+
+	flags  = ioread32be(&clkgate->unlock);
+	flags |= gate;
+	iowrite32be(flags, &clkgate->unlock);
+
+	flags  = ioread32be(&clkgate->core_reset);
+	flags |= gate;
+	iowrite32be(flags, &clkgate->core_reset);
+
+	flags  = ioread32be(&clkgate->clk_enable);
+	flags |= gate;
+	iowrite32be(flags, &clkgate->clk_enable);
+
+	flags  = ioread32be(&clkgate->core_reset);
+	flags &= ~gate;
+	iowrite32be(flags, &clkgate->core_reset);
+
+	flags  = ioread32be(&clkgate->unlock);
+	flags &= ~gate;
+	iowrite32be(flags, &clkgate->unlock);
+
+
+	/**
+	 * malloc a rx and tx descriptor table buffer and align to
+	 * 1024 bytes (GR712UMRC, p. 111)
+	 *
+	 * dynamically allocate memory + 1K for alignment (worst case)
+	 * 1 buffer per dma channel (gr712 cores only implement one)
+	 */
+
+	mem = (uint32_t) malloc(GRSPW2_DESCRIPTOR_TABLE_SIZE
+				+ GRSPW2_DESCRIPTOR_TABLE_MEM_BLOCK_ALIGN);
+	if (!mem) {
+		errno = ENOMEM;
+		return -1;
+	}
+
+	rx_desc_tbl = (uint32_t *) ((mem
+				     + GRSPW2_DESCRIPTOR_TABLE_MEM_BLOCK_ALIGN)
+				    & ~GRSPW2_DESCRIPTOR_TABLE_MEM_BLOCK_ALIGN);
+
+	mem = (uint32_t) malloc(GRSPW2_DESCRIPTOR_TABLE_SIZE
+				+ GRSPW2_DESCRIPTOR_TABLE_MEM_BLOCK_ALIGN);
+	if (!mem) {
+		errno = ENOMEM;
+		return -1;
+	}
+
+	tx_desc_tbl = (uint32_t *) ((mem
+				     + GRSPW2_DESCRIPTOR_TABLE_MEM_BLOCK_ALIGN)
+				    & ~GRSPW2_DESCRIPTOR_TABLE_MEM_BLOCK_ALIGN);
+
+	/**
+	 * malloc rx and tx data buffers: decriptors * packet size
+	 */
+	rx_descs = (uint8_t *) malloc(GRSPW2_RX_DESCRIPTORS
+				       * GRSPW2_DEFAULT_MTU);
+
+	tx_descs = (uint8_t *) malloc(GRSPW2_TX_DESCRIPTORS
+				       * GRSPW2_DEFAULT_MTU);
+
+	if (!rx_descs || !tx_descs) {
+		errno = ENOMEM;
+		return -1;
+	}
+
+
+	if (tx_hdr_size) {
+		tx_hdr = (uint8_t *) malloc(GRSPW2_TX_DESCRIPTORS
+					    * tx_hdr_size);
+
+		if (!tx_hdr) {
+			errno = ENOMEM;
+			return -1;
+		}
+	}
+
+	/* start: 10 Mhz, run: 10 Mhz */
+	/* dpu SpW are already clocked at 10 MHz */
+	grspw2_core_init(spw, spw_core_addr, spw_addr, 1, 1,
+			 GRSPW2_DEFAULT_MTU, spw_core_irq,
+			 GR712_IRL1_AHBSTAT, spw_strip_hdr_bytes);
+
+	grspw2_rx_desc_table_init(spw,
+				  rx_desc_tbl, GRSPW2_DESCRIPTOR_TABLE_SIZE,
+				  rx_descs,    GRSPW2_DEFAULT_MTU);
+
+	grspw2_tx_desc_table_init(spw,
+				  tx_desc_tbl, GRSPW2_DESCRIPTOR_TABLE_SIZE,
+				  tx_hdr,      tx_hdr_size,
+				  tx_descs,    GRSPW2_DEFAULT_MTU);
+	grspw2_core_start(spw);
+
+
+
+	spw->alloc.rx_desc_tbl = rx_desc_tbl;
+	spw->alloc.tx_desc_tbl = tx_desc_tbl;
+	spw->alloc.rx_descs    = rx_descs;
+	spw->alloc.tx_descs    = tx_descs;
+	spw->alloc.tx_hdr      = tx_hdr;
+	spw->alloc.tx_hdr_size = tx_hdr_size;
+
+
+	return 0;
+}
diff --git a/IBSW/lib/ibsw_init/init_sync_timing.c b/IBSW/lib/ibsw_init/init_sync_timing.c
new file mode 100644
index 0000000..aeedf79
--- /dev/null
+++ b/IBSW/lib/ibsw_init/init_sync_timing.c
@@ -0,0 +1,116 @@
+/**
+ * @file   init_sync_timing.c
+ * @ingroup ibsw_config
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   September, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief configures timers, syncpulse and 1553 time callback
+ *
+ *
+ * ## Overview
+ *
+ * This is the configuration procedure of syncpulse and timing functions.
+ * GPIO6 is enabled for reception of the sync pulse and callback functions
+ * are registered to update the synchronisation status.
+ *
+ * System timers 1 and 2 are configured for desynchronisation detection and
+ * recovery and IASW cyclical notification source respectively.
+ *
+ * None
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ * ## Notes
+ *
+ * None
+ *
+ */
+
+
+#include <stdint.h>
+#include <stdlib.h>
+
+#include <leon/leon_reg.h>
+#include <timing.h>
+#include <leon/irq.h>
+#include <leon/irq_dispatch.h>
+#include <leon3_gptimer.h>
+#include <syncpulse.h>
+#include <core1553brm_as250.h>
+
+#include <ibsw_interface.h>
+
+/**
+ * @brief configures the timers
+ *
+ * @param timer a struct time_keeper
+ * @param brm a struct brm_config
+ * @param spw a struct grspw2_core_cfg
+ */
+
+void ibsw_configure_timing(struct time_keeper *timer,
+			   struct brm_config *brm,
+			   struct grspw2_core_cfg *spw)
+{
+	timekeeper_init(timer,
+			(struct gptimer_unit *) LEON3_BASE_ADDRESS_GPTIMER,
+			(struct grtimer_unit *) LEON3_BASE_ADDRESS_GRTIMER,
+			brm, spw);
+}
+
+
+/**
+ * @brief configure the syncpulse and 1553 time callback
+ *
+ * @param brm a struct brm_config (if configuring for eval board)
+ * @param timer a struct time_keeper
+ *
+ * @note  struct time_keeper should be zeroed before calling this function
+ */
+
+void ibsw_configure_1553_sync(struct brm_config __attribute__((unused)) *brm,
+			      struct time_keeper *timer)
+{
+	grtimer_set_latch_irq(timer->rtu, GR712_IRL1_GPIO6);
+
+	syncpulse_configure_gpio(GR712_IRL1_GPIO6, LEON3_BASE_ADDRESS_GRGPIO_1);
+
+	irl1_register_callback(GR712_IRL1_GPIO6, PRIORITY_NOW,
+			       syncpulse, timer);
+
+	irq_set_level(GR712_IRL1_GPIO6, 1);
+
+	syncpulse_status_set_callback(timer, CrIbSetSyncFlag);
+
+	irl1_register_callback(GR712_IRL1_GPTIMER_2, PRIORITY_NOW,
+			       syncpulse_notification_timer_underflow, timer);
+
+	/* configure syncpulse standin timer, it will fire
+	 * after 1 second + tolerance and execute a similar ISR as the
+	 * syncpulse.
+	 */
+	irl1_register_callback(GR712_IRL1_GPTIMER_1, PRIORITY_NOW,
+			       syncpulse_missed, timer);
+
+	gptimer_start(timer->ptu, 1, GPTIMER_TICKS_PER_SEC + T_SYNC_TOL);
+
+	/* start GPTIMER3 in free running mode to guarantee the IASW is running
+	 * even if the sync pulse never arrives
+	 */
+	gptimer_start(timer->ptu, 2, T_CYC1);
+
+	irq_set_level(GR712_IRL1_GPTIMER_1, 1);
+	irq_set_level(GR712_IRL1_GPTIMER_2, 1);
+}
diff --git a/IBSW/lib/ibsw_interface/ibsw_1553.c b/IBSW/lib/ibsw_interface/ibsw_1553.c
new file mode 100644
index 0000000..8237db3
--- /dev/null
+++ b/IBSW/lib/ibsw_interface/ibsw_1553.c
@@ -0,0 +1,247 @@
+/**
+ * @file   ibsw_1553.c
+ * @ingroup ibsw_interface
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   August, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief implements a IBSW <> IASW interface to the 1553 bus
+ *
+ *
+ * ## Overview
+ *
+ * ## Mode of Operation
+ *
+ * ### CrIbIsMilBusPcktAvail()
+ *
+ * This function checks if packets received via the 1553 bus are available.
+ *
+ *
+ * @startuml {CrIbMilBusPcktAvail.svg} "CrIbMilBusPcktAvail()" width=10
+ * start
+ *
+ * if (GND|OBC) then (yes)
+ *	if (packet in buffer) then (yes)
+ *		:return true;
+ *		stop
+ *	endif
+ * endif
+ * :return false;
+ * stop
+ * @enduml
+ *
+ * Note that this function implements the call interface functionality of:
+ *
+ * - CrIbIsObcPcktAvail
+ * - CrIbIsGrdPcktAvail
+ *
+ * as defined in CHEOPS-PNP-INST-DD-001 Rev 4, Section 5.1, to provide a working
+ * interface, given that the IASW does not adhere to it's own design document.
+ *
+ *
+ * ### CrIbMilBusPcktCollect()
+ *
+ * This function returns packets received via the 1553 bus. Usable buffer space
+ * must be provided by the IASW.
+ *
+ * @startuml {CrIbMilBusPcktCollect.svg} "CrIbMilBusPcktCollect()" width=10
+ * start
+ * if (GND|OBC) then (yes)
+ *	if (packet in buffer) then (no)
+ *		:return NULL;
+ *		stop
+ *	endif
+ *	if (pkt = CrFwPcktMake()) then (no)
+ *		:return NULL;
+ *		stop
+ *	endif
+ *	if (get packet) then (no)
+ *		:release pkt;
+ *		:return NULL;
+ *		stop
+ *	endif
+ *	:return pkt;
+ *	stop
+ * endif
+ * :return NULL;
+ * stop
+ * @enduml
+ *
+ * Note that this function implements the call interface functionality of:
+ *
+ * - CrIbIsObcPcktCollect
+ * - CrIbIsGrdPcktCollect
+ *
+ * as defined in CHEOPS-PNP-INST-DD-001 Rev 4, Section 5.1, to provide a working
+ * interface, given that the IASW does not adhere to it's own design document.
+
+ *
+ * ### CrIbMilBusPcktHandover()
+ *
+ * This function attempts to add packet to the outgoing 1553 @ref cpus_buffer.
+ * If all transfer frames are out of capacity and the packet cannot be added,
+ * the function returns 0 (false) or not 0 (true).
+ *
+ * @startuml {CrIbMilBusPcktHandover.svg} "CrIbMilBusPcktHandover()" width=10
+ * start
+ * :get packet size;
+ * if (add packet) then (yes)
+ *	:return 1;
+ *	stop
+ * endif
+ *
+ * :return 0;
+ * stop
+ * @enduml
+ *
+ *
+ * ### CrIbMilBusGetLinkCapacity()
+ *
+ * This function returns the remaining number of bytes relative to the next
+ * legal 1 kiB sized AS250 transfer frame boundary available in the @ref
+ * cpus_buffer
+ *
+ * @startuml {CrIbMilBusGetLinkCapacity.svg} "CrIbMilBusGetLinkCapacity()" width=10
+ * start
+ * :return frame size;
+ * stop
+ * @enduml
+ *
+ * ## Error Handling
+ *
+ * The caller is responsible to handle errors. If the IASW cannot provide
+ * a valid buffer via CrFwPcktMake() (which will return a NULL pointer) as
+ * needed by CrIbMilBusPcktCollect() nothing can be done by the interface and
+ * a NULL pointer is hence returned.
+ *
+ * ## Notes
+ *
+ */
+
+
+#include <stdint.h>
+
+#include <packet_tracker.h>
+#include <cpus_buffers.h>
+#include <core1553brm_as250.h>
+
+#include <ibsw_interface.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+#include <CrConfigIa/CrFwUserConstants.h>
+
+
+
+/**
+ * @brief check if there is a packet available from the 1553 interface
+ * @return 0 if no packet is available, 1 otherwise
+ */
+
+CrFwBool_t CrIbIsMilBusPcktAvail(CrFwDestSrc_t src)
+{
+	struct packet_tracker *pkt;
+
+
+	switch (src) {
+	case CR_FW_CLIENT_GRD:
+		pkt = &ibsw_cfg.pkt_gnd;
+		break;
+	case CR_FW_CLIENT_OBC:
+		pkt = &ibsw_cfg.pkt_obc;
+		break;
+	default:
+		return 0;
+	}
+
+	if (ptrack_peek_next_pkt_size(pkt))
+		return 1;
+
+	return 0;
+}
+
+
+/**
+ * @brief  retrieve a packet received via the 1553 bus
+ * @return pointer to a packet buffer
+ */
+
+CrFwPckt_t CrIbMilBusPcktCollect(CrFwDestSrc_t src)
+{
+	uint8_t *buf;
+	int32_t elem;
+
+	struct packet_tracker *pkt;
+
+
+	switch (src) {
+	case CR_FW_CLIENT_GRD:
+		pkt = &ibsw_cfg.pkt_gnd;
+		break;
+	case CR_FW_CLIENT_OBC:
+		pkt = &ibsw_cfg.pkt_obc;
+		break;
+	default:
+		return NULL;
+	}
+
+	elem = ptrack_peek_next_pkt_size(pkt);
+
+	if (!elem)
+		return NULL;
+
+	buf = (uint8_t *) CrFwPcktMake((CrFwPcktLength_t) elem);
+
+	if (!buf)
+		return NULL;
+
+	elem = ptrack_get_next_pkt(pkt, buf);
+
+	if (!elem) {
+		CrFwPcktRelease((CrFwPckt_t) buf);
+		return NULL;
+	}
+
+	return (CrFwPckt_t) buf;
+}
+
+
+/**
+ * @brief hand over a packet to be put on the 1553 bus
+ * @return 1 if the packet was accepted, 0 otherwise
+ */
+
+CrFwBool_t CrIbMilBusPcktHandover(CrFwPckt_t pckt)
+{
+	uint16_t size;
+	int32_t ret;
+
+	size = ptrack_get_pkt_size((uint8_t *) pckt);
+
+	ret = cpus_push_packet(&ibsw_cfg.pus_buf, (uint8_t *) pckt, size);
+
+	if (ret)
+		return 0;
+
+	return 1;
+}
+
+
+/**
+ * @brief get the number of bytes available in the current transfer frame
+ * @return number of bytes available
+ */
+
+uint32_t CrIbMilBusGetLinkCapacity(void)
+{
+	return cpus_get_free(&ibsw_cfg.pus_buf);
+}
diff --git a/IBSW/lib/ibsw_interface/ibsw_datapool_update.c b/IBSW/lib/ibsw_interface/ibsw_datapool_update.c
new file mode 100644
index 0000000..e04f3b8
--- /dev/null
+++ b/IBSW/lib/ibsw_interface/ibsw_datapool_update.c
@@ -0,0 +1,458 @@
+/**
+ * @file   ibsw_datapool_update.c
+ * @ingroup ibsw_interface
+ * @author Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   August, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief implements an IBSW <> IASW interface to the IASW datapool
+ *
+ */
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+
+#include <iwf_fpga.h>
+#include <iwf_flash.h>
+#include <sysctl.h>
+#include <error_log.h>
+#include <leon/irq.h>
+
+#include <ibsw_interface.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+#include <IfswConversions.h>
+
+
+
+/**
+ * @brief fill the datapool with stuff
+ */
+
+void CrIbUpdateDataPoolVariablesWithValuesFromIbswSysctlTree(uint32_t hz)
+{
+	uint8_t  ui8;
+	uint16_t ui16;
+	uint32_t ui32;
+
+	struct grtimer_uptime in;
+
+	char buf[256];
+
+
+	ui8 = (uint8_t) ibsw_cfg.timer.watchdog_enabled & 0xff;
+	CrIaPaste(ISWATCHDOGENABLED_ID, &ui8);
+
+	/* update the synchronization flag ISSYNCHRONIZED_ID */
+	CrIbSetSyncFlag(ibsw_cfg.timer.synced & 0x01);
+
+	CrIaPaste(MISSEDMSGCNT_ID,    &ibsw_cfg.timer.miltime_desync_cnt);
+	CrIaPaste(MISSEDPULSECNT_ID,  &ibsw_cfg.timer.pulse_desync_cnt);
+
+	ui16 = get_error_log_entires_made_since_IBSW_IASW_started();
+	CrIaPaste(NOFERRLOGENTRIES_ID, &ui16);
+
+	ui8 = (uint8_t) ibsw_cfg.cpu0_load & 0xff;
+	CrIaPaste(CORE0LOAD_ID, &ui8);
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/irq/primary"),
+			 "irl1", buf);
+	/* reset statistic */
+	sysobj_store_attr(sysset_find_obj(sys_set, "/sys/irq/primary"),
+			  "irl1", "", 0);
+	ui32 = atoi(buf) * hz;	/* to rate per second */
+	CrIaPaste(INTERRUPTRATE_ID, &ui32);
+
+
+	ui8 = (uint8_t) CrIbGetNotifyCnt();
+	CrIaPaste(CYCLICALACTIVITIESCTR_ID, &ui8);
+
+	grtimer_longcount_get_uptime(ibsw_cfg.timer.rtu, &in);
+	CrIaPaste(UPTIME_ID, &in.coarse);
+
+
+	ui32 = ptrack_get_packets_in_buffer(&ibsw_cfg.pkt_obc);
+	CrIaPaste(OBCINPUTBUFFERPACKETS_ID, &ui32);
+	ui32 = ptrack_get_packets_in_buffer(&ibsw_cfg.pkt_gnd);
+	CrIaPaste(GRNDINPUTBUFFERPACKETS_ID, &ui32);
+
+	/* We don't count that. The outgoing packet buffer is only
+	 * dropped when it contains invalid packets. Since we cannot
+	 * tell how many packets are in the buffer because we cannot
+	 * distinguish which are which, this does not make sense.
+	 * OBCOUTDROPPEDPACKETS_ID
+	 *
+	 * same here, packets are dropped by either the SEM or by
+	 * the application software, but never by the driver.
+	 * If we cannot accept a packet to be sent to the SEM,
+	 * the IASW must hold it until a time a TX slot is
+	 * available.
+	 * SEMDROPPEDPACKETS_ID
+	 */
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/irq/primary"),
+			 __stringify(GR712_IRL1_B1553BRM), buf);
+	/* reset statistic */
+	sysobj_store_attr(sysset_find_obj(sys_set, "/sys/irq/primary"),
+			  __stringify(GR712_IRL1_B1553BRM), "", 0);
+	ui8 = (uint8_t)(atoi(buf) * hz & 0xff);	/* per second */
+	CrIaPaste(IRL1_B1553BRM_ID, &ui8);
+
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/driver/1553"),
+			  "rx_bytes", buf);
+	ui32 = atoi(buf);
+	CrIaPaste(MILBUSBYTESIN_ID, &ui32);
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/driver/1553"),
+			  "tx_bytes", buf);
+	ui32 = atoi(buf);
+	CrIaPaste(MILBUSBYTESOUT_ID, &ui32);
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/driver/1553"),
+			  "bytes_dropped", buf);
+	ui16 = atoi(buf);
+	CrIaPaste(MILBUSDROPPEDBYTES_ID, &ui16);
+
+	/* set in ibsw interface callback
+	 * SEMROUTE_ID
+	 */
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/driver/spw0"),
+			  "rx_bytes", buf);
+	ui32 = atoi(buf);
+	CrIaPaste(SPW0BYTESIN_ID, &ui32);
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/driver/spw0"),
+			  "tx_bytes", buf);
+	ui32 = atoi(buf);
+	CrIaPaste(SPW0BYTESOUT_ID, &ui32);
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/driver/spw1"),
+			  "rx_bytes", buf);
+	ui32 = atoi(buf);
+	CrIaPaste(SPW1BYTESIN_ID, &ui32);
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/driver/spw1"),
+			  "tx_bytes", buf);
+	ui32 = atoi(buf);
+	CrIaPaste(SPW1BYTESOUT_ID, &ui32);
+
+
+	ui8 = (uint8_t) grspw2_get_num_free_tx_desc_avail(&ibsw_cfg.spw0)
+		& 0xff;
+	CrIaPaste(SPW0TXDESCAVAIL_ID, &ui8);
+
+	ui8 = (uint8_t) grspw2_get_num_pkts_avail(&ibsw_cfg.spw0) & 0xff;
+	CrIaPaste(SPW0RXPCKTAVAIL_ID, &ui8);
+
+	ui8 = (uint8_t) grspw2_get_num_free_tx_desc_avail(&ibsw_cfg.spw1)
+		& 0xff;
+	CrIaPaste(SPW1TXDESCAVAIL_ID, &ui8);
+
+	ui8 = (uint8_t) grspw2_get_num_pkts_avail(&ibsw_cfg.spw1) & 0xff;
+	CrIaPaste(SPW1RXPCKTAVAIL_ID, &ui8);
+
+
+	/* IRL timer interrupts, multiplied by 8 to get Hz */
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/irq/primary"),
+			 __stringify(GR712_IRL1_GPTIMER_0), buf);
+	sysobj_store_attr(sysset_find_obj(sys_set, "/sys/irq/primary"),
+			  __stringify(GR712_IRL1_GPTIMER_0), "", 0);
+	ui8 = (uint8_t)((hz * atoi(buf)) & 0xff);
+	CrIaPaste(IRL1_GPTIMER_0_ID, &ui8);
+	
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/irq/primary"),
+			 __stringify(GR712_IRL1_GPTIMER_1), buf);
+	sysobj_store_attr(sysset_find_obj(sys_set, "/sys/irq/primary"),
+			  __stringify(GR712_IRL1_GPTIMER_1), "", 0);
+	ui8 = (uint8_t)((hz * atoi(buf)) & 0xff);
+	CrIaPaste(IRL1_GPTIMER_1_ID, &ui8);
+
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/irq/primary"),
+			 __stringify(GR712_IRL1_GPTIMER_2), buf);
+	sysobj_store_attr(sysset_find_obj(sys_set, "/sys/irq/primary"),
+			  __stringify(GR712_IRL1_GPTIMER_2), "", 0);
+	ui8 = (uint8_t)((hz * atoi(buf)) & 0xff);
+	CrIaPaste(IRL1_GPTIMER_2_ID, &ui8);
+
+	
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/irq/primary"),
+			 __stringify(GR712_IRL1_GPTIMER_3), buf);
+	sysobj_store_attr(sysset_find_obj(sys_set, "/sys/irq/primary"),
+			  __stringify(GR712_IRL1_GPTIMER_3), "", 0);
+	ui8 = (uint8_t)((hz * atoi(buf)) & 0xff);
+	CrIaPaste(IRL1_GPTIMER_3_ID, &ui8);
+
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/irq/primary"),
+			 __stringify(GR712_IRL1_GRTIMER), buf);
+	sysobj_store_attr(sysset_find_obj(sys_set, "/sys/irq/primary"),
+			  __stringify(GR712_IRL1_GRTIMER), "", 0);
+	ui8 = (uint8_t)((hz * atoi(buf)) & 0xff);
+	CrIaPaste(IRL1_GRTIMER_ID, &ui8);
+
+	
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/irq/primary"),
+			 __stringify(GR712_IRL1_IRQMP), buf);
+	sysobj_store_attr(sysset_find_obj(sys_set, "/sys/irq/primary"),
+			  __stringify(GR712_IRL1_IRQMP), "", 0);
+	ui8 = (uint8_t)((hz * atoi(buf)) & 0xff);
+	CrIaPaste(IRL1_IRQMP_ID, &ui8);
+
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/irq/secondary"),
+			 __stringify(GR712_IRL2_GRSPW2_0), buf);
+	sysobj_store_attr(sysset_find_obj(sys_set, "/sys/irq/secondary"),
+			  __stringify(GR712_IRL2_GRSPW2_0), "", 0);
+	ui8 = (uint8_t)((hz * atoi(buf)) & 0xff);
+	CrIaPaste(IRL2_GRSPW2_0_ID, &ui8);
+
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/irq/secondary"),
+			 __stringify(GR712_IRL2_GRSPW2_1), buf);
+	sysobj_store_attr(sysset_find_obj(sys_set, "/sys/irq/secondary"),
+			  __stringify(GR712_IRL2_GRSPW2_1), "", 0);
+	ui8 = (uint8_t)((hz * atoi(buf)) & 0xff);
+	CrIaPaste(IRL2_GRSPW2_1_ID, &ui8);
+
+	
+	CrIaPaste(MILCUCCOARSETIME_ID, &ibsw_cfg.timer.mil_cuc_coarse);
+
+	ui16 = (uint16_t) ibsw_cfg.timer.mil_cuc_fine;
+	CrIaPaste(MILCUCFINETIME_ID, &ui16);
+
+	CrIaPaste(CUCCOARSETIME_ID, &ibsw_cfg.timer.cuc_coarse);
+
+	ui16 = (uint16_t) ibsw_cfg.timer.cuc_fine;
+	CrIaPaste(CUCFINETIME_ID, &ui16);
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/irq/primary"),
+			 __stringify(GR712_IRL1_AHBSTAT), buf);
+	/* reset statistic */
+	sysobj_store_attr(sysset_find_obj(sys_set, "/sys/irq/primary"),
+			  __stringify(GR712_IRL1_AHBSTAT), "", 0);
+
+	ui8 = (uint8_t) ((atoi(buf) * hz) & 0xff); /* rate per second */
+	CrIaPaste(IRL1_AHBSTAT_ID, &ui8);
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/irq/primary"),
+			 __stringify(GR712_IRL1_GPIO6), buf);
+	/* reset statistic */
+	sysobj_store_attr(sysset_find_obj(sys_set, "/sys/irq/primary"),
+			  __stringify(GR712_IRL1_GPIO6), "", 0);
+
+	ui8 = (uint8_t) (atoi(buf) & 0xff);
+	CrIaPaste(IRL1_GRGPIO_6_ID, &ui8);
+
+
+	/* dynamic buffers */
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/mem"), "dbs", buf);
+	ui32 = atoi(buf);
+	CrIaPaste(S1ALLOCDBS_ID, &ui32);
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/mem"), "sw", buf);
+	ui32 = atoi(buf);
+	CrIaPaste(S1ALLOCSW_ID, &ui32);
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/mem"), "heap", buf);
+	ui32 = atoi(buf);
+	CrIaPaste(S1ALLOCHEAP_ID, &ui32);
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/mem"), "flash", buf);
+	ui32 = atoi(buf);
+	CrIaPaste(S1ALLOCFLASH_ID, &ui32);
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/mem"), "aux", buf);
+	ui32 = atoi(buf);
+	CrIaPaste(S1ALLOCAUX_ID, &ui32);
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/mem"), "res", buf);
+	ui32 = atoi(buf);
+	CrIaPaste(S1ALLOCRES_ID, &ui32);
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/mem"), "swap", buf);
+	ui32 = atoi(buf);
+	CrIaPaste(S1ALLOCSWAP_ID, &ui32);
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/mem"), "sdb", buf);
+	ui32 = atoi(buf);
+	CrIaPaste(S2ALLOCSCIHEAP_ID, &ui32);
+
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/edac"),
+			 "singlefaults", buf);
+	ui16 = (uint16_t) atoi(buf);
+	CrIaPaste(EDACSINGLEFAULTS_ID, &ui16);
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/edac"),
+			 "doublefaults", buf);
+	ui8 = (uint8_t) atoi(buf);
+	CrIaPaste(EDACDOUBLEFAULTS_ID, &ui8);
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/edac"),
+			 "lastsingleaddr", buf);
+	ui32 = atoi(buf);
+	CrIaPaste(EDACLASTSINGLEFAIL_ID, &ui32);
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/edac"),
+			 "lastdoubleaddr", buf);
+	ui32 = atoi(buf);
+	CrIaPaste(EDACDOUBLEFADDR_ID, &ui32);
+
+	
+	ui8 = ibsw_cfg.isErrLogValid;
+	CrIaPaste(ISERRLOGVALID_ID, &ui8);
+}
+
+
+/**
+ * @brief data pool update function for FPGA analog values
+ */
+
+void CrIbUpdateDataPoolVariablesWithFpgaValues(void)
+{
+	uint16_t adcval;
+	float fval;
+
+	uint16_t tmp16;
+
+        /* BEE and SEM PSU Supply Voltages */
+	adcval = fpga_adc_get_adc_p3v3();
+	CrIaPaste(ADC_P3V3_RAW_ID, &adcval);
+        fval = convertToVoltEngVal_DPU(adcval, ADC_P3V3_ID);
+	CrIaPaste(ADC_P3V3_ID, &fval);
+	
+	adcval = fpga_adc_get_adc_p5v();
+	CrIaPaste(ADC_P5V_RAW_ID, &adcval);
+	fval = convertToVoltEngVal_DPU(adcval, ADC_P5V_ID);
+	CrIaPaste(ADC_P5V_ID, &fval);
+ 
+	adcval = fpga_adc_get_adc_p1v8();
+	CrIaPaste(ADC_P1V8_RAW_ID, &adcval);
+	fval = convertToVoltEngVal_DPU(adcval, ADC_P1V8_ID);
+	CrIaPaste(ADC_P1V8_ID, &fval);
+
+	adcval = fpga_adc_get_adc_p2v5();
+	CrIaPaste(ADC_P2V5_RAW_ID, &adcval);
+	fval = convertToVoltEngVal_DPU(adcval, ADC_P2V5_ID);
+	CrIaPaste(ADC_P2V5_ID, &fval);
+
+	adcval = fpga_adc_get_adc_n5v();
+	CrIaPaste(ADC_N5V_RAW_ID, &adcval);
+	fval = convertToVoltEngVal_DPU(adcval, ADC_N5V_ID);
+	CrIaPaste(ADC_N5V_ID, &fval);
+
+	adcval = fpga_adc_get_adc_pgnd();
+	CrIaPaste(ADC_PGND_RAW_ID, &adcval);
+	fval = convertToVoltEngVal_DPU(adcval, ADC_PGND_ID);
+	CrIaPaste(ADC_PGND_ID, &fval);
+
+	adcval = fpga_adc_get_adc_temp1();
+	CrIaPaste(ADC_TEMP1_RAW_ID, &adcval);	
+	fval = convertToTempEngVal_DPU(adcval) + CONVERT_KTODEGC;
+	CrIaPaste(ADC_TEMP1_ID, &fval);
+
+	adcval = fpga_adc_get_adc_tempoh1a();
+	CrIaPaste(ADC_TEMPOH1A_RAW_ID, &adcval);
+	fval = convertToTempEngVal(adcval, ADC_TEMPOH1A_ID) + CONVERT_KTODEGC;
+	CrIaPaste(ADC_TEMPOH1A_ID, &fval);
+
+	adcval = fpga_adc_get_adc_tempoh1b();
+	CrIaPaste(ADC_TEMPOH1B_RAW_ID, &adcval);
+	fval = convertToTempEngVal(adcval, ADC_TEMPOH1B_ID) + CONVERT_KTODEGC;
+	CrIaPaste(ADC_TEMPOH1B_ID, &fval);
+
+	adcval = fpga_adc_get_adc_tempoh2a();
+	CrIaPaste(ADC_TEMPOH2A_RAW_ID, &adcval);
+	fval = convertToTempEngVal(adcval, ADC_TEMPOH2A_ID) + CONVERT_KTODEGC;
+	CrIaPaste(ADC_TEMPOH2A_ID, &fval);
+
+	adcval = fpga_adc_get_adc_tempoh2b();
+	CrIaPaste(ADC_TEMPOH2B_RAW_ID, &adcval);
+	fval = convertToTempEngVal(adcval, ADC_TEMPOH2B_ID) + CONVERT_KTODEGC;
+	CrIaPaste(ADC_TEMPOH2B_ID, &fval);
+
+	adcval = fpga_adc_get_adc_tempoh3a();
+	CrIaPaste(ADC_TEMPOH3A_RAW_ID, &adcval);
+	fval = convertToTempEngVal(adcval, ADC_TEMPOH3A_ID) + CONVERT_KTODEGC;
+	CrIaPaste(ADC_TEMPOH3A_ID, &fval);
+
+	adcval = fpga_adc_get_adc_tempoh3b();
+	CrIaPaste(ADC_TEMPOH3B_RAW_ID, &adcval);
+	fval = convertToTempEngVal(adcval, ADC_TEMPOH3B_ID) + CONVERT_KTODEGC;
+	CrIaPaste(ADC_TEMPOH3B_ID, &fval);
+
+	adcval = fpga_adc_get_adc_tempoh4a();
+	CrIaPaste(ADC_TEMPOH4A_RAW_ID, &adcval);
+	fval = convertToTempEngVal(adcval, ADC_TEMPOH4A_ID) + CONVERT_KTODEGC;
+	CrIaPaste(ADC_TEMPOH4A_ID, &fval);
+
+	adcval = fpga_adc_get_adc_tempoh4b();
+	CrIaPaste(ADC_TEMPOH4B_RAW_ID, &adcval);
+	fval = convertToTempEngVal(adcval, ADC_TEMPOH4B_ID) + CONVERT_KTODEGC;
+	CrIaPaste(ADC_TEMPOH4B_ID, &fval);
+
+	adcval = fpga_adc_get_sem_p15v();
+	CrIaPaste(SEM_P15V_RAW_ID, &adcval);
+	fval = convertToVoltEngVal_PSU(adcval, SEM_P15V_ID);
+	CrIaPaste(SEM_P15V_ID, &fval);
+
+	adcval = fpga_adc_get_sem_p30v();
+	CrIaPaste(SEM_P30V_RAW_ID, &adcval);
+	fval = convertToVoltEngVal_PSU(adcval, SEM_P30V_ID);
+	CrIaPaste(SEM_P30V_ID, &fval);
+
+	adcval = fpga_adc_get_sem_p5v0();
+	CrIaPaste(SEM_P5V0_RAW_ID, &adcval);
+	fval = convertToVoltEngVal_PSU(adcval, SEM_P5V0_ID);
+	CrIaPaste(SEM_P5V0_ID, &fval);
+
+	adcval = fpga_adc_get_sem_p7v0();
+	CrIaPaste(SEM_P7V0_RAW_ID, &adcval);
+	fval = convertToVoltEngVal_PSU(adcval, SEM_P7V0_ID);
+	CrIaPaste(SEM_P7V0_ID, &fval);
+
+	adcval = fpga_adc_get_sem_n5v0();
+	CrIaPaste(SEM_N5V0_RAW_ID, &adcval);
+	fval = convertToVoltEngVal_PSU(adcval, SEM_N5V0_ID);
+	CrIaPaste(SEM_N5V0_ID, &fval);
+
+
+	tmp16 = (uint16_t) (fpga_version_reg_get() & 0xFFFF);
+	CrIaPaste(FPGA_VERSION_ID, &tmp16);
+
+	tmp16 = (uint16_t) (fpga_dpu_status_reg_get() & 0xFFFF);
+	CrIaPaste(FPGA_DPU_STATUS_ID, &tmp16);
+
+	tmp16 = (uint16_t) (fpga_dpu_addr_reg_get() & 0xFFFF);
+	CrIaPaste(FPGA_DPU_ADDRESS_ID, &tmp16);
+
+	tmp16 = (uint16_t) (fpga_reset_status_get() & 0xFFFF);
+	CrIaPaste(FPGA_RESET_STATUS_ID, &tmp16);
+
+	tmp16 = (uint16_t) (fpga_sem_status_reg_get() & 0xFFFF);
+	CrIaPaste(FPGA_SEM_STATUS_ID, &tmp16);
+
+	tmp16 = (uint16_t) (fpga_oper_heater_status_reg_get() & 0xFFFF);
+	CrIaPaste(FPGA_OPER_HEATER_STATUS_ID, &tmp16);
+
+
+	return;
+}
+
diff --git a/IBSW/lib/ibsw_interface/ibsw_error_log.c b/IBSW/lib/ibsw_interface/ibsw_error_log.c
new file mode 100644
index 0000000..b4f0ac7
--- /dev/null
+++ b/IBSW/lib/ibsw_interface/ibsw_error_log.c
@@ -0,0 +1,547 @@
+/**
+ * @file   ibsw_error_log.c
+ * @ingroup ibsw_interface
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ *	   Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @date   July, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief implements an IBSW <> IASW interface to the error log
+ * @see IBSW specification rev 6 chapter 7.1
+ *
+ *
+ *
+ * ## Overview
+ *
+ * ## Mode of Operation
+ *
+ * ### RAM error log
+ *
+ * A call interface wrapper CrIbLogError() for the IASW to add entries to the
+ * error log is provided. The wrapper uses a counter to track the number of
+ * entries added since the boot of the IASW. Note that this is not the same as
+ * the number of entries in the error log.
+ *
+ * The initial configuration of the RAM error log is done during ibsw_init()
+ *
+ *
+ * ### RAM error log dump
+ *
+ * The contents of the RAM error log buffer can be dumped into a buffer
+ * by calling CrIbDumpRamErrorLog(). Entries are added in reverse order from
+ * last added to oldest.
+ *
+ * ### Flash error log dump
+ *
+ * This function reads a block page by page until it encounters the end of a
+ * block. Entries are  expected to be in chronological order and are stored in
+ * one chunk from the start of a page. The end of a chunk is determined from the
+ * first 8 bytes having all bits set (i.e. empty NAND flash). If the end of a
+ * chunk is encountered, reading continues with the next page and so on, until
+ * the end of the block is reached. At the end of the block, the buffer contents
+ * are reversed, so that the entry order is from newest to oldest.
+ *
+ * @note
+ *	This legal due to the size of an error log entry being 20 bytes and a
+ *	flash page being 4096 bytes. If a page is read completely without
+ *	encountering at least 16 empty bytes, the page is therefore invalid or
+ *	does not contain an error log at all.
+ *	In any case, the flash dump function cannot verify if the data read
+ *	indeed consists of error log entries.
+ *
+ *
+ * ### Error log to FLASH
+ *
+ * If configured, new entries in the RAM error log are periodically flushed to
+ * FLASH at the end of an IASW cycle. Each entry is duplicated into two
+ * different FLASH blocks. After boot and configuration update from Ground, the
+ * selected FLASH blocks are erased and written with binary dumps of type struct
+ * error_log_entry extracted from the error log. The page and in-page offsets
+ * are incremented on each write until the write process encounters an error or
+ * is deliberately disabled.
+ *
+ *
+ *
+ * @startuml {error_log_flush.svg} "Error log write to FLASH" width=10
+ * start
+ *
+ * if (log emtpy) then (yes)
+ *	stop
+ * endif
+ *
+ * if (!ERR_LOG_ENB) then (yes)
+ *	stop
+ * endif
+ *
+ * if (inside SAA) then (yes)
+ *	stop
+ * endif
+ *
+ * if (flash block init) then (no)
+ *	stop
+ * endif
+ *
+ * if (init write) then (error)
+ *	:report error;
+ *	:disable log write;
+ *	stop
+ * endif
+ *
+ * while (log entry?)
+ *	: read entry;
+ *	:write log entry to flash;
+ *	:update page offset;
+ *	if (page exceeded next write) then (yes)
+ *		:next page;
+ *		if (block exceeded) then
+ *			:rotate to next block;
+ *			:break;
+ *		endif
+ *	endif
+ * endwhile
+ *
+ * if (stop write) then (error)
+ *	:report error;
+ *	:disable log write;
+ *	stop
+ * endif
+ *
+ * stop
+ * @enduml
+ *
+ *
+ * ### Configuration changes
+ * If the address of one of the FLASH blocks changes during operation, the
+ * new block is erased and used for writing.
+ *
+ *
+ * ## Error Handling
+ *
+ * If an error is encountered during a write of any of the flash blocks,
+ * an event report is issued.
+ *
+ * Errors may occur due to the following causes:
+ * - the flash unit or block address is invalid
+ * - the flash block is full and cannot be written
+ * - the flash device encountered an error during a write and the block is now
+ *   marked invalid
+ *
+ * ## Notes
+ * - at this time, every execution of this function that writes log entries will
+ *   do so at the start of a new page
+ *
+ * - an entry in the error log is currently 20 bytes. In order not to
+ *   divide entries between pages, they are never fully written, i.e. the last
+ *   4 bytes of any page (4096 words/16kiB) will never contain any error log
+ *   data.
+ *
+ * - valid log sections in flash pages can be identified by checking for
+ *   flash entries marked empty (0xffffffff)
+ *
+ */
+
+
+#include <stdint.h>
+#include <string.h>
+
+#include <compiler.h>
+
+#include <iwf_flash.h>
+#include <event_report.h>
+#include <error_log.h>
+
+
+#include <ibsw_interface.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <errors.h>
+
+
+static uint32_t error_log_entries_made_since_IBSW_IASW_started;
+
+
+compile_time_assert(sizeof(struct error_log_entry) % sizeof(uint32_t) == 0,
+		    ERR_LOG_ENTRY_NOT_MULTIPLE_OF_4);
+
+/**
+ * @brief add an entry to the error log in RAM
+ *
+ * @param evtId   an event id
+ * @param evtData pointer to a buffer containing ERROR_LOG_INFO_SIZE bytes;
+ *                unused bytes should be zero
+ */
+
+void CrIbLogError(unsigned short evtId, unsigned char *evtData)
+{
+	CrFwTimeStamp_t time;
+
+
+	time = CrIbGetCurrentTime();
+
+	error_log_add_entry(ibsw_cfg.error_log, (struct event_time *) &time,
+			    (uint16_t) evtId, (uint8_t *) evtData);
+
+	error_log_entries_made_since_IBSW_IASW_started++;
+}
+
+
+/**
+ * @brief get a dump of the error log in order from newest to oldest
+ */
+
+void CrIbDumpRamErrorLog(unsigned char *buf)
+{
+	error_log_dump_reverse(ibsw_cfg.error_log, (uint8_t *) buf);
+}
+
+
+/**
+ *
+ * @brief reverse the items in a buffer
+ *
+ * @param buf the buffer containing the items
+ * @param tmp_elem a temporary storage location, minimum size of one item
+ * @param idx the index to start reversing from
+ * @param buf_len the number of elements in the buffer
+ * @param elem_size the storage size of one item
+ *
+ * @note
+ *	uses a single buffer and an intermediate single-element swap
+ *	buffer in order to use as little memory as possible
+ */
+
+static void reverse_buffer_by_index(void *buf, void *tmp_elem,
+				    uint32_t idx, uint32_t buf_len,
+				    uint32_t elem_size)
+{
+	uint32_t i;
+
+
+	for (i = 0; i < buf_len; i++) {
+
+		if (i >= idx) {
+			i   += idx;
+			idx  = (buf_len - 1);
+			continue;
+		}
+
+		memcpy((uint8_t *) tmp_elem, (uint8_t *) buf + idx * elem_size,
+		       elem_size);
+
+		memcpy((uint8_t *) buf + idx * elem_size,
+		       (uint8_t *) buf + i   * elem_size, elem_size);
+
+		memcpy((uint8_t *) buf + i   * elem_size, (uint8_t *) tmp_elem,
+		       elem_size);
+
+		idx--;
+	}
+}
+
+
+
+/**
+ * @brief locate and dump an error log in FLASH in order from newest to oldest
+ *
+ * @param unit the flash unit
+ * @param addr the logical flash address
+ * @param buf a buffer to store the dump into
+ *
+ * @return 0 on error, number of flash entries dumped to buffer otherwise
+ *
+ * @note this function will at most write a buffer the size of one FLASH block
+ * @note the supplied buffer also serves as scratch buffer
+ *
+ */
+
+uint32_t CrIbDumpFlashErrorLog(unsigned int unit, unsigned int addr, char *buf)
+{
+
+	uint32_t idx = 0;
+
+	uint32_t i;
+	uint32_t block, page, offset;
+
+	struct error_log_entry log_entry;
+
+	struct error_log_entry *log;
+
+	const uint32_t log_entry_len = sizeof(struct error_log_entry) /
+				       sizeof(uint32_t);
+
+
+
+	flash_reverse_logical_addr(addr, &block, &page, &offset);
+
+	if (flash_init_read(unit, block, page, offset))
+		goto exit;
+
+
+	log = (struct error_log_entry *) buf;
+
+
+	while (1) {
+
+		if ((offset + log_entry_len) >= FLASH_PAGE_SIZE) {
+
+			offset = 0;
+			page++;
+
+			/* end of block, we're done */
+			if (page >= FLASH_PAGES_PER_BLOCK)
+				break;
+
+			/* might be empty; just break here, since we should have
+			 * alreay collected at least one entry
+			 * if the address does not work at all, we exit above
+			 * anyways
+			 */
+			if (flash_init_read(unit, block, page, offset))
+				break;
+		}
+
+		/* retval can be ignored, size checked above */
+		flash_read_bypass_edac(unit, 0, (uint32_t *) &log_entry,
+				  log_entry_len);
+
+		offset += log_entry_len;
+
+		/* if first 8 bytes are empty, we can assume that the rest is
+		 * empty as well, since the former hold the time stamps and
+		 * event id
+		 */
+
+		i = __builtin_popcount(((uint32_t *) &log_entry)[0]) +
+		    __builtin_popcount(((uint32_t *) &log_entry)[1]);
+
+		if (i == (2 * __CHAR_BIT__ * sizeof(uint32_t))) {
+			offset = FLASH_PAGE_SIZE;
+			continue; /* go to next page */
+		}
+
+		/* add to "log" */
+		memcpy((void *) &log[idx], (void *) &log_entry,
+		       sizeof(struct error_log_entry));
+
+		idx++;
+	}
+
+	/* the reversing index marker is always the last element */
+	reverse_buffer_by_index(log, &log_entry, idx - 1, idx,
+				sizeof(struct error_log_entry));
+
+exit:
+	return idx;
+}
+
+
+/**
+ *
+ * @brief get the number of error log entries made since the IBSW/IASW was last
+ *       started
+ */
+
+uint32_t get_error_log_entires_made_since_IBSW_IASW_started(void)
+{
+	return error_log_entries_made_since_IBSW_IASW_started;
+}
+
+
+/**
+ * @brief update and initialise a flash error log location
+ *
+ * @param addr the address from the datapool
+ * @param unit the unit from the datapool
+ *
+ * @param[inout] flash_addr the current logical flash address
+ * @param[inout] flash_unit the current flash unit
+ *
+ * @return 0 if no action, 1 if updated, -1 on error
+ */
+
+static int32_t error_log_flash_init(uint32_t addr, uint16_t unit,
+				    uint32_t *flash_addr, uint32_t *flash_unit)
+{
+	uint32_t block, page, offset;
+	uint16_t event_data[2];
+
+	if ((*flash_addr) == addr)
+		if ((*flash_unit) == (uint32_t) unit)
+			return 0;
+
+	(*flash_addr) = addr;
+	(*flash_unit) = (uint32_t) unit;
+
+	flash_reverse_logical_addr(addr, &block, &page, &offset);
+
+	if (flash_erase_block(unit, block))
+	  {
+	    if (errno == ERR_FLASH_BLOCK_INVALID)
+	      {
+		event_data[0] = unit;
+		event_data[1] = (uint16_t) block;
+		CrIaEvtRaise(CRIA_SERV5_EVT_ERR_MED_SEV,
+			     CRIA_SERV5_EVT_FL_FBF_BB, event_data, 4);
+		return -1;
+	      }
+	    else
+	      {
+		event_report(ERRLOG, HIGH, addr);
+		return -1; /* errno set in call */
+	      }
+	  }
+
+	return 1;
+}
+
+
+/**
+ *
+ * @brief transfer new error log entries to flash
+ *
+ * @return number of error log entries moved to flash or -1 on error
+ *
+ */
+int32_t error_log_move_to_flash(void)
+{
+
+#define EL_FLASH_BLOCKS 2
+
+	int32_t ret;
+
+	uint8_t tmp8;
+
+	uint32_t i, n;
+
+	struct error_log_entry log_entry;
+
+
+	static uint32_t el_addr = 0xffffffff; /* NOTE: must be static */
+	static uint32_t el_unit = 0xff; /* NOTE: must be static */
+	static uint32_t store, el_block, el_page, el_offset;
+
+	static uint8_t err_log_enb;
+
+
+	uint16_t get_el_unit[EL_FLASH_BLOCKS];
+	uint32_t get_el_addr[EL_FLASH_BLOCKS];
+
+	const uint32_t log_entry_len = sizeof(struct error_log_entry) /
+				       sizeof(uint32_t);
+
+	const uint32_t log_page_max  = log_entry_len * ERROR_LOG_MAX_ENTRIES;
+
+
+	/* if the error log was disabled in the previous cycle and that status
+	 * changed, update the status and set isErrLogValid),
+	 */
+	CrIaCopy(ERR_LOG_ENB_ID, &tmp8);
+
+	if (!err_log_enb && tmp8)
+	        ibsw_cfg.isErrLogValid = 1;
+
+	err_log_enb = tmp8;		/* update status */
+
+	if (!err_log_enb)		/* disabled, abort */
+		return -1;
+
+	if (!ibsw_cfg.isErrLogValid)	/* invalid, abort */
+		return -1;
+
+	CrIaCopy(ISSAAACTIVE_ID, &tmp8);
+	if (tmp8)
+		return -1;	/* inside SAA, ignore */
+
+	/* no new log entries */
+	if (!error_log_num_entries(ibsw_cfg.error_log))
+		return 0;
+
+
+	/* if ground changes the current error log location, log writing will
+	 * automatically switch to the new block
+	 */
+
+	CrIaCopy(EL1_CHIP_ID, &get_el_unit[0]);
+	CrIaCopy(EL2_CHIP_ID, &get_el_unit[1]);
+
+	CrIaCopy(EL1_ADDR_ID, &get_el_addr[0]);
+	CrIaCopy(EL2_ADDR_ID, &get_el_addr[1]);
+
+	ret = error_log_flash_init(get_el_addr[store], get_el_unit[store],
+					   &el_addr, &el_unit);
+
+	if (ret == -1)
+		goto flash_error;
+
+
+	/* new block to write */
+	if (ret == 1)
+		flash_reverse_logical_addr(el_addr,  &el_block,
+					   &el_page, &el_offset);
+
+	if (flash_init_write(el_unit, el_block, el_page, el_offset)) {
+		event_report(ERRLOG, HIGH, el_addr);
+		goto flash_error;
+	}
+
+
+	n = error_log_num_entries(ibsw_cfg.error_log);
+
+	for (i = 0; i < n; i++) {
+
+		if (!error_log_read_entry_raw(ibsw_cfg.error_log, &log_entry))
+			break;
+
+		flash_write(el_unit, (uint32_t *) &log_entry, log_entry_len);
+
+		el_offset += log_entry_len;
+
+		if ((el_offset + log_entry_len) > log_page_max) {
+
+			el_page++;
+
+			el_offset = 0;
+
+			if (el_page >= FLASH_PAGES_PER_BLOCK) {
+
+				store++;
+
+				if (store >= EL_FLASH_BLOCKS)
+					store = 0;
+			}
+
+			break; /* Break here, or the logic becomes
+				* nasty. In the few instances where this
+				* will be the case, we'll catch the
+				* remaining entries the next IASW cycle
+				*/
+		}
+	}
+
+	if (flash_stop_write(el_unit)) {
+		event_report(ERRLOG, HIGH, el_addr);
+		goto flash_error;
+	}
+
+
+	return 0;
+
+
+flash_error:
+	el_addr = 0xffffffff;
+	el_unit = 0xff;
+	ibsw_cfg.isErrLogValid = 0; /* BELG-7/A/T */
+
+	return -1;
+}
diff --git a/IBSW/lib/ibsw_interface/ibsw_execute_op.c b/IBSW/lib/ibsw_interface/ibsw_execute_op.c
new file mode 100644
index 0000000..7d549f7
--- /dev/null
+++ b/IBSW/lib/ibsw_interface/ibsw_execute_op.c
@@ -0,0 +1,287 @@
+/**
+ * @file   ibsw_execute_op.c
+ * @ingroup ibsw_interface
+ * @author Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   August, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief implements a IBSW functions that execute IASW tasks
+ *
+ */
+#include <stdint.h>
+
+#include <leon3_grtimer_longcount.h>
+#include <error_log.h>
+
+#include <ibsw_interface.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <Services/General/CrIaConstants.h> /* for event names */
+
+
+static unsigned int nOfNotif_ID[N_RT_CONT] = {
+	NOFNOTIF_1_ID, NOFNOTIF_2_ID, NOFNOTIF_3_ID, NOFNOTIF_4_ID,
+	NOFNOTIF_5_ID};
+
+static unsigned int nOfFuncExec_ID[N_RT_CONT] = {
+	NOFFUNCEXEC_1_ID, NOFFUNCEXEC_2_ID, NOFFUNCEXEC_3_ID, NOFFUNCEXEC_4_ID,
+	NOFFUNCEXEC_5_ID};
+
+static unsigned int wcetTimeStampFine_ID[N_RT_CONT] = {
+	WCETTIMESTAMPFINE_1_ID, WCETTIMESTAMPFINE_2_ID,	WCETTIMESTAMPFINE_3_ID,
+	WCETTIMESTAMPFINE_4_ID, WCETTIMESTAMPFINE_5_ID};
+
+static unsigned int wcetTimeStampCoarse_ID[N_RT_CONT] = {
+	WCETTIMESTAMPCOARSE_1_ID, WCETTIMESTAMPCOARSE_2_ID,
+	WCETTIMESTAMPCOARSE_3_ID, WCETTIMESTAMPCOARSE_4_ID,
+	WCETTIMESTAMPCOARSE_5_ID};
+
+static unsigned int et_ID[N_RT_CONT] = {
+	WCET_1_ID, WCET_2_ID, WCET_3_ID, WCET_4_ID, WCET_5_ID};
+
+static unsigned int etAver_ID[N_RT_CONT] = {
+	WCETAVER_1_ID, WCETAVER_2_ID, WCETAVER_3_ID, WCETAVER_4_ID,
+	WCETAVER_5_ID};
+
+static unsigned int wcetMax_ID[N_RT_CONT] = {
+	WCETMAX_1_ID, WCETMAX_2_ID, WCETMAX_3_ID, WCETMAX_4_ID, WCETMAX_5_ID};
+
+static unsigned int alpha_ID[N_RT_CONT] = {
+	THR_MA_A_1_ID, THR_MA_A_2_ID, THR_MA_A_3_ID, THR_MA_A_4_ID,
+	THR_MA_A_5_ID};
+
+
+static struct grtimer_uptime cycle_t0;
+
+
+/**
+ * @brief notify a RT container
+ * param    rt_id     RT container ID (1..N_RT_CONT)
+ */
+
+void notify_rt(uint32_t rt_id)
+{
+	unsigned int rt_idx = rt_id - 1;
+	unsigned int nOfNotif;
+
+	if (rt_idx >= N_RT_CONT)
+		return;
+
+	/* increment nOfNotif */
+	CrIaCopy(nOfNotif_ID[rt_idx], &nOfNotif);
+	nOfNotif++;
+	CrIaPaste(nOfNotif_ID[rt_idx], &nOfNotif);
+}
+
+
+void run_rt(uint32_t rt_id, float deadline, void (*behaviour) (void))
+{
+	unsigned int rt_idx = rt_id - 1;
+
+	struct grtimer_uptime in;
+	struct grtimer_uptime out;
+	float et, wcet, alpha, et_aver;
+	uint16_t tmp16;
+	unsigned int tmp32;
+	unsigned short event_data[2];
+	CrFwTimeStamp_t time;
+
+	/* increment nOfFuncExec */
+	CrIaCopy(nOfFuncExec_ID[rt_idx], &tmp32);
+	tmp32++;
+	CrIaPaste(nOfFuncExec_ID[rt_idx], &tmp32);
+
+	/* make timestamp */
+	grtimer_longcount_get_uptime(ibsw_cfg.timer.rtu, &in);
+
+	/* execute container-specific behaviour */
+	behaviour();
+
+	/* retrieve execution time */
+	grtimer_longcount_get_uptime(ibsw_cfg.timer.rtu, &out);
+	et = grtimer_longcount_difftime(ibsw_cfg.timer.rtu, out, in);
+
+	/* check if it is beyond deadline and emit an event if so */
+	if (deadline != 0.0f) {
+		if (et >= deadline) {
+			event_data[0] = rt_id;
+			/* extent of overrun is reported in ms */
+			tmp32 = (unsigned int)(1000 * (et-deadline));
+
+			/* saturate at 16 bit */
+			if (tmp32 > 0xffff)
+				event_data[1] = 0xffff;
+			else
+				event_data[1] = (unsigned short) tmp32;
+
+
+			CrIaEvtRaise(CRIA_SERV5_EVT_ERR_HIGH_SEV,
+				   CRIA_SERV5_EVT_THRD_OR, event_data, 4);
+		}
+	}
+
+	/* enter (WC)ET in Thread Log */
+	CrIaPaste(et_ID[rt_idx], &et);
+
+	/* compute average ET */
+	CrIaCopy(alpha_ID[rt_idx], &alpha);
+	CrIaCopy(etAver_ID[rt_idx], &et_aver);
+
+	et_aver = alpha * et_aver + (1.0 - alpha) * et;
+	CrIaPaste(etAver_ID[rt_idx], &et_aver);
+
+	/* compare ET with WCET (MAX) */
+	CrIaCopy(wcetMax_ID[rt_idx], &wcet);
+
+	if (et >= wcet) {
+		CrIaPaste(wcetMax_ID[rt_idx], &et);
+
+		/* enter current timestamp of the WCET in the Thread Log */
+		time = CrIbGetCurrentTime();
+		tmp32 = ((uint32_t) time.t[0] << 24) |
+			((uint32_t) time.t[1] << 16) |
+			((uint32_t) time.t[2] <<  8) |
+			 (uint32_t) time.t[3];
+
+		tmp16 = ((uint16_t)time.t[4] << 8) | ((uint16_t)time.t[5]);
+		CrIaPaste(wcetTimeStampFine_ID[rt_idx],   &tmp16);
+		CrIaPaste(wcetTimeStampCoarse_ID[rt_idx], &tmp32);
+	}
+}
+
+
+void execute_cyclical(void)
+{
+	notify_rt(RTCONT_CYC);
+
+	run_rt(RTCONT_CYC, DEADLINE_CYC, CrIaExecCycActivities);
+}
+
+
+void wrap_error_log_move_to_flash(void)
+{
+	/* to ignore the return value */
+	error_log_move_to_flash();
+}
+
+
+void execute_log_move_to_flash(void)
+{
+	notify_rt(RTCONT_ERRLOG);
+
+	run_rt(RTCONT_ERRLOG, DEADLINE_ERRLOG, wrap_error_log_move_to_flash);
+}
+
+
+void flash_functional_behaviour(void)
+{
+	uint32_t ready = 0;
+	struct grtimer_uptime now;
+	double trem;
+	uint8_t incStepCnt = 1;
+	uint32_t flashContStepCnt;
+	
+	if (flash_operation.isReady)
+		return; /* nothing to do */
+
+	grtimer_longcount_get_uptime(ibsw_cfg.timer.rtu, &now);	
+	trem = grtimer_longcount_difftime(ibsw_cfg.timer.rtu, now, cycle_t0);
+
+	while (!ready && (trem < RUNBEFORE_FLASH)) {
+		switch (flash_operation.op) {
+		case WRITE:
+
+			ready = CrIbFbfWriteBlock(flash_operation.fbf,
+						  flash_operation.mem);
+			break;
+
+		case READ:
+
+			ready = CrIbFbfReadBlock(flash_operation.fbf,
+					(uint32_t) flash_operation.block,
+					flash_operation.mem);
+			break;
+
+		default:
+			break;
+		}
+
+		grtimer_longcount_get_uptime(ibsw_cfg.timer.rtu, &now);
+		trem = grtimer_longcount_difftime(ibsw_cfg.timer.rtu, now, cycle_t0);
+
+		/* increment step counter if entered while-loop the first time */
+		if(incStepCnt) {
+			CrIaCopy(FLASHCONTSTEPCNT_ID, &flashContStepCnt);
+			flashContStepCnt++;
+			CrIaPaste(FLASHCONTSTEPCNT_ID, &flashContStepCnt);
+			incStepCnt = 0;
+		}
+	}
+
+	flash_operation.isReady = ready;
+
+	if (flash_operation.isReady) {
+		/* reset the step counter to zero */
+		flashContStepCnt = 0;
+		CrIaPaste(FLASHCONTSTEPCNT_ID, &flashContStepCnt);
+	}
+}
+
+
+/**
+ * @brief execute the FLASH reader/writer
+ *
+ * @param t0 a timestamp of type struct grtimer_uptime
+ */
+
+void execute_flash_op(struct grtimer_uptime t0)
+{
+	/* make the timestamp of the start of the cycle available to the
+	 * functional behaviour
+	 */
+	cycle_t0 = t0;
+
+	notify_rt(RTCONT_FLASH);
+
+	run_rt(RTCONT_FLASH, DEADLINE_FLASH, flash_functional_behaviour);
+}
+
+
+/**
+ * @brief execute the Compression on the second core through RT cont 5
+ *
+ */
+
+void execute_acquisition(void)
+{
+	notify_rt(RTCONT_ACQ);
+
+	/* run_rt(RTCONT_ACQ, DEADLINE_ACQ, wake_core2_for_acquisition); */
+	cpu1_notification(SDP_STATUS_ACQUISITION);
+}
+
+
+/**
+ * @brief execute the Compression on the second core through RT cont 5
+ *
+ */
+
+void execute_compression(void)
+{
+	notify_rt(RTCONT_CMPR);
+
+	/* run_rt(RTCONT_CMPR, DEADLINE_CMPR, wake_core2_for_compression); */
+	cpu1_notification(SDP_STATUS_SCIENCE);
+}
diff --git a/IBSW/lib/ibsw_interface/ibsw_fbf.c b/IBSW/lib/ibsw_interface/ibsw_fbf.c
new file mode 100644
index 0000000..c8eb1f3
--- /dev/null
+++ b/IBSW/lib/ibsw_interface/ibsw_fbf.c
@@ -0,0 +1,537 @@
+/**
+ * @file   ibsw_fbf.c
+ * @ingroup ibsw_interface
+ * @author Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   August, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief implements an IBSW <> IASW interface to the FLASH
+ *
+ * ## Overview
+ *
+ * These are functions to read and write flash based files. The functions
+ * CrIbFbfOpen() and CrIbFbfClose() set entries in the data pool for the IASW.
+ * CrIbFbfReadBlock() and CrIbFbfWriteBlock() contain the logic for reading and
+ * writing a block with a granularity of one page per call. These functions are
+ * executed in execute_flash_op().
+ *
+ * The functions CrIbFlashTriggerRead() and CrIbFlashTriggerWrite() are used
+ * by the IASW to start a read or write operation. The state of the flash
+ * operation may be queried by calling CrIbFlashIsReady().
+ *
+ * ## Mode of Operation
+ *
+ * ### CrIbFbfReadBlock()
+ *
+ * @startuml
+ *
+ * start
+ *
+ * if (!page) then (yes)
+ *	:load FBF address;
+ *	:load chip id;
+ *	:translate address;
+ *	:add block offset;
+ * endif
+ *
+ * if (init read ok) then (yes)
+ *	:get edac statistic;
+ *	:read page;
+ *	:get edac statistic;
+ *	if (FLASH EDAC occured) then (yes)
+ *		if (init read ok) then (yes)
+ *			:get edac statistic;
+ *			:read page;
+ *			:get edac statistic;
+ *			if (FLASH EDAC occured) then (yes)
+ *				:issue event report;
+ *				:set FBF invalid;
+ *				:set page = 0;
+ *				:return 1;
+ *				stop
+ *			endif
+ *
+ *		 	else
+ *			:issue event report;
+ *			:set FBF invalid;
+ *			:set page = 0;
+ *			:return 1;
+ *			stop
+ * 	 	endif
+ *
+ *	endif
+ *
+ *	:increment page;
+ *	if (page < FLASH_PAGES_PER_BLOCK) then (yes)
+ *		:return 0;
+ *		stop
+ *	endif
+ * else
+ *	:issue event report;
+ *	:set FBF invalid;
+ * endif
+ *
+ * :set page = 0;
+ * :return 1;
+ * stop
+ *
+ * @enduml
+ *
+ *
+ * This function returns 0 if more read operations are pending, or 1 on success
+ * or error. If an error occured, an event report is generated.
+ *
+ * As the IWF FLASH sometimes generates false-positive EDAC events, the FLASH
+ * EDAC statistic is compared to the value before a page read. If an event
+ * occured, the page is immedialtely re-read once. If an EDAC error occures
+ * again, the FBF is considered invalid.
+ *
+ *
+ *
+ * ### CrIbFbfWriteBlock()
+ *
+ *
+ * @startuml
+ *
+ * start
+ *
+ * if (!page) then (yes)
+ *	if (!FBF open) then (no)
+ *		:return 1;
+ *		stop
+ *	endif
+ *	if (FBF next block > FBF size) then (yes)
+ *		:return 1;
+ *		stop
+ *	endif
+ *	if (!FBF enabled) then (yes)
+ *		:return 1;
+ *		stop
+ *	endif
+ *	if (!FBF valid) then (yes)
+ *		:return 1;
+ *		stop
+ *	endif
+ *	if (SAA active) then (yes)
+ *		:return 1;
+ *		stop
+ *	endif
+ *	:load FBF address;
+ *	:load chip id;
+ *	:translate address;
+ *	:erase block;
+ * endif
+ *
+ * if (init write ok) then (yes)
+ *	:write page;
+ *	:increment page;
+ *	if (page < FLASH_PAGES_PER_BLOCK) then (yes)
+ *		:return 0;
+ *		stop
+ *	endif
+ * else
+ *	:issue event report;
+ *	:set FBF invalid;
+ * endif
+ *
+ * :set page = 0;
+ * if (write ok) then (yes)
+ *	:increment FBF next block;
+ *	else
+ *	:issue event report;
+ *	:set FBF invalid;
+ * endif
+ * :return 1;
+ * stop
+ *
+ * @enduml
+ *
+ *
+ * This function returns 0 if more write operations are pending, or 1 on success
+ * or error. If an error occured during a flash operation, an event report is
+ * generated. When performing a write cycle and 1 is returned on the initial
+ * call of this function, either the configuration in the IASW datapool for
+ * the FBF is invalid or the SAA flag is active. Note that this function does
+ * not abort already ongoing FLASH writes when the SAA is entered.
+ *
+ *
+ * ## Error Handling
+ *
+ * If either CrIbFbfReadBlock() or CrIbFbfWriteBlock() encounter an error, it is
+ * reported through the event report interface.
+ *
+ * ## Notes
+ *
+ * None
+ *
+ */
+#include <stdint.h>
+#include <stdlib.h>
+
+#include <iwf_flash.h>
+#include <event_report.h>
+
+#include <ibsw_interface.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <errors.h>
+
+
+uint32_t edac_err_cnt = 0; /* Mantis 2209 */
+
+
+/**
+ * @brief open a flash-based file
+ *
+ * @param fbf the number of the flash-based file
+ */
+
+void CrIbFbfOpen(uint32_t fbf)
+{
+	uint8_t tmp8;
+
+	uint16_t tmp16;
+
+
+	CrIaCopyArrayItem(ISFBFOPEN_ID, &tmp8, fbf);
+
+	if (tmp8)
+		return;
+
+
+	tmp16 = 0;
+	CrIaPasteArrayItem(FBFNBLOCKS_ID, &tmp16, fbf);
+
+	tmp8 = 1;
+	CrIaPasteArrayItem(ISFBFOPEN_ID, &tmp8, fbf);
+}
+
+
+/**
+ * @brief close a flash-based file
+ *
+ * @param fbf the number of the flash-based file
+ *
+ */
+
+void CrIbFbfClose(uint32_t fbf)
+{
+	uint8_t tmp8 = 0;
+
+	CrIaPasteArrayItem(ISFBFOPEN_ID, &tmp8, fbf);
+}
+
+
+/**
+ * @brief read a block from a flash-based file
+ *
+ * @param fbf the number of the flash-based file
+ * @param fbf_block the number of the block (withing the fbf) to read
+ * @param buf a pointer to a memory buffer to copy the block data to
+ *
+ * @return 0 if reads are pending, 1 otherwise
+ *
+ * @note This function remembers its last read position and will continue until
+ *       the flash block is fully read. Only the buffer reference can be updated
+ *       until the block read is complete, all other inputs are ignored.
+ */
+
+uint32_t CrIbFbfReadBlock(uint32_t fbf, uint32_t fbf_block, uint32_t *buf)
+{
+	uint8_t tmp8;
+
+	uint16_t tmp16;
+
+	static uint32_t addr, unit, block, page, offset;
+	uint32_t retry_page = 0;
+
+	char cb[16];
+
+
+	if (page)
+		goto read_continue;
+
+
+	CrIaCopyArrayItem(FBF_ADDR_ID, &addr, fbf);
+
+	CrIaCopyArrayItem(FBF_CHIP_ID, &tmp16, fbf);
+	unit = (uint32_t) tmp16;
+
+	flash_reverse_logical_addr(addr, &block, &page, &offset);
+
+	block += fbf_block;
+
+
+read_continue:
+
+	if (flash_init_read(unit, block, page, 0))
+		goto read_error;
+
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/edac"),
+			 "flash_errors", cb);
+	edac_err_cnt = strtoul(cb, NULL, 10);
+
+	if (flash_read(unit, 0, buf + page * FLASH_PAGE_SIZE, FLASH_PAGE_SIZE))
+		goto read_error;
+
+	/* if the FLASH EDAC error counter incremented, retry once */
+	sysobj_show_attr(sysset_find_obj(sys_set, "/sys/edac"),
+			 "flash_errors", cb);
+
+	if (edac_err_cnt < strtoul(cb, NULL, 10)) {
+		if (!retry_page) {
+			retry_page = 1;
+			goto read_continue;
+		} else {
+			goto read_error;
+		}
+	}
+
+
+	page++;
+
+
+	if (page < FLASH_PAGES_PER_BLOCK)
+		return 0;
+
+	goto read_complete;
+
+
+	/* this is only relevant if bad block reads are not allowed */
+read_error:
+
+	/* we do not want to report a read of an empty page */
+	if (errno != ERR_FLASH_ADDR_EMPTY)
+	        event_report(FBF, HIGH, fbf+1);
+
+	tmp8 = 0;
+	CrIaCopyArrayItem(ISFBFVALID_ID, &tmp8, fbf);
+
+
+read_complete:
+
+	page = 0;
+
+	return 1;
+}
+
+
+/**
+ * @brief write a block to a flash-based file
+ *
+ * @param fbf the number of the flash-based file
+ * @param buf a pointer to a memory buffer to copy the block data from
+ * @note  the memory buffer is expected to be the size of a flash block
+ *
+ * @return 0 if writes are pending, 1 otherwise
+ *
+ *
+ * @note this function remembers its last write position and will continue until
+ *       the flash block is fully written
+ */
+
+uint32_t CrIbFbfWriteBlock(uint32_t fbf, uint32_t *buf)
+{
+	uint8_t tmp8;
+
+	uint16_t tmp16, event_data[2];
+
+	static uint16_t n_blocks;
+
+	static uint32_t addr, unit, block, page, offset;
+
+
+	if (page)
+		goto write_continue; /* this block is already initialised */
+
+
+
+	CrIaCopyArrayItem(ISFBFOPEN_ID, &tmp8, fbf);
+
+	if (!tmp8)
+		return 1;	/* file not open */
+
+
+	CrIaCopyArrayItem(FBFNBLOCKS_ID, &n_blocks, fbf);
+
+	if (!(n_blocks < FBF_SIZE))
+		return 1;	/* full */
+
+
+	CrIaCopyArrayItem(FBF_ENB_ID, &tmp8, fbf);
+
+	if (!tmp8)
+		return 1;	/* file not enabled */
+
+
+	CrIaCopyArrayItem(ISFBFVALID_ID, &tmp8, fbf);
+
+	if (!tmp8)
+		return 1;	/* file not valid */
+
+
+	CrIaCopy(ISSAAACTIVE_ID, &tmp8);
+
+	if (tmp8)
+		return 1;	/* inside SAA */
+
+
+
+	CrIaCopyArrayItem(FBF_ADDR_ID, &addr, fbf);
+
+	CrIaCopyArrayItem(FBF_CHIP_ID, &tmp16, fbf);
+	unit = (uint32_t) tmp16;
+
+	flash_reverse_logical_addr(addr, &block, &page, &offset);
+
+
+	if (flash_erase_block(unit, block + n_blocks))
+	  {
+	    if (errno == ERR_FLASH_BLOCK_INVALID)
+	      {
+		/* corresponds to N1 */
+		event_data[0] = unit;
+		event_data[1] = (uint16_t) block;
+		CrIaEvtRaise(CRIA_SERV5_EVT_ERR_MED_SEV,
+			     CRIA_SERV5_EVT_FL_FBF_BB, event_data, 4);
+		goto write_error;
+	      }
+	    else
+	      {
+		/* corresponds to N3 */
+		event_report(FBF, HIGH, fbf+1);
+		goto write_error;
+	      }
+	  }
+
+write_continue:
+
+	if (flash_init_write(unit, block + n_blocks, page, 0))
+	  {
+	    /* corresponds to N3 */
+	    event_report(FBF, HIGH, fbf+1);
+	    goto write_error;
+	  }
+
+
+	flash_write(unit, buf + page * FLASH_PAGE_SIZE, FLASH_PAGE_SIZE);
+	page++;
+
+
+	if (flash_stop_write(unit))
+	  {
+	    /* corresponds to N3 */
+	    event_report(FBF, HIGH, fbf+1);
+	    goto write_error;
+	  }
+
+
+	if (page < FLASH_PAGES_PER_BLOCK)
+		return 0;
+
+
+	n_blocks++;
+	CrIaPasteArrayItem(FBFNBLOCKS_ID, &n_blocks, fbf);
+
+	goto write_complete;
+
+
+write_error:
+
+	tmp8 = 0;
+	CrIaPasteArrayItem(ISFBFVALID_ID, &tmp8, fbf);
+
+write_complete:
+
+	page = 0;
+
+	return 1;
+}
+
+
+/**
+ * @brief trigger a read operation on the flash via the FLASH operation thread
+ * @param fbf the flash based file id
+ * @param block the flash block
+ * @param mem the memory to read to
+ *
+ * return -1 on failure, 0 otherwise
+ */
+
+int32_t CrIbFlashTriggerRead(uint8_t fbf, uint16_t block, uint32_t *mem)
+{
+	uint32_t tmp;
+
+
+	if (!flash_operation.isReady)
+		return -1;
+
+	flash_operation.fbf     = fbf;
+	flash_operation.block   = block;
+	flash_operation.mem     = mem;
+	flash_operation.isReady = 0;
+	flash_operation.op      = READ;
+	flash_operation.error   = 0;
+
+	CrIaCopy(NOFFUNCEXEC_2_ID,   &tmp);
+	tmp++;
+	CrIaPaste(NOFFUNCEXEC_2_ID,  &tmp);
+
+	return 0;
+}
+
+
+/**
+ * @brief trigger a write operation on the flash via the FLASH operation
+ *	  thread
+ * @param fbf the flash based file id
+ * @param mem the memory to write from
+ *
+ * return -1 on failure, 0 otherwise
+ */
+
+int32_t CrIbFlashTriggerWrite(uint8_t fbf, uint32_t *mem)
+{
+	uint32_t tmp;
+
+
+	if (!flash_operation.isReady)
+		return -1;
+
+	flash_operation.fbf     = fbf;
+	flash_operation.mem     = mem;
+	flash_operation.isReady = 0;
+	flash_operation.op      = WRITE;
+	flash_operation.error   = 0;
+
+	CrIaCopy(NOFFUNCEXEC_2_ID,   &tmp);
+	tmp++;
+	CrIaPaste(NOFFUNCEXEC_2_ID,  &tmp);
+
+
+	return 0;
+}
+
+
+/**
+ * @brief query the status of the flash operation
+ *
+ * @return 0 if busy (read/write ongoing)
+ */
+
+uint8_t CrIbFlashIsReady(void)
+{
+	return flash_operation.isReady;
+}
diff --git a/IBSW/lib/ibsw_interface/ibsw_interface.c b/IBSW/lib/ibsw_interface/ibsw_interface.c
new file mode 100644
index 0000000..46c90fc
--- /dev/null
+++ b/IBSW/lib/ibsw_interface/ibsw_interface.c
@@ -0,0 +1,47 @@
+/**
+ * @file   ibsw_interface.c
+ * @ingroup ibsw_interface
+ * @author Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   August, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @defgroup ibsw_interface IBSW <> IASW interface
+ * @brief implements the specified IBSW <> IASW interface
+ *
+ *
+ * ## Overview
+ *
+ * This group of functions implement interfaces for the IASW.
+ *
+ * ## Mode of Operation
+ *
+ * Please check out the detailed description sections of the various member
+ * files.
+ *
+ * ## Error Handling
+ *
+ * Error handling is specific to a components.
+ *
+ * ## Notes
+ *
+ * None.
+ *
+ */
+
+#include <ibsw_interface.h>
+
+/* no way around a global due to the interface design */
+struct ibsw_config ibsw_cfg;
+struct flash_operation flash_operation;
+
+
diff --git a/IBSW/lib/ibsw_interface/ibsw_memscrub.c b/IBSW/lib/ibsw_interface/ibsw_memscrub.c
new file mode 100644
index 0000000..f52551c
--- /dev/null
+++ b/IBSW/lib/ibsw_interface/ibsw_memscrub.c
@@ -0,0 +1,157 @@
+/**
+ * @file   ibsw_memscrub.c
+ * @ingroup ibsw_interface
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   August, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief implements an IBSW <> IASW interface to memory scrubbing
+ *
+ *
+ * ## Overview
+ *
+ * These are functions to execute a memory scrubbing and repair cycle.
+ *
+ * ## Mode of Operation
+ *
+ * ### CrIbScrubMemory()
+ *
+ * This function executes a scrub cycle on the selected RAM area from the last
+ * scrubbed position. The scrub position will wrap to the start of the memory
+ * if the upper boundary is exceeded.
+ *
+ * @note Since memscrub() executes a scrub as an array addr[0] ... addr[n],
+ * every call to this function will scrub at least one memory address even if
+ * the length argument is 0. If you do not want to scrub, do not call this
+ * function.
+ *
+ * ### CrIbMemRepair()
+ *
+ * This is a name-comliant wrapper call to memscrub_repair()
+ *
+ * ### CrIbInjectFault()
+ *
+ * This function can be used to inject invalid data word/EDAC checkbit
+ * combinations into memory for EDAC testing purposes.
+ *
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ * ## Notes
+ *
+ * None
+ * @brief memory scrubbing of a range addr[0] ... addr[n] at a time
+ */
+
+#include <stdint.h>
+
+#include <edac.h>
+#include <memcfg.h>
+#include <memscrub.h>
+#include <wrap_malloc.h>
+
+#include <ibsw_interface.h>
+
+
+/**
+ * @brief execute the scrubbing operation
+ * @param pos the starting position in memory
+ * @param mem_start the lower bound of the memory region
+ * @param mem_end   the upper bound of the memory region
+ * @param scrubLen  the number of 32bit words to scrub
+ */
+
+static uint32_t execute_scrub(uint32_t pos, uint32_t mem_start,
+			      uint32_t mem_end, uint32_t scrubLen)
+{
+	if (pos >= mem_end)
+		pos = mem_start;
+
+	if (pos < mem_start)
+		pos = mem_start;
+
+	if ((mem_end - pos) < (scrubLen * sizeof(uint32_t)))
+		scrubLen = (mem_end - pos) / sizeof(uint32_t);
+
+	return (uint32_t) memscrub((uint32_t *) pos, scrubLen);
+}
+
+
+/**
+ * @brief High level memory scrubber. This finds errors and enters them in the
+ *	  scrublist for later repair.
+ * @param memId the id of the memory to scrub
+ * @param scubLen the number of 32 bit words to scrub
+ *
+ * @return last scrubbed address or 0 on error
+ */
+
+uint32_t CrIbScrubMemory(enum scrubmem memId, uint32_t scrubLen)
+{
+	uint32_t addr = 0;
+
+	uint32_t sram1_scrub_pos;
+	uint32_t sram2_scrub_pos;
+
+	CrIaCopy(SRAM1SCRCURRADDR_ID, &sram1_scrub_pos);
+	CrIaCopy(SRAM2SCRCURRADDR_ID, &sram2_scrub_pos);
+
+	switch (memId) {
+
+	case SRAM1_ID:
+		addr = execute_scrub(sram1_scrub_pos, SRAM1_ADDR,
+				     SRAM1_END, scrubLen);
+		sram1_scrub_pos = addr;
+		break;
+
+	case SRAM2_ID:
+		addr = execute_scrub(sram2_scrub_pos, SRAM2_ADDR,
+				     SRAM2_END, scrubLen);
+		sram2_scrub_pos = addr;
+	}
+
+	CrIaPaste(SRAM1SCRCURRADDR_ID, &sram1_scrub_pos);
+	CrIaPaste(SRAM2SCRCURRADDR_ID, &sram2_scrub_pos);
+
+	return addr;
+}
+
+
+/**
+ * @brief Repairs addresses that were entered in the scrublist.
+ */
+
+uint32_t CrIbMemRepair(void)
+{
+	return memscrub_repair();
+}
+
+
+/**
+ * @brief write a faulty value/edac check bit combination to a memory location
+ *
+ * @param mem_value	a 32-bit value to write to memory
+ * @param edac_value	a 32-bit value to use as input for the calculation of
+ *                      the edac checkbits
+ * @param addr		a pointer to a memory location
+ *
+ * @note mem_value and edac_value should be off by one or two bits to inject a
+ *       single or double fault respectively, otherwise the outcome may be
+ *       either
+ */
+
+void CrIbInjectFault(uint32_t mem_value, uint32_t edac_value, void *addr)
+{
+	memcfg_bypass_write(addr, mem_value, edac_checkbits(edac_value));
+}
diff --git a/IBSW/lib/ibsw_interface/ibsw_spw.c b/IBSW/lib/ibsw_interface/ibsw_spw.c
new file mode 100644
index 0000000..3222c5f
--- /dev/null
+++ b/IBSW/lib/ibsw_interface/ibsw_spw.c
@@ -0,0 +1,393 @@
+/**
+ * @file   ibsw_spw.c
+ * @ingroup ibsw_interface
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   August, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief implements an IBSW <> IASW interface to the SpaceWire device
+ *
+ *
+ * ## Overview
+ *
+ * These are function to "collect" and "hand over" packets from and to the SpW
+ * interface to the SEM. These function calls are part of the
+ * IASW/CrFramework/FwProfile input/output scheme.
+ *
+ * ## Mode of Operation
+ *
+ * ### CrIbIsSemPcktAvail()
+ *
+ * @startuml
+ *
+ * start
+ *
+ * if (packets delivered < MAX_SEM_PCKT_CYC) then (yes)
+ *	if (SpW packets available) then (yes)
+ *		if (packet size ok) then (yes)
+ *			:return 1;
+ *			stop
+ *		else
+ *			:drop packet;
+ *		endif
+ *	endif
+ * endif
+ * :return 0;
+ * stop
+ *
+ * @enduml
+ *
+ * This function checks if at least one packet has been received on the SpW
+ * interface. If the packet size is within bounds, 1 is returned otherwise the
+ * packet is dropped. In this and any other case, 0 is returned.
+ *
+ * This function will always return 0 if a certain number of packets has been
+ * reported to the IASW to be available. This is done since the IASW would keep
+ * "collecting" packets as long as the SpW interface has packets available,
+ * regardless of the available slots in its own memory pool and consequently
+ * crash.
+ *
+ * Note that this function does explicitly not attempt to allocate an IASW
+ * packet slot before it reports a packet available.
+ *
+ * ### CrIbSemPcktCollect()
+ *
+ * @startuml
+ *
+ * start
+ * if (get next packet size) then (yes)
+ *	if (request packet slot from pool) then (yes)
+ *		if (retrieve packet) then (yes)
+ *			:return packet;
+ *			stop
+ *		else
+ *			:release packet slot;
+ *		endif
+ *	endif
+ * endif
+ *
+ *
+ * :return NULL;
+ * stop
+ *
+ * @enduml
+ *
+ *
+ * This function attempts to retrieve a packet from the SpW interface. If the
+ * packet cannot be retrieved, it will return NULL. The memory pool from which
+ * the packet store is allocated is maintained by the IASW, which also
+ * deallocates the packet slot. If the IASW cannot supply the required memory to
+ * store a packet, the function also returns NULL. If an error occurs during
+ * retrieval of the SpW packet, the function released the packet slot back into
+ * the memory pool and returns NULL. In case of success, the pointer to the
+ * packet slot is returned.
+ *
+ *
+ * ### CrIbSemPcktHandover()
+ *
+  * @startuml
+ *
+ * start
+ * if (packet size ok) then (yes)
+ *	if (add outgoing packet) then (yes)
+ *		: return 1;
+ *		stop
+ *	endif
+ * endif
+ *
+ * :return 0;
+ * stop
+ *
+ * @enduml
+ *
+ * This function accepts a buffer containing a single packet for transmission.
+ * The packet size field is inspected. If the packet size exceeds the maximum
+ * size of a transport unit configured in the SpW device, 0 is returned to
+ * indicate that the packet was not accepted, otherwise the packet is added
+ * to the SpaceWire transmit buffer and 1 is return to indicate success.
+ * If an error occurs while handing the packet over to the driver, 0 is
+ * returned.
+ *
+ * ## SpaceWire Routing
+ *
+ * For development, testing and on-ground calibration purposes, fast packet
+ * routing may be enabled between SpaceWire ports 0 and 1, thereby bypassing
+ * the IASW. These are not part of the nominal flight software.
+ *
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ * ## Notes
+ *
+ * None
+ *
+ *
+ */
+#include <stdint.h>
+
+#include <packet_tracker.h>
+#include <grspw2.h>
+
+#include <ibsw_interface.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+#include <ibsw.h>
+#include <clkgate.h>
+#include <leon/irq.h>
+
+#define SPW_MIN_MTU			18
+#define SES_ADDR			68
+#define SES_PROTOCOL_ID			 2
+#define SES_HEADER_BYTES		 4
+
+
+/**
+ * @brief check if the SpW link to SEM is in RUN state
+ * @return 0 if running, 1 otherwise
+ */
+
+CrFwBool_t CrIbIsSEMLinkRunning(void)
+{
+	return (grspw2_get_link_status(&ibsw_cfg.spw1) == GRSPW2_STATUS_LS_RUN);
+}
+
+/**
+ * @brief check if the SpW link to the EGSE is in RUN state
+ * @return 0 if running, 1 otherwise
+ */
+
+CrFwBool_t CrIbIsEGSELinkRunning(void)
+{
+	return (grspw2_get_link_status(&ibsw_cfg.spw0) == GRSPW2_STATUS_LS_RUN);
+}
+
+/**
+ * @brief check if there is a packet available from the SpW
+ * @return 0 if no packet is available, 1 otherwise
+ */
+
+CrFwBool_t CrIbIsSemPcktAvail(__attribute__((unused)) CrFwDestSrc_t src)
+{
+	static uint32_t cycle = 1234;
+	static uint32_t pckts_delivered;
+	int32_t elem;
+	uint32_t max_sem_pckt_cyc;
+
+	pckts_delivered++;
+
+	if (cycle != CrIbGetNotifyCnt()) {
+		cycle = CrIbGetNotifyCnt();
+		pckts_delivered = 0;
+	}
+
+	CrIaCopy(MAX_SEM_PCKT_CYC_ID, &max_sem_pckt_cyc);
+
+	if (pckts_delivered >= max_sem_pckt_cyc)
+		return 0;
+
+	if (grspw2_get_num_pkts_avail(&ibsw_cfg.spw1)) {
+
+		elem = grspw2_get_next_pkt_size(&ibsw_cfg.spw1);
+
+		if (elem >= SPW_MIN_MTU)
+			if (elem <= GRSPW2_DEFAULT_MTU)
+				return 1;
+
+		/* discard packet from descriptor table if size is too small
+		 * or too large
+		 */
+		grspw2_drop_pkt(&ibsw_cfg.spw1);
+	}
+
+	return 0;
+}
+
+
+CrFwPckt_t CrIbSemPcktCollect(__attribute__((unused)) CrFwDestSrc_t src)
+{
+	uint8_t *buf;
+	int32_t elem;
+
+	/* what a waste of cycles, clueless interface design
+	 * at least the caches are already primed afterwards...
+	 */
+	elem = grspw2_get_next_pkt_size(&ibsw_cfg.spw1);
+
+	if (!elem)
+		return NULL;
+
+	buf = (uint8_t *) CrFwPcktMake((CrFwPcktLength_t) elem);
+
+	if (!buf)
+		return NULL;
+
+	elem = grspw2_get_pkt(&ibsw_cfg.spw1, buf);
+
+	if (!elem) {
+		CrFwPcktRelease((CrFwPckt_t) buf);
+		return NULL;
+	}
+
+	return (char *) buf;
+}
+
+
+/**
+ * @brief hand over a packet to be sent via SpaceWire
+ * @return 1 if the packet was accepted, 0 otherwise
+ */
+
+
+CrFwBool_t CrIbSemPcktHandover(CrFwPckt_t pckt)
+{
+	uint16_t size;
+	int32_t ret;
+
+	static const uint8_t hdr[4] = {SES_ADDR,
+				       SES_PROTOCOL_ID, 0, 0};
+
+
+	size = ptrack_get_pkt_size((uint8_t *) pckt);
+
+	if (size > GRSPW2_DEFAULT_MTU)
+		return 0;
+
+	ret = grspw2_add_pkt(&ibsw_cfg.spw1, hdr, SES_HEADER_BYTES,
+			     (uint8_t *) pckt, size);
+
+	if (ret)
+		return 0;
+
+	return 1;
+}
+
+
+/**
+ * @brief disable SEM SpW link error interrupts
+ */
+
+void CrIbDisableSemSpWLinkErrorIRQ(void)
+{
+	grspw2_unset_link_error_irq(&ibsw_cfg.spw1);
+}
+
+
+/**
+ * @brief enable SEM SpW link error interrupts
+ */
+
+void CrIbEnableSemSpWLinkErrorIRQ(void)
+{
+	grspw2_set_link_error_irq(&ibsw_cfg.spw1);
+}
+
+#if (__SPW_ROUTING__)
+
+/**
+ * @brief disable MON SpW link error interrupts
+ */
+
+void CrIbDisableMonSpWLinkErrorIRQ(void)
+{
+	grspw2_unset_link_error_irq(&ibsw_cfg.spw0);
+}
+
+
+/**
+ * @brief enable MON SpW link error interrupts
+ */
+
+void CrIbEnableMonSpWLinkErrorIRQ(void)
+{
+	grspw2_set_link_error_irq(&ibsw_cfg.spw0);
+}
+
+/**
+ * @brief enable direct routing between SpW0 and SpW1
+ */
+
+void CrIbEnableSpWRoutingNOIRQ(void)
+{
+	grspw2_enable_routing_noirq(&ibsw_cfg.spw1, &ibsw_cfg.spw0);
+}
+
+
+/**
+ * @brief perfom one routing cycle from SpW0 to SpW1
+ */
+
+void CrIbSpWRoute(void)
+{
+	grspw2_route(&ibsw_cfg.spw1);
+}
+
+/**
+ * @brief enable direct routing between SpW0 and SpW1
+ */
+
+void CrIbEnableSpWRouting(void)
+{
+	grspw2_enable_routing(&ibsw_cfg.spw1, &ibsw_cfg.spw0);
+}
+
+
+/**
+ * @brief enable direct routing between SpW0 and SpW1
+ */
+
+void CrIbDisableSpWRouting(void)
+{
+	grspw2_disable_routing(&ibsw_cfg.spw1);
+	grspw2_disable_routing(&ibsw_cfg.spw0);
+}
+
+#endif /* __SPW_ROUTING__ */
+
+
+
+#define SES_HEADER_BYTES 4
+#define SPW_1_ADDR	36
+#define SPW_1_STRIP_HDR_BYTES 4
+
+/**
+ * @brief reset and reconfigure the SpW 1 core
+ */
+
+void CrIbResetSEMSpW(void)
+{
+	struct grspw2_core_cfg *spw = &ibsw_cfg.spw1;
+
+
+	grspw2_spw_hardreset(spw->regs);
+
+	/* dpu SpW are already clocked at 10 MHz */
+	grspw2_core_init(spw, GRSPW2_BASE_CORE_1, SPW_1_ADDR, 1, 1,
+			 GRSPW2_DEFAULT_MTU, GR712_IRL2_GRSPW2_1,
+			 GR712_IRL1_AHBSTAT, SPW_1_STRIP_HDR_BYTES);
+
+	grspw2_rx_desc_table_init(spw,
+				  spw->alloc.rx_desc_tbl,
+				  GRSPW2_DESCRIPTOR_TABLE_SIZE,
+				  spw->alloc.rx_descs, GRSPW2_DEFAULT_MTU);
+
+	grspw2_tx_desc_table_init(spw,
+				  spw->alloc.tx_desc_tbl,
+				  GRSPW2_DESCRIPTOR_TABLE_SIZE,
+				  spw->alloc.tx_hdr, spw->alloc.tx_hdr_size,
+				  spw->alloc.tx_descs, GRSPW2_DEFAULT_MTU);
+	grspw2_core_start(spw);
+}
+
diff --git a/IBSW/lib/ibsw_interface/ibsw_time.c b/IBSW/lib/ibsw_interface/ibsw_time.c
new file mode 100644
index 0000000..3c6d2c0
--- /dev/null
+++ b/IBSW/lib/ibsw_interface/ibsw_time.c
@@ -0,0 +1,132 @@
+/**
+ * @file   ibsw_time.c
+ * @ingroup ibsw_interface
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   August, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief implements an IBSW <> IASW interface to time functions
+ *
+ * ## Overview
+ *
+ * These are function to get the current system time and the time of the next
+ * expected sync pulse in CUC format.
+ *
+ * ## Mode of Operation
+ *
+ * None
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ * ## Notes
+ *
+ * None
+ *
+ */
+#include <stdint.h>
+
+#include <timing.h>
+#include <syncpulse.h>
+
+#include <ibsw_interface.h>
+
+
+
+/**
+ * @brief provides the current time
+ *
+ * @return a timestamp
+ */
+
+CrFwTimeStamp_t CrIbGetCurrentTime(void)
+{
+	uint32_t coarse_time;
+	uint32_t fine_time;
+
+	uint16_t cuc_frac;
+
+	float t_frac;
+
+	CrFwTimeStamp_t time;
+
+
+	timekeeper_get_current_time(&ibsw_cfg.timer, &coarse_time, &fine_time);
+
+	t_frac = (float) fine_time;
+	t_frac = t_frac / ((float) CPU_CPS);
+	t_frac = t_frac * ((float) 0xfffe);
+
+	cuc_frac = (uint16_t) t_frac;
+
+	cuc_frac &= ~0x1;
+	cuc_frac |= (ibsw_cfg.timer.synced & 0x1);
+
+	time.t[0] = (coarse_time >> 24) & 0xff;
+	time.t[1] = (coarse_time >> 16) & 0xff;
+	time.t[2] = (coarse_time >>  8) & 0xff;
+	time.t[3] =  coarse_time        & 0xff;
+	time.t[4] = (cuc_frac    >>  8) & 0xff;
+	time.t[5] =  cuc_frac           & 0xff;
+
+	return time;
+}
+
+
+/**
+ * @brief provides the time of the next sync pulse and configures SpW tick in
+ *
+ * @return a timestamp
+ */
+
+CrFwTimeStamp_t CrIbGetNextTime(void)
+{
+	uint32_t coarse_time;
+	uint32_t fine_time;
+
+	uint16_t cuc_frac;
+
+	float t_frac;
+
+	CrFwTimeStamp_t time;
+
+
+	syncpulse_spw_get_next_time(&ibsw_cfg.timer, &coarse_time, &fine_time);
+
+	t_frac = (float) fine_time;
+	t_frac = t_frac / ((float) CPU_CPS);
+	t_frac = t_frac * ((float) 0xfffe);
+
+	cuc_frac = (uint16_t) t_frac;
+
+	cuc_frac &= ~0x1;
+	cuc_frac |= (ibsw_cfg.timer.synced & 0x1);
+
+	time.t[0] = (coarse_time >> 24) & 0xff;
+	time.t[1] = (coarse_time >> 16) & 0xff;
+	time.t[2] = (coarse_time >>  8) & 0xff;
+	time.t[3] =  coarse_time        & 0xff;
+	time.t[4] = (cuc_frac    >>  8) & 0xff;
+	time.t[5] =  cuc_frac           & 0xff;
+
+	return time;
+}
+
+/**
+ * @brief manually disable the SpW tick-out
+ */
+
+void CrIbDisableSpWTick(void)
+{
+	syncpulse_disable_spw_tick(&ibsw_cfg.timer);
+}
diff --git a/IBSW/lib/ibsw_interface/ibsw_utility.c b/IBSW/lib/ibsw_interface/ibsw_utility.c
new file mode 100644
index 0000000..e8ba03e
--- /dev/null
+++ b/IBSW/lib/ibsw_interface/ibsw_utility.c
@@ -0,0 +1,352 @@
+/**
+ * @file   ibsw_utility.c
+ * @ingroup ibsw_interface
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   August, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief implements an IBSW <> IASW interface to utility functions
+ *
+ * ## Overview
+ *
+ * These are function in the utility group. Please refer to the individual
+ * function description for information on their purpose.
+ *
+ * ## Mode of Operation
+ *
+ * None
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ * ## Notes
+ *
+ * None
+ *
+ *
+ */
+#include <stdint.h>
+#include <string.h>
+
+#include <error_log.h>
+#include <iwf_fpga.h>
+#include <syncpulse.h>
+#include <exchange_area.h>
+#include <compiler.h>
+#include <leon3_dsu.h>
+#include <stacktrace.h>
+#include <ibsw_interface.h>
+#include <ahb.h>
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+
+
+
+/**
+ * @brief the dpu reset function
+ * @param reset_type a reset type
+ *
+ * @note this writes the exchange area specified in CHEOPS-IWF-INST-ICD-009
+ * DPU-SICD-IF-3520
+ */
+
+void CrIbResetDPU(unsigned char reset_type)
+{
+  uint8_t dpuMode;
+  uint8_t dpuSwActive;
+  uint8_t dpuWatchdogStatus;
+  uint8_t dpuUnit;
+
+  uint8_t dpuResetType;
+  uint8_t timeSyncStatus;
+  uint8_t bootReportSent;
+  uint8_t spare1;
+  uint8_t semError;
+  uint8_t semOn;
+
+  uint8_t dpuScLinkStatus;
+  uint8_t dpuMilbusCoreEx;
+  uint8_t dpuMilbusSyncDw;
+  uint8_t dpuMilbusSyncTo;
+  uint8_t dpuSemLinkStatus;
+  uint8_t dpuSemLinkState;
+
+  uint32_t temp_finetime;
+
+  uint32_t trace_entries[STACKTRACE_MAX_ENTRIES];
+
+  uint32_t i;
+
+  uint32_t sp;
+  uint32_t pc;
+
+  register int sp_local asm("%sp");
+
+  struct stack_trace trace;
+
+  struct exchange_area *exchange =
+    (struct exchange_area *) EXCHANGE_AREA_BASE_ADDR;
+
+  /** RESET_TYPE **/
+  exchange->reset_type = reset_type;
+
+
+  /** DBS_STATUS_BYTE1 **/
+
+  /* DpuMode(4) ... DPU_SAFE = 0 */
+  dpuMode = 0;
+
+  /* DpuSwActive(2) ... UNKNOWN = 0, DBS = 1, IASW = 2 */
+  dpuSwActive = 2;
+
+  /* DpuWatchdogStatus(1) */
+  CrIaCopy(ISWATCHDOGENABLED_ID, &dpuWatchdogStatus);
+
+  /* DpuUnit(1) ... RT9 = NOMINAL => 1; RT10 = REDUNDANT => 0 */
+  dpuUnit = 1;
+  if (fpga_dpu_get_rt_addr() != 0x9)
+    dpuUnit = 0;
+
+  exchange->hk_dbs_status_byte1 =
+    (dpuMode << 4) | (dpuSwActive << 2) | (dpuWatchdogStatus << 1) | dpuUnit;
+
+
+  /** DBS_STATUS_BYTE2 **/
+
+  /* DpuResetType(3) */
+  dpuResetType = reset_type; /* this will be overwritten by the DBS */
+
+  /* TimeSyncStatus(1) */
+  CrIaCopy(ISSYNCHRONIZED_ID, &timeSyncStatus);
+
+  /* Mantis 2086 and 1994: invert the meaning of the sync flag for the boot report */
+  if (timeSyncStatus == 0x01)
+    timeSyncStatus = 0;
+  else
+    timeSyncStatus = 1;
+
+  /* BootReportSent(1) */
+  bootReportSent = 0; /* NOTE: IASW shall send REPORT_NOT_SENT = 0 */
+
+  /* Spare1(1) */
+  spare1 = 0;
+
+  /* SemError(1) */
+  semError = 0;
+  if (fpga_sem_get_status_failure())
+    semError = 1;
+
+  /* SemOn(1) */
+  semOn = 0;
+  if (fpga_sem_get_status_on())
+    semOn = 1;
+
+  exchange->hk_dbs_status_byte2 =
+    (dpuResetType << 5) | (timeSyncStatus << 4) | (bootReportSent << 3) |
+    (spare1 << 2) | (semError << 1) | semOn;
+
+
+  /** DBS_STATUS_BYTE3 **/
+
+  /* if you are able to read this, the next 4 items are ones */
+
+  /* dpuScLinkStatus(1) */
+  dpuScLinkStatus = 1;
+
+  /* dpuMilbusCoreEx(1) */
+  dpuMilbusCoreEx = 1;
+
+  /* dpuMilbusSyncDw(1) */
+  dpuMilbusSyncDw = 1;
+
+  /* dpuMilbusSyncTo(1) */
+  dpuMilbusSyncTo = 1;
+
+  /* dpuSemLinkStatus(1) */
+  dpuSemLinkStatus = 1; /* NOTE: in IASW, the link is always enabled */
+
+  /* dpuSemLinkState(3) */
+  dpuSemLinkState = (uint8_t) CrIbIsSEMLinkRunning();
+
+  exchange->hk_dbs_status_byte3 =
+    (dpuScLinkStatus << 7) | (dpuMilbusCoreEx << 6) | (dpuMilbusSyncDw << 5) |
+    (dpuMilbusSyncTo << 4) | (dpuSemLinkStatus << 3) | dpuSemLinkState;
+
+
+  /** RESET_TIME **/
+  timekeeper_get_current_time(&ibsw_cfg.timer,
+			      &exchange->reset_time.coarse_time,
+			      &temp_finetime);
+
+  exchange->reset_time.fine_time = (uint16_t) temp_finetime;
+
+  /** TRAP_CORE1 and TRAP_CORE2 **/
+  exchange->trapnum_core0 = (dsu_get_reg_tbr(0) >> 4) & 0xff;
+  exchange->trapnum_core1 = (dsu_get_reg_tbr(1) >> 4) & 0xff;
+
+  /** REGISTERS CORE1 **/
+  exchange->regs_cpu0.psr = dsu_get_reg_psr(0);
+  exchange->regs_cpu0.wim = dsu_get_reg_wim(0);
+  exchange->regs_cpu0.pc  = dsu_get_reg_pc(0);
+  exchange->regs_cpu0.npc = dsu_get_reg_npc(0);
+  exchange->regs_cpu0.fsr = dsu_get_reg_fsr(0);
+
+  /** REGISTERS CORE2 **/
+  exchange->regs_cpu1.psr = dsu_get_reg_psr(1);
+  exchange->regs_cpu1.wim = dsu_get_reg_wim(1);
+  exchange->regs_cpu1.pc  = dsu_get_reg_pc(1);
+  exchange->regs_cpu1.npc = dsu_get_reg_npc(1);
+  exchange->regs_cpu1.fsr = dsu_get_reg_fsr(1);
+
+  /** AHB STATUS REGISTER and AHB FAILING ADDRESS REG **/
+  exchange->ahb_status_reg       = ahbstat_get_status();
+  exchange->ahb_failing_addr_reg = ahbstat_get_failing_addr();
+
+  /** CALL STACK CORE 1 **/
+  trace.max_entries = STACKTRACE_MAX_ENTRIES;
+  trace.nr_entries  = 0;
+  trace.entries     = trace_entries;
+
+  /* trace_entries has not yet decayed into a pointer, so sizeof() is fine */
+  bzero(trace_entries, sizeof(trace_entries));
+
+  /* The DSU of the GR712 appears to return the contents of a different register
+   * than requested. Usually it is the following entry, i.e. when requesting
+   * the register %o6 (== %sp) of a particular register file (CPU window) we
+   * get the contents %o7 (address of caller). This can also be seen in the AHB
+   * trace buffer. Hence, we use the local value of %sp (i.e. of the CPU calling
+   * this function). For the other CPU, we can't do much if the returned value
+   * is incorrect, so a stack trace may not be valid or contain meaningful
+   * information. Interestingly enough, this behaviour appears to depend on
+   * the length and operations of the current function, so this may really be
+   * a problem with the types and amounts of transfers crossing the bus.
+   */
+
+  sp = sp_local;
+  pc = dsu_get_reg_pc(0);	/* not critical if incorrect */
+  save_stack_trace(&trace, sp, pc);
+
+  for (i = 0; i < STACKTRACE_MAX_ENTRIES; i++)
+    exchange->stacktrace_cpu0[i] = trace_entries[i];
+
+
+  trace.max_entries = STACKTRACE_MAX_ENTRIES;
+  trace.nr_entries  = 0;
+  trace.entries     = trace_entries;
+  /** CALL STACK CORE 2 **/
+  bzero(trace_entries, sizeof(trace_entries));
+
+  sp = dsu_get_reg_sp(1, dsu_get_reg_psr(1) & 0x1f);
+  pc = dsu_get_reg_pc(1);
+  save_stack_trace(&trace, sp, pc);
+
+  for (i = 0; i < STACKTRACE_MAX_ENTRIES; i++)
+    exchange->stacktrace_cpu1[i] = trace_entries[i];
+
+
+  /* SpW and 1553 don't need to be stopped explicitly */
+
+  /* hit the reset button */
+  if (reset_type == DBS_EXCHANGE_RESET_TYPE_CO)
+    fpga_reset_ctrl_set(RESET_CTRL_CO);
+  
+  else if (reset_type == DBS_EXCHANGE_RESET_TYPE_MB)
+    fpga_reset_ctrl_set(RESET_CTRL_MB);
+
+  else
+    fpga_reset_ctrl_set(RESET_CTRL_UN);
+  
+  /* do nothing until reset */
+  while (1)
+	  cpu_relax();
+}
+
+
+/**
+ * @brief get value of the notification cycle counter
+ */
+
+uint32_t CrIbGetNotifyCnt(void)
+{
+	return ibsw_cfg.timer.notify_cnt;
+}
+
+
+uint32_t CrIbGetDpuBoardId(void)
+{
+  return fpga_dpu_get_board_serial();
+}
+
+
+
+/**
+ * @brief turn the SEM on/off and get its status
+ *
+ * @param op see enum sem_op
+ *
+ * @return 1 on success or positive status, 0 otherwise
+ *
+ * @note always returns 1 when not compiled for the DPU board
+ */
+
+uint32_t CrIbSemLowLevelOp(enum sem_op __attribute__((unused)) op)
+{
+	uint32_t ret = 1;
+	uint8_t keyword = 0;
+
+	switch (op) {
+	case SWITCH_ON:
+		/* switch on using the keyword from the data pool */
+		CrIaCopy(SEM_ON_CODE_ID, &keyword);
+		fpga_sem_switch_on(keyword);
+		break;
+	case SWITCH_OFF:
+		/* switch on using the keyword from the data pool */
+		CrIaCopy(SEM_OFF_CODE_ID, &keyword);
+		fpga_sem_switch_off(keyword);
+		syncpulse_disable_spw_tick(&ibsw_cfg.timer);
+		break;
+	case HEATER_ON:
+		fpga_sem_heater_on();
+		break;
+	case HEATER_OFF:
+		fpga_sem_heater_off();
+		break;
+	case GET_STATUS_ON:
+		ret = fpga_sem_get_status_on();
+		break;
+	case GET_FAILURE:
+		ret = fpga_sem_get_status_failure();
+		break;
+	case GET_STATUS_HEATER_ON:
+		ret = fpga_sem_get_status_heater_on();
+		break;
+	}
+
+	return ret;
+}
+
+
+/**
+ * @brief update synchronisation flag in data pool
+ */
+
+void CrIbSetSyncFlag(uint32_t sync)
+{
+	uint8_t sync_flag;
+
+	sync_flag = (uint8_t) sync;
+	CrIaPaste(ISSYNCHRONIZED_ID, &sync_flag);
+}
diff --git a/IBSW/lib/ibsw_interface/ibsw_watchdog.c b/IBSW/lib/ibsw_interface/ibsw_watchdog.c
new file mode 100644
index 0000000..25fb4c4
--- /dev/null
+++ b/IBSW/lib/ibsw_interface/ibsw_watchdog.c
@@ -0,0 +1,102 @@
+/**
+ * @file   ibsw_watchdog.c
+ * @ingroup ibsw_interface
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   August, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief implements an IBSW <> IASW interface to the watchdog
+ *
+ * ## Overview
+ *
+ * These are wrapper functions that comply with the IBSW/IASW naming scheme.
+ *
+ * ## Mode of Operation
+ *
+ * None
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ * ## Notes
+ *
+ * None
+ *
+ */
+#include <stdint.h>
+
+#include <watchdog.h>
+#include <iwf_fpga.h>
+
+#include <ibsw_interface.h>
+
+
+
+/**
+ * @brief reset procedure executed by watchdog()
+ * @note the watchdog reset procedure is special in that it cannot
+ * flush the flash buffer because of the FPGA's reset timeout
+ */
+
+static void wd_reset(void)
+{
+	CrIbResetDPU(DBS_EXCHANGE_RESET_TYPE_WD);
+}
+
+
+/**
+ * @brief remote terminal (=BEE) reset callback
+ */
+
+void rt_reset(__attribute__((unused)) void *userdata)
+{
+	CrIbResetDPU(DBS_EXCHANGE_RESET_TYPE_MB);
+}
+
+/**
+ * @brief remote terminal (=BEE) reset callback
+ */
+
+void fdir_reset(__attribute__((unused)) void *userdata)
+{
+	CrIbResetDPU(DBS_EXCHANGE_RESET_TYPE_UN);
+}
+
+/**
+ * @brief enable the watchdog
+ */
+
+void CrIbEnableWd(void)
+{
+	watchdog_enable(&ibsw_cfg.timer, &wd_reset);
+}
+
+
+/**
+ * @brief disable the watchdog
+ */
+
+void CrIbDisableWd(void)
+{
+	watchdog_disable(&ibsw_cfg.timer);
+}
+
+
+/**
+ * @brief enable the watchdog
+ */
+
+void CrIbResetWd(void)
+{
+	watchdog_feed(&ibsw_cfg.timer);
+}
diff --git a/IBSW/lib/irq_dispatch.c b/IBSW/lib/irq_dispatch.c
new file mode 100644
index 0000000..6d2cef2
--- /dev/null
+++ b/IBSW/lib/irq_dispatch.c
@@ -0,0 +1,737 @@
+/**
+ * @file    irq_dispatch.c
+ * @ingroup irq_dispatch
+ * @author  Armin Luntzer (armin.luntzer@univie.ac.at)
+ * @date    December, 2013
+ * @brief   Central IRQ dispatcher
+ *
+ * @copyright
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @note eventually replace catch_interrupt() libgloss/newlib functionality
+ *       with local/custom code and rework the globals
+ * @note irq configuration should only be done through a syscall,
+ *       so traps are disabled
+ *
+ * @defgroup irq_dispatch IRQ dispatcher
+ * @brief a central IRQ handler that dispatches interrupts to registered
+ *        callback functions
+ *
+ * Implements a central interrupt handler that supports registration of a
+ * predefined arbitrary number of callback function per interrupt with immediate
+ * or deferred execution priorities. Callbacks are tracked in linked lists that
+ * should always be allocated in a contiguous block of memory for proper cache
+ * hit rate.
+ *
+ * @image html irq_dispatch/irq_dispatch.png "IRQ dispatcher"
+ *
+ * On LEONs with round-robin extended interrupt
+ * lines, such as in the MPPB, the handler can be modified to execute all active
+ * secondary interrupts without exiting IRQ mode for significantly reduced
+ * call overhead.
+ *
+ * @example demo_irq_dispatch.c
+ */
+
+
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <irq_dispatch.h>
+#include <list.h>
+#include <irq.h>
+#include <spinlock.h>
+#include <leon_reg.h>
+#include <compiler.h>
+#include <errors.h>
+#include <asm/leon.h>
+#include <io.h>
+#include <sysctl.h>
+
+#if !(__sparc__)
+/* unit testing dummy */
+int catch_interrupt(__attribute__((unused)) int func,
+		     __attribute__((unused)) int irq)
+{
+	return 0;
+}
+#else
+#include <asm-leon/irq.h>
+#endif
+
+
+
+struct irl_vector_elem {
+	int32_t (*callback)(void *userdata);
+	enum prty priority;
+	void *userdata;
+	struct list_head callback_node;
+};
+
+#define IRL_POOL_SIZE	128
+#define IRL_QUEUE_SIZE	128
+#define IRL_SIZE	128
+
+struct list_head	irl_pool_head;
+struct list_head	irl_queue_head;
+struct list_head	irq_queue_pool_head;
+
+struct list_head	irq1_vector[IRL_SIZE];
+struct list_head	irq2_vector[IRL_SIZE];
+
+struct irl_vector_elem	irl_pool[IRL_POOL_SIZE];
+struct irl_vector_elem	irl_queue_pool[IRL_QUEUE_SIZE];
+
+
+
+/* temporarily from c-irq.c */
+struct leon3_irqctrl_registermap *leon3_irqctrl_regs;
+
+#define ICLEAR 0x20c
+#define IMASK  0x240
+#define IFORCE 0x208
+
+#if (__sparc__)
+int32_t *lreg = (int32_t *) 0x80000000;
+
+void enable_irq(int32_t irq)
+{
+	lreg[ICLEAR/4] = (1 << irq);    /* clear any pending irq*/
+	lreg[IMASK/4] |= (1 << irq);    /* unmaks irq		*/
+	leon3_irqctrl_regs->irq_mpmask[leon3_cpuid()] |= 1 << irq;
+}
+
+void enable_irq2(int32_t irq)
+{
+	lreg[ICLEAR/4] = (1 << irq);    /* clear any pending irq*/
+	lreg[IMASK/4] |= (1 << irq);    /* unmaks irq		*/
+	leon3_irqctrl_regs->irq_mpmask[leon3_cpuid()] |= (1 << irq) << 16;
+}
+
+void disable_irq(int32_t irq)
+{
+	lreg[IMASK/4] &= ~(1 << irq);
+}
+
+void disable_irq2(int32_t irq)
+{
+	lreg[IMASK/4] &= ~((1 << irq) << 16);
+}
+
+void force_irq(int32_t irq)
+{
+	lreg[IFORCE/4] = (1 << irq);
+}
+#else
+void enable_irq(int32_t __attribute__((unused)) irq)
+{
+}
+
+void enable_irq2(int32_t __attribute__((unused)) irq)
+{
+}
+
+void disable_irq(int32_t __attribute__((unused)) irq)
+{
+}
+
+void disable_irq2(int32_t __attribute__((unused)) irq)
+{
+}
+#endif
+/* end temp */
+
+
+static struct {
+	uint32_t irl1;
+	uint32_t irl2;
+	uint32_t irl1_irq[15];
+	uint32_t irl2_irq[15];
+} irqstat;
+
+#if (__sparc__)
+#define UINT32_T_FORMAT		"%lu"
+#else
+#define UINT32_T_FORMAT		"%u"
+#endif
+
+static ssize_t irl1_show(__attribute__((unused)) struct sysobj *sobj,
+			 __attribute__((unused)) struct sobj_attribute *sattr,
+			 char *buf)
+{
+	uint32_t irq;
+
+
+	if (!strcmp("irl1", sattr->name))
+		return sprintf(buf, UINT32_T_FORMAT, irqstat.irl1);
+
+	irq = atoi(sattr->name);
+
+	if (irq > 15)
+		return 0;
+
+	return sprintf(buf, UINT32_T_FORMAT, irqstat.irl1_irq[irq - 1]);
+}
+
+static ssize_t irl1_store(__attribute__((unused)) struct sysobj *sobj,
+			  __attribute__((unused)) struct sobj_attribute *sattr,
+			  __attribute__((unused)) const char *buf,
+			  __attribute__((unused)) size_t len)
+{
+	uint32_t irq;
+
+
+	if (!strcmp("irl1", sattr->name)) {
+		irqstat.irl1 = 0;
+		return 0;
+	}
+
+	irq = atoi(sattr->name);
+
+	if (irq > 15)
+		return 0;
+
+	irqstat.irl1_irq[irq - 1] = 0;
+
+	return 0;
+}
+
+static ssize_t irl2_show(__attribute__((unused)) struct sysobj *sobj,
+			 __attribute__((unused)) struct sobj_attribute *sattr,
+			 char *buf)
+{
+	uint32_t irq;
+
+
+	if (!strcmp("irl2", sattr->name))
+		return sprintf(buf, UINT32_T_FORMAT, irqstat.irl2);
+
+	irq = atoi(sattr->name);
+
+	if (irq > 15)
+		return 0;
+
+	return sprintf(buf, UINT32_T_FORMAT, irqstat.irl2_irq[irq - 1]);
+}
+
+static ssize_t irl2_store(__attribute__((unused)) struct sysobj *sobj,
+			  __attribute__((unused)) struct sobj_attribute *sattr,
+			  __attribute__((unused)) const char *buf,
+			  __attribute__((unused)) size_t len)
+{
+	uint32_t irq;
+
+
+	if (!strcmp("irl2", sattr->name)) {
+		irqstat.irl2 = 0;
+		return 0;
+	}
+
+	irq = atoi(sattr->name);
+
+	if (irq > 15)
+		return 0;
+
+	irqstat.irl2_irq[irq - 1] = 0;
+
+	return 0;
+}
+
+__extension__
+static struct sobj_attribute irl1_attr[] = {
+	__ATTR(irl1,  irl1_show, irl1_store),
+	__ATTR(1,  irl1_show, irl1_store), __ATTR(2,  irl1_show, irl1_store),
+	__ATTR(3,  irl1_show, irl1_store), __ATTR(4,  irl1_show, irl1_store),
+	__ATTR(5,  irl1_show, irl1_store), __ATTR(6,  irl1_show, irl1_store),
+	__ATTR(7,  irl1_show, irl1_store), __ATTR(8,  irl1_show, irl1_store),
+	__ATTR(9,  irl1_show, irl1_store), __ATTR(10, irl1_show, irl1_store),
+	__ATTR(11, irl1_show, irl1_store), __ATTR(12, irl1_show, irl1_store),
+	__ATTR(13, irl1_show, irl1_store), __ATTR(14, irl1_show, irl1_store),
+	__ATTR(15, irl1_show, irl1_store)};
+
+static struct sobj_attribute *irl1_attributes[] = {
+	&irl1_attr[0],  &irl1_attr[1],  &irl1_attr[2],  &irl1_attr[3],
+	&irl1_attr[4],  &irl1_attr[5],  &irl1_attr[6],  &irl1_attr[7],
+	&irl1_attr[8],  &irl1_attr[9],  &irl1_attr[10], &irl1_attr[11],
+	&irl1_attr[12], &irl1_attr[13], &irl1_attr[14], &irl1_attr[14],
+	NULL};
+
+__extension__
+static struct sobj_attribute irl2_attr[] = {
+	__ATTR(irl2,  irl2_show, irl2_store),
+	__ATTR(1,  irl2_show, irl2_store), __ATTR(2,  irl2_show, irl2_store),
+	__ATTR(3,  irl2_show, irl2_store), __ATTR(4,  irl2_show, irl2_store),
+	__ATTR(5,  irl2_show, irl2_store), __ATTR(6,  irl2_show, irl2_store),
+	__ATTR(7,  irl2_show, irl2_store), __ATTR(8,  irl2_show, irl2_store),
+	__ATTR(9,  irl2_show, irl2_store), __ATTR(10, irl2_show, irl2_store),
+	__ATTR(11, irl2_show, irl2_store), __ATTR(12, irl2_show, irl2_store),
+	__ATTR(13, irl2_show, irl2_store), __ATTR(14, irl2_show, irl2_store),
+	__ATTR(15, irl2_show, irl2_store)};
+
+__extension__
+static struct sobj_attribute *irl2_attributes[] = {
+	&irl2_attr[0],  &irl2_attr[1],  &irl2_attr[2],  &irl2_attr[3],
+	&irl2_attr[4],  &irl2_attr[5],  &irl2_attr[6],  &irl2_attr[7],
+	&irl2_attr[8],  &irl2_attr[9],  &irl2_attr[10], &irl2_attr[11],
+	&irl2_attr[12], &irl2_attr[13], &irl2_attr[14], &irl2_attr[15],
+	NULL};
+
+/**
+ * @brief	queue a callback for delayed exectuion
+ *
+ * @param[in]	p_elem	a pointer to a struct IRQVectorElem
+ *
+ * @retval	-1 : error
+ * @retval	 0 : success
+ */
+
+static int32_t irq_queue(struct irl_vector_elem *p_elem)
+{
+	uint32_t psr_flags;
+	struct irl_vector_elem *p_queue;
+
+	if (likely(list_filled(&irq_queue_pool_head))) {
+
+		psr_flags = spin_lock_save_irq();
+
+		p_queue = list_entry((&irq_queue_pool_head)->next,
+				      struct irl_vector_elem, callback_node);
+
+		p_queue->callback = p_elem->callback;
+		p_queue->priority = p_elem->priority;
+		p_queue->userdata = p_elem->userdata;
+
+		list_move_tail(&p_queue->callback_node, &irl_queue_head);
+
+		spin_lock_restore_irq(psr_flags);
+
+		return 0;
+
+	} else {
+		errno = E_IRQ_QUEUE_BUSY;
+		return -1;
+	}
+}
+
+
+/**
+ * @brief	the central interrupt handling routine
+ *
+ * @param[in]	irq an interrupt number
+ *
+ * @retval	0 : always
+ *
+ * @note callback return codes ignored for now
+ */
+
+static int32_t irq_dispatch(int32_t irq)
+{
+	uint32_t irq2;
+
+	struct irl_vector_elem *p_elem;
+	struct irl_vector_elem *p_tmp;
+
+
+	irqstat.irl1++;
+	irqstat.irl1_irq[irq - 1]++;
+
+	if (irq == IRL1_EXTENDED_INT) {
+
+		irq2 = leon3_irqctrl_regs->extended_irq_id[leon3_cpuid()];
+
+		irqstat.irl2++;
+		irqstat.irl2_irq[irq2 - 1]++;
+
+		list_for_each_entry_safe(p_elem, p_tmp,
+					 &irq2_vector[irq2], callback_node) {
+
+			if (likely(p_elem->priority == PRIORITY_NOW)) {
+				p_elem->callback(p_elem->userdata);
+			} else {
+				/* execute immediately if queueing fails */
+				if (irq_queue(p_elem) < 0)
+					p_elem->callback(p_elem->userdata);
+			}
+		}
+
+	} else { /* regular (primary) interrupts */
+
+		list_for_each_entry(p_elem, &irq1_vector[irq], callback_node) {
+			if (likely(p_elem->priority == PRIORITY_NOW)) {
+				p_elem->callback(p_elem->userdata);
+			} else {
+				/* execute immediately if queueing fails */
+				if (irq_queue(p_elem) < 0)
+					p_elem->callback(p_elem->userdata);
+			}
+		}
+	}
+
+	return 0;
+}
+
+
+
+/**
+ * @brief	register a callback function to the primary interrupt line
+ *
+ *
+ * @param[in]	irq		an interrupt number
+ * @param[in]	priority	a callback priority
+ * @param[in]	callback	a callback function
+ * @param[in]	userdata	a pointer to arbitrary user data; passed to
+ *				 callback function
+ *
+ * @retval	-1 : error
+ * @retval	 0 : success
+ *
+ * @bug		catch_interrupt() is called without checking whether the IRL
+ *		was already mapped
+ */
+
+int32_t irl1_register_callback(int32_t irq,
+			       enum prty priority,
+			       int32_t (*callback)(void *userdata),
+			       void *userdata)
+{
+	uint32_t psr_flags;
+
+	struct irl_vector_elem *p_elem;
+
+
+	if (irq >= IRL_SIZE) {
+		errno = E_IRQ_EXCEEDS_IRL_SIZE;
+		return -1;
+	}
+
+	if (list_empty(&irl_pool_head)) {
+		errno = E_IRQ_POOL_EMPTY;
+		return -1;
+	}
+
+	if (callback == NULL) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	psr_flags = spin_lock_save_irq();
+
+	p_elem = list_entry((&irl_pool_head)->next, struct irl_vector_elem,
+			    callback_node);
+
+	p_elem->callback = callback;
+	p_elem->priority = priority;
+	p_elem->userdata = userdata;
+
+	list_move_tail(&p_elem->callback_node, &irq1_vector[irq]);
+
+	spin_lock_restore_irq(psr_flags);
+
+	enable_irq(irq);
+
+	return catch_interrupt(((int) irq_dispatch), irq);
+}
+
+
+/**
+ * @brief	de-register a callback function on the primary interrupt line
+ *
+ * @param[in]	IRQ		an interrupt number
+ * @param[in]	callback	a callback function
+ * @param[in]	userdata	a pointer to arbitrary user data
+ *
+ * @retval	-1 : error
+ * @retval	 0 : success
+ *
+ * @note	in case of duplicate callbacks, only the first encountered will
+ *		be removed
+ */
+
+int32_t irl1_deregister_callback(int32_t irq,
+				 int32_t (*callback)(void *userdata),
+				 void *userdata)
+{
+	uint32_t psr_flags;
+	struct irl_vector_elem *p_elem;
+	struct irl_vector_elem *p_tmp;
+
+	if (irq >= IRL_SIZE) {
+		errno = E_IRQ_EXCEEDS_IRL_SIZE;
+		return -1;
+	}
+
+	list_for_each_entry_safe(p_elem, p_tmp,
+				 &irq1_vector[irq], callback_node) {
+
+		if (p_elem->callback == callback
+		    && p_elem->userdata == userdata) {
+
+			p_elem->callback = NULL;
+			p_elem->userdata = NULL;
+			p_elem->priority = -1;
+
+			psr_flags = spin_lock_save_irq();
+			list_move_tail(&p_elem->callback_node, &irl_pool_head);
+			spin_lock_restore_irq(psr_flags);
+
+			if (irq1_vector[irq].next == &irq1_vector[irq])
+				disable_irq(irq);
+
+			return 0;
+		}
+	}
+	errno = E_IRQ_DEREGISTER;
+	return -1;
+}
+
+
+/**
+ * @brief	register a callback function to the secondary interrupt line
+ *
+ * @param[in]	IRQ		an interrupt number
+ * @param[in]	priority	a callback priority
+ * @param[in]	callback	a callback function
+ * @param[in]	userdata	a pointer to arbitrary user data
+ *
+ * @retval	-1 : error
+ * @retval	 0 : success
+ *
+ */
+
+int32_t irl2_register_callback(int32_t irq,
+			       enum prty priority,
+			       int32_t (*callback)(void *userdata),
+			       void *userdata)
+{
+	uint32_t psr_flags;
+	struct irl_vector_elem *p_elem;
+
+	if (irq >= IRL_SIZE) {
+		errno = E_IRQ_EXCEEDS_IRL_SIZE;
+		return -1;
+	}
+
+	if (list_empty(&irl_pool_head)) {
+		errno = E_IRQ_POOL_EMPTY;
+		return -1;
+	}
+
+	if (callback == NULL) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	psr_flags = spin_lock_save_irq();
+	p_elem = list_entry((&irl_pool_head)->next, struct irl_vector_elem,
+		    callback_node);
+
+	p_elem->callback = callback;
+	p_elem->priority = priority;
+	p_elem->userdata = userdata;
+
+	list_move_tail(&p_elem->callback_node, &irq2_vector[irq]);
+
+	spin_lock_restore_irq(psr_flags);
+
+	enable_irq2(irq);
+
+	return 0;
+}
+
+/**
+ * @brief	de-register a callback function on the secondary interrupt line
+ *
+ * @param[in]	IRQ		an interrupt number
+ * @param[in]	callback	a callback function
+ * @param[in]	userdata	a pointer to arbitrary user data
+ *
+ * @retval	-1 : error
+ * @retval	 0 : success
+ */
+
+int32_t irl2_deregister_callback(int32_t irq,
+				 int32_t (*callback)(void *userdata),
+				 void *userdata)
+{
+	uint32_t psr_flags;
+	struct irl_vector_elem *p_elem;
+	struct irl_vector_elem *p_tmp;
+
+	if (irq >= IRL_SIZE) {
+		errno = E_IRQ_EXCEEDS_IRL_SIZE;
+		return -1;
+	}
+
+	list_for_each_entry_safe(p_elem, p_tmp,
+				 &irq2_vector[irq], callback_node) {
+
+		if (p_elem->callback == callback
+		    && p_elem->userdata == userdata) {
+
+			p_elem->callback = NULL;
+			p_elem->userdata = NULL;
+			p_elem->priority = -1;
+
+			psr_flags = spin_lock_save_irq();
+			list_move_tail(&p_elem->callback_node, &irl_pool_head);
+			spin_lock_restore_irq(psr_flags);
+
+			if (irq2_vector[irq].next == &irq2_vector[irq])
+				disable_irq2(irq);
+
+			return 0;
+		}
+	}
+
+	errno = E_IRQ_DEREGISTER;
+	return -1;
+}
+
+/**
+ *
+ * @brief	call this function in normal mode to handle non-priority
+ *		interrupt requests
+ *
+ */
+
+void irq_queue_execute(void)
+{
+	struct irl_vector_elem *p_elem = NULL;
+	struct irl_vector_elem *p_tmp;
+
+
+	if (list_empty(&irl_queue_head))
+		return;
+
+	list_for_each_entry_safe(p_elem, p_tmp,
+				 &irl_queue_head, callback_node) {
+
+		list_del(&p_elem->callback_node);
+
+		if (likely(p_elem->callback != NULL)) {
+
+			if (p_elem->callback(p_elem->userdata))
+				irq_queue(p_elem);
+			else
+				list_add_tail(&p_elem->callback_node,
+					      &irq_queue_pool_head);
+
+		} else {
+			list_add_tail(&p_elem->callback_node,
+				      &irq_queue_pool_head);
+		}
+	}
+}
+
+
+void irq_set_level(uint32_t irq_mask, uint32_t level)
+{
+	uint32_t flags;
+
+	flags = ioread32be(&leon3_irqctrl_regs->irq_level);
+
+	if (!level)
+		flags &= ~irq_mask;
+	else
+		flags |= irq_mask;
+
+
+	iowrite32be(flags, &leon3_irqctrl_regs->irq_level);
+}
+
+
+
+/**
+ * @brief	enable the interrupt handling service
+ *
+ * @retval	-1 : error
+ * @retval	 0 : success
+ */
+
+int32_t irq_dispatch_enable(void)
+{
+	size_t i;
+
+	struct sysset *sset;
+	struct sysobj *sobj;
+
+#if (__sparc__)
+	/**
+	 * Basic Moron Protector (BMP)â„¢
+	 */
+	static enum  {DISABLED, ENABLED} dispatcher;
+
+	if (dispatcher)
+		return -1;
+
+	dispatcher = ENABLED;
+#endif
+
+	INIT_LIST_HEAD(&irl_pool_head);
+	INIT_LIST_HEAD(&irl_queue_head);
+	INIT_LIST_HEAD(&irq_queue_pool_head);
+
+	for (i = 0; i < IRL_SIZE; i++) {
+		INIT_LIST_HEAD(&irq1_vector[i]);
+		INIT_LIST_HEAD(&irq2_vector[i]);
+	}
+
+	for (i = 0; i < IRL_POOL_SIZE; i++) {
+		irl_pool[i].callback = NULL;
+		irl_pool[i].userdata = NULL;
+		list_add_tail(&irl_pool[i].callback_node, &irl_pool_head);
+	}
+
+	for (i = 0; i < IRL_QUEUE_SIZE; i++) {
+		irl_queue_pool[i].callback = NULL;
+		irl_queue_pool[i].userdata = NULL;
+		list_add_tail(&irl_queue_pool[i].callback_node,
+			      &irq_queue_pool_head);
+	}
+
+
+	sset = sysset_create_and_add("irq", NULL, sys_set);
+
+	sobj = sysobj_create();
+
+	if (!sobj)
+		return -1;
+
+	sobj->sattr = irl1_attributes;
+	sysobj_add(sobj, NULL, sset, "primary");
+
+	sobj = sysobj_create();
+
+	if (!sobj)
+		return -1;
+
+	sobj->sattr = irl2_attributes;
+	sysobj_add(sobj, NULL, sset, "secondary");
+
+
+	leon3_irqctrl_regs = (struct leon3_irqctrl_registermap *)
+						LEON3_BASE_ADDRESS_IRQMP;
+
+	enable_irq(IRL1_EXTENDED_INT);
+
+
+	/* workaround for v0.8:
+	 * enable timer 0 and 1 irqs so their interrupts are counted
+	 * by irq_dispatch as well
+	 */
+	catch_interrupt(((int) irq_dispatch), GR712_IRL1_GPTIMER_0);
+	catch_interrupt(((int) irq_dispatch), GR712_IRL1_GPTIMER_1);
+
+	/* retval check can be done outside */
+	return catch_interrupt(((int) irq_dispatch), GR712_IRL1_IRQMP);
+}
diff --git a/IBSW/lib/iwf_flash.c b/IBSW/lib/iwf_flash.c
new file mode 100644
index 0000000..8d0d487
--- /dev/null
+++ b/IBSW/lib/iwf_flash.c
@@ -0,0 +1,1086 @@
+/**
+ * @file    iwf_flash.c
+ * @ingroup iwf_flash
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   December, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @defgroup iwf_flash IWF FLASH memory
+ * @brief Implements access to the IWF FLASH memory device
+ *
+ *
+ *
+ * ## Overview
+ *
+ * This module implements access to the IWF FLASH memory device.
+ *
+ *
+ * ## Mode of Operation
+ *
+ * The function of the FPGA is to provide a software-accessible interface to
+ * the FLASH. Details on how the FLASH is operated can be found in the
+ * according datasheet. The operations described there are executed via the
+ * registers of the FPGA.
+ *
+ * As an example, the basic read procedure is reproduced below.
+ *
+ *
+ * @startuml{iwf_flash_read.svg} "FLASH read procedure" width=10
+ *
+ * start
+ *
+ * :flash cmd 0x00000000;
+ * :write address bytes 1-5;
+ * :flash cmd 0x30303030;
+ * : wait for ready bit;
+ *
+ * repeat
+ *	:read FLASH data register;
+ *	note left
+ *		ECC check by FPGA
+ *	end note
+ * repeat while (read more?)
+ *
+ * stop
+ *
+ * @enduml
+ *
+ *
+ * @see
+ *	- _K9F8G08UXM 1G x 8 Bit/ 2G x 8 Bit NAND Flash Memory rev 1.4_
+ *	   datasheet for programming procedures and address generation
+ *
+ *	- CHEOPS-IWF-INST-ICD-009
+ *	  _CHEOPS DPU Boot S/W Interface Control Document_ for programming
+ *	  procedures of the parallel BEE FLASHes
+ *
+ *	- CHEOPS-IWF-INST-IRD-020 _CHEOPS BEE DPU Hardware - Software Interface
+ *	  Requirements_ for FPGA register mappings
+ *
+ * ### Address Generation
+ *
+ * From the perspective of a user, the storage granularity within a FLASH
+ * unit is of 4 byte granularity.
+ * It is therefore addressed via a _logical_
+ * address that must increments by 4, i.e. 32 bit word addressing.
+ *
+ *
+ *
+ *
+ * The _physical_ address used to program a read of a 4 byte wide entry
+ * is incrementing __one__ byte __per word__, as a FLASH  word is stored in
+ * 4 (+1 EDAC) physical FLASH devices of 8 bits width each.
+ *
+ * This is because the FPGA does not perform address translation, but merely
+ * passes on what is written to its register to the actual FLASH devices.
+ *
+ * @startuml "Physical Layout of the FLASH mass storage" width=5
+ * node "32bit FLASH" {
+ *	node "EDAC" {
+ *	}
+ *	node "Byte 3" {
+ *	}
+ *	node "Byte 2" {
+ *	}
+ *	node "Byte 1" {
+ *	}
+ *	node "Byte 0" {
+ *	}
+ * }
+ * @enduml
+ *
+ * In other words, each byte in the relevant flash registers map to a
+ * corresponding device, which still must be addressed as usual, as for example
+ * at a logical address of 0x10, 16 bytes (or 4 words) are stored before that
+ * address, but each of the bytes per word is stored in parallel, starting from
+ * the top of the flash device, as the device counters are independently
+ * referring to a byte offset, i.e.
+ *
+ @verbatim
+	Offset	|  FLASH 0  |   FLASH 1  |  FLASH 2  |  FLASH 3
+	--------------------------------------------------------
+	0x0	| [Byte  0] | [ Byte  1] | [Byte  2] | [Byte  3]
+	0x1	| [Byte  4] | [ Byte  5] | [Byte  6] | [Byte  7]
+	0x2	| [Byte  8] | [ Byte  9] | [Byte 10] | [Byte 11]
+	0x3	| [Byte 12] | [ Byte 13] | [Byte 14] | [Byte 15]
+ @endverbatim
+ *
+ *
+ * The logical address thus requires conversion to the physical address where
+ * the FLASH page offset is modified.
+ *
+ * For added simplicity and to avoid confusion, a block/page/offset addressing
+ * scheme is used in the API of this component.
+ *
+ *
+ * ## Error Handling
+ *
+ * Error conditions that occur due to misconfiguration or during FLASH operation
+ * are propagated to the caller via return codes and, more detailed, by _errno_
+ * flags. ECC errors generated during reads are handled via @ref edac.
+ *
+ * If errors occur during erase or write cycles, the operation is aborted and
+ * the flash block is marked invalid.
+ *
+ * Unless otherwise selected during compilation, the validity flag is ignored
+ * during reads. This allows the recovery of data written to blocks that were
+ * later marked invalid. Note that doing this will likely result in copious
+ * amounts of FLASH EDAC errors to be emitted by the FPGA.
+ *
+ *
+ * ## Notes
+ *
+ * - There is no timeout on flash ready checks. This means that if the
+ *   FLASH/FPGA gets stuck, the watchdog timer will trigger.
+ *
+ * @example demo_flash.c
+ */
+
+#include <errors.h>
+
+#include <iwf_fpga.h>
+#include <iwf_flash.h>
+#include <compiler.h>
+
+uint32_t flash_erase_retry = 0;
+
+/* the FPGA cannot tell us the current address read from the flash device
+ * so we'll keep track of it here
+ */
+static struct {
+	struct {
+		uint32_t block;
+		uint32_t page;
+		uint32_t offset;
+	} read;
+
+	struct {
+		uint32_t block;
+		uint32_t page;
+		uint32_t offset;
+	} write;
+} flash_unit_addr[FLASH_UNITS];
+
+
+
+/**
+ * @brief set the internal flash write address
+ *
+ * @param unit	 the flash unit
+ * @param block	 the flash block
+ * @param page	 the flash page
+ * @param offset the byte offset within the page
+ *
+ * @return 0 on success, -1 on failure
+ */
+
+static int32_t flash_internal_set_read_addr(uint32_t unit, uint32_t block,
+					    uint32_t page, uint32_t offset)
+{
+	if (unit >= FLASH_UNITS)
+		return -1;
+
+	flash_unit_addr[unit].read.block  = block;
+	flash_unit_addr[unit].read.page   = page;
+	flash_unit_addr[unit].read.offset = offset;
+
+	return 0;
+}
+
+
+/**
+ * @brief set the internal flash write address
+ *
+ * @param unit	 the flash unit
+ * @param block	 the flash block
+ * @param page	 the flash page
+ * @param offset the byte offset within the page
+ *
+ * @return 0 on success, -1 on failure
+ */
+
+static int32_t flash_internal_set_write_addr(uint32_t unit, uint32_t block,
+					     uint32_t page, uint32_t offset)
+{
+	if (unit >= FLASH_UNITS)
+		return -1;
+
+	flash_unit_addr[unit].write.block  = block;
+	flash_unit_addr[unit].write.page   = page;
+	flash_unit_addr[unit].write.offset = offset;
+
+	return 0;
+}
+
+
+/**
+ * @brief set the internal flash read offset
+ *
+ * @param unit	 the flash unit
+ * @param offset the byte offset within the page
+ *
+ * @return 0 on success, -1 on failure
+ */
+
+static int32_t flash_internal_set_read_offset(uint32_t unit, uint32_t offset)
+{
+	if (unit >= FLASH_UNITS)
+		return -1;
+
+	flash_unit_addr[unit].read.offset = offset;
+
+	return 0;
+}
+
+
+/**
+ * @brief get the internal flash read offset
+ *
+ * @param unit	the flash unit
+ *
+ * @return offset
+ */
+
+static uint32_t flash_internal_get_read_offset(uint32_t unit)
+{
+	return flash_unit_addr[unit].read.offset;
+}
+
+
+/**
+ * @brief set the internal flash write offset
+ *
+ * @param unit	 the flash unit
+ * @param offset the byte offset within the page
+ *
+ * @return 0 on success, -1 on failure
+ */
+
+__attribute__((unused))
+static int32_t flash_internal_set_write_offset(uint32_t unit, uint32_t offset)
+{
+	if (unit >= FLASH_UNITS)
+		return -1;
+
+	flash_unit_addr[unit].write.offset = offset;
+
+	return 0;
+}
+
+
+/**
+ * @brief get the internal flash write offset
+ *
+ * @param unit	the flash unit
+ *
+ * @return offset
+ */
+
+static int32_t flash_internal_get_write_offset(uint32_t unit)
+{
+	return flash_unit_addr[unit].write.offset;
+}
+
+
+/**
+ * @brief increment the internal flash read offset
+ *
+ * @param unit	the flash unit
+ */
+
+static void flash_internal_inc_read_offset(uint32_t unit)
+{
+	if (unit >= FLASH_UNITS)
+		return;
+
+	flash_unit_addr[unit].read.offset++;
+}
+
+
+/**
+ * @brief increment the internal flash write offset
+ *
+ * @param unit	the flash unit
+ */
+
+static void flash_internal_inc_write_offset(uint32_t unit)
+{
+	if (unit >= FLASH_UNITS)
+		return;
+
+	flash_unit_addr[unit].write.offset++;
+}
+
+
+/**
+ * @brief get the internal flash write block
+ *
+ * @param unit	the flash unit
+ *
+ * @return the write block
+ */
+
+static uint32_t flash_get_write_block(uint32_t unit)
+{
+	return flash_unit_addr[unit].write.block;
+}
+
+
+/**
+ * @brief get the current flash read address
+ *
+ * @param[in]  unit   the flash unit
+ * @param[out] block  the flash block
+ * @param[out] page   the flash page
+ *
+ * @param[out] offset the byte offset within the page
+ */
+
+void flash_get_read_addr(uint32_t unit,  uint32_t *block,
+			 uint32_t *page, uint32_t *offset)
+{
+	(*block)  = flash_unit_addr[unit].read.block;
+	(*page)   = flash_unit_addr[unit].read.page;
+	(*offset) = flash_unit_addr[unit].read.offset;
+}
+
+
+/**
+ * @brief get the current flash write address
+ *
+ * @param[in]  unit   the flash unit
+ * @param[out] block  the flash block
+ * @param[out] page   the flash page
+ *
+ * @param[out] offset the byte offset within the page
+ */
+
+void flash_get_write_addr(uint32_t unit,  uint32_t *block,
+			  uint32_t *page, uint32_t *offset)
+{
+	(*block)  = flash_unit_addr[unit].write.block;
+	(*page)   = flash_unit_addr[unit].write.page;
+	(*offset) = flash_unit_addr[unit].write.offset;
+}
+
+
+/**
+ * @brief select a column in the flash memory
+ *
+ * @param unit    the flash unit
+ * @param address a physical flash address
+ */
+/* this is a little stupid, maybe redo */
+static void flash_set_column(uint32_t unit, uint32_t address)
+{
+	uint32_t i;
+
+	struct iwf_fpga_flash_addr flash_addr;
+	struct iwf_flash_address   addr;
+
+
+	addr.phys_addr = address;
+
+	/* order is important*/
+	for (i = 0; i < FLASH_CHIPS_PER_DEVICE; i++)
+		flash_addr.addr_chip[i] = addr.byte1;
+
+	fpga_flash_write_addr(unit, flash_addr.addr);
+
+
+	for (i = 0; i < FLASH_CHIPS_PER_DEVICE; i++)
+		flash_addr.addr_chip[i] = addr.byte2;
+
+	fpga_flash_write_addr(unit, flash_addr.addr);
+}
+
+
+/**
+ * @brief select a row in the flash memory
+ *
+ * @param unit    the flash unit
+ * @param address a physical flash address
+ */
+
+static void flash_set_row(uint32_t unit, uint32_t address)
+{
+	uint32_t i;
+
+	struct iwf_fpga_flash_addr flash_addr;
+	struct iwf_flash_address   addr;
+
+
+	addr.phys_addr = address;
+
+	/* order is important*/
+	for (i = 0; i < FLASH_CHIPS_PER_DEVICE; i++)
+		flash_addr.addr_chip[i] = addr.byte3;
+
+	fpga_flash_write_addr(unit, flash_addr.addr);
+
+
+	for (i = 0; i < FLASH_CHIPS_PER_DEVICE; i++)
+		flash_addr.addr_chip[i] = addr.byte4;
+
+	fpga_flash_write_addr(unit, flash_addr.addr);
+
+
+	for (i = 0; i < FLASH_CHIPS_PER_DEVICE; i++)
+		flash_addr.addr_chip[i] = addr.byte5;
+
+	fpga_flash_write_addr(unit, flash_addr.addr);
+}
+
+
+/**
+ * @brief set the address in the flash memory
+ *
+ * @param unit    the flash unit
+ * @param address a physical flash address
+ */
+
+static void flash_set_addr(uint32_t unit, uint32_t flash_addr)
+{
+	/* order is important*/
+	flash_set_column(unit, flash_addr);
+	flash_set_row(unit, flash_addr);
+}
+
+
+/**
+ * @brief set the block in the flash memory
+ *
+ * @param unit    the flash unit
+ * @param address a physical flash address
+ */
+
+static void flash_set_block_addr(uint32_t unit, uint32_t flash_addr)
+{
+	flash_set_row(unit, flash_addr);
+}
+
+
+/**
+ * @brief generate a physical address in a flash memory
+ *
+ * @param block  the flash block
+ * @param page	 the flash page
+ * @param offset the offset in the page
+ *
+ * @return the physical flash address
+ */
+
+uint32_t flash_gen_phys_addr(uint32_t block, uint32_t page, uint32_t offset)
+{
+	uint32_t addr;
+
+
+	offset &= (1 << FLASH_PAGE_OFFSET_BITS) - 1;
+
+	addr = page + block * FLASH_PAGES_PER_BLOCK;
+	addr = addr << FLASH_PAGE_ADDR_SHIFT;
+	addr = addr | offset;
+
+	return addr;
+}
+
+
+/**
+ * @brief generate a logical address in a flash memory
+ *
+ * @param block  the flash block
+ * @param page	 the flash page
+ * @param offset the offset in the page
+ *
+ * @return the logical flash address
+ */
+
+uint32_t flash_gen_logical_addr(uint32_t block, uint32_t page, uint32_t offset)
+{
+	uint32_t addr;
+
+
+	offset &= (1 << FLASH_LOGICAL_PAGE_OFFSET_BITS) - 1;
+
+	addr = page + block * FLASH_PAGES_PER_BLOCK;
+	addr = addr << FLASH_LOGICAL_PAGE_ADDR_SHIFT;
+	addr = addr | (offset << FLASH_LOGICAL_PAGE_OFFSET_SHIFT);
+
+	return addr;
+}
+
+
+/**
+ * @brief reverse a logical address in a flash memory
+ *
+ * @param addr[in]	the logical flash address
+ * @param block[out]	the flash unit
+ * @param page[out]	the flash page
+ * @param offset[out]	the offset in the page
+ */
+
+void flash_reverse_logical_addr(uint32_t addr,  uint32_t *block,
+			uint32_t *page, uint32_t *offset)
+{
+	(*offset) = (addr >> FLASH_LOGICAL_PAGE_OFFSET_SHIFT)
+		    & ((1 << FLASH_LOGICAL_PAGE_OFFSET_BITS) - 1);
+
+	addr = addr >> FLASH_LOGICAL_PAGE_ADDR_SHIFT;
+	/* only works with powers of two */
+	(*page) = addr & (FLASH_PAGES_PER_BLOCK - 1);
+
+	(*block) = addr >> __builtin_popcount(FLASH_PAGES_PER_BLOCK - 1);
+}
+
+
+/**
+ * @brief check the configuration parameters for a flash operation
+ *
+ * @param block  the flash block
+ * @param page	 the flash page
+ * @param offset the offset in the page
+ *
+ * @return 0 on success, -1 on failure
+ */
+
+static int32_t flash_check_cfg(uint32_t block, uint32_t page,
+			       uint32_t offset)
+{
+	if (block >= FLASH_BLOCKS_PER_CHIP) {
+		errno = ERR_FLASH_BLOCKS_EXCEEDED;
+		return -1;
+	}
+
+	if (page  >= FLASH_PAGES_PER_BLOCK) {
+		errno = ERR_FLASH_PAGES_EXCEEDED;
+		return -1;
+	}
+
+	if (offset >= FLASH_PAGE_SIZE) {
+		errno = ERR_FLASH_PAGESIZE_EXCEEDED;
+		return -1;
+	}
+
+	if (!fpga_mem_ctrl_sram_flash_enabled()) {
+		errno = ERR_FLASH_DISABLED;
+		return -1;
+	}
+
+	return 0;
+}
+
+
+/**
+ * @brief program a flash read sequence
+ *
+ * @param unit	 the flash unit
+ * @param block	 the flash block
+ * @param page	 the flash page
+ *
+ * @param offset the byte offset within the page
+ */
+
+static void flash_program_read_sequence(uint32_t unit, uint32_t block,
+					uint32_t page, uint32_t offset)
+{
+	uint32_t flash_addr;
+
+	flash_internal_set_read_addr(unit, block, page, offset);
+
+	flash_addr = flash_gen_phys_addr(block, page, offset);
+
+	fpga_flash_set_cmd(unit, FLASH_CMD_READ_SEQ_1);
+
+	flash_set_addr(unit, flash_addr);
+
+	fpga_flash_set_cmd(unit, FLASH_CMD_READ_SEQ_2);
+}
+
+
+/**
+ * @brief check if the flash block is valid
+ *
+ * @param unit  the flash unit
+ * @param block the flash block
+ *
+ * @return 1 if block is valid, 0 otherwise
+ */
+
+uint32_t flash_block_valid(uint32_t unit, uint32_t block)
+{
+	uint32_t i;
+	uint32_t ret;
+
+	uint32_t check_pages[] = FLASH_BAD_BLOCK_PAGES;
+
+
+	for (i = 0; i < ARRAY_SIZE(check_pages); i++) {
+
+		flash_program_read_sequence(unit, block, check_pages[i],
+					    FLASH_BAD_BLOCK_BYTE);
+
+		/* bypass the EDAC by reading the data from the status
+		 * register instead of the data register via flash_read_word()
+		 */
+		ret = fpga_flash_read_status(unit);
+
+		if (ret != FLASH_BLOCK_VALID) {
+			errno = ERR_FLASH_BLOCK_INVALID;
+			return 0;
+		}
+
+		/* if this is the case, the EDAC flash block is not 0xff
+		 * and an uncorrectable EDAC error has been raised in
+		 * the AHB register
+		 */
+		if (!fpga_flash_empty()) {
+			errno = ERR_FLASH_BLOCK_INVALID;
+			return 0;
+		}
+	}
+
+	return 1;
+}
+
+
+/**
+ * @brief initialise a read to check if a flash block is empty
+ *
+ * @param unit	 the flash unit
+ * @param block	 the flash block
+ * @param page	 the flash page
+ * @param offset the byte offset within the page
+ *
+ * @return 1 if the block is empty, 0 otherwise
+ */
+
+uint32_t flash_empty(uint32_t unit, uint32_t block,
+		     uint32_t page, uint32_t offset)
+{
+	flash_program_read_sequence(unit, block, page, offset);
+
+	fpga_flash_read_status(unit);
+
+	if (fpga_flash_empty())
+		return 1;
+
+	return 0;
+}
+
+
+/**
+ * @brief initialise a flash read sequence
+ *
+ * @param unit	 the flash unit
+ * @param block	 the flash block
+ * @param page	 the flash page
+ * @param offset the byte offset within the page
+ *
+ * @return -1 in case of error, 0 otherwise
+ */
+
+int32_t flash_init_read(uint32_t unit, uint32_t block,
+			uint32_t page, uint32_t offset)
+{
+	if (flash_check_cfg(block, page, offset))
+		return -1; /* errno set by callee */
+
+	if (flash_empty(unit, block, page, offset)) {
+		errno = ERR_FLASH_ADDR_EMPTY;
+		return -1;
+	}
+
+	flash_program_read_sequence(unit, block, page, offset);
+
+	return 0;
+}
+
+
+
+/**
+ * @brief read a word from flash
+ *
+ * @param unit the flash unit
+ * @param addr if 0, the data next flash address pointer will be read,
+ *             otherwise a seek is performed
+ *
+ * @return the value read; if the returned value has all bits set, errno
+ *         should be checked for ERR_FLASH_READ_PAGE_EXCEEDED which indicates
+ *         an invalid address within a page
+ */
+
+uint32_t flash_read_word(uint32_t unit, uint32_t offset)
+{
+	if (offset >= FLASH_PAGE_SIZE) {
+		errno = ERR_FLASH_READ_PAGE_EXCEEDED;
+		return -1;
+	}
+
+	if (offset) {
+		flash_internal_set_read_offset(unit, offset);
+
+		fpga_flash_set_cmd(unit, FLASH_CMD_READ_UPDATE_ADDR_1);
+		flash_set_column(unit, offset);
+		fpga_flash_set_cmd(unit, FLASH_CMD_READ_UPDATE_ADDR_2);
+	}
+
+	if (!offset) {
+		if (flash_internal_get_read_offset(unit) >= FLASH_PAGE_SIZE) {
+			errno = ERR_FLASH_READ_PAGE_EXCEEDED;
+			return -1;
+		}
+	}
+
+	flash_internal_inc_read_offset(unit);
+
+	return fpga_flash_read_word(unit);
+}
+
+
+/**
+ * @brief read a series of words from flash
+ *
+ * @param unit the flash unit
+ * @param addr if 0, the data next flash address pointer will be read,
+ *             otherwise a seek is performed
+ *
+ * @return 0 on success, -1 on error
+ */
+
+int32_t flash_read(uint32_t unit, uint32_t offset, uint32_t *buf, uint32_t len)
+{
+	uint32_t i;
+
+	
+	if (offset >= FLASH_PAGE_SIZE) {
+		errno = ERR_FLASH_READ_PAGE_EXCEEDED;
+		return -1;
+	}
+
+	if ((offset + len - 1) >= FLASH_PAGE_SIZE) {
+		errno = ERR_FLASH_READ_PAGE_EXCEEDED;
+		return -1;
+	}
+
+
+	if (offset) {
+		flash_internal_set_read_offset(unit, offset);
+
+		fpga_flash_set_cmd(unit, FLASH_CMD_READ_UPDATE_ADDR_1);
+		flash_set_column(unit, offset);
+		fpga_flash_set_cmd(unit, FLASH_CMD_READ_UPDATE_ADDR_2);
+	} else {
+		i = flash_internal_get_read_offset(unit);
+		if ((i + len - 1) >= FLASH_PAGE_SIZE) {
+			errno = ERR_FLASH_READ_PAGE_EXCEEDED;
+			return -1;
+		}
+	}
+
+	for (i = 0; i < len; i++) {
+		buf[i] = fpga_flash_read_word(unit);
+	}
+
+	flash_internal_set_read_offset(unit,
+				       flash_internal_get_read_offset(unit) +
+				       len);
+
+	return 0;
+}
+
+
+/**
+ * @brief read a series of words from flash and bypass the EDAC
+ *
+ * @param unit the flash unit
+ * @param addr if 0, the data next flash address pointer will be read,
+ *             otherwise a seek is performed
+ *
+ * @return 0 on success, -1 on error
+ */
+
+int32_t flash_read_bypass_edac(uint32_t unit, uint32_t offset,
+			       uint32_t *buf, uint32_t len)
+{
+	uint32_t i;
+
+
+	if (offset >= FLASH_PAGE_SIZE) {
+		errno = ERR_FLASH_READ_PAGE_EXCEEDED;
+		return -1;
+	}
+
+	if ((offset + len - 1) >= FLASH_PAGE_SIZE) {
+		errno = ERR_FLASH_READ_PAGE_EXCEEDED;
+		return -1;
+	}
+
+
+	if (offset) {
+		flash_internal_set_read_offset(unit, offset);
+
+		fpga_flash_set_cmd(unit, FLASH_CMD_READ_UPDATE_ADDR_1);
+		flash_set_column(unit, offset);
+		fpga_flash_set_cmd(unit, FLASH_CMD_READ_UPDATE_ADDR_2);
+	} else {
+		i = flash_internal_get_read_offset(unit);
+		if ((i + len - 1) >= FLASH_PAGE_SIZE) {
+			errno = ERR_FLASH_READ_PAGE_EXCEEDED;
+			return -1;
+		}
+	}
+
+	for (i = 0; i < len; i++) {
+		buf[i] = fpga_flash_read_status(unit);
+		flash_internal_inc_read_offset(unit);
+	}
+
+	return 0;
+}
+
+
+
+
+/**
+ * @brief mark a flash block as invalid
+ *
+ * @param unit  the flash unit
+ * @param block the flash block
+ */
+
+static void flash_mark_bad_block(uint32_t unit, uint32_t block)
+{
+	uint32_t i;
+	uint32_t flash_addr;
+
+	uint32_t bad_block_pages[] = FLASH_BAD_BLOCK_PAGES;
+
+
+	for (i = 0; i < ARRAY_SIZE(bad_block_pages); i++) {
+
+		flash_addr = flash_gen_phys_addr(block, bad_block_pages[i],
+					    FLASH_BAD_BLOCK_BYTE);
+
+		fpga_flash_disable_write_protect();
+
+		fpga_flash_set_cmd(unit, FLASH_CMD_PAGE_PROGRAM_SEQ_1);
+		flash_set_addr(unit, flash_addr);
+
+		flash_write_word(unit, 0x0);
+
+		fpga_flash_set_cmd(unit, FLASH_CMD_PAGE_PROGRAM_SEQ_2);
+
+		fpga_flash_enable_write_protect();
+
+		/* status can be ignored, just pulling one bit down
+		 * will make this successful
+		 */
+	}
+}
+
+
+/**
+ * @brief write a word to flash
+ *
+ * @param unit	the flash unit
+ * @param word	the word to write
+ *
+ * @return -1 on error, 0 otherwise
+ */
+
+int32_t flash_write_word(uint32_t unit, uint32_t word)
+{
+	uint32_t tmp;
+
+
+	tmp = flash_internal_get_write_offset(unit);
+
+	if (tmp >= FLASH_PAGE_SIZE) {
+		errno = ERR_FLASH_WRITE_PAGE_EXCEEDED;
+		return -1;
+	}
+
+	fpga_flash_write_word(unit, word);
+	flash_internal_inc_write_offset(unit);
+
+	return 0;
+}
+
+
+/**
+ * @brief write a buffer of 32 bit words to flash
+ *
+ * @param unit	the flash unit
+ * @param buf	the buffer to write
+ * @param len	the number of words in the buffer
+ *
+ * @return -1 on error, 0 otherwise
+ */
+
+int32_t flash_write(uint32_t unit, uint32_t *buf, uint32_t len)
+{
+	uint32_t i;
+
+
+	i = flash_internal_get_write_offset(unit);
+
+	if ((i + len - 1) >= FLASH_PAGE_SIZE) {
+		errno = ERR_FLASH_WRITE_PAGE_EXCEEDED;
+		return -1;
+	}
+
+
+	for (i = 0; i < len; i++)
+		fpga_flash_write_word(unit, buf[i]);
+
+	flash_internal_set_write_offset(unit,
+				       flash_internal_get_write_offset(unit) +
+				       len);
+
+	return 0;
+}
+
+
+/**
+ * @brief initialise a flash write sequence
+ *
+ * @param unit	 the flash unit
+ * @param block	 the flash block
+ * @param page	 the flash page
+ * @param offset the byte offset within the page
+ *
+ * @return -1 in case of error, 0 otherwise
+ */
+
+int32_t flash_init_write(uint32_t unit, uint32_t block,
+			 uint32_t page, uint32_t offset)
+{
+	uint32_t flash_addr;
+
+
+	if (flash_check_cfg(block, page, offset))
+		return -1; /* errno set by callee */
+
+	/* NOTE: Mantis 2238 (Note 4721)
+	   flash_block_valid removed, because it is already
+	   checked in flash_erase_block */
+
+	flash_internal_set_write_addr(unit, block, page, offset);
+
+	flash_addr = flash_gen_phys_addr(block, page, offset);
+
+	fpga_flash_disable_write_protect();
+
+	fpga_flash_set_cmd(unit, FLASH_CMD_PAGE_PROGRAM_SEQ_1);
+	flash_set_addr(unit, flash_addr);
+
+
+	return 0;
+}
+
+
+/**
+ * @brief finish a flash write sequence
+ *
+ * @param unit	the flash unit
+ *
+ * @return -1 on error, 0 otherwise
+ */
+
+int32_t flash_stop_write(uint32_t unit)
+{
+	uint32_t status;
+
+
+	fpga_flash_set_cmd(unit, FLASH_CMD_PAGE_PROGRAM_SEQ_2);
+
+	fpga_flash_enable_write_protect();
+
+	fpga_flash_set_cmd(unit, FLASH_CMD_READ_STATUS);
+
+	status = fpga_flash_read_status(unit);
+
+	if (status & FLASH_STATUS_FAIL) {
+		flash_mark_bad_block(unit, flash_get_write_block(unit));
+		errno = ERR_FLASH_DATA_WRITE_ERROR;
+		return -1;
+	}
+
+	status = fpga_flash_read_edac_status();
+
+	if (status & FLASH_EDAC_STATUS_FAIL) {
+		flash_mark_bad_block(unit, flash_get_write_block(unit));
+		errno = ERR_FLASH_EDAC_WRITE_ERROR;
+		return -1;
+	}
+
+	return 0;
+}
+
+
+/**
+ * @brief erase a flash block
+ *
+ * @param unit  the flash unit
+ * @param block the flash block
+ *
+ * @return -1 on error, 0 otherwise
+ */
+
+int32_t flash_erase_block(uint32_t unit, uint32_t block)
+{
+	uint32_t status;
+	uint32_t flash_addr;
+
+	/* Mantis 2270: retry once on invalid status */
+	if (!flash_block_valid(unit, block))
+	  {
+	    flash_erase_retry++;
+
+	    if (!flash_block_valid(unit, block))
+	      {
+		return -1; /* errno set by callee */
+	      }
+	  }
+		
+	flash_addr = flash_gen_phys_addr(block, 0, 0);
+
+	fpga_flash_disable_write_protect();
+
+	fpga_flash_set_cmd(unit, FLASH_CMD_BLOCK_ERASE_SEQ_1);
+	flash_set_block_addr(unit, flash_addr);
+
+
+	fpga_flash_set_cmd(unit, FLASH_CMD_BLOCK_ERASE_SEQ_2);
+
+	fpga_flash_enable_write_protect();
+
+	fpga_flash_set_cmd(unit, FLASH_CMD_READ_STATUS);
+
+	status = fpga_flash_read_status(unit);
+
+	if (status & FLASH_STATUS_FAIL) {
+		flash_mark_bad_block(unit, flash_get_write_block(unit));
+		errno = ERR_FLASH_DATA_ERASE_ERROR;
+		return -1;
+	}
+
+	status = fpga_flash_read_edac_status();
+
+	if (status & FLASH_EDAC_STATUS_FAIL) {
+		flash_mark_bad_block(unit, flash_get_write_block(unit));
+		errno = ERR_FLASH_EDAC_ERASE_ERROR;
+		return -1;
+	}
+
+	return 0;
+}
diff --git a/IBSW/lib/iwf_fpga.c b/IBSW/lib/iwf_fpga.c
new file mode 100644
index 0000000..ff0dc83
--- /dev/null
+++ b/IBSW/lib/iwf_fpga.c
@@ -0,0 +1,871 @@
+/**
+ * @file   iwf_fpga.c
+ * @ingroup iwf_fpga
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ *	   Roland Ottensamer (roland.ottensamer@univie.ac.at),
+ * @date   September, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @defgroup iwf_fpga  IWF FPGA
+ * @brief Set of accessor functions for the IWF FPGA
+ *
+ *
+ * ## Overview
+ *
+ * This components implements functionality to access or modify registers in
+ * the IWF FPGA.
+ *
+ * @see
+ *	- CHEOPS-IWF-INST-IRD-020 _CHEOPS BEE DPU Hardware - Software Interface
+ *	  Requirements_ for FPGA register mappings
+ *
+ * ## Mode of Operation
+ *
+ * None
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ * ## Notes
+ *
+ * - functionality will be added as needed
+ *
+ *
+ */
+
+
+#include <io.h>
+#include <iwf_fpga.h>
+#include <compiler.h>
+
+/* oh the humanity */
+struct iwf_fpga_map fpga = {
+	(struct iwf_fpga_version *)	 IWF_FPGA_BASE,
+	(struct iwf_fpga_dpu *)		 IWF_FPGA_DPU_BASE,
+	(struct iwf_fpga_reset *)	 IWF_FPGA_RESET_BASE,
+	(struct iwf_fpga_irq *)		 IWF_FPGA_IRQ_BASE,
+	(struct iwf_fpga_sem *)		 IWF_FPGA_SEM_BASE,
+	(struct iwf_fpga_heater *)	 IWF_FPGA_HEATER_BASE,
+	(struct iwf_fpga_adc_ctrl *)	 IWF_FPGA_ADC_CTRL_BASE,
+	(struct iwf_fpga_adc_val *)	 IWF_FPGA_ADC_VAL_BASE,
+	(struct iwf_fpga_mem_ctrl *)	 IWF_FPGA_MEM_CTRL_BASE,
+	(struct iwf_fpga_flash_cmd *)    IWF_FPGA_FLASH_CMD_BASE,
+	(struct iwf_fpga_flash_addr *)   IWF_FPGA_FLASH_ADDR_BASE,
+	(struct iwf_fpga_flash_status *) IWF_FPGA_FLASH_STATUS_BASE,
+	{
+	 (uint32_t *) IWF_FPGA_FLASH_1_DATA_BASE,
+	 (uint32_t *) IWF_FPGA_FLASH_2_DATA_BASE,
+	 (uint32_t *) IWF_FPGA_FLASH_3_DATA_BASE,
+	 (uint32_t *) IWF_FPGA_FLASH_4_DATA_BASE,
+	}
+};
+
+
+/**
+ * @brief get FPGA version register
+ *
+ * @return the FPGA version register
+ *
+ * @see DPU-HIRD-IF-4010 in CHEOPS-IWF-INST-IRD for definition of fields
+ */
+
+uint32_t fpga_version_reg_get(void)
+{
+	return ioread32be(&fpga.fpga->version);
+}
+
+
+/**
+ * @brief get FPGA DPU status register
+ *
+ * @return the FPGA DPU status register
+ *
+ * @see DPU-HIRD-IF-4020 in CHEOPS-IWF-INST-IRD for definition of fields
+ */
+
+uint32_t fpga_dpu_status_reg_get(void)
+{
+	return ioread32be(&fpga.dpu->status);
+}
+
+/**
+ * @brief get FPGA DPU address register
+ *
+ * @return the FPGA DPU address register
+ *
+ * @see DPU-HIRD-IF-4030 in CHEOPS-IWF-INST-IRD for definition of fields
+ */
+
+uint32_t fpga_dpu_addr_reg_get(void)
+{
+	return ioread32be(&fpga.dpu->addr);
+}
+
+
+/**
+ * @brief get FPGA SEM status register
+ *
+ * @return the FPGA SEM status register
+ *
+ * @see DPU-HIRD-IF-4080 in CHEOPS-IWF-INST-IRD for definition of fields
+ */
+
+uint32_t fpga_sem_status_reg_get(void)
+{
+	return ioread32be(&fpga.sem->status);
+}
+
+
+/**
+ * @brief get FPGA Instrument Operational Heater status register
+ *
+ * @return the FPGA Instrument Operational Heater status register
+ *
+ * @see DPU-HIRD-IF-4090 in CHEOPS-IWF-INST-IRD for definition of fields
+ */
+
+uint32_t fpga_oper_heater_status_reg_get(void)
+{
+	return ioread32be(&fpga.heater->status);
+}
+
+
+/**
+ * @brief switch on the SEM
+ */
+
+void fpga_sem_switch_on(uint8_t keyword)
+{
+	uint32_t flags;
+
+
+	flags  = ioread32be(&fpga.sem->status);
+
+	/* clear destination bits */
+	flags &= 0xffff00fe;
+
+	/* enter password */
+	flags |= (keyword << 8);
+
+	/* enter on bit */
+	flags |= SEM_ON;
+
+	iowrite32be(flags, &fpga.sem->ctrl);
+}
+
+
+/**
+ * @brief switch off the SEM
+ */
+
+void fpga_sem_switch_off(uint8_t keyword)
+{
+	uint32_t flags;
+
+
+	flags = ioread32be(&fpga.sem->status);
+
+	/* clear destination bits */
+	flags &= 0xffff00fe;
+
+	/* enter password */
+	flags |= (keyword << 8);
+
+	/* enter off bit */
+	flags &= SEM_OFF;
+
+	iowrite32be(flags, &fpga.sem->ctrl);
+}
+
+
+/**
+ * @brief switch on the SEM heaters
+ */
+
+void fpga_sem_heater_on(void)
+{
+	uint32_t flags;
+
+
+	flags  = ioread32be(&fpga.sem->status);
+	flags |= SEM_HEATER_ON;
+
+	iowrite32be(flags, &fpga.sem->ctrl);
+}
+
+
+/**
+ * @brief switch off the SEM heaters
+ */
+
+void fpga_sem_heater_off(void)
+{
+	uint32_t flags;
+
+
+	flags  = ioread32be(&fpga.sem->status);
+	flags &= SEM_HEATER_OFF;
+
+	iowrite32be(flags, &fpga.sem->ctrl);
+}
+
+
+/**
+ * @brief check if SEM status is ON
+ */
+
+uint32_t fpga_sem_get_status_on(void)
+{
+	uint32_t flags;
+
+
+	flags = ioread32be(&fpga.sem->status) & SEM_STATUS_ON;
+
+	return flags;
+}
+
+
+/**
+ * @brief check if SEM status is FAILURE
+ */
+
+uint32_t fpga_sem_get_status_failure(void)
+{
+	uint32_t flags;
+
+
+	flags = ioread32be(&fpga.sem->status) & SEM_STATUS_FAILURE;
+
+	return flags;
+}
+
+
+/**
+ * @brief check if SEM heater status is ON
+ */
+
+uint32_t fpga_sem_get_status_heater_on(void)
+{
+	uint32_t flags;
+
+
+	flags = ioread32be(&fpga.sem->status) & SEM_STATUS_HEATER_ON;
+
+	return flags;
+}
+
+/* getter functions for the BEE FPGA analog values */
+uint16_t fpga_adc_get_adc_p3v3(void)
+{
+	uint16_t value;
+
+
+	value = (ioread32be(&fpga.adc_val->adc_p3v3__adc_p5v) >> 16) & 0xffff;
+
+	return value;
+}
+
+uint16_t fpga_adc_get_adc_p5v(void)
+{
+	uint16_t value;
+
+
+	value = ioread32be(&fpga.adc_val->adc_p3v3__adc_p5v) & 0xffff;
+
+	return value;
+}
+
+uint16_t fpga_adc_get_adc_p1v8(void)
+{
+	uint16_t value;
+
+
+	value = (ioread32be(&fpga.adc_val->adc_p1v8__adc_p2v5) >> 16) & 0xffff;
+
+	return value;
+}
+
+uint16_t fpga_adc_get_adc_p2v5(void)
+{
+	uint16_t value;
+
+
+	value = ioread32be(&fpga.adc_val->adc_p1v8__adc_p2v5) & 0xffff;
+
+	return value;
+}
+
+uint16_t fpga_adc_get_adc_n5v(void)
+{
+	uint16_t value;
+
+
+	value = (ioread32be(&fpga.adc_val->adc_n5v__adc_pgnd) >> 16) & 0xffff;
+
+	return value;
+}
+
+uint16_t fpga_adc_get_adc_pgnd(void)
+{
+	uint16_t value;
+
+
+	value = ioread32be(&fpga.adc_val->adc_n5v__adc_pgnd) & 0xffff;
+
+	return value;
+}
+
+uint16_t fpga_adc_get_adc_tempoh1a(void)
+{
+	uint16_t value;
+
+
+	value = (ioread32be(&fpga.adc_val->adc_tempoh1a__adc_temp1) >> 16)
+		& 0xffff;
+
+	return value;
+}
+
+uint16_t fpga_adc_get_adc_temp1(void)
+{
+	uint16_t value;
+
+
+	value = ioread32be(&fpga.adc_val->adc_tempoh1a__adc_temp1) & 0xffff;
+
+	return value;
+}
+
+uint16_t fpga_adc_get_adc_tempoh2a(void)
+{
+	uint16_t value;
+
+
+	value = (ioread32be(&fpga.adc_val->adc_tempoh2a__adc_tempoh1b) >> 16)
+		& 0xffff;
+
+	return value;
+}
+
+uint16_t fpga_adc_get_adc_tempoh1b(void)
+{
+	uint16_t value;
+
+
+	value = ioread32be(&fpga.adc_val->adc_tempoh2a__adc_tempoh1b) & 0xffff;
+
+	return value;
+}
+
+uint16_t fpga_adc_get_adc_tempoh3a(void)
+{
+	uint16_t value;
+
+
+	value = (ioread32be(&fpga.adc_val->adc_tempoh3a__adc_tempoh2b) >> 16)
+		& 0xffff;
+
+	return value;
+}
+
+uint16_t fpga_adc_get_adc_tempoh2b(void)
+{
+	uint16_t value;
+
+
+	value =  ioread32be(&fpga.adc_val->adc_tempoh3a__adc_tempoh2b) & 0xffff;
+
+	return value;
+}
+
+uint16_t fpga_adc_get_adc_tempoh4a(void)
+{
+	uint16_t value;
+
+
+	value = (ioread32be(&fpga.adc_val->adc_tempoh4a__adc_tempoh3b) >> 16)
+		& 0xffff;
+
+	return value;
+}
+
+uint16_t fpga_adc_get_adc_tempoh3b(void)
+{
+	uint16_t value;
+
+
+	value = ioread32be(&fpga.adc_val->adc_tempoh4a__adc_tempoh3b) & 0xffff;
+
+	return value;
+}
+
+uint16_t fpga_adc_get_spare_01(void)
+{
+	uint16_t value;
+
+
+	value = (ioread32be(&fpga.adc_val->spare_01__adc_tempoh4b) >> 16)
+		& 0xffff;
+
+	return value;
+}
+
+uint16_t fpga_adc_get_adc_tempoh4b(void)
+{
+	uint16_t value;
+
+
+	value = ioread32be(&fpga.adc_val->spare_01__adc_tempoh4b) & 0xffff;
+
+	return value;
+}
+
+uint16_t fpga_adc_get_sem_p15v(void)
+{
+	uint16_t value;
+
+
+	value = (ioread32be(&fpga.adc_val->sem_p15v__sem_p30v) >> 16) & 0xffff;
+
+	return value;
+}
+
+uint16_t fpga_adc_get_sem_p30v(void)
+{
+	uint16_t value;
+
+
+	value = ioread32be(&fpga.adc_val->sem_p15v__sem_p30v) & 0xffff;
+
+	return value;
+}
+
+uint16_t fpga_adc_get_sem_p5v0(void)
+{
+	uint16_t value;
+
+
+	value = (ioread32be(&fpga.adc_val->sem_p5v0__sem_p7v0) >> 16) & 0xffff;
+
+	return value;
+}
+
+uint16_t fpga_adc_get_sem_p7v0(void)
+{
+	uint16_t value;
+
+
+	value = ioread32be(&fpga.adc_val->sem_p5v0__sem_p7v0) & 0xffff;
+
+	return value;
+}
+
+uint16_t fpga_adc_get_spare_02(void)
+{
+	uint16_t value;
+
+
+	value = (ioread32be(&fpga.adc_val->spare_02__sem_n5v0) >> 16) & 0xffff;
+
+	return value;
+}
+
+uint16_t fpga_adc_get_sem_n5v0(void)
+{
+	uint16_t value;
+
+
+	value = ioread32be(&fpga.adc_val->spare_02__sem_n5v0) & 0xffff;
+
+	return value;
+}
+
+/* other adc registers are spare 03 .. 12 */
+
+
+/**
+ * @brief read DPU board serial number
+ *
+ * @return the board serial number
+ */
+
+uint32_t fpga_dpu_get_board_serial(void)
+{
+	uint32_t ser;
+
+
+	ser = (ioread32be(&fpga.dpu->status) >> 12) & 0x7;
+
+	return ser;
+}
+
+
+/**
+* @brief read 1.8v core power supply status
+ *
+ * @return 0 on core power supply failure, 1 otherwise
+ */
+
+uint32_t fpga_dpu_get_core_power_status(void)
+{
+	uint32_t pwr;
+
+
+	pwr = (ioread32be(&fpga.dpu->status) >> 1) & 0x1;
+
+	return pwr;
+}
+
+
+/**
+* @brief read DPU 3.3V, 2.5V power status
+ *
+ * @return 0 on DPU power supply failure, 1 otherwise
+ */
+
+uint32_t fpga_dpu_get_dpu_power_status(void)
+{
+	uint32_t pwr;
+
+
+	pwr = ioread32be(&fpga.dpu->status) & 0x1;
+
+	return pwr;
+}
+
+
+/**
+ * @brief read configured remote terminal address
+ *
+ * @return the remote terminal address
+ */
+
+uint16_t fpga_dpu_get_rt_addr(void)
+{
+	uint16_t rt_addr;
+
+
+	rt_addr = (uint16_t) (ioread32be(&fpga.dpu->addr) >> 11) & 0x1f;
+
+	return rt_addr;
+}
+
+
+/**
+ * @brief set a flag in the reset control register of the FPGA
+ *
+ * @param flag	the flag to set
+ */
+
+void fpga_reset_ctrl_set(uint32_t flag)
+{
+	iowrite32be(flag, &fpga.reset->ctrl);
+}
+
+
+/**
+ * @brief get the reset status register of the FPGA
+ *
+ * @return the contents of the reset status register
+ */
+
+uint32_t fpga_reset_status_get(void)
+{
+	return ioread32be(&fpga.reset->status);
+}
+
+
+/**
+ * @brief turn on a heater
+ *
+ * @param h a heater id
+ */
+
+void fpga_heater_on(enum heater h)
+{
+	uint32_t flags;
+
+
+	flags  = ioread32be(&fpga.heater->status);
+	flags |= (0x1UL << h);
+
+	iowrite32be(flags, &fpga.heater->ctrl);
+}
+
+
+/**
+ * @brief turn of a heater
+ *
+ * @param h a heater id
+ */
+
+void fpga_heater_off(enum heater h)
+{
+	uint32_t flags;
+
+
+	flags  = ioread32be(&fpga.heater->status);
+	flags &= ~(0x1UL << h);
+
+	iowrite32be(flags, &fpga.heater->ctrl);
+}
+
+
+/**
+ * @brief get the status of a heater
+ *
+ * @param h a heater id
+ *
+ * @return bit set if on, 0 if off
+ */
+
+uint32_t fpga_heater_status(enum heater h)
+{
+	uint32_t flags;
+
+
+	flags  = ioread32be(&fpga.heater->status);
+	flags &= (0x1UL << h);
+
+	return flags;
+}
+
+
+/**
+ * @brief check if the FLASH is in READY status
+ *
+ * return 0 if not ready
+ */
+
+uint32_t fpga_flash_ready(void)
+{
+	uint32_t flags;
+
+
+	flags  = ioread32be(&fpga.mem_ctrl->status);
+	flags &= MEM_CTRL_FLASH_READY;
+
+	return flags;
+}
+
+
+/**
+ * @brief read the flash edac status field of the FPGA
+ *
+ * @return the contents of the flash edac status field
+ */
+
+uint32_t fpga_flash_read_edac_status(void)
+{
+	return ioread32be(&fpga.mem_ctrl->flash_edac);
+}
+
+
+/**
+ * @brief check if the FLASH EDAC is in READY status
+ *
+ * return 0 if not ready
+ */
+
+uint32_t fpga_flash_edac_ready(void)
+{
+	uint32_t flags;
+
+
+	flags  = fpga_flash_read_edac_status();
+	flags &= MEM_CTRL_FLASH_EDAC_READY;
+
+	return flags;
+}
+
+
+/**
+ * @brief check if a programmed FLASH block is marked empty
+ *
+ * return 0 if not empty
+ */
+
+uint32_t fpga_flash_empty(void)
+{
+	uint32_t flags;
+
+
+	flags  = ioread32be(&fpga.mem_ctrl->status);
+	flags &= MEM_CTRL_FLASH_EMPTY;
+
+	return flags;
+}
+
+
+/**
+ * @brief write a flash command to the FPGA register
+ *
+ * @param unit	the flash unit
+ * @param cmd	the flash command word
+ */
+
+void fpga_flash_set_cmd(uint32_t unit, uint32_t cmd)
+{
+	iowrite32be(cmd, &fpga.flash_cmd[unit]);
+
+	/* insert a delay, otherwise the ready bit may not
+	 * have been pulled down by the FPGA
+	 * the required delay is 200 ns, this corresponds to 5 nops at 25 Mhz
+	 */
+	__asm__ __volatile__("nop;nop;nop;nop;nop" : : : "memory");
+
+	/* NOTE: with 200ns, we still see false EDAC errors on reading. */
+	/* We have added some extra delay to have margin (Mantis 2070). */
+	
+	__asm__ __volatile__("nop;nop;nop;nop;nop" : : : "memory");
+	__asm__ __volatile__("nop;nop;nop;nop;nop" : : : "memory");
+	__asm__ __volatile__("nop;nop;nop;nop;nop" : : : "memory");
+	__asm__ __volatile__("nop;nop;nop;nop;nop" : : : "memory");
+
+	while (!fpga_flash_ready())
+		cpu_relax();
+}
+
+
+/**
+ * @brief write a flash address to the FPGA register
+ *
+ * @param unit	the flash unit
+ * @param addr	the flash address
+ */
+
+void fpga_flash_write_addr(uint32_t unit, uint32_t addr)
+{
+	iowrite32be(addr, &fpga.flash_addr[unit]);
+}
+
+/**
+ * @brief read a word from the FPGA <-> FLASH data port
+ *
+ * @param unit	the flash unit
+ * @return	a data word
+ */
+
+uint32_t fpga_flash_read_word(uint32_t unit)
+{
+	return ioread32be(fpga.flash_data[unit]);
+}
+
+/**
+ * @brief write a word to the FPGA <-> FLASH data port
+ *
+ * @param unit	the flash unit
+ * @param word	the data word
+ */
+
+void fpga_flash_write_word(uint32_t unit, uint32_t word)
+{
+	iowrite32be(word, fpga.flash_data[unit]);
+}
+
+
+/**
+ * @brief read the flash status field
+ *
+ * @param unit	the flash unit
+ *
+ * @return the contents of the flash status field
+ */
+
+uint32_t fpga_flash_read_status(uint32_t unit)
+{
+	return ioread32be(&fpga.flash_status[unit]);
+}
+
+
+
+
+
+/**
+ * @brief check if SRAM2/FLASH mode is enabled
+ *
+ * return 0 if disabled
+ */
+
+uint32_t fpga_mem_ctrl_sram_flash_enabled(void)
+{
+	uint32_t flags;
+
+
+	flags  = ioread32be(&fpga.mem_ctrl->status);
+	flags &= MEM_CTRL_SRAM_FLASH_ACTIVE;
+
+	return flags;
+}
+
+
+/**
+ * @brief enable SRAM2/FLASH mode
+ */
+
+void fpga_mem_ctrl_sram_flash_set_enabled(void)
+{
+	uint32_t flags;
+
+
+	flags  = ioread32be(&fpga.mem_ctrl->status);
+	flags |= MEM_CTRL_SRAM_FLASH_ACTIVE;
+
+	iowrite32be(flags, &fpga.mem_ctrl->ctrl);
+}
+
+
+/**
+ * @brief clear (disable) SRAM2/FLASH mode
+ */
+
+void fpga_mem_ctrl_sram_flash_clear_enabled(void)
+{
+	uint32_t flags;
+
+
+	flags  = ioread32be(&fpga.mem_ctrl->status);
+	flags &= ~MEM_CTRL_SRAM_FLASH_ACTIVE;
+
+	iowrite32be(flags, &fpga.mem_ctrl->ctrl);
+}
+
+
+/**
+ * @brief disable FLASH write protect bit
+ */
+
+void fpga_flash_disable_write_protect(void)
+{
+	uint32_t flags;
+
+	flags  = ioread32be(&fpga.mem_ctrl->status);
+	flags |= MEM_CTRL_WRITE_PROTECT_OFF;
+
+	iowrite32be(flags, &fpga.mem_ctrl->ctrl);
+}
+
+
+/**
+ * @brief enable FLASH write protect bit
+ */
+
+void fpga_flash_enable_write_protect(void)
+{
+	uint32_t flags;
+
+	flags  = ioread32be(&fpga.mem_ctrl->status);
+	flags &= MEM_CTRL_WRITE_PROTECT_ON;
+
+	iowrite32be(flags, &fpga.mem_ctrl->ctrl);
+}
diff --git a/IBSW/lib/leon3_dsu.c b/IBSW/lib/leon3_dsu.c
new file mode 100644
index 0000000..704913b
--- /dev/null
+++ b/IBSW/lib/leon3_dsu.c
@@ -0,0 +1,832 @@
+/**
+ * @file    leon3_dsu.c
+ * @ingroup leon3_dsu
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   February, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @defgroup leon3_dsu LEON3 DSU interface
+ *
+ * @brief Access to the DSU of the GR712RC LEON3FT (and possibly others)
+ *
+ *
+ * ## Overview
+ *
+ * This component implements access to the debug support unit of the GR712RC
+ * LEON3 processor.
+ *
+ * ## Mode of Operation
+ *
+ * @see _GR712RC user manual v2.7 chapter 9_ for information on the DSU
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ * ## Notes
+ *
+ * - functionality is added as needed
+ * - this can be the basis for a grmon replacement
+ *
+ */
+
+#include <io.h>
+#include <errors.h>
+#include <leon3_dsu.h>
+
+
+
+/**
+ * @brief calculate address of output register %on for a window
+ * @see GR712-UM v2.3 pp. 81
+ *
+ * @param cpu the cpu number
+ * @param n   the index of the output register %on
+ * @param cwp the index of the register window
+ *
+ * @return 0 if error, otherwise address of register
+ */
+
+__attribute__((unused))
+static uint32_t dsu_get_output_reg_addr(uint32_t cpu, uint32_t n, uint32_t cwp)
+{
+	if (cwp > NWINDOWS) {
+		errno = ERR_DSU_CWP_INVALID;
+		return 0;
+	}
+
+	return (DSU_BASE(cpu) + 0x300000
+		+ (((cwp * 64) + 32 + (n * 4)) % (NWINDOWS * 64)));
+}
+
+
+/**
+ * @brief calculate address of local register %ln for a window
+ * @see GR712-UM v2.3 pp. 81
+ *
+ * @param cpu the cpu number
+ * @param n   the index of the local register %ln
+ * @param cwp the index of the register window
+ *
+ * @return 0 if error, otherwise address of register
+ */
+
+__attribute__((unused))
+static uint32_t dsu_get_local_reg_addr(uint32_t cpu, uint32_t n, uint32_t cwp)
+{
+	if (cwp > NWINDOWS) {
+		errno = ERR_DSU_CWP_INVALID;
+		return 0;
+	}
+
+	return (DSU_BASE(cpu) + 0x300000
+		+ (((cwp * 64) + 64 + (n * 4)) % (NWINDOWS * 64)));
+}
+
+
+/**
+ * @brief calculate address of input register %in for a window
+ * @see GR712-UM v2.3 pp. 81
+ *
+ * @param cpu the cpu number
+ * @param n   the index of the input register %in
+ * @param cwp the index of the register window
+ *
+ * @return 0 if error, otherwise address of register
+ */
+
+__attribute__((unused))
+static uint32_t dsu_get_input_reg_addr(uint32_t cpu, uint32_t n, uint32_t cwp)
+{
+	if (cwp > NWINDOWS) {
+		errno = ERR_DSU_CWP_INVALID;
+		return 0;
+	}
+
+	return (DSU_BASE(cpu) + 0x300000
+		+ (((cwp * 64) + 96 + (n * 4)) % (NWINDOWS * 64)));
+}
+
+
+/**
+ * @brief calculate address of global register %gn
+ * @see GR712-UM v2.3 pp. 81
+ *
+ * @param cpu the cpu number
+ * @param n   the index of the global register %gn
+ *
+ * @return address of register
+ */
+
+__attribute__((unused))
+static uint32_t dsu_get_global_reg_addr(uint32_t cpu, uint32_t n)
+{
+	return (DSU_BASE(cpu) + 0x300000 + n * 4);
+}
+
+
+/**
+ * @brief calculate address of floating point register %fn
+ * @see GR712-UM v2.3 pp. 81
+ *
+ * @param cpu the cpu number
+ * @param n   the index of the floating-point register %fn
+ *
+ * @return address of register
+ */
+
+__attribute__((unused))
+static uint32_t dsu_get_fpu_reg_addr(uint32_t cpu, uint32_t n)
+{
+	return (DSU_BASE(cpu) + 0x301000 + n * 4);
+}
+
+
+/**
+ * @brief set bits in the DSU control register
+ *
+ * @param cpu   the cpu number
+ * @param flags the bitmask to set
+ */
+
+static void dsu_set_dsu_ctrl(uint32_t cpu, uint32_t flags)
+{
+	uint32_t tmp;
+
+
+	tmp  = ioread32be((void *) (DSU_CTRL + DSU_OFFSET_CPU(cpu)));
+	tmp |= flags;
+	iowrite32be(tmp,  (void *) (DSU_CTRL + DSU_OFFSET_CPU(cpu)));
+}
+
+
+/**
+ * @brief get the DSU control register
+ *
+ * @param cpu   the cpu number
+ *
+ * @return the contents of the DSU control register
+ */
+
+static uint32_t dsu_get_dsu_ctrl(uint32_t cpu)
+{
+	return ioread32be((void *) (DSU_CTRL + DSU_OFFSET_CPU(cpu)));
+}
+
+
+/**
+ * @brief clear bits in the DSU control register
+ *
+ * @param cpu   the cpu number
+ * @param flags the bitmask of flags to clear
+ */
+
+static void dsu_clear_dsu_ctrl(uint32_t cpu, uint32_t flags)
+{
+	uint32_t tmp;
+
+
+	tmp  = ioread32be((void *) (DSU_CTRL + DSU_OFFSET_CPU(cpu)));
+	tmp &= ~flags;
+	iowrite32be(tmp,  (void *) (DSU_CTRL + DSU_OFFSET_CPU(cpu)));
+}
+
+
+/**
+ * @brief clear the Integer Units register file
+ *
+ * @param cpu the cpu number
+ */
+
+void dsu_clear_iu_reg_file(uint32_t cpu)
+{
+	uint32_t i;
+	/* (NWINDOWS * (%ln + %ion) + %gn) * 4 bytes */
+	const uint32_t iu_reg_size = (NWINDOWS * (8 + 8) + 8) * 4;
+
+
+	for (i = 0; i < iu_reg_size; i += 4)
+		iowrite32be(0x0, (void *) (DSU_OFFSET_CPU(cpu)
+					   + DSU_IU_REG + i));
+}
+
+
+/**
+ * @brief enable forcing processor to enter debug mode if any other processor
+ *        in the system enters debug mode
+ *
+ * @param cpu the cpu number
+ *
+ * @see GR712-UM v2.3 pp. 83
+ */
+
+void dsu_set_force_enter_debug_mode(uint32_t cpu)
+{
+	uint16_t tmp;
+
+	struct dsu_mode_mask *dmm
+		= (struct dsu_mode_mask *) DSU_MODE_MASK;
+
+
+	tmp  = ioread16be(&dmm->enter_debug);
+	tmp |= (1 << cpu);
+	iowrite16be(tmp, &dmm->enter_debug);
+}
+
+
+/**
+ * @brief disable forcing processor to enter debug mode if any other processor
+ *        in the system enters debug mode
+ *
+ * @param cpu the cpu number
+ *
+ * @see GR712-UM v2.3 pp. 83
+ */
+
+void dsu_clear_force_enter_debug_mode(uint32_t cpu)
+{
+	uint16_t tmp;
+
+	struct dsu_mode_mask *dmm
+		= (struct dsu_mode_mask *) DSU_MODE_MASK;
+
+
+	tmp  = ioread16be(&dmm->enter_debug);
+	tmp &= ~(1 << cpu);
+	iowrite16be(tmp, &dmm->enter_debug);
+}
+
+
+/**
+ * @brief do not allow a processor to force other processors into debug mode
+ *
+ * @param cpu the cpu number
+ *
+ * @see GR712-UM v2.3 pp. 83
+ */
+
+void dsu_set_noforce_debug_mode(uint32_t cpu)
+{
+	uint16_t tmp;
+
+	struct dsu_mode_mask *dmm
+		= (struct dsu_mode_mask *) DSU_MODE_MASK;
+
+
+	tmp  = ioread16be(&dmm->debug_mode);
+	tmp |= (1 << cpu);
+	iowrite16be(tmp, &dmm->debug_mode);
+}
+
+
+/**
+ * @brief allow a processor to force other processors into debug mode
+ *
+ * @param cpu the cpu number
+ *
+ * @see GR712-UM v2.3 pp. 83
+ */
+
+void dsu_clear_noforce_debug_mode(uint32_t cpu)
+{
+	uint16_t tmp;
+
+	struct dsu_mode_mask *dmm
+		= (struct dsu_mode_mask *) DSU_MODE_MASK;
+
+
+	tmp  = ioread16be(&dmm->debug_mode);
+	tmp &= ~(1 << cpu);
+	iowrite16be(tmp, &dmm->debug_mode);
+}
+
+
+/**
+ * @brief force a processors into debug mode if Break on Watchpoint (BW) bit
+ *        in DSU control register is set
+ *
+ * @param cpu the cpu number
+ *
+ * @see GR712-UM v2.3 pp. 82
+ */
+
+void dsu_set_force_debug_on_watchpoint(uint32_t cpu)
+{
+	uint16_t tmp;
+
+	struct dsu_break_step *dbs
+		= (struct dsu_break_step *) DSU_BREAK_STEP;
+
+
+	tmp  = ioread16be(&dbs->break_now);
+	tmp |= (1 << cpu);
+	iowrite16be(tmp, &dbs->break_now);
+}
+
+
+/**
+ * @brief clear forcing debug mode if Break on
+ *	  Watchpoint (BW) bit in the DSU control register is set;
+ *	  resumes processor execution if in debug mode
+ *
+ * @param cpu the cpu number
+ *
+ * @see GR712-UM v2.3 pp. 83
+ */
+
+void dsu_clear_force_debug_on_watchpoint(uint32_t cpu)
+{
+	uint16_t tmp;
+
+	struct dsu_break_step *dbs
+		= (struct dsu_break_step *) DSU_BREAK_STEP;
+
+
+	tmp  = ioread16be(&dbs->break_now);
+	tmp &= ~(1 << cpu);
+	iowrite16be(tmp, &dbs->break_now);
+}
+
+
+/**
+ * @brief check if cpu is in error mode
+ *
+ * @param cpu the cpu number
+ * @return 1 if processor in error mode, else 0
+ *
+ * @see GR712-UM v2.3 pp. 82
+ */
+
+uint32_t dsu_cpu_in_error_mode(uint32_t cpu)
+{
+	return (dsu_get_dsu_ctrl(cpu) & DSU_CTRL_PE);
+}
+
+
+/**
+ * @brief clear debug and halt flag of processor
+ *
+ * @param cpu the cpu number
+ *
+ * @see GR712-UM v2.3 pp. 82
+ */
+
+void dsu_clear_cpu_error_mode(uint32_t cpu)
+{
+	dsu_clear_dsu_ctrl(cpu, DSU_CTRL_PE);
+}
+
+
+/**
+ * @brief check if cpu is in halt mode
+ *
+ * @param cpu the cpu number
+ *
+ * @return 1 if processor in halt mode, else 0
+ *
+ * @see GR712-UM v2.3 pp. 82
+ */
+
+uint32_t dsu_cpu_in_halt_mode(uint32_t cpu)
+{
+	return (dsu_get_dsu_ctrl(cpu) & DSU_CTRL_HL);
+}
+
+
+/**
+ * @brief  put cpu in halt mode
+ *
+ * @param cpu the cpu number
+ *
+ * @see GR712-UM v2.3 pp. 82
+ */
+
+void dsu_cpu_set_halt_mode(uint32_t cpu)
+{
+	dsu_set_dsu_ctrl(cpu, DSU_CTRL_HL);
+}
+
+
+/**
+ * @brief  enable debug mode on error
+ *
+ * @param cpu the cpu number
+ *
+ * @see GR712-UM v2.3 pp. 82
+ */
+
+void dsu_set_cpu_debug_on_error(uint32_t cpu)
+{
+	dsu_set_dsu_ctrl(cpu, DSU_CTRL_BE);
+}
+
+
+/**
+ * @brief  disable debug mode on error
+ *
+ * @param cpu the cpu number
+ *
+ * @see GR712-UM v2.3 pp. 82
+ */
+
+void dsu_clear_cpu_debug_on_error(uint32_t cpu)
+{
+	dsu_clear_dsu_ctrl(cpu, DSU_CTRL_BE);
+}
+
+
+/**
+ * @brief  enable debug mode on IU watchpoint
+ *
+ * @param cpu the cpu number
+ *
+ * @see GR712-UM v2.3 pp. 82
+ */
+
+void dsu_set_cpu_break_on_iu_watchpoint(uint32_t cpu)
+{
+	dsu_set_dsu_ctrl(cpu, DSU_CTRL_BW);
+}
+
+
+/**
+ * @brief  disable debug mode on IU watchpoint
+ *
+ * @param cpu the cpu number
+ *
+ * @see GR712-UM v2.3 pp. 82
+ */
+
+void dsu_clear_cpu_break_on_iu_watchpoint(uint32_t cpu)
+{
+	dsu_clear_dsu_ctrl(cpu, DSU_CTRL_BW);
+}
+
+
+/**
+ * @brief  enable debug mode on breakpoint instruction (ta 1)
+ *
+ * @param cpu the cpu number
+ *
+ * @see GR712-UM v2.3 pp. 82
+ */
+
+void dsu_set_cpu_break_on_breakpoint(uint32_t cpu)
+{
+	dsu_set_dsu_ctrl(cpu, DSU_CTRL_BS);
+}
+
+
+/**
+ * @brief  disable debug mode on breakpoint instruction
+ *
+ * @param cpu the cpu number
+ *
+ * @see GR712-UM v2.3 pp. 82
+ */
+
+void dsu_clear_cpu_break_on_breakpoint(uint32_t cpu)
+{
+	dsu_clear_dsu_ctrl(cpu, DSU_CTRL_BS);
+}
+
+
+/**
+ * @brief  enable debug mode on trap
+ *
+ * @param cpu the cpu number
+ *
+ * @see GR712-UM v2.3 pp. 82
+ */
+
+void dsu_set_cpu_break_on_trap(uint32_t cpu)
+{
+	dsu_set_dsu_ctrl(cpu, DSU_CTRL_BX);
+}
+
+
+/**
+ * @brief  disable debug mode on trap
+ *
+ * @param cpu the cpu number
+ *
+ * @see GR712-UM v2.3 pp. 82
+ */
+
+void dsu_clear_cpu_break_on_trap(uint32_t cpu)
+{
+	dsu_clear_dsu_ctrl(cpu, DSU_CTRL_BX);
+}
+
+
+/**
+ * @brief  enable debug mode on error trap (all except:
+ *         (priviledged_instruction, fpu_disabled, window_overflow,
+ *         window_underflow, asynchronous_interrupt, ticc_trap)
+ *
+ * @param cpu the cpu number
+ *
+ * @see GR712-UM v2.3 pp. 82
+ */
+
+void dsu_set_cpu_break_on_error_trap(uint32_t cpu)
+{
+	dsu_set_dsu_ctrl(cpu, DSU_CTRL_BZ);
+}
+
+
+/**
+ * @brief  disable debug mode on error trap (all except:
+ *         (priviledged_instruction, fpu_disabled, window_overflow,
+ *         window_underflow, asynchronous_interrupt, ticc_trap)
+ *
+ * @param cpu the cpu number
+ *
+ * @see GR712-UM v2.3 pp. 82
+ */
+
+void dsu_clear_cpu_break_on_error_trap(uint32_t cpu)
+{
+	dsu_clear_dsu_ctrl(cpu, DSU_CTRL_BZ);
+}
+
+/**
+ * @brief  get %y register of cpu
+ *
+ * @param cpu the cpu number
+ *
+ * @return contents of the %y register
+ */
+
+uint32_t dsu_get_reg_y(uint32_t cpu)
+{
+	return ioread32be((void *) (DSU_OFFSET_CPU(cpu) + DSU_REG_Y));
+}
+
+
+/**
+ * @brief  set %y register of cpu
+ *
+ * @param cpu the cpu number
+ * @param val the value to set
+ */
+
+void dsu_set_reg_y(uint32_t cpu, uint32_t val)
+{
+	iowrite32be(val, (void *) (DSU_OFFSET_CPU(cpu) + DSU_REG_Y));
+}
+
+
+/**
+ * @brief  get %psr register of cpu
+ *
+ * @param cpu the cpu number
+ *
+ * @return contents of the %psr register
+ */
+
+uint32_t dsu_get_reg_psr(uint32_t cpu)
+{
+	return ioread32be((void *) (DSU_OFFSET_CPU(cpu) + DSU_REG_PSR));
+}
+
+
+/**
+ * @brief  set %psr register of cpu
+ *
+ * @param cpu the cpu number
+ * @param val the value to set
+ */
+
+void dsu_set_reg_psr(uint32_t cpu, uint32_t val)
+{
+	iowrite32be(val, (void *) (DSU_OFFSET_CPU(cpu) + DSU_REG_PSR));
+}
+
+
+/**
+ * @brief  get %wim register of cpu
+ *
+ * @param cpu the cpu number
+ *
+ * @return contents of the %wim register
+ */
+
+uint32_t dsu_get_reg_wim(uint32_t cpu)
+{
+	return ioread32be((void *) (DSU_OFFSET_CPU(cpu) + DSU_REG_WIM));
+}
+
+
+/**
+ * @brief  set %wim register of cpu
+ *
+ * @param cpu the cpu number
+ * @param val the value to set
+ */
+
+void dsu_set_reg_wim(uint32_t cpu, uint32_t val)
+{
+	iowrite32be(val, (void *) (DSU_OFFSET_CPU(cpu) + DSU_REG_WIM));
+}
+
+
+/**
+ * @brief  get %tbr register of cpu
+ *
+ * @param cpu the cpu number
+ *
+ * @return contents of the %tbr register
+ */
+
+uint32_t dsu_get_reg_tbr(uint32_t cpu)
+{
+	return ioread32be((void *) (DSU_OFFSET_CPU(cpu) + DSU_REG_TBR));
+}
+
+
+/**
+ * @brief  set %tbr register of cpu
+ *
+ * @param cpu the cpu number
+ * @param val the value to set
+ */
+
+void dsu_set_reg_tbr(uint32_t cpu, uint32_t val)
+{
+	iowrite32be(val, (void *) (DSU_OFFSET_CPU(cpu) + DSU_REG_TBR));
+}
+
+
+/**
+ * @brief  get %pc register of cpu
+ *
+ * @param cpu the cpu number
+ *
+ * @return contents of the %pc register
+ */
+
+uint32_t dsu_get_reg_pc(uint32_t cpu)
+{
+	return ioread32be((void *) (DSU_OFFSET_CPU(cpu) + DSU_REG_PC));
+}
+
+
+/**
+ * @brief  set %npc register of cpu
+ *
+ * @param cpu the cpu number
+ * @param val the value to set
+ */
+
+void dsu_set_reg_pc(uint32_t cpu, uint32_t val)
+{
+	iowrite32be(val, (void *) (DSU_OFFSET_CPU(cpu) + DSU_REG_PC));
+}
+
+
+/**
+ * @brief  get %npc register of cpu
+ *
+ * @param cpu the cpu number
+ *
+ * @return contents of the %npc register
+ */
+
+uint32_t dsu_get_reg_npc(uint32_t cpu)
+{
+	return ioread32be((void *) (DSU_OFFSET_CPU(cpu) + DSU_REG_NPC));
+}
+
+
+/**
+ * @brief  set %npc register of cpu
+ *
+ * @param cpu the cpu number
+ * @param val the value to set
+ */
+
+void dsu_set_reg_npc(uint32_t cpu, uint32_t val)
+{
+	iowrite32be(val, (void *) (DSU_OFFSET_CPU(cpu) + DSU_REG_NPC));
+}
+
+
+/**
+ * @brief  get %fsr register of cpu
+ *
+ * @param cpu the cpu number
+ *
+ * @return contents of the %fsr register
+ */
+
+uint32_t dsu_get_reg_fsr(uint32_t cpu)
+{
+	return ioread32be((void *) (DSU_OFFSET_CPU(cpu) + DSU_REG_FSR));
+}
+
+
+/**
+ * @brief  set %fsr register of cpu
+ *
+ * @param cpu the cpu number
+ * @param val the value to set
+ */
+
+void dsu_set_reg_fsr(uint32_t cpu, uint32_t val)
+{
+	iowrite32be(val, (void *) (DSU_OFFSET_CPU(cpu) + DSU_REG_FSR));
+}
+
+
+/**
+ * @brief  get %cpsr register of cpu
+ *
+ * @param cpu the cpu number
+ *
+ * @return contents of the %cpsr register
+ */
+
+uint32_t dsu_get_reg_cpsr(uint32_t cpu)
+{
+	return ioread32be((void *) (DSU_OFFSET_CPU(cpu) + DSU_REG_CPSR));
+}
+
+/**
+ * @brief  set %cpsr register of cpu
+ *
+ * @param cpu the cpu number
+ * @param val the value to set
+ */
+
+void dsu_set_reg_cpsr(uint32_t cpu, uint32_t val)
+{
+	iowrite32be(val, (void *) (DSU_OFFSET_CPU(cpu) + DSU_REG_CPSR));
+}
+
+/**
+ * @brief  set stack pointer register (%o6) in a window of a cpu
+ *
+ * @param cpu the cpu number
+ * @param cwp the window number
+ * @param val the value to set
+ */
+
+void dsu_set_reg_sp(uint32_t cpu, uint32_t cwp, uint32_t val)
+{
+	uint32_t reg;
+
+	reg = dsu_get_output_reg_addr(cpu, 6, cwp);
+
+	if (reg)
+		iowrite32be(val, (void *) reg);
+}
+
+
+/**
+ * @brief  get stack pointer register (%o6) in a window of a cpu
+ *
+ * @param cpu the cpu number
+ * @param cwp the window number
+ * @return the value of the stack pointer register or 0 if window/cpu is invalid
+ */
+
+uint32_t dsu_get_reg_sp(uint32_t cpu, uint32_t cwp)
+{
+	uint32_t reg;
+
+	reg = dsu_get_output_reg_addr(cpu, 6, cwp);
+
+	if (reg)
+		return ioread32be((void *) reg);
+	else
+		return 0;
+}
+
+
+/**
+ * @brief  set frame pointer register (%i6) in a window of a cpu
+ *
+ * @param cpu the cpu number
+ * @param cwp the window number
+ * @param val the value to set
+ */
+
+void dsu_set_reg_fp(uint32_t cpu, uint32_t cwp, uint32_t val)
+{
+	uint32_t reg;
+
+	reg = dsu_get_input_reg_addr(cpu, 6, cwp);
+
+	if (reg)
+		iowrite32be(val, (void *) reg);
+}
diff --git a/IBSW/lib/memcfg.c b/IBSW/lib/memcfg.c
new file mode 100644
index 0000000..23e04d6
--- /dev/null
+++ b/IBSW/lib/memcfg.c
@@ -0,0 +1,653 @@
+/**
+ * @file   memcfg.c
+ * @ingroup memcfg
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at)
+ * @date   March, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @defgroup memcfg Memory Configuration Register access
+ *
+ * @brief Implements memory configuration register access functions for the
+ *        GR712RC
+ *
+ * ## Overview
+ *
+ * This module implements functionality to access or modify the memory
+ * configuration registers of the GR712RC.
+ *
+ * In addition, it provides functions to perform EDAC bypass reads and writes
+ * for fault injection.
+ *
+ * @see GR712-UM v2.7 5.14.1 - 5.14.4
+ *
+ * ## Mode of Operation
+ *
+ * None
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ * ## Notes
+ *
+ * - functionality will be added as needed
+ * - does not provide support for the FTAHB memory configuration register!
+ *
+ */
+
+
+#include <io.h>
+#include <memcfg.h>
+#include <leon/leon_reg.h>
+
+
+/**
+ * @brief set bits in the memory configuration register 1 by mask
+ *
+ * @param mask the bitmask to apply
+ */
+
+static void memcfg_set_mcfg1(uint32_t mask)
+{
+	uint32_t tmp;
+
+	struct leon3_ftmctrl_registermap *memctrl =
+		(struct leon3_ftmctrl_registermap *) LEON3_BASE_ADDRESS_FTMCTRL;
+
+	tmp  = ioread32be(&memctrl->mcfg1);
+	tmp |= mask;
+	iowrite32be(tmp, &memctrl->mcfg1);
+
+}
+
+
+/**
+ * @brief get bits in the memory configuration register 1 by mask
+ *
+ * @param mask the bitmask to apply
+ */
+__attribute__((unused))
+static uint32_t memcfg_get_mcfg1(uint32_t mask)
+{
+	struct leon3_ftmctrl_registermap const *memctrl =
+		(struct leon3_ftmctrl_registermap *) LEON3_BASE_ADDRESS_FTMCTRL;
+
+	return ioread32be(&memctrl->mcfg1) & mask;
+}
+
+
+/**
+ * @brief clear bits in the memory configuration register 1 by mask
+ *
+ * @param mask the bitmask to apply (bits to clear are HIGH!)
+ */
+
+static void memcfg_clear_mcfg1(uint32_t mask)
+{
+	uint32_t tmp;
+
+	struct leon3_ftmctrl_registermap *memctrl =
+		(struct leon3_ftmctrl_registermap *) LEON3_BASE_ADDRESS_FTMCTRL;
+
+	tmp  = ioread32be(&memctrl->mcfg1);
+	tmp &= ~mask;
+	iowrite32be(tmp, &memctrl->mcfg1);
+
+}
+
+
+/**
+ * @brief replace bits in the memory configuration register 1 by mask
+ *
+ * @param bits the bits to set
+ * @param mask the bitmask used to clear the field
+ */
+
+static void memcfg_replace_mcfg1(uint32_t bits, uint32_t mask)
+{
+	uint32_t tmp;
+
+	struct leon3_ftmctrl_registermap *memctrl =
+		(struct leon3_ftmctrl_registermap *) LEON3_BASE_ADDRESS_FTMCTRL;
+
+	tmp  = ioread32be(&memctrl->mcfg1);
+	tmp &= ~mask;
+	tmp |= bits;
+	iowrite32be(tmp, &memctrl->mcfg1);
+
+}
+
+
+/**
+ * @brief set bits in the memory configuration register 2 by mask
+ *
+ * @param mask the bitmask to apply
+ */
+
+static void memcfg_set_mcfg2(uint32_t mask)
+{
+	uint32_t tmp;
+
+	struct leon3_ftmctrl_registermap *memctrl =
+		(struct leon3_ftmctrl_registermap *) LEON3_BASE_ADDRESS_FTMCTRL;
+
+	tmp  = ioread32be(&memctrl->mcfg2);
+	tmp |= mask;
+	iowrite32be(tmp, &memctrl->mcfg2);
+
+}
+
+
+/**
+ * @brief get bits in the memory configuration register 2 by mask
+ *
+ * @param mask the bitmask to apply
+ */
+
+__attribute__((unused))
+static uint32_t memcfg_get_mcfg2(uint32_t mask)
+{
+	struct leon3_ftmctrl_registermap const *memctrl =
+		(struct leon3_ftmctrl_registermap *) LEON3_BASE_ADDRESS_FTMCTRL;
+
+	return ioread32be(&memctrl->mcfg2) & mask;
+}
+
+
+/**
+ * @brief clear bits in the memory configuration register 2 by mask
+ *
+ * @param mask the bitmask to apply (bits to clear are HIGH!)
+ */
+
+static void memcfg_clear_mcfg2(uint32_t mask)
+{
+	uint32_t tmp;
+
+	struct leon3_ftmctrl_registermap *memctrl =
+		(struct leon3_ftmctrl_registermap *) LEON3_BASE_ADDRESS_FTMCTRL;
+
+	tmp  = ioread32be(&memctrl->mcfg2);
+	tmp &= ~mask;
+	iowrite32be(tmp, &memctrl->mcfg2);
+
+}
+
+
+/**
+ * @brief replace bits in the memory configuration register 2 by mask
+ *
+ * @param bits the bits to set
+ * @param mask the bitmask used to clear the field
+ */
+
+static void memcfg_replace_mcfg2(uint32_t bits, uint32_t mask)
+{
+	uint32_t tmp;
+
+	struct leon3_ftmctrl_registermap *memctrl =
+		(struct leon3_ftmctrl_registermap *) LEON3_BASE_ADDRESS_FTMCTRL;
+
+	tmp  = ioread32be(&memctrl->mcfg2);
+	tmp &= ~mask;
+	tmp |= bits;
+	iowrite32be(tmp, &memctrl->mcfg2);
+
+}
+
+/**
+ * @brief set bits in the memory configuration register 3 by mask
+ *
+ * @param mask the bitmask to apply
+ */
+
+static void memcfg_set_mcfg3(uint32_t mask)
+{
+	uint32_t tmp;
+
+	struct leon3_ftmctrl_registermap *memctrl =
+		(struct leon3_ftmctrl_registermap *) LEON3_BASE_ADDRESS_FTMCTRL;
+
+	tmp  = ioread32be(&memctrl->mcfg3);
+	tmp |= mask;
+	iowrite32be(tmp, &memctrl->mcfg3);
+
+}
+
+
+/**
+ * @brief get bits in the memory configuration register 3 by mask
+ *
+ * @param mask the bitmask to apply
+ */
+
+static uint32_t memcfg_get_mcfg3(uint32_t mask)
+{
+	struct leon3_ftmctrl_registermap const *memctrl =
+		(struct leon3_ftmctrl_registermap *) LEON3_BASE_ADDRESS_FTMCTRL;
+
+	return ioread32be(&memctrl->mcfg3) & mask;
+}
+
+
+/**
+ * @brief clear bits in the memory configuration register 3 by mask
+ *
+ * @param mask the bitmask to apply (bits to clear are HIGH!)
+ */
+
+static void memcfg_clear_mcfg3(uint32_t mask)
+{
+	uint32_t tmp;
+
+	struct leon3_ftmctrl_registermap *memctrl =
+		(struct leon3_ftmctrl_registermap *) LEON3_BASE_ADDRESS_FTMCTRL;
+
+	tmp  = ioread32be(&memctrl->mcfg3);
+	tmp &= ~mask;
+	iowrite32be(tmp, &memctrl->mcfg3);
+
+}
+
+/**
+ * @brief set edac  test checkbits
+ *
+ * @param tcb the checkbits to set
+ */
+
+static void memcfg_set_checkbits(uint8_t tcb)
+{
+	memcfg_clear_mcfg3(MCFG3_TCB);
+	memcfg_set_mcfg3(((uint32_t) tcb) & MCFG3_TCB);
+}
+
+
+/**
+ * @brief get edac test checkbits
+ *
+ * @return the test checkbits
+ */
+
+static uint8_t memcfg_get_checkbits(void)
+{
+	return (uint8_t) memcfg_get_mcfg3(MCFG3_TCB);
+}
+
+
+
+/**
+ * @brief enable the prom edac
+ */
+
+void memcfg_enable_prom_edac(void)
+{
+	memcfg_set_mcfg3(MCFG3_PROM_EDAC);
+}
+
+
+/**
+ * @brief disable the prom edac
+ */
+
+void memcfg_disable_prom_edac(void)
+{
+	memcfg_clear_mcfg3(MCFG3_PROM_EDAC);
+}
+
+
+/**
+ * @brief enable the ram edac
+ */
+
+void memcfg_enable_ram_edac(void)
+{
+	memcfg_set_mcfg3(MCFG3_RAM_EDAC);
+}
+
+
+/**
+ * @brief disable the ram edac
+ */
+
+void memcfg_disable_ram_edac(void)
+{
+	memcfg_clear_mcfg3(MCFG3_RAM_EDAC);
+}
+
+
+/**
+ * @brief enable edac ram bypass read
+ */
+
+void memcfg_enable_edac_read_bypass(void)
+{
+	memcfg_set_mcfg3(MCFG3_RB_EDAC);
+}
+
+
+/**
+ * @brief disable edac ram bypass read
+ */
+
+void memcfg_disable_edac_read_bypass(void)
+{
+	memcfg_clear_mcfg3(MCFG3_RB_EDAC);
+}
+
+
+/**
+ * @brief enable edac ram bypass write
+ */
+
+void memcfg_enable_edac_write_bypass(void)
+{
+	memcfg_set_mcfg3(MCFG3_WB_EDAC);
+}
+
+
+/**
+ * @brief disable edac ram bypass write
+ */
+
+void memcfg_disable_edac_write_bypass(void)
+{
+	memcfg_clear_mcfg3(MCFG3_WB_EDAC);
+}
+
+
+/**
+ * @brief perform a bypass read and retrieve the checkbits
+ *
+ * @param addr the address pointer to read from
+ * @param tcb checkbits storage
+ *
+ * @return data word at address
+ */
+
+uint32_t memcfg_bypass_read(void *addr, uint8_t *tcb)
+{
+	uint32_t val;
+
+	memcfg_enable_edac_read_bypass();
+	val = ioread32be(addr);
+	(*tcb) = memcfg_get_checkbits();
+	memcfg_disable_edac_read_bypass();
+
+	return val;
+}
+
+
+/**
+ * @brief set custom checkbits and perform a bypass write
+ *
+ * @param addr the address pointer to write to
+ * @param value the data word to write
+ * @param tcb the checkbits to set
+ *
+ */
+
+void memcfg_bypass_write(void *addr, uint32_t value, uint8_t tcb)
+{
+	memcfg_enable_edac_write_bypass();
+	memcfg_set_checkbits(tcb);
+	iowrite32be(value, addr);
+	memcfg_disable_edac_write_bypass();
+}
+
+
+/**
+ * @brief disable bus ready signalling for the prom area
+ */
+
+void memcfg_clear_prom_area_bus_ready(void)
+{
+	memcfg_clear_mcfg1(MCFG1_PBRDY);
+}
+
+
+/**
+ * @brief disable asynchronous bus ready
+ */
+
+void memcfg_clear_asynchronous_bus_ready(void)
+{
+	memcfg_clear_mcfg1(MCFG1_ABRDY);
+}
+
+
+/**
+ * @brief set IO bus width
+ *
+ * @note 0 (00) = 8 bits, 2 (01) = 32 bits
+ */
+
+void memcfg_set_io_bus_width(uint32_t bus_width)
+{
+	memcfg_replace_mcfg1((bus_width << MCFG1_IOBUSW_OFF)
+			     & MCFG1_IOBUSW_MASK,
+			     MCFG1_IOBUSW_MASK);
+}
+
+
+/**
+ * @brief disable bus ready signalling for IO area
+ */
+
+void memcfg_clear_io_bus_ready(void)
+{
+	memcfg_clear_mcfg1(MCFG1_IBRDY);
+}
+
+
+/**
+ * @brief disable bus error signalling
+ */
+
+void memcfg_clear_bus_error(void)
+{
+	memcfg_clear_mcfg1(MCFG1_BEXCN);
+}
+
+
+/**
+ * @brief set IO waitstates
+ *
+ * @note 0000 = 0, 0001 = 1,  0010 = 2,..., 1111 = 15
+ */
+
+void memcfg_set_io_waitstates(uint32_t wait_states)
+{
+	memcfg_replace_mcfg1((wait_states << MCFG1_IO_WAITSTATES_OFF)
+			     & MCFG1_IO_WAITSTATES_MASK,
+			     MCFG1_IO_WAITSTATES_MASK);
+
+}
+
+
+/**
+ * @brief enable access to memory IO bus area
+ */
+
+void memcfg_set_io(void)
+{
+	memcfg_set_mcfg1(MCFG1_IOEN);
+}
+
+
+/**
+ * @brief set PROM bank size
+ *
+ * @note 0000 = 256 MiB, all others: bank_size = lg2(kilobytes / 8)
+ */
+
+void memcfg_set_prom_bank_size(uint32_t bank_size)
+{
+	memcfg_replace_mcfg1((bank_size << MCFG1_ROMBANKSZ_OFF)
+			     & MCFG1_ROMBANKSZ_MASK,
+			     MCFG1_ROMBANKSZ_MASK);
+}
+
+
+/**
+ * @brief enable prom write cycles
+ */
+
+void memcfg_set_prom_write(void)
+{
+	memcfg_set_mcfg1(MCFG1_PWEN);
+}
+
+
+
+/**
+ * @brief set PROM data bus width
+ *
+ * @note 0 (00) = 8 bits, 2 (01) = 32 bits
+ */
+
+void memcfg_set_prom_width(uint32_t prom_width)
+{
+	memcfg_replace_mcfg1((prom_width << MCFG1_PROM_WIDTH_OFF)
+			     & MCFG1_PROM_WIDTH_MASK,
+			     MCFG1_PROM_WIDTH_MASK);
+}
+
+
+/**
+ * @brief set PROM write waitstates
+ *
+ * @note 0000 = 0, 0001 = 2, 0010 = 4,..., 1111 = 30
+ */
+
+void memcfg_set_prom_write_waitstates(uint32_t wait_states)
+{
+	memcfg_replace_mcfg1((wait_states << MCFG1_PROM_WRITE_WS_OFF)
+			     & MCFG1_PROM_WRITE_WS_MASK,
+			     MCFG1_PROM_WRITE_WS_MASK);
+}
+
+/**
+ * @brief set PROM read waitstates
+ *
+ * @note 0000 = 0, 0001 = 2, 0010 = 4,..., 1111 = 30
+ */
+
+void memcfg_set_prom_read_waitstates(uint32_t wait_states)
+{
+	memcfg_replace_mcfg1(wait_states & MCFG1_PROM_READ_WS_MASK,
+			     MCFG1_PROM_READ_WS_MASK);
+}
+
+
+/**
+ * @brief disable SDRAM controller
+ */
+
+void memcfg_clear_sdram_enable(void)
+{
+	memcfg_clear_mcfg2(MCFG2_SE);
+}
+
+
+/**
+ * @brief enable SRAM
+ */
+
+void memcfg_clear_sram_disable(void)
+{
+	memcfg_clear_mcfg2(MCFG2_SI);
+}
+
+
+/**
+ * @brief set RAM bank size
+ *
+ * @note bank_size = lg2(kilobytes / 8)
+ */
+
+void memcfg_set_ram_bank_size(uint32_t bank_size)
+{
+	memcfg_replace_mcfg2((bank_size << MCFG2_RAM_BANK_SIZE_OFF)
+			     & MCFG2_RAM_BANK_SIZE_MASK,
+			     MCFG2_RAM_BANK_SIZE_MASK);
+}
+
+
+/**
+ * @brief enable read-modify-write cycles
+ */
+
+void memcfg_set_read_modify_write(void)
+{
+	memcfg_set_mcfg2(MCFG2_RMW);
+}
+
+
+/**
+ * @brief set RAM width
+ *
+ * @note 00 = 8 bits, 1X = 32 bits
+ */
+
+void memcfg_set_ram_width(uint32_t ram_width)
+{
+	memcfg_replace_mcfg2((ram_width << MCFG2_RAM_WIDTH_OFF)
+			     & MCFG2_RAM_WIDTH_MASK,
+			     MCFG2_RAM_WIDTH_MASK);
+}
+
+
+
+/**
+ * @brief set RAM write waitstates
+ *
+ * @note 00 = 0, 01 = 1, 10 = 2, 11 = 3
+ */
+
+void memcfg_set_ram_write_waitstates(uint32_t wait_states)
+{
+	memcfg_replace_mcfg2((wait_states << MCFG2_RAM_WRITE_WS_OFF)
+			     & MCFG2_RAM_WRITE_WS_MASK,
+			     MCFG2_RAM_WRITE_WS_MASK);
+}
+
+/**
+ * @brief set RAM read waitstates
+ *
+ * @note 00 = 0, 01 = 1, 10 = 2, 11 = 3
+ */
+
+void memcfg_set_ram_read_waitstates(uint32_t wait_states)
+{
+	memcfg_replace_mcfg2(wait_states & MCFG2_RAM_READ_WS_MASK,
+			     MCFG2_RAM_READ_WS_MASK);
+}
+
+
+/**
+ * @brief enable flash and ram access for use with IASW/IBSW
+ * @note does NOT change settings in the FPGA!
+ */
+
+void memcfg_configure_sram_flash_access(void)
+{
+	struct leon3_ftmctrl_registermap *memctrl =
+	  (struct leon3_ftmctrl_registermap *) LEON3_BASE_ADDRESS_FTMCTRL;	
+
+	/* NOTE: setting the bits individually does not work,
+	   because some depend on others */
+	
+	iowrite32be(MEMCFG1_FLASH, &memctrl->mcfg1);
+	iowrite32be(MEMCFG2_SRAM, &memctrl->mcfg2);
+	iowrite32be(MEMCFG3_SRAM, &memctrl->mcfg3);
+}
+
diff --git a/IBSW/lib/memscrub.c b/IBSW/lib/memscrub.c
new file mode 100644
index 0000000..9a5bc58
--- /dev/null
+++ b/IBSW/lib/memscrub.c
@@ -0,0 +1,282 @@
+/**
+ * @file   memscrub.c
+ * @ingroup memscrub
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at)
+ * @date   March, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @defgroup memscrub Memory Scrubbing
+ * @brief Implements memory scrubbing and repair of single-bit errors
+ *
+ * ## Overview
+ *
+ * This module provides functionality for memory scrubbing cycles, correctable
+ * error logging and memory repair.
+ * Note that only correctable errors are recorded and repaired, uncorrectable
+ * errors are reported via the @ref edac module
+ *
+ * ## Mode of Operation
+ *
+ * During each activation, starting from a specified address, a number of memory
+ * locations are read by forced data cache bypass in CPU-word sized (32 bit)
+ * increments. After each read, the AHB status register is inspected for single
+ * bit errors. If an error was raised and the registered failing address
+ * corresponds to the read address, it is logged for deferred memory repair.
+ *
+ * The user can call the repair function at any time. It masks interrupts and
+ * performs cache-bypassing read-write operations on the logged addresses.
+ *
+ * @startuml {memory_scrubbing.svg} "Memory Scrubbing process" width = 10
+ *
+ * start
+ *
+ * repeat
+ *	: read memory;
+ *	: inspect AHB status;
+ *	if (SBIT error) then (yes)
+ *		if (address matches) then (yes)
+ *			: log error;
+ *		endif
+ *	endif
+ * repeat while (done?)
+ *
+ * : mask interrrupts;
+ *
+ * while (logged error)
+ *	: read memory;
+ *	: write memory;
+ * endwhile
+ *
+ * : unmask interrrupts;
+ *
+ * stop
+ *
+ * @enduml
+ *
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ *
+ * ## Notes
+ *
+ * - There is no internal discrimination regarding repair of memory locations.
+ *   Basically, a re-write is attempted for every single bit error detected.
+ *
+ * - To protect the system from unwanted re-writes by the repair function, any
+ *   non-matching addresses expressing single-bit errors during scrubbing runs
+ *   are rejected. This ensures that only memory ranges requested by the user
+ *   will be re-written once the repair function is called.
+ *
+ * - If the memory error log is at capacity, no new errors will be added.
+ *
+ * - Irq masking is used to protect the re-write repair cycle within the
+ *   bounds of the CPU, as there is no 32bit compare-and-swap atomic in the
+ *   SPARC v8 instrution set. Be warned that it is not safe from memory
+ *   interaction from (the) other CPU(s) for the same reason. If necessary,
+ *   guards could be inserted to force other CPUs to pause execution via a
+ *   dedicated synchronisation mechanism. In any case, this can never be safe
+ *   from DMA unless all IP cores are deactivated.
+ *
+ * @example demo_memscrub.c
+ */
+
+#include <event_report.h>
+#include <io.h>
+#include <ahb.h>
+#include <list.h>
+#include <compiler.h>
+#include <spinlock.h>
+
+#define MEMSCRUB_LOG_ENTRIES	10
+
+struct memscrub_log_entry {
+	uint32_t fail_addr;
+	struct list_head node;
+};
+
+static struct memscrub_log_entry memscrub_log_entries[MEMSCRUB_LOG_ENTRIES];
+
+static struct list_head	memscrub_log_used;
+static struct list_head memscrub_log_free;
+
+
+
+/**
+ * @brief add an entry to the error log
+ *
+ * @param fail_addr the address of the single-bit error
+ *
+ * @note If no more free slots are available, the request will be ignored and
+ *       the address will not be registered until another pass is made
+ */
+
+static void memscrub_add_log_entry(uint32_t fail_addr)
+{
+	struct memscrub_log_entry *p_elem;
+
+
+	if (list_filled(&memscrub_log_free)) {
+
+		p_elem = list_entry((&memscrub_log_free)->next,
+				    struct memscrub_log_entry, node);
+
+		list_move_tail(&p_elem->node, &memscrub_log_used);
+		p_elem->fail_addr = fail_addr;
+	}
+}
+
+
+/**
+ * @brief check the AHB status register for new single bit errors
+ *
+ * @return  0 if no error,
+ *	    1 if error,
+ *	   -1 if error address does not match reference
+ */
+
+static int32_t memscrub_inspect_ahb_status(uint32_t addr)
+{
+	uint32_t fail_addr;
+
+
+	if (ahbstat_new_error()) {
+
+		fail_addr = ahbstat_get_failing_addr();
+
+		ahbstat_clear_new_error();
+
+		if (addr == fail_addr)
+			memscrub_add_log_entry(fail_addr);
+
+		else
+			return -1;
+
+		return 1;
+	}
+
+	return 0;
+}
+
+
+/**
+ * @brief retrieve number of entries in the edac error log
+ *
+ * @return number of registered single-bit errors in the log
+ */
+
+uint32_t memscrub_get_num_log_entries(void)
+{
+	uint32_t entries = 0;
+
+	struct memscrub_log_entry *p_elem;
+	struct memscrub_log_entry *p_tmp;
+
+	list_for_each_entry_safe(p_elem, p_tmp, &memscrub_log_used, node)
+		entries++;
+
+	return entries;
+}
+
+
+/**
+ * @brief retrieve number of entries in the edac error log
+ *
+ * @return number of addresses repaired
+ */
+
+uint32_t memscrub_repair(void)
+{
+	uint32_t psr;
+	uint32_t tmp;
+	uint32_t corr = 0;
+
+	struct memscrub_log_entry *p_elem;
+	struct memscrub_log_entry *p_tmp;
+
+
+	list_for_each_entry_safe(p_elem, p_tmp, &memscrub_log_used, node) {
+
+		psr = spin_lock_save_irq();
+		tmp = ioread32be((void *) p_elem->fail_addr);
+		iowrite32be(tmp, (void *) p_elem->fail_addr);
+		spin_lock_restore_irq(psr);
+
+		event_report(EDAC, LOW, p_elem->fail_addr);
+		list_move_tail(&p_elem->node, &memscrub_log_free);
+
+
+		corr++;
+	}
+
+	ahbstat_clear_new_error();
+
+	return corr;
+}
+
+
+
+/**
+ * @brief memory scrubbing of a range addr[0] ... addr[n] at a time
+ *
+ * Identified single-bit errors are stored in log for repair at a later time.
+ *
+ * @param addr the address pointer to start scrubbing from
+ * @param n    the number of data words to scrub on top of starting address
+ *
+ * @return the next unscrubbed address
+ *
+ * @note
+ *	- this function will never encounter a double bit error, since these
+ *	  must be handled via data_access_exception trap (0x9) for CPU errors
+ *	  and the AHB IRQ for all other AHB masters
+ *	- the user is responsible to supply a valid address, range and proper
+ *	  alignment
+ *	- this function will always access at least one address
+ */
+
+uint32_t *memscrub(uint32_t *addr, uint32_t n)
+{
+	uint32_t *stop = addr + n;
+
+
+	ahbstat_clear_new_error();
+
+	for ( ; addr < stop; addr++) {
+		ioread32be(addr);
+		memscrub_inspect_ahb_status((uint32_t) addr);
+	}
+
+	return stop;
+}
+
+
+/**
+ * @brief initialise the edac error log
+ *
+ * @note calling this function repeatedly will reset the log
+ */
+
+void memscrub_init(void)
+{
+	uint32_t i;
+
+
+	INIT_LIST_HEAD(&memscrub_log_used);
+	INIT_LIST_HEAD(&memscrub_log_free);
+
+
+	for (i = 0; i < ARRAY_SIZE(memscrub_log_entries); i++)
+		list_add_tail(&memscrub_log_entries[i].node,
+			      &memscrub_log_free);
+}
diff --git a/IBSW/lib/packet_tracker.c b/IBSW/lib/packet_tracker.c
new file mode 100644
index 0000000..8f78e24
--- /dev/null
+++ b/IBSW/lib/packet_tracker.c
@@ -0,0 +1,370 @@
+/**
+ * @file   packet_tracker.c
+ * @ingroup packet_tracker
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   July, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ *
+ *
+ *
+ * @defgroup packet_tracker PUS packet container
+ *
+ * @brief a container for PUS packets implemented on top of the circular buffer
+ *        interface
+ *
+ * ## Overview
+ *
+ * This is a container for packets in PUS format. It uses the regular circular
+ * buffers implementations to hold packet data in a @ref circular_buffer8 and
+ * tracks the corresponding packet sizes of the chunks in the packet data buffer
+ * in a @ref circular_buffer16.
+ *
+ * ## Mode of Operation
+ *
+ * ### Buffer Model
+ *
+ * This packet buffer is implemented using 2 circular buffers:
+ * one to hold the actual packet data (__Packet__, __[P]__), one to hold the
+ * size of the next packet (__Size__, __[S]__).
+ *
+ * The problem of synchronicity is solved the same way as in @ref cpus_buffer,
+ * by writing [S] only after [P] has been written and reading only after [S]
+ * appears to the reader.
+ *
+ * @startuml "[S] is a metabuffer \"containing\" [P]" width=5
+ * node "[S]" {
+ *	node "[P]" {
+ *	}
+ * }
+ * @enduml
+ *
+ *
+ * The packet exchange sequence follows a similar logic as in @ref cpus_buffer,
+ * but does not use a validity buffer.
+ *
+ * @startuml{packet_tracker_exchange.svg} "Example: packet exchange" width=10
+ *	participant Writer
+ *	database Packet
+ *	database Size
+ *	participant Reader
+ *	control "No Action"
+ *
+ *	Writer -> Packet	: put packet
+ *	activate Packet
+ *
+ *	Reader      <-- Size	: get packet size
+ *	"No Action" <-- Reader  : empty
+ *
+ *	Packet -> Size		: put size
+ *	activate Size
+ *
+ *	Reader   <-- Size	: get packet size
+ *	Size     <-  Reader	: pop size
+ *	Reader   --> Packet	: fetch packet
+ *	Packet   ->  Reader	: pop packet
+ * @enduml
+ *
+ *
+ * ## Notes
+ *
+ * As with the @ref cpus_buffer, a better performing version can be made by
+ * implementing a circular buffer that holds information of the following data
+ * block in a custom header per entry.
+ *
+ * If these buffers need to be accessible from multiple readers/writers,
+ * locks must be implement to ensure atomicity.
+ *
+ */
+
+
+#include <compiler.h>
+#include <errors.h>
+#include <packet_tracker.h>
+
+#include <stdlib.h>
+
+
+
+/**
+ * @brief	sets up circular buffers to track pus packets
+ * @param	p_pkt a struct packet_tracker
+ * @param	p_buffer_pkts a pointer to a memory pool that will hold the
+ *		pus packets
+ * @param	p_buffer_size a pointer to a memory pool that will hold the
+ *		sizes of the pus packets
+ * @note	the size buffer must be able to hold at least
+ *		size(pkts_buf)/12 elements
+ */
+
+void ptrack_init(struct packet_tracker *p_pkt,
+		 uint8_t *p_buf_pkts,  uint32_t pkts_elem,
+		 uint16_t *p_buf_size, uint32_t size_elem)
+{
+	cbuf_init8(&(p_pkt->pus_pkts),  p_buf_pkts, pkts_elem);
+	cbuf_init16(&(p_pkt->pus_size), p_buf_size, size_elem);
+}
+
+
+/**
+ * @brief resets the packet tracker circular buffers
+ * @param p_pkt a struct packet_tracker
+ */
+
+void ptrack_reset(struct packet_tracker *p_pkt)
+{
+	cbuf_reset8(&(p_pkt->pus_pkts));
+	cbuf_reset16(&(p_pkt->pus_size));
+}
+
+
+/**
+ * @brief	gets the src/dest id field of the next packet
+ * @param	packet_buffer a buffer holding packet data
+ *
+ * @returns	packet src id
+ * @note	the packet_buffer must be of appropriate size, buffer and packet
+ *		validity are not checked
+ */
+
+inline uint8_t ptrack_get_next_pkt_src_id(uint8_t *packet_buffer)
+{
+	return packet_buffer[PUS_SRC_ID_OFFSET];
+}
+
+
+/**
+ * @brief	gets the size of the next pus data field in the buffer
+ * @param	packet_buffer a buffer holding packet data
+ *
+ * @returs	data field size
+ * @note	the packet_buffer must be of appropriate size, buffer and packet
+ *		validity are not checked
+ */
+
+static uint16_t ptrack_get_pus_data_size(uint8_t *packet_buffer)
+{
+	uint16_t pkt_size_hi, pkt_size_lo, pkt_size;
+
+	pkt_size_hi  = (uint16_t) packet_buffer[PUS_LEN_HI_OFFSET];
+	pkt_size_hi &= PUS_LEN_HI_MASK;
+
+	pkt_size_lo   = (uint16_t) packet_buffer[PUS_LEN_LO_OFFSET];
+	pkt_size_lo <<= PUS_LEN_LO_LSHIFT;
+
+	pkt_size = (pkt_size_hi | pkt_size_lo);
+
+	if (pkt_size)
+		pkt_size = PTRACK_PUS_DATA_LENGTH_ADJUST(pkt_size);
+
+	return pkt_size;
+}
+
+
+/**
+ * @brief	gets the size of the next packet in the buffer
+ * @param	packet_buffer a buffer holding packet data
+ *
+ * @returns	total size of pus packet
+ * @note	the packet_buffer must be of appropriate size, buffer and packet
+ *		validity are not checked
+ */
+
+uint16_t ptrack_get_pkt_size(uint8_t *packet_buffer)
+{
+	uint16_t pkt_len;
+
+	pkt_len  = ptrack_get_pus_data_size(packet_buffer);
+	pkt_len += PTRACK_PUS_TMTC_HEADER_BYTES;
+
+	return pkt_len;
+}
+
+
+/**
+ * @brief	adds single packet to the circular buffers
+ * @param	p_pkt a struct packet_tracker
+ * @param	packet_buffer a buffer holding packet data
+ * @param	packet_buffer_size the size of data in packet_buffer in bytes
+ *
+ * @returns	bytes extracted from the buffer or -1 on error
+ */
+
+int32_t ptrack_add_single_pkt(struct packet_tracker *p_pkt,
+			      uint8_t *packet_buffer,
+			      uint32_t packet_buffer_size)
+{
+	uint16_t pkt_len;
+	uint32_t ret;
+
+	if (p_pkt == NULL) {
+		errno = E_PTRACK_INVALID;
+		return -1;
+	}
+
+	ret = cbuf_get_free8(&(p_pkt->pus_pkts));
+	if (ret < packet_buffer_size) {
+		errno = E_PTRACK_PKT_SIZE_LIMIT;
+		return -1;
+	}
+
+	pkt_len = ptrack_get_pkt_size(packet_buffer);
+
+	ret = cbuf_write8(&(p_pkt->pus_pkts), packet_buffer, pkt_len);
+	if (ret != pkt_len) {
+		errno = E_PTRACK_PKT_WRITE;
+		return -1;
+	}
+
+	ret = cbuf_write16(&(p_pkt->pus_size), &pkt_len, 1);
+	if (!ret) {
+		errno = E_PTRACK_SIZE_WRITE;
+		return -1;
+	}
+
+	return pkt_len;
+}
+
+
+/**
+ * @brief	adds multiple packets to the circular buffers
+ * @param	p_pkt a struct packet_tracker
+ * @param	packet_buffer a buffer holding packet data
+ * @param	packet_buffer_size the size of data in packet_buffer in bytes
+ *
+ * @returns	bytes extracted from the buffer or -1 on error
+ */
+
+int32_t ptrack_add_multiple_pkts(struct packet_tracker *p_pkt,
+				 uint8_t *packet_buffer,
+				 uint32_t packet_buffer_size)
+{
+	uint16_t pkt_len;
+	uint32_t ret;
+
+	int32_t i = 0;
+
+
+	if (p_pkt == NULL) {
+		errno = E_PTRACK_INVALID;
+		return -1;
+	}
+
+	ret = cbuf_get_free8(&(p_pkt->pus_pkts));
+	if (ret < packet_buffer_size) {
+		errno = E_PTRACK_PKT_SIZE_LIMIT;
+		return -1;
+	}
+
+	do {
+		pkt_len = ptrack_get_pkt_size(packet_buffer);
+
+		ret = cbuf_write8(&(p_pkt->pus_pkts),
+				  &packet_buffer[i], pkt_len);
+
+		if (ret != pkt_len) {
+			errno = E_PTRACK_PKT_WRITE;
+			return -1;
+		}
+
+		ret = cbuf_write16(&(p_pkt->pus_size), &pkt_len, 1);
+		if (!ret) {
+			errno = E_PTRACK_SIZE_WRITE;
+			return -1;
+		}
+
+		i += pkt_len;
+
+	} while (i <= (int32_t) (packet_buffer_size - PUS_PKT_MIN_SIZE));
+
+
+	return i;
+}
+
+
+
+
+/**
+ * @brief	peek at the size of the next packet in the buffer
+ * @param	p_buf a pointer to a struct packet_tracker
+ * @note	if the buffer is empty or cannot be read, the function will
+ *		always return 0
+ */
+
+inline uint16_t ptrack_peek_next_pkt_size(struct packet_tracker *p_pkt)
+{
+	uint16_t pkt_size;
+
+	if (cbuf_peek16(&(p_pkt->pus_size), &pkt_size, 1))
+		return pkt_size;
+
+	return 0;
+}
+
+
+/**
+ * @brief	get the size of the next packet in the buffer
+ * @param	p_buf a pointer to a struct packet_tracker
+ * @returns	size of next packet in buffer
+ *
+ * @note	if the buffer is empty or cannot be read, the function will
+ *		always return 0
+ */
+
+static inline uint16_t ptrack_get_next_pkt_size(struct packet_tracker *p_pkt)
+{
+	uint16_t pkt_size;
+
+	if (cbuf_read16(&(p_pkt->pus_size), &pkt_size, 1))
+		return pkt_size;
+
+	return 0;
+}
+
+
+/**
+ * @brief	get a packet from the buffer
+ * @param	p_pkt a struct packet_tracker
+ * @param	p_buf a buffer large enough to hold a packet
+ * @returns	0 (failure, check errno), or size of packet read
+ */
+
+uint16_t ptrack_get_next_pkt(struct packet_tracker *p_pkt, uint8_t  *p_buf)
+{
+	uint16_t pkt_size;
+
+
+	pkt_size = ptrack_get_next_pkt_size(p_pkt);
+
+	if (!pkt_size) {
+		errno = E_PTRACK_NOPKT;
+		return 0;
+	}
+
+	if (pkt_size != cbuf_read8(&(p_pkt->pus_pkts), p_buf, pkt_size)) {
+		errno = E_PTRACK_PKT_READ;
+		return 0;
+	}
+
+	return pkt_size;
+}
+
+
+/** brief	get number of packets in buffer
+ * @param	p_pkt a struct packet_tracker
+ * @returns	number of packets
+ */
+
+uint32_t ptrack_get_packets_in_buffer(struct packet_tracker *p_pkt)
+{
+	return cbuf_get_used16(&(p_pkt->pus_size));
+}
diff --git a/IBSW/lib/reset.c b/IBSW/lib/reset.c
new file mode 100644
index 0000000..c2f90bc
--- /dev/null
+++ b/IBSW/lib/reset.c
@@ -0,0 +1,35 @@
+/**
+ * @file   reset.c
+ * @ingroup edac
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at)
+ * @date   October, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <io.h>
+
+#include <iwf_fpga.h>
+#include <ibsw_interface.h>
+
+/**
+ * @brief generic high level reset trap handler
+ */
+
+void reset(void)
+{
+	CrIbResetDPU(DBS_EXCHANGE_RESET_TYPE_EX);
+}
diff --git a/IBSW/lib/stacktrace.c b/IBSW/lib/stacktrace.c
new file mode 100644
index 0000000..40433f4
--- /dev/null
+++ b/IBSW/lib/stacktrace.c
@@ -0,0 +1,84 @@
+/**
+ * @file   stacktrace.c
+ * @ingroup stacktrace
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at)
+ * @author Linus Torvalds et al.
+ * @date   September, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @note The stack tracing was inspired by __save_stack_trace() in
+ *       linux/asm/sparc/kernel/stacktrace.c. Not particular author was given
+ *       in the file, hence the generic credit.
+ *
+ *
+ * @defgroup stacktrace Stack Tracing
+ * @brief performs a trace back of a stack
+ *
+ * @example demo_trace.c
+ */
+
+#include <stdlib.h>
+
+#include <io.h>
+#include <compiler.h>
+#include <timing.h>
+#include <asm/leon.h>
+#include <stacktrace.h>
+
+
+/**
+ * @brief validates the stack pointer address
+ * @note  stacks on v8 must be 8-byte aligned
+ */
+static int stack_valid(uint32_t sp)
+{
+	if (sp & (8UL - 1) || !sp)
+		return 0;
+
+	return 1;
+}
+
+
+/**
+ * @brief performs a stack trace
+ *
+ * @param trace  a struct stack_trace
+ * @param sp     a stack/frame pointer
+ * @param pc     a program counter
+ *
+ * @note When being called from a trap, the pc in %o7 is NOT the return program
+ *       counter of the trapped function, so a stack/frame pointer by itself
+ *       is not enough to provide a proper trace, hence the pc argument
+ */
+
+void save_stack_trace(struct stack_trace *trace, uint32_t sp, uint32_t pc)
+{
+	struct sparc_stackf *sf;
+
+	if (!stack_valid(sp))
+		return;
+
+	/* flush reg windows to memory*/
+	leon_reg_win_flush();
+
+	do {
+		if (!stack_valid(sp))
+			break;
+
+		trace->entries[trace->nr_entries++] = pc;
+
+		sf   = (struct sparc_stackf *) sp;
+		pc = sf->callers_pc;
+		sp = (uint32_t) sf->fp;
+
+	} while (trace->nr_entries < trace->max_entries);
+}
diff --git a/IBSW/lib/sysctl.c b/IBSW/lib/sysctl.c
new file mode 100644
index 0000000..6c66303
--- /dev/null
+++ b/IBSW/lib/sysctl.c
@@ -0,0 +1,779 @@
+/**
+ * @file   sysctl.c
+ * @ingroup sysctl
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @author Linus Torvalds et al.
+ * @date   January, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * Note: explicit references to linux source files are not always given
+ *
+ *
+ * @defgroup sysctl System Control and Statistics Interface
+ *
+ * @brief
+ *	An interface for examining and dynamically changing of parameters
+ *	exported by a driver or other software subsystem to "user space".
+ *
+ * This system statistics/configuration functionality is tailored/derived
+ * from how sysfs and kobjects work in Linux. For obvious reasons, access via a
+ * virtual file system is not possible. The file system tree which would usually
+ * hold the references to registered objects is not present, hence objects know
+ * about their parents AND their children. Sets can be part of another set.
+ * Settings and values can be accessed by specifying the path to the object
+ * and their name. rees are built from objects and sets. Objects have
+ * attributes that can be read and/or set.
+ *
+ *
+ * ## Overview
+ *
+ * A core necessity of any type of on-board software is the ability to generate
+ * housekeeping data to be sent to ground, in order to provide information about
+ * the prevailing run-time parameters of both hardware and software.
+ * While requirements of update rates and number of variables, especially
+ * regarding software, may vary greatly for different mission profiles, there
+ * are generally hundreds of these data that are available for selection to
+ * form a housekeeping telemetry message. Usually, these are not solely
+ * read-only variables, but may also be patched by an appropriate tele-command
+ * in order to induce a mode change or adjust parameters to modify the behaviour
+ * of the software.
+ *
+ * These variables may be stored in large, monolithic, globally accessible
+ * "data pools". Such simplistic structures may at first glance be the logical
+ * choice, suggesting ease of both use and implementation, but are however
+ * very susceptible to breakage, particularly in top-down designs, where the
+ * data type of the implemented variables is not uniform and interaction with
+ * the data structure is only intended to occur via opaque accessor functions.
+ *
+ * If adjustments are made during development, memory violations may occur
+ * during runtime, and those can result in erratic, unpredictable, opaque bugs
+ * that are very difficult to track down. Another objection to this type of
+ * design is its re-usability, as there may exist multiple points of adaption,
+ * especially in circumstances where a great number of internally used
+ * variables, which are elemental to a software module or function, are stored
+ * in an externally administered data structure.
+ *
+ * Highly modular, encapsulated software modules with an as minimalistic as
+ * possible external interface are very preferable for re-use. Ideally, for
+ * example, a SpaceWire driver would only provide an interface to send or
+ * receive packets and handle all configuration of the underlying hardware
+ * internally. This however poses a problem to a user that would, for
+ * example, configure a particular link speed or continuously monitor data
+ * transfer rates.
+ * For such purposes, an interaction point is needed that exposes certain
+ * internal attributes via a generic interface and acts as a conduit between
+ * operating system elements and user-space. There are essentially four
+ * fundamental requirements for such functionality.
+ *
+ * First, internal interfaces or variables must not be slower to use than when
+ * not exposed. Second, all exposed functionality is defined by the module and
+ * exported to the generic interface when initialised. Third, the exposed
+ * functionality must not result in unpredictable behaviour, i.e. the software
+ * module must be insensitive to sudden changes in states or variables, or care
+ * must be taken by the module designer, so that interactions are properly
+ * handled. In any case, this must never be a concern for the user. Finally,
+ * any  access must be on the user's processing time, not on that of the module.
+ *
+ * Given that the interaction point has to be completely generic to accommodate
+ * any kind of mapping defined by a module without restrictions, it must
+ * consequently be very simple. This is most easily achieved by implementing a
+ * character-buffer based interface that interacts with a module via functions
+ * provided by the latter to the generic interface structure. The necessary
+ * parsing or value conversion of text buffers on the user side is obviously
+ * slow compared to raw variable access, but given the underlying
+ * assumption that this system control interface is to be accessed in the
+ * order of no more than a few hundreds or at most several thousands times per
+ * second, the overhead is effectively negligible.
+ *
+ * The concept is very similar to the sysfs and sysctl interfaces found in
+ * Linux and BSD operating systems, with the former being file-system driven,
+ * while the latter is implemented as a system call. Since a file-system in the
+ * classic sense is not typically used for on-board software, this
+ * implementation can be seen as a hybrid of the two, which represents nodes in
+ * the configuration in the same fashion as a virtual file system tree, while
+ * all access is performed via a call interface.
+ *
+ *
+ * ## Mode of Operation
+ *
+ *
+ * __sysobjects__ are objects of type _struct sysobj_. They have a name and
+ * contain reference pointers to parent and child objects and the set of
+ * sysobjects they belong to, which allows them to be arrangend in hierarchical
+ * structures. They have no functionality on their own, instead, they are used
+ * to embed functionality as part of another software component.
+ *
+ * __syssets__ are the basic containers for collections of sysobjects and
+ * contain their own sysobject. A sysobject can have any parent, but if the
+ * parent of a sysobject is not specified  when it is added to a sysset, the
+ * latter automatically becomes the parent of the set, but it does not become
+ * the child of the set.
+ *
+ * __attributes__ define the name and functional I/O of a sysobject.
+ *
+ *
+ *
+ * ### Usage example
+ * To create a system object for exporting items, a software module must define
+ * at least one attribute structure that configures the name and the appropriate
+ * _show_ and _store_ methods of that attribute. The following example is
+ * modeled on a subsystem that configures the state of an LED between _on_,
+ * _off_  and _flash_.
+ *
+ * First, the states of the LED are defined. This is the configuration variable
+ * that sets the operational mode of the "software module". By default, the LED
+ * will be in "flash" mode:
+ *
+ * @code {.c}
+ * enum modes {OFF, ON, FLASH};
+ * static enum modes mode = FLASH;
+ * @endcode
+ *
+ * Next, _show()_ and _store()_ methods are defined. These allow the retrieval
+ * and the definition of the LED mode from user-space:
+ *
+ * @code {.c}
+ * static ssize_t mode_show(struct sysobj *sobj, struct sobj_attribute *sattr,
+ *			    char *buf)
+ * {
+ *	switch(mode) {
+ *	case OFF:   return sprintf(buf, "off\n");
+ *	case ON:    return sprintf(buf, "on\n");
+ *	case FLASH: return sprintf(buf, "flash\n");
+ *	default:    return sprintf(buf, "Mode error\n");
+ *	}
+ * }
+ *
+ * static ssize_t mode_store(struct sysobj *sobj, struct sobj_attribute *sattr,
+ *			     const char *buf, size_t len)
+ * {
+ *	if (!strncmp(buf, "on", len))
+ *		mode = ON;
+ *	else if (!strncmp(buf, "off", len))
+ *		mode = OFF;
+ *	else if (!strncmp(buf, "flash", len))
+ *		mode = FLASH;
+ *
+ *	return len;
+ * }
+ * @endcode
+ *
+ *
+ * The mode and store functions are then combined into an attribute, that
+ * will, in this case, literally be called "mode":
+ *
+ * @code {.c}
+ * static struct sobj_attribute mode_attr = __ATTR(mode, mode_show, mode_store);
+ * @endcode
+ *
+ * The attribute is then added into a set of attributes that is terminated by
+ * NULL. A set can contain any number of attributes, in this case it is just
+ * one:
+ *
+ * @code {.c}
+ * static struct sobj_attribute *attributes[] = {&mode_attr, NULL};
+ * @endcode
+ *
+ * A system object is created and the attribute set is associated to it:
+ *
+ * @code {.c}
+ * struct sysobj *sobj;
+ *
+ * sobj = sysobj_create();
+ * sobj->sattr = mode_attr;
+ * @endcode
+ *
+ * The system object can now be attached as a node to a set of objects or
+ * logical tree, for example to a predefined "/sys/driver" branch under the
+ * name "myLEDmodule":
+ *
+ * @code {.c}
+ * sysobj_add(sobj, NULL, driver_set, "myLEDmodule");
+ * @endcode
+ *
+ * The resulting tree can be shown by calling:
+ *
+ * @code {.c}
+ * sysset_show_tree(sys_set);
+ * @endcode
+ *
+ * resulting in the output:
+ *
+ @verbatim
+
+    |__ sys
+	|__ driver
+		|__ myLEDmodule { mode }
+
+ @endverbatim
+ *
+ * The flash mode can now be read by locating the node in the tree and querying
+ * "mode":
+ *
+ * @code {.c}
+ * sysobj_show_attr(sysset_find_obj(sys_set,  "/sys/driver/myLEDmodule"), "mode", buf);
+ *
+ * printf("led mode: %s\n", buf);
+ * @endcode
+ *
+ * resulting in the output:
+ *
+ @verbatim
+    mode: flash
+ @endverbatim
+ *
+ *
+ * The flash mode can be changed to value accepted by the _store()_ method:
+ *
+ * @code {.c}
+ * sysobj_store_attr(sysset_find_obj(sys_set, "/sys/driver/myLEDmodule"), "mode", "off", strlen("off"));
+ *
+ * sysobj_show_attr(sysset_find_obj(sys_set,  "/sys/driver/myLEDmodule"), "mode", buf);
+ *
+ * printf("led mode: %s\n", buf);
+ * @endcode
+ *
+ * and the output now reads:
+ *
+ @verbatim
+    mode: off
+ @endverbatim
+ *
+ *
+ *
+ *
+ * There are no particular rules on how to use the sysctl tree, but it makes
+ * sense to put nodes into appropriate locations.
+ * For instance, a SpaceWire driver would register its attributes under a
+ * /sys/drivers tree, while an interrupt manager would register under
+ * /sys/irq, provided that these sets were already defined.
+ *
+ * Optionally, a new sub-set to hold the system objects of particular attributes
+ * may be created before attaching an object. If the SpaceWire driver was to
+ * manage multiple interfaces, it could create a logical sub-set
+ * /sys/drivers/spw and group interfaces SpW0, SpW1, etc. under that set.
+ *
+ * Since there are no formal restrictions on what qualifies to this system
+ * configuration tree, application software running on top of the operating
+ * system can (and should) make use of it as well. The aforementioned
+ * housekeeping data generation makes a good example for an application that
+ * both uses the the data provided by the registered software modules to
+ * generate housekeeping packets and is itself configured via this interface,
+ * e.g. its polling rate and the definition of housekeeping data to collect.
+ *
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ * ## Notes
+ *
+ * - To accelerate lookup of a node, a hash table should be added, where every
+ *   entry is registered. This avoids searching the tree every time.
+ * - Ideally, a pointer reference to a particular node would be held when
+ *   planning to to repetitive queries on the node. This needs reference
+ *   counters so a node is "in use" and cannot be de-registered while a
+ *   reference is held. This mandates "grab" and "release" functions to be
+ *   called by by a user, which pass a such a reference instead of the raw
+ *   pointer.
+ * - When reference counters are added, the sysobjects require a release method
+ *   so their creating code can be asynchronously notified (see linux kobjects
+ *   for similar logic).
+ * - At the moment, this is not supposed to be used from mutliple threads or
+ *   any other possibly reentrant way. To allow this, modifications need to be
+ *   made to at least include reference counts, atomic locking and a strtok_r
+ *   function.
+ * - Objects and sets are not intended to be freed, this is not implemented due
+ *   to the lack of available MMU support
+ * - At some point, an extension to binary i/o attributes may be sensible, e.g.
+ *   for injection or retrieval of binary calibration data into a module or
+ *   subsystem.
+ *
+ *
+ * @example demo_sysctl.c
+ *
+ */
+
+
+#include <stdio.h>
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <errno.h>
+
+#include <list.h>
+
+#include <sysctl.h>
+
+
+struct sysset *sys_set;
+struct sysset *driver_set;
+
+
+
+
+static struct sysset *sysset_get(struct sysset *s);
+
+
+/**
+ * @brief get the name of a sysobject
+ * @param sobj a reference to a sysobject
+ * @return a reference to the name buffer of the sysobject
+ */
+
+const char *sysobj_name(const struct sysobj *sobj)
+{
+	return sobj->name;
+}
+
+
+/**
+ * @brief join a sysobject to its sysset
+ * @param sobj a reference to a sysobject
+ */
+
+static void sobj_sysset_join(struct sysobj *sobj)
+{
+	if (!sobj->sysset)
+		return;
+
+	sysset_get(sobj->sysset);
+
+	list_add_tail(&sobj->entry, &sobj->sysset->list);
+}
+
+
+/**
+ * @brief get the reference to a sysobject
+ * @param sobj a reference to a sysobject
+ */
+
+static struct sysobj *sysobj_get(struct sysobj *sobj)
+{
+	return sobj;
+}
+
+
+/**
+ * @brief set the name of a sysobject
+ * @param sobj a reference to a sysobject
+ * @param name the name buffer reference to assign
+ */
+
+static void sysobj_set_name(struct sysobj *sobj, const char *name)
+{
+	sobj->name = name;
+}
+
+
+/**
+ * @brief initialise a sysobject's lists head
+ * @param sobj a reference to a sysobject
+ */
+
+static void sysobj_init_internal(struct sysobj *sobj)
+{
+	if (!sobj)
+		return;
+
+	INIT_LIST_HEAD(&sobj->entry);
+}
+
+
+/**
+ * @brief initialise a sysobject
+ * @param sobj a reference to a sysobject
+ */
+
+void sysobj_init(struct sysobj *sobj)
+{
+	if (!sobj)
+		return;	/* invalid pointer */
+
+	bzero(sobj, sizeof(struct sysobj));
+	sysobj_init_internal(sobj);
+}
+
+
+/**
+ * @brief create a sysobject
+ * @return a reference to the new sysobject or NULL on error
+ */
+
+struct sysobj *sysobj_create(void)
+{
+	struct sysobj *sobj;
+
+
+	sobj = malloc(sizeof(*sobj));
+
+	if (!sobj)
+		return NULL;
+
+	sysobj_init(sobj);
+
+	return sobj;
+}
+
+
+/**
+ * @brief add a sysobject and optionally set its sysset as parent
+ * @param sobj a reference to the sysobject
+ * @return -1 on error, 0 otherwise
+ */
+
+static int32_t sysobj_add_internal(struct sysobj *sobj)
+{
+	struct sysobj *parent;
+
+
+	if (!sobj)
+		return -1;
+
+	parent = sysobj_get(sobj->parent);
+
+	/* join sysset if set, use it as parent if we do not already have one */
+	if (sobj->sysset) {
+		if (!parent)
+			parent = sysobj_get(&sobj->sysset->sobj);
+		sobj_sysset_join(sobj);
+		sobj->parent = parent;
+	}
+
+	return 0;
+}
+
+
+/**
+ * @brief add a sysobject to a set and/or a parent
+ * @param sobj a reference to the sysobject
+ * @param parent a reference to the parent sysobject
+ * @param sysset a reference to the parent sysset
+ * @param name the name of the sysobj
+ * @return -1 on error, 0 otherwise
+ */
+
+int32_t sysobj_add(struct sysobj *sobj, struct sysobj *parent,
+		   struct sysset *sysset, const char *name)
+{
+	if (!sobj)
+		return -1;
+
+	sobj->sysset = sysset;
+
+	sysobj_set_name(sobj, name);
+
+	sobj->parent = parent;
+
+	sysobj_add_internal(sobj);
+
+	return 0;
+}
+
+
+/**
+ * @brief create and add a sysobject to a parent
+ * @parm name the name of a sysobj
+ * @param parent an optional parent to the sysobject
+ * @return a reference to the newly created sysobject or NULL on error
+ */
+
+struct sysobj *sysobj_create_and_add(const char *name, struct sysobj *parent)
+{
+	struct sysobj *sobj;
+
+
+	sobj = sysobj_create();
+
+	if (!sobj)
+		return NULL;
+
+	sysobj_add(sobj, parent, NULL, name);
+
+	return sobj;
+}
+
+
+/**
+ * @brief call the "show" attribute function of a sysobject
+ * @param sobj a struct sysobj
+ * @param name the name of the attribute
+ * @param buf a buffer to return parameters
+ */
+
+void sysobj_show_attr(struct sysobj *sobj, const char *name, char *buf)
+{
+	struct sobj_attribute **sattr;
+
+
+	if (!name)
+		return;
+
+	if (!sobj)
+		return;
+
+	if (!sobj->sattr)
+		return;
+
+
+	sattr = sobj->sattr;
+
+	while ((*sattr)) {
+
+		if (!strcmp((*sattr)->name, name))
+			(*sattr)->show(sobj, (*sattr), buf);
+
+		sattr++;
+		continue;
+
+	}
+}
+
+
+/**
+ * @brief call the "store" attribute function of a sysobject
+ * @param sobj a struct sysobj
+ * @param name the name of the attribute
+ * @param buf a buffer holding parameters
+ * @param len the lenght of the buffer
+ */
+
+void sysobj_store_attr(struct sysobj *sobj, const char *name,
+		       const char *buf, size_t len)
+{
+	struct sobj_attribute **sattr;
+
+	if (!name)
+		return;
+
+	if (!sobj)
+		return;
+
+	if (!sobj->sattr)
+		return;
+
+
+	sattr = sobj->sattr;
+
+	while ((*sattr)) {
+
+		if (!strcmp((*sattr)->name, name))
+			(*sattr)->store(sobj, (*sattr), buf, len);
+
+		sattr++;
+		continue;
+
+	}
+}
+
+
+/**
+ * @brief get the sysset container of a sysobject
+ * @param s a struct sysset
+ * @return reference to the sysset or NULL
+ */
+
+__extension__
+static struct sysset *to_sysset(struct sysobj *sobj)
+{
+	return sobj ? container_of(sobj, struct sysset, sobj) : NULL;
+}
+
+
+/**
+ * @brief get the sysset container of a sysset's sysobject
+ * @param s a struct sysset
+ * @return reference to the sysset or NULL
+ */
+
+static struct sysset *sysset_get(struct sysset *s)
+{
+	return s ? to_sysset(sysobj_get(&s->sobj)) : NULL;
+}
+
+
+/**
+ * @brief initialise a sysset
+ * @param s a struct sysset
+ */
+
+static void sysset_init(struct sysset *s)
+{
+	sysobj_init_internal(&s->sobj);
+	INIT_LIST_HEAD(&s->list);
+}
+
+
+/**
+ * @brief register a sysset
+ * @param s a struct sysset
+ * @return -1 on error, 0 otherwise
+ */
+
+static int32_t sysset_register(struct sysset *s)
+{
+	if (!s)
+		return -1;
+
+	sysset_init(s);
+
+	return sysobj_add_internal(&s->sobj);
+}
+
+
+/**
+ * @brief create a sysset
+ * @param name a string holding the name of the set
+ * @param parent_sobj a struct sysobj or NULL if no sysobj parent
+ * @param parent_sysset a struct sysysset or NULL if no sysysset parent
+ * @return a reference to the new sysset
+ */
+
+struct sysset *sysset_create(const char *name,
+			     struct sysobj *parent_sobj,
+			     struct sysset *parent_sysset)
+{
+	struct sysset *sysset;
+
+	sysset = malloc(sizeof(*sysset));
+
+	if (!sysset)
+		return NULL;
+
+	bzero(sysset, sizeof(*sysset));
+
+
+	sysobj_set_name(&sysset->sobj, name);
+
+	sysset->sobj.parent = parent_sobj;
+	sysset->sobj.child  = &sysset->sobj;
+
+	sysset->sobj.sysset = parent_sysset;
+
+	return sysset;
+}
+
+
+/**
+ * @brief create and add a sysset
+ * @param name a string holding the name of the set
+ * @param parent_sobj a struct sysobj or NULL if no sysobj parent
+ * @param parent_sysset a struct sysysset or NULL if no sysysset parent
+ * @return a reference to the new sysset
+ */
+
+struct sysset *sysset_create_and_add(const char *name,
+				     struct sysobj *parent_sobj,
+				     struct sysset *parent_sysset)
+{
+	struct sysset *sysset;
+
+
+	sysset = sysset_create(name, parent_sobj, parent_sysset);
+
+	if (!sysset)
+		return NULL;
+
+	sysset_register(sysset);
+
+	return sysset;
+}
+
+
+/**
+ * @brief find the reference to an object in a sysset by its path
+ * @param sysset a struct sysset
+ * @param path a string describing a path
+ * @return a reference to the sysobj found
+ *
+ * @note this function is guaranteed to return, unless the machine's memory
+ *	 is either effectively a loop or infinite, but in this one instance.
+ *	 polyspace static analyzer appears fail here, the unit test clearly
+ *	 demonstrates that all sections of this function are reachable
+ *
+ * @note this function was modified to use a common exit point
+ */
+
+__extension__
+struct sysobj *sysset_find_obj(struct sysset *sysset, const char *path)
+{
+	char str[256];
+	char *token;
+
+	struct sysobj *s;
+	struct sysobj *ret = NULL;
+
+
+
+	memcpy(str, path, strlen(path) + 1);
+
+	token = strtok(str, "/");
+
+	/* root node */
+	if (strcmp(sysobj_name(&sysset->sobj), token))
+		goto exit;
+
+	while (1) {
+
+		token = strtok(NULL, "/");
+
+		if (!token)
+			goto exit;
+
+		list_for_each_entry(s, &sysset->list, entry) {
+
+			if (!sysobj_name(s))
+				goto exit;
+
+			if (strcmp(sysobj_name(s), token))
+				continue;
+
+			if (!s->child) {
+				ret = s;
+				goto exit;
+			}
+
+			sysset = container_of(s->child, struct sysset, sobj);
+
+			break;
+		}
+	}
+
+exit:
+	return ret;
+}
+
+
+#if (__sparc__)
+/**
+ * @brief initalises sysctl
+ * @note will not be covered by unit test
+ */
+int32_t sysctl_init(void)
+{
+	if (sys_set)
+		return -1;
+
+	sys_set = sysset_create_and_add("sys", NULL, NULL);
+
+	if (!sys_set)
+		return -1;
+
+	driver_set = sysset_create_and_add("driver", NULL, sys_set);
+
+	if (!driver_set)
+		return -1;
+
+	return 0;
+}
+#endif
diff --git a/IBSW/lib/timing/leon3_gptimer.c b/IBSW/lib/timing/leon3_gptimer.c
new file mode 100644
index 0000000..774ba4c
--- /dev/null
+++ b/IBSW/lib/timing/leon3_gptimer.c
@@ -0,0 +1,363 @@
+/**
+ * @file   leon3_gptimer.c
+ * @ingroup timing
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   July, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief implements access to the LEON3 General Purpose Timer Unit
+ * @see GR712RC user manual chapter 11
+ *
+ */
+
+
+#include <leon3_gptimer.h>
+#include <leon3_timers.h>
+
+
+/**
+ * @brief set scaler reload value of the timer block
+ * @param ptu a struct gptimer_unit
+ *
+ */
+
+void gptimer_set_scaler_reload(struct gptimer_unit *ptu, uint32_t value)
+{
+	iowrite32be(value, &ptu->scaler_reload);
+}
+
+
+/**
+ * @brief get scaler reload value of the timer block
+ * @param ptu a struct gptimer_unit
+ *
+ */
+
+uint32_t gptimer_get_scaler_reload(struct gptimer_unit *ptu)
+{
+	return ioread32be(&ptu->scaler_reload);
+}
+
+
+/**
+ * @brief sets the interrupt enabled flag of a timer
+ * @param ptu a struct gptimer_unit
+ * @param timer the selected timer
+ */
+
+void gptimer_set_interrupt_enabled(struct gptimer_unit *ptu, uint32_t timer)
+{
+	uint32_t flags;
+
+	flags  = ioread32be(&ptu->timer[timer].ctrl);
+	flags |= LEON3_TIMER_IE;
+
+	iowrite32be(flags, &ptu->timer[timer].ctrl);
+}
+
+
+/**
+ * @brief sets the interrupt enabled flag of a timer
+ * @param ptu a struct gptimer_unit
+ * @param timer the selected timer
+ */
+
+void gptimer_clear_interrupt_enabled(struct gptimer_unit *ptu, uint32_t timer)
+{
+	uint32_t flags;
+
+	flags  = ioread32be(&ptu->timer[timer].ctrl);
+	flags &= ~LEON3_TIMER_IE;
+
+	iowrite32be(flags, &ptu->timer[timer].ctrl);
+}
+
+
+/**
+ * @brief sets the load flag of a timer
+ * @param ptu a struct gptimer_unit
+ * @param timer the selected timer
+ */
+
+void gptimer_set_load(struct gptimer_unit *ptu, uint32_t timer)
+{
+	uint32_t flags;
+
+	flags  = ioread32be(&ptu->timer[timer].ctrl);
+	flags |= LEON3_TIMER_LD;
+
+	iowrite32be(flags, &ptu->timer[timer].ctrl);
+}
+
+
+/**
+ * @brief clears the load flag of a timer
+ * @param ptu a struct gptimer_unit
+ * @param timer the selected timer
+ */
+
+void gptimer_clear_load(struct gptimer_unit *ptu, uint32_t timer)
+{
+	uint32_t flags;
+
+	flags  = ioread32be(&ptu->timer[timer].ctrl);
+	flags &= ~LEON3_TIMER_LD;
+
+	iowrite32be(flags, &ptu->timer[timer].ctrl);
+}
+
+
+/**
+ * @brief set enable flag in timer
+ * @param ptu a struct gptimer_unit
+ * @param timer the selected timer
+ */
+void gptimer_set_enabled(struct gptimer_unit *ptu, uint32_t timer)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&ptu->timer[timer].ctrl);
+	ctrl |= LEON3_TIMER_EN;
+
+	iowrite32be(ctrl, &ptu->timer[timer].ctrl);
+}
+
+
+/**
+ * @brief clear enable flag in timer
+ * @param ptu a struct gptimer_unit
+ * @param timer the selected timer
+ */
+
+void gptimer_clear_enabled(struct gptimer_unit *ptu, uint32_t timer)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&ptu->timer[timer].ctrl);
+	ctrl &= ~LEON3_TIMER_EN;
+
+	iowrite32be(ctrl, &ptu->timer[timer].ctrl);
+}
+
+
+/**
+ * @brief set restart flag in timer
+ * @param ptu a struct gptimer_unit
+ * @param timer the selected timer
+ */
+void gptimer_set_restart(struct gptimer_unit *ptu, uint32_t timer)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&ptu->timer[timer].ctrl);
+	ctrl |= LEON3_TIMER_RS;
+
+	iowrite32be(ctrl, &ptu->timer[timer].ctrl);
+}
+
+
+/**
+ * @brief clear restart flag in timer
+ * @param ptu a struct gptimer_unit
+ * @param timer the selected timer
+ */
+
+void gptimer_clear_restart(struct gptimer_unit *ptu, uint32_t timer)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&ptu->timer[timer].ctrl);
+	ctrl &= ~LEON3_TIMER_RS;
+
+	iowrite32be(ctrl, &ptu->timer[timer].ctrl);
+}
+
+
+/**
+ * @brief set timer to chain to the preceeding timer
+ * @param ptu a struct gptimer_unit
+ * @param timer the selected timer
+ */
+
+void gptimer_set_chained(struct gptimer_unit *ptu, uint32_t timer)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&ptu->timer[timer].ctrl);
+	ctrl |= LEON3_TIMER_CH;
+
+	iowrite32be(ctrl, &ptu->timer[timer].ctrl);
+}
+
+
+/**
+ * @brief clear timer to chain to the preceeding timer
+ * @param ptu a struct gptimer_unit
+ * @param timer the selected timer
+ */
+
+void gptimer_clear_chained(struct gptimer_unit *ptu, uint32_t timer)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&ptu->timer[timer].ctrl);
+	ctrl &= ~LEON3_TIMER_CH;
+
+	iowrite32be(ctrl, &ptu->timer[timer].ctrl);
+}
+
+
+/**
+ * @brief get status of interrupt pending status
+ * @param ptu a struct gptimer_unit
+ * @param timer the selected timer
+ */
+
+uint32_t gptimer_get_interrupt_pending_status(struct gptimer_unit *ptu,
+					      uint32_t timer)
+{
+	return ioread32be(&ptu->timer[timer].ctrl) & LEON3_TIMER_IP;
+}
+
+
+/**
+ * @brief clear status of interrupt pending status
+ * @param ptu a struct gptimer_unit
+ * @param timer the selected timer
+ */
+
+void gptimer_clear_interrupt_pending_status(struct gptimer_unit *ptu,
+					    uint32_t timer)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&ptu->timer[timer].ctrl);
+	ctrl &= ~LEON3_TIMER_IP;
+
+	iowrite32be(ctrl, &ptu->timer[timer].ctrl);
+}
+
+
+/**
+ * @brief get number of implemented general purpose timers
+ * @param ptu a struct gptimer_unit
+ * @param timer the selected timer
+ */
+
+uint32_t gptimer_get_num_implemented(struct gptimer_unit *ptu)
+{
+	return ioread32be(&ptu->config) & LEON3_CFG_TIMERS_MASK;
+}
+
+
+/**
+ * @brief get interrupt ID of first implemented timer
+ * @param ptu a struct gptimer_unit
+ * @param timer the selected timer
+ */
+
+uint32_t gptimer_get_first_timer_irq_id(struct gptimer_unit *ptu)
+{
+	return (ioread32be(&ptu->config) & LEON3_CFG_IRQNUM_MASK) >>
+		LEON3_CFG_IRQNUM_SHIFT;
+}
+
+
+/**
+ * @brief set the value of a gptimer
+ * @param ptu a struct gptimer_unit
+ * @param timer the selected timer
+ * @param value the timer counter value to set
+ */
+
+void gptimer_set_value(struct gptimer_unit *ptu, uint32_t timer, uint32_t value)
+{
+	iowrite32be(value, &ptu->timer[timer].value);
+}
+
+/**
+ * @brief get the value of a gptimer
+ * @param ptu a struct gptimer_unit
+ * @param timer the selected timer
+ * @param value the timer counter value to set
+ */
+
+uint32_t gptimer_get_value(struct gptimer_unit *ptu, uint32_t timer)
+{
+	return ioread32be(&ptu->timer[timer].value);
+}
+
+
+/**
+ * @brief set the reload of a gptimer
+ * @param ptu a struct gptimer_unit
+ * @param timer the selected timer
+ * @param reload the timer counter reload to set
+ */
+
+void gptimer_set_reload(struct gptimer_unit *ptu,
+			uint32_t timer,
+			uint32_t reload)
+{
+	iowrite32be(reload, &ptu->timer[timer].reload);
+}
+
+/**
+ * @brief get the reload of a gptimer
+ * @param ptu a struct gptimer_unit
+ * @param timer the selected timer
+ * @param reload the timer counter reload to set
+ */
+
+uint32_t gptimer_get_reload(struct gptimer_unit *ptu, uint32_t timer)
+{
+	return ioread32be(&ptu->timer[timer].reload);
+}
+
+
+/**
+ * @brief starts a gptimer; emits an irq but does not enable reload on underflow
+ * @param ptu a struct gptimer_unit
+ * @param timer the selected timer
+ * @param value the timer counter value to set
+ */
+
+void gptimer_start(struct gptimer_unit *ptu, uint32_t timer, uint32_t value)
+{
+	gptimer_set_value(ptu, timer, value);
+	gptimer_set_reload(ptu, timer, value);
+
+	gptimer_set_interrupt_enabled(ptu, timer);
+	gptimer_set_load(ptu, timer);
+	gptimer_set_enabled(ptu, timer);
+}
+
+
+/**
+ * @brief start a gptimer, emits an irq and enables reload on underflow
+ * @param ptu a struct gptimer_unit
+ * @param timer the selected timer
+ * @param value the timer counter value to set
+ */
+
+void gptimer_start_cyclical(struct gptimer_unit *ptu,
+			    uint32_t timer, uint32_t value)
+{
+	gptimer_set_value(ptu, timer, value);
+	gptimer_set_reload(ptu, timer, value);
+
+
+	gptimer_set_interrupt_enabled(ptu, timer);
+	gptimer_set_load(ptu, timer);
+	gptimer_set_restart(ptu, timer);
+	gptimer_set_enabled(ptu, timer);
+}
diff --git a/IBSW/lib/timing/leon3_grtimer.c b/IBSW/lib/timing/leon3_grtimer.c
new file mode 100644
index 0000000..e42d11d
--- /dev/null
+++ b/IBSW/lib/timing/leon3_grtimer.c
@@ -0,0 +1,390 @@
+/**
+ * @file   leon3_grtimer.c
+ * @ingroup timing
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   July, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ *
+ * @brief
+ *	implements access to the LEON3 General Purpose Timer Unit with
+ *	Time Latch Capability
+ *
+ * @see GR712RC user manual chapter 12
+ *
+ */
+
+
+#include <leon3_grtimer.h>
+#include <leon3_timers.h>
+
+
+
+/**
+ * @brief set scaler reload value of the timer block
+ * @param rtu a struct grtimer_unit
+ *
+ */
+
+void grtimer_set_scaler_reload(struct grtimer_unit *rtu, uint32_t value)
+{
+	iowrite32be(value, &rtu->scaler_reload);
+}
+
+
+/**
+ * @brief get scaler reload value of the timer block
+ * @param rtu a struct grtimer_unit
+ *
+ */
+
+uint32_t grtimer_get_scaler_reload(struct grtimer_unit *rtu)
+{
+	return ioread32be(&rtu->scaler_reload);
+}
+
+
+/**
+ * @brief sets the interrupt enabled flag of a timer
+ * @param rtu a struct grtimer_unit
+ * @param timer the selected timer
+ */
+
+void grtimer_set_interrupt_enabled(struct grtimer_unit *rtu, uint32_t timer)
+{
+	uint32_t flags;
+
+	flags  = ioread32be(&rtu->timer[timer].ctrl);
+	flags |= LEON3_TIMER_IE;
+
+	iowrite32be(flags, &rtu->timer[timer].ctrl);
+}
+
+
+/**
+ * @brief sets the interrupt enabled flag of a timer
+ * @param rtu a struct grtimer_unit
+ * @param timer the selected timer
+ */
+
+void grtimer_clear_interrupt_enabled(struct grtimer_unit *rtu, uint32_t timer)
+{
+	uint32_t flags;
+
+	flags  = ioread32be(&rtu->timer[timer].ctrl);
+	flags &= ~LEON3_TIMER_IE;
+
+	iowrite32be(flags, &rtu->timer[timer].ctrl);
+}
+
+
+/**
+ * @brief sets the load flag of a timer
+ * @param rtu a struct grtimer_unit
+ * @param timer the selected timer
+ */
+
+void grtimer_set_load(struct grtimer_unit *rtu, uint32_t timer)
+{
+	uint32_t flags;
+
+	flags  = ioread32be(&rtu->timer[timer].ctrl);
+	flags |= LEON3_TIMER_LD;
+
+	iowrite32be(flags, &rtu->timer[timer].ctrl);
+}
+
+
+/**
+ * @brief clears the load flag of a timer
+ * @param rtu a struct grtimer_unit
+ * @param timer the selected timer
+ */
+
+void grtimer_clear_load(struct grtimer_unit *rtu, uint32_t timer)
+{
+	uint32_t flags;
+
+	flags  = ioread32be(&rtu->timer[timer].ctrl);
+	flags &= ~LEON3_TIMER_LD;
+
+	iowrite32be(flags, &rtu->timer[timer].ctrl);
+}
+
+
+/**
+ * @brief set enable flag in timer
+ * @param rtu a struct grtimer_unit
+ * @param timer the selected timer
+ */
+
+void grtimer_set_enabled(struct grtimer_unit *rtu, uint32_t timer)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&rtu->timer[timer].ctrl);
+	ctrl |= LEON3_TIMER_EN;
+
+	iowrite32be(ctrl, &rtu->timer[timer].ctrl);
+}
+
+
+/**
+ * @brief clear enable flag in timer
+ * @param rtu a struct grtimer_unit
+ * @param timer the selected timer
+ */
+
+void grtimer_clear_enabled(struct grtimer_unit *rtu, uint32_t timer)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&rtu->timer[timer].ctrl);
+	ctrl &= ~LEON3_TIMER_EN;
+
+	iowrite32be(ctrl, &rtu->timer[timer].ctrl);
+}
+
+
+/**
+ * @brief set restart flag in timer
+ * @param rtu a struct grtimer_unit
+ * @param timer the selected timer
+ */
+
+void grtimer_set_restart(struct grtimer_unit *rtu, uint32_t timer)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&rtu->timer[timer].ctrl);
+	ctrl |= LEON3_TIMER_RS;
+
+	iowrite32be(ctrl, &rtu->timer[timer].ctrl);
+}
+
+
+/**
+ * @brief clear restart flag in timer
+ * @param rtu a struct grtimer_unit
+ * @param timer the selected timer
+ */
+
+void grtimer_clear_restart(struct grtimer_unit *rtu, uint32_t timer)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&rtu->timer[timer].ctrl);
+	ctrl &= ~LEON3_TIMER_RS;
+
+	iowrite32be(ctrl, &rtu->timer[timer].ctrl);
+}
+
+
+/**
+ * @brief set timer to chain to the preceeding timer
+ * @param rtu a struct grtimer_unit
+ * @param timer the selected timer
+ */
+
+void grtimer_set_chained(struct grtimer_unit *rtu, uint32_t timer)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&rtu->timer[timer].ctrl);
+	ctrl |= LEON3_TIMER_CH;
+
+	iowrite32be(ctrl, &rtu->timer[timer].ctrl);
+}
+
+
+/**
+ * @brief clear timer to chain to the preceeding timer
+ * @param rtu a struct grtimer_unit
+ * @param timer the selected timer
+ */
+
+void grtimer_clear_chained(struct grtimer_unit *rtu, uint32_t timer)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&rtu->timer[timer].ctrl);
+	ctrl &= ~LEON3_TIMER_CH;
+
+	iowrite32be(ctrl, &rtu->timer[timer].ctrl);
+}
+
+
+/**
+ * @brief get status of interrupt pending status
+ * @param rtu a struct grtimer_unit
+ * @param timer the selected timer
+ */
+
+uint32_t grtimer_get_interrupt_pending_status(struct grtimer_unit *rtu,
+					      uint32_t timer)
+{
+	return ioread32be(&rtu->timer[timer].ctrl) & LEON3_TIMER_IP;
+}
+
+
+/**
+ * @brief clear status of interrupt pending status
+ * @param rtu a struct grtimer_unit
+ * @param timer the selected timer
+ */
+
+void grtimer_clear_interrupt_pending_status(struct grtimer_unit *rtu,
+					    uint32_t timer)
+{
+	uint32_t ctrl;
+
+	ctrl  = ioread32be(&rtu->timer[timer].ctrl);
+	ctrl &= ~LEON3_TIMER_IP;
+
+	iowrite32be(ctrl, &rtu->timer[timer].ctrl);
+}
+
+
+/**
+ * @brief get number of implemented general purpose timers
+ * @param rtu a struct grtimer_unit
+ * @param timer the selected timer
+ */
+
+uint32_t grtimer_get_num_implemented(struct grtimer_unit *rtu)
+{
+	return ioread32be(&rtu->config) & LEON3_CFG_TIMERS_MASK;
+}
+
+
+/**
+ * @brief get interrupt ID of first implemented timer
+ * @param rtu a struct grtimer_unit
+ * @param timer the selected timer
+ */
+
+uint32_t grtimer_get_first_timer_irq_id(struct grtimer_unit *rtu)
+{
+	return (ioread32be(&rtu->config) & LEON3_CFG_IRQNUM_MASK) >>
+		LEON3_CFG_IRQNUM_SHIFT;
+}
+
+
+/**
+ * @brief set the value of a grtimer
+ * @param rtu a struct grtimer_unit
+ * @param timer the selected timer
+ * @param value the timer counter value to set
+ */
+
+void grtimer_set_value(struct grtimer_unit *rtu, uint32_t timer, uint32_t value)
+{
+	iowrite32be(value, &rtu->timer[timer].value);
+}
+
+/**
+ * @brief get the value of a grtimer
+ * @param rtu a struct grtimer_unit
+ * @param timer the selected timer
+ * @param value the timer counter value to set
+ */
+
+uint32_t grtimer_get_value(struct grtimer_unit *rtu, uint32_t timer)
+{
+	return ioread32be(&rtu->timer[timer].value);
+}
+
+
+/**
+ * @brief set the reload of a grtimer
+ * @param rtu a struct grtimer_unit
+ * @param timer the selected timer
+ * @param reload the timer counter reload to set
+ */
+
+void grtimer_set_reload(struct grtimer_unit *rtu,
+			uint32_t timer,
+			uint32_t reload)
+{
+	iowrite32be(reload, &rtu->timer[timer].reload);
+}
+
+/**
+ * @brief get the reload of a grtimer
+ * @param rtu a struct grtimer_unit
+ * @param timer the selected timer
+ */
+
+uint32_t grtimer_get_reload(struct grtimer_unit *rtu, uint32_t timer)
+{
+	return ioread32be(&rtu->timer[timer].reload);
+}
+
+/**
+ * @brief set an irq to trigger a latch
+ * @param rtu a struct grtimer_unit
+ * @param irq the irq number to latch on
+ */
+
+void grtimer_set_latch_irq(struct grtimer_unit *rtu, uint32_t irq)
+{
+	uint32_t irq_select;
+
+	irq_select  = ioread32be(&rtu->irq_select);
+	irq_select |= (1 << irq);
+
+	iowrite32be(irq_select, &rtu->irq_select);
+}
+
+
+/**
+ * @brief clear an irq triggering a latch
+ * @param rtu a struct grtimer_unit
+ * @param irq the irq number to disable latching for
+ */
+
+void grtimer_clear_latch_irq(struct grtimer_unit *rtu, uint32_t irq)
+{
+	uint32_t irq_select;
+
+	irq_select  = ioread32be(&rtu->irq_select);
+	irq_select &= ~(1 << irq);
+
+	iowrite32be(irq_select, &rtu->irq_select);
+}
+
+
+/**
+ * @brief set the timer's latch bit
+ * @param rtu a struct grtimer_unit
+ */
+
+void grtimer_enable_latch(struct grtimer_unit *rtu)
+{
+	uint32_t config;
+
+	config  = ioread32be(&rtu->config);
+	config |= LEON3_GRTIMER_CFG_LATCH;
+
+	iowrite32be(config, &rtu->config);
+}
+
+/**
+ * @brief get the latch value of a grtimer
+ * @param rtu a struct grtimer_unit
+ * @param timer the selected timer
+ */
+
+uint32_t grtimer_get_latch_value(struct grtimer_unit *rtu, uint32_t timer)
+{
+	return ioread32be(&rtu->timer[timer].latch_value);
+}
diff --git a/IBSW/lib/timing/leon3_grtimer_longcount.c b/IBSW/lib/timing/leon3_grtimer_longcount.c
new file mode 100644
index 0000000..9576981
--- /dev/null
+++ b/IBSW/lib/timing/leon3_grtimer_longcount.c
@@ -0,0 +1,203 @@
+/**
+ * @file   leon3_grtimer_longcount.c
+ * @ingroup timing
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   July, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief implements a long-counting (uptime) clock using the LEON3 GRTIMER
+ *
+ */
+
+
+#include <timing.h>
+#include <leon3_grtimer.h>
+
+#include <leon/irq.h>
+#include <leon/irq_dispatch.h>
+#include <sysctl.h>
+
+
+
+
+/**
+ * @brief enable long count timer
+ * @param rtu a struct grtimer_unit
+ * @param reload a scaler reload value
+ * @param fine_ticks_per_sec a timer reload value in ticks per second
+ * @param coarse_ticks_max a timer reload value in ticks per second
+ *
+ * If properly configured, grtimer[0] will hold fractions of a second and
+ * grtimer[1] will be in seconds, counting down from coarse_ticks_max
+ *
+ * @return -1 if fine_ticks_per_sec is not an integer multiple of scaler_reload,
+ *          0 otherwise
+ *
+ * @note the return value warns about a configuration error, but will still
+ *	 accept the input
+ */
+
+
+int32_t grtimer_longcount_start(struct grtimer_unit *rtu,
+				uint32_t scaler_reload,
+				uint32_t fine_ticks_per_sec,
+				uint32_t coarse_ticks_max)
+{
+	grtimer_set_scaler_reload(rtu, scaler_reload);
+	grtimer_set_reload(rtu, 0, fine_ticks_per_sec);
+	grtimer_set_reload(rtu, 1, coarse_ticks_max);
+
+	grtimer_set_load(rtu, 0);
+	grtimer_set_load(rtu, 1);
+
+	grtimer_set_restart(rtu, 0);
+	grtimer_set_restart(rtu, 1);
+
+	grtimer_set_chained(rtu, 1);
+
+	grtimer_set_enabled(rtu, 0);
+	grtimer_set_enabled(rtu, 1);
+
+	grtimer_enable_latch(rtu);
+
+	/* not an integer multiple, clock will drift */
+	if (fine_ticks_per_sec % scaler_reload)
+		return -1;
+
+	return 0;
+}
+
+
+/**
+ * @brief get the time since the long counting grtimer was started
+ * @param rtu a struct grtimer_unit
+ * @param up a struct grtimer_uptime
+ * @note  if configured properly, fine will be in cpu cycles and coarse will
+ *        be in seconds
+ */
+
+void grtimer_longcount_get_uptime(struct grtimer_unit *rtu,
+				  struct grtimer_uptime *up)
+{
+	uint32_t sc;
+	uint32_t t0, t0a, t0b, t0c;
+	uint32_t t1, t1a, t1b, t1c;
+	uint32_t r0;
+	uint32_t r1;
+
+
+	sc = ioread32be(&rtu->scaler_reload);
+
+	t0a = ioread32be(&rtu->timer[0].value);
+	t1a = ioread32be(&rtu->timer[1].value);
+
+	t0b = ioread32be(&rtu->timer[0].value);
+	t1b = ioread32be(&rtu->timer[1].value);
+
+	t0c = ioread32be(&rtu->timer[0].value);
+	t1c = ioread32be(&rtu->timer[1].value);
+
+	if ((t0a >= t0b) && (t1a >= t1b))
+	  {
+	    t0 = t0a;
+	    t1 = t1a;
+	  }
+	else
+	  {
+	    t0 = t0c;
+	    t1 = t1c;
+	  }
+
+	r0 = ioread32be(&rtu->timer[0].reload);
+	r1 = ioread32be(&rtu->timer[1].reload);
+
+	up->fine   = (r0 - t0) * (sc + 1);
+	up->coarse = (r1 - t1);
+}
+
+
+/**
+ * @brief
+ *	get the number of seconds elapsed between timestamps taken from the
+ *	longcount timer
+ *
+ * @brief param time1 a struct grtime_uptime
+ * @brief param time0 a struct grtime_uptime
+ *
+ * @return time difference in seconds represented as double
+ */
+
+double grtimer_longcount_difftime(struct grtimer_unit *rtu,
+				  struct grtimer_uptime time1,
+				  struct grtimer_uptime time0)
+{
+	uint32_t sc;
+	uint32_t rl;
+	double cpu_freq;
+
+	double t0;
+	double t1;
+
+
+	sc = grtimer_get_scaler_reload(rtu);
+	rl = grtimer_get_reload(rtu, 0);
+
+	cpu_freq = (double) (sc + 1) * rl;
+
+	t0 = (double) time0.coarse + (double) time0.fine / cpu_freq;
+	t1 = (double) time1.coarse + (double) time1.fine / cpu_freq;
+
+	return t1 - t0;
+}
+
+
+
+
+/**
+ * @brief get the time since last latch occured in cpu cycles
+ * @param rtu a struct grtimer_unit
+ * @note does not compensate for function overhead
+ */
+
+uint32_t grtimer_longcount_get_latch_time_diff(struct grtimer_unit *rtu)
+{
+	uint32_t t0;
+	uint32_t t1;
+
+	uint32_t t0_latch;
+	uint32_t t1_latch;
+
+	uint32_t t0_reload;
+	uint32_t t0_scaler;
+
+	uint32_t diff;
+
+
+
+	t0_latch  = grtimer_get_latch_value(rtu, 0);
+	t1_latch  = grtimer_get_latch_value(rtu, 1);
+	t0_reload = grtimer_get_reload(rtu, 0);
+	t0_scaler = grtimer_get_scaler_reload(rtu);
+
+	t0 = grtimer_get_value(rtu, 0);
+	t1 = grtimer_get_value(rtu, 1);
+
+	diff = (t1_latch - t1) * t0_reload * (t0_scaler + 1);
+
+	if (t0 < t0_latch)
+		diff += (t0_latch  - t0);
+	else
+		diff += (t0_reload - t0);
+
+
+	return diff;
+}
diff --git a/IBSW/lib/timing/syncpulse.c b/IBSW/lib/timing/syncpulse.c
new file mode 100644
index 0000000..0b3549f
--- /dev/null
+++ b/IBSW/lib/timing/syncpulse.c
@@ -0,0 +1,248 @@
+/**
+ * @file   syncpulse.c
+ * @ingroup timing
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   July, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief implements 1553/SpW synchronisation and IASW notifications
+ */
+
+
+#include <timing.h>
+#include <syncpulse.h>
+#include <leon3_gptimer.h>
+#include <event_report.h>
+
+/**
+ * @brief send a tick-in signal on a SpW link
+ *
+ * @param timekeeper a struct time_keeper
+ */
+
+static void syncpulse_spw_tick(struct time_keeper *time)
+{
+	if (time->tick_in) {
+		if (time->spw)
+			grspw2_tick_in(time->spw);
+		/* Mantis 2073: we don't disable the tick, but keep it alive */
+		/* syncpulse_disable_spw_tick(time); */
+	}
+}
+
+
+/**
+ * @brief configure the syncpulse gpio port
+ * @brief port the i/o port to configure
+ * @brief gpio_base_addr the address of the gpio base register
+ */
+
+void syncpulse_configure_gpio(uint32_t port, uint32_t gpio_base_addr)
+{
+	uint32_t flag;
+
+	struct leon3_grgpio_registermap *gpio;
+
+
+	gpio = (struct leon3_grgpio_registermap *) gpio_base_addr;
+
+	flag = (1 << port);
+
+	/* disable output on pin 6 */
+	gpio->ioport_direction &= ~flag;
+
+	gpio->irq_mask     |= flag;
+	gpio->irq_polarity |= flag;
+	gpio->irq_edge     |= flag;
+}
+
+
+/**
+ * @brief sync pulse callback that needs to be attached to the corresponding
+ *	  interrupt; since we cannot receive the sync pulse with the GR712RC
+ *	  board, we attach it to the sync with dataword event of the 1553 driver
+ *	  for the time being
+ * @param userdata a pointer to arbitrary data (target must be a
+ *        struct time_keeper)
+ * @note the API of this function varies depending on whether the sync pulse
+ *       is available on the target device or if it is emulated via
+ *       minor frame 0 of the 1553 bus
+ */
+
+
+int32_t syncpulse(void *userdata)
+{
+	struct time_keeper *time = (struct time_keeper *) userdata;
+	{
+		/* restart IASW notification cycle */
+		gptimer_start(time->ptu, 2, T_CYC1);
+
+		/* synchronise missing pulse timer to current syncpulse */
+		gptimer_start(time->ptu, 1, GPTIMER_TICKS_PER_SEC + T_SYNC_TOL);
+		time->pulse_missed = 0;
+
+		if (likely(time->cuc_recv)) {
+			timekeeper_set_cuc_time(time);
+
+			if (unlikely(!time->synced)) {
+				as250_synchronized(time->brm);
+				time->synced = 1;
+				time->sync_status(time->synced);
+			}
+
+		} else {
+			as250_desynchronized(time->brm);
+			time->synced = 0;
+			time->sync_status(time->synced);
+			time->miltime_desync_cnt++;
+			event_report(SYNC, MEDIUM, 0);
+
+		}
+
+		syncpulse_spw_tick(time);
+
+		time->notify_cnt = 0;
+		time->cuc_recv   = 0;
+	}
+
+	return 0;
+}
+
+
+int32_t syncpulse_missed(void *userdata)
+{
+	struct time_keeper *time = (struct time_keeper *) userdata;
+
+
+	/* restart IASW notification cycle */
+	gptimer_start(time->ptu, 2, T_CYC1 - T_SYNC_TOL);
+
+	/* reconfigure timer to do one-second ticks */
+	if (unlikely(!time->pulse_missed)) {
+		gptimer_start_cyclical(time->ptu, 1, GPTIMER_TICKS_PER_SEC);
+		as250_desynchronized(time->brm);
+		time->synced = 0;
+		time->sync_status(time->synced);
+		event_report(SYNC, MEDIUM, 0);
+	}
+
+	time->pulse_missed = 1;
+
+	/* set time for when pulse should have arrived */
+	if (likely(time->cuc_recv))
+		timekeeper_set_cuc_time(time);
+	else /* not even time arrived */
+		time->miltime_desync_cnt++;
+
+	time->pulse_desync_cnt++;
+
+	/* keep ticking on sync loss */
+	syncpulse_spw_tick(time);
+
+	time->notify_cnt = 0;
+	time->cuc_recv   = 0;
+
+	return 0;
+}
+
+
+
+/**
+ * @brief set a callback to propagate the time synchronisation status
+ * @param time a struct time_kepper
+ * @param sync_status a function callback
+ */
+
+void syncpulse_status_set_callback(struct time_keeper *time,
+				   void (*sync_status)(uint32_t sync))
+{
+	time->sync_status = sync_status;
+}
+
+
+/**
+ * @brief enable SpW tick_in
+ * @param time a struct time_kepper
+ */
+
+void syncpulse_enable_spw_tick(struct time_keeper *time)
+{
+	time->tick_in = 1;
+}
+
+
+/**
+ * @brief disable SpW tick_in
+ * @param time a struct time_kepper
+ */
+
+void syncpulse_disable_spw_tick(struct time_keeper *time)
+{
+	time->tick_in = 0;
+}
+
+
+
+/**
+ * @brief get the time at the (supposed) next sync pulse which corresponds
+ *        to the time of the next SpW tick in
+ * @param time a struct time_keeper
+ * @param[out] coarse_time a variable to write the coarse time to
+ * @param[out] fine_time a variable to write the fine time to
+ *
+ * @note the next syncpulse time is always the local cuc coarse time + 1 second
+ *       since the actual *current* time within a 1 second period
+ *       is dynamically calculated from the long count timer
+ *       Once this function is called, the SpW tick_in will be emitted every
+ *       sync pulse (or its emulation) until explicitly disabled.
+ *
+ */
+
+void syncpulse_spw_get_next_time(struct time_keeper *time,
+				 uint32_t *coarse_time,
+				 uint32_t *fine_time)
+{
+	(*coarse_time) = time->cuc_coarse + 1;
+	(*fine_time)   = time->cuc_fine;
+
+	syncpulse_enable_spw_tick(time);
+}
+
+
+
+/**
+ * @brief notification timer callback
+ * @param userdata a pointer to arbitrary data (target must be a
+ *        struct time_keeper)
+ */
+
+int32_t syncpulse_notification_timer_underflow(void *userdata)
+{
+	struct time_keeper *time = (struct time_keeper *) userdata;
+
+
+	/* emit notification and restart timer */
+	if (likely(time->notify_cnt < IASW_CPS)) {
+
+		if (time->signal)
+			time->signal(time->userdata);
+
+		time->notify_cnt++;
+
+		gptimer_start(time->ptu, 2, T_CYC);
+	}
+
+	return 0;
+}
+
+
+
diff --git a/IBSW/lib/timing/timing.c b/IBSW/lib/timing/timing.c
new file mode 100644
index 0000000..e0affa4
--- /dev/null
+++ b/IBSW/lib/timing/timing.c
@@ -0,0 +1,358 @@
+/**
+ * @file   timing.c
+ * @ingroup timing
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   August, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @defgroup timing Timing and Watchdog
+ * @brief implements functions for Timing, Watchdog, 1553 Sync Pulse and
+ *	  SpW tick-in
+ *
+ *
+ *
+ * ## Overview
+ *
+ * This module implements access to the hardware timers found in the GR712RC as
+ * well as time keeping and synchronisation with the OBC and the SEM
+ *
+ * ## Mode of Operation
+ *
+ * ### Uptime Clock
+ *
+ * The BEE hardware does not include a real-time clock, so a long counting
+ * uptime reference timer is implemented using the _General Purpose Timer with
+ * Latch Capability_ of the GR712RC.
+ *
+ * The timers are used in chained mode, so that an underflow in the first timer
+ * causes the second timer's value to be decremented (see figure below).
+ * The reload value of the first timer and the reload value of the prescaler are
+ * selected such that their product is equal to the frequency of the CPU.
+ * This causes the first timer to underflow with a one second period. Thereby
+ * decrementing the second timer, which counts down from its initial reload
+ * value in one second decrements.
+ *
+ * The resolution of the first timer is determined by the cpu clock frequency
+ * and the chosen prescaler reload value. The smallest allowed prescaler value
+ * of this particular timer subsystem is 3. Given a clock frequency of
+ * _25 MHz_, the smallest possible prescale division factor is _4_, with
+ * a timer reload value of _6250000_. The best achievable accuracy in the
+ * uptime is therefore no better than __6.25 µs__.
+ *
+ *
+ * @startuml {grtimer_longcount.svg} "Uptime clock" width=10
+ *
+ * control "-1" as sc
+ * control "-1" as t0
+ * control "-1" as t1
+ * [prescaler reload] -down-> [prescaler value]
+ * [timer 0 reload]   -down-> [timer 0 value]
+ * [timer 1 reload]   -down-> [timer 1 value]
+ * [cpu cycle]         ->     [prescaler value] : tick
+ * [prescaler value]  -down-> sc
+ * sc                  -up->   [prescaler value]
+ * [prescaler value]   ->     [timer 0 value]	: tick
+ * [timer 0 value]    -down-> t0
+ * t0                 -up->   [timer 0 value]
+ * [timer 0 value] -> [timer 1 value]		: tick
+ * [timer 1 value]    -down-> t1
+ * t1                 -up->   [timer 1 value]
+ *
+ *
+ * @enduml
+ *
+ * @see _GR712RC user manual v2.7 chapter 11_ for information on the timer unit
+ *
+ *
+ * ### Current Time
+ *
+ * The current system time is calculated from the last time update performed.
+ * The difference between the current uptime and the reference
+ * time stamp recorded during the sync pulse event (see below) is added to the
+ * corresponding CUC time stamp written by the OBC via the 1553 link and
+ * returned to the user.
+ *
+ *
+ * ### 1553 Time Update, Sync Pulse and SpaceWire tick-in
+ *
+ * The 1553 direct time message used to determine the system time is written by
+ * the bus controller in _minor frame number 10_. The time is recorded and
+ * updated following either an external synchronisation pulse event or the
+ * timer-based pulse-emulated in case of a defect.
+ *
+ * At the sync event, the new time message replaces the previous one and a
+ * reference timestamp is taken from the uptime clock.
+ *
+ * The sync pulse is expected to occur periodically a one second intervals. In
+ * order to detect missing pulses, a timer with a period of one second plus a
+ * tolerance value is reloaded on every pulse. If the timer underflows, it is
+ * reconfigured to auto-reset every second and execute the same actions that
+ * would otherwise be triggered by a pulse.
+ *
+ * The synchronisation tick-in signal to the SEM is chained to the sync pulse
+ * action and self-disables when executed. This is done so that one time message
+ * sent corresponds to one tick-in generated.
+ *
+ *
+ * @startuml {syncpulse.svg} "External syncpulse event" width=10
+ *
+ * start
+ * :pulse;
+ * :start notification timer;
+ * :start pulse timeout;
+*
+ * if (CUC received) then (yes)
+ *	:set CUC time;
+ * else
+ *	:set status unsynched;
+ * endif
+ *
+ * :execute SpW tick;
+ *
+ * :clear counters and flags;
+ *
+ * stop
+ * @enduml
+ *
+ *
+ * @startuml {syncpulse_missed.svg} "Missed syncpulse event" width=10
+ *
+ * start
+ * :timeout;
+ * :start notification timer;
+ *
+ * if (not emulating) then (yes)
+ *	:configure sync emulation;
+ *	:set status unsynched;
+ * endif
+ *
+ * if (CUC received) then (yes)
+	:set CUC time;
+ * endif
+ *
+ * :execute SpW tick;
+ *
+ * :clear counters and flags;
+ * stop
+ * @enduml
+ *
+ *
+ * ### Cyclical Notification
+ *
+ *
+ * The cyclical notification timer must be started once per one second period by
+ * an external trigger (sync pulse or emulation) and then executes a
+ * notification and restarts itself until the given number of cycles have
+ * passed.
+ *
+ * @startuml {notification_timer.svg} "Notification timer" width=10
+ *
+ * start
+ * if (notifications < max) then (yes)
+ *	:execute callback;
+ *	:update counter;
+ *	:restart notification timer;
+ * endif
+ * stop
+ * @enduml
+ *
+ * @note
+ *	The notification period is restarted if the external sync pulse is
+ *	generated while the emulation is running, i.e. the next notification can
+ *	occur any time between _T_CYC1_ and _T_CYC1+T_CYC_ with regard to the
+ *	previous one.
+ *
+ *
+ * ## Error Handling
+ *
+ * Missing sync pulse detection and emulation is the only timer-related FDIR
+ * performed.
+ *
+ * The number of missed sync pulses are counted, but not reported. Missed time
+ * messages written by the 1553 bus are counted as well, but this is effectively
+ * dead code and only implemented to fulfill an external requirement, as this
+ * situation is only conceivable if the hardware-executed 1553 BC framing is
+ * intentionally reconfigured or not functional at all, i.e. the OBC is at
+ * least partially defective and communication with the BEE therefore most
+ * likely not possible.
+ *
+ *
+ * ## Notes
+ *
+ */
+
+
+#include <timing.h>
+#include <leon3_gptimer.h>
+#include <leon3_grtimer.h>
+#include <leon3_grtimer_longcount.h>
+#include <string.h>
+
+#include <leon/irq.h>
+#include <leon/irq_dispatch.h>
+#include <sysctl.h>
+
+
+
+/**
+ * @brief initialise the timer structure and configure timers
+ * @param time a struct time_kepper
+ * @param ptu a struct gptimer_unit
+ * @param rtu a struct grtimer_unit
+ * @param brm a struct brm_config
+ * @param spw a struct grspw2_core_cfg
+ */
+
+void timekeeper_init(struct time_keeper *time,
+		     struct gptimer_unit *ptu,
+		     struct grtimer_unit *rtu,
+		     struct brm_config *brm,
+		     struct grspw2_core_cfg *spw)
+{
+
+	bzero((void *) time, sizeof(struct time_keeper));
+
+	time->ptu = ptu;
+	time->rtu = rtu;
+
+	time->brm = brm;
+	time->spw = spw;
+
+	grtimer_longcount_start(time->rtu, GRTIMER_RELOAD,
+				GRTIMER_TICKS_PER_SEC, GRTIMER_MAX);
+
+	gptimer_set_scaler_reload(time->ptu, GPTIMER_RELOAD);
+}
+
+
+/**
+ * @brief set the notification signal callback
+ * @param time a struct time_kepper
+ * @param signal a function callback
+ * @param userdata a pointer to arbitrary userdata
+ */
+
+void timekeeper_set_signal_callback(struct time_keeper *time,
+				    void (*signal)(void *userdata),
+				    void *userdata)
+{
+	time->signal   = signal;
+	time->userdata = userdata;
+}
+
+
+/**
+ * @brief callback for the 1553 time event
+ * @param coarse_time the coarse time to set
+ * @param fine_time the fine time to set
+ * @param userdata a pointer to arbitrary data (target must be a
+ *        struct time_keeper)
+ */
+
+void timekeeper_set_1553_time(uint32_t coarse_time,
+			      uint32_t fine_time,
+			      void *userdata)
+{
+	double res;
+
+	struct time_keeper *time = (struct time_keeper *) userdata;
+
+
+	/* convert 24 bits of fine time to be in cpu cycles.
+	 * we can't avoid using the FPU while in interrupt mode (but we only
+	 * do it once per second), because even when shifting, we would lose
+	 * at least bits of accuracy during an integer-only conversion
+	 */
+
+	res = ((double) fine_time) / ((double) 0xffffff) * ((double) CPU_CPS);
+
+	time->mil_cuc_coarse = coarse_time;
+	time->mil_cuc_fine   = (uint32_t) res;
+	time->cuc_recv       = 1;
+}
+
+
+/**
+ * @brief sets local time to cuc time, also updates last sync time stamp
+ * @param time a struct time_keeper
+ *
+ * @note TIMEKEEPER_CORRECT_FOR_LATCHTIME has been removed
+ */
+
+void timekeeper_set_cuc_time(struct time_keeper *time)
+{
+	struct grtimer_uptime up;
+
+
+	grtimer_longcount_get_uptime(time->rtu, &up);
+
+	time->synctime.coarse  = up.coarse;
+	time->synctime.fine    = up.fine;
+
+	time->cuc_coarse = time->mil_cuc_coarse;
+	time->cuc_fine   = time->mil_cuc_fine;
+}
+
+
+/**
+ * @brief get current time relative to last CUC packet sent by the 1553 BC
+ * @param time a struct time_keeper
+ * @param[out] coarse_time a variable to write the coarse time to
+ * @param[out] fine_time a variable to write the fine time to
+ * @note  needs timer to be configured correctly so that the "coarse" timer is
+ *        chained to the fine timer "fine" timer which underflows
+ *        in a 1 second cycle
+ * @note  There is a possible race condition: as @ref timekeeper_set_cuc_time 
+ *        is called from an ISR and @ref timekeeper_get_current_time can be 
+ *        called from any task, the coarse and fine time parts might not be 
+ *        from the same timestamp. However, @ref set_cuc_time is only used by 
+ *        the "syncpulse" and "syncpulse_missed". Both are called only when 
+ *        the IASW has finished with cycle 8 and before cycle 1. 
+ *        @ref timekeeper_get_current_time is either called by the 
+ *        @ref CrIbGetCurrentTime, or by the @ref CrIbCrIbResetDPU function. 
+ *        These two are never called during the time slot in question, 
+ *        therefore the need to guarantee the atomicity of the operation can 
+ *        be relaxed. 
+ */
+
+void timekeeper_get_current_time(struct time_keeper *time,
+				 uint32_t *coarse_time,
+				 uint32_t *fine_time)
+{
+	uint32_t sc;
+	uint32_t rl;
+	uint32_t coarse;
+	uint32_t fine;
+
+
+	struct grtimer_uptime up;
+
+	sc = grtimer_get_scaler_reload(time->rtu);
+	rl = grtimer_get_reload(time->rtu, 0);
+
+	grtimer_longcount_get_uptime(time->rtu, &up);
+
+	coarse = time->cuc_coarse + (up.coarse - time->synctime.coarse);
+
+	if (up.fine > time->synctime.fine) {
+		fine = up.fine - time->synctime.fine;
+	} else {
+		coarse--;	/* diff in fine time > 1 second */
+		fine = up.fine + ((sc + 1) * rl - time->synctime.fine);
+	}
+
+	fine += time->cuc_fine;
+
+
+	(*coarse_time) = coarse;
+	(*fine_time)   = fine;
+}
diff --git a/IBSW/lib/timing/watchdog.c b/IBSW/lib/timing/watchdog.c
new file mode 100644
index 0000000..4e1cd4a
--- /dev/null
+++ b/IBSW/lib/timing/watchdog.c
@@ -0,0 +1,88 @@
+/**
+ * @file   watchdog.c
+ * @ingroup timing
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at),
+ * @date   July, 2016
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @brief implements a watchdog using the LEON3 GPTIMER
+ */
+
+
+#include <leon/irq.h>
+#include <leon/irq_dispatch.h>
+
+#include <watchdog.h>
+#include <leon3_gptimer.h>
+
+
+
+/**
+ * @brief the watchdog irq is triggered
+ * @param userdata a pointer to arbitrary data (target must be a
+ *        struct time_keeper)
+ */
+
+static int32_t watchdog_bark(void *userdata)
+{
+	struct time_keeper *time;
+
+	time = (struct time_keeper *) userdata;
+
+	if (time->bark)
+		time->bark();
+
+	return 0;
+}
+
+
+/**
+ * @brief enable the watchdog timer
+ * @param time a struct time_keeper
+ * @param shutdown_callback a function to call when the watchdog barks
+ *
+ */
+
+void watchdog_enable(struct time_keeper *time, void (*shutdown_callback)(void))
+{
+	time->bark = shutdown_callback;
+	irl1_register_callback(GR712_IRL1_GPTIMER_3, PRIORITY_NOW,
+			       &watchdog_bark, time);
+	gptimer_start(time->ptu, 3, T_WATCHDOG);
+	time->watchdog_enabled = 1;
+}
+
+
+/**
+ * @brief disable the watchdog timer
+ * @param time a struct time_keeper
+ */
+
+void watchdog_disable(struct time_keeper *time)
+{
+	gptimer_clear_enabled(time->ptu, 3);
+	irl1_deregister_callback(GR712_IRL1_GPTIMER_3, &watchdog_bark, time);
+	time->bark = NULL;
+	time->watchdog_enabled = 0;
+}
+
+
+/**
+ * @brief feed the watchdog
+ * @param time a struct time_keeper
+ */
+
+void watchdog_feed(struct time_keeper *time)
+{
+	gptimer_set_load(time->ptu, 3);
+}
+
diff --git a/IBSW/lib/traps.c b/IBSW/lib/traps.c
new file mode 100644
index 0000000..12e64fd
--- /dev/null
+++ b/IBSW/lib/traps.c
@@ -0,0 +1,120 @@
+/**
+ * @file   traps.c
+ * @ingroup traps
+ * @author Armin Luntzer (armin.luntzer@univie.ac.at)
+ * @author Linus Torvalds et al.
+ * @date   September, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @defgroup traps Trap Table access
+ * @brief Implements functionality to access or modify SPARC v8 MVT trap
+ *	  table entries
+ *
+ *
+ *
+ * ## Overview
+ *
+ * This module implements functionality to access or modify SPARC v8 MVT trap
+ * table entries.
+ *
+ * ## Mode of Operation
+ *
+ * None
+ *
+ * ## Error Handling
+ *
+ * None
+ *
+ * ## Notes
+ *
+ * - functionality will be added as needed
+ *
+ *
+ */
+
+#include <stdint.h>
+
+#include <io.h>
+#include <compiler.h>
+
+
+/**
+ * @brief installs a trap handler that executes a long jump
+ *
+ * @param trap a trap entry number
+ * @param handler a function to call when the trap is triggerd
+ *
+ * @note I'm not sure why this must be nested in another function call. If it
+ *       isn't, the trap entry seemingly does not update properly. It might have
+ *       to do with the rotation of the register window or some caching
+ *       mechanism I'm not aware of at this time. The writes to the table are
+ *       uncached, so the data cache is likely not the issue, and flusing it
+ *       won't do anything either. When not nested in a wrapper, it however
+ *       appears to work as expected if a function that in turn calls a
+ *       function is executed after the trap entry is written - but it does not
+ *       if the same function is called after this one has returned. O.o
+ *
+ * Installs a custom handler into a specified trap table entry. Note that it is
+ * not possible to install just any function, since traps are disabled when the
+ * call is executed and any further trap (such as window over/underflow) will
+ * force the processor to jump to trap 0 (i.e. reset). See lib/asm/trace_trap.S
+ * for a working example.
+ *
+ *
+ */
+
+static void trap_longjump_install(uint32_t trap, void (*handler)())
+{
+	uint32_t *trap_base;
+	uint32_t tbr;
+	uint32_t h;
+
+
+	h = (unsigned int) handler;
+
+	/* extract the trap table address from %tbr (skips lower bits 0-11) */
+	__asm__ __volatile__("rd %%tbr, %0" : "=r" (tbr));
+
+	/* calculate offset to trap, each entry is 4 machine words long */
+	trap_base = (uint32_t *)((tbr & ~0xfff) + (trap << 4));
+
+	/* set up the trap entry:
+	 * 0x29000000 sethi %hi(handler), %l4
+	 * 0x81c52000 jmpl  %l4 + %lo(handler), %g0
+	 * 0x01000000 rd    %psr, %l0
+	 * 0x01000000 nop
+	 */
+	iowrite32be(((h >> 10) & 0x3fffff) | 0x29000000, trap_base + 0);
+	iowrite32be((h        &    0x3ff) | 0x81c52000, trap_base + 1);
+	iowrite32be(0xa1480000,                         trap_base + 2);
+	iowrite32be(0x01000000,                         trap_base + 3);
+
+	barrier();
+}
+
+/**
+ * @brief installs a custom trap handler
+ *
+ * @param trap a trap entry number
+ * @param handler a function to call when the trap is triggerd
+ *
+ * Installs a custom handler into a specified trap table entry. Note that it is
+ * not possible to install just any function, since traps are disabled when the
+ * call is executed and any further trap (such as window over/underflow) will
+ * force the processor to jump to trap 0 (i.e. reset). See lib/asm/trace_trap.S
+ * for a working example.
+ */
+
+void trap_handler_install(uint32_t trap, void (*handler)())
+{
+	trap_longjump_install(trap, handler);
+}
diff --git a/IBSW/lib/wrap_malloc.c b/IBSW/lib/wrap_malloc.c
new file mode 100644
index 0000000..5aec741
--- /dev/null
+++ b/IBSW/lib/wrap_malloc.c
@@ -0,0 +1,289 @@
+/**
+ * @file    wrap_malloc.c
+ * @ingroup malloc_wrapper
+ * @author  Armin Luntzer (armin.luntzer@univie.ac.at)
+ *	    Roland Ottensamer (roland.ottensamer@univie.ac.at)
+ * @date    August, 2015
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * @defgroup malloc_wrapper Basic memory management
+ *
+ * @brief wraps malloc() and does some internal memory management according to
+ *        a predefined memory map
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <wrap_malloc.h>
+#include <sysctl.h>
+
+
+static uint32_t heap;
+static uint32_t heap_end;
+static uint32_t semevt;
+static uint32_t semevt_end;
+static uint32_t hkstore;
+static uint32_t hkstore_end;
+static uint32_t flash;
+static uint32_t flash_end;
+static uint32_t aux;
+static uint32_t aux_end;
+static uint32_t res;
+static uint32_t res_end;
+static uint32_t swap;
+static uint32_t swap_end;
+static uint32_t sdb;
+static uint32_t sdb_end;
+
+#define UINT32_T_FORMAT		"%lu"
+
+
+static ssize_t malloc_show(__attribute__((unused)) struct sysobj *sobj,
+			   __attribute__((unused)) struct sobj_attribute *sattr,
+			    char *buf)
+{
+	if (!strcmp(sattr->name, "heap"))
+		return sprintf(buf, UINT32_T_FORMAT, (heap - SRAM1_HEAP_ADDR));
+
+	if (!strcmp(sattr->name, "semevt"))
+		return sprintf(buf, UINT32_T_FORMAT, (semevt - SRAM1_SEMEVTS_ADDR));
+
+	if (!strcmp(sattr->name, "hkstore"))
+		return sprintf(buf, UINT32_T_FORMAT, (hkstore - SRAM1_HKSTORE_ADDR));
+
+	if (!strcmp(sattr->name, "flash"))
+		return sprintf(buf, UINT32_T_FORMAT, (flash - SRAM1_FLASH_ADDR));
+
+	if (!strcmp(sattr->name, "aux"))
+		return sprintf(buf, UINT32_T_FORMAT, (aux - SRAM1_AUX_ADDR));
+
+	if (!strcmp(sattr->name, "res"))
+		return sprintf(buf, UINT32_T_FORMAT, (res - SRAM1_RES_ADDR));
+
+	if (!strcmp(sattr->name, "swap"))
+		return sprintf(buf, UINT32_T_FORMAT, (swap - SRAM1_SWAP_ADDR));
+
+	if (!strcmp(sattr->name, "sdb"))
+		return sprintf(buf, UINT32_T_FORMAT, (sdb - SRAM2_SDB_ADDR));
+
+	return 0;
+}
+
+
+__extension__
+static struct sobj_attribute malloc_attr[] = {
+	__ATTR(heap,    malloc_show, NULL), __ATTR(semevt, malloc_show, NULL),
+	__ATTR(hkstore, malloc_show, NULL), __ATTR(flash,  malloc_show, NULL),
+	__ATTR(aux,     malloc_show, NULL), __ATTR(res,    malloc_show, NULL),
+	__ATTR(swap,    malloc_show, NULL), __ATTR(sdb,     malloc_show, NULL),
+	};
+
+__extension__
+static struct sobj_attribute *malloc_attributes[] = {
+	&malloc_attr[0],  &malloc_attr[1],
+	&malloc_attr[2],  &malloc_attr[3],
+	&malloc_attr[4],  &malloc_attr[5],
+	&malloc_attr[6],  &malloc_attr[7],
+	NULL};
+
+/**
+ * @brief add memory object to syscfg tree
+ *
+ * @return -1 on error, 0 otherwise
+ *
+ * @note  this has to be delayed, because malloc needs to be initialied
+ *        before the syscfg tree can be initialised and populated
+ */
+
+int32_t malloc_enable_syscfg(void)
+{
+	struct sysobj *sobj;
+
+
+	sobj = sysobj_create();
+
+	if (!sobj)
+		return -1;
+
+	sobj->sattr = malloc_attributes;
+
+	sysobj_add(sobj, NULL, sys_set, "mem");
+
+	return 0;
+}
+
+
+/**
+ * @brief memory allocator for different ram areas
+ * @param size the amount of bytes to allocate
+ * @param ram the id of the ram block to allocate space in
+ */
+
+void *alloc(uint32_t size, enum ram_block ram)
+{
+	uint32_t end = 0;
+
+	uint32_t *mem = NULL;
+	uint32_t tmp;
+
+
+#if (__sparc__)
+	static uint32_t init;
+
+
+	if (!init) {
+		heap        = SRAM1_HEAP_ADDR;
+		semevt      = SRAM1_SEMEVTS_ADDR;
+		hkstore     = SRAM1_HKSTORE_ADDR;
+		flash       = SRAM1_FLASH_ADDR;
+		aux         = SRAM1_AUX_ADDR;
+		res         = SRAM1_RES_ADDR;
+		swap        = SRAM1_SWAP_ADDR;
+		sdb         = SRAM2_SDB_ADDR;
+
+		heap_end    = SRAM1_HEAP_ADDR    + SRAM1_HEAP_SIZE;
+		semevt_end  = SRAM1_SEMEVTS_ADDR + SRAM1_SEMEVTS_SIZE;
+		hkstore_end = SRAM1_HKSTORE_ADDR + SRAM1_HKSTORE_SIZE;
+		flash_end   = SRAM1_FLASH_ADDR   + SRAM1_FLASH_SIZE;
+		aux_end     = SRAM1_AUX_ADDR     + SRAM1_AUX_SIZE;
+		res_end     = SRAM1_RES_ADDR     + SRAM1_RES_SIZE;
+		swap_end    = SRAM1_SWAP_ADDR    + SRAM1_SWAP_SIZE;
+		sdb_end     = SRAM2_SDB_ADDR     + SRAM2_SDB_SIZE;
+
+		init = 1;
+	}
+#endif
+
+	if (!size)
+		return 0;
+
+	switch (ram) {
+
+	case HEAP:
+		mem = &heap;
+		end = heap_end;
+		break;
+	case SEMEVTS:
+		mem = &semevt;
+		end = semevt_end;
+		break;
+	case HKSTORE:
+		mem = &hkstore;
+		end = hkstore_end;
+		break;
+	case FLASH:
+		mem = &flash;
+		end = flash_end;
+		break;
+	case AUX:
+		mem = &aux;
+		end = aux_end;
+		break;
+	case RES:
+		mem = &res;
+		end = res_end;
+		break;
+	case SWAP:
+		mem = &swap;
+		end = swap_end;
+		break;
+	case SDB:
+		mem = &sdb;
+		end = sdb_end;
+		break;
+	default:
+		return NULL;
+	}
+
+	tmp = (*mem);
+
+	/* align start address to MEM_ALIGN byte boundaries */
+	tmp = (tmp + (MEM_ALIGN - 1)) & 0xFFFFFFF8;
+
+	/* check if it fits inside buffer */
+	if ((tmp + size) <= end) { 
+		(*mem) = tmp + size;
+
+		return (void *)tmp; /* return the (modified) start address */
+	}
+
+	return NULL;
+}
+
+
+/**
+ * @brief resets the pointer of a particular memory memory segment; use with
+ * care
+ * @param ram the id of the ram block to reset
+ *
+ */
+
+void release(enum ram_block ram)
+{
+	switch (ram) {
+	case HEAP:
+		heap	= SRAM1_HEAP_ADDR;
+		break;
+	case SEMEVTS:
+		semevt  = SRAM1_SEMEVTS_ADDR;
+		break;
+	case HKSTORE:
+		hkstore = SRAM1_HKSTORE_ADDR;
+		break;
+	case FLASH:
+		flash   = SRAM1_FLASH_ADDR;
+		break;
+	case AUX:
+		aux	= SRAM1_AUX_ADDR;
+		break;
+	case RES:
+		res     = SRAM1_RES_ADDR;
+		break;
+	case SWAP:
+		swap    = SRAM1_SWAP_ADDR;
+		break;
+	case SDB:
+		sdb     = SRAM2_SDB_ADDR;
+		break;
+	default:
+		break;
+	}
+}
+
+
+/**
+ * @brief link time wrapper for malloc()
+ * @param size the amount of bytes to allocate
+ * @note needs linker flags to override: -Wl,--wrap=malloc
+ */
+#if (__sparc__)
+__attribute__((unused))
+void *__wrap_malloc(size_t size)
+{
+	return alloc((uint32_t) size, HEAP);
+}
+#endif
+
+#if (__sparc__)
+/**
+ * @brief a link-time wrapper to detect calls to free()
+ */
+
+__attribute__((unused))
+void __wrap_free(void __attribute__((unused)) *ptr)
+{
+}
+#endif
+
+
+
diff --git a/README.md b/README.md
index 299febf..c7b9dd9 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,25 @@
-# CHEOPS
+CHEOPS Instrument Application Software
+======================================
+Developed by the University of Vienna, Department of Astrophysics
 
+Version: 1.1 (ee8c36db)
+Date: Sep 25, 2018
+License: MPL2
+Point of contact: Roland Ottensamer <roland.ottensamer@univie.ac.at>
+
+This is the minimal set of source files to build the PC and the LEON version.
+In order to do so, use BCC 4.4.2 release 1.0.51 for the LEON and gcc for the PC: 
+
+> cd FwProfile
+> make
+> cd ..
+> cd CrIa
+> make ifsw-dpu
+> make ifsw-pc
+
+Notes:
+- it may be necessary to create an empty build directory CrIa/build first.
+- newer versions of gcc complain about a missing cast to double in AngleMethod.c
+
+Enjoy,
+RO
diff --git a/TargetAcquisition/src/AngleMethod.c b/TargetAcquisition/src/AngleMethod.c
new file mode 100644
index 0000000..c81b5f7
--- /dev/null
+++ b/TargetAcquisition/src/AngleMethod.c
@@ -0,0 +1,3020 @@
+/**
+* @file    AngleMethod.c
+* @author  Philipp Löschl (roland.ottensamer@univie.ac.at)
+* @date    July, 2017
+*
+* @defgroup AngleMethod Angle Method Algorithm
+* @ingroup TargetAcquisition
+*
+* @brief The Angle Method algorithm is used to identify target stars with the help of star constellation pattern recognition and is part of @ref TargetAcquisition.
+*
+*
+*
+* # Introduction
+* The Angle Method Algorithm (AMA) is a modified version of a technique that
+* was originally suggested as a pattern recognition method for star tracker
+* operation (REF LIEBE). It is independent of direct photometric measurements
+* on stars and uses geometrical properties of the star distributions around
+* the designated target star instead.
+* More precisely, the angular distances between a potential target star and two of its
+* neighbours are used in combination with the spherical angle at their vertex.
+* This triplet if information is used to create a unique fingerprint, that can
+* be matched with pre-calculated fingerprints in a reference star database. The
+* latter is observation specific and has to be created for each target star.
+*
+* As one of two available identification methods, AMA is intended for
+* acquisition procedures of non trivial identification cases where the
+* target star cannot easily be distinguished from other field stars by the
+* available photometric method. This will be the case for FOV with targets of
+* 10 mag or fainter, where the chance for misidentification with another star of
+* similar brightness is becoming a concern. (REF STAR STATISTICS).
+*
+*
+*
+* # Star Database
+* The Angle Method Algorithm uses star positions to obtain the geometrical
+* characteristics for an observation. While a dedicated @StarExtraction "Star Extraction"
+* routine locates the star positions on each image, the GAIA star catalogue is used
+* to provide a reference set of positions. These reference positions, along with
+* other control parameters for the AMA are transmitted to the satellite with the
+* Star Map Command (REF) for every single observation. The process to
+* create unique identifiers from those star catalogues is described below.
+*
+*
+* ## Fingerprint
+* All positions in the provided star catalogues are grouped with the target to
+* form star triplets, of which the relative distances between the target and the
+* two other stars and their vertex angle are used. The distances and angle of such
+* a triplet in their quantised form is what we call the __fingerprint__.
+* \n\n
+* Each fingerprint is made up from the combination of a __base star__ and two of
+* their neighbouring stars, which will be referred to as __1st and 2nd partner
+* stars__. While the partner stars can be any detectable star in the FOV, the
+* star that is to be identified by the algorithm is always chosen as the base star.
+* A collection of such fingerprints forms the star database.
+*
+*  An example can be seen in Fig.
+*
+*  @image html fingerprint.png "Fingerprint Example" width = 180px
+*
+* This shows a FOV with n=7 stars that are marked from A to G in order of their
+* Y,X coordinates as would be the case after the Star Extraction process. here
+* the target star (D) is in the center and marked as the base star (orange).
+* Star B serves as the 1st partner star (orange) and star C as the 2nd partner
+* star (blue). The used the distances between the base and the two partner
+* stars B and D are measured in CCD pixel and the angle at the vertex of the
+* base star (D) in degrees. They are marked as __edge 1__ (orange), __edge 2__
+* (blue) and angle __theta__ (red). Such a fingerprint will be described by the
+* triplet ([DB], [DC], θ(DBC)), where [DB] marks the distance between stars
+* B and C and θ(DBC) refers to the angle at the vertex D. The detailed
+* quantisation process will be explained for the creation of the
+* observed star database (REF).
+*
+* Note: Edge1 and edge2 are named base0 and base1 in the code as it predates
+*       a later change in nomenclature. This lack of creativity can be interpreted
+*       as another example of european astronomers' great naming capabilities.
+* \n\n\n
+*
+*
+* ## Reference Star Database
+* Identification with a single fingerprint only is prone to errors and can lead
+* to misidentificions. Therefore, all possible fingerprints are formed for the
+* edge that is represented by the base star (D) and its current 1st partner star
+* (B). This edge is also called the __base__ ([DB]) of a __set of fingerprints__.
+* The set consists of all (n-2) fingerprints that can be formed by combinig the
+* base with any available star as the 2nd partner. For the example in Fig (TBD)
+* it contains the following five fingerprints:
+*
+*<table>
+* <tr> <th>  Set for base [DB]\n
+* <tr> <td>([DB], [DA], θ(DBA)) \n
+* <tr> <td>([DB], [DC], θ(DBC)) \n
+* <tr> <td>([DB], [DE], θ(DBE)) \n
+* <tr> <td>([DB], [DF], θ(DBF)) \n
+* <tr> <td>([DB], [DG], θ(DBG)) \n
+*</table>
+*
+* Although the full set of fingerprints prevents the risk of misidentificions
+* due to single mismatched fingerprints, it does not address the problem of
+* potentially missing stars in the star positions, that are used to produce the
+* fingerprints. If the above set were provided to identify star D in an observation
+* were star B is not present, none of the fingerprints would be detected.
+* In order to conquer this problem the sets for fingerprints of the remaining
+* possible bases are also included to collectively form the __reference star
+* database__ (RFDB). Utilising all possible sets results in a total of
+* (n-1)*(n-2) fingerprints as can be seen below:
+*
+* <table>
+* <tr> <th> Set for base [DA]    <th>   Set for base [DB]  <th>   Set for base [DC]  <th>   Set for base [DE]  <th>   Set for base [DF]  <th>   Set for base [DG] \n
+* <tr> <td> ([DA], [DB], θ(DAB)) <td> ([DB], [DA], θ(DBA)) <td> ([DC], [DA], θ(DCA)) <td> ([DE], [DA], θ(DEA)) <td> ([DF], [DA], θ(DFA)) <td> ([DG], [DA], θ(DGA))\n
+* <tr> <td> ([DA], [DC], θ(DAC)) <td> ([DB], [DC], θ(DBC)) <td> ([DC], [DB], θ(DCB)) <td> ([DE], [DB], θ(DEB)) <td> ([DF], [DB], θ(DFB)) <td> ([DG], [DB], θ(DGB))\n
+* <tr> <td> ([DA], [DE], θ(DAE)) <td> ([DB], [DE], θ(DBE)) <td> ([DC], [DE], θ(DCE)) <td> ([DE], [DC], θ(DEC)) <td> ([DF], [DC], θ(DFC)) <td> ([DG], [DC], θ(DGC))\n
+* <tr> <td> ([DA], [DF], θ(DAF)) <td> ([DB], [DF], θ(DBF)) <td> ([DC], [DF], θ(DCF)) <td> ([DE], [DF], θ(DEF)) <td> ([DF], [DE], θ(DFE)) <td> ([DG], [DE], θ(DGE))\n
+* <tr> <td> ([DA], [DG], θ(DAG)) <td> ([DB], [DG], θ(DBG)) <td> ([DC], [DG], θ(DCG)) <td> ([DE], [DG], θ(DEG)) <td> ([DF], [DG], θ(DFG)) <td> ([DG], [DF], θ(DGF))\n
+* </table>
+* (@ref create_ref_DB "Create Reference Star Database")
+* \n
+* \n
+* ### Reference Stars
+* The stars for a reference database are chosen such that the covered sky
+* includes all possible orientations that could be observed by the spacecraft.
+* The star positions are provided by the GAIA star catalogue and considered
+* without error, since their positional uncertainty is magnitdues below the
+* accuracy of the @StarExtraction "Star Extraction". (REF + NUMBERS)
+* To guarantee that no additional and unexpected stars are detected, the
+* @StarExtraction "Star Extraction" procedure parameters are set to reflect
+* the composition of the reference star database.
+* \n
+* \n
+* \n
+* ## Observed Star Database
+* The counterpart to the reference star database is the __observed star database__
+* (OSDB), which is created from the observed positions that are provided by
+* the @StarExtraction "Star Extraction" process. While the basic principle
+* of fingerprint creation is the same as described above, it comes with two
+* major differences to the reference star database:
+* <ol>
+*  <li> The target star position is not known and can only be restricted to
+*       a subregion that is defined by the expected spacecraft pointing
+*       uncertainty. Therefore, every star in that area has to be considered as
+*      base star </li>
+*
+*  <li> Observed positions come with positional uncertainty that is high enough
+*      to affect a correct match of the inter-star distances (edges) and angles </li>
+*
+*</ol>
+*
+* This introduces two additional layers to the database structure. While
+* the reference star database consists of 3 layers
+* - Reference Star Database
+* - Sets of Fingerprints
+* - Fingerprints
+* \n
+* \n
+* the observed star database structure has 5
+* - Observed Star Database
+* - Sub Database for each Base Star
+* - Sets of Fingerprints
+* - Subsets of Fingerprints with Uncertainties
+* - Fingerprints
+*
+* (@ref create_obs_DB "Create Observed Star Database")
+* \n
+* \n
+* ### Base Star Selection
+* The observed star database has to choose the same base star as the
+* reference star database to achieve a positive matching result. Since the
+* intended target star position on the image and the maximum pointing
+* uncertainty of the spacecraft are known, this information can be utilised to
+* to reduce the extracted star positions to a few potential target candidates.
+* These candidates can then used as base stars to create sets of fingerprints
+* from combinations with the other observed stars (not only the candidates).
+* Each candidate forms a database from its respective set of fingerprints.
+* These databases are considered to be the sub databases that make up the
+* whole observed star database (see Fig (TBD)).
+* (@ref find_target_candidates "Find Target Candidates")
+*
+* @image html obsDB_fingerprint.png "Fingerprint Example" width = 180px
+*
+* The intended __Target Location__ (yellow dot) is at the center of the
+* __Candidate Area__ (yellow circle), which covers all possible placements of
+* the target star. Its radius is limited by the maximum pointing uncertainty,
+* and may differ between observations. All stars within, in this case D and E,
+* might be the desired target star, so each of them is used as base star to
+* create all possible sets of fingerprints through combinations with all of the
+* other 6 stars.
+*\n\n
+*
+*### Positional Uncertainties for Fingerprints
+* The star positions provided by the @StarExtraction "Star Extraction" can
+* sometimes be inaccurate to about 1.5 px (REF), which affects the
+* calculation of the distances between the base star and its partner stars.
+* This variation is the reason for the above mentioned quantisation
+* of the edge lengths and the vertex angle. Therefore, a maximum separation error
+* δr of ±3 px is assumed by default (customisable) and used for the quantisation
+* process, that is described by the following example:
+* \n\n
+* Consider a maximum separation error between two stars δr as ±3 px.
+* Therefore the separation of 238.93 px of the stars D and B will be detected as
+* 238.93 ± 3 px. Since all measures in the database are stored as integers, it opens
+* the range of 7 possible values [235, 241] for this edge alone.
+* To account for the extreme compressed and stretched cases of 235 px and 241 px
+* the quantisation is done with a factor of two δr:
+* \n
+* \n
+* <center>
+* edge length r = [DB] = 238.93 px, dr = 3 px\n
+* (r - δr) / 2δr = 39.32 \n
+* (r     ) / 2δr = 39.82 \n
+* (r + δr) / 2δr = 40.32 \n
+* </center>
+* \n
+* This transforms the edge [DB] to \f$39.82 ± 0.5\f$ px and can be represented by the
+* significantly smaller quantised interval of [39, 40].
+* \n
+* \n
+* The method comes with several advantages. While it the maximum number of values
+* for a particular edge is reduced by a factor of __x = (1+2·δr)/2__, the
+* database size with two edges per fingerprint is affected by __x²__.
+* In addition it also detaches the theoretical upper limit for the database size
+* from the position errors of a specfic star pair and therefore fixes the number
+* of the quantised edge interval to two.
+* \n
+* \n
+* Lastly angle can also be affected, which is especially the case when position
+* errors of the two partner stars point to opposite directions in the line of
+* their (unused) edge. Since this depends on the specific orientation of
+* a star triplet, it can be highly variable within the set of fingerprints for
+* a specific base. For this reason, there is no general maximum error that
+* could be used for the quantisation as described for the edges. Instead, everything
+* is quantised by an interval of 5 degrees, which is chosen as a trade off
+* between angle accuracy and database size to also guarantee an
+* allocation to a maximum of two different classes.
+* (@ref calculate_dAng "Calculate Angle Uncertainty")
+* \n
+* \n
+* Considering all uncertainties for both edges and the angle gives a maximum
+* of up to __8 variations__ for a single fingerprint. Therefore, each fingerprint
+* in the reference star database is described by a __subset of fingerprints__
+* with all possible variations in the observed star database. These variations
+* are indicated by the subscripts 1 and 2 for the two possible quantised
+* classes of each quantity. By convention single fingerprints are indicated by
+* round brackets () and subsets of fingerprints by curly brackets {}.
+* Such a set with the maximum number of fingerprints can be seen in Tab (TBD).
+* <table>
+*  <tr> <th> __Subset {[DB], [DC], θ(DBC)}__
+*  <tr> <td>([DB]_1, [DC]_1, θ(DBC)_1)
+*  <tr> <td>([DB]_1, [DC]_2, θ(DBC)_1)
+*  <tr> <td>([DB]_1, [DC]_1, θ(DBC)_2)
+*  <tr> <td>([DB]_1, [DC]_2, θ(DBC)_2)
+*  <tr> <td>([DB]_2, [DC]_1, θ(DBC)_1)
+*  <tr> <td>([DB]_2, [DC]_2, θ(DBC)_1)
+*  <tr> <td>([DB]_2, [DC]_1, θ(DBC)_2)
+*  <tr> <td>([DB]_2, [DC]_2, θ(DBC)_2)
+* </table>
+* \n
+* ### Database Index
+* The variable size of fingerprint set prevents the ability to navigate the
+* database solely by the number of stars and the order of the total number of
+* fingerprints given by (n-1)(n-2). This introduces the necessity
+* of an index system that keeps track of the locations of every stored
+* set of fingerprints. Therefore two indices that can be navigated by the relation
+* abvoe are introduced. The __base index__ stores the first database index of
+* each set of fingerprints and the __value index__ stores the quantised
+* distance measure for both edges. Utilising both indices together enables faster
+* search operations in the database during the matching process, which is described
+* in the section Database Matching (REF).
+* \n
+* \n
+* ### Database Size
+* An a priori calculation of the exact database size is not possible due to the
+* dependency on the variable number of angle classes per fingerprint set and the
+* number of target candidates, which can also vary for different FOV orientations.
+*
+* With nc = number of target candidates and n = number of stars in the FOV the
+* database size can be estimated by
+* \n\n
+* <center>
+* max = nc * (n-1) * (n-2) * 8
+* \n\n
+* min = nc * (n-1) * (n-2) * 4
+* </center>
+* \n\n
+* where nc is limited to 10 target candidates and 4/8 mark the minimal and
+* maximal number of fingerprints per set. The full observed star database for
+* the example case in Tab (TBD) and has a theoretical maximum of 480 fingerprints.
+* \n\n
+*
+* <table>
+* <caption id="multi_row">Observed Star Database</caption>
+* <tr> <td colspan="6" align="center"> __Sub-Database for Base Star D__
+* <tr> <th> Set for base [DA]    <th>   Set for base [DB]  <th>   Set for base [DC]  <th>   Set for base [DE]  <th>   Set for base [DF]  <th>   Set for base [DG] \n
+* <tr> <td> {[DA], [DB], θ(DAB)} <td> {[DB], [DA], θ(DBA)} <td> {[DC], [DA], θ(DCA)} <td> {[DE], [DA], θ(DEA)} <td> {[DF], [DA], θ(DFA)} <td> {[DG], [DA], θ(DGA)}\n
+* <tr> <td> {[DA], [DC], θ(DAC)} <td> {[DB], [DC], θ(DBC)} <td> {[DC], [DB], θ(DCB)} <td> {[DE], [DB], θ(DEB)} <td> {[DF], [DB], θ(DFB)} <td> {[DG], [DB], θ(DGB)}\n
+* <tr> <td> {[DA], [DE], θ(DAE)} <td> {[DB], [DE], θ(DBE)} <td> {[DC], [DE], θ(DCE)} <td> {[DE], [DC], θ(DEC)} <td> {[DF], [DC], θ(DFC)} <td> {[DG], [DC], θ(DGC)}\n
+* <tr> <td> {[DA], [DF], θ(DAF)} <td> {[DB], [DF], θ(DBF)} <td> {[DC], [DF], θ(DCF)} <td> {[DE], [DF], θ(DEF)} <td> {[DF], [DE], θ(DFE)} <td> {[DG], [DE], θ(DGE)}\n
+* <tr> <td> {[DA], [DG], θ(DAG)} <td> {[DB], [DG], θ(DBG)} <td> {[DC], [DG], θ(DCG)} <td> {[DE], [DG], θ(DEG)} <td> {[DF], [DG], θ(DFG)} <td> {[DG], [DF], θ(DGF)}\n
+*
+* <tr> <td colspan="6" align="center"> __Sub-Database for Base Star E__
+* <tr> <th> Set for base [EA]    <th>   Set for base [EB]  <th>   Set for base [EC]  <th>   Set for base [ED]  <th>   Set for base [EF]  <th>   Set for base [EG] \n
+* <tr> <td> {[EA], [EB], θ(EAB)} <td> {[EB], [EA], θ(EBA)} <td> {[EC], [EA], θ(ECA)} <td> {[ED], [EA], θ(EDA)} <td> {[EF], [EA], θ(EFA)} <td> {[EG], [EA], θ(EGA)}\n
+* <tr> <td> {[EA], [EC], θ(EAC)} <td> {[EB], [EC], θ(EBC)} <td> {[EC], [EB], θ(ECB)} <td> {[ED], [EB], θ(EDB)} <td> {[EF], [EB], θ(EFB)} <td> {[EG], [EB], θ(EGB)}\n
+* <tr> <td> {[EA], [ED], θ(EAD)} <td> {[EB], [ED], θ(EBD)} <td> {[EC], [ED], θ(ECD)} <td> {[ED], [EC], θ(EDC)} <td> {[EF], [EC], θ(EFC)} <td> {[EG], [EC], θ(EGC)}\n
+* <tr> <td> {[EA], [EF], θ(EAF)} <td> {[EB], [EF], θ(EBF)} <td> {[EC], [EF], θ(ECF)} <td> {[ED], [EF], θ(EDF)} <td> {[EF], [ED], θ(EFD)} <td> {[EG], [ED], θ(EGD)}\n
+* <tr> <td> {[EA], [EG], θ(EAG)} <td> {[EB], [EG], θ(EBG)} <td> {[EC], [EG], θ(ECG)} <td> {[ED], [EG], θ(EDG)} <td> {[EF], [EG], θ(EFG)} <td> {[EG], [EF], θ(EGF)}\n
+* </table>
+* \n
+* Each sub database is made from fingerprints of the different target candidates.
+* The matching process for a solvable case will mostly identify fingerprints of
+* one of the sub databases and identify its respective target candidate as the
+* target star.
+* \n
+* \n
+* \n
+* # Matching Process
+* With both databases in place the next and most important step for the
+* target identification is matching process. Here every set of fingerprints
+* in the observed star database will be assigned to a matching set of fingerprints
+* of the reference star database. The process itself consists of the initial
+* fingerprint matching, a subsequent elimination of ambiguous matching
+* results and eventually a decision whether the target can be clearly identified
+* or not.
+* \n
+* \n
+* ## Database Matching
+* For the matching process the algorithm iterates over every fingerprint in each
+* set of fingerprints in the reference star database. To avoid repeated full
+* scans of the observed star database each fingerprint is gradually matched with
+* the value and base index. This index supported search drastically reduces the
+* runtime of the matching process at the expense of some additional memory
+* requirements for the search index.
+* Let's assume a matching attempt for the reference fingerprint
+* ([DA], [DB], θ(DAB)) with simulated databases for our sample observation:\n
+* \n
+* First the quantised value of the edge [DA] is being searched in the value index.
+* In the above exmaple it can be found in the observed subdatabase with index 0
+* in the set for the base [DA] which also has index 0. These matching results
+* are used to build a subset of the whole observed database, which reduces the
+* potentially interesting part of the database from the full 480 to only 40
+* fingerprints. This sub sample is then used for the scan for the second edge [DB]
+* which is again found at index 0 within the set of fingerprints for base [DA].
+* Utilising this to further reduce the potentially interesting database limits
+* the search sample for the quantised angle to the maximum of 8 fingerprints for
+* the subset with the edge combination [DA], [DB]. Eventually the reference
+* fingerpint is found at index 2 of the subset in question.\n
+* (@ref match_databases "Match Star Databases")
+* \n
+* \n
+* The whole tracking record with all of the above mentioned indices is stored
+* as (0, 0, 0, 2). This is done for each matched fingerprint and can be seen
+* in Tab.: (TBD)\n
+* \n
+* <table>
+* <tr> <td colspan="6" align="center"> __Match results for Fingerprint Sets with Base Star D__
+* <tr> <th> Base [DA]    <th> Base [DB]    <th> Base [DC]    <th> Base [DE]    <th> Base [DF]    <th> Base [DG]    \n
+* <tr> <td> (0, 0, 0, 2) <td> (0, 1, 0, 1) <td> (0, 2, 0, 3) <td> (0, 3, 0, 7) <td> (0, 4, 0, 3) <td> (0, 5, 0, 1) \n
+* <tr> <td> (0, 0, 1, 5) <td> (0, 1, 1, 0) <td> (0, 2, 1, 0) <td> (0, 3, 1, 2) <td> (0, 4, 1, 2) <td> (0, 5, 1, 0) \n
+* <tr> <td> (0, 0, 2, 7) <td> (0, 1, 2, 1) <td> (0, 2, 2, 2) <td> (0, 2, 2, 2) <td> (0, 4, 2, 2) <td> (0, 5, 2, 0) \n
+* <tr> <td> (0, 0, 3, 3) <td> (0, 1, 3, 1) <td> (0, 3, 2, 4) <td> (0, 3, 2, 4) <td> (0, 4, 3, 7) <td> (0, 5, 3, 2) \n
+* <tr> <td> (0, 0, 4, 2) <td> (0, 1, 4, 0) <td> (0, 2, 3, 1) <td> (0, 3, 3, 7) <td> (0, 4, 4, 2) <td> (0, 5, 4, 1) \n
+* <tr> <td>              <td>              <td> (0, 2, 4, 0) <td> (0, 3, 4, 4) <td>              <td>              \n
+* </table>
+* \n
+* Since the reference and observed star databases were contructed from the same
+* observation and hence the same order of stars, the indices in Tab (TBD)
+* can easily be translated to a readable format. Therefore (0, 0, 0, 2)
+* becomes (D, A, B, 2). This indicates that the reference fingerprint was matched
+* with the observed fingerprint that is stored in the observed sub database for
+* __base star D__, build its first edge with __partner star A__, its second
+* edge with __parnter star B__ and was stored with the __subset index 2__. The
+* translated match result is shown in Tab (TOOD REF).
+* \n
+* <table>
+* <tr> <td colspan="6" align="center"> __Match results for Fingerprint Sets with Base Star D__
+* <tr> <th> Base [DA]    <th> Base [DB]    <th> Base [DC]    <th> Base [DE]    <th> Base [DF]    <th> Base [DG]    \n
+* <tr> <td> (D, A, B, 2) <td> (D, B, A, 1) <td> (D, C, A, 3) <td> (D, E, A, 7) <td> (D, F, A, 3) <td> (D, G, A, 1) \n
+* <tr> <td> (D, A, C, 5) <td> (D, B, C, 0) <td> (D, C, B, 0) <td> (D, E, B, 2) <td> (D, F, B, 2) <td> (D, G, B, 0) \n
+* <tr> <td> (D, A, E, 7) <td> (D, B, E, 1) <td> (D, C, E, 2) <td> (D, C, E, 2) <td> (D, F, C, 2) <td> (D, G, C, 0) \n
+* <tr> <td> (D, A, F, 3) <td> (D, B, F, 1) <td> (D, E, C, 4) <td> (D, E, C, 4) <td> (D, F, E, 7) <td> (D, G, E, 2) \n
+* <tr> <td> (D, A, G, 2) <td> (D, B, G, 0) <td> (D, C, F, 1) <td> (D, E, F, 7) <td> (D, F, G, 2) <td> (D, G, F, 1) \n
+* <tr> <td>              <td>              <td> (D, C, G, 0) <td> (D, E, G, 4) <td>              <td>              \n
+* </table>
+* \n
+* The maximum number of matches per base for this case should be (n-2) = 5.
+* While this is true for the majority of matched bases, base [DC] and [DE]
+* contain an additional false positive match that is a result of the isosceles
+* triangle of the stars D, C and E. Stars in such an orientation cannot be
+* distinguished by the Angle Method Algorithm and will introduce false matches.
+* For this reason the match results are corrected from ambiguous matches in a
+* subsequent step. To ensure that enough matches are left after this correction,
+* ideally five or more stars should be available in observations that use the
+* Angle Method Algorithm for target identification. This increases the number of
+* available fingerprints per base and therefore compensates for deleted matches
+* in the rare cases with such orientations or accidental matching.
+* \n
+* \n
+* ## Match Result Corrections
+* ### Base Specific Correction
+* The first correction step analyses the matched fingerprints for each base
+* separately. All matched fingerprints have to be from the same obserserved base
+* (base star and first partner star) to be considered valid. Therefore, the
+* so called __star tracker__ compares the base star of all matched fingerprints,
+* and discards fingerprints that don't fit with the majority of the matches. In
+* addition it also stores the matched observed base star for each reference base.
+* The same is done with the __base tracker__ for the partner star. The match record
+* for reference base [DC] is an example for this. While the first partner star
+* is C for five of the matches it is E for only one. Since the majority was matched
+* to observed base [DC], the match for the base [DE] seems out of place and is
+* considered wrong. The contrary is true for the match record of reference base
+* [DE]. In both cases the wrong match is discarded and not considered for the
+* quality of the match result. The preliminary number of valid matches for a
+* reference base can then be determined by the count of fingerprints made from
+* unique second partner stars. This number is stored for each reference base
+* in the so called __match histogram__ and can be decreased by the subsequent
+* correction steps. The match histogram for our example case can be seen below:
+* (@ref find_majority_matches "Find Majority Matches")
+* \n
+* <table>
+* <tr> <td colspan="7" align="center"> __Match Histogram__
+* <tr> <th> Reference Base <th> [DA] <th> [DB] <th> [DC] <th> [DE] <th> [DF] <th> [DG]\n
+* <tr> <th> No. of Matches <td> 5 <td> 5 <td> 5 <td> 5 <td> 5 <td> 5 \n
+* </table>
+* It also represents the final match result since no further corrections are
+* necessary for this constructed example case. Therefore a 100% of the
+* fingerprints in the observed star database could be matched. Further
+* evaluation of this result is discussed in
+* Match Results Validation/Validation Metric (REF). Generally, observations
+* might not match this well and are therefore treated with additional corrections
+* steps as described in the following subsections.
+* \n
+* \n
+* ### Cross Base Correction
+* Although each observed base and its set of fingerprints should only match a
+* specific reference base, some fingerprint variations might match with the wrong
+* reference base as described above. While most of these matches are eliminated
+* by the previous correction step it sometimes happens that a single observed base
+* is assigned to multiple reference bases. This behaviour can be observed
+* in very crowded fields with short inter-star distances, since they are prone
+* to be mapped to similar quantised distance classes that can match within the
+* observed fingerprint variations. The other case are reference bases of stars
+* that were provided by the reference positions but aren't visible in the FOV
+* of the observation. Such bases might accidentally match 1-2 fingerprint
+* variations but are not corrected be the previous step due to the lack of real
+* matches.
+* \n
+* The star and base tracker are used to identify observed bases that were matched
+* to multiple reference bases. In such a case the reference base with more matched
+* fingerprints is considered to be the valid match. The respective number of
+* matched fingerprints can be retrieved from the match histogram. The process
+* then discards all matches of the invalid base(s). In addition all fingerprints
+* that were matched to both of the reference bases in question are considered
+* to be ambiguous and are also discarded from the valid reference base. All
+* changes are also reflected in the match histogram.
+* \n
+* Since this particular matching fail is rather rare and not present in the above
+* example let's consider an hypothetical additional reference star H that is
+* located such that it would produce the following match result situation:
+* \n
+* <table>
+* <tr> <td colspan="6" align="center"> __Cross Base Validation for Base Star D__
+* <tr> <th> Base [DA]    <th> Base [DH]    \n
+* <tr> <td> (D, A, B, 2) <td> (D, A, B, 1) \n
+* <tr> <td> (D, A, C, 5) <td> (D, A, C, 3) \n
+* <tr> <td> (D, A, E, 7) <td>              \n
+* <tr> <td> (D, A, F, 3) <td>              \n
+* <tr> <td> (D, A, G, 2) <td>              \n
+* </table>
+* \n
+* The algorithm would identify base [DA] and [DH] to be matched with fingerprints
+* from the same observed base. Since there are more matches for [DA] base [DH]
+* would be discarded as the invalid match. Even though the fingerprints
+* ([DA],[DB], θ(DBA)) and ([DA],[DC], θ(DBC)) were matched for different variations
+* they are still considered ambiguous and are therefore discarded. Hence, this
+* operation would reduce the number of valid matches for base [DA] to three.
+* (@ref correct_multiple_base_matches "Correct Multiple Base Matches")
+* \n
+* \n
+* ### Base Star Correction
+* After the previous correction steps across the reference base matches the
+* matching base star can be determined. Since the majorily matching base star and
+* first partner star were determined separately for each reference base it is
+* possible that the different reference bases were matched to different base stars.
+* As there can only be one valid base star, all matches with the less frequently
+* matched base star are discarded from the match histogram.
+* Similar to the correction step before this is a rather rare issue that's more
+* often present in tighter packed star distributions and didn't occur in the
+* above example. Therefore, consider the hypothetical alternative match result
+* in Tab.: (TOOD REF) below:
+* \n
+* <table>
+* <tr> <td colspan="6" align="center"> __Hypothetical Match Results for Fingerprint Sets with Base Star D__
+* <tr> <th> Base [DA]    <th> Base [DB]    <th> Base [DC]    <th> Base [DE]    <th> Base [DF]    <th> Base [DG]    \n
+* <tr> <td> (E, A, B, 2) <td> (D, B, A, 1) <td> (D, C, A, 3) <td> (D, E, A, 7) <td> (D, F, A, 3) <td> (D, G, A, 1) \n
+* <tr> <td> (E, A, C, 5) <td> (D, B, C, 0) <td> (D, C, B, 0) <td> (D, E, B, 2) <td> (D, F, B, 2) <td> (D, G, B, 0) \n
+* <tr> <td> (E, A, D, 7) <td> (D, B, E, 1) <td> (D, C, E, 2) <td> (D, E, C, 4) <td> (D, F, C, 2) <td> (D, G, C, 0) \n
+* <tr> <td> (E, A, F, 3) <td> (D, B, F, 1) <td> (D, C, F, 1) <td> (D, E, F, 7) <td> (D, F, E, 7) <td> (D, G, E, 2) \n
+* <tr> <td> (E, A, G, 2) <td> (D, B, G, 0) <td> (D, C, G, 0) <td> (D, E, G, 4) <td> (D, F, G, 2) <td> (D, G, F, 1) \n
+* </table>
+* \n
+* Here, only reference base [DA] would be matched with the base star E, while the
+* remaining 5 reference bases clearly fit the fingerprints of star D. For this
+* reason D is selected as the most likely target star and all matches with base
+* star E are discarded from the match histogram.
+* (@ref find_valid_star_candidate "Base Star Correction")
+* \n
+* \n
+* ### Statistical Correction
+* Even though the target star has been suggested at this point, a last step is
+* taken to clean the match histogram from problematic matches and arrive at a
+* more conservative result. Still existing accidental matches with unused reference
+* bases (similar to the case in Cross Base Corrections REF) and the sparse
+* leftovers of corrected bases with significantly less matches than the well
+* matched references bases are being discarded in this step. This is done by
+* calculation of the average number of matched fingerprints per reference base.
+* Together with the respective standard deviation a minimum number of matches is
+* defined by
+* <center> minimum matches = average matches - 2 * standard deviation </center>
+* \n
+* All results from reference bases with less than the minimum amount of matched
+* fingerprints are removed from the match histogram. This final step marks
+* the completion of the match result correction. All remaining matches are
+* considered to be valid and can be used to determine if the selected target
+* candidate was matched well enough to be clearly identified as the target star.
+* (@ref find_valid_star_candidate "Statistical Correction")
+* \n
+* \n
+* ## Match Result Validation
+* The selected target candidate cannot directly be considered as the identified
+* target star for various reasons. Beside the obvious case where the actual
+* target star is not present and a few accidental matches could trigger a
+* misidentification, the specific way how the database matching process was
+* implemented for cases with multiple target candidates is another one. Whenever
+* a fingerprint can be identified within one of the observed subdatabases
+* the search is not continued to check if it can also be found in the remaining
+* subdatabases. This was done for two reasons. It is quite unlikely
+* to encounter the same fingerprint in another subdatabase, due to the random
+* nature of star distributions and the way the fingerprint geometry works.
+* Therefore a continued search is mostly a waste of computational resources
+* and overall reduced matching times to meet the stricter initial runtime
+* requirements were more favourable. While it optimised the execution time and
+* memory usage it can theoretically lead to an extreme match result like in
+* Tab.:  (REF) in very special cases.
+* \n
+* <table>
+* <tr> <td colspan="6" align="center"> __Hypothetical Match Results for Fingerprint Sets with Base Star D__
+<tr> <th> Base [DA]      <th> Base [DB]    <th> Base [DC]    <th> Base [DE]    <th> Base [DF]    <th> Base [DG]    \n
+* <tr> <td> (E, A, B, 2) <td> (D, B, A, 1) <td> (D, C, A, 3) <td>              <td>              <td>              \n
+* <tr> <td> (E, A, C, 5) <td> (D, B, C, 0) <td> (D, C, B, 0) <td>              <td>              <td>              \n
+* <tr> <td> (E, A, D, 7) <td> (D, B, E, 1) <td> (D, C, E, 2) <td>              <td>              <td>              \n
+* <tr> <td> (E, A, F, 3) <td> (E, B, F, 1) <td> (E, C, F, 1) <td>              <td>              <td>              \n
+* <tr> <td> (E, A, G, 2) <td> (E, B, G, 0) <td> (E, C, G, 0) <td>              <td>              <td>              \n
+* </table>
+* \n
+* The algorithm would decide that base star D is dominant in 2/3 matched reference
+* bases and suggest base star D as the valid target candidate. Upon closer
+* inspection one can see that star E actually has one more match than star D
+* and generally less than half of the total possible matches was achieved.
+* Considering that base star E can only be matched if there is no match with
+* star D in the first subdatabase it could be that E would have matched all of
+* the reference bases [DA], [DB], [DC]. Although this is some inherently problematic
+* behaviour of the Angle Method Algorithm it hardly has any significance for
+* real observational cases. A star distribution to trigger such a case would
+* have glitch degraded star positions and has to be highly symmetric along an
+* axis that separates the two target candidates. One could argue that every
+* matched fingerprint might have matched another one in the next subdatabase,
+* but star distributions that fulfill such a level of symmetry are so rare that
+* the case is considered negligible. Similar to the isosceles case
+* it would be just unsolvable and should be solved with with photometric means.
+* \n
+* To also avoid these rare cases and keep such poorly and maybe ambiguously
+* matched orientations from triggering positive target identifications it was
+* decided that the total number of matched fingerprints in the match histogram
+* has to overcome a certain threshold.
+* \n
+* \n
+* ### Validation Metric
+* The main threshold that has to be met in order to fulfill the requirements for
+* a positive identification is defined by the maximum possible number of fingerprints
+* for the extracted positions in an observation. Out of the (n-1)(n-2) possible
+* combinations (where n represents the number of detected stars) at least 50%
+* must be matched for a candidate to be recognised as the target star. In order
+* to match such large fractions of the observed star database it is required that
+* every observed star also is also represented in the set of reference stars.
+* For this reason the @StarExtraction "Star Extraction" is configured in
+* dependency of the expected reference stars so that it always only finds less
+* and brighter stars than are provided by the reference.
+* \n
+* \n
+* The above 50% criteria is meant to guarantee that the algorithm selects the
+* best possible target candidate as the valid match. While some reference
+* fingerprints might be wrongly assigned to another candidate's database, the
+* example presented in the section above is an exception that usually does not
+* happen. This in turn means that the vast majority of fingerprints are unique
+* to their subdatabase which makes it impossible for two competing target
+* candidates to achieve results above 50% at the same time. Therefore such a
+* result can be confidently viewed as the successfully identified target star.
+* \n
+* \n
+* This requirement will easily be met for the majority of generally identifiable
+* orientations. An exception are sparsely populated FOV with one or more
+* interloping stars, that are not covered by the reference. In such cases
+* additional stars have a larger effect on the match quality than in
+* observations with plenty of stars. A more detailled description of their
+* effects can be found in the next section (REF). While the match results
+* of such observations can be degraded to the point where the validity criteria
+* cannot be met, they are not necessarily wrong. To save such an otherwise
+* perfectly fine result an alternative measure for the validity is used.
+* For this, the maximum possible number of matched fingerprints is calculated
+* from the number of matched reference bases
+* \n
+* <center> max_items = (n_matched_bases)(n_matched_bases-1)</center>
+* \n
+* which is not directly affected by interlopers but a less conservative measure.
+* The amount of possible matched bases on the other hand still depends on the
+* number of observed stars, which also includes the interlopers. To still be
+* considered a valid identification currently 65% of the possible reference
+* bases have to be matched with at least 65% of each of their fingerprints. This
+* results in a total matching threshold of 42.25% of the observed database,
+* which saves observations that only slightly failed the main criteria as
+* described above. If this more forgiving threshold also cannot be met a final
+* layer of reduced thresholds might save the identification.
+* \n
+* Even though the match result will be returned as failed at this point, the
+* Angle Method can also be used in combination with the Magnitude Validation
+* (REF). Insufficient match results can be saved with a subsequent
+* photometric analysis of the target candidate's signal. Although the combination
+* of the method is a potentially robust way for the identification problem, the
+* photometric verification should not be used on exceptionally bad Angle Method
+* results. As described in section (REF) the photometry is rather coarse.
+* Since the Angle Method is meant for faint targets, the other target candidate
+* might be within the signal uncertainty of the Magnitude Validation. For this
+* reason, a photometric misidentification would verify a poor and potentially
+* wrong Angle Method result, which in turn could lead to a misidentified target
+* star. To prevent such false positive cases the matching threshold for this method
+* is set to a conservative 40%. While this is only slightly below the threshold
+* for the previous recovery method, it doesn't have the additional base specific
+* matching requirements. This makes it applicable to generally poor and even
+* worse results than covered by the previous method but still requires them to
+* be good enough to be considered an indicator for a potential match.
+* \n
+* \n
+* ### Effects of Interloping or Missing Observed Stars
+* Additional and missing stars affect the result in different ways. While a
+* missing star only increases the negative impact of fingerprints that cannot be
+* assigned to a reference base, an interloper introduces several fingerprints
+* which don't exist in the reference. Depending on the detected number of stars,
+* this can render big parts of the observed star database as corrupted and
+* therefore not matchable and is shown in Fig (REF) and (REF)
+* below.
+* \n
+* @image html Interlopers_1.png "Effects of One Interloper" width = 180px
+* \n
+* Fig (REF) shows how a single interloper affects the fingerprints in the
+* observed star database. While the red line illustrates the total number of
+* fingerprints, the blue line describes the number of unaffected valid
+* fingerprints. In addition their respective fractions of the observed database
+* are indicated by the red and blue filled areas. The effect is especially profound
+* for observations with a low amount of detected stars. An observation with only
+* 5 stars that contains even a single interloper results in an observed star
+* database with 50% corrupted fingerprints that won't be able to match the reference.
+* Therefore it is almost unsolvable by the above defined validity criteria for
+* a positive target identification. Fortunately the impact of interlopers
+* diminishes with a growing number of available stars and settles between 10-15%
+* for the expected star counts.
+* \n
+* @image html Interlopers_2.png "Effects of Two Interlopers" width = 180px
+* \n
+* Introducing a second interloper has more devastating effects and prevents
+* detections with the main criteria to up to 8 detected stars (Fig.: REF).
+* Even at higher star counts the corrupted fraction of fingerprints is still
+* between 25-30% and thus requires very good matching results with the
+* remaining stars. For this reason the Angle Method is meant to be configured
+* such that it will operate on 10 or more stars.
+* \n
+* \n
+* Generally, such interloping stars can originate from
+*
+*  - overlapping faint stars
+*  - detections of too faint stars with an overlapping cosmic
+*  - detections of extremely bright cosmics
+*  - planets and asteroids
+*
+* and are usually encountered in crowded fields that favour the change of
+* above mentioned overlaps. Misdetection of cosmics usually only occurs during
+* SAA transits. Even though the chances to appear in sparsely populated FOV
+* are low, the calculation of the observation specific  __detection threshold__
+* is focused on the prevention of such glitch induced star detections.
+* Depending on the available reference stars for an observation cosmic rays
+* are not expected to interfere with the identification until currently up to
+* 150 times the nominal cosmic ray rate (REF). Together with the careful
+* selection of reference stars, interlopers are generally avoided and should
+* only pose a problem in extreme SAA environments and poorly configured cases.
+* \n
+* \n
+* ### Target Selection
+* Once the target star could be identified its position on the CCD is used
+* to calculate the offset to the originally intended __target location__. This
+* offset is then reported to the attitude and orbital control system
+* with a valid centroiding report.
+* \n
+* \n
+* ### Identification Failure
+* Simulations have shown that identification failures should be the exception
+* (REF). The most common reason for this are:
+*
+*  - bad the star positions
+*  - target location change
+*  - preemptive target acquisition during slew maneuvres
+*  - wrong input parameters (eg. wrong target location)
+*
+* whereas the first three are recoverable by repeated observation. Exceptionally
+* heavy glitch rates or unlucky glitch positions can lead to offsets for the
+* detected stars. This affects the edge lengths of fingerprints, which then
+* cannot be matched with the reference star database. Repeated observation
+* changes the FOV orientation, glitch positions and maybe also the rate.
+* Therefore a successive observation under different conditions might be
+* successful. The number of iterations in the case of identification failures
+* is part of the input parameters that are provided with the Star Map (REF).
+* The second recoverable occurrence is during target location changes. In the case
+* of the CHEOPS AOCS the target is always placed at the target location of the
+* previous observation. If it changes between two observations, the target candidates are
+* being searched for in the wrong area of the image. For this reason the actual
+* target won't be part of the target candidates and the attempt fails. Since
+* the AOCS will place the target star in the correct location after the first
+* failed attempt, any successive target acquisition iterations should be
+* successful. The same is true for preemptive acquisition attempts. sometimes
+* the target star might still be on the way to its designated target acquisition
+* and therefore either be smeared or just not in the right place. Repeated
+* attempts will lead to acquisition success once the slewing maneuver is finished. .
+* \n
+* The only critical algorithm fail stems from faulty algorithm configuration. This
+* should be prevented by the mostly automated parameter setup and preview
+* simulation capabilities of the Star Map Generator tool (REF). Therefore
+* such cases usually originate from wrong input data or random operator failure.
+* No matter what the nature of the acquisition fail was, they are also
+* communicated to the parent level of the flight software by a centroiding
+* report through the validity status parameter.
+*
+*
+*
+*
+*
+*
+*
+*
+* @defgroup MagnitudeValidation Magnitude Validation Algorithms
+* @ingroup TargetAcquisition
+*
+* @brief The Magnitude Validation Algorithm is used to identify target stars by photometry and is part of @ref TargetAcquisition.
+*
+* ## Introduction
+* The __Magnitude Validation Algorithm (MVA)__ is an identification method
+* that utilises photometry to compare a measured target candidates' signal to
+* a reference signal that is provided for each observation. While initially
+* only intended to be used as a secondary layer of verification for weak
+* Angle Method Algorithm results, it was extended to also serve as the main
+* identification method for sparse FOV with bright target stars in the form
+* of the __Magnitude Validation Acquisition Algorithm (MVAA)__. These cases either
+* prohibit long enough exposure times to image enough stars for the Angle Method
+* or are easily identifiable due to a lack of similarly bright target candidates.
+* \n
+* \n
+* ## Magnitude Validation Algorithm (MVA)
+* This variant is used to confirm weak Angle Method results as stated above
+* and hence can only be run in succession to it. The position for the best matched
+* target candidate from the Angle Method, along with an expected reference target
+* signal [ADU], the respective signal tolerance [%] and an estimate for the
+* background signal are provided to the algorithm. The target candidate in
+* question will be confirmed if the result of the radius photometry are within
+* in the tolerance. Otherwise the acquisition attempt will be continued to be
+* considered a failure. (@ref target_magnitude_validation "Magnitude Validation Algorithm")
+* \n
+* \n
+* ## Magnitude Validation Acquisition Algorithm (MVAA)
+* The standalone acquisition variant is slightly more complex as it also has to
+* deal with the target candidate selection from the general @StarExtraction
+* "Star Extraction" output.\n
+* \n
+* Comparable to the target candidate selection in the Angle Method, available
+* star positions are only considered if they are within the __candidate area__
+* (REF) around the __target location__. Radius photometry is then used on
+* each of these target candidates to determine the closest match with the
+* target specific reference signal. While ideally one target candidate
+* matches the reference signal there are exceptions that can lead to
+* identification failures.
+*
+*  - multiple target candidates with similar signal within the tolerance
+*  - stacked signal from overlapping stars
+*  - signal saturation
+*  - corrupt candidate positions with multiple detections on single objects
+*  -
+*
+* The first three cases are unsolvable since they will lead to either
+* ambiguous or completely wrong photometric results. Fortunately, they should
+* usually be avoidable by proper algorithm parameter selection and be identified
+* by the ground segment before the observation attempt.
+*
+* The issue of faulty star positions on other hand is expected to sometimes happen
+* independent of the algorithm configuration with relatively bright objects for
+* a certain exposure time. For this reason safe guards that are meant to
+* recover identification fails for such cases are in place. If up to five
+* target candidates match the reference signal, they are not immediately discarded
+* as multiple ambiguous matches but rather analysed whether they might describe
+* the same object. Cases where the distances are all within the typical PSF
+* diameter of 24 pixel (REF) and measured signals don't vary more than
+* 3 percent, are considered to be a multiple detection of a single object.
+* The 3 percent threshold is chosen well below the signal tolerance, so it
+* addresses the signal variation that comes with the slight change in position
+* Therefore, it fails on larger changes where the signal could be corrupted by
+* the influence of a close neighbour or one of the positions in question actually
+* is a close neighbour with a signal within the tolerance. The combination of
+* these geometric and photometric criteria ensure that seperate candidates are
+* not accidently considered as the same object. If they are met, the target
+* candidate with the best signal match is considered to be the most central on
+* the PSF and will be chosen as the identified target.
+* (@ref target_magntitude_validation_acquisition "Magnitude Validation Acquisition Algorithm")
+*
+*
+* As with the result of the Angle Method Algorithm, the outcome of the
+* identification attempt is reported via the Centroid Report Service (196,1).
+* \n
+* \n
+* ## Radius Photometry
+* The __Radius Photometry__ determines the star signal on the full frame
+* image within a radius of 25 pixel around a provided star position. This radius
+* is guaranteed to contain the majority of the Point Spread Function
+* (PSF) as defined in the respective CHEOPS science requirements (REF).
+* Every pixel in the thereby covered area is corrected from the effects of the
+* background signal and added up to obtain the remaining star signal in ADU.
+* (@ref perform_radius_photometry "Perform Radius Photometry")
+*
+*
+* ### PSF Shape
+* Even though it was the intention to concentrate the PSF within the above
+* mentioned radius of 25 pixel, the real optical system of CHEOPS does not
+* perfectly achieve this goal. A comparison of the signal distribution of
+* the intended case with a simulated PSF and the measured PSF can be seen in
+* the figures below. While the full signal was contained in a rather compact
+* spherical triangle in the simulation shown by Fig.: (REF), the real
+* optical system features stronger diffractive effects. These result in a larger
+* PSF that partly extends beyond the photometric radius (Fig.: (REF)).
+* Fortunately, only a small fraction of about 1.5% of the signal is lost by this
+* due to the relatively strong focus to the central pixels that can be seen in
+* Fig.: (TBD). As a result only 98.5% of the expected signal will be measured
+* by this implementation of the radius photometry. Addressing the problem by an
+* extension of the photometry radius would lead to a problematic influence by
+* the signal of close-by stars. Therefore it is just considered as a systematic
+* difference in the comparision with the reference signal.
+*
+* @image html radius_photometry_sim_psf.png "Simulated PSF signal distribution"
+*
+* @image html radius_photometry_real_psf_shape.png "Measured PSF shape"
+*
+* @image html radius_photometry_real_psf_signal.png "Measured PSF distribution"
+* \n
+* \n
+* ### Background Signal
+* The background signal is calculated for the observation specific exposure time
+* and includes estimates for the __bias__, __dark current__ and __sky signal__.
+* It can be seen in Equation (REF) below:
+* <center>
+*   bkgd_signal = bias + exposure_time * (sky_bkgd + dark_mean));
+* </center>
+* \n
+* \n
+* ## Reference Signal Calculation
+* The reference signal in ADU for the photometric methods is calculated from
+* V-band of the GAIA star catalogue. Besides a slight colour correction for
+* CHEOPS V-magnitudes it is especially important to account for different
+* spectral distributions, since they highly affect the electron flux on the CCD.
+* A more detailled description  of the conversion can be found in section
+* (REF) about the Star Map Generator Tool.
+*
+* The prediction of the star signal is currently limited by this conversion and
+* is accurate to about 10%, which is significantly higher than any other
+* component of the signal noise (REF) and therefore also the limiting
+* factor of the photometric validation options.
+* \n
+* \n
+*/
+
+
+
+/*****************************************************************
+ *                                                               *
+ *                         LIEBE METHOD                          *
+ *                                                               *
+ *****************************************************************/
+
+#include "AngleMethod.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "TaDatatypes.h"
+#include "StarExtractor.h"
+#include "IfswMath.h"
+
+
+extern struct match_candidates_t *g_candidates;
+extern struct unique_output_t *g_output;
+extern struct unique_output_t *g_unique_base0;
+extern struct unique_output_t *g_unique_duplicate_entry;
+extern struct where_output_t *g_multi_base_skip_index;
+extern struct where_output_t *g_multi_base_index;
+extern struct where_output_t *g_duplicate_base0;
+extern struct where_output_t *g_duplicate_base1;
+extern struct unique_output_t *g_unique_stars;
+extern struct where_output_t *g_base0_count;
+
+
+/*****************************************************************
+ *                                                               *
+ *                       DATABASE GENERATION                     *
+ *                                                               *
+ *****************************************************************/
+/**
+ * @brief Create Reference Database uses provded reference positions to build
+ *        the database of distance and angle combinations that are used
+ *        for pattern recognition to identify the target star.
+ * @param pos          Observation specific reference positions provided by StarMap telecommand
+ * @param target_index Index of the target in pos [default: 0]
+ * @param ref_DB       Output structure for the reference database
+ * @param dr           Estimated maximum position error that is considered in
+ *                     the database creation
+ */
+void create_ref_DB (struct ref_pos_t *pos, int target_index, struct ref_db_t *ref_DB, unsigned short dr)
+{
+  int i, j, k, fingerprint_counter;
+  float r[2], theta, x[2], y[2], cosinus;
+
+  i = target_index;     /* index of target star position */
+
+  fingerprint_counter = 0;
+
+  /* dr is AMA tolerance from StarMap make sure it is != 0 */
+  if (dr == 0)
+    dr = 1;
+
+  /* Loop over all stars for possible combinations */
+  for(j=0; j < pos->n; j++)
+  {
+    if (i != j) /* prevent self-pairing */
+    {
+      x[0] = pos->x[i] - pos->x[j];       /* x-component of distance vector */
+      y[0] = pos->y[i] - pos->y[j];       /* y-component of distance vector */
+      r[0] = TaNorm(x[0], y[0]);          /* length of distance vector */
+
+      /* Loop over still remaining stars for the second pair */
+      for(k=0; k < pos->n; k++)
+      {
+        if((j!=k) && (i!=k)) /* prevent self-pairing */
+        {
+          x[1] = pos->x[i] - pos->x[k]; /* x-component of distance vector */
+          y[1] = pos->y[i] - pos->y[k]; /* y-component of distance vector */
+          r[1] = TaNorm(x[1], y[1]);  /* length of distance vector */
+
+          /* r[0] and r[1] are != 0, because in order to enter here,
+             pos must be > 3, i.e. there are more than 2 non-zero r */
+          cosinus = (x[0]*x[1] + y[0]*y[1])/(r[0]*r[1]);
+
+          /* prevent floating point rounding errors */
+          if (cosinus < -1)
+            cosinus = -1;
+          if (cosinus >  1)
+            cosinus = 1;
+
+          theta = acosf (cosinus)*180.0 / PI; /* angle between distance vectors */
+
+          /* store results in output structure */
+          /* distances and angle are quanticed before storage */
+          ref_DB->data[fingerprint_counter + 0] = (int)(r[0] / (2 * dr));
+          ref_DB->data[fingerprint_counter + 1] = (int)(r[1] / (2 * dr));
+          ref_DB->data[fingerprint_counter + 2] = (int)(theta / 5);
+
+          fingerprint_counter += 3;
+        }
+      }
+    }
+  }
+
+  ref_DB->n_stars = pos->n; /* store number of stars */
+
+  return;
+}
+
+/**
+ * @brief Create Observed Database uses observation specific star positions which
+ *        are provided by the @ref StarExtraction "Star Extraction procedure" to
+ *        create the database of distance and angle combinations for the respective
+ *        observation. This database will be compared to the @ref create_ref_DB
+ *        "Reference Database" to identify the target star.
+ * @param pos                     Observation specific star positions provided
+ *                                by the Star Extraction process.
+ * @param obs_DB                  Output structure for the Observed Database
+ * @param target_location         Intended target position on the CCD
+ * @param target_candidate_radius Search radius around the Target Location in
+ *                                which the target star should be located due
+ *                                to the pointing uncertainty
+ * @param dr                      Estimated maximum position error that is considered in
+ *                                the database creation
+ */
+void create_obs_DB (struct obs_pos_t *pos, struct obs_db_t *obs_DB, float *target_location, int target_candidate_radius, unsigned short dr)
+{
+  unsigned int i, j, k;
+
+  int ii, r1, r2, r1_ulim, r1_llim, r2_ulim, r2_llim, ang, ang_llim, ang_ulim;
+  int base0_counter, base1_counter, fingerprint_counter;
+  int base0_value_counter, base1_value_counter, current_candidate;
+  float x[2], y[2], r[2], cosinus, theta, dAng;
+
+  base0_counter = 0;   /* tracks the number of target/first neighbour pairs */
+  obs_DB->counter = 0; /* tracks the number of entries in obs_DB */
+  obs_DB->candidate_counter = 0;
+
+  /* dr is AMA tolerance from StarMap
+     make sure it is != 0 */
+  if (dr == 0)
+    dr = 1;
+
+  /* scan positions for eligible target candidates */
+  find_target_candidates (pos, target_location, target_candidate_radius);
+
+  /* only create a database for stars that qualify as candidates */
+  for (ii=0; ii < pos->n_candidates; ii++)
+  {
+    /* tracks the amount of created databases. 1 for each candidate */
+    obs_DB->candidate_counter++;
+
+    /* tracks the amount of target/neighbour combinations */
+    base0_counter = 0;
+
+    /* tracks how many distance/distance/angle combinations existing
+      for each base0 combination. This number varies due to positional
+     error that is considered for the observed positions */
+    base0_value_counter = 0;
+    base1_value_counter = 0;  /* see above comment */
+
+    i = pos->candidate_index[ii];
+
+    /* iterate over all star combinations to create distance/angle database */
+    for (j=0; j < pos->n; j++)
+    {
+      /* prevent self-pairing */
+      if (j != i)
+      {
+        /* set starting index of current target/neighbour pair */
+        /* total amount of target/neighbour pair defined by (n-1)*/
+        obs_DB->base0_index[(ii*(pos->n-1)) + base0_counter] = obs_DB->counter;
+
+        x[0] = pos->x[i] - pos->x[j];  /* x-component of distance vector */
+        y[0] = pos->y[i] - pos->y[j];  /* y-component of distance vector */
+        r[0] = TaNorm(x[0], y[0]);     /* length of distance vector */
+
+        /* Possible position errors from the star extraction and hence
+           errors in the star separatoin measurements are compensated
+           for the observed database. The next two lines define upper and
+           lower limits for the quantisation of the distance measurement */
+        r1_llim = (int)((r[0]-dr)/(2*dr));
+        r1_ulim = (int)((r[0]+dr)/(2*dr));
+
+        /* tracks the amount of base0 + 2nd neighbour combinations */
+        base1_counter = 0;
+
+        for (k=0; k < pos->n; k++)
+        {
+          /* prevent self-pairing */
+          if ((k != j) && (k != i)) /* NOTE: k!=i is redundant */
+          {
+            /* track total amount of distance/distance/angle pairs(= fingerprint) */
+            fingerprint_counter = 0;
+            /* set starting index of current base0 + 2nd neighbour pair */
+            /* total amount of base0 + 2nd neighbour defined by (n-1)(n-2)*/
+            obs_DB->base1_index[(ii*(pos->n-1)*(pos->n-2)) + base0_counter*(pos->n-2) + base1_counter] = obs_DB->counter;
+            x[1] = pos->x[i] - pos->x[k];   /* x-component of distance vector */
+            y[1] = pos->y[i] - pos->y[k];   /* y-component of distance vector */
+            r[1] = TaNorm(x[1], y[1]);      /* length of distance vector */
+
+            /* r[0] and r[1] are always != 0, because in order to
+               enter here, pos must be > 3, i.e. there are more than
+               2 non-zero r */
+            cosinus = (x[0]*x[1] + y[0]*y[1])/(r[0]*r[1]);
+
+            /* prevent floating point rounding errors */
+            if (cosinus < -1)
+              cosinus = -1;
+            if (cosinus >  1)
+              cosinus = 1;
+
+            theta = acosf (cosinus)*(180.0 / PI);   /* angle between distance vectors*/
+            dAng = calculate_dAng(x, y, dr, theta); /* calcualte angle error for quantisation */
+
+            r2_llim = (int)((r[1]-dr)/(2*dr));      /* define distance limits for quantisation */
+            r2_ulim = (int)((r[1]+dr)/(2*dr));
+
+            ang_llim = (int)((theta-dAng)/5);       /* define angle limits for quantisation*/
+            ang_ulim = (int)((theta+dAng)/5);
+
+            /* iterate of all distance and angle limits */
+            for (r1=r1_llim; r1 <= r1_ulim; r1++)
+            {
+              for (r2=r2_llim; r2 <= r2_ulim; r2++)
+              {
+                for (ang=ang_llim; ang <= ang_ulim; ang++)
+                {
+                  /* store quantised fingerprint data to database */
+                  obs_DB->data[obs_DB->counter + 0] = r1;
+                  obs_DB->data[obs_DB->counter + 1] = r2;
+                  obs_DB->data[obs_DB->counter + 2] = ang;
+                  obs_DB->counter += 3;  /* total number of db entries */
+                  fingerprint_counter++; /* number of fingerprints */
+                }
+              }
+            }
+
+            /* index in obs_DB->value_index of current candidate*/
+            current_candidate = ii*(2*(pos->n-1)+2*(pos->n-1)*(pos->n-2));
+            /* value_index stores the quantised values of base1
+              current_candidate skips over previous candidate database
+              2*(pos->n-1)           left empty for base0 value index
+              2*base1_value_counter  finds the current index */
+            obs_DB->value_index[current_candidate + 2*(pos->n-1) + 2*base1_value_counter + 0] = r2_llim;
+            obs_DB->value_index[current_candidate + 2*(pos->n-1) + 2*base1_value_counter + 1] = r2_ulim;
+
+            /* base1_data_count stores the amount of fingerprints for
+               each base0/base1 combination. This number varies due to
+               the quantisation process and the integer nature
+               of the quantised values:
+                 (n-1)(n-2) total base0/base1 combintaions are possible
+                 (ii*(pos->n-1) * (pos->n-2)) skips over previous candidate's databases
+                 (base0_counter*(pos->n-2)    skips over previous base0 for the current candidate
+                 base1_counter                finds the current index of the current candidate
+             */
+             obs_DB->base1_data_count[(ii*(pos->n-1) * (pos->n-2)) + (base0_counter*(pos->n-2) + base1_counter)] = fingerprint_counter;
+
+            base1_counter++;
+            base1_value_counter++;
+          }
+        }
+        /* index in obs_DB->value_index of current candidate*/
+        current_candidate = ii*(2*(pos->n-1) + 2*(pos->n-1)*(pos->n-2));
+        /* value_index stores the quantised values of base0 */
+        obs_DB->value_index[current_candidate + 2*base0_value_counter + 0] = r1_llim;
+        obs_DB->value_index[current_candidate + 2*base0_value_counter + 1] = r1_ulim;
+
+        base0_counter++;
+        base0_value_counter++;
+      }
+    }
+  }
+
+  /* store amount of created base0*/
+  obs_DB->base0_counter = base0_counter;
+
+  return;
+}
+
+/**
+ * @brief Looks for detected stars in the Candidate Radius around the
+ *        Target Location and stores them in the @ref obs_pos_t
+ *        "Observerd Positions" structure
+ *
+ * @param pos                     Observation specific star positions provided
+ *                                by the Star Extraction process.
+ * @param target_location         Intended target position on the CCD
+ * @param target_candidate_radius Search radius around the Target Location in
+ *                                which the target star should be located due
+ *                                to the pointing uncertainty
+ */
+void find_target_candidates (struct obs_pos_t *pos, float *target_location, int target_candidate_radius)
+{
+  unsigned int i;
+  float x, y;
+  float distSqX, radSq, distSqY;
+
+  radSq = (float) target_candidate_radius;
+  radSq *= radSq;
+
+  pos->n_candidates = 0;        /* initialise number of candidates */
+
+  x = target_location[0];
+  y = target_location[1];
+
+  for(i=0; i<pos->n; i++)
+  {
+    /* if (sqrt(pow((pos->x[i] - x), 2) + pow((pos->y[i] - y), 2)) < target_candidate_radius) */
+
+    distSqX = (pos->x[i] - x);
+    distSqX *= distSqX;
+    distSqY = (pos->y[i] - y);
+    distSqY *= distSqY;
+    /* check if distance to target location is below candidate radius */
+    if ((distSqX + distSqY) < radSq)
+    {
+      /* check the new candidate doesn't exceed the maximum number of candidates */
+      if (pos->n_candidates < NCAND)
+      {
+        /* store the candidates observed position index */
+        pos->candidate_index[pos->n_candidates] = i;
+        pos->n_candidates++;
+      }
+      else
+      {
+        /* exit function once number of maximum candidates is reached */
+        return;
+      }
+    }
+  }
+
+  return;
+}
+
+
+/**
+ * @brief Calculates an estimate for the maximum error for the angle used in the
+ *        @ref create_obs_DB "Observed Database" creation. This is used as limit
+ *        in the quantisation process.
+ * @param  x     x-components of the two distance vectors
+ * @param  y     y-components of the two distance vectors
+ * @param  dr    Distance error
+ * @param  theta Calculated angle
+ * @return       Estimated angle error
+ */
+float calculate_dAng (float *x, float *y, unsigned short dr, float theta)
+{
+  float dAng;
+  float r[2], xx[2], yy[2], cosinus;
+
+  /* copy values to preserve source variables */
+  xx[0] = x[0];
+  xx[1] = x[1];
+  yy[0] = y[0];
+  yy[1] = y[1];
+
+  /* Increases the separation of the 2 neighbour stars outwards by 2 dr
+     by assuming that their positional error is oriented towards each other */
+  stretch_fingerprint(xx, dr);
+  stretch_fingerprint(yy, dr);
+
+  r[0] = TaNorm(xx[0], yy[0]); /* calculate new separations after stretching */
+  r[1] = TaNorm(xx[1], yy[1]);
+
+  /* r[0] and r[1] are guaranteed to be > 0 by the parent function */
+  cosinus = (xx[0]*xx[1] + yy[0]*yy[1])/(r[0]*r[1]);
+
+  /* prevent floating point rounding errors */
+  if (cosinus < -1)
+    cosinus = -1;
+  if (cosinus >  1)
+    cosinus = 1;
+
+  /* Calculate difference between stretched and unstretched angle */
+  dAng = fabsf(theta - acosf (cosinus) * (180.0 / PI));
+
+  /* Return it as the estimated maximum error */
+  return dAng;
+}
+
+/**
+ * @brief Stretches the angle of a fingerprint by increasing the distance
+ *        vector separation by a total of twice the positional error
+ *
+ * @param x  x or y components of both distance vectors. Depends on what the
+ *           fuction receives
+ * @param dr Positional error from the @ref StarExtraction "Star Extraction"
+ *           process
+ */
+void stretch_fingerprint (float *x, unsigned short dr)
+{
+  if (x[0] < 0) /* base star is below the first partner */
+  {
+    if (x[1] < 0) /* base star is below the second partner*/
+    {
+      if (x[0] < x[1]) /* determine order of partners */
+      {
+        x[0] -= dr; /* increase the distance between them */
+        x[1] += dr; /* to approximate a maximum angle error */
+      }
+      else
+      {
+        x[0] += dr; /* increase the distance between them */
+        x[1] -= dr; /* to approximate a maximum angle error */
+      }
+    }
+    else
+    {
+      x[0] -= dr; /* increase the distance between them */
+      x[1] += dr; /* to approximate a maximum angle error */
+    }
+  }
+  else if (x[0] > 0)  /* base star is above the first partner */
+  {
+    if (x[1] > 0)     /* base star is below the second partner*/
+    {
+      if (x[0] > x[1])  /* determine order of partners */
+      {
+        x[0] -= dr;  /* increase the distance between them */
+        x[1] += dr;  /* to approximate a maximum angle error */
+      }
+      else
+      {
+        x[0] += dr;  /* increase the distance between them */
+        x[1] -= dr;  /* to approximate a maximum angle error */
+      }
+    }
+    else
+    {
+      x[0] += dr;  /* increase the distance between them */
+      x[1] -= dr;  /* to approximate a maximum angle error */
+    }
+  }
+
+  return;  /* return via x pointer */
+}
+
+/**
+ * @brief Calculates the norm of a vector
+ * @param  x x-component
+ * @param  y y-component
+ * @return Norm
+ */
+float TaNorm (float x, float y)
+{
+  return fsqrts(x*x + y*y);
+}
+
+
+/*****************************************************************
+ *                                                               *
+ *                          MATCHING PROCESS                     *
+ *                                                               *
+ *****************************************************************/
+
+/**
+ * @brief The match_databases function is the core of the Angle Method algorithm.
+ *        It uses the previously created observed and reference databases as
+ *        input and compares their fingerprints to determine if they were made from
+ *        the same source star. The matching process tries to identify each entry
+ *        of the reference database in the observed database and tracks both the
+ *        number of positive matches as well as the location of all matching
+ *        database entries. In a final matching quality assuring step all
+ *        ambiguous matches are removed to provide a conservative and secure
+ *        matching result.
+ *
+ * @param ref_DB  Reference database from the reference positions provided
+ *                for this observation
+ * @param obs_DB  Observed database built positions provided by the @StarExtraction
+ *                "Star Extraction" routine.
+ * @param results Output structure to store the matching results
+ */
+void match_databases (struct ref_db_t *ref_DB, struct obs_db_t *obs_DB, struct match_results_t *results)
+{
+  /* match_databases matches all entries and discards false positives */
+  unsigned int i, j, ref_base0, ref_base1, ref_angle;
+
+  /* initialize results constants and counter */
+  results->n_obs_pos = obs_DB->base0_counter + 1;
+  results->n_ref_pos = ref_DB->n_stars;
+
+  results->counter = 0;
+  results->base0_match_count_index = 0;
+
+  /* Scan obs_DB for matching ref_DB entries in order of
+     ref_target and ref_star i base0 */
+  for (i=0; i < ref_DB->n_stars-1; i++)
+  {
+    /* initialize results->base0_match_count array */
+    results->base0_match_count[results->base0_match_count_index] = 0;
+
+    /* filter obs_DB entries with matching base0 */
+    ref_base0 = ref_DB->data[i*3*(ref_DB->n_stars-2)];
+    find_base0(ref_base0, g_candidates, obs_DB);
+
+    for (j=0; j < ref_DB->n_stars-2; j++)
+    {
+      /* filter base0 matched obs_DB entries for matching base1 */
+      ref_base1 = ref_DB->data[i*3*(ref_DB->n_stars-2) + 3*j + 1];
+      find_base1(ref_base1, g_candidates, obs_DB);
+
+      /*n find full matches in base0/base1 pre filtered obs_DB entries */
+      ref_angle = ref_DB->data[i*3*(ref_DB->n_stars-2) + 3*j + 2];
+      find_matches(ref_base0, ref_base1, ref_angle, g_candidates, results, obs_DB);
+    }
+    /* store number of matches with ref_base0 of ref_target and ref_star i */
+    results->base0_index[results->base0_match_count_index] = i;
+    results->base0_match_count_index++;
+  }
+
+  /* discard duplicate matches of bases with different ref_star i */
+  find_majority_matches(results);
+
+  /* discard duplicate matches of different ref_bases with same obs_bases  */
+  correct_multiple_base_matches(results);
+
+  /* discard matches of different obs_star (minority matches)*/
+  find_valid_star_candidate(results);
+
+  return;
+}
+
+/**
+ * @brief Find base0 is used to reduce the scanned observed database to
+ *        fingerprints with a matching base0 to the compared reference
+ *        database. Therefore, it scans the @obs_db_t "value index" of the
+ *        observed database for matching base0 lengths and stores the
+ *        starting indices in the database of those fingerprints. Subsequent
+ *        search operations for the base1 length and the angle will only be
+ *        performed in the within the results of this operation for the current
+ *        reference database entry.
+ * @param ref_base0  Quanticed base0 length for the current reference fingerprint
+ * @param candidates Temporary storage for eligible fingerprint indices
+ * @param obs_DB  Observed database built positions provided by the @StarExtraction
+ *                "Star Extraction" routine.
+ */
+void find_base0 (unsigned int ref_base0, struct match_candidates_t *candidates, struct obs_db_t *obs_DB)
+{
+  unsigned int i, j, n, n_base0, n_base1;
+
+  n = obs_DB->base0_counter + 1; /* # of stars on which the DB is based */
+  n_base0 = 2*(n-1);             /* 2 entries each due to uncertainties */
+  n_base1 = 2*(n-1)*(n-2);
+
+  candidates->base0_match_counter = 0; /* initialise base0_match_counter */
+
+  /* iterate over databases of all possible target candidates */
+  for(i=0; i < obs_DB->candidate_counter; i++)
+  {
+    /* iterate over all base0 entries in the observed database*/
+    for(j=0; j < obs_DB->base0_counter; j++)
+    {
+      /* check if the current ref_base0 matches one of the two obs_base0 entries*/
+      if ((ref_base0 == obs_DB->value_index[i*(n_base0 + n_base1) + 2*j]) || (ref_base0 == obs_DB->value_index[i*(n_base0 + n_base1) + 2*j + 1]))
+      {
+        /* store matching indices */
+        candidates->base0_match_index[2*candidates->base0_match_counter + 0] = i;
+        candidates->base0_match_index[2*candidates->base0_match_counter + 1] = j;
+        candidates->base0_match_counter++;
+      }
+    }
+  }
+
+  return;
+}
+
+/**
+ * @brief Find base1 is used to further reduce the matching base0 sample,
+ *        that was retrieved by @find_base0 in an earlier step. Again the
+ *        @obs_db_t "value index" of the observed database is scanned for
+ *        matching base1 lengths. Utilising the already reduced sample from
+ *        the previous scan only the indices of matching base0 lengths are
+ *        considered now.
+ * @param ref_base1  Quanticed base1 length for the current reference fingerprint
+ * @param candidates Temporary storage for eligible fingerprint indices
+ * @param obs_DB    Observed database built positions provided by the @StarExtraction
+ *                  "Star Extraction" routine.
+ */
+void find_base1 (unsigned int ref_base1, struct match_candidates_t *candidates, struct obs_db_t *obs_DB)
+{
+  unsigned int i, j, star, base0, n, n_base0, n_base1;
+
+  n = obs_DB->base0_counter + 1; /* # of stars on which the DB is based */
+  n_base0 = 2*(n-1);             /* 2 entries each due to quantisation  */
+  n_base1 = 2*(n-1)*(n-2);
+
+  candidates->base1_match_counter = 0;  /* initialise base1_match_counter */
+
+  /* Iterate over all fingerprints with matching base0 lengths */
+  for (i=0; i < candidates->base0_match_counter; i++)
+  {
+    /* Extract target candidate (star) and base0 length data */
+    star  = candidates->base0_match_index[2*i + 0];
+    base0 = candidates->base0_match_index[2*i + 1];
+
+    /* Iterage over all base1 entries (n = base0-1) in the value index */
+    for (j=0; j < obs_DB->base0_counter-1; j++)
+    {
+      /* value index navigation:
+        star*(n_base0 + n_base1)  skips entries for other target candidates
+        n_base0                   skips base0 entries for current candidate
+        2*base0*(n-2)             skips previous base1 entries
+                                  2 entries per (n-2) base1 for each base0
+      */
+      /* check if the current ref_base1 matches one of the two obs_base1 entries*/
+      if ((ref_base1 == obs_DB->value_index[star*(n_base0 + n_base1) + n_base0 + 2*base0*(n-2) + 2*j]) || (ref_base1 == obs_DB->value_index[star*(n_base0 + n_base1) + n_base0 +  2*base0*(n-2) + 2*j + 1]))
+      {
+        /* store matching indices */
+        candidates->base1_match_index[3*candidates->base1_match_counter + 0] = star;
+        candidates->base1_match_index[3*candidates->base1_match_counter + 1] = base0;
+        candidates->base1_match_index[3*candidates->base1_match_counter + 2] = j;
+        candidates->base1_match_counter++;
+      }
+    }
+  }
+  return;
+}
+
+/**
+ * @brief Find matches scans the remaining sample observed database after the
+ *        reductions by find_base0 and find_base1 for the current full
+ *        reference fingerprint. Inidces and number of matching fingerprint
+ *        are stored in this step.
+ * @param ref_base0  Quanticed base0 length for the current reference fingerprint
+ * @param ref_base1  Quanticed base1 length for the current reference fingerprint
+ * @param ref_angle  Quanticed angle for the current reference fingerprint
+ * @param candidates Temporary storage for eligible fingerprint indices
+ * @param results    Output structure to store the matching results
+ * @param obs_DB     Observed database built positions provided by the @StarExtraction
+ *                   "Star Extraction" routine.
+ */
+void find_matches (unsigned int ref_base0, unsigned int ref_base1, unsigned int ref_angle, struct match_candidates_t *candidates, struct match_results_t *results, struct obs_db_t *obs_DB)
+{
+  unsigned int i, j, star, base0, base1, n, index, data_index;
+  unsigned int counter_ini, counter_end, n_matches;
+
+  n = obs_DB->base0_counter + 1;  /* # of stars on which the DB is based */
+
+  counter_ini = results->counter/(float)4; /* initialize counter for current ref_base */
+
+  /* iterate pre filtered entries with matching base0 and base1 */
+  for (i=0; i < candidates->base1_match_counter; i++)
+  {
+    /* Extract target candidate (star) and base0/base1 length data */
+    star    = candidates->base1_match_index[3*i + 0];
+    base0   = candidates->base1_match_index[3*i + 1];
+    base1   = candidates->base1_match_index[3*i + 2];
+
+    /* create index to access the right obs_DB-> data entries */
+    /* index is used to navigate the logical obs_DB structure */
+    /* index navigation:
+       star*(n-1)*(n-2)   skips entries for other target candidates
+                           n      number of stars
+                          (n-1)   number of base0
+                          (n-2)   number of base1
+
+       base0*(n-2)        skips previous base0 entrie
+                          each base0 has (n-2) entries for its base1 combinations
+
+       base1              skips previous base1 entries
+    */
+    index   = (star*(n-1)*(n-2)) + base0*(n-2) + base1;
+    /* data_index contains the actual position in the obs_DB data. This is
+       necessary since not every base0/base1 combination produces an equal
+       amount of fingerprints. */
+    data_index = obs_DB->base1_index[index];
+
+    /* Iterate over the number of fingerprints for base0/base1 combination*/
+    for (j=0; j < obs_DB->base1_data_count[index]; j++)
+    {
+      /* compare base0, base1, angle (full fingerprint) */
+      if ((ref_base0 == obs_DB->data[data_index + 3*j + 0]) && (ref_base1 == obs_DB->data[data_index + 3*j + 1]) && (ref_angle == obs_DB->data[data_index + 3*j + 2]))
+      {
+        /* store matched indices */
+        results->match_results[results->counter + 0] = star;
+        results->match_results[results->counter + 1] = base0;
+        results->match_results[results->counter + 2] = base1;
+        results->match_results[results->counter + 3] = j;
+        results->counter += 4;
+      }
+    }
+  }
+
+  counter_end = results->counter/(float)4;
+
+   /* calculate number of matches for current ref_base */
+  n_matches = counter_end - counter_ini;
+
+  if (n_matches > 0)
+    results->base0_match_count[results->base0_match_count_index] += n_matches;
+
+  return;
+}
+
+/**
+ * @brief This function is the first step in the process to eliminate false
+ *        positive matches. Due to the quantisation process during the database
+ *        creations some fingerprints can be ambiguously matched to the wrong
+ *        reference base. Therefore all matches for a certain reference base0
+ *        and base1 length are checked to be from the same observed base0. If
+ *        this is not the case matches that don't fit the majority of matches
+ *        for this set of fingerprints will be discarded.
+ * @param results Output structure to store the matching results
+ */
+void find_majority_matches (struct match_results_t *results)
+{
+  unsigned int i, current_match_index;
+
+  current_match_index = 0;
+
+  /* initialize trackers and histogram */
+  /* The dimensions of the trackers and the histogram are defined
+    by the amount of available base0 combinations and thus each represent
+    such a base0. The histogram tracks the amount of matches for each base0,
+    while the trackers log the index observed star or base0 with which the
+    majority of matches occured. The logged indices from the previous
+    Find Matches routine are used as input data for this process. Since they
+    are a certain base combintaion they are numbered from [0:n stars-1] and
+    don't represent any quanitsed entities.
+    The value if -1 is used to indicate when no match was found.
+   */
+  for (i=0; i < results->n_ref_pos-1; i++)
+  {
+    results->match_histogram[i] =  0;
+    results->star_tracker[i]    = -1;
+    results->base0_tracker[i]   = -1;
+  }
+  /* iterate through all matched bases via results->base0_match_count */
+  for (i=0; i < results->base0_match_count_index; i++)
+  {
+    /* find the dominant result for the matched observed star */
+    find_unique_matches(results, g_output, i, current_match_index, 0);
+
+    /* Store the results if there is a match for this reference base*/
+    if (g_output->index_max_count != -1)
+      results->star_tracker[results->base0_index[i]] = g_output->items[g_output->index_max_count];
+
+    /* Delete minority matches if the reference was matched with multiple stars */
+    if (g_output->n_items > 1)
+      delete_results(results, i, current_match_index, 0);
+
+    /* find the dominant result for the matched observed base0 */
+    find_unique_matches(results, g_output, i, current_match_index, 1);
+
+    /* Store the results if there is a match for this reference base*/
+    if (g_output->index_max_count != -1)
+      results->base0_tracker[results->base0_index[i]] = g_output->items[g_output->index_max_count];
+
+    /* Delete minority matches if the reference was matched with multiple base0 */
+    if (g_output->n_items > 1)
+      delete_results(results, i, current_match_index, 1);
+
+    /* Due to the quantisation multiple variations of a single observed
+       fingerprint can be matched to several fingerprints of that reference
+       base0. Such multiple and hence ambiguous matches are identified here */
+    find_unique_matches(results, g_output, i, current_match_index, 2);
+
+    /* The match histogram is incremented by the number of matches uniquely
+       identified in the previous step of the  find_unique_matches function.
+       Selective counter only counts items marked as unique */
+    results->match_histogram[results->base0_index[i]] = selective_counter(g_output->counts, g_output->n_items, 1);
+
+    /* update navigation index */
+    current_match_index += 4*results->base0_match_count[i];
+  }
+
+  return;
+}
+
+/**
+ * @brief Scans the match result for a certain reference base0 for its unique
+ *        matches with a certain observed base0. If matching with Additional
+ *        observed base0 occurs, the dominantly matched observed base0 for the
+ *        reference is considered to be the correct match. Matches with other
+ *        observed base0, including their contribution to the overall match
+ *        count are discarded.
+ * @param results             Output structure to store the matching results
+ * @param output              Output structure for the TaUnique function
+ *                            Stores unique items and their number of occurrence
+ *                            Used as return value.
+ * @param match_count_index   Index of the of the current base0 to access
+ *                            the respective number of matches
+ * @param match_results_index Starting index for match results access
+ * @param entry               Selects which part of the fingerprint is used.
+ *                            0: star, 1: base0, 2:base1
+ */
+void find_unique_matches (struct match_results_t *results, struct unique_output_t *output, int match_count_index, int match_results_index, int entry)
+{
+  unsigned int i, j;
+  int item, tmp_max;
+
+  output->n_items = 0;
+
+  /* Iterate over the number of matched fingerprints */
+  for(i=0; i < results->base0_match_count[match_count_index]; i++)
+  {
+    /* select the current matched entity (star/base0/base1/fp) */
+    item = results->match_results[match_results_index + 4*i + entry];
+
+    /* only call unique if the current item is a valid entry */
+    if (item == -1)
+      continue;
+
+    /* Count the amount of uniquely matched entities for this base0 */
+    TaUnique(output, item);
+  }
+
+  /* find the item with the maximum number of counts */
+  if (output->n_items == 1)
+   /* Only 1 item? Select first item (position = 0)*/
+    output->index_max_count = 0;
+
+  else if (output->n_items > 1)
+  {
+    /* More than one item? Find index of the item with the maximum count */
+    tmp_max = output->counts[0];
+    for (j=1; j < output->n_items; j++)
+    {
+      if (output->counts[j] > tmp_max)
+      {
+        tmp_max = output->counts[j];
+        output->index_max_count = j;
+      }
+    }
+  }
+  else
+    /* Invalid result */
+    output->index_max_count = -1;
+
+  return;
+}
+
+
+/**
+ * @brief This function is a further step in the reduction of false positive
+ *        identifications to identify matches of multiple reference bases with
+ *        the same observed fingerprint (the previous step dealt with the same
+ *        problem within single reference base0).Therefore the exact matching
+ *        history for each reference base0 is analysed to identify different
+ *        reference base0 that matched with the same observed fingerprint which
+ *        must not happen for unambiguous results. These cases are compared
+ *        amongst each other and only the best result is kept and corrected
+ *        for all fingerprints that were also matched to other reference base0.
+ * @param results Output structure to store the matching results
+ */
+void correct_multiple_base_matches(struct match_results_t *results)
+{
+  int index, tmp_max, maximum, valid_base_match_index, duplicate_base_match_index,  base0_max_index;
+  unsigned int h, i, j, k, l, max_index, base0_match_index;
+
+  /* Scan which observed star was matched for each reference base0*/
+  find_unique_tracker_items (results->star_tracker, results->n_ref_pos-1, g_unique_stars, 0, 0);
+
+  /* Iterate over every matched star to correct mutlitple base0 matches */
+  for(h=0; h < g_unique_stars->n_items; h++)
+  {
+    /* Find tracker items that don't belong to the currently analysed star */
+    TaWhere (results->star_tracker, results->n_ref_pos-1, g_multi_base_skip_index, g_unique_stars->items[h], 5);
+
+    /* Scan which observed base0 was matched for each reference base0 for the current star */
+    find_unique_tracker_items (results->base0_tracker, results->n_ref_pos-1, g_unique_base0, g_multi_base_skip_index->n_items, g_multi_base_index->items);
+
+     /* Analyse the result of the previous step to find if a certain observed
+        base0 was matched with more than one reference base0. The fingerprints
+        of one reference base must only match the fingerprints of one particular
+        observed base. These cases are stored in g_multi_base_index for further
+        investigation */
+    TaWhere (g_unique_base0->counts, g_unique_base0->n_items, g_multi_base_index, 1, 3);
+
+    /* Iterate through each multi base flagged reference base results */
+    for(i=0; i < g_multi_base_index->n_items; i++)
+    {
+      /* g_multi_base_index stores the index of a multiply matched
+         base0 in g_unique_base0. It is used to access the respective base0 to
+         identify which observed base0 was multiply matched.*/
+      index = g_multi_base_index->items[i];
+
+      /*  All reference base matches with the multiply matched observed base0
+          are extracted from the Base0 Tracker. The observed base0 of interest
+          is identified by its number stored in g_unique_base0->items[index]. The
+          result contains the affected reference base0 indices and is stored in
+          g_duplicate_base0 */
+      TaWhere (results->base0_tracker, results->n_ref_pos-1, g_duplicate_base0, g_unique_base0->items[index], 0);
+
+      /* The reference base0 indices in g_duplicate_base0 are used to access the
+         number of matches in the Match Histogram. The reference base0 with more
+         matches of the observed base0 will be considered as the valid match */
+      tmp_max   = results->match_histogram[g_duplicate_base0->items[0]];
+      max_index = 0;
+      maximum   = TRUE;
+
+      /* find the duplicate base0 with more matches */
+      for(j=1; j < g_duplicate_base0->n_items; j++)
+      {
+         /* the base at max index is seen as the best match and hence valid base */
+        if (results->match_histogram[g_duplicate_base0->items[j]] > tmp_max)
+        {
+          tmp_max   = results->match_histogram[g_duplicate_base0->items[j]];
+          max_index = j;  /* Index of the base with most matches */
+          maximum   = TRUE;
+        }
+        /* check if clear maximum can be determined */
+        else if (results->match_histogram[g_duplicate_base0->items[j]] == tmp_max)
+        {
+          maximum = FALSE;
+        }
+      }
+
+      /* If no maximum could be found due to the same number of matches for
+         all affected reference bases all their results are discarded and their
+         Match Histogram counters set to 0 */
+      if (!maximum)
+      {
+        /* reset all match counts to 0 if no clear maximum could be found */
+        for (j=0; j < g_duplicate_base0->n_items;j++)
+        {
+          results->match_histogram[g_duplicate_base0->items[j]] = 0;
+        }
+      }
+      /* If a maximum for the matches with a reference base0 can be identified
+         the counts in the Match Histogram have to be corrected*/
+      else
+      {
+        /* used for match_results with all indices to star/base0/base1/fp */
+        valid_base_match_index = 0;
+
+        /* find match results start index for the valid reference base */
+        for (j=0; j < g_duplicate_base0->items[max_index]; j++)
+        {
+          valid_base_match_index += 4*results->base0_match_count[j];
+        }
+
+        /* Index of best matched base0 in the tracker [0:n-1] */
+        base0_max_index = g_duplicate_base0->items[max_index];
+
+        /* Iterate over all reference base0 that were flagged to be matched with
+           the same observed base0 and discard invalid results */
+        for (j=0; j < g_duplicate_base0->n_items; j++)
+        {
+          if (j != max_index)
+          {
+            /* Extract index of not best matched reference base0 with duplicates */
+            base0_match_index = g_duplicate_base0->items[j];
+
+            /* Initisalise variables */
+            g_duplicate_base1->n_items = 0;
+            duplicate_base_match_index = 0;
+
+            /* reset match counts to 0 for this reference */
+            results->match_histogram[g_duplicate_base0->items[j]] = 0;
+
+            /* find match results start index for the invalid reference base */
+            for (k=0; k < base0_match_index; k++)
+            {
+              duplicate_base_match_index += 4*results->base0_match_count[k];
+            }
+
+            /* iterate over all matches of the valid reference base0 */
+            for (k=0; k < results->base0_match_count[base0_match_index]; k++)
+            {
+              /* Skip for invalid/previously discarded entries */
+              if (results->match_results[duplicate_base_match_index + 4*k + 2] == -1)
+                continue;
+
+              /* Iterate over valid base matches and compare if the matched
+                 fingerprints (base0/base1 combinations) are the same as the
+                 the fingerprints that were matched to the other reference base0
+                 with less overall matches. Consider them as ambiguous and
+                 store them in g_duplicate_base1 for later deletion */
+              for (l=0; l < results->base0_match_count[base0_max_index]; l++)
+              {
+                if (results->match_results[duplicate_base_match_index + 4*k + 2] == results->match_results[valid_base_match_index + 4*l + 2])
+                {
+                  g_duplicate_base1->items[g_duplicate_base1->n_items] = results->match_results[duplicate_base_match_index + 4*k + 2];
+                  g_duplicate_base1->n_items++; /* matched with same base1? -> store base1 for later removal */
+                  break; /* break is valid as each base1 entry is unique at this point */
+                }
+              }
+            }
+          }
+        }
+
+        /* Initialise g_unique_duplicate_entry counter */
+        g_unique_duplicate_entry->n_items = 0;
+
+        /* Find how often duplicate entries show up for a certain base1 to only
+           correct the count of the valid reference base once.
+           In each iteration a new items is fed into the g_unique_duplicate_
+           entry structure to analyse if it already occured or not. */
+        for (k=0; k < g_duplicate_base1->n_items; k++)
+        {
+          TaUnique (g_unique_duplicate_entry, g_duplicate_base1->items[k]);
+        }
+
+        /* correct match_histogram from multiple matches */
+        results->match_histogram[g_duplicate_base0->items[max_index]] -= g_unique_duplicate_entry->n_items;
+      }
+    }
+  }
+
+  return;
+}
+
+/**
+ * @brief After discarding false positives within the reference bases the
+ *        best target candidate is chosen as the target and all matches
+ *        with other target candidates are deleted from the Match Histogram.
+ *        In addition fingerprints that were matched by chance are identified
+ *        by the match statistics and discarded as well. The remaining matches
+ *        are used to calculate the final match count.
+ *
+ * @param results Output structure to store the matching results
+ */
+void find_valid_star_candidate (struct match_results_t *results)
+{
+  int max_index, min_matches;
+  unsigned int i;
+  float avg_match, std;
+
+  /* Scan which observed target candidate was matched for each reference base0 */
+  find_unique_tracker_items (results->star_tracker, results->n_ref_pos-1, g_unique_stars, 0, 0);
+
+  /* Determine the valid result by choosing the star with most matches */
+  max_index = TaArgmax (g_unique_stars->counts, g_unique_stars->n_items);
+
+  /* Case when maximum was found */
+  if (max_index > -1)
+  {
+    /* Store valid target candidate star */
+    results->target_star = g_unique_stars->items[max_index];
+
+    /* Reset match_histogram entries that were matched to another candidate */
+    for (i=0; i < results->n_ref_pos - 1; i++)
+    {
+      if (results->star_tracker[i] != results->target_star)
+        results->match_histogram[i] = 0;
+    }
+
+    /* Most false positives have been discarded at this point. Only
+       fingerprints that matched by chance are left. These can be easily spotted
+       since a reference base with such will have significantly fewer matches
+       in the single digits. Therefore set a minimum number of matches for
+       each reference base0 in the histogram to sort them out as well */
+
+    /* Check if matches survived all the reduction process */
+    if (TaMax(results->match_histogram, results->n_ref_pos-1) > 0)
+    {
+      /* Calculate the average number of matches per reference base0 and the
+         respective standard deviation for this result */
+      avg_match = TaAverage (results->match_histogram, results->n_ref_pos-1);
+      std = TaStdev (results->match_histogram, results->n_ref_pos-1, avg_match);
+
+      /* Define minimum number of matches to be within 2 sigma of the average */
+      min_matches = (int)avg_match - (int)(2*std);
+
+      /* Discard matches of all reference bases
+         that don't satisfy the minimum match number */
+      for (i=0; i < results->n_ref_pos - 1; i++)
+      {
+        if (results->match_histogram[i] < min_matches)
+          results->match_histogram[i] = 0;
+      }
+
+      /* Count how many reference bases have matched observed bases */
+      TaWhere (results->match_histogram, results->n_ref_pos-1, g_base0_count, 1, 4);
+      /* Store number of total matches over all reference bases */
+      results->n_matched_items = TaSum (results->match_histogram, results->n_ref_pos-1);
+      /* Store number of reference bases matched to observed bases */
+      results->n_matched_bases = g_base0_count->n_items;
+    }
+    else
+    /* No target candidate can clearly be identified as the target.
+      -> matching process failed */
+    {
+      results->target_star = -1;
+      results->n_matched_items = 0;
+      results->n_matched_bases = 0;
+    }
+  }
+  else
+  {
+    /* No target candidate can clearly be identified as the target.
+      -> matching process failed */
+    results->target_star = -1;
+    results->n_matched_items = 0;
+    results->n_matched_bases = 0;
+  }
+
+  return;
+}
+
+
+/**
+ * @brief This function serves as a wrapper to set up TaUnique to identify the
+ *        unique entries in the tracker structures that stores the indices
+ *        of star/base0/base1/fp matched with a reference base
+ *
+ * @param tracker  Array of the results structure that stores with which
+ *                 star/base0/base1/fp a certain reference base was matched
+ * @param n       Number of entries in the tracker
+ * @param output  Output structure of the TaUnique function
+ */
+void find_unique_tracker_items (int *tracker, unsigned int n, struct unique_output_t *output, unsigned int n_skip, unsigned int *skip_entries)
+{
+  unsigned int i, j;
+  int item;
+
+  output->n_items = 0;
+
+  /* iterate over current match star/base0/base1/fp */
+  for (i=0; i < n; i++)
+  {
+    /* check if the current index is on the list for skipped indices */
+    for(j=0; j< n_skip; j++)
+    {
+      if (i == skip_entries[j])
+        continue;
+    }
+
+    item = tracker[i];
+
+    /* invalid entries are marked as -1. Everything else is >= 0 */
+    if (item < 0)
+      continue;
+    /* Feed the item into the TaUnique structure to determine if it is a
+       unique entry amongst the other items in this loop. */
+    TaUnique (output, item);
+  }
+
+  return;
+}
+
+
+#define TA_MATCHED_ITEMS_PCT 50
+#define TA_MATCHED_BASES_PCT 50
+#define TA_MATCHED_BASEITEMS_PCT 65
+/**
+ * @brief The match quality determined by the total number of matches in the
+ *        Match Histogram of the results compared to the theoretical maximum
+ *        for the given observed positions. If more than 50% of the possible
+ *        matches are met the target identification is considerd to be valid.
+ * @param results Output structure to store the matching results
+ * @param obs_pos Observed positions that were extracted by the Star Extraction
+ *                process
+ */
+void determine_match_quality (struct match_results_t *results, struct obs_pos_t *obs_pos)
+{
+  int max_possible_items, possible_items;
+  float identified_items_percent = 0.0, identified_base_items_percent = 0.0, identified_bases_percent = 0.0;
+#ifdef GROUNDSW
+  float x, y;
+#else
+  (void) obs_pos;
+#endif
+  /* The number of possible fingerprints is defined by (n-1)*(n-2) where
+    n     is the number of available stars
+    (n-1) is the number of base0 combinations between the stars
+    (n-2) is the number of base1 combinations between the stars.
+
+    possible_items  number of total possible fingerprints including
+                    reference bases which results might have been discarded
+                    during the previous steps. Theoretical maximum from the
+                    reference point of view.
+    */
+  possible_items           = results->n_matched_bases * (results->n_obs_pos-2);
+
+  /* max_possible_items  number of total possible fingerprints created form the
+                         observed positions. Not all of these possible
+                         fingerprints will be found in the reference database
+                         since interloping stars or false positive positions
+                         from cosmics might contaminate the observed positions */
+   /* n_obs_pos > 3, thus the result is > 0 */
+  max_possible_items       = (results->n_obs_pos-1)*(results->n_obs_pos-2);
+
+  /* Percentage of matched observed fingerprints */
+  if (max_possible_items > 0)
+    {
+      identified_items_percent = (results->n_matched_items / (float)max_possible_items) * 100;
+    }
+
+  /* Percentage of matched referece base0 */
+  if (results->n_obs_pos-1 >= 2)
+    {
+      identified_bases_percent              = (results->n_matched_bases / ((float)results->n_obs_pos-1)) * 100; /* n_obs_pos > 3 */
+    }
+
+  /* Percentage of matched fingerprints relative to the maximum possible
+     matches from the reference POV (base_items = fingerprints) */
+  if (possible_items > 0)
+    {
+      identified_base_items_percent         = (results->n_matched_items / (float)possible_items) * 100;
+    }
+
+  /* the match quality is used by the TargetAcquisition */
+  /* it will be used in the target acquisition main function and has to
+      represent the percentage that is closest to the theoretical maximum
+      from the reference POV */
+  results->match_quality   = identified_items_percent;
+
+  /* The result based solely on the observed position is used to determine
+     the validity of the target acquisition first. Reference stars for the
+     database and the detection threshold for the Star Extraction routine are
+     selected such that all observed positions should also be included in the
+     reference. Therefore a good observation without false positives from
+     cosmic rays etc will be well matched with the available reference.
+
+     A positive identification as target requires more than 50% of the
+     possible fingerprints for the observed positions to be matched. Even
+     though the earlier match result reduction tried to exclude all ambiguous
+     matched it is theoretically possible that a very difficult case could
+     lead to a wrongly selected target candidate. Requiring more than half of
+     the database to uniquely match to the candidate garantuees that no other
+     candidate would have been a better match. */
+  if (identified_items_percent > TA_MATCHED_ITEMS_PCT)
+    results->valid_quality = TRUE;
+
+  /* For observations with a low number of observed stars in sparse fields
+     a single false detection can degrade the result comparatively stronger
+     than it would in a crowded field. Therefore otherwise good observations
+     might fail the target acquisition. To counter this the number of matches
+     is compared to the theoretical values from the reference POV. To be on
+     the safe side restrictions for positive identifications are a bit stronger
+     so that the result has to satisfy 65% as minimum value for the matched
+     reference bases and the matches in each reference base.*/
+  /*else if ((identified_bases_percent > TA_MATCHED_BASES_PCT) && (identified_base_items_reduced_percent > TA_MATCHED_BASEITEMS_PCT))*/
+  else if ((identified_bases_percent > TA_MATCHED_BASES_PCT) && (identified_base_items_percent > TA_MATCHED_BASEITEMS_PCT))
+    results->valid_quality = TRUE;
+
+  /* Otherwise the identification through the Angle Method is marked as failed */
+  else
+    results->valid_quality = FALSE;
+
+#ifdef GROUNDSW
+  if (results->target_star >= 0)
+  {
+    x = obs_pos->x[obs_pos->candidate_index[results->target_star]];
+    y = obs_pos->y[obs_pos->candidate_index[results->target_star]];
+
+    TA_DEBUG("Target identified as observed star %d (target candidate %d) at position [x, y]: [%.2f, %.2f]\n", obs_pos->candidate_index[results->target_star], results->target_star, x, y);
+    TA_DEBUG("%.2f percent detected database items (%d / %d matched items)\n", identified_items_percent, results->n_matched_items, max_possible_items);
+    TA_DEBUG("%.2f percent detected items (%d / %d) within the identified bases (%d / %d)\n", identified_base_items_percent, results->n_matched_items, possible_items, results->n_matched_bases, results->n_obs_pos-1);
+
+    if (results->valid_quality)
+      TA_DEBUG("\nTarget validation successful.\n");
+    else
+      TA_DEBUG("\nTarget validation unsuccessful.\n");
+    }
+#endif
+
+  return;
+}
+
+/**
+ * @brief Uses the target star position obtained from the Angle Method Algorithm
+ *        to calculate the pixel offset to the intended Target Location in
+ *        centipixel [cpx]. The offset is returned by the pointer to the shift
+ *        array.
+ * @param obs_pos         Observed positions that were extracted by the
+ *                        Star Extraction process
+* @param results          Output structure to store the matching results
+ * @param shift           Calculated offset from the Target Location [cpx]
+ * @param target_location Intended Target Location provided by ground support
+ */
+void calculate_target_shift_AMA (struct obs_pos_t *obs_pos, struct match_results_t *results, int *shift, float *target_location)
+{
+  float x, y, dx, dy;
+
+  /* retrieve x/y coordinates from the observed positions and results */
+
+  /* NOTE: The maximum number of obs_pos->candidate_index members is counted in find_target_candidates and assigned to obs_pos->n_candidates.
+     The members in obs_pos->n_candidates are then used to construct the entries in the observed star database (obs_DB) and results->target_star
+     is restricted to its length. Therefore results->target_star cannot exceed the array */
+
+  x = obs_pos->x[obs_pos->candidate_index[results->target_star]];
+  y = obs_pos->y[obs_pos->candidate_index[results->target_star]];
+
+  /* calculate offset */
+  dx = target_location[0] - x;
+  dy = target_location[1] - y;
+
+  /* conversion to centi-pixel */
+  shift[0] = (int)(dx * 100);
+  shift[1] = (int)(dy * 100);
+
+#ifdef GROUNDSW
+  /* Redudant information. Displayed by TargetAcquisitionMain.c */
+  /* printf("\nMove satellite by dx: %.2f, dy: %.2f pixel to center it.\n", dx, dy);*/
+#endif
+
+  return;
+}
+
+
+/*****************************************************************
+ *                                                               *
+ *                      GENERAL FUNCTIONS                        *
+ *                                                               *
+ *****************************************************************/
+
+/**
+ * @brief The TaUnique function analyses its input data to determine if the
+ *        items in the data are unique. In addition it counts how often a
+ *        provided item occurs. It works with one item at a time and stores all
+ *        the provided data in the output structure. Therefore it is usually
+ *        embedded in some form of loop in the calling function.
+ *        The function is designed after the unique function in numpy.
+ * @param output Output structure to store the provided data and result
+ * @param item   Iteratively provided data of the parent function
+ */
+void TaUnique (struct unique_output_t *output, int item)
+{
+  unsigned int j, new_item;
+
+  if (output->n_items == 0)
+  {
+    /* add the first item to the item list and increase count */
+    output->items[output->n_items] = item;
+    output->counts[output->n_items] = 1;
+    output->n_items++;
+  }
+  else
+  {
+    new_item = TRUE; /* initialize new_item */
+
+    /* look if current item matches existing item */
+    for (j=0; j < output->n_items; j++)
+    {
+      if (item == output->items[j])
+      {
+        /* increase count if it's already in the list */
+        output->counts[j]++;
+        new_item = FALSE;
+        break;
+      }
+    }
+
+      /* add it to the end of the list if it's new */
+    if (new_item)
+    {
+      output->items[output->n_items] = item;
+      output->counts[output->n_items] = 1;
+      output->n_items++;
+    }
+  }
+
+  return;
+}
+
+/**
+ * @brief The TaWhere function scans the provided array for items
+ *        = / </ <= / > / >= compared to a provided argument. The respective
+ *        operation can be defined by the operator variable. The result is an
+ *        array with the items that satisfy the condition and their count.
+ *        The function is designed to support more operators than necessary
+ *        for the target acquitision.
+ *
+ *        The function is designed after the where function in numpy.
+ * @param x        Input data array
+ * @param n        Number of elements in x
+ * @param output   Output structure with items and n
+ * @param arg      Argument to which the items in x are compared
+ * @param operator Operator for the comparison:
+ *                 0: =
+ *                 1: <
+ *                 2: <=
+ *                 3: >
+ *                 4: >=
+ *                 5: !=
+ */
+void TaWhere (int *x, unsigned int n, struct where_output_t *output, int arg, int operator)
+{
+  unsigned int i;
+
+  output->n_items = 0;
+
+  for (i=0; i < n; i++)
+  {
+    switch (operator)
+    {
+      case 0:
+
+        if (x[i] == arg)
+        {
+          output->items[output->n_items] = i;
+          output->n_items++;
+        }
+        break;
+
+      case 1:
+
+        if (x[i] < arg)
+        {
+          output->items[output->n_items] = i;
+          output->n_items++;
+        }
+        break;
+
+      case 2:
+
+        if (x[i] <= arg)
+        {
+          output->items[output->n_items] = i;
+          output->n_items++;
+        }
+        break;
+
+      case 3:
+
+        if (x[i] > arg)
+        {
+          output->items[output->n_items] = i;
+          output->n_items++;
+        }
+        break;
+
+      case 4:
+
+        if (x[i] >= arg)
+        {
+          output->items[output->n_items] = i;
+          output->n_items++;
+        }
+        break;
+
+      case 5:
+
+        if (x[i] != arg)
+        {
+          output->items[output->n_items] = i;
+          output->n_items++;
+        }
+        break;
+
+      default:
+    #ifdef GROUNDSW
+        TA_DEBUG("unknown logic for where function.");
+    #endif
+        break;
+    }
+  }
+
+  return;
+}
+
+/**
+ * @brief Delete Results is used to delete false positive matches in the
+ *        Tracker arrays in the Find Majority Matches function
+ *  @param results            Output structure to store the matching results
+ * @param match_count_index   Index of the reference base from which results
+ *                            are deleted
+ * @param match_results_index Index of the entry to delete within the
+ *                            reference base
+ * @param entry               Argument to control whether fingerprints shall be
+ *                            deleted based on the matched observed star (0)
+ *                            or the observed base (1).
+ */
+void delete_results (struct match_results_t *results, unsigned int match_count_index, unsigned int match_results_index, unsigned int entry)
+{
+  unsigned int i, j, current_index;
+
+  /* Iterate over all matched fingerprints of a refernce base0 */
+  for (i=0; i < results->base0_match_count[match_count_index]; i++)
+  {
+    /* delete entry by comparing matched star */
+    if (entry == 0)
+    {
+      /* each fingerprint consists of 4 items hence the +4* in the indices */
+      if (results->star_tracker[results->base0_index[match_count_index]] != results->match_results[match_results_index + 4*i + entry])
+      {
+        /* Advance to the next fingerprint */
+        current_index = match_results_index + 4*i;
+        for(j=current_index; j<current_index+4; j++)
+        {
+          results->match_results[j] = -1;
+        }
+      }
+    }
+
+    /* delete entry by comparing matched base within star */
+    else if (entry == 1)
+    {
+      /* 4*i advances to the next fingerprint, +entry selects the compared item */
+      if (results->base0_tracker[results->base0_index[match_count_index]] != results->match_results[match_results_index + 4*i + entry])
+      {
+        /* Advance to the next fingerprint */
+        current_index = match_results_index + 4*i;
+        for (j=current_index; j < (current_index + 4); j++)
+        {
+          results->match_results[j] = -1;
+        }
+      }
+    }
+  }
+
+  return;
+}
+
+/**
+ * @brief Selective Counter counts the number of array items that match
+ *        the provided argument.
+ * @param  x   Array containing the data to be analysed
+ * @param  n   Number of array items
+ * @param  arg Argument that has to be matched to increment counter
+ * @return     Number of array items that matched the argument
+ */
+int selective_counter (int *x, int n, int arg)
+{
+  int i, counter;
+
+  counter = 0;
+  for (i=0; i < n; i++)
+  {
+    if (x[i] == arg)
+      counter++;
+  }
+
+  return counter;
+}
+
+
+/**
+ * @brief   The TaArgmax function finds the index the highest entry of an array.
+ * @param  x  Array containing the data to be analysed
+ * @param  n  Number of array items
+ * @return    Index of the maximum entry
+ */
+int TaArgmax (int *x, int n)
+{
+  int i, tmp_max, max_index;
+
+  /* Initialise the temporary maximum */
+  tmp_max = x[0];
+  max_index = 0;
+
+  /* Iterate over data array */
+  for (i=1; i < n; i++)
+  {
+    /* If the current entry is larger than the current maximum use it instead */
+    if (x[i] > tmp_max)
+    {
+      tmp_max = x[i];
+      max_index = i;
+    }
+    /* If two entries have the same value and no clear maximum can be found
+       set the maximum index to an invalid value */
+    else if (x[i] == tmp_max)
+    {
+      max_index = -1;
+    }
+  }
+
+  return max_index;
+}
+
+/**
+ * @brief   The TaArgmin function finds the index the highest entry of an array.
+ * @param  x  Array containing the data to be analysed
+ * @param  n  Number of array items
+ * @return    Index of the maximum entry
+ */
+int TaArgmin (float *x, int n)
+{
+  int i, min_index;
+  float tmp_min;
+
+  /* Initialise the temporary maximum */
+  tmp_min = x[0];
+  min_index = 0;
+
+  /* Iterate over data array */
+  for (i=1; i < n; i++)
+  {
+    /* If the current entry is smaller than the current maximum use it instead */
+    if (x[i] < tmp_min)
+    {
+      tmp_min = x[i];
+      min_index = i;
+    }
+    /* If two entries have the same value and no clear maximum can be found
+       set the maximum index to an invalid value */
+    else if (x[i] == tmp_min)
+    {
+      min_index = -1;
+    }
+  }
+
+  return min_index;
+}
+
+/**
+ * @brief TaMax returns the highest value of a provided array
+ * @param  x  Array containing the data to be analysed
+ * @param  n  Number of array items
+ * @return    Maximum value of the array
+ */
+int TaMax (int *x, int n)
+{
+  int i, tmp_max;
+
+  /* Initialise temporary maximum */
+  tmp_max = x[0];
+
+  /* Iterate over data array */
+  for (i=1; i < n; i++)
+  {
+    /* If current item is larger than current maximum use it instead */
+    if (x[i] > tmp_max)
+    {
+      tmp_max = x[i];
+    }
+  }
+
+  return tmp_max;
+}
+
+/**
+ * @brief Summarise all entries of the provided data array
+ * @param  x  Array containing the data to be analysed
+ * @param  n  Number of array items
+ * @return    Sum of array items
+ */
+int TaSum (int *x, int n)
+{
+  /* sum sums up all entries in x[] */
+
+  int i, sum;
+
+  sum = 0;
+
+  for (i=0; i < n; i++)
+  {
+    sum += x[i];
+  }
+
+  return sum;
+}
+
+/**
+ * @brief Calculate the average value of the items larger than zero in a
+ *        provided array. Zeros are excluded as the function is designed
+ *        to count the average number of matches for identified reference
+ *        bases. Not identified reference bases will have a zero value.
+ * @param  x  Array containing the data to be analysed
+ * @param  n  Number of array items
+ * @return    Average value of the provided array items
+ */
+float TaAverage (int *x, int n)
+{
+  int i, counter, sum;
+  float average;
+  /* Initialise variables */
+  sum = 0;
+  counter = 0;
+
+  /* Iterate over array items */
+  for (i=0; i < n; i++)
+  {
+    /* Ignore zero valued items in the average */
+    if (x[i] > 0)
+    {
+      sum += x[i];
+      counter++;
+    }
+  }
+
+  if (counter == 0)
+  {
+    /* no data gets an average of 0 */
+    average = 0.0f;
+  }
+  else
+  {
+    average = sum/counter;
+  }
+
+  return average;
+}
+
+/**
+ * @brief Calculate the standard deviation for the average value of the items
+ *        in a data array.
+ * @param  x        Array containing the data to be analysed
+ * @param  n        Number of array items
+ * @param  average  Average value of the provided array items
+ * @return          Standard deviation of the provided array items
+ */
+float TaStdev (int *x, int n, float average)
+{
+  int i, sum_squares;
+  float std_dev, counter;
+
+  /* Initialise variables */
+  sum_squares = 0;
+  counter = 0;
+
+  /* Iterate over array items */
+  for (i=0; i < n; i++)
+  {
+    if (x[i] > 0)
+    {
+      sum_squares += ((x[i] - average)*(x[i] - average));
+      counter++;
+    }
+  }
+
+  /* Check if sufficient data to calculate a standard deviation is available */
+  if (counter <= 1)
+    return 0.0f;
+
+  std_dev = fsqrts((1.0f/(counter-1)) * sum_squares);
+
+  return std_dev;
+}
+
+
+#ifdef GROUNDSW
+void print_match_info (struct match_results_t *results)
+{
+  /* print_match_info prints the star tracker, base0 tracker and
+   * match histogram structures on screen */
+
+  unsigned int k;
+
+  TA_DEBUG("\n\nStar Tracker\n");
+  TA_DEBUG("[");
+
+  for (k=0; k < results->n_ref_pos-1; k++)
+  {
+    TA_DEBUG("%d, ", results->star_tracker[k]);
+  }
+
+  TA_DEBUG("]\n");
+
+  TA_DEBUG("-------------------------------\n\n");
+
+  TA_DEBUG("\n\nBase0 Tracker\n");
+  TA_DEBUG("[");
+
+  for (k=0; k < results->n_ref_pos-1; k++)
+  {
+    TA_DEBUG("%d, ", results->base0_tracker[k]);
+  }
+
+  TA_DEBUG("]\n");
+
+  TA_DEBUG("-------------------------------\n\n");
+
+
+  TA_DEBUG("\n\nMatch Histogram\n");
+  TA_DEBUG("[");
+
+  for (k=0; k < results->n_ref_pos-1; k++)
+  {
+    TA_DEBUG("%d, ", results->match_histogram[k]);
+  }
+
+  TA_DEBUG("]\n");
+
+  TA_DEBUG("-------------------------------\n\n");
+
+  return;
+}
+
+
+void print_obs_DB (struct obs_pos_t *obsPos, struct obs_db_t *obs_DB)
+{
+  /* print_obs_DB prints the contents of the observed database */
+
+  unsigned int i, j, k, counter;
+
+  counter = 0;
+
+  for (i=0; i < obsPos->n-1; i++)
+  {
+    TA_DEBUG("%d ##################################\n", i);
+    for (j=0; j < obsPos->n-2; j++)
+    {
+      TA_DEBUG("%d ----------------------------------\t %d \n", j, obs_DB->base1_index[i*(obsPos->n-2) + j]);
+      for (k=0; k < obs_DB->base1_data_count[i*(obsPos->n-2) + j]; k++)
+        {
+          TA_DEBUG("%d [%d, %d, %d]\n", obs_DB->base1_data_count[i*(obsPos->n-2) + j], obs_DB->data[counter+0], obs_DB->data[counter+1], obs_DB->data[counter+2]);
+          counter += 3;
+        }
+    }
+  }
+
+  return;
+}
+
+
+void print_ref_DB (struct ref_pos_t *ref_pos, struct ref_db_t *ref_DB)
+{
+  /* print_ref_DB prints the contents of the reference database */
+
+  int i, j, counter;
+  counter = 0;
+
+  for (i=0; i < ref_pos->n-1; i++)
+  {
+    TA_DEBUG("%d ##################################\n", i);
+    for (j=0; j < ref_pos->n-2; j++)
+    {
+      TA_DEBUG("[%d, %d, %d]\n", ref_DB->data[counter+0], ref_DB->data[counter+1], ref_DB->data[counter+2]);
+      counter += 3;
+    }
+  }
+
+  return;
+}
+#endif
+
+
+
+/*****************************************************************
+ *                  *
+ *                      MAGNITUDE VALIDATION                     *
+ *                                                               *
+ *****************************************************************/
+
+/**
+ * @brief Target Magnitude Validation Acquisition is the main function of the
+ *        Magnitude Validation Algorithm in its standalone acquisition verison.
+ *        It tries to identify the target by performing photometry on the
+ *        observed positions, that are provided by the Star Extraction routine.
+ *
+ * @param mva_results             Output structure to store the matching results
+ * @param obs_pos                 Observed positions that were extracted by the
+ *                                Star Extraction process
+ * @param target_location         Intended Target Location provided by ground support
+ * @param target_candidate_radius Maximum offset from the intended Target Location
+ *                                that the target star can have due to platform
+ *                                induced pointing errors
+ * @param img                     Full frame image data for the current
+ *                                observation
+ * @param target_signal           Expected target signal in ADU provided by
+ *                                ground support
+ * @param signal_tolerance        Tolerance of the target signal in percent
+ * @param bkgd_signal             Estimated background signal [ADU]
+ */
+/* NOTE: Do not break these ultra-long parameter lists. We need them for the performance wrappers */
+void target_magntitude_validation_acquisition (struct mva_results_t *mva_results, struct obs_pos_t *obs_pos, float *target_location, int target_candidate_radius, struct img_t *img, unsigned int target_signal, float signal_tolerance, unsigned short bkgd_signal)
+{
+  float pos1[2], pos2[2];
+  float signal_quality;
+  unsigned int i, j;
+  int signal, same_target, signal_difference;
+
+  /* Initialise results counter */
+  mva_results->n = 0;
+
+  /* Iterate over all observed positions to find all possible target
+     candidates for later target identification */
+  for (i=0; i < obs_pos->n; i++)
+  {
+    /* Copy current star position into temporary array */
+    pos1[0] = obs_pos->x[i];
+    pos1[1] = obs_pos->y[i];
+
+    /* Check if the current position is within the maximum offset that the
+       target star can have = target_candidate_radius */
+    if (calculate_distance(pos1, target_location) < target_candidate_radius)
+    {
+      /* Calculate the star signal */
+      signal = perform_radius_photometry (img, pos1[0], pos1[1], bkgd_signal);
+
+      /* target_signal > 0 is ensured by the caller */
+      /* Calculate the difference to the estimated target signal [percent] */
+      signal_quality = fabsf( (float)(signal-(int)target_signal)/(float)target_signal ) * 100.;
+
+      /* Check if the signal falls within the target signal's tolerance */
+      if (signal_quality < signal_tolerance)
+      {
+        /* Only continue if the maximum number of target candidates hasn't
+           been reached yet */
+        if (mva_results->n < NCAND)
+        {
+          /* Save the position index, the measured signal and
+             quality for this star */
+          mva_results->obs_pos_index[mva_results->n]  = i;
+          mva_results->signal[mva_results->n]         = signal;
+          mva_results->signal_quality[mva_results->n] = signal_quality;
+          mva_results->n++;
+        }
+        else
+        {
+          break;
+        }
+      }
+    }
+  }
+#ifdef GROUNDSW
+  TA_DEBUG("MVA RESULTS N : %d\n", mva_results->n);
+#endif
+
+  /* Flag target identification as failed if no target candidate was identified */
+  if (mva_results->n == 0)
+  {
+    mva_results->valid_signal = FALSE;
+    mva_results->valid_index = -1;
+  }
+
+  /* Target identification is successful if only one candidate matched
+     the expected target signal */
+  else if (mva_results->n == 1)
+  {
+    mva_results->valid_signal = TRUE;
+    mva_results->valid_index  = 0;
+  }
+
+  /* If more than one candidate matches the expected signal it might be due
+     to multiple detections of the same target due to bad detection thresholds
+     during the Star Extraction process or a second star of similar magnitude
+     in the FOV. The latter should not happen for properly set parameters.*/
+  else if (mva_results->n <= 5)
+  {
+    /* Initialise same_target indicator */
+    same_target = TRUE;
+
+    /* Iterate over all target candidates */
+    for (i=0; i < mva_results->n; i++)
+    {
+      /* For each candidate iterate over all the other candidates */
+      for (j=0; j < mva_results->n; j++)
+      {
+        /* Prevent self pairing */
+        if (i != j)
+        {
+          /* Store candidate positions in temporary position arrays */
+          pos1[0] = obs_pos->x[mva_results->obs_pos_index[i]];
+          pos1[1] = obs_pos->y[mva_results->obs_pos_index[i]];
+
+          pos2[0] = obs_pos->x[mva_results->obs_pos_index[j]];
+          pos2[1] = obs_pos->y[mva_results->obs_pos_index[j]];
+
+          /* Calculate the signal difference in percent points */
+          signal_difference = fabsf(mva_results->signal_quality[i] - mva_results->signal_quality[j]);
+
+          /* Calculate the distance between the target candidates. If it is
+             below 24px they are considered to belong to the same PSF */
+          if (calculate_distance(pos1, pos2) > 24) /* PSF diameter = 24 */
+          {
+            same_target = FALSE;
+          }
+          /* Photometry results should be very similar for multiple detections
+             of a single star. If the signal difference is more than 3 percent
+             points the candidates are not considered to be from the same source.
+             This check prevents close stars to be paired as one source which
+             could happen if only the distance criteron was used. */
+          if (signal_difference > 3)
+          {
+            same_target = FALSE;
+          }
+        }
+      }
+    }
+
+    /* Identification process is successful if the candidates are identified
+       to be the same source. The candidate with the maximum signal is
+       chosen as the final result as the maximum signal will be measured from
+       the center of the source */
+    if (same_target == TRUE)
+    {
+      mva_results->valid_signal = TRUE;
+      /*mva_results->valid_index  = TaArgmax(mva_results->signal, mva_results->n);*/
+      mva_results->valid_index  = TaArgmin(mva_results->signal_quality, mva_results->n);
+    }
+    else
+    {
+      mva_results->valid_signal = FALSE;
+      mva_results->valid_index = -1;
+    }
+  }
+  /* If too many target candidates are found the observation will be considered
+     as too ambiguous and the acquisition is considered failed. This case should
+     not happen for nominal observations with valid acqusition algorithm
+     parameters */
+  else
+  {
+    mva_results->valid_signal = FALSE;
+    mva_results->valid_index = -1;
+  }
+
+  return;
+}
+
+/**
+ * @brief Target Magnitude Validation is used to perform photometry on the
+ *        target acquisition result of the Angle Method Algorithm. It is meant
+ *        for cases where the target star was too faint to solely rely on
+ *        photometric identification and the Angle Method could not identify
+ *        it with a satisfing result. Therfore the Magntiude Validation is
+ *        used as a second level of identification to confirm the ambiguous
+ *        Angle Method result.
+ *
+ * @param img              Full frame image data for the current
+ *                         observation
+ * @param obs_pos          Observed positions that were extracted by the
+ *                         Star Extraction process
+ * @param results          utput structure to store the matching results
+ * @param bkgd_signal      Estimated backround signal [ADU]
+ * @param target_signal    Expected target signal in ADU provided by
+ *                         ground support
+ * @param signal_tolerance Tolerance of the target signal in percent
+ */
+
+void target_magnitude_validation (struct img_t *img, struct obs_pos_t *obs_pos, struct match_results_t *results, unsigned short bkgd_signal, unsigned int target_signal, float signal_tolerance)
+{
+  unsigned int I;
+  float x, y;
+
+  /* Copy current star position into temporary variables */
+
+  /* NOTE: The maximum number of obs_pos->candidate_index members is counted in find_target_candidates and assigned to obs_pos->n_candidates.
+     The members in obs_pos->n_candidates are then used to construct the entries in the observed star database (obs_DB) and results->target_star
+     is restricted to its length. Therefore results->target_star cannot exceed the array */
+
+  x = obs_pos->x[obs_pos->candidate_index[results->target_star]];
+  y = obs_pos->y[obs_pos->candidate_index[results->target_star]];
+
+  /* Calculate the star signal */
+  I = perform_radius_photometry (img, x, y, bkgd_signal);
+
+  /* target_signal > 0 is ensured by the caller */
+  /* Calculate the difference to the estimated target signal [percent] */
+  results->signal_quality = fabsf( (float)(I-target_signal)/(float)target_signal ) * 100;
+
+  /* Check if the signal falls within the target signal's tolerance and
+     decide if the identification was successful */
+  if (results->signal_quality < signal_tolerance)
+  {
+#ifdef GROUNDSW
+    TA_DEBUG("\n\nMagnitude validation successful.\n");
+    TA_DEBUG("Measured signal: %d   |   Expected signal: %d   |   %.2f percent detected\n\n", I, target_signal, (float)I/target_signal*100.);
+#endif
+    results->valid_signal = TRUE;
+  }
+  else
+  {
+#ifdef GROUNDSW
+    TA_DEBUG("\n\nMagnitude validation failed.\n");
+    TA_DEBUG("Measured signal: %d   |   Expected signal: %d   |   %.2f percent detected\n\n", I, target_signal, (float)I/target_signal*100.);
+#endif
+    results->valid_signal = FALSE;
+  }
+
+  return;
+}
+
+
+#define RPRANGE 25
+#define RPRADSQ 625
+
+/**
+ * @brief Perform Raidus Photometry extracts the star signal on a radius of
+ *        RPRANGE around the provided position.The signal is corrected
+ *        for the estimated background signal and returned as ADU
+ * @param  img         Full frame image data for the current
+*                      observation
+ * @param  cenx        X coordinate of the star [CCD pixel]
+ * @param  ceny        Y coordinate of the star [CCD pixel]
+ * @param  bkgd_signal Estimated background signal [ADU]
+ * @return             Measured signal [ADU]
+ */
+int perform_radius_photometry (struct img_t* img, float cenx, float ceny, int bkgd_signal)
+{
+  int I;
+  int x, y, n, p, distSq;
+  int cx, cy;
+
+  cx = roundf(cenx);
+  cy = roundf(ceny);
+
+  /* Check if the photometry radius is on the image */
+  if ((cx - RPRANGE) < 0)
+    return 0;
+  if ((cx + RPRANGE) >= TA_XDIM)
+    return 0;
+  if ((cy - RPRANGE) < 0)
+    return 0;
+  if ((cy + RPRANGE) >= TA_YDIM)
+    return 0;
+
+  I = 0;
+  n = 0;
+  for (y=-RPRANGE; y <= RPRANGE; y++)
+  {
+    p = (y+cy) * img->xdim;
+    for (x=-RPRANGE; x <= RPRANGE; x++)
+    {
+      distSq = x*x + y*y;
+      if (distSq < RPRADSQ)
+      {
+        I += img->data[p + x + cx];
+        n++;
+      }
+    }
+  }
+  I -= n*bkgd_signal;
+
+  return I;
+}
+
+
+
+/**
+ * @brief Uses the target star position obtained from the Magnitude validation
+ *        Algorithm to calculate the pixel offset to the intended Target Location
+ *        in centipixel [cpx]. The offset is returned by the pointer to the shift
+ *        array.
+ * @param obs_pos         Observed positions that were extracted by the
+ *                        Star Extraction process
+* @param results          Output structure to store the matching results
+ * @param shift           Calculated offset from the Target Location [cpx]
+ * @param target_location Intended Target Location provided by ground support
+ */
+void calculate_target_shift_MVA (struct obs_pos_t *obs_pos, struct mva_results_t *results, int *shift, float *target_location)
+{
+  float x, y, dx, dy;
+
+  /* retrieve x/y coordinates from the observed positions and results */
+
+  /* NOTE: The maximum number of obs_pos_index members is counted in target_magnitude_validation_acquisition and cannot exceed obs_pos->n.
+     results->valid_index is guaranteed to be <= obs_pos->n.
+     The values contained in obs_pos_index are also guaranteed to be <= obs_pos->n and finally obs_pos->x has obs_pos->n members. Same for y. */
+
+  x = obs_pos->x[results->obs_pos_index[results->valid_index]];
+  y = obs_pos->y[results->obs_pos_index[results->valid_index]];
+
+  /* calculate offset */
+  dx = target_location[0] - x;
+  dy = target_location[1] - y;
+
+  /* conversion to centi-pixel */
+  shift[0] = (int)(dx * 100);
+  shift[1] = (int)(dy * 100);
+
+#ifdef GROUNDSW
+  /* Redudant information. Displayed by TargetAcquisitionMain.c */
+  /* printf("\nMove satellite by dx: %.2f, dy: %.2f pixel to center it.\n", dx, dy);*/
+#endif
+
+  return;
+}
diff --git a/TargetAcquisition/src/AngleMethod.h b/TargetAcquisition/src/AngleMethod.h
new file mode 100644
index 0000000..f763230
--- /dev/null
+++ b/TargetAcquisition/src/AngleMethod.h
@@ -0,0 +1,82 @@
+/*
+ * LiebeMethod.h
+ *
+ *  Created on: Jul 27, 2015
+ *      Author: Philipp Löschl, University of Vienna
+ */
+
+#ifndef ANGLEMETHOD_H_
+#define ANGLEMETHOD_H_
+
+#include "TaDatatypes.h"
+
+
+void create_obs_DB (struct obs_pos_t *pos, struct obs_db_t *obs_DB, float *target_location, int target_candidate_radius, unsigned short dr);
+
+void create_ref_DB (struct ref_pos_t *pos, int target_index, struct ref_db_t *ref_DB, unsigned short dr);
+
+float calculate_dAng (float *x, float *y, unsigned short dr, float theta);
+
+void stretch_fingerprint (float *x, unsigned short dr);
+
+void find_target_candidates (struct obs_pos_t *pos, float *target_location, int target_candidate_radius);
+
+float TaNorm (float x, float y);
+
+void match_databases (struct ref_db_t *ref_DB, struct obs_db_t *obs_DB, struct match_results_t *results);
+
+void find_base0 (unsigned int ref_base0, struct match_candidates_t *candidates, struct obs_db_t *obs_DB);
+
+void find_base1 (unsigned int ref_base1, struct match_candidates_t *candidates, struct obs_db_t *obs_DB);
+
+void find_matches (unsigned int ref_base0, unsigned int ref_base1, unsigned int ref_angle, struct match_candidates_t *candidates, struct match_results_t *results, struct obs_db_t *obs_DB);
+
+void find_unique_matches (struct match_results_t *results, struct unique_output_t *output, int match_count_index, int match_results_index, int entry);
+
+void find_majority_matches (struct match_results_t *results);
+
+void find_unique_tracker_items (int *tracker, unsigned int n, struct unique_output_t *output, unsigned int n_skip, unsigned int *skip_entries);
+
+void correct_multiple_base_matches (struct match_results_t *results);
+
+void find_valid_star_candidate (struct match_results_t *results);
+
+void determine_match_quality (struct match_results_t *results, struct obs_pos_t *obs_pos);
+
+void calculate_target_shift_AMA (struct obs_pos_t *obs_pos, struct match_results_t *results, int *shift, float *target_location);
+
+void TaUnique (struct unique_output_t *output, int item);
+
+void TaWhere (int *x, unsigned int n, struct where_output_t *output, int arg, int operator);
+
+void delete_results (struct match_results_t *results, unsigned int match_count_index, unsigned int match_results_index, unsigned int entry);
+
+int selective_counter (int *x, int n, int arg);
+
+int TaArgmax (int *x, int n);
+
+int TaArgmin (float *x, int n);
+
+int TaMax (int *x, int n);
+
+int TaSum (int *x, int n);
+
+float TaAverage (int *x, int n);
+
+float TaStdev (int *x, int n, float average);
+
+void print_match_info (struct match_results_t *results);
+
+void print_obs_DB (struct obs_pos_t *obsPos, struct obs_db_t *obs_DB);
+
+void print_ref_DB (struct ref_pos_t *ref_pos, struct ref_db_t *ref_DB);
+
+void target_magntitude_validation_acquisition (struct mva_results_t *mva_results, struct obs_pos_t *obs_pos, float *target_location, int target_candidate_radius, struct img_t *img, unsigned int target_signal, float signal_tolerance, unsigned short bkgd_signal);
+
+void target_magnitude_validation (struct img_t *img, struct obs_pos_t *obs_pos, struct match_results_t *results, unsigned short bkgd_signal, unsigned int target_signal, float signal_tolerance);
+
+int perform_radius_photometry (struct img_t *img, float cenx, float ceny, int bkgd_signal);
+
+void calculate_target_shift_MVA (struct obs_pos_t *obs_pos, struct mva_results_t *results, int *shift, float *target_location);
+
+#endif /* ANGLEMETHOD_H_ */
diff --git a/TargetAcquisition/src/CrIaDataPool.c b/TargetAcquisition/src/CrIaDataPool.c
new file mode 120000
index 0000000..2a5e230
--- /dev/null
+++ b/TargetAcquisition/src/CrIaDataPool.c
@@ -0,0 +1 @@
+../../CrIa/src/CrIaDataPool.c
\ No newline at end of file
diff --git a/TargetAcquisition/src/CrIaDataPool.h b/TargetAcquisition/src/CrIaDataPool.h
new file mode 120000
index 0000000..59f98e9
--- /dev/null
+++ b/TargetAcquisition/src/CrIaDataPool.h
@@ -0,0 +1 @@
+../../CrIa/src/CrIaDataPool.h
\ No newline at end of file
diff --git a/TargetAcquisition/src/CrIaDataPoolId.h b/TargetAcquisition/src/CrIaDataPoolId.h
new file mode 120000
index 0000000..2d0c807
--- /dev/null
+++ b/TargetAcquisition/src/CrIaDataPoolId.h
@@ -0,0 +1 @@
+../../CrIa/src/CrIaDataPoolId.h
\ No newline at end of file
diff --git a/TargetAcquisition/src/IfswConversions.c b/TargetAcquisition/src/IfswConversions.c
new file mode 120000
index 0000000..b61b15f
--- /dev/null
+++ b/TargetAcquisition/src/IfswConversions.c
@@ -0,0 +1 @@
+../../CrIa/src/IfswConversions.c
\ No newline at end of file
diff --git a/TargetAcquisition/src/IfswConversions.h b/TargetAcquisition/src/IfswConversions.h
new file mode 120000
index 0000000..a2674b8
--- /dev/null
+++ b/TargetAcquisition/src/IfswConversions.h
@@ -0,0 +1 @@
+../../CrIa/src/IfswConversions.h
\ No newline at end of file
diff --git a/TargetAcquisition/src/StarExtractor.c b/TargetAcquisition/src/StarExtractor.c
new file mode 100644
index 0000000..c9ebb79
--- /dev/null
+++ b/TargetAcquisition/src/StarExtractor.c
@@ -0,0 +1,822 @@
+/**
+* @file    StarExtractor.c
+* @author  Philipp Löschl (roland.ottensamer@univie.ac.at)
+* @date    July, 2017
+*
+* @defgroup StarExtraction Star Extraction
+* @ingroup TargetAcquisition
+*
+* @brief The Star Extraction algorithm detects star positions on the full frame image and is the preceding step for any kind of @ref TargetAcquisition algorithm.
+*
+* ## Overview
+* The Star Extraction is the first step for every algorithm in the
+* @ref TargetAcquisition "Target Acquisition" routine. Its main task is to
+* detect stars and measure their positions on the full frame images in CCD
+* pixel coordinates. These positions are a crucial prerequisite for every
+* subsequent type of target identification algorithm.
+*
+* ## Mode of Operation
+* To achieve the above described task the Star Extraction is not only provided
+* with the full frame image data but also uses observation specific information
+* such a detection threshold for individual pixels, a detection threshold for
+* the full signal in the PSF and an
+* @ref calculate_background_signal "estimated background signal".
+* The detailed process is outlined below.
+*
+* ### Image Rebinning
+* Due to constraints in processing power and runtime the full frame image is
+* rebinned by a factor 8 on both axis for further use by the Star Extraction.
+* This reduces overall memory usage and increases the speed of any iteration
+* over all image pixels in the following work steps by a factor of 64. In
+* addition it concentrates the spread out PSF of the stars to a more compact
+* signal distribution within approximately 3 x 3 pixel.\n
+* (@ref rebin_image "Rebin Image Source Code")
+*
+* ### Find Pixel of Interest
+* The rebinned image is then scanned for pixels that exceed the
+* pixel detection threshold. This threshold is determined by the minimal fraction
+* of the star signal that can be contained in a rebinned pixel.
+* The coordinates of all eligible pixels are stored as pixel of interest (POI)
+* for further processing.\n
+*
+* Additional functionality to reduce the scanned area to a circular subframe of
+* predefined radius around the expected target location is also available in
+* form of the __reduced extraction radius__. Although it is not used for nominal
+* observation conditions, it can become necessary for very crowded or highly
+* rotating FOV.\n Observations of very faint targets often come with higher
+* star densities and hence an increased number of detected star positions. Since
+* the reserved memory is designed to only hold 60 positions, the maximum number
+* of star detections has to be limited. While this can usually be done with
+* increased detection thresholds, it is not always possible for observations of
+* very faint stars. Therefore the area on which the Star Extraction operates is
+* decreased instead.\n
+*
+* For highly rotated FOV with long exposure times the outer stars will be
+* smeared over extended areas of the image. Since this can introduce large
+* position errors that interfere with the identification algorithms, it is
+* recommended to also use the  reduced extraction radius for such cases.\n
+* (@ref find_pixel_of_interest "Find Pixel of Interest Source Code")
+*
+* ### Group Pixel of Interest I
+*
+* The detection threshold per pixel is defined such that multiple pixels will be
+* detected for many of the brighter stars' signal distribution. This behaviour
+* is a result of the threshold definition, which is  based on the faintest
+* detectable magnitude to trigger at least one pixel of interest in a specific
+* observation. To avoid multiple detections of single stars it is
+* necessary to reduce the pixel of interest to one per object. Therefore
+* closeby pixel within a region of the typical rebinned PSF are grouped together.
+* Assuming a 3 x 3 pixel PSF with all 9 pixel identified as POI, a distance
+* threshold of two pixel separation for the x and y direction is required to
+* group pixels starting at the corners of a 3 x 3 square PSF.\n
+*
+* Due to the row wise scanning process in the previous step all POI are already
+* sorted after their coordinates, which minimizes memory access during for the
+* grouping algorithm. Initially all POI are assigned to group -1, which indicates
+* that they are not grouped yet. Then starting with the first, each POI position
+* is compared to all following ungrouped positions in the POI list. If their
+* separation is below the distance threshold they are assigned to the same group.
+* This process repeats until each POI has been assigned to a group and conserves
+* the order of the POI list. \n
+* (@ref group_pixel_of_interest "Group Pixel of Interest Source Code")
+*
+* ### Reduce Group to Average Pixel of Interest
+* With every POI assigned to a group and therefore a specific star, each group of
+* POI can now be reduced to a single pixel per object. Iterating over all
+* available groups, the POI list is scanned for the pixels associated with the
+* respective group. Each group's pixel coordinates are then averaged to a single
+* and central POI. As a result of this operation most star locations are now
+* described by a single POI.\n
+* (@ref reduce_to_average_pixel_of_interest "Reduce to Average Pixel of Interest Source Code")
+*
+* ### Group Pixel of Interest II
+* Long exposure times for bright stars can trigger the POI on larger areas than
+* the expected 3 x 3 pixel field. This can causes multiple groups of POI to
+* describe a single star even after the reduction in the previous step. To avoid
+* multiple detections of a single star and the associated degradation of the
+* identification algorithm results, the grouping process is repeated. Considering
+* that every uniquely identified star should have its POI centered at this stage,
+* a more rigorous separation criteria of four pixels is used. Other than that the
+* grouping process is identical to its first iteration.\n
+* (@ref group_pixel_of_interest "Group Pixel of Interest Source Code")
+*
+* ### Reduce Group to Brightest Pixel of Interest
+* The second POI reduction process is slightly different to the first one. Instead
+* of averaging the POI positions for each group, the pixel signals are considered
+* now. This is superior to geometric averaging due to the changed nature of the
+* remaining pixels. While the first grouping process is meant to work with POI that
+* are spread all over the PSF, the distribution after the first reduction is
+* different. If a star is described by multiple groups at this point, it most
+* likely has one group with a POI in its centre and a second group with POI on
+* the outer edge. Since the signal is concentrated in the central region of the
+* rebinned PSF it is the better indicator to find the best POI. Averaging the
+* position instead would introduce a systematic positional offset for such cases.
+* \n
+* The algorithm iterates over all available groups and sorts the available POI
+* by their signal. Before the brightest POI is chosen the signal of the pixel located
+* between the two brightest ranked pixels is also considered. The overall brightest
+* pixel in this comparison is used as the new POI while the rest is discarded.
+* \n
+* The whole second iteration of the grouping and reduction process provides a
+* single POI per star for nominal cases. The remaining cases include saturated
+* field stars and overlapping bright stars in situations of high star density.
+* Even though those scenarios are rare, they might occur once or twice per image.
+* Therefore the subsequent target identifcation algorithms are designed to be
+* robust against small numbers of multiple detections per object.\n
+* (@ref reduce_to_brightest_pixel_of_interest
+* "Reduce to Brightest Pixel of Interest Source Code")
+*
+* ### Calculate Center of Gravity
+* The final step of the Star Extraction routine uses the previously selected
+* pixels of interest (POI) to determine star positions by calculating the centres of
+* gravity in a region of interest (ROI) around them.\n
+* Therefore the signal barycentre on a square region around the POI
+* [x-2:x+2, y-2:y+2] is calculated on a subpixel scale. Before the calculated
+* position can be converted back to full frame coordinates the total signal in the
+* region of interest is checked against the detection threshold for the full PSF.
+* This is meant to prevent false postive detections of intense cosmic rays,
+* as well as detections of stars below the desired magnitude on which the
+* threshold was based. The latter is possible when the combined signals of
+* overlapping faint stars or cosmic rays and faint stars satisfy the signal
+* criteria to be considered a pixel of interest. Even though the results might
+* be valid star positions, they must not be considered in the target identification
+* algorithm input data as they could degrade the identification results.
+* Positions of all stars that pass the signal check are converted back to full
+* resolution positions and are made available outside Star Extraction through the
+* @ref obs_pos_t "observed positions structure".\n
+* (@ref calculate_center_of_gravity "Calculate Center of Gravity Source Code")
+*
+* ### Visualisation
+* A step wise visualisation of the Star Extraction process for a single star
+* is provided below (top left to bottom right):
+*       - Starting with the full resolution image (top left), the image data is
+*         rebinned and scanned for pixels of interest (top centre).
+*       - Two groups of POI are formed. One contains the yellow bottom left 3x3 pixels
+*         from [62,62] to [64,64] and the other the remaining blue pixels
+*         around the corner from [63, 65] left to [65,65] down to [65, 63]
+*         (top centre).
+*       - The two groups are reduced to two pixel of interest. Note that the
+*         average position of the corner group moved into the area of the
+*         square group. This behaviour favours group reduction for multiply
+*         detected single objects. (top right)
+*       - After the second grouping and reduction process only one POI (red dot)
+*         remains at [64, 64]. It is used to span the region of interest (red square)
+*         for the centre of gravity calculation (bottom left).
+*       - The centre of gravity on the rebinned frame is located at
+*         [63.57, 63.57] (bottom centre).
+*       - Transformation to full resolution coordinates gives [512.55, 512.54]
+*         (bottom right).
+*
+* Test data: Target Star, 9mag 10s medium crowded field, CHEOPSim Job 4223
+* @image html star_extraction_process.png "Star Extraction Process"
+*/
+
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "TaDatatypes.h"
+#include "StarExtractor.h"
+#include "AngleMethod.h"
+#include "TargetAcquisition.h"
+#include "IfswMath.h"
+#include "EngineeringAlgorithms.h"
+
+extern struct where_output_t *g_glitch_filter;
+
+
+/*****************************************************************
+ *                                                               *
+ *                       STAR EXTRACTION                         *
+ *                                                               *
+ *****************************************************************/
+
+/**
+ * @brief    Star Extraction main function
+ * @param    img                contains 1024x1024 px full frame image data
+ * @param    pos                initialised structure to store detected star positions
+ * @param    rebin_factor       to resize the image
+ * @param    target_location    expected target star position
+ * @param    reduced_extraction toggles use of extraction_radius
+ * @param    extraction_radius  a reduced extraction_radius to run Star Extraction on a circular subframe of the image
+ * @param    detection_thld     detection threshold in ADU/s per pixel
+ * @param    signal_thld        detection threshold in ADU/s for the full PSF
+ * @param    bkgd_signal        calculated background signal in ADU/s
+ * @param    POI                initialised structure to store pixel of interest
+ * @note
+ */
+
+/* NOTE: Do not break the long parameter list. It is needed for the performance wrappers */
+
+void star_extraction (struct img_t *img, struct obs_pos_t *pos, unsigned short rebin_factor, float *target_location, unsigned short reduced_extraction, unsigned short extraction_radius, unsigned int detection_thld, unsigned int signal_thld, unsigned int bkgd_signal, struct ROI_t *POI)
+{
+  /* This function bins the passed image and extracts positions of found stars.
+   * The center of gravity calculation for the star positions are done with a
+   * background noise calculated locally over the ROI adjacent pixels.
+   * It is meant for the position extraction in the space segment
+   * The term Region Of Interest (ROI) is commonly used for the central ROI pixel
+   */
+   int step, ROI_radius;
+   float target_location_bin[2];
+
+   target_location_bin[0] = target_location[0] / rebin_factor; /* REBIN_FACTOR = 8 */
+   target_location_bin[1] = target_location[1] / rebin_factor; /* REBIN_FACTOR = 8 */
+
+   extraction_radius = extraction_radius / rebin_factor;  /* REBIN_FACTOR = 8 */
+
+   /* imgBin is only used in this function. Hence no memory allocation outside of it */
+   g_imgBin->xdim = img->xdim / rebin_factor; /* REBIN_FACTOR = 8 */
+   g_imgBin->ydim = img->ydim / rebin_factor; /* REBIN_FACTOR = 8 */
+
+   bkgd_signal = bkgd_signal * rebin_factor * rebin_factor;
+
+   detection_thld += bkgd_signal;
+   step = 1;
+   ROI_radius = 2; /* NOTE: with rebin_factor fixed to 8 this = 2 */
+   POI->counter = 0; /* counts the number of possible ROIs */
+
+  rebin_image(img, g_imgBin, rebin_factor);
+
+  find_pixel_of_interest (g_imgBin, POI, reduced_extraction, extraction_radius, target_location_bin, detection_thld, step);
+
+  if (POI->counter == 0)
+  {
+    pos->n = 0;
+    return;
+  }
+  /*
+     If e.g. the exposure time is wrong, then it may happen that too many point sources are found
+     and the acquisition takes too long. Here we protect against that case. 100 stars, 4*4 POIs per star.
+  */
+  if (POI->counter > 1600)
+    {
+      pos->n = 0;
+      return;
+    }
+
+  group_pixel_of_interest (POI, ROI_radius);
+
+  reduce_to_average_pixel_of_interest (POI);
+
+  group_pixel_of_interest (POI, 2*ROI_radius);
+
+  reduce_to_brightest_pixel_of_interest (POI, g_imgBin);
+
+  calculate_center_of_gravity (pos, POI, g_imgBin, bkgd_signal, signal_thld, ROI_radius, rebin_factor);
+
+  return;
+}
+
+/**
+ * @brief   Calculates the background signal in dependance on exposure time, bias, dark and mean sky background
+ * @param   exposure_time   exposure time in seconds
+ * @param   bias            bias signal in ADU
+ * @param   dark_mean       mean dark signal in ADU/s
+ * @param   sky_bkgd        mean sky background signal in aDU
+
+ * @note
+ */
+int calculate_background_signal (float exposure_time, float bias, float dark_mean, float sky_bkgd)
+{
+  /* sky_bkgd in ADU: photons/s  * gain * flat */
+
+  return  (int) (bias + exposure_time * (sky_bkgd + dark_mean));
+}
+
+
+/**
+ * Due to constraints in processing power and runtime the full frame image is
+ * rebinned by a factor 8 on both axis for further use by the Star Extraction.
+ * This reduces overall memory usage and increases the speed of any iteration
+ * over all image pixels in the following work steps by a factor of 64. In
+ * addition it concentrates the spread out PSF of the stars to a more compact
+ * signal distribution within approximately 3 x 3 pixel.
+ *
+ * @brief   Resizes an image by a provided factor
+ * @param   img             stores full sized image prior to rebinning
+ * @param   imgBin          stores rebinned image
+ * @param   rebin_factor    factor by which the image is rebinned
+
+ * @note
+ */
+void rebin_image (struct img_t* img, struct imgBin_t* imgBin, unsigned short rebin_factor)
+{
+  /* This functions bins the passed image by the the also passed rebin_factor */
+  unsigned int i, j, k, l;
+  unsigned int tmpADU;
+
+  /* Check if the rebin_factor is a multiple for the image dimensions */
+  if (img->xdim % rebin_factor || img->ydim % rebin_factor)
+  {    
+    rebin_factor = 1;
+  }
+
+  /* Place a grid with reduced dimensions over the full sized data
+   * array and iterate over its super cells. Sum up all data points
+   * of the original full sized grid within each of those super cells.
+   */
+
+   for (k=0; k < imgBin->ydim; k++)
+   {
+     for (l=0; l < imgBin->xdim; l++)
+     {
+       tmpADU = 0;
+       for (i=0; i<rebin_factor; i++)
+       {
+         for (j=0; j<rebin_factor; j++)
+         {
+             tmpADU += img->data[(i + k*rebin_factor) * img->xdim + (j + l*rebin_factor)];
+         }
+       }
+      imgBin->data[k * imgBin->xdim + l] = tmpADU;
+      }
+    }
+
+  return;
+}
+
+/**
+ * The rebinned image is then scanned for pixels that exceed the
+ * pixel detection threshold. This threshold is determined by the minimal fraction
+ * of the star signal that can be contained in a rebinned pixel.
+ * The coordinates of all eligible pixels are stored as pixel of interest (POI)
+ * for further processing.\n
+ *
+ * Additional functionality to reduce the scanned area to a circular subframe of
+ * predefined radius around the expected target location is also available in
+ * form of the __reduced extraction radius__. Although it is not used for nominal
+ * observation conditions, it can become necessary for very crowded or highly
+ * rotating FOV.
+ *
+ * @brief   Attempts to find pixel over a certain detection threshold to be used as pixel of interest by subsequent functions
+ * @param   imgBin                rebinned image
+ * @param   POI                   structure to store pixel of interest (POI)
+ * @param   reduced_extraction    toggles reduced extraction mode
+ * @param   extraction_radius     defines search radius for reduced extraction mode
+ * @param   target_location_bin   expected target location in rebinned coordinates
+ * @param   detection_thld        detection threshold in ADU/s per pixel
+ * @param   step                  step size for POI search
+
+ * @note
+ */
+void find_pixel_of_interest (struct imgBin_t *imgBin, struct ROI_t *POI, int reduced_extraction, int extraction_radius, float *target_location_bin, unsigned int detection_thld, int step)
+{
+  /* Scan the rebinned image in imgBin for pixels with a
+   * signal above the detection threshold and store them as
+   * a first selection of region of interest centre in POI.
+   */
+
+  unsigned int i, j;
+  float tmp_pos[2];
+
+  /* Only scan reduced extraction area defined by the extraction radius for POI */
+  if (reduced_extraction == TRUE)
+    {
+      for (i=0; i < imgBin->ydim; i+=step)
+      {
+        for (j=0; j < imgBin->xdim;j+=step)
+        {
+          if (imgBin->data[i * imgBin->xdim + j] > detection_thld)
+          {
+            tmp_pos[1] = i; /* y */
+            tmp_pos[0] = j; /* x */
+
+            if (calculate_distance(tmp_pos, target_location_bin) < extraction_radius)
+            {
+              if (POI->counter < NROI)
+              {
+                POI->y[POI->counter] = i;
+                POI->x[POI->counter] = j;
+                POI->counter++;
+              }
+                  else
+              {
+                /* Don't add more positions than defined by NROI */
+                return;
+              }
+            }
+          }
+        }
+      }
+    }
+    else
+    /* Scan the whole area for POI */
+    {
+      for (i=0; i < imgBin->ydim; i+=step)
+      {
+        for (j=0; j < imgBin->xdim; j+=step)
+        {
+        if (imgBin->data[i * imgBin->xdim + j] > detection_thld)
+        {
+          if (POI->counter < NROI)
+          {
+            POI->y[POI->counter] = i;
+            POI->x[POI->counter] = j;
+            POI->counter++;
+          }
+          else
+          {
+            /* Don't add more positions than defined by NROI */
+            return;
+          }
+        }
+      }
+    }
+
+  }
+
+  return;
+}
+
+/**
+ * @brief Calculates the distance between two positions in pixel
+ * @param   pos1    first position, 2D array
+ * @param   pos2    second position, 2D array
+
+ * @note
+ */
+float calculate_distance (float *pos1, float *pos2)
+{
+  float distance;
+#if (__sparc__)
+  distance = fsqrts ((pos1[0] - pos2[0]) * (pos1[0] - pos2[0]) + (pos1[1] - pos2[1]) * (pos1[1] - pos2[1]));
+#else
+  distance = (float) sqrt ((pos1[0] - pos2[0]) * (pos1[0] - pos2[0]) + (pos1[1] - pos2[1]) * (pos1[1] - pos2[1]));
+#endif
+
+  return distance;
+}
+
+/**
+ * Due to the row wise scanning process in the previous step all POI are already
+ * sorted after their coordinates, which minimizes memory access during for the
+ * grouping algorithm. Initially all POI are assigned to group -1, which indicates
+ * that they are not grouped yet. Then starting with the first, each POI position
+ * is compared to all following ungrouped positions in the POI list. If their
+ * separation is below the distance threshold they are assigned to the same group.
+ * This process repeats until each POI has been assigned to a group and conserves
+ * the order of the POI list.
+ *
+ * @brief   Groups previously identified adjacent and spacially close pixel of interest together
+ * @param   POI         structe to store pixel of interest
+ * @param   ROI_radius  distance limit from which pixel are grouped separatly
+
+ * @note
+ */
+void group_pixel_of_interest (struct ROI_t* POI, int ROI_radius)
+{
+  unsigned int i, j, k, skip_index;
+  int dx, dy;
+
+  POI->group_counter = 0; /* Index for the multiple hit ROI grouping */
+  POI->skip_counter  = 0;
+
+  for(i=0; i < POI->counter; i++) /* Initialise group indices */
+    POI->group[i] = -1; /* Stores the ROI group index for each entry */
+
+  for (i=0; i < POI->counter; i++) /* Loops over all possible ROI centres previously found */
+  {
+    skip_index = FALSE;
+
+    for (k=0; k < POI->skip_counter; k++)
+    {
+    if (i == POI->skip_index[k])
+      {
+        skip_index = TRUE;
+        break;
+      }
+    }
+
+    if (skip_index == TRUE)
+      continue;
+
+    if (POI->group[i] < 0) /* Assign new index if it doesn't have one yet */
+    {
+      POI->group[i] = POI->group_counter;
+      POI->group_counter++;
+    }
+
+    for (j=i+1; j < POI->counter; j++) /* Check remaining ROI are adjacent */
+    {
+      dy = POI->y[i] - POI->y[j];
+      if (abs(dy) <= ROI_radius)
+      {
+        dx = POI->x[i] - POI->x[j];
+        if (abs(dx) <= ROI_radius)
+        {
+          if (POI->group[j] < 0)
+          {
+            /* If distance criteria is met, assign the same index */
+            POI->group[j] = POI->group[i];
+            POI->skip_index[POI->skip_counter] = j;
+            POI->skip_counter++;
+          }
+        }
+      }
+      else
+        /* if the entry isn't adjacent in the y
+        * direction no further will be either */
+        break;
+    }
+  }
+
+  return;
+}
+
+
+/**
+ * With every POI assigned to a group and therefore a specific star, each group of
+ * POI can now be reduced to a single pixel per object. Iterating over all
+ * available groups, the POI list is scanned for the pixels associated with the
+ * respective group. Each group's pixel coordinates are then averaged to a single
+ * and central POI. As a result of this operation most star locations are now
+ * described by a single POI.\n
+ *
+ * @brief Reduces spacially close and grouped pixel of interest to a center of gravity weighed single pixel
+ * @param   POI   structure that stores pixel of interest
+
+ * @note
+ */
+void reduce_to_average_pixel_of_interest (struct ROI_t* POI)
+{
+  unsigned int i, j, group_member_counter;
+  float group_x, group_y;
+
+  for (j=0; j < POI->group_counter; j++) /* scan through all groups */
+  {
+    group_member_counter = 0;
+    group_x = 0;
+    group_y = 0;
+
+    for (i=0; i < POI->counter; i++) /* look for all POIs within current group j */
+    {
+      if (POI->group[i] == (int)j)
+      {
+        group_member_counter++; /* count the amount of temporarily stored members*/
+        group_x += POI->x[i];
+        group_y += POI->y[i];
+      }
+    }
+
+    if (group_member_counter > 0) /* Mantis 2267, even though gmc > 0 is ensured indirectly in the caller */
+      {
+	temp_POI->x[j] = (int) roundf(group_x / group_member_counter); 
+	temp_POI->y[j] = (int) roundf(group_y / group_member_counter);
+      }
+  }
+
+  temp_POI->counter = POI->group_counter; /* number of groups stays the same */
+
+  *POI = *temp_POI; /* Mantis 2268: shallow copy is sufficient, because the structure's arrays reside in a global RAM */
+
+  
+  return;
+}
+
+/**
+ * The algorithm iterates over all available groups and sorts the available POI
+ * by their signal. Before the brightest POI is chosen the signal of the pixel located
+ * inbetween the two brightest ranked pixels is also considered. The overall brightest
+ * pixel in this comparison is used as the new POI while the rest is discarded.
+ *
+ * @brief Reduces spacially close and grouped pixel of interest to their brightest group member
+ * @param   POI     structure that stores pixel of interest
+ * @param   imgBin  rebinned version of the image data
+
+ * @note
+ */
+void reduce_to_brightest_pixel_of_interest (struct ROI_t *POI, struct imgBin_t *imgBin)
+{
+  /* Scan each indexed temporary POI group to look for the brightest pixel.
+   * This is done by creating a sorting the group members after their signal
+   * so the brightest pixel can be chosen. Before doing so, the pixel between
+   * the two brightest group members is also checked for a possible higher
+   * signal and then used instead if that's the case.
+   */
+
+  unsigned int i, j;
+  int k, x, y, dx, dy;
+  int group_member[NROI], group_member_counter;
+  unsigned int brightness[NROI];
+
+  for (j=0; j < POI->group_counter; j++) /* scan through all groups */
+  {
+    group_member_counter = 0;
+
+    for(i=0; i < POI->counter; i++) /* look for all POIs within current group j */
+    {
+      if (POI->group[i] == (int)j)
+      {
+        group_member[group_member_counter] = i; /* temporarily store all group members */
+        brightness[group_member_counter] = imgBin->data[POI->y[i] * imgBin->xdim + POI->x[i]];
+        group_member_counter++; /* count the amount of temporarily stored members */
+      }
+    }
+
+    sort_group_after_brightest_pixel (group_member, brightness, group_member_counter);
+
+    if (group_member_counter > 1)
+    {
+      /* the first member now is the brightest */
+      dy = POI->y[group_member[0]] - POI->y[group_member[1]];
+      dx = POI->x[group_member[0]] - POI->x[group_member[1]];
+      y  = POI->y[group_member[0]];
+      x  = POI->x[group_member[0]];
+
+      if ((imgBin->data[((y - dy/2) * imgBin->xdim ) + (x - dx/2)]) > (imgBin->data[(y * imgBin->xdim ) + x]))
+      {
+        temp_POI->y[j] = y - dy/2; /* add this member to the new POI structure */
+        temp_POI->x[j] = x - dx/2;
+      }
+      else
+      {
+        /* Brightest pixel in candidate list is brighter than intermediate pixel */
+        k = group_member[0];
+        temp_POI->x[j] = POI->x[k]; /* add this member to the new POI structure */
+        temp_POI->y[j] = POI->y[k];
+      }
+    }
+    else
+    {
+      /* Only one entry available? -> just use it */
+
+      /* NOTE: there are POI->group_counter members to group_member[], so if the array has no member, then
+	 this loop will not be entered. Consequently, at least the first group member is initialized here. */      
+      k = group_member[0];
+      temp_POI->x[j] = POI->x[k]; /* add this member to the new POI structure */
+      temp_POI->y[j] = POI->y[k];
+    }
+  }
+
+  temp_POI->counter = POI->group_counter; /* number of groups stays the same */
+
+  *POI = *temp_POI; /* Mantis 2268: shallow copy is sufficient, because the structure's arrays reside in a global RAM */
+
+  
+  return;
+}
+
+/**
+ * @brief   Sorts a group of pixel of interest by their brightness (descending)
+ * @param   group_member          countains the indices of all POI belonging to the currently analysed group
+ * @param   brightness            contains the pixel signal for each POI in the currently analysed group
+ * @param   group_member_counter  number of POI for the currently analysed group
+
+ * @note
+ */
+void sort_group_after_brightest_pixel (int *group_member, unsigned int *brightness, int group_member_counter)
+{
+  int i, j, tmp_brightness, tmp_group_member;
+
+  for(i=0; i < group_member_counter-1; i++)
+  {
+    for(j=i+1; j < group_member_counter; j++)
+    {
+      if (brightness[i] < brightness[j])
+      {
+        /* swap elements */
+        tmp_brightness = brightness[i];
+        brightness[i] = brightness[j];
+        brightness[j] = tmp_brightness;
+
+        tmp_group_member = group_member[i];
+        group_member[i] = group_member[j];
+        group_member[j] = tmp_group_member;
+      }
+    }
+  }
+
+  return;
+}
+
+/**
+ * The final step of the Star Extraction routine uses the previously selected
+ * pixels of interest (POI) to determine star positions by calculating the centres of
+ * gravity in a region of interest (ROI) around them.\n
+ * Therefore the signal barycentre on a square region around the POI
+ * [x-2:x+2, y-2:y+2] is calculated on a subpixel scale. Before the calculated
+ * position can be converted back to full frame coordinates the total signal in the
+ * region of interest is checked against the detection threshold for the full PSF.
+ * This is meant to prevent false postive detections of intense cosmic rays,
+ * as well as detections of stars below the desired magnitude on which the
+ * threshold was based. Positions of all stars that pass the signal check are converted back to full
+ * resolution positions and are made available outside Star Extraction through the
+ * @ref obs_pos_t "observed positions structure".\n
+ *
+ * @brief   Calculates the center of gravity in a region of interest (ROI) around a pixel of interest (POI) and stores the result as detected star position
+ * @param   pos             structure to store the star positions calculated from the ROI around each POI
+ * @param   POI             structure to store the pixel of interest
+ * @param   imgBin          contains the rebinned
+ * @param   bkgd_signal     calculated background signal in ADU/s per pixel
+ * @param   signal_thld     detection threshold in ADU/s for the full PSF
+ * @param   ROI_radius      region of interest (ROI) radius to calculate the center of gravity around a pixel of interest (POI)
+ * @param   rebin_factor    rebinning factor by which the full frame image was resized
+
+ * @note
+ */
+void calculate_center_of_gravity (struct obs_pos_t *pos, struct ROI_t *POI, struct imgBin_t *imgBin, unsigned int bkgd_signal, unsigned int signal_thld, int ROI_radius, unsigned short rebin_factor)
+{
+  /* Use the found ROI in ROI.ROI to calculate their centers of gravity.
+   * Once done transform the results back to the full scale image.
+   * Note that the pixels have to be shifted by half the scale factor
+   * due to how the rebinning process shifted pixels in the beginning.
+   */
+
+  unsigned int i;
+  int I, Ipx;
+  int x, y, xu, xl, yu, yl, X, Y;
+  double x_bin, y_bin;
+
+  pos->n = 0;
+
+  for (i=0; i < POI->counter; i++)
+  {
+    /* Define dimensions of the ROI */
+    yu = POI->y[i] + ROI_radius;
+    yl = POI->y[i] - ROI_radius;
+    xu = POI->x[i] + ROI_radius;
+    xl = POI->x[i] - ROI_radius;
+
+    /* Initialize CoG variables */
+    X = 0;
+    Y = 0;
+    I = 0;
+
+    /* Check if ROI is within the image, adjust if necessary */
+    if (yl < 0)
+      yl = 0;
+    if ((unsigned int)yu > (imgBin->ydim-1))
+      yu = imgBin->ydim-1;
+    if (xl < 0)
+      xl = 0;
+    if ((unsigned int)xu > (imgBin->xdim-1))
+      xu = imgBin->xdim-1;
+
+    /* Loop over all pixels within the ROI to sum up the signal */
+    for (y=yl; y <= yu; y++)
+    {
+      for(x=xl; x <= xu; x++)
+      {
+        Ipx = (int)(imgBin->data[y* imgBin->xdim + x]) - (int)bkgd_signal;
+
+        if (Ipx < 0)
+          Ipx = 0;
+
+        X += Ipx * x; /* weigh pixels with their position */
+        Y += Ipx * y;
+        I += Ipx;     /* sum of total intensity in ROI    */
+      }
+    }
+
+    /* Calculate Center of Gravity */
+    if (I > 0)
+    {
+      y_bin = (double)Y/I;
+      x_bin = (double)X/I;
+
+      /* Check if the star signal is above the signal threshold */
+
+      /* Define dimensions of the signal ROI */
+      yu = (int)y_bin + ROI_radius;
+      yl = (int)y_bin - ROI_radius;
+      xu = (int)x_bin + ROI_radius;
+      xl = (int)x_bin - ROI_radius;
+
+      if (yl < 0)
+        yl = 0;
+      if ((unsigned int)yu > (imgBin->ydim-1))
+        yu = imgBin->ydim-1;
+      if (xl < 0)
+        xl = 0;
+      if ((unsigned int)xu > (imgBin->xdim-1))
+        xu = imgBin->xdim-1;
+
+        /* Initialize CoG variables */
+      I = 0;
+      for (y=yl; y <= yu; y++)
+      {
+        for(x=xl; x <= xu; x++)
+        {
+          I += ((int)imgBin->data[y * imgBin->xdim + x] - (int)bkgd_signal); /* sum of total intensity in ROI */
+        }
+      }
+
+      if (I > (int)signal_thld)
+      {
+        if (pos->n < NPOS)
+        {
+          pos->y[pos->n] = y_bin * rebin_factor + rebin_factor/2;
+          pos->x[pos->n] = x_bin * rebin_factor + rebin_factor/2;
+          pos->n++;
+        }
+        else
+        {
+          /* Don't add more positions than defined by NPOS */
+          return;
+        }
+      }
+    }
+  }
+
+  return;
+}
diff --git a/TargetAcquisition/src/StarExtractor.h b/TargetAcquisition/src/StarExtractor.h
new file mode 100644
index 0000000..279beb9
--- /dev/null
+++ b/TargetAcquisition/src/StarExtractor.h
@@ -0,0 +1,40 @@
+/*
+ * StarExtractor.h
+ *
+ *  Created on: Jul 24, 2015
+ *      Author: Philipp Löschl, University of Vienna
+ */
+
+#ifndef STAREXTRACTOR_H_
+#define STAREXTRACTOR_H_
+
+
+#include "TaDatatypes.h"
+
+void calculate_center_of_gravity (struct obs_pos_t *pos, struct ROI_t *POI, struct imgBin_t *imgBin, unsigned int bkgd_signal, unsigned int signal_thld, int ROI_radius, unsigned short rebin_factor);
+
+float calculate_distance (float *pos1, float *pos2);
+
+void find_pixel_of_interest (struct imgBin_t *imgBin, struct ROI_t *POI, int reduced_extraction, int extraction_radius, float *target_location_bin, unsigned int detection_thld, int step);
+
+void group_pixel_of_interest (struct ROI_t *POI, int ROI_radius);
+
+void readImgFromTxt (struct img_t *img); 
+
+void readRefPosFromTxt (struct ref_pos_t *pos);
+
+void rebin_image (struct img_t *img, struct imgBin_t *imgBin, unsigned short rebin_factor);
+
+void reduce_to_brightest_pixel_of_interest (struct ROI_t *POI, struct imgBin_t *imgBin);
+
+void reduce_to_central_pixel_of_interest (struct ROI_t *POI);
+
+void reduce_to_average_pixel_of_interest (struct ROI_t *POI);
+
+void sort_group_after_brightest_pixel (int *group_member, unsigned int *brightness, int group_member_counter);
+
+void star_extraction (struct img_t *img, struct obs_pos_t *pos, unsigned short rebin_factor, float *target_location, unsigned short reduced_extraction, unsigned short extraction_radius, unsigned int detection_thld, unsigned int signal_thld, unsigned int bkgd_signal, struct ROI_t *POI);
+
+int calculate_background_signal (float exposure_time, float bias, float dark_mean, float sky_bkgd);
+
+#endif /* STAREXTRACTOR_H_ */
diff --git a/TargetAcquisition/src/StarPosDistortCorr.c b/TargetAcquisition/src/StarPosDistortCorr.c
new file mode 100644
index 0000000..bb6736d
--- /dev/null
+++ b/TargetAcquisition/src/StarPosDistortCorr.c
@@ -0,0 +1,145 @@
+/**
+ * @file StarPosDistortCorr.c
+ * @author Matthias Weiss, University of Vienna
+ * @date 2 Dec 2016
+ * @brief implementation for CHEOPS image distortion correction routine.
+ */
+
+#include "StarPosDistortCorr.h"
+
+#include <CrIaDataPool.h>
+#include <CrIaDataPoolId.h>
+
+void remove_star_from_candidate_list(int star_index, struct obs_pos_t * obs_pos)
+{
+   int k, l;
+
+   /* Find out if star with index star_index is in the candidate list, and if yes, remove it
+      from the list */
+   for (k = 0, l = 0; k < obs_pos->n_candidates; k++)
+   {
+      if (obs_pos->candidate_index[k] == star_index)
+      {
+         k++;
+      }
+      if (k != l)
+      {
+         obs_pos->candidate_index[l] = obs_pos->candidate_index[k];
+         obs_pos->n_candidates--;
+      }
+      l++;
+   }
+}
+
+/**
+ * @brief C routine for distortion correction of star coordinates in CHEOPS
+ *
+ * It takes a list of previously extracted star coordinates and changes
+ * them by applying radial distortion correction.
+ * As the star coordinates are measured from the image corner, and not
+ * relative to the optical axis, the star coordinates have to be
+ * transformed in order to calculate their radial distance from the axis.
+ * @param obs_pos          Pointer to an obs_pos_t structure that includes a list of
+                           observed star coordinates obs_pos->x[i] and obs_pos->x[i].
+                           The coordinates must be in pixels with the origin in the
+                           lower left corner of the sensor. Pixel values must not
+                           exceed the sensor dimension give in img_xdim and img_ydim.
+                           The number of stars with coordinates must match ops_pos->n.
+                           The number of candidate stars ops_pos->n_candidates must be
+                           smaller or equal to the number of stars ops_pos->n.
+                           The indexes in the list of candidate stars
+                           ops_pos->candidate_index must exist in ops_pos->x and
+                           ops_pos->y. The number of candidate stars in
+                           ops_pos->candidate_index must match ops_pos->n_candidates.
+ * @param optical_axis_x   x coordinate in pixels of the optical axis (relative to
+                           lower left sensor corner)
+ * @param optical_axis_y   y coordinate in pixels of the optical axis (relative to
+                           lower left sensor corner)
+ * @param img_xdim         Sensor dimension in pixels in x direction
+ * @param img_ydim         Sensor dimension in pixels in y direction
+ * @return                 Number of stars where distortion correction was applied to
+ *                         their coordinates. -1 is returned when the function parameters
+ *                         don't meet the specification.
+ */
+
+int star_pos_distort_corr (struct obs_pos_t *obs_pos, const double optical_axis_x, const double optical_axis_y, const double img_xdim, const double img_ydim)
+{  
+  double dist_coeff1, dist_coeff2, dist_coeff4;
+  double distortion_factor, x_orig, y_orig, x_corr, y_corr, rsquare;
+  unsigned int i, j;
+  float fval;
+  
+  /* Check the function parameters. */
+  if (img_xdim < 0.0)
+     return -1;
+  if (img_ydim < 0.0)
+     return -1;
+  if (optical_axis_x < 0.0 || optical_axis_x > img_xdim)
+     return -1;
+  if (optical_axis_y < 0.0 || optical_axis_y > img_ydim)
+     return -1;
+
+  CrIaCopy(DISTC1_ID, &fval); /* 1.0 */
+  dist_coeff1 = (double) fval;
+
+  CrIaCopy(DISTC2_ID, &fval); /* 3.69355E-8 */
+  dist_coeff2 = (double) fval;
+
+  CrIaCopy(DISTC3_ID, &fval); /* 7.03436E-15 */
+  dist_coeff4 = (double) fval;
+  
+  /* Apply distorion correction to the star coordinates. */
+  for (i=0, j=0; i < obs_pos->n; i++)
+    {
+      /* For radial optical distortion we need to transform the star coordinates
+         to a coordinate system with the optical axis in the origin. */
+      x_orig = obs_pos->x[i] - optical_axis_x;
+      y_orig = obs_pos->y[i] - optical_axis_y;
+      
+      /* Calculate the square of the radial distance of the star from the optical axis. */
+      rsquare = x_orig * x_orig + y_orig * y_orig;
+      
+      /* Optical distortion is fitted as a 4th order polynomial with only even powers. */
+      distortion_factor = dist_coeff1 + dist_coeff2 * rsquare + dist_coeff4 * rsquare * rsquare;
+
+      /* Apply distortion correction and transform back to the original coordinate system.*/
+      x_corr = x_orig * distortion_factor + optical_axis_x;
+      y_corr = y_orig * distortion_factor + optical_axis_y;
+
+      /* Distortion correction moves stars radially outwards from the optical axis,
+         hence stars that were on the image edge before, would be moved outside the image.
+         Don't increase counter j for these so that with the next valid star they get overwritten. */
+      if (x_corr < 0.0)
+      {
+         remove_star_from_candidate_list(i, obs_pos);
+         continue;
+      }
+      if (y_corr < 0.0)
+      {
+         remove_star_from_candidate_list(i, obs_pos);
+         continue;
+      }
+      if (x_corr > (img_xdim - 1.0))
+      {
+         remove_star_from_candidate_list(i, obs_pos);
+         continue;
+      }
+      if (y_corr > (img_ydim - 1.0))
+      {
+         remove_star_from_candidate_list(i, obs_pos);
+         continue;
+      }
+      
+      /* only corrected coordinates inside the image area will be
+	 entered, overwriting the input values */
+      obs_pos->x[j] = x_corr;
+      obs_pos->y[j] = y_corr;
+
+      j++;	 
+    }
+
+  obs_pos->n = j;
+
+  return j;
+}
+
diff --git a/TargetAcquisition/src/StarPosDistortCorr.h b/TargetAcquisition/src/StarPosDistortCorr.h
new file mode 100644
index 0000000..b285f58
--- /dev/null
+++ b/TargetAcquisition/src/StarPosDistortCorr.h
@@ -0,0 +1,16 @@
+/**
+ * @file StarPosDistortCorr.h
+ * @author Matthias Weiss,  University of Vienna
+ * @date 2 Dec 2016
+ * @brief declaration for CHEOPS image distortion correction routine.
+ */
+
+#ifndef STARPOSDISTORTCORR_H_
+#define STARPOSDISTORTCORR_H_
+
+#include "TaDatatypes.h"
+
+
+int star_pos_distort_corr(struct obs_pos_t *obs_pos, const double optical_axis_x, const double optical_axis_y, const double img_xdim, const double img_ydim);
+
+#endif /* STARPOSDISTORTCORR_H_ */
diff --git a/TargetAcquisition/src/TaDatatypes.h b/TargetAcquisition/src/TaDatatypes.h
new file mode 100644
index 0000000..c4c068b
--- /dev/null
+++ b/TargetAcquisition/src/TaDatatypes.h
@@ -0,0 +1,441 @@
+ /**
+ * @file    TaDatatypes.h
+ * @ingroup EngineeringAlgorithms
+ * @author  Philipp Löschl (roland.ottensamer@univie.ac.at)
+ * @date    July, 2017
+ *
+ * @ingroup EngineeringAlgorithms
+ *
+ * @brief Data type and structure definitions for @TargetAcquisition algorithms.
+ */
+
+
+#ifndef TADATATYPES_H_
+#define TADATATYPES_H_
+
+#ifdef GROUNDSW
+#define TA_DEBUG printf
+#else
+#include "IfswDebug.h"
+#define TA_DEBUG DEBUGP
+#endif
+
+#define TRUE 1
+#define FALSE 0
+
+#define TA_XDIM 1024				/* Image dimension */
+#define TA_YDIM 1024
+#define BINFACT 8
+#define BXDIM 128
+#define BYDIM 128
+#define LXDIM 41				/* PSF logic mask dimension */
+#define LYDIM 41
+
+#define NROI 16384 				/* theoretical maximum for 8x rebin */
+#define NPOS 60
+#define NCAND 10
+#define N_OBS_FP NCAND*(NPOS-1)*(NPOS-2)*8*3
+#define N_REF_FP (NPOS-1)*(NPOS-2)*3
+
+#define PI 3.14159265f
+
+/**
+ * @brief   Structure to store image data
+ * @param   data  image data, 1D array
+ * @param   xdim  image x-dimension
+ * @param   ydim  image y-dimension
+
+ * @note
+ */
+struct img_t {
+  unsigned int *data;   /* 1D array holding the 2D image data. will point to the cib */
+  unsigned int xdim;    /* cols of image data */
+  unsigned int ydim;    /* rows of image data */
+};
+
+/**
+ * @brief   Structure to store rebinned image data
+ * @param   data  rebinned image data, 1D array
+ * @param   xdim  rebinned image x-dimension
+ * @param   ydim  rebinned image y-dimension
+
+ * @note
+ */
+struct imgBin_t {
+    unsigned int data[BXDIM*BYDIM]; /* 1D array holding the 2D image data */
+    unsigned int xdim;	  	    /* cols of image data */
+    unsigned int ydim;  	    /* rows of image data */
+};
+
+/**
+ * @brief References position for @AngleMethod patterns
+ * @param   x   x component of reference position, 1D array
+ * @param   y   y component of reference position, 1D array
+ * @param   n   number of stored reference positions
+
+ * @note  NPOS = 60 reserves space for a maximum of 60 reference positions
+ */
+struct ref_pos_t {
+	float x[NPOS];
+	float y[NPOS];
+	int n;
+};
+
+ /**
+ * @brief Observed position for @AngleMethod patterns
+ * @param   x   x component of observed position, 1D array
+ * @param   y   y component of observed position, 1D array
+ * @param   n   number of stored observed positions
+
+ * @param   candidate_index   Observed positions around the target location will be indexed as possible candidates
+ * @param   n_candidates      number of indexed candidate positions
+
+ * @note  NPOS = 60 reserves space for a maximum of 60 observed positions
+ */
+struct obs_pos_t {
+	float x[NPOS];
+	float y[NPOS];
+	unsigned int n;
+
+	int candidate_index[NPOS];
+	int n_candidates;
+};
+
+/**
+ * @brief   Structure to store pixel of interest that are used to obtain star
+            positions by calculating the barycenter in a region of interest
+            around them.
+ * @param   x         x-coordinate of the Pixel of Interest (POI), 1D array
+ * @param   y         y-coordinate of the Pixel of Interest  (POI), 1D array
+ * @param   counter   number of stored Pixel of Interest (POI)
+
+ * @param   group           stores an index to group adjacent POI, 1D array
+ * @param   group_counter   number of formed POI groups
+
+ * @param   skip_index      indices of already grouped POI
+ * @param   skip_counter    stores the number of already grouped indices
+
+ * @note    Pixel of Interest (POI) where formerely referred to as
+            Region of Interest (ROI) and the structure name wasn't changed
+            in the transition.
+ * @note    NROI is the maximum number of possible POI
+            1024/8 = 128 -> 128 * 128 = 16384
+ */
+struct ROI_t {
+	short x[NROI];
+	short y[NROI];
+	unsigned short counter;
+
+	short group[NROI];
+	unsigned short group_counter;
+
+	unsigned short skip_index[NROI];
+	unsigned short skip_counter;
+};
+
+/**
+ * @brief Structure for the reference database that contians the geometric
+          features of the patterns created from the reference positions to
+          identify the target star.
+
+ * @param   data    Stores distances and angles between groups of 3 stars
+                    A combination of 2 distances and 1 angle is referred to
+                    as the __fingerprint__ of the star, 1D array
+
+ * @param   n_stars number of reference stars that were used for the patterns
+
+ * @note    Maxium number of fingerprints is given by(n_stars-1)*(n_stars-2)
+            which results in a total possible (NPOS-1)*(NPOS-2) * 3 shorts for
+            the data field. It can also be used for orientation and accessing
+            fingerprints for a certain combination of stars.
+
+ * @note    Example: a system of 4 stars [A B C D] can form the following
+            fingerprints for star A:\n\n
+            B - A - C    \t\twith the distances BA and AC and an angle between them\n
+            B - A - D\n\n
+
+            C - A - B\n
+            C - A - D\n\n
+
+            D - A - B\n
+            D - A - C\n\n
+
+            Hence N = 4 gives (N-1)*(N-2) = 6 triplets of distance/distance/angle
+
+  * @note   The above example shows how the database for star A is ordered such
+            that all combinations with the next database star B are grouped
+            together. The combination between a star and its first neighbour
+            like B - A in this example is called base0. The combination of A
+            with its second neighbour A - C is called base1.
+
+ */
+struct ref_db_t {
+	unsigned short data [N_REF_FP];
+	unsigned int n_stars;
+} __attribute__((packed)) ;
+
+/**
+ * @brief Structure for the observed database that contians the geometric
+          features of the patterns created from the observed positions to
+          identify the target star.
+
+ * @param   data    Stores distances and angles between groups of 3 stars.
+                    A combination of 2 distances and 1 angle is referred to
+                    as the __fingerprint__ of the star, 1D array
+
+ * @param   counter       total number of stored fingerprints
+
+ * @param   base0_counter total number of stored base0. This is exactly one
+                          less than the observed number of positions
+
+ * @param   candidate_counter   counts the number of observed stars that
+                                were considered a candidate to be the target
+                                star due to their proximity to the expected
+                                target location.
+
+ * @param   base0_index         __data__ index for each __base0__
+ * @param   base1_index         __data__ index for each __base1__
+ * @param   base1_data_count    stores the number of fingerprints for each __base1__
+
+ * @param   value_index         stores the numerical value for each __base0__
+                                and __base1__ to be used as search index in the
+                                matching process. Therefore the matching
+                                algorithm does not have to perform search
+                                operations in the significantly larger __data__
+                                array.
+
+ * @note    Example: a system of 4 stars [A B C D] can form the following
+            fingerprints for star A:\n\n
+            B - A - C    \t\twith the distances BA and AC and an angle a(BA, AC) between them\n
+            B - A - D\n\n
+
+            C - A - B\n
+            C - A - D\n\n
+
+            D - A - B\n
+            D - A - C\n\n
+
+            Hence N = 4 gives (N-1)*(N-2) = 6 triplets of distance/distance/angle
+
+* @note    In form of fingerprints this would be stored as: \n\n
+           [BA, AC, a(BA, AC)]\n
+           [BA, AD, a(BA, AD)]\n
+           [CA, AB, a(CA, AB)]\n
+           .\n
+           .\n
+           .\n
+
+ * @note   The above example shows how the database for star A is ordered such
+           that all combinations with the next database star B are grouped
+           together. The combination between a star and its first neighbour
+           like B - A in this example is called base0. The combination of A
+           with its second neighbour A - C is called base1.
+
+* @note    In addition to the basic structure that the observed database shares
+           with the reference database the positional uncertainties of
+           the positions that were returned by the @StarExtraction have to be
+           considered. This extends the above schema to\n\n
+
+           B1 - A - C1\n
+           B2 - A - C1\n
+           B1 - A - C2\n
+           B2 - A - C2\n\n
+
+           and likewise for the other combinations. The distances AB1 and AB2
+           are measurements for the separation of the same two stars but with
+           different estimation of the positional error. The algorithm is such
+           that there can be up to 3 entries for one distance measurement.\n\n
+
+           Since it is not priorly known whether the calculation will result
+           in one, two or three values for the distance between two stars,
+           the observed database is not as well structured as the
+           reference database. Therefore variables to keep track of the different
+           base0 and base1 locations are necessary.
+ */
+struct obs_db_t {
+  unsigned short data[N_OBS_FP]; /* all finger prints */
+  unsigned int counter;		 /* total amount of finger prints */
+  unsigned int base0_counter;
+
+  unsigned short candidate_counter;
+
+  unsigned int base0_index[NCAND*(NPOS-1)];			      /* first index of each base 0 */
+  unsigned int base1_index[NCAND*(NPOS-1)*(NPOS-2)];		      /* first index of each base 1 */
+  unsigned int base1_data_count[NCAND*(NPOS-1)*(NPOS-2)];	      /* number of finger prints for each base 1 */
+
+  unsigned int value_index[NCAND*(2*(NPOS-1) + 2*(NPOS-1)*(NPOS-2))]; /* saves base 0 and base 1 values */
+};
+
+/**
+ * @brief This structure stores locations of possibly matching fingerprints in __obs_db.data__
+ * @param   base0_match_index     stores doublets of candidate and base0 index, 1D array
+ * @param   base0_match_counter   counts the number of stored doublets. Therefore
+                                  base0_match_index has 2 * base0_match_counter integers
+
+ * @param   base1_match_index     stores triplets of candidate, base0 and base1 index
+                                  for matching entries. 1D-array
+
+ * @param   base1_match_counter   counts the number of stored triplets. Therefore
+                                  base1_match_index has 3 * base1_match_counter integers
+
+ * @note    This is used in the first step of the matching process where a __base0__
+            (the distance between the star and its first neighbour) from the reference
+            database is taken and looked for in the observed database. All __base0__
+            locations of matching fingerprints in the observed database are stored in
+            __base0_match_index__. These locations are then checked for matching
+            __base1__ entries in a further step. Positive identifications for both
+            bases are then stored in __base1_match_index___.
+ */
+struct match_candidates_t {
+  /* entries in most unsigned shorts will be within [0:NPOS] */
+  /* so one could actually use bytes instead */
+
+  unsigned int base0_match_index[2*NCAND*(NPOS-1)];
+  unsigned int base0_match_counter;		/* [0:NCAND*(NPOS-1)) */
+
+  unsigned int base1_match_index[3*NCAND*(NPOS-1)*(NPOS-2)];
+  unsigned int base1_match_counter;		/* [0:NCAND*(NPOS-1)(NPOS-2)) */
+};
+
+/**
+ * @brief This structure stores all information as well as the final match result
+          from the evaluation process of the previously found match candidates (@match_candidates_t)
+
+ * @param   match_results           stores match result quadruplets consisting of\n
+                                    Candidate Star\n
+                                    Base0\n
+                                    Base1\n
+                                    Index of fingerprint with this base0/base1 combination \n
+                                    1D array
+
+ * @param   base0_match_count         Tracks how many base1 are matched for specific base0 combinations (1D array)
+ * @param   base0_match_count_index   Tracks the number of __base0_match_count__ entries.
+ * @param   base0_index               Stores the index of the reference star with with the base0 was formed (1D array)
+
+ * @param   counter                   Tracks the total amount of __match_results__ entries
+                                      (one quadruplet increments by 4)
+
+ * @param   n_ref_pos        Stores the number of reference positions
+ * @param   n_obs_pos        Stores the number of observed  positions
+
+ * @param   match_histogram   Array to track __base0_match_count__ during the match result reduction
+                              during the matching process. Each dimension resembles a __base0__ in the
+                              order of the reference positions and holds the number of __base1__ matches
+                              for each. These might be reduced at a later stage of the process to
+                              remove false positive matches.
+
+ * @param   star_tracker      Stores the majorily matched candidate star index for base0 matches.
+                              Deviating results for this base0 will be discarded.
+
+ * @param   base0_tracker     Stores the majorily matched base0 index.
+                              Deviating results for this base0 will be discarded.
+
+ * @param   target_star       stores the index of the identified target star within the observed positions\n
+                              -1 if identification fails
+
+ * @param   n_matched_items   Total number of matched fingerprints over all bases
+ * @param   n_matched_bases   Number of matched base0 in the reference database
+ * @param   match_quality     Percentage of matched database items
+ * @param   valid_quality     Indicator if the __match_quality__ result is good enough to
+                              justify positive target identification
+
+ * @param   signal_quality    Percentage of measured target star signal compared to
+                              the expected signal
+ * @param   valid_signal      Indicator if the __signal_quality__ result is good enough to
+                              justify positive target identification
+
+ * @note  __star_tracker__ and __base0_tracker__ both work with the indices for candidate stars
+          and bases which can deviate since two different base0 (combinations of the target
+          star paired with one of its neighbours) can have the same numerical distance.
+          This leads to multiple base0 from the observed database to match with a
+          single base0 from the reference database.
+ */
+struct match_results_t {
+	int match_results[4*NCAND*(NPOS-1)*(NPOS-2)];
+	unsigned int base0_match_count[NCAND*(NPOS-1)];
+	unsigned int base0_match_count_index;
+	unsigned int base0_index[NCAND*(NPOS-1)];
+
+	unsigned int counter;			/* [0:4*NCAND*(NPOS-1)*(NPOS-2)) */
+
+	unsigned int n_ref_pos;
+	unsigned int n_obs_pos;
+
+	int match_histogram[NPOS-1];
+	int star_tracker[NPOS-1];
+	int base0_tracker[NPOS-1];
+
+	short target_star;
+
+	short n_matched_items;
+	short n_matched_bases;
+	float match_quality;
+	short valid_quality;
+
+	float signal_quality;
+	short valid_signal;
+};
+
+/**
+ * @brief   This structure stores match results for the photometric standalone
+            matching process called Magnitude Validation Algorithm.
+
+ * @param   obs_pos_index    index of observed position for each star candidate for
+                             which the signal is measured (1D array)
+
+ * @param   signal           measured signal for each candidate (1D array)
+ * @param   signal_quality   Percentage compared to expected signal
+ * @param   n                number of canddidates as counter for the arrays above
+
+ * @param   valid_signal     Indicator if photometric matching was successful
+ * @param   valid_index      Index of target match in __obs_pos_index__
+
+ * @note
+ */
+struct mva_results_t {
+	int obs_pos_index[NCAND];
+	int signal[NCAND];
+	float signal_quality[NCAND];
+	unsigned int n;
+
+	int valid_signal;
+	int valid_index;
+};
+
+/**
+ * @brief Output structure for the TaUnique function. TaUnique finds unique
+          array entries and counts how often they are present in the provided
+          data set
+
+ * @param   items     Stores all unique items (1D array)
+ * @param   counts    Number of times a unique item was found in the data (1D array)
+
+ * @param   n_items           Total number of items in the data set
+ * @param   index_max_count   Index of the item with the maximum number of counts
+
+ * @note  This funciton  offers similar functionality as numpy.unique in python.
+ */
+struct unique_output_t {
+	int items[NPOS-1];
+	int counts[NPOS-1];
+
+	unsigned int n_items;
+	int index_max_count;
+};
+
+/**
+ * @brief   Output structure for the TaWhere function. TaWhere finds array items
+            according to provided criteria
+
+ * @param   items     returned items that satisfy the where criteria
+ * @param   n_items   number of returned items
+
+ * @note    This funciton  offers similar functionality as numpy.where in python.
+ */
+struct where_output_t {
+	unsigned int items[NPOS-1];
+	unsigned int n_items;
+};
+
+
+#endif /* TADATATYPES_H_ */
diff --git a/TargetAcquisition/src/TargetAcquisition.c b/TargetAcquisition/src/TargetAcquisition.c
new file mode 100644
index 0000000..bba5cb4
--- /dev/null
+++ b/TargetAcquisition/src/TargetAcquisition.c
@@ -0,0 +1,575 @@
+/**
+* @file    TargetAcquisition.c
+* @author  Philipp Löschl & Roland Ottensamer (roland.ottensamer@univie.ac.at)
+* @date    July, 2017
+*
+* @defgroup TargetAcquisition Target Acquisition
+* @ingroup EngineeringAlgorithms
+*
+* @brief Target Acquisition serves as the control center for the @StarExtraction
+*        and the identification algorithms @AngleMethod, @MagnitudeValidation.
+*
+* ## Introduction
+* The Target Acquisition is the entirety of the @StarExtraction "Star Extraction",
+* @AngleMethod "Angle Method Algorithm" and
+* @MagnitudeValidation "Magnitude Validation Algorithms" and is mainly responsible
+* for their configuration and execution. It is controlled by an operator in
+* the ground segment via the Star Map Command, which is an observation specific
+* information package that provides all the necessary parameters for an
+* autonomous and successful target identification. In addition, it also serves
+* as the connection to the rest of the Instrument Application Software (IASW)
+* and therefore also handles the incoming image data and outgoing centroiding
+* reports.
+*
+* The acquisition process starts with the memory allocation for all
+* acquisition algorithm specific variables. Once they are in place it receives
+* the image data of the current observation and the respective acquisition
+* algorithm parameters from the Star Map Command. This information is then used
+* to scale the time dependant quantities such as the __reference target signal__,
+* __background signal__ and __detection thresholds__ to the respective
+* exposure time of the current situation.
+*
+* After this preparation, each acquisition process continues as follows:
+*
+*  - Star Extraction
+*  - Distortion Correction
+*  - Identification Algorithm
+*
+* The @Star Extraction "Star Extraction" is the first step for each acquisition
+* and is independent of which target identification method is used in succession.
+* Since the optical system distorts the star positions on the CCD enough so
+* that they can become unrecogniseable by the @AngleMethod "Angle Method" a
+* distortion correction (see section below (REF) for all extracted positions
+* is necessary. Given a successful star extraction and the acquisition process
+* is concluded with the execution of one of the identification algorithms.
+* Their selection is observation specific and described in more detail in
+* section Algorithm Selection (REF) below.
+* \n
+* \n
+* ## Star Map Command
+* All the required input parameters for the acquisition algorithms are provided
+* by the Star Map Command telemetry packages. They are created and tested
+* for every observation by an operator of the Science Operations Center (SOC)
+* with the StarMap Generator Tool. Their content can be seen in Tab.: (REF)
+* below:
+* <table>
+* <tr> <td colspan="4" align="center"> __Star Map Telecommand__
+* <tr> <th> Size [Bit] <th> Data Type <th> Parameter <th> Description
+* <tr> <td> 32   <td> UINT   <td> OBSID                 <td> Unique identifier for the observation
+* <tr> <td> 16   <td> USHORT <td> AcqAlgoId             <td>
+* <tr> <td> 32   <td> UINT   <td> SPARE                 <td> Former parameter “TargetStar” has been deleted
+* <tr> <td> 2208 <td>        <td> SkyPattern            <td> Algorithm Data – details following below
+* <tr> <th colspan="4" align="center"> The SkyPattern is made up of the following data structure
+* <tr> <td> 24   <td> UINT24 <td> Target_Location_X     <td> "Position on the CCD (in centipixels where the target is intended to be located. Origin = bottom left pixel corner (centre of bottom left pixel is thus [50/50]), counting in Cartesian coordinates."
+* <tr> <td> 24   <td> UINT24 <td> Target_Location_Y     <td> same for Y axis
+* <tr> <td> 8    <td> UCHAR  <td> Algorithm ID          <td> which algorithm is to be selected for the Target Acquisition 0… None, 1… MVA, 2… AMA, 3...AMA + MVA
+* <tr> <td> 16   <td> USHORT <td> SPARE                 <td> former execution time (moved)
+* <tr> <td> 16   <td> USHORT <td> SPARE                 <td> former delay time (moved)
+* <tr> <td> 16   <td> USHORT <td> Distance Threshold    <td> Absolute distance between measured position and Target_Location under which we switch from acquisition to centroiding.
+* <tr> <td> 8    <td> UCHAR  <td> Iterations            <td> Maximum number of iterations. 0 = inf
+* <tr> <td>      <td>        <th> Algorithm Paramters   <th> Parameters needed for the tuning of the algorithm – these are generated by the StarMap Generator
+* <tr> <td> 16   <td> USHORT <td> SPARE                 <td> former Rebinning Factor. Now hard coded.
+* <tr> <td> 16   <td> USHORT <td> Detection Threshold   <td> Sets the detection threshold for the Star Extraction. Default: 5200 [10 ADU]
+* <tr> <td> 16   <td> USHORT <td> SE_Reduced_Extraction <td> Limits the Star Extraction to a radius around the expeced Target Location. Default: False
+* <tr> <td> 16   <td> USHORT <td> SE_Reduced_Radius     <td> Sets the reduced extraction radius for the Star Extraction. Default: 392 pix
+* <tr> <td> 16   <td> USHORT <td> SE_Tolerance          <td> Maximum positional error in Star Extraction results. Default: 5 pix
+* <tr> <td> 16   <td> USHORT <td> MVA_Tolerance         <td> Maximum photometric error for the Magnitude Validation Method. Default: 15 percent
+* <tr> <td> 16   <td> USHORT <td> AMA_Tolerance         <td> Maximum error for distance vectors. Default: 3 pix
+* <tr> <td> 16   <td> USHORT <td> Pointing_Uncertainty  <td> Maximum expected pointing error from the Target Location. Default: 150 pix
+* <tr> <td> 32   <td> UINT   <td> Target Signal         <td> Signal of the target in ADU/s
+* <tr> <td> 16   <td> USHORT <td> Number of Stars       <td> Number of stars included in the sky pattern
+* <tr> <td> 1920 <td> BINARY <td> Pattern               <td> Data field („Sky Pattern“) with star entries according to algorithm 920 bits = 120 shorts
+* </Table>
+* \n
+* \n
+* ## Distortion Correction
+* The optical system of CHEOPS introduces significant distortion effects in the
+* outer regions of the FOV. As they are strong enough to affect the intra-star
+* distances that are required by the Angle Method a distortion correction is used
+* to transform the Star Extraction provided positions into undistorted positions
+* that match the reference stars. More information is provided by (REF).
+* \n
+* \n
+* ## Algorithm Selection
+* The acquisition algorithm is selected by the operator during the parameter
+* setup for the Star Map Command. Depending on the star density and distribution
+* in a specific FOV there are three possible options:
+*
+*  - Magnitude Validation Acquisition Algorithm (MVAA)
+*  - Angle Method Algorithm (AMA)
+*  - Angle Method Algorithm + Magnitude Validation Algorithm (AMA + MVA)
+*
+* Magnitude Validation Acquisition is meant for bright objects that can easily
+* be distinguished from the other stars in an observation. The Star Map Generator
+* Tool is currently configured to prefer this algorithm for targets of up to
+* 10mag. Fainter stars might have another, similarly bright object in the FOV
+* and could therefore be misidentified.
+*
+* For this reason the two Angle Method Algorithm variations are used for
+* target identifications of >10mag stars. The third method is prefered and will
+* be used for every case that has available brightness data of the target star.
+* Here the Magnitude Validation Algorithm is used to as a backup identification
+* method to verify observations with poor AMA results. Observations without this
+* data will solely use the Angle Method Algorithm.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include "CrIaDataPool.h"
+#include "CrIaDataPoolId.h"
+
+#include "AngleMethod.h"
+#include "TaDatatypes.h"
+#include "StarExtractor.h"
+#include "TargetAcquisition.h"
+#include "StarPosDistortCorr.h"
+#include "EngineeringAlgorithms.h"
+
+#include "SdpBuffers.h"
+#include "SdpAlgorithmsImplementation.h"
+
+struct match_candidates_t *g_candidates;
+struct unique_output_t *g_output;
+struct unique_output_t *g_unique_base0;
+struct unique_output_t *g_unique_stars;
+struct unique_output_t *g_unique_duplicate_entry;
+struct where_output_t *g_multi_base_skip_index;
+struct where_output_t *g_multi_base_index;
+struct where_output_t *g_duplicate_base0;
+struct where_output_t *g_duplicate_base1;
+struct unique_output_t *g_unique_stars;
+struct where_output_t *g_base0_count;
+struct img_t *g_img;
+struct obs_pos_t *obs_pos;
+struct ref_pos_t *ref_pos;
+struct ref_db_t *ref_DB;
+struct obs_db_t *obs_DB;
+struct match_results_t *amaresults;
+struct mva_results_t *mvaresults;
+struct ROI_t *g_POI;
+struct ROI_t *temp_POI;
+
+struct imgBin_t *g_imgBin;
+
+#ifdef GROUNDSW
+      # define ADVGROUNDSW 1
+#endif
+
+#define MAX_TASTARS MAXNROFSTARS
+
+#define ALIGNSIZE(s) ((s+7) & 0xFFFFFFF8)
+
+void initMatchingBuffers (unsigned int *data)
+{
+  g_img      = (struct img_t *)SWAPALLOC(ALIGNSIZE(sizeof(struct img_t)), SWAP);                     /* shall point to the unpacked full frame of 1024x1024 32 bit in CIB */
+  ref_pos    = (struct ref_pos_t *)SWAPALLOC(ALIGNSIZE(sizeof(struct ref_pos_t)), SWAP);             /* < 1 kiB */
+  obs_pos    = (struct obs_pos_t *)SWAPALLOC(ALIGNSIZE(sizeof(struct obs_pos_t)), SWAP);             /* < 1.5 kiB*/
+  ref_DB     = (struct ref_db_t *)SWAPALLOC(ALIGNSIZE(sizeof(struct ref_db_t)), SWAP);               /* < 40 kiB */
+  obs_DB     = (struct obs_db_t *)SWAPALLOC(ALIGNSIZE(sizeof(struct obs_db_t)), SWAP);               /* ca 3.2 MiB */
+  amaresults = (struct match_results_t *)SWAPALLOC(ALIGNSIZE(sizeof(struct match_results_t)), SWAP); /* ca 600 kiB */
+  mvaresults = (struct mva_results_t *)SWAPALLOC(ALIGNSIZE(sizeof(struct mva_results_t)), SWAP);     /* ca 132 bytes */
+
+  g_candidates             = (struct match_candidates_t *)AUXALLOC(ALIGNSIZE(sizeof(struct match_candidates_t)), AUX); /* ca 416 kB */
+  g_output                 = (struct unique_output_t *)AUXALLOC(ALIGNSIZE(sizeof(struct unique_output_t)), AUX);       /* 480 B */
+  g_unique_base0      = (struct unique_output_t *)AUXALLOC(ALIGNSIZE(sizeof(struct unique_output_t)), AUX);       /* 480 B */
+  g_unique_duplicate_entry = (struct unique_output_t *)AUXALLOC(ALIGNSIZE(sizeof(struct unique_output_t)), AUX);       /* 480 B */
+  g_multi_base_skip_index  = (struct where_output_t *)AUXALLOC(ALIGNSIZE(sizeof(struct where_output_t)), AUX);         /* 240 B */
+  g_multi_base_index       = (struct where_output_t *)AUXALLOC(ALIGNSIZE(sizeof(struct where_output_t)), AUX);         /* 240 B */
+  g_duplicate_base0        = (struct where_output_t *)AUXALLOC(ALIGNSIZE(sizeof(struct where_output_t)), AUX);         /* 240 B */
+  g_duplicate_base1        = (struct where_output_t *)AUXALLOC(ALIGNSIZE(sizeof(struct where_output_t)), AUX);         /* 240 B */
+  g_unique_stars           = (struct unique_output_t *)AUXALLOC(ALIGNSIZE(sizeof(struct unique_output_t)), AUX);       /* 480 B */
+  g_base0_count            = (struct where_output_t *)AUXALLOC(ALIGNSIZE(sizeof(struct where_output_t)), AUX);         /* 240 B */
+
+  g_imgBin = (struct imgBin_t *) AUXALLOC(ALIGNSIZE(sizeof(struct imgBin_t)), AUX); /* 65538 B */
+  g_POI    = (struct ROI_t *) AUXALLOC(ALIGNSIZE(sizeof(struct ROI_t)), AUX);       /* 131078 B */
+  temp_POI = (struct ROI_t *) AUXALLOC(ALIGNSIZE(sizeof(struct ROI_t)), AUX);       /* 131078 B */ /* Mantis 2268 */
+
+  g_img->data = data;
+  g_img->xdim = TA_XDIM;
+  g_img->ydim = TA_YDIM;
+
+  return;
+}
+
+
+void free_matching_buffers (void)
+{
+#if (__sparc__)
+  release(AUX);
+  release(SWAP);
+#else
+  swapalloc(0,1);
+  auxalloc(0,1);
+#endif
+
+  return;
+}
+
+
+void TargetAcquisition (struct CrIaSib *Sib)
+{
+  float TargetLocation[2];
+  float ExposureTime;
+
+  int SignalThrd, CandidateRadius, Shift[2];
+  unsigned int i, u32temp, TargetSignal, DetectionThld;
+  unsigned char u8temp, TaAlgorithmId;
+
+  unsigned short u16temp, RebinFactor, DetTh;
+  unsigned short ReducedExtraction, ExtractionRadius, ExtractionTolerance;
+  unsigned short MvaTolerance, AmaTolerance;
+  unsigned short PointUncert, BgSignal, NrOfStars;
+
+  int xstart;
+
+  unsigned short cibIn;
+  unsigned int *cibAddress;
+
+  unsigned char distCorr;
+  float optAxisX, optAxisY;
+
+  float TaMaxSigFract, TaBias, TaDark, TaSkyBg;
+  
+  struct SibHeader *sibHeader;
+
+  /*
+     copy the image from expos to CIB and crop to 1024 x 1024
+  */
+
+  /* determine nominal or redundant side to find the proper image offset in X */
+  sibHeader = (struct SibHeader *) Sib->Header;
+
+  xstart = LSM_XDIM; /* NOM: 28 */
+  
+  if (GetFpmSide(sibHeader->CcdTimingScriptId) == FPM_SIDE_B)
+    {      
+      xstart = RSM_XDIM; /* RED: 24 */
+    }
+
+  CrIaCopy (CIBIN_ID, &cibIn);
+  cibAddress = (unsigned int *)GET_ADDR_FROM_SDB_OFFSET(cibIn);
+
+  CropCopyFromSibAndUnpack (Sib->Expos, FULL_SIZE_X, FULL_SIZE_Y, 1024, 1024, xstart, 0, cibAddress);
+
+  /* first we release the necessary heaps */
+  free_matching_buffers();
+
+  initMatchingBuffers(cibAddress);
+
+  /*  TA_DEBUG("first pixels are: %u %u %u\n", g_img->data[0], g_img->data[1], g_img->data[2]); */
+
+  /*
+     assign DP variables
+  */
+
+  /* obsid is not needed here */
+
+  /* acqalgoid is used one level up */
+
+  /* spare u32 is not used */
+
+  /* tglocx 24 */
+  CrIaCopy(TARGETLOCATIONX_ID, &u32temp);
+  TargetLocation[0] = (float) ((u32temp - 50) / 100.f); /* comes in centipixel */ /* was: .. - 2850 .., but changed upon request by platform */
+  /* TA_DEBUG("TARGETLOCX: %f\n", TargetLocation[0]); */
+
+  /* tglocy 24 */
+  CrIaCopy(TARGETLOCATIONY_ID, &u32temp);
+  TargetLocation[1] = (float) ((u32temp - 50) / 100.f); /* comes in centipixel */
+  /* TA_DEBUG("TARGETLOCY: %f\n", TargetLocation[1]); */
+
+  /* algoid is 16 in DP but 8 in command */
+  CrIaCopy(TAALGOID_ID, &u16temp);
+  TaAlgorithmId = (unsigned char)u16temp;
+  /* TA_DEBUG("TAALGOID: %u\n", TaAlgorithmId); */
+
+  /* TATIMINGPAR1 is used one level up */
+
+  /* TATIMINGPAR2 is used one level up */
+
+  /* TADISTANCETHRD is used one level up */
+
+  /* TAITERATIONS is used one level up */
+
+  /* rebinfact ushort */
+  CrIaCopy(TAREBINNINGFACT_ID, &RebinFactor);
+  RebinFactor = 8; /* NOTE: must be 8! */
+
+  /* detthrd ushort */
+  CrIaCopy(TADETECTIONTHRD_ID, &DetTh);
+  DetectionThld = DetTh * 10;
+  /* TA_DEBUG("TADETECTIONTHRD: %u\n", DetectionThrd); */
+
+  /* se_reduced_extr ushort */
+  CrIaCopy(TASEREDUCEDEXTR_ID, &ReducedExtraction);
+  /* TA_DEBUG("TASEREDUCEEXTR: %u\n", ReducedExtraction); */
+
+  /* se reduced radius 16 */
+  CrIaCopy(TASEREDUCEDRADIUS_ID, &ExtractionRadius);
+  /* TA_DEBUG("TASEREDUCEDRADIUS: %u\n", ExtractionRadius); */
+
+  /* se tolerance 16 */
+  CrIaCopy(TASETOLERANCE_ID, &ExtractionTolerance);
+  /* TA_DEBUG("TASETOLERANCE: %u\n", ExtractionTolerance); */
+
+  /* mva tolerance 16 */
+  CrIaCopy(TAMVATOLERANCE_ID, &MvaTolerance);
+  /* TA_DEBUG("TAMVATOLERANCE: %u\n", MvaTolerance); */
+
+  /* ama tolerance 16 */
+  CrIaCopy(TAAMATOLERANCE_ID, &AmaTolerance);
+  /* TA_DEBUG("TAAMATOLERANCE: %u\n", AmaTolerance); */
+
+  /* pointing uncertainty 16 */
+  CrIaCopy(TAPOINTUNCERT_ID, &PointUncert);
+  /* TA_DEBUG("TAPOINTUNCERT: %u\n", PointUncert); */
+  CandidateRadius = PointUncert + ExtractionTolerance;
+
+  /*
+     copy data pattern parameters
+  */
+
+  /* targetsig 32 */
+  CrIaCopy(TATARGETSIG_ID, &TargetSignal);
+
+  /* nrofstars 16 */
+  CrIaCopy(TANROFSTARS_ID, &NrOfStars);
+  /* TA_DEBUG("TANROFSTARS: %u\n", NrOfStars); */
+
+  /*
+     copy stars pattern
+  */
+
+
+  /* now read the stars */
+  for (i=0; (i < NrOfStars) && (i < MAX_TASTARS); i++)
+    {
+      CrIaCopyArrayItem (STARMAP_ID, &u8temp, 4*i);
+      u16temp = ((unsigned short)u8temp) << 8;
+      CrIaCopyArrayItem (STARMAP_ID, &u8temp, 4*i+1);
+      u16temp |= (unsigned short)u8temp;
+      ref_pos->x[i] = (float) u16temp / 10.0f;
+
+      CrIaCopyArrayItem (STARMAP_ID, &u8temp, 4*i+2);
+      u16temp = ((unsigned short)u8temp) << 8;
+      CrIaCopyArrayItem (STARMAP_ID, &u8temp, 4*i+3);
+      u16temp |= (unsigned short)u8temp;
+      ref_pos->y[i] = (float) u16temp / 10.0f;
+    }
+
+  ref_pos->n = i;
+
+  /*
+    calculate the background
+  */
+
+  /* get exposure time from SIB */
+  ExposureTime = sibHeader->ExposureTime / 1000.0f;
+  
+  CrIaCopy(TABIAS_ID, &TaBias);
+  CrIaCopy(TADARK_ID, &TaDark);
+  CrIaCopy(TASKYBG_ID, &TaSkyBg); /* 8.35 ph/s (zody) + 2 ph/s (straylight) = 10.35 photons/s; 0.65 e/ph is the QE; 0.439 is the gain in e/ADU; see Master thesis Ferstl p 111 */
+  
+  BgSignal = calculate_background_signal (ExposureTime, TaBias, TaDark, TaSkyBg);
+
+  TargetSignal = TargetSignal * ExposureTime;
+  SignalThrd = (int)(DetectionThld * ExposureTime);
+
+  CrIaCopy (TAMAXSIGFRACT_ID, &TaMaxSigFract);
+  DetectionThld = (int)(SignalThrd * TaMaxSigFract);
+
+
+#ifdef GROUNDSW
+  TA_DEBUG("Exptime       : %f\n", ExposureTime);
+  TA_DEBUG("BgSignal      : %u\n", BgSignal);
+  TA_DEBUG("TargetSignal  : %u\n", TargetSignal);
+  TA_DEBUG("SignalThrd    : %d\n", SignalThrd);
+  TA_DEBUG("DetectionThld : %u\n", DetectionThld);
+#endif
+
+  star_extraction (g_img, obs_pos, RebinFactor, TargetLocation, ReducedExtraction, ExtractionRadius, DetectionThld, SignalThrd, BgSignal, g_POI);
+  
+  /* carry out distortion correction */
+  CrIaCopy (DIST_CORR_ID, &distCorr);
+  
+  if (distCorr  != 0)
+    {
+      CrIaCopy(OPT_AXIS_X_ID, &optAxisX);
+      CrIaCopy(OPT_AXIS_Y_ID, &optAxisY);
+      
+      (void) star_pos_distort_corr (obs_pos, optAxisX, optAxisY, TA_XDIM, TA_YDIM);
+    }
+
+  Shift[0] = 0;
+  Shift[1] = 0;
+
+  /* start with a dummy report */
+  PrepareSibCentroid (Sib, CEN_INV_TARGET, 0.0f, 0.0f);
+
+  /* NOTE: Depending on the application either the distortion corrected obs_pos
+           or the original uncorrected obs_pos have to be used */
+  switch (TaAlgorithmId)
+  {
+    case TA_ALGO_NONE :
+
+      /* no matching, use dummy report */
+
+      break;
+
+    case TA_ALGO_MVA :
+
+      if ((obs_pos->n > 0) && (TargetSignal > 0))
+      {
+        /* use uncorrected obs_pos to measure the signal on the right coordinates */
+        target_magntitude_validation_acquisition (mvaresults, obs_pos, TargetLocation, CandidateRadius, g_img, TargetSignal, MvaTolerance, BgSignal);
+
+        if (mvaresults->valid_signal != 0)
+        {
+          /* use uncorrected obs_pos to measure the correct offset on the CCD*/
+          calculate_target_shift_MVA (obs_pos, mvaresults, Shift, TargetLocation);
+#ifdef GROUNDSW
+          TA_DEBUG("MVA says: %d, %d centi-pixel\n", Shift[0], Shift[1]);
+#endif
+          PrepareSibCentroid (Sib, CEN_VAL_FULL, Shift[0]/100.0f, Shift[1]/100.0f);
+        }
+#ifdef ADVGROUNDSW
+        else
+	  printf("MVA: %f ", 0.0);
+#endif
+      }
+
+      break;
+
+    case TA_ALGO_AMA :
+
+      if ((obs_pos->n > 3) && (ref_pos->n > 3))
+      {
+        create_ref_DB (ref_pos, 0, ref_DB, AmaTolerance); /* NOTE: target index is always 0 */
+
+        /* use corrected obs_pos to match the reference fingerprints */
+        create_obs_DB (obs_pos, obs_DB, TargetLocation, CandidateRadius, AmaTolerance);
+	
+        match_databases (ref_DB, obs_DB, amaresults);
+	
+        /* both obs_pos possible, since only used GROUNDSW outputs */
+	determine_match_quality (amaresults, obs_pos);
+	
+        if (amaresults->valid_quality != 0)
+        {
+          /* use uncorrected obs_pos to measure the correct offset on the CCD*/
+          calculate_target_shift_AMA (obs_pos, amaresults, Shift, TargetLocation);
+#ifdef GROUNDSW
+          TA_DEBUG("AMA says: %d, %d centi-pixel\n", Shift[0], Shift[1]);
+#endif
+          PrepareSibCentroid (Sib, CEN_VAL_FULL, Shift[0]/100.0f, Shift[1]/100.0f);
+        }
+        else
+        {
+#ifdef ADVGROUNDSW
+	  /*      printf("AMA: %f ", amaresults->match_quality); */
+      /*printf("TACQ: FAILED ");*/
+#endif
+          /* ERROR: MATCH QUALITY < 50% of DB -> TACQ FAIL */
+          PrepareSibCentroid (Sib, CEN_INV_TARGET, 0.0f, 0.0f);
+        }
+      }
+      else
+      {
+#ifdef ADVGROUNDSW
+      /*printf("TACQ: FAILED ");*/
+	/*      printf("AMA: %f ", 0.0); */
+#endif
+        /* ERROR: NOT ENOUGH STARS FOR AMA */
+        PrepareSibCentroid (Sib, CEN_INV_INPUT, 0.0f, 0.0f);
+      }
+      break;
+
+    case TA_ALGO_AMAMVA :
+
+      if ((obs_pos->n > 3) && (ref_pos->n > 3))
+      {
+        create_ref_DB (ref_pos, 0, ref_DB, AmaTolerance); /* NOTE: target index is always 0 */
+
+        /* use corrected obs_pos to match the reference fingerprints */
+        create_obs_DB (obs_pos, obs_DB, TargetLocation, CandidateRadius, AmaTolerance);
+
+        match_databases (ref_DB, obs_DB, amaresults);
+
+        /* both obs_pos possible, since only used GROUNDSW outputs */
+	determine_match_quality (amaresults, obs_pos);
+
+        if (amaresults->valid_quality != 0)
+        {
+          /* use uncorrected obs_pos to measure the correct offset on the CCD*/
+          calculate_target_shift_AMA (obs_pos, amaresults, Shift, TargetLocation);
+#ifdef ADVGROUNDSW
+	  /*          printf("AMA: %f ", amaresults->match_quality); */
+#endif
+          PrepareSibCentroid (Sib, CEN_VAL_FULL, Shift[0]/100.0f, Shift[1]/100.0f);
+        }
+        else if ((amaresults->match_quality > 40) && (TargetSignal > 0)) /* 40% of DB */
+        {
+          /* use uncorrected obs_pos to measure the signal on the right coordinates */
+          target_magnitude_validation (g_img, obs_pos, amaresults, BgSignal, TargetSignal, MvaTolerance);
+          if (amaresults->valid_signal != 0)
+          {
+            /* insuff matches but MVA rescue*/
+            /* use uncorrected obs_pos to measure the correct offset on the CCD*/
+            calculate_target_shift_AMA (obs_pos, amaresults, Shift, TargetLocation);
+#ifdef ADVGROUNDSW
+	    /*      printf("AMA: %f ", amaresults->match_quality); */
+#endif
+	    PrepareSibCentroid (Sib, CEN_VAL_FULL, Shift[0]/100.0f, Shift[1]/100.0f);
+          }
+          else
+          {
+            /* negative insuff matches and no MVA rescue */
+#ifdef ADVGROUNDSW
+	    /*      printf("AMA: %f ", amaresults->match_quality); */
+      /*printf("TACQ: FAILED ");*/
+#endif
+            PrepareSibCentroid (Sib, CEN_INV_SMEAR, 0.0f, 0.0f);
+          }
+        }
+        else
+        {
+#ifdef ADVGROUNDSW
+	  /*      printf("AMA: %f ", amaresults->match_quality); */
+      /*printf("TACQ: FAILED ");*/
+#endif
+          /* negative insuff matches */
+          PrepareSibCentroid (Sib, CEN_INV_SMEAR, 0.0f, 0.0f);
+        }
+      }
+      else
+      {
+#ifdef ADVGROUNDSW
+      /*printf("TACQ: FAILED ");*/
+	/*      printf("AMA: %f ", 0.0); */
+#endif
+        	/* ERROR: NOT ENOUGH STARS FOR AMA */
+        	PrepareSibCentroid (Sib, CEN_INV_INPUT, 0.0f, 0.0f);
+      }
+
+      break;
+
+    default:
+
+#ifdef ADVGROUNDSW
+      /*printf("TACQ: FAILED ");*/
+      /*      printf("AMA: %f ", 0.0); */
+#endif
+      /* invalid algorithm id */
+      PrepareSibCentroid (Sib, CEN_INV_ALGO, 0.0f, 0.0f);
+
+      break;
+
+    }
+
+  free_matching_buffers();
+
+  return;
+}
diff --git a/TargetAcquisition/src/TargetAcquisition.h b/TargetAcquisition/src/TargetAcquisition.h
new file mode 100644
index 0000000..4dc4cc1
--- /dev/null
+++ b/TargetAcquisition/src/TargetAcquisition.h
@@ -0,0 +1,41 @@
+#ifndef TARGETACQUISITION_H
+#define TARGETACQUISITION_H
+
+#include "SdpBuffers.h"
+#include "TaDatatypes.h"
+
+extern struct match_candidates_t *g_candidates;
+extern struct unique_output_t *g_output;
+extern struct unique_output_t *g_unique_base0;
+extern struct unique_output_t *g_unique_stars;
+extern struct unique_output_t *g_unique_duplicate_entry;
+extern struct where_output_t *g_multi_base_skip_index;
+extern struct where_output_t *g_multi_base_index;
+extern struct where_output_t *g_duplicate_base0;
+extern struct where_output_t *g_duplicate_base1;
+extern struct unique_output_t *g_unique_stars;
+extern struct where_output_t *g_base0_count;
+extern struct img_t *g_img;
+extern struct obs_pos_t *obs_pos;
+extern struct ref_pos_t *ref_pos;
+extern struct ref_db_t* ref_DB;
+extern struct obs_db_t* obs_DB;
+extern struct match_results_t* amaresults;
+extern struct mva_results_t* mvaresults;
+extern struct ROI_t *g_POI;
+extern struct ROI_t *temp_POI;
+
+extern struct imgBin_t* g_imgBin;
+
+extern unsigned char maskdata[LXDIM * LYDIM];
+
+#define TA_ALGO_NONE 0
+#define TA_ALGO_MVA 1
+#define TA_ALGO_AMA 2
+#define TA_ALGO_AMAMVA 3
+
+void initMatchingBuffers (unsigned int *data);
+
+void TargetAcquisition (struct CrIaSib *Sib);
+
+#endif
diff --git a/include/CrFramework b/include/CrFramework
new file mode 120000
index 0000000..28fba33
--- /dev/null
+++ b/include/CrFramework
@@ -0,0 +1 @@
+../CrFramework/src
\ No newline at end of file
diff --git a/include/FwProfile b/include/FwProfile
new file mode 120000
index 0000000..2c61e67
--- /dev/null
+++ b/include/FwProfile
@@ -0,0 +1 @@
+../FwProfile/src
\ No newline at end of file
-- 
GitLab