diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ad1dabc1220ea7973e23644d1e65791e8a8c1283..bf8da92892377b2e9fbae1501f7e6d505fdb657c 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -207,6 +207,16 @@ build_ST_MAC:
     paths:
       - build/gnucxx11_opt
 
+
+build_lofar_pulp_docker_image:
+  stage: build
+  script:
+    - docker build -t ci_pulp:$CI_COMMIT_SHORT_SHA Docker/pulp-base
+    - docker build --build-arg BASE_VERSION=$CI_COMMIT_SHORT_SHA --build-arg LOFAR_TAG=$CI_COMMIT_REF_NAME -t ci_lofar_pulp:$CI_COMMIT_SHORT_SHA Docker/lofar-pulp
+  interruptible: true
+  when: manual # pulp docker images take a long time to build. It does not/hardly depend on currently developed lofar code. So an automatic build for each lofar commit is not needed.
+
+
 #
 # UNIT TEST STAGE
 #
@@ -337,6 +347,23 @@ dockerize_TMSS:
     - job: build_SCU
       artifacts: true
 
+
+dockerize_PULP:
+  # The dockerize step is meant to create small images ready for production with marginal overhead.
+  # For PULP we don't know (yet) what we can and cannot extract/remove from the ci_lofar_pulp image
+  # Therefor - for the time being - we just upload the full ci_lofar_pulp image to nexus, making it ready for deployment
+  stage: dockerize
+  allow_failure: true
+  script:
+    - docker login -u $CI_NEXUS_REGISTRY_USERNAME -p $CI_NEXUS_REGISTRY_PASSWORD $CI_NEXUS_REGISTRY
+    - docker tag ci_lofar_pulp:$CI_COMMIT_SHORT_SHA $CI_NEXUS_REGISTRY_LOCATION/ci_lofar_pulp:$CI_COMMIT_SHORT_SHA
+    - docker push $CI_NEXUS_REGISTRY_LOCATION/ci_lofar_pulp:$CI_COMMIT_SHORT_SHA
+    - docker logout $CI_NEXUS_REGISTRY
+  interruptible: true
+  needs:
+    - job: build_lofar_pulp_docker_image
+      artifacts: true
+
 #
 # INTEGRATION TEST STAGE
 #
@@ -578,6 +605,26 @@ deploy-CCU_MAC-prod:
     - build_CCU_MAC
   allow_failure: true
   when: manual
+
+
+deploy-PULP-prod:
+  stage: deploy-prod
+  before_script:
+    # needed so that gitlab-runner can login at cep4
+    - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client git -y )'
+    - eval $(ssh-agent -s)
+    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
+    - mkdir -p ~/.ssh
+    - chmod 700 ~/.ssh
+    - ssh-keyscan head.cep4.control.lofar >> ~/.ssh/known_hosts
+    - chmod 644 ~/.ssh/known_hosts
+  script:
+    - ssh lofarsys@head.cep4.control.lofar "clush -S -P -w cpu[01-50] -w gpu[01-04] -w head[01-02] docker pull $CI_NEXUS_REGISTRY_LOCATION/ci_lofar_pulp:$CI_COMMIT_SHORT_SHA"
+    # the pulp pipeline is built to be run as lofar-pulp:$CI_COMMIT_REF_NAME through setting the LOFAR_TAG in build_lofar_pulp_docker_image
+    - ssh lofarsys@head.cep4.control.lofar "clush -S -P -w cpu[01-50] -w gpu[01-04] -w head[01-02] docker tag $CI_NEXUS_REGISTRY_LOCATION/ci_lofar_pulp:$CI_COMMIT_SHORT_SHA lofar-pulp:$CI_COMMIT_REF_NAME"
+  needs:
+    - dockerize_PULP
+  when: manual
   only:
     - tags
 
diff --git a/Docker/CMakeLists.txt b/Docker/CMakeLists.txt
index b747d3cbbe65a98f59df065d56b8c8a03fea73f7..aa9a16e1f303961e571133c7bb66fc7d2c57b0fa 100644
--- a/Docker/CMakeLists.txt
+++ b/Docker/CMakeLists.txt
@@ -25,7 +25,6 @@ lofar_add_bin_program(versiondocker versiondocker.cc)
 set(DOCKER_TEMPLATE_DIRS
   lofar-base
   lofar-pipeline
-  lofar-pulp
   lofar-outputproc
   lofar-subbandtbbwriter)
 
diff --git a/Docker/lofar-ci/Dockerfile_ci_scu b/Docker/lofar-ci/Dockerfile_ci_scu
index be56003efb6f739196b0e2a460375aaf713d0e87..cf83370443256abd8077c0c778a3570ca2a29619 100644
--- a/Docker/lofar-ci/Dockerfile_ci_scu
+++ b/Docker/lofar-ci/Dockerfile_ci_scu
@@ -33,6 +33,7 @@ RUN pip3 install django-material django-viewflow
 RUN echo "Installing Nodejs packages...." && \
     curl -sL https://rpm.nodesource.com/setup_14.x | bash - && \
     yum install -y nodejs && \
+    export NODE_OPTIONS="--max-old-space-size=8192" && \
     npm -v && \
     node -v && \
     npm install -g serve
diff --git a/Docker/lofar-pulp/Dockerfile.tmpl b/Docker/lofar-pulp/Dockerfile
similarity index 54%
rename from Docker/lofar-pulp/Dockerfile.tmpl
rename to Docker/lofar-pulp/Dockerfile
index 894990f5995e269ec968e449020bc0d09a81a8f4..8cd9a1e14f0cd589e01cfdabea4d22750f578fbd 100644
--- a/Docker/lofar-pulp/Dockerfile.tmpl
+++ b/Docker/lofar-pulp/Dockerfile
@@ -1,9 +1,13 @@
 #
 # base
 #
-FROM pulp:github-master
 
-ENV INSTALLDIR /opt
+# Tell image build information
+ARG BASE_VERSION=latest
+FROM ci_pulp:${BASE_VERSION}
+
+ENV BASE_VERSION=${BASE_VERSION}
+
 USER 0
 COPY ["sudoers", "/etc/"]
 
@@ -24,11 +28,12 @@ RUN apt-get update && apt-get install -y sasl2-bin libuuid1 libnss3 libnspr4 xqi
 # Install
 # QPID daemon legacy store would require: libaio-dev libdb5.1++-dev
 RUN apt-get update && apt-get install -y ruby ruby-dev libsasl2-dev uuid-dev libxerces-c-dev libnss3-dev libnspr4-dev help2man libsslcommon2-dev libxqilla-dev libboost-program-options${BOOST_VERSION}-dev libboost-filesystem${BOOST_VERSION}-dev && \
-    mkdir ${INSTALLDIR}/qpid && \
-    svn --non-interactive -q co https://svn.astron.nl/LOFAR/trunk/LCS/MessageBus/qpid/ ${INSTALLDIR}/qpid; \
-    bash -c "HOME=/tmp ${INSTALLDIR}/qpid/local/sbin/build_qpid" && \
-    bash -c "strip ${INSTALLDIR}/qpid/{bin,lib}/* || true" && \
-    bash -c "rm -rf /tmp/sources" && \
+    mkdir -p /opt/qpid/src && \
+    git clone --depth=1 https://git.astron.nl/ro/lofar.git /opt/qpid/src && \
+    cd /opt/qpid/src/LCS/MessageBus/qpid && \
+    bash -c "HOME=/tmp /opt/qpid/src/LCS/MessageBus/qpid/local/sbin/build_qpid" && \
+    bash -c "strip /opt/qpid/{bin,lib}/* || true" && \
+    bash -c "rm -rf /tmp/sources /opt/qpid/src" && \
     apt-get purge -y ruby ruby-dev libsasl2-dev uuid-dev libxerces-c-dev libnss3-dev libnspr4-dev help2man libsslcommon2-dev libxqilla-dev libboost-program-options${BOOST_VERSION}-dev libboost-filesystem${BOOST_VERSION}-dev && \
     apt-get autoremove -y
 
@@ -43,29 +48,33 @@ RUN aptitude install -y python3-kombu
 # *******************
 #
 
-# Tell image build information
-ENV LOFAR_BRANCH=${LOFAR_BRANCH_NAME} \
-    LOFAR_TAG=${LOFAR_TAG} \
-    LOFAR_REVISION=${LOFAR_REVISION} \
-    LOFAR_BUILDVARIANT=gnucxx11_optarch
+ARG LOFAR_BUILDVARIANT=gnucxx11_optarch
+ENV LOFAR_BUILDVARIANT=${LOFAR_BUILDVARIANT}
+
+# Pulp is still python2, so we need a LOFAR version that still builds CEP with python2. We have a specific branch for that containing any patches on top of the old LOFAR version
+ARG LOFAR_VERSION=LOFAR-Release-3_2_17-PULP
+ENV LOFAR_VERSION=${LOFAR_VERSION}
 
 # Install
 #some are already installed, but we need boost, and RUN apt-get update && apt-get install -y subversion cmake g++ gfortran bison flex liblog4cplus-dev libhdf5-dev libblitz0-dev python-dev libxml2-dev pkg-config libunittest++-dev libxml++2.6-dev binutils-dev && \
 RUN apt-get update && apt-get install -y liblog4cplus-dev libhdf5-dev libblitz0-dev libunittest++-dev libxml++2.6-dev binutils-dev && \
-    mkdir -p ${INSTALLDIR}/lofar/build/${LOFAR_BUILDVARIANT} && \
-    cd ${INSTALLDIR}/lofar && \
-    svn --non-interactive -q co -r ${LOFAR_REVISION} -N ${LOFAR_BRANCH_URL} src; \
-    svn --non-interactive -q up src/CMake && \
-    cd ${INSTALLDIR}/lofar/build/${LOFAR_BUILDVARIANT} && cmake -DBUILD_PACKAGES="Pipeline MessageBus OTDB_Services" -DBUILD_TESTING=OFF -DCMAKE_INSTALL_PREFIX=${INSTALLDIR}/lofar/ -DCASACORE_ROOT_DIR=${INSTALLDIR}/casacore/ -DQPID_ROOT_DIR=/opt/qpid/ -DUSE_OPENMP=True ${INSTALLDIR}/lofar/src/ && \
-    cd ${INSTALLDIR}/lofar/build/${LOFAR_BUILDVARIANT} && make -j ${J} && \
-    cd ${INSTALLDIR}/lofar/build/${LOFAR_BUILDVARIANT} && make install && \
-    bash -c "mkdir -p ${INSTALLDIR}/lofar/var/{log,run}" && \
-    bash -c "chmod a+rwx  ${INSTALLDIR}/lofar/var/{log,run}" && \
-    bash -c "strip ${INSTALLDIR}/lofar/{bin,sbin,lib64}/* || true" && \
-    bash -c "rm -rf ${INSTALLDIR}/lofar/{build,src}" && \
+    mkdir -p /opt/lofar/build/${LOFAR_BUILDVARIANT} /opt/lofar/src && \
+    git clone --depth=1 --branch=${LOFAR_VERSION} https://git.astron.nl/ro/lofar.git /opt/lofar/src && \
+    cd /opt/lofar/build/${LOFAR_BUILDVARIANT} && cmake -DBUILD_PACKAGES="Pipeline MessageBus OTDB_Services" -DBUILD_TESTING=OFF -DCMAKE_INSTALL_PREFIX=/opt/lofar/ -DCASACORE_ROOT_DIR=/opt/casacore/ -DQPID_ROOT_DIR=/opt/qpid/ -DUSE_OPENMP=True /opt/lofar/src/ && \
+    cd /opt/lofar/build/${LOFAR_BUILDVARIANT} && make -j ${J} && \
+    cd /opt/lofar/build/${LOFAR_BUILDVARIANT} && make install && \
+    bash -c "mkdir -p /opt/lofar/var/{log,run}" && \
+    bash -c "chmod a+rwx  /opt/lofar/var/{log,run}" && \
+    bash -c "strip /opt/lofar/{bin,sbin,lib64}/* || true" && \
+    bash -c "rm -rf /opt/lofar/{build,src}" && \
     apt-get purge -y liblog4cplus-dev libhdf5-dev libblitz0-dev libunittest++-dev libxml++2.6-dev binutils-dev && \
     apt-get autoremove -y
 
+
+# The tag under which this image will be deployed
+ARG LOFAR_TAG=${BASE_VERSION}
+ENV LOFAR_TAG=${LOFAR_TAG}
+
 COPY ["bashrc", "/opt/"]
 COPY ["chuser.sh", "/usr/local/bin"]
 ENTRYPOINT ["/usr/local/bin/chuser.sh"]
diff --git a/Docker/lofar-pulp/bashrc b/Docker/lofar-pulp/bashrc
index 7c9e948ce7e52aefa446f3db4a7f8df05afc0d4b..ed2b2f32ddce866e3962756a7bba7a4786ecd6fe 100644
--- a/Docker/lofar-pulp/bashrc
+++ b/Docker/lofar-pulp/bashrc
@@ -1,11 +1,11 @@
 #!/bin/bash
 
 # lofar
-[ -r ${INSTALLDIR}/lofar/lofarinit.sh ] && source ${INSTALLDIR}/lofar/lofarinit.sh
+[ -r /opt/lofar/lofarinit.sh ] && source /opt/lofar/lofarinit.sh
 export PATH PYTHONPATH LD_LIBRARY_PATH LOFARROOT
 
 # qpid
-source ${INSTALLDIR}/qpid/.profile
+source /opt/qpid/.profile
 
 # lofarsoft
 source ${LOFARSOFT}/devel_common/scripts/init.sh
diff --git a/Docker/pulp-base/Dockerfile b/Docker/pulp-base/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..161eab17b40f29dcbace18dd9cdc0f0858573ff8
--- /dev/null
+++ b/Docker/pulp-base/Dockerfile
@@ -0,0 +1,524 @@
+#
+# base
+#
+#FROM ubuntu:12.04
+#FROM ubuntu:14.04
+FROM ubuntu:16.04
+
+#
+# common-environment
+#
+#ENV USER=lofar
+#ENV USER=kondratiev
+ENV USER=lofarsys
+ENV HOME="/home/${USER}"
+ENV INSTALLDIR=/usr/local
+#
+# set-uid
+#
+#ENV UID=1000
+#ENV UID=7406
+ENV UID=7149
+
+#
+#
+# environment
+#
+ENV DEBIAN_FRONTEND=noninteractive \
+    PYTHON_VERSION=2.7
+
+#
+# versions
+#
+ENV CASACORE_VERSION=2.4.0 \
+    CASAREST_VERSION=latest
+
+#    PYTHON_CASACORE_VERSION=2.1.2 \
+#    BOOST_VERSION=1.58
+
+#
+# set-build-options
+#
+ENV J=6
+
+#
+# Base and runtime dependencies
+#
+RUN apt-get update && apt-get upgrade -y
+RUN apt-get install -y apt-utils
+RUN apt-get update && apt-get upgrade -y
+RUN apt-get install -y sudo
+
+#
+# setup-account
+#
+RUN (getent group sudo &>/dev/null || groupadd sudo) && \
+    echo "useradd -m ${USERADD_FLAGS} ${USER}" && \
+    useradd -m -u ${UID} ${USER} && \
+    usermod -a -G sudo ${USER} && \
+    echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers && \
+    sed -i 's/requiretty/!requiretty/g' /etc/sudoers
+
+USER ${USER}
+
+
+#
+# *******************
+# Extra packages
+# *******************
+#
+RUN sudo apt-get update && sudo apt-get upgrade -y && \
+    sudo apt-get install -y g++ gfortran flex swig bison subversion cmake \
+                     zlib1g-dev libatlas-base-dev liblapack-dev \
+                     libncurses5-dev libfreetype6-dev libpng12-dev \
+                     python-dev python-tk python-pyfits tk8.5-dev fftw3-dev \
+                     libbz2-dev git git git-core git-doc git-man git-svn valgrind \
+                     wget vim libgtk2.0-dev aptitude tcsh apt-utils locate doxygen \
+                     libx11-dev libxt-dev libxmu-dev dh-autoreconf python-mpltoolkits.basemap \
+		     imagemagick python-pip dos2unix texlive-font-utils cvs mpich libmpich-dev libmpich12 \
+                     python-ephem python3-ephem python-h5py python3-h5py libaio-dev latex2html gv
+
+# Remove ImageMagick policy file to allow the creation of PS, PDF files
+RUN sudo rm -f /etc/ImageMagick*/policy.xml
+
+# also try python-seaborn for later ubuntu
+
+RUN pip install pyephem
+
+#
+# *******************
+#   Casacore
+# *******************
+#
+RUN sudo apt-get update && sudo apt-get install -y libreadline6 libreadline6-dev libblas-dev liblapack-dev libfftw3-dev libhdf5-dev libboost-python-dev libcfitsio3-dev wcslib-dev \
+    cmake-doc cmake-curses-gui make libgsl0-dev python-matplotlib python-sphinx python-numpy num-utils python-scipy python-sip-dev openmpi-bin openmpi-common ipython && \
+    sudo mkdir -p ${INSTALLDIR}/src/casacore/build && \
+    sudo mkdir -p ${INSTALLDIR}/src/casacore/data && \
+    cd ${INSTALLDIR}/src/casacore && sudo git clone https://github.com/casacore/casacore.git src && \
+    if [ "${CASACORE_VERSION}" != "latest" ]; then cd ${INSTALLDIR}/src/casacore/src && sudo git checkout tags/v${CASACORE_VERSION}; fi && \
+    cd ${INSTALLDIR}/src/casacore/data && sudo wget --retry-connrefused ftp://ftp.astron.nl/outgoing/Measures/WSRT_Measures.ztar && \
+    cd ${INSTALLDIR}/src/casacore/data && sudo tar xf WSRT_Measures.ztar  && sudo rm -f WSRT_Measures.ztar && \
+    cd ${INSTALLDIR}/src/casacore/build && sudo cmake -DCMAKE_INSTALL_PREFIX=${INSTALLDIR} -DDATA_DIR=${INSTALLDIR}/src/casacore/data -DBUILD_PYTHON=True -DBUILD_TESTING=False -DUSE_OPENMP=True -DUSE_FFTW3=TRUE -DUSE_HDF5=ON ../src/ && \
+    cd ${INSTALLDIR}/src/casacore/build && sudo make -j ${J} && \
+    cd ${INSTALLDIR}/src/casacore/build && sudo make install && \
+    sudo bash -c "strip ${INSTALLDIR}/{lib,bin}/* || true" && \
+    sudo bash -c "rm -rf ${INSTALLDIR}/src/casacore/{build,src}" && \
+    sudo apt-get purge -y libblas-dev liblapack-dev libfftw3-dev && \
+    sudo apt-get autoremove -y
+
+# *******************
+#   python-casacore (pyrap)
+# *******************
+#
+# sudo add-apt-repository ppa:radio-astro/main
+# sudo apt-get install -y libcasacore21-dev
+ENV PYRAP_VERSION=2.2.1
+RUN sudo apt-get install -y software-properties-common && sudo add-apt-repository -s ppa:kernsuite/kern-2 && sudo apt-add-repository multiverse && \
+    sudo apt-get update && sudo apt-get install -y python-setuptools && \
+    cd ${INSTALLDIR}/src && sudo git clone https://github.com/casacore/python-casacore && \
+    cd python-casacore && sudo git checkout tags/v$PYRAP_VERSION && sudo python ./setup.py install
+
+#
+# *******************
+#   FFTW
+# *******************
+#
+ARG FFTW_VERSION="3.3.6-pl2"
+
+RUN cd ${INSTALLDIR}/src && sudo wget --retry-connrefused http://www.fftw.org/fftw-${FFTW_VERSION}.tar.gz && \
+    sudo tar xvfz fftw-${FFTW_VERSION}.tar.gz && cd fftw-${FFTW_VERSION} && \
+    sudo ./configure --prefix=${INSTALLDIR} --enable-shared --enable-threads --enable-single  --enable-sse --enable-sse2 --enable-avx --enable-avx2 && \
+    sudo make && sudo make install && sudo make distclean && \
+    sudo ./configure --prefix=${INSTALLDIR} --enable-shared --enable-threads --enable-sse2 --enable-avx --enable-avx2 && \
+    sudo make && sudo make install && sudo make distclean && \
+    sudo ./configure --prefix=${INSTALLDIR} --enable-shared --enable-threads --enable-long-double && \
+    sudo make && sudo make install && sudo make distclean && \
+    sudo ./configure --prefix=${INSTALLDIR} --enable-shared --enable-threads --enable-quad-precision && \
+    sudo make && sudo make install && sudo make distclean
+
+#
+# *******************
+#   QT3
+# *******************
+#
+ENV QTDIR="${INSTALLDIR}/src/qt3/qt"
+ENV PATH="${QTDIR}/bin:${PATH}"
+ENV MANPATH="${QTDIR}/doc/man:${MANPATH}"
+ENV LD_LIBRARY_PATH="${QTDIR}/lib"
+
+RUN cd ${INSTALLDIR}/src && sudo mkdir -m 755 -p qt3 && cd qt3 && sudo wget --retry-connrefused -t 0 http://download.qt.io/archive/qt/3/qt-x11-free-3.3.8b.tar.gz && \
+    sudo tar xvfz qt-x11-free-3.3.8b.tar.gz && sudo mv qt-x11-free-3.3.8b qt && cd qt && \
+    sudo sed -i '2i/usr/local/src/qt3/qt/lib' /etc/ld.so.conf && sudo /sbin/ldconfig && \
+    sudo sed -i '2358i\ \ \ \ \ \ \ \ break' configure && \
+    sudo sed -i '48i#include\ <stddef.h>' src/tools/qvaluelist.h && \
+    sudo sed -i '50i#include\ <stddef.h>' src/tools/qmap.h && \
+    sudo ./configure --prefix=${INSTALLDIR}/qt3 -qt-gif -thread -stl && \
+    sudo sed -i '48i#include\ <stddef.h>' include/qvaluelist.h && \
+    sudo sed -i '50i#include\ <stddef.h>' include/qmap.h && \
+    sudo make sub-src && sudo cp -l lib/libqt* ${INSTALLDIR}/lib && sudo /sbin/ldconfig && \
+    sudo make && sudo make install
+
+ENV LD_LIBRARY_PATH="${INSTALLDIR}/qt3/lib:${LD_LIBRARY_PATH}"
+ENV PATH="${INSTALLDIR}/bin:${PATH}"
+
+#
+# *******************
+#   PGPLOT
+# *******************
+#
+RUN cd ${INSTALLDIR}/src && sudo wget --retry-connrefused ftp://ftp.astro.caltech.edu/pub/pgplot/pgplot522.tar.gz && \
+    sudo tar xvfz pgplot522.tar.gz && cd pgplot && \
+    sudo sed -i 's/! CGDRIV/CGDRIV/' drivers.list && \
+    sudo sed -i 's/! LXDRIV/LXDRIV/' drivers.list && \
+    sudo sed -i 's/! PNDRIV/PNDRIV/' drivers.list && \
+    sudo sed -i 's/! PSDRIV/PSDRIV/' drivers.list && \
+    sudo sed -i 's/! TTDRIV 5/TTDRIV 5/' drivers.list && \
+    sudo sed -i 's/! XWDRIV/XWDRIV/1' drivers.list && \
+    sudo sed -i 's/Tk_Get3DBorder\ failed:\ \%s\\n\",\ tkpg->interp->result);/Tk_Get3DBorder\ failed\\n\");/' drivers/xtk/tkpgplot.c && \
+    sudo ./makemake . linux g77_gcc && \
+    sudo sed -i 's=pndriv.o : ./png.h ./pngconf.h ./zlib.h ./zconf.h=#pndriv.o : ./png.h ./pngconf.h ./zlib.h ./zconf.h=' makefile && \
+    sudo sed -i '905i\\trm -f cpg*.o' makefile && \
+    sudo sed -i '910i\\tgcc -shared -o libcpgplot.so `ls cpg*.o | sort | uniq` $(SHARED_LIB_LIBS) -lpgplot -L./ -L/usr/lib' makefile && \
+    sudo make FCOMPL=gfortran SHARED_LIB_LIBS="-lpng -lz -lX11 -lgfortran" all cpg && \
+    sudo install -D -m644 libpgplot.a ${INSTALLDIR}/lib/libpgplot.a && \
+    sudo install -D -m755 libpgplot.so ${INSTALLDIR}/lib/libpgplot.so && \
+    sudo install -D -m644 grfont.dat  ${INSTALLDIR}/lib/grfont.dat && \
+    sudo install -D -m644 rgb.txt ${INSTALLDIR}/lib/rgb.txt && \
+    sudo install -D -m755 pgxwin_server ${INSTALLDIR}/bin/pgxwin_server && \
+    sudo install -D -m644 libcpgplot.a ${INSTALLDIR}/lib/libcpgplot.a && \
+    sudo install -D -m644 libcpgplot.so ${INSTALLDIR}/lib/libcpgplot.so && \
+    sudo install -D -m644 cpgplot.h ${INSTALLDIR}/include/cpgplot.h
+
+# Setting PGPLOT env variables
+ENV PGPLOT_DIR="${INSTALLDIR}/lib"
+ENV PGPLOT_DEV="/xwindow"
+ENV PGPLOT_TYPE="cps"
+ENV PGPLOT_FONT="${PGPLOT_DIR}/grfont.dat"
+ENV LD_LIBRARY_PATH="${INSTALLDIR}/lib:/usr/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH}"
+
+#
+# *******************
+#   PGPLOT Python bindings
+# *******************
+#
+RUN cd ${INSTALLDIR}/src && sudo git clone https://github.com/npat-efault/ppgplot && cd ppgplot && \
+    sudo python setup.py install --prefix=${INSTALLDIR}
+ENV PYTHONPATH="${INSTALLDIR}/bin:${INSTALLDIR}/lib/python2.7/site-packages/:${INSTALLDIR}/lib/python2.7/dist-packages/"
+
+#
+# *******************
+#   TEMPO
+# *******************
+#
+RUN cd ${INSTALLDIR}/src && sudo git clone git://git.code.sf.net/p/tempo/tempo && cd tempo && sudo chmod go+w obsys.dat && \
+    sudo chmod go-w obsys.dat && sudo ./prepare && sudo ./configure --prefix=${INSTALLDIR} && sudo make && sudo make install
+
+ENV TEMPO="${INSTALLDIR}/src/tempo"
+
+#
+# *******************
+#   TEMPO2
+# *******************
+#
+RUN cd ${INSTALLDIR}/src && sudo git clone https://bitbucket.org/psrsoft/tempo2.git && cd tempo2 && sudo ./bootstrap && \
+    sudo cp -r T2runtime ${INSTALLDIR}/share/tempo2/
+ENV TEMPO2="${INSTALLDIR}/share/tempo2/"
+RUN cd ${INSTALLDIR}/src/tempo2 && sudo TEMPO2=${TEMPO2} ./configure --prefix=/usr/local && sudo make && sudo make install && \
+    sudo make plugins && sudo make plugins-install
+
+#
+# *******************
+#   PSRCAT
+# *******************
+#
+RUN cd ${INSTALLDIR}/src && sudo wget --retry-connrefused http://www.atnf.csiro.au/people/pulsar/psrcat/downloads/psrcat_pkg.tar.gz && \
+    sudo tar xvfz psrcat_pkg.tar.gz && cd psrcat_tar && sudo ./makeit && cd ${INSTALLDIR}/lib && \
+    sudo ln -sf ${INSTALLDIR}/src/psrcat_tar/libpsrcat.a . && cd ${INSTALLDIR}/bin && \
+    sudo ln -sf ${INSTALLDIR}/src/psrcat_tar/psrcat . && sudo ln -sf ${INSTALLDIR}/src/psrcat_tar/psrcat.db . && \
+    sudo ln -sf ${INSTALLDIR}/src/psrcat_tar/glitch.db .
+ENV PSRCAT_FILE="${INSTALLDIR}/bin/psrcat.db"
+
+#
+# *******************
+#   SIGPROC
+# *******************
+#
+ENV OSTYPE=linux
+ARG customcfg="makefile.${OSTYPE}"
+RUN cd ${INSTALLDIR}/src && \
+    sudo wget -O sigproc-4.3.tar.gz --retry-connrefused "http://downloads.sourceforge.net/project/sigproc/sigproc/4.3/sigproc-4.3.tar.gz?r=http%3A%2F%2Fsigproc.sourceforge.net%2F&amp;ts=1483801820&amp;use_mirror=freefr" && \
+    sudo tar xvfz sigproc-4.3.tar.gz && sudo chown -R root:root sigproc-4.3 && sudo chmod -R og+w sigproc-4.3 && cd sigproc-4.3 && \
+    sudo sed -i 's/$<//' configure && sudo ./configure && \
+    sudo sed -i 's/-L\/usr\/X11R6\/lib/-L\/usr\/lib\/x86_64-linux-gnu\//' ${customcfg} && \
+    sudo sed -i '9iLFITS = -L/usr/lib -lcfitsio' ${customcfg} && \
+    sudo sed -i '10iLFFTW = -L/usr/local/lib/ -lfftw3 -lfftw3f' ${customcfg} && \
+    sudo sed -i '11iFC = gfortran -ffixed-line-length-none' ${customcfg} && \
+    sudo sed -i "265s/DB\\\\'s/DBs/" dosearch.f && \
+    sudo sed -i '452s/export\ :/export:/' makefile && \
+    sudo sed -i 's/$(OSTYPE)/linux/' makefile && \
+    sudo sed -i 's/ar\ rv/ar\ rvU/' makefile && \
+    sudo sed -i 's/$(LPGPLOT)/-L\/usr\/local\/lib\ -lpgplot\ -lcpgplot\ -L\/usr\/lib\/x86_64-linux-gnu\/\ -lX11/' makefile && \
+    sudo sed -i 's/$(LFITS)/-L\/usr\/lib\ -lcfitsio/' makefile && \
+    sudo sed -i 's/$(LFFTW)/-L\/usr\/local\/lib\/\ -lfftw3\ -lfftw3f/' makefile && \
+    sudo make && sudo make quickplot && sudo make extract && sudo make gmrt2fil && \
+    sudo make flatten && sudo make clip && sudo make downsample && sudo make readchunk && \
+    sudo make splitter && sudo make snrdm && sudo make dice && sudo make depolyco && \
+    sudo make brute && sudo make tree && sudo make pgplotter && sudo make sumfft && \
+    sudo make peak && sudo make ffa && sudo make spec && sudo make makedummy && \
+    sudo cp libsigproc_linux.a ${INSTALLDIR}/lib
+ENV SIGPROC="${INSTALLDIR}/src/sigproc-4.3"
+
+#
+# *******************
+#   PRESTO
+# *******************
+#
+# PRESTO version ~v2.1-2.2. What happened to be used in LOFAR when we stopped building pulp in 2018.
+ENV PRESTO_VERSION=e90b8148f813c151f588f5f94b81b606964b03a8
+ENV PRESTO="${INSTALLDIR}/src/presto"
+RUN cd ${INSTALLDIR}/src && sudo git clone git://github.com/scottransom/presto.git && \
+    cd presto && sudo git checkout $PRESTO_VERSION && \
+    cd src && sudo make PRESTO=${PRESTO} makewisdom
+RUN cd ${PRESTO}/src && sudo make PRESTO=${PRESTO} prep && \
+    sudo make PRESTO=${PRESTO} LD_LIBRARY_PATH=${PRESTO}/lib PGPLOT_DIR=${PGPLOT_DIR} && \
+    sudo make PRESTO=${PRESTO} mpi && cd ../python && \
+    sudo PRESTO=${PRESTO} PGPLOT_DIR=${PGPLOT_DIR} PYTHONPATH="${PRESTO}/lib/python:${PRESTO}/python" LD_LIBRARY_PATH="${INSTALLDIR}/lib:${PRESTO}/lib" make
+
+#
+# *******************
+#   PSRDADA
+# *******************
+#
+RUN cd ${INSTALLDIR}/src && sudo git clone git://git.code.sf.net/p/psrdada/code psrdada && \
+    cd psrdada && sudo sed -i 's/mopsr\ //' Makefile.am && sudo ./bootstrap && \
+    sudo ./configure --prefix=${INSTALLDIR} --enable-shared --with-x && sudo make && sudo make install
+
+# dummy variable to indicate from which line to rebuild the image
+ENV START_REBUILD_FROM_HERE="27032018"
+#
+# *******************
+#   EPSIC
+# *******************
+# Required by PSRCHIVE since ~2019.
+RUN cd ${INSTALLDIR}/src && sudo git clone https://github.com/straten/epsic.git && cd epsic && \
+    cd src && sudo ./bootstrap && sudo ./configure && sudo make && sudo make install
+
+#
+# *******************
+#   PSRCHIVE
+# *******************
+#
+# sed here is necessary because QT3 configure test is not passed (don't know why)
+# also psrgui's compilation fails, so I turned it off as well
+#
+# We should at least be able to upgrade to ca12b4a2 (~2019), but that doesn't cleanly compile. Later versions are bugged, for which a fix is still pending. The bug has to do with adding archives that have not-identical number of subints which should still work with "-m time" option. Instead psradd just overrides already created output file, so you are left with the output file with smaller number of subbands. I would suggest to use the PSRCHIVE version from ~2 years ago. I know that git commit from Jun 25, 2019 works (commit ca12b4a279f3d4adcca223508116d9d270df8cc6), but maybe some later ones should work as well.
+#
+# Last version used in prod before migrating to gitlab in 2021-06
+ENV PSRCHIVE_VERSION=2de7983282ebc6d49ba881a7288d9c3081d22386
+RUN cd ${INSTALLDIR}/src && sudo git clone git://git.code.sf.net/p/psrchive/code psrchive && cd psrchive && \
+    sudo git checkout $PSRCHIVE_VERSION && \
+    sudo sed -i '338i\ \ \ \ \ \ have_qt="yes"' config/bnv_have_qt.m4 && \
+    sudo sed -i 's/SUBDIRS\ +=\ psrgui/#SUBDIRS\ +=\ psrgui/' More/Makefile.am && sudo ./bootstrap && \
+    sudo ./configure --prefix=/usr/local --enable-shared --with-x --with-psrcat=psrcat --with-Qt-include-dir=/usr/local/qt3/include \
+       --with-Qt-bin-dir=/usr/local/qt3/bin --with-Qt-lib-dir=/usr/local/qt3/lib --with-Qt-lib=qt-mt && \
+    sudo make && sudo make install
+ENV PSRCHIVE="${INSTALLDIR}"
+
+#
+# *******************
+#   mark5access library
+# *******************
+#
+RUN cd ${INSTALLDIR}/src && sudo git clone https://github.com/demorest/mark5access && cd mark5access && \
+    sudo aclocal && sudo libtoolize --copy --force && sudo autoconf && sudo autoheader && sudo automake -a -c && \
+    sudo ./configure --prefix=${INSTALLDIR} && sudo make && sudo make install
+
+#
+# *******************
+#   DAL
+# *******************
+#
+RUN cd ${INSTALLDIR}/src && sudo git clone https://git.astron.nl/ro/dal2.git DAL && \
+    cd DAL && sudo mkdir build && cd build && sudo cmake -DCMAKE_INSTALL_PREFIX=${INSTALLDIR} .. && \
+    sudo make && sudo make install
+
+#
+# *******************
+#   DSPSR
+# *******************
+#
+# backends removed: fadc puma
+#
+ENV DSPSR_VERSION=3c3a531c821370abb4836231807124e162708536
+RUN cd ${INSTALLDIR}/src && sudo git clone git://git.code.sf.net/p/dspsr/code dspsr && sudo chmod go+w dspsr && cd dspsr && \
+    sudo git checkout $DSPSR_VERSION && \
+    sudo ./bootstrap && sudo sed -i 's/AR_FLAGS=cru/AR_FLAGS=cruU/' config/libtool.m4 && \
+    sudo sed -i 's/-lhdf5/-lhdf5_serial/' Kernel/Formats/lofar_dal/Makefile.am && \
+    sudo echo "apsr asp bcpm bpsr caspsr cpsr cpsr2 dada dummy fits gmrt guppi kat lbadr lbadr64 lofar_dal lump lwa mark4 mark5 mark5b maxim mwa pdev pmdaq puma2 s2 sigproc ska1 spda1k spigot vdif wapp" > backends.list && \
+    sudo CPPFLAGS=-I/usr/include/hdf5/serial LIBS="-lpsrdada -lhdf5_serial -lcpgplot" LDFLAGS="-L/usr/local/lib -L/usr/lib/x86_64-linux-gnu" ./configure --prefix=${INSTALLDIR} --enable-shared --with-x && \
+    sudo make && sudo make install
+ENV DSPSR="${INSTALLDIR}/src/dspsr"
+
+#
+# *******************
+#   COAST_GUARD
+# *******************
+#
+RUN cd ${INSTALLDIR}/src && sudo git clone https://github.com/plazar/coast_guard
+ENV COASTGUARD_CFG="${INSTALLDIR}/src/coast_guard/configurations"
+
+#
+# *******************
+#   PSRFITS_UTILS
+# *******************
+#
+RUN cd ${INSTALLDIR}/src && sudo git clone https://github.com/demorest/psrfits_utils && \
+    cd psrfits_utils && sudo sed -i 's/-Werror\ //' configure.ac && \
+    sudo ./prepare && sudo ./configure --prefix=${INSTALLDIR} && sudo make && sudo make install
+
+#
+# *******************
+#   SEE
+# *******************
+#
+RUN cd ${INSTALLDIR}/src && sudo git clone https://github.com/vkond/see && cd see && sudo make && \
+    sudo cp see ${INSTALLDIR}/bin
+
+#
+# *******************
+#   mscorpol
+# *******************
+#
+RUN cd ${INSTALLDIR}/src && sudo git clone https://github.com/2baOrNot2ba/mscorpol && cd ${INSTALLDIR}/src && \
+    sudo chown -R root:root mscorpol && sudo chmod -R g+w mscorpol && \
+    cd mscorpol/lofar_element_response && sudo make && \
+    cd ../mscorpol && sudo sed -i '1s/AntennaFieldDirectory/#AntennaFieldDirectory/' parseAntennaField.py && \
+    antenna_field_dir="${INSTALLDIR}/etc/StaticMetaData/AntennaFields/" && \
+    sudo sed -i "2iAntennaFieldDirectory=\"$antenna_field_dir\"" parseAntennaField.py && \
+    sudo sed -i "13s|\.\.|$INSTALLDIR\/src\/mscorpol|" ${INSTALLDIR}/src/mscorpol/mscorpol/HamakerJones.py
+ENV MSCORPOL="${INSTALLDIR}/src/mscorpol"
+
+#
+# *******************
+#   lofar_lta
+# *******************
+#
+RUN cd ${INSTALLDIR}/src && sudo wget http://www.astro-wise.org/losoft/lofar_lta-2.6.0.tar.gz && \
+    sudo tar xvfz lofar_lta-2.6.0.tar.gz && cd lofar_lta-2.6.0 && \
+    sudo python setup.py install_oracle --prefix=${INSTALLDIR} && \
+    sudo python setup.py install --prefix=${INSTALLDIR}
+
+#
+# *******************
+#   LOFAR-BF-pulsar-scripts
+# *******************
+#
+RUN cd ${INSTALLDIR}/src && sudo git clone https://github.com/vkond/LOFAR-BF-pulsar-scripts && \
+    cd LOFAR-BF-pulsar-scripts && \
+    sudo cp subdyn.py ${INSTALLDIR}/bin && \
+    cd FE-map && \
+    sudo sed -i '28s/stations_file/#stations_file/' lofar_status_map.py && \
+    statdir=`pwd` && sudo sed -i "29istations_file=\"$statdir/stations.txt\"" lofar_status_map.py && \
+    cd ../fluxcal && flaggeddir=`pwd` && sudo sed -i "s|\/home\/astron\/kondratiev\/pulsar\/etc\/flagged-antennas-tom-hassall|$flaggeddir|g" lofar_fluxcal.py && \
+    sudo sed -i "s|\/home\/astron\/kondratiev\/pulsar\/etc\/flagged-antennas-tom-hassall|$flaggeddir|g" lofar_psrflux.py && \
+    sudo sed -i "s|\/home\/astron\/kondratiev\/pulsar\/etc\/flagged-antennas-tom-hassall|$flaggeddir|g" lofar_fluxcal.py.orig && \
+    sudo sed -i "s|\/home\/astron\/kondratiev\/pulsar\/etc\/flagged-antennas-tom-hassall|$flaggeddir|g" lofar_psrflux.py.orig && \
+    sudo sed -i "71s|%s\/release\/share\/pulsar\/data|$flaggeddir|" lofar_gain.py && \
+    cd ../scheduling && scheddir="${INSTALLDIR}/etc/xml-templates" && sudo sed -i "37s|%s\/release\/share\/pulsar\/data\/templates|$scheddir|"  bfscheduler.py && \
+    cd ../LTA && sudo cp Environment.cfg ${HOME}/.awe/
+
+#
+# *******************
+#   PULP
+# *******************
+#
+RUN cd ${INSTALLDIR}/src && sudo git clone https://git.astron.nl/ro/pulp.git
+ENV PULP="${INSTALLDIR}/src/pulp"
+
+#
+# I need this repository to copy some necessary scripts, Pulp, 2bf2fits, etc
+#
+#ARG LOFARSOFT="${INSTALLDIR}/src/lofarsoft"
+ENV LOFARSOFT="/opt/lofarsoft"
+RUN sudo mkdir -p ${LOFARSOFT} && cd ${LOFARSOFT} && sudo svn co http://usg.lofar.org/svn/code/trunk .
+# installing 2bf2fits & bf2puma2 (just in case)
+RUN cd ${LOFARSOFT}/src/Pulsar/apps && sudo rsync -avxP bf2format ${INSTALLDIR}/src/ && \
+    cd ${INSTALLDIR}/src/bf2format && \
+    sudo gcc  -DDEBUGGING_MESSAGES -DHAVE_CFITSIO -DHAVE_GLIB -DHAVE_PGPLOT -DHAVE_MPI -DHAVE_FFTW3 -O2 -I${INSTALLDIR}/include -o 2bf2fits.o -c 2bf2fits.c && \
+    sudo gcc  -O2 2bf2fits.o  -o 2bf2fits -rdynamic -lm -lcfitsio && \
+    sudo cp 2bf2fits ${INSTALLDIR}/bin && \
+    sudo g++ bf2puma2.cpp -o bf2puma2 && \
+    sudo cp bf2puma2 ${INSTALLDIR}/bin
+# copying XML templates to /usr/local/etc/xml-templates,
+# making the link to StaticMetaData in USG trunck in our /usr/local/etc
+RUN cd ${INSTALLDIR}/etc && sudo mkdir xml-templates && sudo ln -sf ${LOFARSOFT}/data/lofar/StaticMetaData StaticMetaData && \
+    cd xml-templates && sudo rsync -avxP ${LOFARSOFT}/src/Pulsar/scripts/XML-MOM/ .
+# installing modified version of Sigproc's splice (to be called sigproc_splice)
+RUN cd ${INSTALLDIR}/src && sudo mkdir sigproc_splice && cd sigproc_splice && sudo cp ${LOFARSOFT}/src/Pulsar/apps/sigproc-4.3/splice.c . && \
+    sudo gcc -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I${INSTALLDIR}/src/sigproc-4.3  splice.c -o sigproc_splice -lm -lsigproc_linux && \
+    sudo cp sigproc_splice ${INSTALLDIR}/bin
+# copy some of the scripts that are needed for Pulp
+RUN cd ${INSTALLDIR}/bin && sudo cp ${LOFARSOFT}/src/Pulsar/scripts/digitize.py . && \
+    sudo cp ${LOFARSOFT}/src/Pulsar/scripts/plot_LOFAR_TA_multibeam3.py . && \
+    sudo cp ${LOFARSOFT}/src/Pulsar/scripts/RRAT_heatmap2.py . && \
+    sudo cp ${LOFARSOFT}/src/Pulsar/scripts/fix_fits_coordinates.py . && \
+    sudo cp ${LOFARSOFT}/src/Pulsar/scripts/spectar.py . && \
+    sudo cp ${LOFARSOFT}/src/Pulsar/scripts/single_pulse_search_lotaas.py . && \
+    cd ../etc && sudo cp ${LOFARSOFT}/src/Pulsar/scripts/header.puma2 . && \
+    sudo cp ${LOFARSOFT}/src/Pulsar/scripts/lofar_default.inf . && \
+    sudo rm -rf ${LOFARSOFT}/src/Pulsar/apps && sudo rm -rf ${LOFARSOFT}/src/Pulsar/external
+
+#
+# ***********************
+#  Updating psrchive.cfg
+# ***********************
+#
+# running psrchive_config and put the config file to /usr/local/etc/psrchive.cfg
+# and making necessary changes, such as
+# FrequencyAppend::weight change from 'radiometer' to 'none'
+# FrequencyAppend::force_new_predictor from 0 to 1
+# Other necessary parameters seem now to have good values by default, i.e.
+# Dispersion::barycentric_correction = 1
+# WeightedFrequency::round_to_kHz = 0
+# Predictor::default = tempo2
+# Predictor::policy = default
+ENV PSRCHIVE_CONFIG="${INSTALLDIR}/etc/psrchive.cfg"
+#RUN sudo mkdir -p ${INSTALLDIR}/etc  && cd ${INSTALLDIR}/etc && sudo touch psrchive.cfg && sudo chown root:root psrchive.cfg && \
+#    sudo chmod og+w psrchive.cfg && sudo -E ${INSTALLDIR}/bin/psrchive_config > psrchive.cfg && \
+#    sudo sed -i 's/#\ FrequencyAppend::force_new_predictor\ =\ 0/FrequencyAppend::force_new_predictor\ =\ 1/' psrchive.cfg && \
+#    sudo sed -i 's/FrequencyAppend::weight\ =\ radiometer/FrequencyAppend::weight\ =\ none/' psrchive.cfg
+RUN sudo mkdir -p ${INSTALLDIR}/etc  && cd ${INSTALLDIR}/etc && sudo touch psrchive.cfg && sudo chown root:root psrchive.cfg && \
+    sudo chmod og+w psrchive.cfg && sudo LD_LIBRARY_PATH=${LD_LIBRARY_PATH} ${INSTALLDIR}/bin/psrchive_config > psrchive.cfg && \
+    sudo sed -i 's/^Dispersion::barycentric_correction/#Dispersion::barycentric_correction/' psrchive.cfg && \
+    sudo sed -i '/^#.*Dispersion::barycentric_correction\ =/a Dispersion::barycentric_correction\ =\ 1' psrchive.cfg && \
+    sudo sed -i 's/^WeightedFrequency::round_to_kHz/#WeightedFrequency::round_to_kHz/' psrchive.cfg && \
+    sudo sed -i '/^#.*WeightedFrequency::round_to_kHz\ =/a WeightedFrequency::round_to_kHz\ =\ 0' psrchive.cfg && \
+    sudo sed -i 's/^Predictor::default/#Predictor::default/' psrchive.cfg && \
+    sudo sed -i '/^#.*Predictor::default\ =/a Predictor::default\ =\ tempo2' psrchive.cfg && \
+    sudo sed -i 's/^Predictor::policy/#Predictor::policy/' psrchive.cfg && \
+    sudo sed -i '/^#.*Predictor::policy\ =/a Predictor::policy\ =\ default' psrchive.cfg && \
+    sudo sed -i 's/^FrequencyAppend::weight/#FrequencyAppend::weight/' psrchive.cfg && \
+    sudo sed -i '/^#.*FrequencyAppend::weight\ =/a FrequencyAppend::weight\ =\ none' psrchive.cfg && \
+    sudo sed -i 's/^FrequencyAppend::force_new_predictor/#FrequencyAppend::force_new_predictor/' psrchive.cfg && \
+    sudo sed -i '/^#.*FrequencyAppend::force_new_predictor\ =/a FrequencyAppend::force_new_predictor\ =\ 1' psrchive.cfg
+
+ENV PYTHONPATH="./:${PRESTO}/lib/python:${PRESTO}/python:${INSTALLDIR}/bin:${INSTALLDIR}/src:${INSTALLDIR}/lib/python2.7/site-packages/:${INSTALLDIR}/lib/python2.7/dist-packages/:${INSTALLDIR}/src/coast_guard:${INSTALLDIR}/bin/lofar_antenna_state:${INSTALLDIR}/src/LOFAR-BF-pulsar-scripts/fluxcal:${MSCORPOL}/mscorpol:${PULP}"
+ENV LD_LIBRARY_PATH="${PGPLOT_DIR}:${PRESTO}/lib:${PRESTO}/lib/python:${INSTALLDIR}/lib:/usr/lib:${SIGPROC}:${TEMPO2}/lib:${INSTALLDIR}/lib64:${INSTALLDIR}/lib/instantclient_11_2:${INSTALLDIR}/src/dedisp-multi/lib:${INSTALLDIR}/src/dedisp/lib"
+ENV PATH=".:${HOME}:${HOME}/bin:${INSTALLDIR}/bin:/opt/bin:${PRESTO}/bin:${SIGPROC}:${TEMPO}/src:${PGPLOT_DIR}:${TEMPO2}/bin:${SIGPROC}:${INSTALLDIR}/src/coast_guard:${INSTALLDIR}/bin/lofar_antenna_state:${INSTALLDIR}/src/LOFAR-BF-pulsar-scripts:${INSTALLDIR}/src/LOFAR-BF-pulsar-scripts/simple-sh-scripts:${INSTALLDIR}/src/LOFAR-BF-pulsar-scripts/scheduling:${INSTALLDIR}/src/LOFAR-BF-pulsar-scripts/fluxcal:${INSTALLDIR}/src/LOFAR-BF-pulsar-scripts/LTA:${INSTALLDIR}/src/LOFAR-BF-pulsar-scripts/FE-map:${MSCORPOL}/mscorpol:${MSCORPOL}/lofar_element_response:${PULP}:${PATH}"
+
+RUN sudo updatedb
+
+#
+# config
+#
+COPY bashrc ${HOME}/.bashrc
+COPY psr.bashrc ${HOME}/.psr.bashrc
+COPY dir_colors ${HOME}/.dir_colors
+COPY bashrc psr.bashrc dir_colors ${INSTALLDIR}/etc/
+
+#
+# entry
+#
+COPY chuser.sh /usr/local/bin/chuser.sh
+WORKDIR ${HOME}
+ENTRYPOINT ["sudo","-E","/usr/local/bin/chuser.sh"]
diff --git a/Docker/pulp-base/bashrc b/Docker/pulp-base/bashrc
new file mode 100644
index 0000000000000000000000000000000000000000..4a97106c0d463affd5a2eb3415dbd53c4e953823
--- /dev/null
+++ b/Docker/pulp-base/bashrc
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+# Source global definitions
+if [ -f /etc/bashrc ]; then
+        . /etc/bashrc
+fi
+
+#
+alias xv='display -flatten -background white'
+alias gva='gv -antialias'
+alias vi='vim'
+
+export PSRHOME="/usr/local"
+
+if [ -f ${PSRHOME}/etc/dir_colors ]; then
+ eval `dircolors -b ${PSRHOME}/etc/dir_colors`
+fi
+
+if [ -f ${HOME}/.dir_colors ]; then
+ eval `dircolors -b ${HOME}/.dir_colors`
+fi
+
+alias ssh='ssh -XY'
+alias ls='ls -F --color'
+PS1="[\[\033[36m\]\u\[\033[0m\]@\[\033[34m\]\h \[\033[0m\]\w]# "
+
+# pulsar software definitions
+if [ -f ${PSRHOME}/etc/psr.bashrc ]; then
+        source ${PSRHOME}/etc/psr.bashrc
+fi
+
+# pulsar software definitions
+if [ -f ${HOME}/.psr.bashrc ]; then
+        source ${HOME}/.psr.bashrc
+fi
diff --git a/Docker/pulp-base/chuser.sh b/Docker/pulp-base/chuser.sh
new file mode 100755
index 0000000000000000000000000000000000000000..eb8b7d567a86b40b2242d8f318daa91fd54a2858
--- /dev/null
+++ b/Docker/pulp-base/chuser.sh
@@ -0,0 +1,30 @@
+#!/usr/bin/env bash
+
+# Correct UID
+export UID=`id -u`
+
+# Configure user
+if [ -z "${USER}" ]; then
+  export USER=${UID}
+fi
+
+# Create home directory
+if [ -z "${HOME}" ]; then
+  export HOME=/home/${USER}
+  mkdir -p $HOME && cd $HOME
+fi
+
+# Add user to system
+fgrep -q ":x:${UID}:" /etc/passwd || echo "${USER}:x:${UID}:${UID}::${HOME}:/bin/bash" >> /etc/passwd
+fgrep -q ":x:${UID}:" /etc/group  || echo "${USER}:x:${UID}:" >> /etc/group
+
+# Set the environment
+#[ -e /opt/bashrc ] && source /opt/bashrc
+[ -e /usr/local/etc/bashrc ] && source /usr/local/etc/bashrc
+
+# Run the requested command
+if [ -z "$*" ]; then
+  exec /bin/bash
+else
+  exec "$@"
+fi
diff --git a/Docker/pulp-base/dir_colors b/Docker/pulp-base/dir_colors
new file mode 100644
index 0000000000000000000000000000000000000000..1668056d4219caf5fd5d6756482b0f5b90bb8b1b
--- /dev/null
+++ b/Docker/pulp-base/dir_colors
@@ -0,0 +1,84 @@
+# Configuration file for the color ls utility
+# This file goes in the /etc directory, and must be world readable.
+# You can copy this file to .dir_colors in your $HOME directory to override
+# the system defaults.
+
+# COLOR needs one of these arguments: 'tty' colorizes output to ttys, but not
+# pipes. 'all' adds color characters to all output. 'none' shuts colorization
+# off.
+COLOR tty
+
+# Below, there should be one TERM entry for each termtype that is colorizable
+TERM linux
+TERM console
+TERM con132x25
+TERM con132x30
+TERM con132x43
+TERM con132x60
+TERM con80x25
+TERM con80x28
+TERM con80x30
+TERM con80x43
+TERM con80x50
+TERM con80x60
+TERM xterm
+TERM vt100
+
+# EIGHTBIT, followed by '1' for on, '0' for off. (8-bit output)
+EIGHTBIT 1
+
+# Below are the color init strings for the basic file types. A color init
+# string consists of one or more of the following numeric codes:
+# Attribute codes: 
+# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
+# Text color codes:
+# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
+# Background color codes:
+# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
+NORMAL 00	# global default, although everything should be something.
+FILE 00 	# normal file
+DIR 01;34 	# directory
+LINK 01;36 	# symbolic link
+FIFO 40;33	# pipe
+SOCK 01;35	# socket
+BLK 40;33;01	# block device driver
+CHR 40;33;01 	# character device driver
+ORPHAN 01;05;37;41  # orphaned syminks
+MISSING 01;05;37;41 # ... and the files they point to
+
+# This is for files with execute permission:
+EXEC 00;32 
+
+# List any file extensions like '.gz' or '.tar' that you would like ls
+# to colorize below. Put the extension, a space, and the color init string.
+# (and any comments you want to add after a '#')
+.cmd 01;32 # executables (bright green)
+.exe 01;32
+.com 01;32
+.btm 01;32
+.bat 01;32
+.tar 01;31 # archives or compressed (bright red)
+.tgz 01;31
+.arj 01;31
+.taz 01;31
+.lzh 01;31
+.zip 01;31
+.z   01;31
+.Z   01;31
+.gz  01;31
+.bz2 01;31
+.jpg 01;35 # image formats
+.gif 01;35
+.bmp 01;35
+.xbm 01;35
+.xpm 01;35
+.h   00;33
+.hpp 00;33
+.c   00;33
+.cpp 00;33
+.o   08;30
+.dvi 00;33
+.ps  00;35
+.pdf 00;35
+.aux 08;30
+.log 00;33
diff --git a/Docker/pulp-base/psr.bashrc b/Docker/pulp-base/psr.bashrc
new file mode 100644
index 0000000000000000000000000000000000000000..92022d80dcf36bbb256caf8e9fa18e4e27aa8727
--- /dev/null
+++ b/Docker/pulp-base/psr.bashrc
@@ -0,0 +1,40 @@
+
+#
+# PULSAR ENV VARIABLES
+#
+export OSTYPE=linux
+export PSRHOME="/usr/local"
+
+export QTDIR="${PSRHOME}/src/qt3/qt"
+export MANPATH="${QTDIR}/doc/man:${MANPATH}"
+export LD_LIBRARY_PATH="${QTDIR}/lib:${PSRHOME}/qt3/lib:${LD_LIBRARY_PATH}"
+export PATH="${QTDIR}/bin:${PSRHOME}/bin:${PATH}"
+
+#
+# Pgplot
+# 
+export PGPLOT_DIR="${PSRHOME}/lib"
+export PGPLOT_FONT="${PGPLOT_DIR}/grfont.dat"
+#export PGPLOT_BACKGROUND="white"
+export PGPLOT_DEV="/xwindow"
+export PGPLOT_TYPE="cps"
+
+export PSRCAT_FILE="${PSRHOME}/bin/psrcat.db"
+export TEMPO="${PSRHOME}/src/tempo"
+export TEMPO2="${PSRHOME}/share/tempo2/"
+export PSRCHIVE="${PSRHOME}/src/psrchive"
+export DSPSR="${PSRHOME}/src/dspsr"
+export COASTGUARD_CFG="${PSRHOME}/src/coast_guard/configurations"
+export SIGPROC="${PSRHOME}/src/sigproc-4.3"
+export PRESTO="${PSRHOME}/src/presto"
+export PSRCHIVE_CONFIG="${PSRHOME}/etc/psrchive.cfg"
+export LOFAR_BF_PULSAR_SCRIPTS="${PSRHOME}/src/LOFAR-BF-pulsar-scripts"
+export MSCORPOL="${PSRHOME}/src/mscorpol"
+export PULP="${PSRHOME}/src/pulp"
+
+#
+# update PATH, LD_LIBRARY_PATH and PYTHONPATH
+#
+export PATH=".:${HOME}:${HOME}/bin:${PSRHOME}/bin:${SIGPROC}:${PRESTO}/bin:${TEMPO}/src:${TEMPO2}/bin:${PSRCHIVE}/bin:${PSRHOME}/src/coast_guard:${PSRHOME}/bin/lofar_antenna_state:${LOFAR_BF_PULSAR_SCRIPTS}:${LOFAR_BF_PULSAR_SCRIPTS}/simple-sh-scripts:${LOFAR_BF_PULSAR_SCRIPTS}/scheduling:${LOFAR_BF_PULSAR_SCRIPTS}/fluxcal:${LOFAR_BF_PULSAR_SCRIPTS}/LTA:${LOFAR_BF_PULSAR_SCRIPTS}/FE-map:${MSCORPOL}/mscorpol:${MSCORPOL}/lofar_element_response:${PULP}:${PATH}"
+export LD_LIBRARY_PATH="${PGPLOT_DIR}:${PSRHOME}/lib:/usr/lib/x86_64-linux-gnu:${PSRHOME}/lib64:${PSRCHIVE}/lib:${PRESTO}/lib:${PRESTO}/lib/python:${SIGPROC}:${TEMPO2}/lib:${PSRHOME}/lib/instantclient_11_2:${PSRHOME}/src/dedisp/lib:${PSRHOME}/src/dedisp-multi/lib:${PSRHOME}/lib64/python2.7/site-packages/:${PSRHOME}/lib/python2.7/site-packages"
+export PYTHONPATH="./:${PSRHOME}/bin:${PSRHOME}/src:${PRESTO}/lib/python:${PRESTO}/lib64/python:${PRESTO}/python:${PSRHOME}/lib/python2.7/site-packages/:${PSRHOME}/lib64/python2.7/site-packages/:${PSRHOME}/lib/python2.7/dist-packages/:${PSRHOME}/src/coast_guard:${PSRHOME}/bin/lofar_antenna_state:${LOFAR_BF_PULSAR_SCRIPTS}/fluxcal:${MSCORPOL}/mscorpol:${PULP}"
diff --git a/LCS/PyCommon/json_utils.py b/LCS/PyCommon/json_utils.py
index f589c044604c77aaf4afcb443dcd3c7ebf16fceb..d7c6befa21a1a4118a4ff6d9b8692cd5f1612e53 100644
--- a/LCS/PyCommon/json_utils.py
+++ b/LCS/PyCommon/json_utils.py
@@ -22,6 +22,7 @@ import jsonschema
 from copy import deepcopy
 import requests
 from datetime import datetime, timedelta
+from lofar.common.util import dict_with_overrides
 
 DEFAULT_MAX_SCHEMA_CACHE_AGE = timedelta(minutes=1)
 
@@ -123,7 +124,7 @@ def add_defaults_to_json_object_for_schema(json_object: dict, schema: str, cache
         copy_of_json_object['$schema'] = schema['$id']
 
     # resolve $refs to fill in defaults for those, too
-    schema = resolved_refs(schema, cache=cache, max_cache_age=max_cache_age)
+    schema = resolved_remote_refs(schema, cache=cache, max_cache_age=max_cache_age)
 
     # run validator, which populates the properties with defaults.
     get_validator_for_schema(schema, add_defaults=True).validate(copy_of_json_object)
@@ -157,23 +158,22 @@ def replace_host_in_urls(schema, new_base_url: str, keys=['$id', '$ref', '$schem
 
     return schema
 
-def resolve_path(schema, reference: str):
+def get_sub_schema(schema: dict, reference: str):
     '''resolve a JSON reference (f.e. /definitions/foo) in the schema and return the corresponding subschema.'''
-    
-    parts = reference.strip('/').split('/')
-    subschema = schema
+    parts = reference.lstrip('#').strip('/').split('/')
 
     if parts == ['']:
         # reference to root
         return schema
 
     try:
+        subschema = schema
         for part in parts:
             subschema = subschema[part]
+        return subschema
     except KeyError as e:
         raise KeyError("Could not resolve path %s in schema %s" % (reference, schema)) from e
 
-    return subschema
 
 def _fetch_url(url: str) -> str:
     '''try to obtain the provided URL.'''
@@ -189,8 +189,22 @@ def _fetch_url(url: str) -> str:
 
     raise Exception("Could not get: %s" % (url,))
 
-def _get_referenced_subschema(ref_url, cache: dict=None, max_cache_age: timedelta=DEFAULT_MAX_SCHEMA_CACHE_AGE):
-    '''fetch the schema given by the ref_url, and return both the schema, and the sub-schema given by the #/ path in the ref_url as a tuple'''
+
+def _get_referenced_definition(ref_url, cache: dict=None, max_cache_age: timedelta=DEFAULT_MAX_SCHEMA_CACHE_AGE):
+    '''fetch the schema given by the remote ref_url, and return a tuple of the now-local-ref, and the definition sub-schema'''
+    referenced_schema = _get_referenced_schema(ref_url, cache=cache, max_cache_age=max_cache_age)
+
+    # deduct referred schema name and version from ref-value
+    head, anchor, tail = ref_url.partition('#')
+
+    # extract the definition sub-schema
+    definition = get_sub_schema(referenced_schema, tail)
+
+    return tail, definition
+
+
+def _get_referenced_schema(ref_url, cache: dict=None, max_cache_age: timedelta=DEFAULT_MAX_SCHEMA_CACHE_AGE):
+    '''fetch the schema given by the ref_url, and return it'''
     # deduct referred schema name and version from ref-value
     head, anchor, tail = ref_url.partition('#')
 
@@ -211,21 +225,99 @@ def _get_referenced_subschema(ref_url, cache: dict=None, max_cache_age: timedelt
         # fetch url, and store in cache
         referenced_schema = _fech_url_and_update_cache_entry_if_needed()
 
-    full_schema = referenced_schema
+    return referenced_schema
 
-    # extract sub-schema
-    referenced_schema = resolve_path(referenced_schema, tail)
 
-    return full_schema, referenced_schema
 
-
-def resolved_refs(schema, cache: dict=None, max_cache_age: timedelta=DEFAULT_MAX_SCHEMA_CACHE_AGE, root_schema=None):
-    '''return the given schema with all $ref fields replaced by the referred json (sub)schema that they point to.'''
+def resolved_remote_refs(schema, cache: dict=None, max_cache_age: timedelta=DEFAULT_MAX_SCHEMA_CACHE_AGE):
+    '''return the given schema with all remote $ref fields (to http://my.server.com/my/schema/#/definitions/...) replaced by the local $ref pointers to #/definitions/...'''
     if cache is None:
         cache = {}
 
+    schema_id = schema.get('$id', '').rstrip('/').rstrip('#')
+
+    local_refs_to_definition_map = {}
+
+    def _recursive_resolved_remote_refs(sub_schema):
+        if isinstance(sub_schema, list):
+            # recurse over each item in the list
+            return [_recursive_resolved_remote_refs(item) for item in sub_schema]
+
+        if isinstance(sub_schema, dict):
+            updated_sub_schema = {}
+            for key in sub_schema.keys():
+                # if the key is a remote ref, then fetch the definition and change it into a local definition and ref
+                if key=="$ref" and isinstance(sub_schema['$ref'], str) and sub_schema['$ref'].startswith('http'):
+                    # resolve remote reference
+                    ref_url = sub_schema['$ref']
+
+                    # deduct and construct a replacement local_ref for the ref_url
+                    schema_url, anchor, local_ref = ref_url.partition('#')
+                    schema_url = schema_url.rstrip('/')
+                    local_ref = '#'+local_ref
+
+                    if schema_url==schema_id:
+                        # self referencing
+                        # just replace the full ref_url by a local_ref,
+                        # no need to fetch the remote schema, no need to store the remote definition in local_refs_to_definition_map
+                        updated_sub_schema['$ref'] = '#'+local_ref
+                    else:
+                        # truely remote reference to another schema
+                        # make sure the new local_ref is unique by including the schema name
+                        # and that the local_ref starts with an anchor
+                        # the schema_name is extracted from the url_head, as the url_head without the http[s]:// part
+                        schema_identifier = schema_url.split('://')[-1]
+                        local_unique_ref = local_ref.replace('#/definitions/', '/definitions/').replace('/definitions/', '#/definitions/'+schema_identifier.strip('/')+'/')
+
+                        # replace remote ref by new local_ref
+                        updated_sub_schema['$ref'] = local_unique_ref
+
+                        # fetch the remote schema and extract the definition, if not already known
+                        if local_unique_ref not in local_refs_to_definition_map:
+                            referenced_schema = _get_referenced_schema(ref_url, cache=cache, max_cache_age=max_cache_age)
+
+                            # get **all*** definition for this referenced_schema (including the definition for local_ref)
+                            definitions = get_sub_schema(referenced_schema, "#/definitions")
+
+                            # replace all local references **within** the referenced_schema definitions by their longer unique'ified references
+                            definitions = json.loads(json.dumps(definitions).replace('"#/definitions/', '"#/definitions/'+schema_identifier.strip('/')+'/'))
+
+                            for definition_key, definition in definitions.items():
+                                # store definition in local_refs_to_definition_map for later addition of all gathered definitions in the root schema
+                                definition_unique_local_ref = '#/definitions/'+schema_identifier.strip('/')+'/'+definition_key
+                                local_refs_to_definition_map[definition_unique_local_ref] = definition
+                else:
+                    # key is not a (remote) $ref,
+                    # just copy a recursively resolved key/value into the updated_sub_schema
+                    updated_sub_schema[key] = _recursive_resolved_remote_refs(sub_schema[key])
+
+            return updated_sub_schema
+
+        # sub_schema is not a list or dict, so no need to resolve anything, just return it.
+        return sub_schema
+
+    # use the recursive helper method to replace the remote refs, and log the local_refs and definitions in local_refs_to_definition_map
+    updated_schema = _recursive_resolved_remote_refs(schema)
+
+    # add all local_definition_refs and definitions to the updated_schema definitions
+    for local_ref, definition in list(local_refs_to_definition_map.items()):
+        # the definition itself may contain remote refs, so resolve those as well
+        definition = _recursive_resolved_remote_refs(definition)
+
+        sub_schema = updated_schema
+        path_parts = local_ref.lstrip('#').strip('/').split('/')
+        for i, path_part in enumerate(path_parts):
+            if path_part not in sub_schema:
+                sub_schema[path_part] = {} if i < len(path_parts)-1 else definition
+            sub_schema = sub_schema[path_part]
+
+    return updated_schema
+
+
+def resolved_local_refs(schema, root_schema: dict=None):
+    '''return the given schema with all local $ref fields (to #/definitions/...) replaced by the referred definition that they point to.'''
+
     if root_schema is None:
-        # original schema, to lookup local references
         root_schema = schema
 
     if isinstance(schema, dict):
@@ -234,23 +326,18 @@ def resolved_refs(schema, cache: dict=None, max_cache_age: timedelta=DEFAULT_MAX
         if "$ref" in keys and isinstance(schema['$ref'], str):
             ref = schema['$ref']
 
-            if ref.startswith('http'):
-                # resolve remote reference
-                referenced_root_schema, referenced_schema = _get_referenced_subschema(ref, cache=cache, max_cache_age=max_cache_age)
-                # ... recursively, as this may contain further local & remote references
-                updated_schema = resolved_refs(referenced_schema, cache, root_schema=referenced_root_schema)
-            elif ref.startswith('#/'):
+            if ref.startswith('#/'):
                 # resolve local reference, a-la "#/definitions/foo"
-                updated_schema = resolve_path(root_schema, ref[1:])
+                updated_schema = get_sub_schema(root_schema, ref[1:])
 
             keys.remove("$ref")
 
         for key in keys:
-            updated_schema[key] = resolved_refs(schema[key], cache, root_schema=root_schema)
+            updated_schema[key] = resolved_local_refs(schema[key], root_schema=root_schema)
         return updated_schema
 
     if isinstance(schema, list):
-        return [resolved_refs(item, cache, root_schema=root_schema) for item in schema]
+        return [resolved_local_refs(item, root_schema=root_schema) for item in schema]
 
     return schema
 
@@ -274,8 +361,8 @@ def get_refs(schema) -> set:
 def validate_json_against_its_schema(json_object: dict, cache: dict=None, max_cache_age: timedelta=DEFAULT_MAX_SCHEMA_CACHE_AGE):
     '''validate the give json object against its own schema (the URI/URL that its propery $schema points to)'''
     schema_url = json_object['$schema']
-    _, schema_object = _get_referenced_subschema(schema_url, cache=cache, max_cache_age=max_cache_age)
-    return validate_json_against_schema(json_object, schema_object, cache=cache, max_cache_age=max_cache_age)
+    referenced_schema = _get_referenced_schema(schema_url, cache=cache, max_cache_age=max_cache_age)
+    return validate_json_against_schema(json_object, referenced_schema, cache=cache, max_cache_age=max_cache_age)
 
 
 def validate_json_against_schema(json_string: str, schema: str, cache: dict=None, max_cache_age: timedelta=DEFAULT_MAX_SCHEMA_CACHE_AGE):
@@ -302,7 +389,7 @@ def validate_json_against_schema(json_string: str, schema: str, cache: dict=None
         raise jsonschema.exceptions.ValidationError("Invalid JSON: %s\n%s" % (str(e), schema))
 
     # resolve $refs to fill in defaults for those, too
-    schema_object = resolved_refs(schema_object, cache=cache, max_cache_age=max_cache_age)
+    schema_object = resolved_remote_refs(schema_object, cache=cache, max_cache_age=max_cache_age)
 
     # now do the actual validation
     try:
diff --git a/LCS/PyCommon/test/t_json_utils.py b/LCS/PyCommon/test/t_json_utils.py
index bb67ebbd963a4497a7e9c989e86ef60d184990a0..2ea8156725517dbab579d68d47b1bc62378e43ab 100755
--- a/LCS/PyCommon/test/t_json_utils.py
+++ b/LCS/PyCommon/test/t_json_utils.py
@@ -27,7 +27,7 @@ logging.basicConfig(format='%(asctime)s %(process)s %(threadName)s %(levelname)s
 import unittest
 import threading
 import json
-from lofar.common.json_utils import get_default_json_object_for_schema, replace_host_in_urls, resolved_refs, resolve_path
+from lofar.common.json_utils import get_default_json_object_for_schema, replace_host_in_urls, resolved_remote_refs, resolved_local_refs, get_sub_schema
 
 class TestJSONUtils(unittest.TestCase):
     def test_empty_schema_yields_empty_object(self):
@@ -69,27 +69,24 @@ class TestJSONUtils(unittest.TestCase):
                           "prop_a": 42,
                           "prop_b": 3.14}, json)
 
-    def test_resolve_path(self):
+    def test_get_sub_schema(self):
         test_schema = { "one": { "two": { "three": "value" }, "foo": "bar" }, "foo": "bar" }
 
         # resolve root
-        self.assertEqual(test_schema, resolve_path(test_schema, "/"))
-        self.assertEqual(test_schema, resolve_path(test_schema, ""))
+        self.assertEqual(test_schema, get_sub_schema(test_schema, "/"))
+        self.assertEqual(test_schema, get_sub_schema(test_schema, ""))
 
         # resolve deeper
-        self.assertEqual(test_schema["one"], resolve_path(test_schema, "/one"))
-        self.assertEqual(test_schema["one"]["two"], resolve_path(test_schema, "/one/two"))
-        self.assertEqual("value", resolve_path(test_schema, "/one/two/three"))
+        self.assertEqual(test_schema["one"], get_sub_schema(test_schema, "/one"))
+        self.assertEqual(test_schema["one"]["two"], get_sub_schema(test_schema, "/one/two"))
+        self.assertEqual("value", get_sub_schema(test_schema, "/one/two/three"))
 
         # check variants
-        self.assertEqual("value", resolve_path(test_schema, "/one/two/three/"))
-        self.assertEqual("value", resolve_path(test_schema, "one/two/three"))
+        self.assertEqual("value", get_sub_schema(test_schema, "/one/two/three/"))
+        self.assertEqual("value", get_sub_schema(test_schema, "one/two/three"))
 
     def test_resolved_local_refs(self):
         '''test if $refs to #/definitions are properly resolved'''
-        import http.server
-        import socketserver
-        from lofar.common.util import find_free_port
 
         user_schema = {"definitions": {
                            "email": {
@@ -114,7 +111,7 @@ class TestJSONUtils(unittest.TestCase):
                                }
                            } } }
 
-        resolved_user_schema = resolved_refs(user_schema)
+        resolved_user_schema = resolved_local_refs(user_schema)
 
         self.assertNotEqual(user_schema['properties']['email'], resolved_user_schema['properties']['email'])
         for key,value in user_schema['definitions']['email'].items():
@@ -129,17 +126,35 @@ class TestJSONUtils(unittest.TestCase):
         import socketserver
         from lofar.common.util import find_free_port
 
-        port = find_free_port(8000)
+        port = find_free_port(8000, allow_reuse_of_lingering_port=False)
         host = "127.0.0.1"
-        base_url = "http://%s:%s" % (host, port)
+        host_port = "%s:%s" % (host, port)
+        base_url = "http://"+host_port
 
         base_schema = { "$id": base_url + "/base_schema.json",
                         "$schema": "http://json-schema.org/draft-06/schema#",
                          "definitions": {
+                             "timestamp": {
+                                 "description": "A timestamp defined in UTC",
+                                 "type": "string",
+                                 "pattern": "\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d(\\.\\d+)?Z?",
+                                 "format": "date-time"
+                             },
                              "email": {
                                  "type": "string",
                                  "format": "email",
-                                 "pattern": "@example\\.com$" }
+                                 "pattern": "@example\\.com$" },
+                             "account": {
+                                 "type": "object",
+                                 "properties": {
+                                     "email_address": {
+                                         "$ref": "#/definitions/email"
+                                     },
+                                     "creation_at": {
+                                         "$ref": "#/definitions/timestamp"
+                                     }
+                                 }
+                             }
                          } }
 
         user_schema = {"$id": base_url + "/user_schema.json",
@@ -150,8 +165,8 @@ class TestJSONUtils(unittest.TestCase):
                            "name": {
                                "type": "string",
                                "minLength": 2 },
-                           "email": {
-                               "$ref": base_url + "/base_schema.json" + "#/definitions/email",
+                           "user_account": {
+                               "$ref": base_url + "/base_schema.json" + "#/definitions/account",
                                "extra_prop": "very important"
                            },
                            "other_emails": {
@@ -184,22 +199,28 @@ class TestJSONUtils(unittest.TestCase):
             thread = threading.Thread(target=httpd.serve_forever)
             thread.start()
 
-            # the method-under-test
-            resolved_user_schema = resolved_refs(user_schema)
-
-            print('user_schema: ', json.dumps(user_schema, indent=2))
-            print('resolved_user_schema: ', json.dumps(resolved_user_schema, indent=2))
-
-            self.assertNotEqual(user_schema['properties']['email'], resolved_user_schema['properties']['email'])
-            for key,value in base_schema['definitions']['email'].items():
-                self.assertEqual(value, resolved_user_schema['properties']['email'][key])
-            self.assertTrue('extra_prop' in resolved_user_schema['properties']['email'])
-            self.assertEqual('very important', resolved_user_schema['properties']['email']['extra_prop'])
-
-
-            httpd.shutdown()
-            thread.join(timeout=2)
-            self.assertFalse(thread.is_alive())
+            try:
+                # the method-under-test
+                resolved_user_schema = resolved_remote_refs(user_schema)
+
+                print('base_schema: ', json.dumps(base_schema, indent=2))
+                print('user_schema: ', json.dumps(user_schema, indent=2))
+                print('resolved_user_schema: ', json.dumps(resolved_user_schema, indent=2))
+
+                for key, value in base_schema['definitions']['email'].items():
+                    self.assertEqual(value, resolved_user_schema['definitions'][host_port]['base_schema.json']['email'][key])
+                for key, value in base_schema['definitions']['timestamp'].items():
+                    self.assertEqual(value, resolved_user_schema['definitions'][host_port]['base_schema.json']['timestamp'][key])
+                for key, value in base_schema['definitions']['account'].items():
+                    value = json.loads(json.dumps(value).replace('"#/definitions/', '"#/definitions/'+host_port+'/base_schema.json/'))
+                    self.assertEqual(value, resolved_user_schema['definitions'][host_port]['base_schema.json']['account'][key])
+                self.assertTrue('extra_prop' in resolved_user_schema['properties']['user_account'])
+                self.assertEqual('very important', resolved_user_schema['properties']['user_account']['extra_prop'])
+
+            finally:
+                httpd.shutdown()
+                thread.join(timeout=2)
+                self.assertFalse(thread.is_alive())
 
     def test_replace_host_in_ref_urls(self):
         base_host = "http://foo.bar.com"
diff --git a/LCS/PyCommon/test/t_util.py b/LCS/PyCommon/test/t_util.py
index 77971885fb78f135c4dba3cee0daa940dd1c33be..c54747c3af0e1fc45e9532a59bd6b420c678cf38 100644
--- a/LCS/PyCommon/test/t_util.py
+++ b/LCS/PyCommon/test/t_util.py
@@ -61,10 +61,6 @@ class TestUtils(unittest.TestCase):
         merged = dict_with_overrides(dict_a, dict_b)
         self.assertEqual({'a': 1, 'b': {'c': 3, 'd': [4, 5, 6]}, 'e': [{'foo': 2}, {'bar': 3}]}, merged)
 
-        with self.assertRaises(AssertionError):
-            dict_b = {'e': []} #AssertionError should be raised cause list is not of same length as original
-            dict_with_overrides(dict_a, dict_b)
-
 def main(argv):
     unittest.main()
 
diff --git a/LCS/PyCommon/util.py b/LCS/PyCommon/util.py
index 541937c640c1b47066da09af33ce9e6083dd0c2c..77c2622dfe14cf2a5867e59b3ad280671a03ca11 100644
--- a/LCS/PyCommon/util.py
+++ b/LCS/PyCommon/util.py
@@ -247,15 +247,27 @@ def dict_with_overrides(org_dict: dict, overrides: dict) -> dict:
         elif isinstance(override_value, list):
             sub_list = new_dict.get(override_key, [])
             assert isinstance(sub_list, list)
-            assert len(sub_list) == len(override_value)
 
-            for i in range(len(override_value)):
-                org_list_item = sub_list[i]
-                override_list_item = override_value[i]
-                if isinstance(org_list_item, dict) and isinstance(override_list_item, dict):
-                    new_dict[override_key][i] = dict_with_overrides(org_list_item, override_list_item)
-                else:
-                    new_dict[override_key][i] = override_list_item
+            if override_key not in new_dict:
+                new_dict[override_key] = []
+
+            if any([isinstance(item, dict) or isinstance(item, list) for item in override_value]):
+                # override_value is a list of with some/all recursible items which need recursion.
+                for i in range(len(override_value)):
+                    override_list_item = override_value[i]
+
+                    if i < len(sub_list):
+                        org_list_item = sub_list[i]
+                        if isinstance(org_list_item, dict) and isinstance(override_list_item, dict):
+                            # recurse
+                            override_list_item = dict_with_overrides(org_list_item, override_list_item)
+                        new_dict[override_key][i] = override_list_item
+                    else:
+                        new_dict[override_key].append(override_list_item)
+            else:
+                # override_value is a list of 'plain' values which need no recursion. Just copy it.
+                new_dict[override_key] = override_value
+
         else:
             new_dict[override_key] = override_value
 
diff --git a/RTCP/Cobalt/GPUProc/share/gpu/kernels/BeamFormer.cu b/RTCP/Cobalt/GPUProc/share/gpu/kernels/BeamFormer.cu
index b4b8137e69be4b4b3e25e4e70d1c9696879013e6..9cee345bb9334f68997e7c41c21a36a49a8bc71d 100644
--- a/RTCP/Cobalt/GPUProc/share/gpu/kernels/BeamFormer.cu
+++ b/RTCP/Cobalt/GPUProc/share/gpu/kernels/BeamFormer.cu
@@ -42,7 +42,7 @@
 #define DELAY_INDEX(s) (delayIndices[s])
 
 //# Typedefs used to map input data on arrays
-typedef  double (*DelaysType)[1][NR_DELAYS][NR_TABS];
+typedef  double (*DelaysType)[NR_DELAYS][NR_TABS];
 #ifdef FLYS_EYE
 typedef  float2 (*BandPassCorrectedType)[NR_INPUT_STATIONS][NR_CHANNELS][NR_SAMPLES_PER_CHANNEL][NR_POLARIZATIONS];
 #else
@@ -60,7 +60,6 @@ typedef  float2 (*ComplexVoltagesType)[NR_CHANNELS][NR_SAMPLES_PER_CHANNEL][NR_T
  * \param[in]  delaysPtr               3D input array of complex valued delays to be applied to the correctData samples. There is a delay for each Sub-Array Pointing, station, and Tied Array Beam triplet.
  * \param[in]  delayIndices            1D input array of which stations to use out of delaysPtr, if a subset of the stations need to be beam formed
  * \param[in]  subbandFrequency        central frequency of the subband
- * \param[in]  sap                     number (index) of the Sub-Array Pointing (aka (station) beam)
  *
  * Pre-processor input symbols (some are tied to the execution configuration)
  * Symbol                  | Valid Values            | Description
@@ -84,8 +83,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
                                        const unsigned *stationIndices, // lookup index for stations to use in samplesPtr
                                        const void *delaysPtr, 
                                        const unsigned *delayIndices, // lookup index for stations to use in delaysPtr
-                                       double subbandFrequency,
-                                       unsigned sap)
+                                       double subbandFrequency)
 {
   ComplexVoltagesType complexVoltages = (ComplexVoltagesType) complexVoltagesPtr;
   BandPassCorrectedType samples = (BandPassCorrectedType) samplesPtr;
@@ -132,7 +130,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
     fcomplex weight_00;                              // assign the weights to register variables
     if (first_station + 0 < NR_OUTPUT_STATIONS) {  // Number of station might be larger then 32:
                                                      // We then do multiple passes to span all stations
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 0)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 0)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_00 = make_float2(weight.x, weight.y);
     }
@@ -141,7 +139,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 2
     fcomplex weight_01;
     if (first_station + 1 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 1)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 1)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_01 = make_float2(weight.x, weight.y);
     }
@@ -150,7 +148,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 3
     fcomplex weight_02;
     if (first_station + 2 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 2)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 2)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_02 = make_float2(weight.x, weight.y);
     }
@@ -159,7 +157,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 4
     fcomplex weight_03;
     if (first_station + 3 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 3)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 3)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_03 = make_float2(weight.x, weight.y);
     }
@@ -168,7 +166,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 5
     fcomplex weight_04;
     if (first_station + 4 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 4)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 4)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_04 = make_float2(weight.x, weight.y);
     }
@@ -177,7 +175,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 6
     fcomplex weight_05;
     if (first_station + 5 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 5)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 5)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_05 = make_float2(weight.x, weight.y);
     }
@@ -186,7 +184,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 7
     fcomplex weight_06;
     if (first_station + 6 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 6)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 6)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_06 = make_float2(weight.x, weight.y);
     }
@@ -195,7 +193,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 8
     fcomplex weight_07;
     if (first_station + 7 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 7)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 7)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_07 = make_float2(weight.x, weight.y);
     }
@@ -204,7 +202,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 9
     fcomplex weight_08;
     if (first_station + 8 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 8)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 8)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_08 = make_float2(weight.x, weight.y);
     }
@@ -213,7 +211,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 10
     fcomplex weight_09;
     if (first_station + 9 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 9)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 9)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_09 = make_float2(weight.x, weight.y);
     }
@@ -222,7 +220,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 11
     fcomplex weight_10;
     if (first_station + 10 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 10)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 10)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_10 = make_float2(weight.x, weight.y);
     }
@@ -231,7 +229,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 12
     fcomplex weight_11;
     if (first_station + 11 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 11)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 11)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_11 = make_float2(weight.x, weight.y);
     }
@@ -240,7 +238,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 13
     fcomplex weight_12;
     if (first_station + 12 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 12)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 12)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_12 = make_float2(weight.x, weight.y);
     }
@@ -249,7 +247,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 14
     fcomplex weight_13;
     if (first_station + 13 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 13)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 13)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_13 = make_float2(weight.x, weight.y);
     }
@@ -258,7 +256,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 15
     fcomplex weight_14;
     if (first_station + 14 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 14)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 14)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_14 = make_float2(weight.x, weight.y);
     }
@@ -267,7 +265,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 16
     fcomplex weight_15;
     if (first_station + 15 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 15)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 15)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_15 = make_float2(weight.x, weight.y);
     }
@@ -276,7 +274,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 17
     fcomplex weight_16;
     if (first_station + 16 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 16)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 16)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_16 = make_float2(weight.x, weight.y);
     }
@@ -285,7 +283,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 18
     fcomplex weight_17;
     if (first_station + 17 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 17)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 17)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_17 = make_float2(weight.x, weight.y);
     }
@@ -294,7 +292,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 19
     fcomplex weight_18;
     if (first_station + 18 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 18)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 18)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_18 = make_float2(weight.x, weight.y);
     }
@@ -303,7 +301,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 20
     fcomplex weight_19;
     if (first_station + 19 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 19)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 19)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_19 = make_float2(weight.x, weight.y);
     }
@@ -312,7 +310,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 21
     fcomplex weight_20;
     if (first_station + 20 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 20)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 20)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_20 = make_float2(weight.x, weight.y);
     }
@@ -321,7 +319,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 22
     fcomplex weight_21;
     if (first_station + 21 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 21)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 21)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_21 = make_float2(weight.x, weight.y);
     }
@@ -330,7 +328,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 23
     fcomplex weight_22;
     if (first_station + 22 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 22)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 22)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_22 = make_float2(weight.x, weight.y);
     }
@@ -339,7 +337,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 24
     fcomplex weight_23;
     if (first_station + 23 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 23)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 23)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_23 = make_float2(weight.x, weight.y);
     }
@@ -348,7 +346,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 25
     fcomplex weight_24;
     if (first_station + 24 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 24)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 24)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_24 = make_float2(weight.x, weight.y);
     }
@@ -357,7 +355,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 26
     fcomplex weight_25;
     if (first_station + 25 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 25)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 25)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_25 = make_float2(weight.x, weight.y);
     }
@@ -366,7 +364,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 27
     fcomplex weight_26;
     if (first_station + 26 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 26)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 26)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_26 = make_float2(weight.x, weight.y);
     }
@@ -375,7 +373,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 28
     fcomplex weight_27;
     if (first_station + 27 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 27)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 27)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_27 = make_float2(weight.x, weight.y);
     }
@@ -384,7 +382,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 29
     fcomplex weight_28;
     if (first_station + 28 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 28)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 28)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_28 = make_float2(weight.x, weight.y);
     }
@@ -393,7 +391,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 30
     fcomplex weight_29;
     if (first_station + 29 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 29)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 29)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_29 = make_float2(weight.x, weight.y);
     }
@@ -402,7 +400,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 31
     fcomplex weight_30;
     if (first_station + 30 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 30)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 30)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_30 = make_float2(weight.x, weight.y);
     }
@@ -411,7 +409,7 @@ extern "C" __global__ void beamFormer( void *complexVoltagesPtr,
 #if NR_STATIONS_PER_PASS >= 32
     fcomplex weight_31;
     if (first_station + 31 < NR_OUTPUT_STATIONS) {
-      double delay = (*delays)[sap][DELAY_INDEX(first_station + 31)][tab_or_zero];
+      double delay = (*delays)[DELAY_INDEX(first_station + 31)][tab_or_zero];
       dcomplex weight = dphaseShift(frequency, delay);
       weight_31 = make_float2(weight.x, weight.y);
     }
diff --git a/RTCP/Cobalt/GPUProc/share/gpu/kernels/DelayAndBandPass.cu b/RTCP/Cobalt/GPUProc/share/gpu/kernels/DelayAndBandPass.cu
index b65e940f6a11757253354b9b301f4c68fca1e892..df27ced597f46bdc8d8f38fcbb889175ea41984a 100644
--- a/RTCP/Cobalt/GPUProc/share/gpu/kernels/DelayAndBandPass.cu
+++ b/RTCP/Cobalt/GPUProc/share/gpu/kernels/DelayAndBandPass.cu
@@ -75,7 +75,7 @@ typedef  fcomplex(*OutputDataType)[NR_STATIONS][NR_POLARIZATIONS][NR_CHANNELS][N
 #endif
 
 typedef  fcomplex(*InputDataType)[NR_STATIONS][NR_POLARIZATIONS][NR_SAMPLES_PER_CHANNEL][NR_CHANNELS];
-typedef  const double(*DelaysType)[1][NR_DELAYS][NR_POLARIZATIONS]; // 2 Polarizations; in seconds
+typedef  const double(*DelaysType)[NR_DELAYS][NR_POLARIZATIONS]; // 2 Polarizations; in seconds
 typedef  const double2(*Phase0sType)[NR_STATIONS]; // 2 Polarizations; in radians
 typedef  const float(*BandPassFactorsType)[NR_CHANNELS];
 
@@ -111,13 +111,12 @@ inline __device__ fcomplex sincos_d2f(double phi)
 *                                 4D array [station][polarization][sample][channel][complex]
 *                                 of ::fcomplex
 * @param[in]  subbandFrequency    center freqency of the subband
-* @param[in]  beam                index number of the beam
 * @param[in]  delaysAtBeginPtr    pointer to delay data of ::DelaysType,
-*                                 a 2D array [beam][station] of float2 (real:
+*                                 a 1D array [station] of float2 (real:
 *                                 2 polarizations), containing delays in
 *                                 seconds at begin of integration period
 * @param[in]  delaysAfterEndPtr   pointer to delay data of ::DelaysType,
-*                                 a 2D array [beam][station] of float2 (real:
+*                                 a 1D array [station] of float2 (real:
 *                                 2 polarizations), containing delays in
 *                                 seconds after end of integration period
 * @param[in]  phase0sPt     r     pointer to phase offset data of
@@ -134,7 +133,6 @@ extern "C" {
     const fcomplex * filteredDataPtr,
     const unsigned * delayIndices,
     double subbandFrequency,
-    unsigned beam, // =nrSAPS
     const double * delaysAtBeginPtr,
     const double * delaysAfterEndPtr,
     const double * phase0sPtr,
@@ -226,8 +224,8 @@ extern "C" {
       ? subbandFrequency
       : subbandFrequency - 0.5 * SUBBAND_BANDWIDTH + channel * (SUBBAND_BANDWIDTH / NR_CHANNELS);
 
-    const double2 delayAtBegin = make_double2((*delaysAtBegin)[beam][delayIdx][0], (*delaysAtBegin)[beam][delayIdx][1]);
-    const double2 delayAfterEnd = make_double2((*delaysAfterEnd)[beam][delayIdx][0], (*delaysAfterEnd)[beam][delayIdx][1]);
+    const double2 delayAtBegin = make_double2((*delaysAtBegin)[delayIdx][0], (*delaysAtBegin)[delayIdx][1]);
+    const double2 delayAfterEnd = make_double2((*delaysAfterEnd)[delayIdx][0], (*delaysAfterEnd)[delayIdx][1]);
 
     // Calculate the angles to rotate for for the first and (beyond the) last sample.
     //
diff --git a/RTCP/Cobalt/GPUProc/share/gpu/kernels/FIR_Filter.cu b/RTCP/Cobalt/GPUProc/share/gpu/kernels/FIR_Filter.cu
index 034f046217bf9684fea8ebb7068b2665aa3721cb..dcf82d04b1729a6376af4379a319c9066ea016c5 100644
--- a/RTCP/Cobalt/GPUProc/share/gpu/kernels/FIR_Filter.cu
+++ b/RTCP/Cobalt/GPUProc/share/gpu/kernels/FIR_Filter.cu
@@ -124,7 +124,7 @@ inline __device__ float2 sincos_d2f_select(double phi, int ri)
   return make_float2((ri?s:c),(ri?c:-s));
 }
 
-typedef  const double(*DelaysType)[1][NR_STABS][NR_POLARIZATIONS]; // 2 Polarizations; in seconds
+typedef  const double(*DelaysType)[NR_STABS][NR_POLARIZATIONS]; // 2 Polarizations; in seconds
 typedef  const double(*Phase0sType)[NR_STABS][NR_POLARIZATIONS]; // 2 Polarizations; in radians
 #endif /* DOPPLER_CORRECTION */
 
@@ -201,8 +201,8 @@ __global__ void FIR_filter( void *filteredDataPtr,
 #ifdef DOPPLER_CORRECTION
   DelaysType delaysAtBegin = (DelaysType)delaysAtBeginPtr;
   DelaysType delaysAfterEnd = (DelaysType)delaysAfterEndPtr;
-  const double delayAtBegin = (*delaysAtBegin)[0][station][pol];
-  const double delayAfterEnd = (*delaysAfterEnd)[0][station][pol];
+  const double delayAtBegin = (*delaysAtBegin)[station][pol];
+  const double delayAfterEnd = (*delaysAfterEnd)[station][pol];
 
   // Calculate the angles to rotate for for the first and (beyond the) last sample.
   //
diff --git a/RTCP/Cobalt/GPUProc/share/gpu/kernels/QuantizeOutput.cu b/RTCP/Cobalt/GPUProc/share/gpu/kernels/QuantizeOutput.cu
index b8064dc8574078fe75a7507754fbdf8fa5b9e470..bcbd91674fa3bea7fd75c2bb5191de6704a8f18d 100644
--- a/RTCP/Cobalt/GPUProc/share/gpu/kernels/QuantizeOutput.cu
+++ b/RTCP/Cobalt/GPUProc/share/gpu/kernels/QuantizeOutput.cu
@@ -18,8 +18,6 @@
 //#
 //# $Id: QuantizeOutput.cu 29617 2014-06-23 08:08:41Z mol $
 
-#include <stdint.h>
-
 #include <cooperative_groups.h>
 
 namespace cg = cooperative_groups;
@@ -41,11 +39,11 @@ namespace cg = cooperative_groups;
 #endif
 
 #if (NR_QUANTIZE_BITS == 16)
-#define UINT uint16_t
-#define INT int16_t
+#define UINT unsigned short int
+#define INT signed short int
 #elif (NR_QUANTIZE_BITS == 8)
-#define UINT uint8_t
-#define INT int8_t
+#define UINT unsigned char
+#define INT signed char
 #else
 #error Precondition violated: invalid value for NR_QUANTIZE_BITS
 #endif
diff --git a/RTCP/Cobalt/GPUProc/src/Kernels/BeamFormerKernel.cc b/RTCP/Cobalt/GPUProc/src/Kernels/BeamFormerKernel.cc
index 907d3265b782051508726d3ad74ff0298c5dd8a3..a75eadf5ac1e0614799129cfc80fbfe84512b4f3 100644
--- a/RTCP/Cobalt/GPUProc/src/Kernels/BeamFormerKernel.cc
+++ b/RTCP/Cobalt/GPUProc/src/Kernels/BeamFormerKernel.cc
@@ -50,7 +50,6 @@ namespace LOFAR
       unsigned nrDelays_,
       unsigned nrChannels_,
       unsigned nrSamplesPerChannel_,
-      unsigned nrSAPs_,
       unsigned nrTABs_,
       double subbandBandWidth_,
       bool doFlysEye_,
@@ -70,7 +69,6 @@ namespace LOFAR
       nrChannels(nrChannels_),
       nrSamplesPerChannel(nrSamplesPerChannel_),
 
-      nrSAPs(nrSAPs_),
       nrTABs(nrTABs_),
       subbandBandwidth(subbandBandWidth_),
       doFlysEye(doFlysEye_)
@@ -100,7 +98,7 @@ namespace LOFAR
           (size_t) delayIndices.size() * sizeof delayIndices[0];
       case BeamFormerKernel::BEAM_FORMER_DELAYS:
         return 
-          (size_t) nrSAPs * nrDelays *
+          (size_t) nrDelays *
           nrTABs * sizeof(double);
       default:
         THROW(GPUProcException, "Invalid bufferType (" << bufferType << ")");
@@ -151,10 +149,9 @@ namespace LOFAR
     }
 
     void BeamFormerKernel::enqueue(const BlockID &blockId,
-                                   double subbandFrequency, unsigned SAP)
+                                   double subbandFrequency)
     {
       setArg(5, subbandFrequency);
-      setArg(6, SAP);
       Kernel::enqueue(blockId);
     }
 
diff --git a/RTCP/Cobalt/GPUProc/src/Kernels/BeamFormerKernel.h b/RTCP/Cobalt/GPUProc/src/Kernels/BeamFormerKernel.h
index b9a91c3966f88ae989c92531ae5f5f238856c7f2..e405dba8250cee48dca67674fd8eafcbeb151665 100644
--- a/RTCP/Cobalt/GPUProc/src/Kernels/BeamFormerKernel.h
+++ b/RTCP/Cobalt/GPUProc/src/Kernels/BeamFormerKernel.h
@@ -57,7 +57,6 @@ namespace LOFAR
           unsigned nrDelays,
           unsigned nrChannels,
           unsigned nrSamplesPerChannel,
-          unsigned nrSAPs,
           unsigned nrTABs,
           double subbandWidth,
           bool doFlysEye,
@@ -97,7 +96,7 @@ namespace LOFAR
                              const Parameters &param);
 
       void enqueue(const BlockID &blockId, 
-                   double subbandFrequency, unsigned SAP);
+                   double subbandFrequency);
 
       gpu::DeviceMemory stationIndices;
       gpu::DeviceMemory delayIndices;
diff --git a/RTCP/Cobalt/GPUProc/src/Kernels/DelayAndBandPassKernel.cc b/RTCP/Cobalt/GPUProc/src/Kernels/DelayAndBandPassKernel.cc
index 730e54e45ddb1025e31c1fa8d2317168e65bb18e..5cadf9eb246f31889f0f63f276c0755da087372d 100644
--- a/RTCP/Cobalt/GPUProc/src/Kernels/DelayAndBandPassKernel.cc
+++ b/RTCP/Cobalt/GPUProc/src/Kernels/DelayAndBandPassKernel.cc
@@ -53,7 +53,6 @@ namespace LOFAR
       unsigned nrSamplesPerChannel_,
       unsigned clockMHz_,
       double subbandBandwidth_,
-      unsigned nrSAPs_,
       bool correlator_,
       bool delayCompensation_,
       bool correctBandPass_,
@@ -70,7 +69,6 @@ namespace LOFAR
       nrSamplesPerChannel(nrSamplesPerChannel_),
       clockMHz(clockMHz_),
       subbandBandwidth(subbandBandwidth_),
-      nrSAPs(nrSAPs_),
       delayCompensation(delayCompensation_),
       correctBandPass(correctBandPass_),
       transpose(transpose_),
@@ -114,7 +112,7 @@ namespace LOFAR
           delayIndices.size() * sizeof delayIndices[0];
       case DelayAndBandPassKernel::DELAYS:
         return 
-          (size_t) nrSAPs * nrDelays *  
+          (size_t) nrDelays *  
             NR_POLARIZATIONS * sizeof(double);
       case DelayAndBandPassKernel::PHASE_ZEROS:
         return
@@ -153,10 +151,10 @@ namespace LOFAR
       setArg(0, buffers.output);
       setArg(1, buffers.input);
       setArg(2, delayIndices);
-      setArg(5, delaysAtBegin);
-      setArg(6, delaysAfterEnd);
-      setArg(7, phase0s);
-      setArg(8, bandPassCorrectionWeights);
+      setArg(4, delaysAtBegin);
+      setArg(5, delaysAfterEnd);
+      setArg(6, phase0s);
+      setArg(7, bandPassCorrectionWeights);
 
       if (params.transpose)
         setEnqueueWorkSizes( gpu::Grid(256,
@@ -192,10 +190,9 @@ namespace LOFAR
 
 
     void DelayAndBandPassKernel::enqueue(const BlockID &blockId,
-                                         double subbandFrequency, unsigned SAP)
+                                         double subbandFrequency)
     {
       setArg(3, subbandFrequency);
-      setArg(4, SAP);
       Kernel::enqueue(blockId);
     }
 
diff --git a/RTCP/Cobalt/GPUProc/src/Kernels/DelayAndBandPassKernel.h b/RTCP/Cobalt/GPUProc/src/Kernels/DelayAndBandPassKernel.h
index b37693bd27234c5bde854afe50b80b9d98c5bacf..f3a773e82d7cefc448a0a48081931d9c222a311a 100644
--- a/RTCP/Cobalt/GPUProc/src/Kernels/DelayAndBandPassKernel.h
+++ b/RTCP/Cobalt/GPUProc/src/Kernels/DelayAndBandPassKernel.h
@@ -64,7 +64,6 @@ namespace LOFAR
           unsigned nrSamplesPerChannel,
           unsigned clockMHz,
           double subbandBandwidth,
-          unsigned nrSAPs,
           bool correlator,
           bool delayCompensation,
           bool correctBandPass,
@@ -85,8 +84,6 @@ namespace LOFAR
         unsigned clockMHz;
         double subbandBandwidth;
 
-        unsigned nrSAPs;
-
         bool delayCompensation;
         bool correctBandPass;
         bool transpose;
@@ -108,7 +105,7 @@ namespace LOFAR
 
 
       void enqueue(const BlockID &blockId, 
-                   double subbandFrequency, unsigned SAP);
+                   double subbandFrequency);
 
       // Input parameters for the delay compensation
       gpu::DeviceMemory delayIndices;
diff --git a/RTCP/Cobalt/GPUProc/src/Kernels/FIR_FilterKernel.cc b/RTCP/Cobalt/GPUProc/src/Kernels/FIR_FilterKernel.cc
index 4d4e9dacdd10ca7bc965a6947e8c22739a7b86eb..888cfd4ac4d482257304ca9a18e4fd9d33d7eb7e 100644
--- a/RTCP/Cobalt/GPUProc/src/Kernels/FIR_FilterKernel.cc
+++ b/RTCP/Cobalt/GPUProc/src/Kernels/FIR_FilterKernel.cc
@@ -119,7 +119,7 @@ namespace LOFAR
                 : (nrBitsPerSample == 4 ? 2U : nrBytesPerComplexSample()));
       case FIR_FilterKernel::DELAYS:
         return (dopplerCorrection?
-          (size_t) 1 * nrSTABs * // nrSAPs=1 here
+          (size_t) nrSTABs *
             NR_POLARIZATIONS * sizeof(double) : 0);
       default:
         THROW(GPUProcException, "Invalid bufferType (" << bufferType << ")");
diff --git a/RTCP/Cobalt/GPUProc/src/SubbandProcs/BeamFormerCoherentStep.cc b/RTCP/Cobalt/GPUProc/src/SubbandProcs/BeamFormerCoherentStep.cc
index 87c335bbac416b0020650e0e13890f22f24ec501..517ccff975860f5055af656ba598c9c9e52e7278 100644
--- a/RTCP/Cobalt/GPUProc/src/SubbandProcs/BeamFormerCoherentStep.cc
+++ b/RTCP/Cobalt/GPUProc/src/SubbandProcs/BeamFormerCoherentStep.cc
@@ -53,7 +53,6 @@ namespace LOFAR
         obsParameters.nrStations, // nrDelays
         preParameters.nrDelayCompensationChannels,
         obsParameters.blockSize / preParameters.nrDelayCompensationChannels,
-        bfParameters.nrSAPs,
         bfParameters.maxNrCoherentTABsPerSAP,
         obsParameters.subbandWidth,
         bfParameters.doFlysEye,
@@ -220,7 +219,7 @@ namespace LOFAR
     }
 
 
-    void BeamFormerCoherentStep::writeInput(const MultiDimArrayHostBuffer<double, 3>& tabDelays)
+    void BeamFormerCoherentStep::writeInput(const MultiDimArrayHostBuffer<double, 2>& tabDelays)
     {
       // Upload the new beamformerDelays (pointings) to the GPU
       htodStream->waitEvent(executeFinished);
@@ -234,10 +233,9 @@ namespace LOFAR
       executeStream->waitEvent(inputFinished);
       executeStream->waitEvent(outputFinished);
 
-      // The centralFrequency and SAP immediate kernel args must outlive kernel runs.
+      // The centralFrequency immediate kernel arg must outlive kernel runs.
       beamFormerKernel->enqueue(input.blockID,
-        obsParameters.subbands[input.blockID.globalSubbandIdx].centralFrequency,
-        obsParameters.subbands[input.blockID.globalSubbandIdx].SAP);
+        obsParameters.subbands[input.blockID.globalSubbandIdx].centralFrequency);
 
       coherentTransposeKernel->enqueue(input.blockID);
 
diff --git a/RTCP/Cobalt/GPUProc/src/SubbandProcs/BeamFormerCoherentStep.h b/RTCP/Cobalt/GPUProc/src/SubbandProcs/BeamFormerCoherentStep.h
index c871db064dfaeaa455da6e9bf60aa5e9e06f0f65..1e760ed1e0818dcb399b96c8831ddcaed735fddf 100644
--- a/RTCP/Cobalt/GPUProc/src/SubbandProcs/BeamFormerCoherentStep.h
+++ b/RTCP/Cobalt/GPUProc/src/SubbandProcs/BeamFormerCoherentStep.h
@@ -86,7 +86,7 @@ namespace LOFAR
 
       gpu::DeviceMemory outputBuffer();
 
-      void writeInput(const MultiDimArrayHostBuffer<double, 3>& tabDelays);
+      void writeInput(const MultiDimArrayHostBuffer<double, 2>& tabDelays);
 
       void process(const SubbandProcInputData &input);
 
diff --git a/RTCP/Cobalt/GPUProc/src/SubbandProcs/BeamFormerPreprocessingStep.cc b/RTCP/Cobalt/GPUProc/src/SubbandProcs/BeamFormerPreprocessingStep.cc
index 78a289100f6a80235aab273a16b231c302f2155d..2a8d53660504bfaccdc3edefbfb155a66e0d3bf3 100644
--- a/RTCP/Cobalt/GPUProc/src/SubbandProcs/BeamFormerPreprocessingStep.cc
+++ b/RTCP/Cobalt/GPUProc/src/SubbandProcs/BeamFormerPreprocessingStep.cc
@@ -77,7 +77,6 @@ namespace LOFAR
           obsParameters.blockSize / preParameters.nrDelayCompensationChannels,
           obsParameters.clockMHz, //not needed in beamformer pipeline
           obsParameters.subbandWidth,
-          obsParameters.nrSAPs,
           false, // correlator
           preParameters.delayCompensationEnabled,
           false, // correctBandPass
@@ -189,8 +188,7 @@ namespace LOFAR
       // The centralFrequency and SAP immediate kernel args must outlive kernel runs.
       delayCompensationKernel->enqueue(
         input.blockID,
-        obsParameters.subbands[input.blockID.globalSubbandIdx].centralFrequency,
-        obsParameters.subbands[input.blockID.globalSubbandIdx].SAP);
+        obsParameters.subbands[input.blockID.globalSubbandIdx].centralFrequency);
 
       bandPassCorrectionKernel->enqueue(
         input.blockID);
diff --git a/RTCP/Cobalt/GPUProc/src/SubbandProcs/CorrelatorStep.cc b/RTCP/Cobalt/GPUProc/src/SubbandProcs/CorrelatorStep.cc
index f4ffbffcca420ad705cf625fc5982484e7801820..70114959a0568730c032072b0cc5dffb40774d4e 100644
--- a/RTCP/Cobalt/GPUProc/src/SubbandProcs/CorrelatorStep.cc
+++ b/RTCP/Cobalt/GPUProc/src/SubbandProcs/CorrelatorStep.cc
@@ -100,7 +100,6 @@ namespace LOFAR
         obsParameters.blockSize / corParameters.nrChannels,
         obsParameters.clockMHz,
         obsParameters.subbandWidth,
-        obsParameters.nrSAPs,
         true, // correlator
         preParameters.delayCompensationEnabled,
         preParameters.bandPassCorrectionEnabled,
@@ -410,8 +409,7 @@ namespace LOFAR
       // The centralFrequency and SAP immediate kernel args must outlive kernel runs.
       delayAndBandPassKernel->enqueue(
         input.blockID,
-        obsParameters.subbands[input.blockID.globalSubbandIdx].centralFrequency,
-        obsParameters.subbands[input.blockID.globalSubbandIdx].SAP);
+        obsParameters.subbands[input.blockID.globalSubbandIdx].centralFrequency);
 
       correlatorKernel->enqueue(input.blockID);
 
diff --git a/RTCP/Cobalt/GPUProc/src/SubbandProcs/SubbandProc.cc b/RTCP/Cobalt/GPUProc/src/SubbandProcs/SubbandProc.cc
index ff8084153860611b0abdc2e4543cf9fec09cdd42..e996c05a3bf1042122b63a13e1074a972614b732 100644
--- a/RTCP/Cobalt/GPUProc/src/SubbandProcs/SubbandProc.cc
+++ b/RTCP/Cobalt/GPUProc/src/SubbandProcs/SubbandProc.cc
@@ -53,6 +53,7 @@ namespace LOFAR
       htodStream(new gpu::Stream(context)),
       dtohStream(new gpu::Stream(context)),
       executeStream(new gpu::Stream(context)),
+      prevSAP(-1),
       prevBlock(-1),
       totalCounter(context, "total"),
       inputCounter(context, "input"),
@@ -373,7 +374,17 @@ namespace LOFAR
 
       // Some additional buffers
       // Only upload delays if they changed w.r.t. the previous subband.
-      bool uploadDelays = (ssize_t) block != prevBlock;
+      //
+      // The delays are the same if and only if this subband differs
+      // from the previous one only by frequency (subband index).
+      // If we changed pointing (SAP) or time (block), we will have new delays.
+      // 
+      // So, upload delays if and only if either the SAP or the block
+      // has changed with respect to the previous subband that was processed.
+      //
+      // The same goes for the TAB delays below. If they're the same SAP
+      // and the same block, they're the same delays.
+      bool uploadDelays = (int)subband.SAP != prevSAP || (ssize_t)block != prevBlock;
       if (uploadDelays) {
         if (obsSap.correlatorEnabled) {
           correlatorStep->writeInput(input);
@@ -383,6 +394,7 @@ namespace LOFAR
           preprocessingStep->writeInput(input);
         }
 
+        prevSAP = subband.SAP;
         prevBlock = block;
       }
 
diff --git a/RTCP/Cobalt/GPUProc/src/SubbandProcs/SubbandProc.h b/RTCP/Cobalt/GPUProc/src/SubbandProcs/SubbandProc.h
index 21e7bd07b85684b35d859b19b75c8ea0f140e8b6..c0bb1b170f3b8aad966b2733b8764e250a4fa57d 100644
--- a/RTCP/Cobalt/GPUProc/src/SubbandProcs/SubbandProc.h
+++ b/RTCP/Cobalt/GPUProc/src/SubbandProcs/SubbandProc.h
@@ -132,6 +132,7 @@ namespace LOFAR
       // The previously processed SAP/block, or -1 if nothing has been
       // processed yet. Used in order to determine if new delays have
       // to be uploaded.
+      int prevSAP;
       ssize_t prevBlock;
 
       // @{
diff --git a/RTCP/Cobalt/GPUProc/src/SubbandProcs/SubbandProcInputData.cc b/RTCP/Cobalt/GPUProc/src/SubbandProcs/SubbandProcInputData.cc
index 5440d53d5c52b84255c577a1b6445290beaf57fc..53fafe2c790fb8b08f02cdb96a137b9c8bea658e 100644
--- a/RTCP/Cobalt/GPUProc/src/SubbandProcs/SubbandProcInputData.cc
+++ b/RTCP/Cobalt/GPUProc/src/SubbandProcs/SubbandProcInputData.cc
@@ -33,9 +33,9 @@ namespace LOFAR
                          gpu::Context &context,
                          unsigned int hostBufferFlags)
       :
-      delaysAtBegin(boost::extents[ps.settings.SAPs.size()][ps.settings.antennaFields.size()][NR_POLARIZATIONS],
+      delaysAtBegin(boost::extents[ps.settings.antennaFields.size()][NR_POLARIZATIONS],
                      context, hostBufferFlags),
-      delaysAfterEnd(boost::extents[ps.settings.SAPs.size()][ps.settings.antennaFields.size()][NR_POLARIZATIONS],
+      delaysAfterEnd(boost::extents[ps.settings.antennaFields.size()][NR_POLARIZATIONS],
                      context, hostBufferFlags),
       phase0s(boost::extents[ps.settings.antennaFields.size()][NR_POLARIZATIONS],
                      context, hostBufferFlags),
@@ -53,8 +53,8 @@ namespace LOFAR
         auto& bfPipeline = bfPipelines[i];
 
         tabDelays[i].reset(
-          new MultiDimArrayHostBuffer<double, 3>(
-            boost::extents[bfPipeline.SAPs.size()][ps.settings.antennaFields.size()][bfPipeline.maxNrCoherentTABsPerSAP()],
+          new MultiDimArrayHostBuffer<double, 2>(
+            boost::extents[ps.settings.antennaFields.size()][bfPipeline.maxNrCoherentTABsPerSAP()],
             context,
             hostBufferFlags)
         );
@@ -74,13 +74,13 @@ namespace LOFAR
       // extract and assign the delays for the station beams
 
       // X polarisation
-      delaysAtBegin[SAP][station][0]  = ps.settings.antennaFields[station].delay.x + metaData.stationBeam.delayAtBegin;
-      delaysAfterEnd[SAP][station][0] = ps.settings.antennaFields[station].delay.x + metaData.stationBeam.delayAfterEnd;
+      delaysAtBegin[station][0]  = ps.settings.antennaFields[station].delay.x + metaData.stationBeam.delayAtBegin;
+      delaysAfterEnd[station][0] = ps.settings.antennaFields[station].delay.x + metaData.stationBeam.delayAfterEnd;
       phase0s[station][0]             = ps.settings.antennaFields[station].phase0.x;
 
       // Y polarisation
-      delaysAtBegin[SAP][station][1]  = ps.settings.antennaFields[station].delay.y + metaData.stationBeam.delayAtBegin;
-      delaysAfterEnd[SAP][station][1] = ps.settings.antennaFields[station].delay.y + metaData.stationBeam.delayAfterEnd;
+      delaysAtBegin[station][1]  = ps.settings.antennaFields[station].delay.y + metaData.stationBeam.delayAtBegin;
+      delaysAfterEnd[station][1] = ps.settings.antennaFields[station].delay.y + metaData.stationBeam.delayAfterEnd;
       phase0s[station][1]             = ps.settings.antennaFields[station].phase0.y;
 
       if (ps.settings.beamFormer.enabled)
@@ -107,9 +107,9 @@ namespace LOFAR
             if (tab.coherent)
             {
               // subtract the delay that was already compensated for
-              (*tabDelays[pipelineNr])[SAP][station][coherentIdxInSAP] = (metaData.TABs[tab.coherentIdxInSAP].delayAtBegin +
-                                                                          metaData.TABs[tab.coherentIdxInSAP].delayAfterEnd) * 0.5 -
-                                                                          compensatedDelay;
+              (*tabDelays[pipelineNr])[station][coherentIdxInSAP] = (metaData.TABs[tab.coherentIdxInSAP].delayAtBegin +
+                                                                     metaData.TABs[tab.coherentIdxInSAP].delayAfterEnd) * 0.5 -
+                                                                     compensatedDelay;
               coherentIdxInSAP++;
               nrTABs++;
             }
@@ -120,7 +120,7 @@ namespace LOFAR
 
           // Zero padding entries that exist because we always produce maxNrCoherentTABsPerSAP for any subband
           for (unsigned tab = pipeline.SAPs[SAP].TABs.size(); tab < pipeline.maxNrCoherentTABsPerSAP(); tab++)
-            (*tabDelays[pipelineNr])[SAP][station][tab] = 0.0;
+            (*tabDelays[pipelineNr])[station][tab] = 0.0;
         }
 
         ASSERTSTR(nrTABs == ps.settings.beamFormer.SAPs[SAP].nrCoherent,
diff --git a/RTCP/Cobalt/GPUProc/src/SubbandProcs/SubbandProcInputData.h b/RTCP/Cobalt/GPUProc/src/SubbandProcs/SubbandProcInputData.h
index 6250168144ecbd893585d3605dad11839dfc0041..8d3c5fcb779a2f6a0d0b2e6d461afe4eddfbd0a2 100644
--- a/RTCP/Cobalt/GPUProc/src/SubbandProcs/SubbandProcInputData.h
+++ b/RTCP/Cobalt/GPUProc/src/SubbandProcs/SubbandProcInputData.h
@@ -52,16 +52,16 @@ namespace LOFAR
       // otherwise the to be computed phase shifts become too inprecise.
 
       //!< Whole sample delays at the start of the workitem      
-      MultiDimArrayHostBuffer<double, 3> delaysAtBegin;
+      MultiDimArrayHostBuffer<double, 2> delaysAtBegin;
 
       //!< Whole sample delays at the end of the workitem      
-      MultiDimArrayHostBuffer<double, 3> delaysAfterEnd;
+      MultiDimArrayHostBuffer<double, 2> delaysAfterEnd;
 
       //!< Remainder of delays
       MultiDimArrayHostBuffer<double, 2> phase0s;
 
       //!< Delays for TABs (aka pencil beams) after station beam correction
-      std::vector<std::shared_ptr<MultiDimArrayHostBuffer<double, 3>>> tabDelays;
+      std::vector<std::shared_ptr<MultiDimArrayHostBuffer<double, 2>>> tabDelays;
 
       // inputdata with flagged data set to zero
       MultiDimArrayHostBuffer<char, 4> inputSamples;
diff --git a/RTCP/Cobalt/GPUProc/src/gpu_utils.cc b/RTCP/Cobalt/GPUProc/src/gpu_utils.cc
index 8b59cd081c3a9ef4180e10288b46cdb1be83802e..9a2a937e71ee234caf9659fbadd3e22d77113a5f 100644
--- a/RTCP/Cobalt/GPUProc/src/gpu_utils.cc
+++ b/RTCP/Cobalt/GPUProc/src/gpu_utils.cc
@@ -147,6 +147,8 @@ namespace LOFAR
         std::stringstream options_stream;
         options_stream << flags;
         options_stream << defs;
+        options_stream << " -rdc=true";
+        options_stream << " -I" << CUDA_TOOLKIT_ROOT_DIR << "/include";
 
         // Create vector of compile options with strings
         vector<string> options_vector{istream_iterator<string>{options_stream}, istream_iterator<string>{}};
diff --git a/RTCP/Cobalt/GPUProc/test/Kernels/tBeamFormerKernel.cc b/RTCP/Cobalt/GPUProc/test/Kernels/tBeamFormerKernel.cc
index 5e77681fa35ed4da65ffb62690db98f0b9953cac..13ba29de2aad3e74e81a8d631c6dfdee06f70b39 100644
--- a/RTCP/Cobalt/GPUProc/test/Kernels/tBeamFormerKernel.cc
+++ b/RTCP/Cobalt/GPUProc/test/Kernels/tBeamFormerKernel.cc
@@ -72,7 +72,6 @@ int main(int argc, char *argv[])
     ps.settings.antennaFieldNames.size(),
     ps.settings.beamFormer.nrDelayCompensationChannels,
     ps.settings.blockSize / ps.settings.beamFormer.nrDelayCompensationChannels,
-    ps.settings.SAPs.size(),
     ps.settings.beamFormer.maxNrCoherentTABsPerSAP(),
     ps.settings.subbandWidth(),
     ps.settings.beamFormer.doFlysEye
@@ -88,12 +87,11 @@ int main(int argc, char *argv[])
   unique_ptr<BeamFormerKernel> kernel(factory.create(stream, devBandPassCorrectedMemory, devComplexVoltagesMemory));
 
   float subbandFreq = 60e6f;
-  unsigned sap = 0;
 
   BlockID blockId;
   // run
   for (unsigned i = 0; i < 10; i++) {
-    kernel->enqueue(blockId, subbandFreq, sap);
+    kernel->enqueue(blockId, subbandFreq);
     stream.synchronize();
   }
 
diff --git a/RTCP/Cobalt/GPUProc/test/Kernels/tDelayAndBandPassKernel.cc b/RTCP/Cobalt/GPUProc/test/Kernels/tDelayAndBandPassKernel.cc
index 2f14c7385f7f3773c83a551234ef85d04093a78e..d83a7f53f714e8a964a54c4bfcacfbc13c68a115 100644
--- a/RTCP/Cobalt/GPUProc/test/Kernels/tDelayAndBandPassKernel.cc
+++ b/RTCP/Cobalt/GPUProc/test/Kernels/tDelayAndBandPassKernel.cc
@@ -69,7 +69,6 @@ int main(int argc, char *argv[])
       ps.settings.blockSize / ps.settings.beamFormer.nrDelayCompensationChannels,
       ps.settings.clockMHz,
       ps.settings.subbandWidth(),
-      ps.settings.SAPs.size(),
       ps.settings.delayCompensation.enabled,
       correlator,
       false, // correctBandPass
@@ -86,9 +85,8 @@ int main(int argc, char *argv[])
 
   size_t subbandIdx = 0;
   float centralFrequency = ps.settings.subbands[subbandIdx].centralFrequency;
-  size_t SAP = ps.settings.subbands[subbandIdx].SAP;
   BlockID blockId;
-  kernel->enqueue(blockId, centralFrequency, SAP);
+  kernel->enqueue(blockId, centralFrequency);
   stream.synchronize();
 
   return 0;
diff --git a/RTCP/Cobalt/GPUProc/test/Kernels/tDelayAndBandPassKernel2.cc b/RTCP/Cobalt/GPUProc/test/Kernels/tDelayAndBandPassKernel2.cc
index dae560faf4aaff0b20f11adcb6e484fcd50699b6..0bf201d915e8a7eaf4fe37145e5b4d6cab2814c0 100644
--- a/RTCP/Cobalt/GPUProc/test/Kernels/tDelayAndBandPassKernel2.cc
+++ b/RTCP/Cobalt/GPUProc/test/Kernels/tDelayAndBandPassKernel2.cc
@@ -39,7 +39,6 @@ struct TestFixture
     ps.settings.blockSize / ps.settings.correlator.nrChannels,
     ps.settings.clockMHz,
     ps.settings.subbandWidth(),
-    ps.settings.SAPs.size(),
     ps.settings.delayCompensation.enabled,
     true, // correlator
     ps.settings.corrections.bandPass, // correctBandPass
diff --git a/RTCP/Cobalt/GPUProc/test/Kernels/tFIR_FilterKernel.cc b/RTCP/Cobalt/GPUProc/test/Kernels/tFIR_FilterKernel.cc
index 8bf6165cdee6c682777a207b39af061638761f8f..c674e42408a5e02b677a3aafd82aa06010e573c6 100644
--- a/RTCP/Cobalt/GPUProc/test/Kernels/tFIR_FilterKernel.cc
+++ b/RTCP/Cobalt/GPUProc/test/Kernels/tFIR_FilterKernel.cc
@@ -46,7 +46,6 @@ TEST(FIR_FilterKernel)
       // ratio of outputs for 1 and 3 above should give us back the applied correction
 
       // some constants (not in the parset)
-      const size_t NR_SAPS=1;
       const size_t NR_POLARIZATIONS=2;
       const size_t COMPLEX=2;
       const double subbandFreq=50e6;
@@ -160,13 +159,11 @@ TEST(FIR_FilterKernel)
 
       KernelFactory<FIR_FilterKernel> factory_dop(params_dop);
 
-      MultiDimArrayHostBuffer<double, 3> delaysAtBegin(boost::extents
-                         [NR_SAPS] 
+      MultiDimArrayHostBuffer<double, 2> delaysAtBegin(boost::extents
                          [ps.settings.antennaFields.size()] //NR_DELAYS
                          [NR_POLARIZATIONS], 
                          context);
-      MultiDimArrayHostBuffer<double, 3> delaysAfterEnd(boost::extents
-                         [NR_SAPS] 
+      MultiDimArrayHostBuffer<double, 2> delaysAfterEnd(boost::extents
                          [ps.settings.antennaFields.size()] //NR_DELAYS
                          [NR_POLARIZATIONS], 
                          context);
diff --git a/RTCP/Cobalt/GPUProc/test/cuda/tDelayAndBandPass.cc b/RTCP/Cobalt/GPUProc/test/cuda/tDelayAndBandPass.cc
index f78dab5af26fdbd43884b80b0dadefefbaa0b571..c54636cea8a4fcb607588e80408dff4e192bcb42 100644
--- a/RTCP/Cobalt/GPUProc/test/cuda/tDelayAndBandPass.cc
+++ b/RTCP/Cobalt/GPUProc/test/cuda/tDelayAndBandPass.cc
@@ -57,7 +57,6 @@ const unsigned NR_SAMPLES_PER_SUBBAND = NR_SAMPLES_PER_CHANNEL * NR_CHANNELS;
 const unsigned NR_BITS_PER_SAMPLE = 8;
 const unsigned NR_POLARIZATIONS = 2;
 
-const unsigned NR_SAPS = 8;
 const double SUBBAND_BANDWIDTH = 0.0 * NR_CHANNELS;
 const bool BANDPASS_CORRECTION = true;
 const bool DELAY_COMPENSATION = false;
@@ -72,12 +71,11 @@ void runKernel(gpu::Function kfunc,
                MultiDimArrayHostBuffer<fcomplex, 4> &outputData,
                MultiDimArrayHostBuffer<T,        4> &inputData,
                MultiDimArrayHostBuffer<unsigned, 1> &delayIndices,
-               MultiDimArrayHostBuffer<double,   3> &delaysAtBegin,
-               MultiDimArrayHostBuffer<double,   3> &delaysAfterEnd,
+               MultiDimArrayHostBuffer<double,   2> &delaysAtBegin,
+               MultiDimArrayHostBuffer<double,   2> &delaysAfterEnd,
                MultiDimArrayHostBuffer<double,   2> &phase0s,
                MultiDimArrayHostBuffer<float,    1> &bandPassFactors,
                double subbandFrequency,
-               unsigned beam,
                bool transpose)
 {
   gpu::Context ctx(stream->getContext());
@@ -94,11 +92,10 @@ void runKernel(gpu::Function kfunc,
   kfunc.setArg(1, devInput);
   kfunc.setArg(2, devStationIndices);
   kfunc.setArg(3, subbandFrequency);
-  kfunc.setArg(4, beam);
-  kfunc.setArg(5, devDelaysAtBegin);
-  kfunc.setArg(6, devDelaysAfterEnd);
-  kfunc.setArg(7, devPhase0s);
-  kfunc.setArg(8, devBandPassFactors);
+  kfunc.setArg(4, devDelaysAtBegin);
+  kfunc.setArg(5, devDelaysAfterEnd);
+  kfunc.setArg(6, devPhase0s);
+  kfunc.setArg(7, devBandPassFactors);
 
   // Overwrite devOutput, so result verification is more reliable.
   stream->writeBuffer(devOutput,          outputData);
@@ -160,8 +157,6 @@ CompileDefinitions getDefaultCompileDefinitions()
     boost::lexical_cast<string>(NR_BITS_PER_SAMPLE);
   defs["NR_POLARIZATIONS"] =
     boost::lexical_cast<string>(NR_POLARIZATIONS);
-  defs["NR_SAPS"] =
-    boost::lexical_cast<string>(NR_SAPS);
   defs["SUBBAND_BANDWIDTH"] =
     boost::lexical_cast<string>(SUBBAND_BANDWIDTH);
 
@@ -178,7 +173,6 @@ CompileDefinitions getDefaultCompileDefinitions()
 // It is the value type of the data input array.
 vector<fcomplex> runTest(const CompileDefinitions& compileDefs,
                          double subbandFrequency,
-                         unsigned beam,
                          double delayBegin,
                          double delayEnd,
                          double phase0,
@@ -231,13 +225,11 @@ vector<fcomplex> runTest(const CompileDefinitions& compileDefs,
                                                    [NR_STATIONS],
                                                    ctx);
 
-  MultiDimArrayHostBuffer<double, 3> delaysAtBegin(boost::extents
-                                                   [NR_SAPS]
+  MultiDimArrayHostBuffer<double, 2> delaysAtBegin(boost::extents
                                                    [NR_DELAYS]
                                                    [NR_POLARIZATIONS],
                                                    ctx);
-  MultiDimArrayHostBuffer<double, 3> delaysAfterEnd(boost::extents
-                                                    [NR_SAPS]
+  MultiDimArrayHostBuffer<double, 2> delaysAfterEnd(boost::extents
                                                     [NR_DELAYS]
                                                     [NR_POLARIZATIONS],
                                                     ctx);
@@ -280,7 +272,7 @@ vector<fcomplex> runTest(const CompileDefinitions& compileDefs,
 
   runKernel(kfunc, *outputData, *inputData, delayIndices,
             delaysAtBegin, delaysAfterEnd, phase0s, bandPassFactors,
-            subbandFrequency, beam, compileDefs.find("DO_TRANSPOSE") != compileDefs.end());
+            subbandFrequency, compileDefs.find("DO_TRANSPOSE") != compileDefs.end());
 
   // Tests that use this function only check the first and last 2 output floats.
   const unsigned nrResultVals = 2;
@@ -307,7 +299,6 @@ TEST(BandPass)
   vector<fcomplex> results(runTest(
                              defs,
                              0.0, // sb freq
-                             0U,  // beam
                              0.0, // delays begin
                              0.0, // delays end
                              0.0, // phase offsets
@@ -332,7 +323,6 @@ TEST(Phase0s)
   vector<fcomplex> results(runTest(
                              defs,
                              1.0,    // sb freq
-                             0U,     // beam
                              0.0,    // delays begin
                              0.0,    // delays end
                              -M_PI,  // phase offsets
@@ -361,7 +351,6 @@ SUITE(DelayCompensation)
     vector<fcomplex> results(runTest(
                                defs,
                                1.0,    // sb freq
-                               0U,     // beam
                                1.0,    // delays begin
                                1.0,    // delays end
                                0.0,    // phase offsets
@@ -458,7 +447,6 @@ SUITE(DelayCompensation)
     vector<fcomplex> results(runTest(
                                defs,
                                1.0,    // sb freq
-                               0U,     // beam
                                1.0,    // delays begin
                                0.0,    // delays end
                                0.0,    // phase offsets
@@ -539,7 +527,6 @@ TEST(AllAtOnce)
   vector<fcomplex> results(runTest(
                              defs,
                              1.0,    // sb freq
-                             0U,     // beam
                              1.0,    // delays begin
                              0.0,    // delays end
                              -1.0,   // phase offsets (-1 rad)
diff --git a/SAS/QPIDInfrastructure/amqp-infra-setup.sh b/SAS/QPIDInfrastructure/amqp-infra-setup.sh
index bca1dd197a4591f2b923c83e65a1af428b5eb484..27a5abbc5722858328363c6486ad036dddb928b4 100755
--- a/SAS/QPIDInfrastructure/amqp-infra-setup.sh
+++ b/SAS/QPIDInfrastructure/amqp-infra-setup.sh
@@ -42,6 +42,7 @@ else
 fi
 
 # MessageBus
+qpid-config -b $CCU add exchange topic ${PREFIX}mac.task.feedback.state --durable
 qpid-config -b $CCU add queue ${PREFIX}mac.task.feedback.state --durable
 qpid-config -b $MCU del queue topic ${PREFIX}otdb.task.feedback.dataproducts --durable
 qpid-config -b $MCU add exchange topic ${PREFIX}otdb.task.feedback.dataproducts --durable
diff --git a/SAS/TMSS/backend/bin/tmss.ini b/SAS/TMSS/backend/bin/tmss.ini
index bd83c45c23dcd4b903aa00e99f1575ed156f2bd4..ffe03e35834eb5ed4f08707d7d316c62ff885141 100644
--- a/SAS/TMSS/backend/bin/tmss.ini
+++ b/SAS/TMSS/backend/bin/tmss.ini
@@ -1,5 +1,5 @@
 [program:tmss]
-command=docker run --rm --net=host -u 7149:7149 -v /opt/lofar/var/log:/opt/lofar/var/log -v /tmp/tmp -v /etc/passwd:/etc/passwd:ro -v /etc/group:/etc/group:ro -v /localhome/lofarsys:/localhome/lofarsys -e HOME=/localhome/lofarsys -e USER=lofarsys nexus.cep4.control.lofar:18080/tmss_django:latest /bin/bash -c 'source ~/.lofar/.lofar_env;source $LOFARROOT/lofarinit.sh;exec tmss_test_environment --host $TMSS_HOST --public_host $TMSS_HOST --port $TMSS_PORT --schemas --viewflow_app --DB_ID=TMSS --LDAP_ID=TMSS_LDAP --REST_CLIENT_ID=TMSSClient'
+command=docker run --rm --net=host -u 7149:7149 -v /opt/lofar/var/log:/opt/lofar/var/log -v /tmp/tmp -v /etc/passwd:/etc/passwd:ro -v /etc/group:/etc/group:ro -v /localhome/lofarsys:/localhome/lofarsys -e HOME=/localhome/lofarsys -e USER=lofarsys nexus.cep4.control.lofar:18080/tmss_django:latest /bin/bash -c 'source ~/.lofar/.lofar_env;source $LOFARROOT/lofarinit.sh;exec tmss_test_environment --host $TMSS_HOST --public_host $TMSS_HOST --port $TMSS_PORT --schemas --permissions --viewflow_app --DB_ID=TMSS --LDAP_ID=TMSS_LDAP --REST_CLIENT_ID=TMSSClient'
 priority=100
 user=lofarsys
 stopsignal=INT ; KeyboardInterrupt
diff --git a/SAS/TMSS/backend/services/scheduling/lib/constraints/template_constraints_v1.py b/SAS/TMSS/backend/services/scheduling/lib/constraints/template_constraints_v1.py
index 4977850b8a65479a9f7a205ae3e6ed6731828c76..45c2c1e56c6e2be20604a3f1ca3b20e56f8d9a24 100644
--- a/SAS/TMSS/backend/services/scheduling/lib/constraints/template_constraints_v1.py
+++ b/SAS/TMSS/backend/services/scheduling/lib/constraints/template_constraints_v1.py
@@ -302,7 +302,7 @@ def can_run_anywhere_within_timewindow_with_sky_constraints(scheduling_unit: mod
                                 else:
                                     logger.info('min_target_elevation=%s constraint is not met at timestamp=%s' % (min_elevation.rad, timestamps[i]))
                                 return False
-                if 'transit_offset' in constraints['sky'] and 'from' in constraints['sky']['transit_offset'] and task['specifications_template'] == 'target observation':
+                if False: #TODO: re-enable transit_offset after summer holiday. 'transit_offset' in constraints['sky'] and 'from' in constraints['sky']['transit_offset'] and task['specifications_template'] == 'target observation':
                     # Check constraint on tile beam for HBA only:
                     if task['specifications_doc']['antenna_set'].startswith('HBA'):
                         # since the constraint only applies to the middle of the obs, consider its duration
@@ -330,7 +330,7 @@ def can_run_anywhere_within_timewindow_with_sky_constraints(scheduling_unit: mod
                                     return False
 
             if 'SAPs' in task['specifications_doc']:
-                if 'transit_offset' in constraints['sky']  and 'from' in constraints['sky']['transit_offset'] and task['specifications_template'] == 'target observation':
+                if False: #TODO: re-enable transit_offset after summer holiday. 'transit_offset' in constraints['sky']  and 'from' in constraints['sky']['transit_offset'] and task['specifications_template'] == 'target observation':
                     # Check constraint on SAPs for LBA only:
                     if task['specifications_doc']['antenna_set'].startswith('LBA'):
                         # since the constraint only applies to the middle of the obs, consider its duration
diff --git a/SAS/TMSS/backend/src/tmss/authentication_backends.py b/SAS/TMSS/backend/src/tmss/authentication_backends.py
index a7b241c5ad94f7cc71b9086b1400a19378a805ee..c2be6889af9e798f52a33843b26326fbad098f31 100644
--- a/SAS/TMSS/backend/src/tmss/authentication_backends.py
+++ b/SAS/TMSS/backend/src/tmss/authentication_backends.py
@@ -25,7 +25,7 @@ class TMSSOIDCAuthenticationBackend(OIDCAuthenticationBackend):
                             project_roles.append({'project': project_name, 'role': role_name})
                         else:
                             logger.error('could not handle entitlement=%s because no project role exists that matches the entitlement role=%s' % (entitlement, role_name))
-                    elif ':' not in entitlement:
+                    elif ':' not in project_entitlement:
                         # TMSS only has project roles, we interpret 'general' membership in a project as a co_i role,
                         # but may make that explicit in Keycloak later on
                         project_roles.append({'project': entitlement, 'role': 'co_i'})
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/feedback.py b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/feedback.py
index fcd2776303446c70bf87d29f918f3376d0362d85..33d199563372f60eb344606ea4c46948bf211795 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/feedback.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/feedback.py
@@ -198,7 +198,8 @@ def pulsar_pipeline_summary_feedback_to_feedback_doc(dp_feedback: dict) -> dict:
 
     feedback_doc = {
         "percentage_written": int(dp_feedback['percentageWritten']),
-        "files": parse_parset_vector(dp_feedback['fileContent'], parameterset.getStringVector),
+        # set of files must be unique, but PULP sends us duplicates 
+        "files": list(set(parse_parset_vector(dp_feedback['fileContent'], parameterset.getStringVector))),
         "target": {
             "coherent": dp_feedback['datatype'] != "SummaryIncoherentStokes"
         }
@@ -223,7 +224,8 @@ def pulsar_pipeline_analysis_feedback_to_feedback_doc(input_dp_feedback_doc: dic
 
     feedback_doc = {
         "percentage_written": int(dp_feedback['percentageWritten']),
-        "files": parse_parset_vector(dp_feedback['fileContent'], parameterset.getStringVector),
+        # set of files must be unique, but PULP sends us duplicates 
+        "files": list(set(parse_parset_vector(dp_feedback['fileContent'], parameterset.getStringVector))),
         "frequency": {
             "subbands": parse_parset_vector(dp_feedback[beam_prefix + 'stationSubbands'], parameterset.getIntVector),
             "central_frequencies": parse_parset_vector(dp_feedback[beam_prefix + 'centralFrequencies'], parameterset.getDoubleVector),
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/keycloak.py b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/keycloak.py
index 9d1e8ee55756dec1cdfc40e3e9c51c4a9b2f7e6e..94852a52d588946b1a3cf6b495bbb31e44d8623d 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/keycloak.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/keycloak.py
@@ -5,7 +5,7 @@ import os
 import json
 import re
 from lofar.sas.tmss.tmss.exceptions import TMSSException
-
+from lofar.sas.tmss.tmss.tmssapp import models
 logger = logging.Logger(__name__)
 
 KEYCLOAK_TOKEN_URL = os.environ.get('KEYCLOAK_TOKEN_URL', 'https://sdc-dev.astron.nl/auth/realms/master/protocol/openid-connect/token')
@@ -67,29 +67,43 @@ def get_project_persons():
             project_detail = ksession.get(url='%s/groups/%s/' % (KEYCLOAK_API_BASE_URL, project['id']))
             attributes = project_detail.get('attributes', {})
 
-            role_keys = {'pi': 'lofarProjectPI',
-                         'friend_of_project': 'lofarProjectFriend',
-                         'contact': 'lofarProjectContactauthor'}
-            for role, key in role_keys.items():
-                users = attributes.get(key, [])
-                # convert user list to something we can use in TMSS
+            legacy_role_keys = {'pi': 'lofarProjectPI',
+                                'friend_of_project': 'lofarProjectFriend',
+                                'contact': 'lofarProjectContactauthor'}
+
+            for project_role in models.ProjectRole.Choices:
+                # get role attribute from project:
+                role = project_role.value
+                users = attributes.get(role, [])
+                # fall back to legacy-style attribute:
+                if not users and role in legacy_role_keys:
+                    users = attributes.get(legacy_role_keys[role], [])
+
+                # convert user list (LDAP DNs) to something we can use in TMSS (email)
                 user_map = get_user_mapping()
-                # todo: find a way to replicate the exact string representation Keycloak uses (where to get the title from?), instead of the following unsafe hack
-                unmappable_users = [user for user in users if user not in user_map]
-                mapped_users = [user_map[user] for user in users if user in user_map]
+                mapped_users = [user_map[user] for user in users if user in user_map]  # email list of referenced users
+                unmappable_users = [user for user in users if user not in user_map]  # list of references for which no account was found
                 for unmappable_user in unmappable_users:
-                    unmappable_user_fixed = re.sub('Dr\.', '', unmappable_user)
-                    unmappable_user_fixed = re.sub('Prof\.', '', unmappable_user_fixed)
-                    unmappable_user_fixed = re.sub('ir\.', '', unmappable_user_fixed)
-                    unmappable_user_fixed = re.sub('Ir\.', '', unmappable_user_fixed)
-                    unmappable_user_fixed = re.sub('apl\.', '', unmappable_user_fixed)
-                    unmappable_user_fixed = re.sub(' +', ' ', unmappable_user_fixed)
-
-                    if unmappable_user_fixed in user_map:
-                        mapped_users.append(user_map[unmappable_user_fixed])
-                    else:
-                        logger.warning("Could not match Keycloak user reference '%s' to a known user. Will " % unmappable_user)
-                        mapped_users.append(unmappable_user)
+                    # Note: Usually Keycloak should return DN references to user accounts. For PI's, someone had the
+                    # great idea to allow to specify a freeform string instead, to refer to people who may or may not
+                    # have an account. Even if the person has a user account, there is no way to replicate the exact
+                    # string 'representation' Keycloak returns, since the string may contain typos, or info that is not
+                    # stored in the user accounts (like titles).
+                    # The following unsafe hack tries to determine whether there is a user account that matches the
+                    # name given in the string (ignore titles since they are not part of the user account):
+                    # unmappable_user_fixed = re.sub('Dr\.', '', unmappable_user)
+                    # unmappable_user_fixed = re.sub('Prof\.', '', unmappable_user_fixed)
+                    # unmappable_user_fixed = re.sub('ir\.', '', unmappable_user_fixed)
+                    # unmappable_user_fixed = re.sub('Ir\.', '', unmappable_user_fixed)
+                    # unmappable_user_fixed = re.sub('apl\.', '', unmappable_user_fixed)
+                    # unmappable_user_fixed = re.sub(' +', ' ', unmappable_user_fixed)
+                    #
+                    # if unmappable_user_fixed in user_map:
+                    #     mapped_users.append(user_map[unmappable_user_fixed])
+                    # else:
+                        logger.warning("Could not match Keycloak user reference '%s' to a known user." % unmappable_user)
+                        if not unmappable_user.startswith('cn='):
+                            logger.warning("LOFAR allowed to reference a person by a freeform string instead of a user account. '%s' seems to be such a legacy reference. This needs to be fixed in the identity management." % unmappable_user)
                 project_persons_map.setdefault(project['name'], {})[role] = mapped_users
 
     return project_persons_map
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/parset.py b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/parset.py
index 336dae4cfb0b4f41aada4bfc4cb778e41779953c..b73398bc04b11936b24d6f2accf602ec0c3136c8 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/parset.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/parset.py
@@ -22,7 +22,7 @@ from lofar.sas.tmss.tmss.tmssapp.models.specification import Dataformat, Datatyp
 from lofar.sas.tmss.tmss.exceptions import ConversionException
 from lofar.parameterset import parameterset
 from lofar.common.datetimeutils import formatDatetime
-from lofar.common.json_utils import add_defaults_to_json_object_for_schema, resolved_refs
+from lofar.common.json_utils import add_defaults_to_json_object_for_schema, resolved_remote_refs
 from lofar.stationmodel.antennafields import antenna_fields
 from lofar.sas.tmss.tmss.exceptions import *
 from datetime import datetime
@@ -156,8 +156,11 @@ def _convert_beamformer_settings_to_parset_dict(subtask: models.Subtask, spec: d
     # Process beamformer pipelines
     for pipeline_idx, pipeline in enumerate(spec['COBALT']['beamformer']['tab_pipelines']):
         pipeline_parset = {}
-        pipeline_parset.update(_add_prefix(_stokes_settings_parset_subkeys(pipeline['coherent']), "CoherentStokes."))
-        pipeline_parset.update(_add_prefix(_stokes_settings_parset_subkeys(pipeline['incoherent']), "IncoherentStokes."))
+        if 'coherent' in pipeline:
+            pipeline_parset.update(_add_prefix(_stokes_settings_parset_subkeys(pipeline['coherent']), "CoherentStokes."))
+
+        if 'incoherent' in pipeline:
+            pipeline_parset.update(_add_prefix(_stokes_settings_parset_subkeys(pipeline['incoherent']), "IncoherentStokes."))
 
         pipeline_parset['nrBeams'] = len(pipeline['SAPs'])
         for sap in pipeline['SAPs']:
@@ -165,9 +168,7 @@ def _convert_beamformer_settings_to_parset_dict(subtask: models.Subtask, spec: d
 
             pipeline_parset['Beam[%s].nrTiedArrayBeams' % sap_idx] = len(sap['tabs'])
             for tab_idx, tab in enumerate(sap['tabs']):
-                coherent = tab['coherent']
-
-                if coherent:
+                if tab.get('coherent'):
                     pipeline_parset['Beam[%s].TiedArrayBeam[%s].coherent'      % (sap_idx, tab_idx)] = True
                     pipeline_parset['Beam[%s].TiedArrayBeam[%s].directionType' % (sap_idx, tab_idx)] = tab['pointing']['direction_type']
                     pipeline_parset['Beam[%s].TiedArrayBeam[%s].angle1'        % (sap_idx, tab_idx)] = tab['pointing']['angle1']
@@ -191,8 +192,8 @@ def _convert_beamformer_settings_to_parset_dict(subtask: models.Subtask, spec: d
                                        and dp.specifications_doc["identifiers"]["tab_index"] == tab_idx
                                        and dp.specifications_doc["identifiers"]["stokes_index"] == s
                                        and dp.specifications_doc["identifiers"]["part_index"] == p
-                                       and dp.specifications_doc.get("coherent") == tab['coherent']]
-                        if tab['coherent']:
+                                       and dp.specifications_doc.get("coherent") == tab.get('coherent')]
+                        if tab.get('coherent'):
                             coherent_dataproducts.append(dataproduct[0] if dataproduct else null_dataproduct)
                         else:
                             incoherent_dataproducts.append(dataproduct[0] if dataproduct else null_dataproduct)
@@ -220,7 +221,7 @@ def _convert_beamformer_settings_to_parset_dict(subtask: models.Subtask, spec: d
             sap_idx = _sap_index(digi_beams, sap['name'])
 
             # Generate coherent TABs for each antenna field
-            stations = pipeline['stations'] or spec['stations']['station_list']
+            stations = pipeline.get('stations') or spec['stations']['station_list']
             antennaset = spec['stations']['antenna_set']
             fields = sum([list(antenna_fields(station, antennaset)) for station in stations], [])
 
@@ -291,7 +292,7 @@ def _convert_beamformer_settings_to_parset_dict(subtask: models.Subtask, spec: d
 
 def _convert_to_parset_dict_for_observationcontrol_schema(subtask: models.Subtask) -> dict:
     # make sure the spec is complete (including all non-filled in properties with default)
-    spec = add_defaults_to_json_object_for_schema(subtask.specifications_doc, resolved_refs(subtask.specifications_template.schema))
+    spec = add_defaults_to_json_object_for_schema(subtask.specifications_doc, resolved_remote_refs(subtask.specifications_template.schema))
 
     # -----------------------------------------------------------------------------------------------
     # Historic rationale: in TMSS-183 we made MAC run an actual observation from a TMSS specification.
@@ -386,10 +387,10 @@ def _convert_to_parset_dict_for_observationcontrol_schema(subtask: models.Subtas
     # ----------------------------
 
     # Retrieve the scheduling_unit_blueprint to get piggyback values to set
-    sub_set = [tb.scheduling_unit_blueprint for tb in subtask.task_blueprints.all()]
+    sub_set = set([tb.scheduling_unit_blueprint for tb in subtask.task_blueprints.all()])
     if len(sub_set) != 1:
         raise ConversionException('Subtask id=%s cannot be converted to parset because it references task blueprint that belong to different scheduling unit blueprints=%s' % (subtask.id, sub_set))
-    sub = sub_set[0]
+    sub = sub_set.pop()
 
     parset["prefix"] = "LOFAR."
     parset["Observation.claimPeriod"] = 35
@@ -421,7 +422,7 @@ def _common_parset_dict_for_pipeline_schemas(subtask: models.Subtask) -> dict:
     parset = dict()
 
     # make sure the spec is complete (including all non-filled in properties with default)
-    spec = add_defaults_to_json_object_for_schema(subtask.specifications_doc, subtask.specifications_template.schema)
+    spec = add_defaults_to_json_object_for_schema(subtask.specifications_doc, resolved_remote_refs(subtask.specifications_template.schema))
 
     # General
     parset["prefix"] = "LOFAR."
@@ -452,7 +453,7 @@ def _convert_to_parset_dict_for_preprocessing_pipeline_schema(subtask: models.Su
     # see https://support.astron.nl/confluence/pages/viewpage.action?spaceKey=TMSS&title=UC1+JSON
 
     # make sure the spec is complete (including all non-filled in properties with default)
-    spec = add_defaults_to_json_object_for_schema(subtask.specifications_doc, subtask.specifications_template.schema)
+    spec = add_defaults_to_json_object_for_schema(subtask.specifications_doc, resolved_remote_refs(subtask.specifications_template.schema))
 
     # -----------------------------------------------------------------------------------------------
     # Historic rationale: in TMSS-183 we made MAC run an actual observation from a TMSS specification.
@@ -618,7 +619,7 @@ def _convert_to_parset_dict_for_preprocessing_pipeline_schema(subtask: models.Su
 
 def _convert_to_parset_dict_for_pulsarpipeline_schema(subtask: models.Subtask) -> dict:
     # make sure the spec is complete (including all non-filled in properties with default)
-    spec = add_defaults_to_json_object_for_schema(subtask.specifications_doc, subtask.specifications_template.schema)
+    spec = add_defaults_to_json_object_for_schema(subtask.specifications_doc, resolved_remote_refs(subtask.specifications_template.schema))
 
     # General
     parset = _common_parset_dict_for_pipeline_schemas(subtask)
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py
index 90336cab44e9e41b4bad8605d2fdc1f61723d318..da7366fec6ee8b11140ea7121902d273f8f83552 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py
@@ -1,39 +1,42 @@
 from django.db.models import F, Sum
 from lofar.sas.tmss.tmss.tmssapp import models
 from lofar.sas.tmss.tmss.tmssapp import serializers
+from lofar.sas.tmss.services.scheduling.constraints.template_constraints_v1 import get_target_observation_task_name_from_requirements_doc
 
 from rest_framework.request import Request
 from datetime import datetime, timedelta
-
+from dateutil.relativedelta import relativedelta
 
 # Cycle Report
 
-def create_cycle_report(request: Request, cycle: models.Cycle) -> {}:
+
+def create_cycle_report(request: Request, cycle: models.Cycle, start: datetime, stop: datetime) -> {}:
     """
     Create a cycle report as a JSON object.
     """
     result = {'cycle': cycle.pk,
-              'telescope_time_distribution': _get_telescope_time_distribution(cycle),
-              'average_efficiency': _get_average_efficiency(cycle),
-              'completion_level': _get_completion_level(cycle),
-              'observation_hours_per_category': _get_observation_hours_per_category(cycle),
-              'weekly_efficiency': _get_weekly_efficiency(cycle),
-              'data_ingested_per_site_and_category': _get_data_ingested_per_site_and_category(cycle),
-              'projects_summary': _get_projects_summary(request, cycle),
-              'usage_mode': _get_usage_mode(cycle),
-              'failures': _get_failures(cycle),
+              'telescope_time_distribution': _get_telescope_time_distribution(cycle, start, stop),
+              'average_efficiency': _get_average_efficiency(cycle, start, stop),
+              'completion_level': _get_completion_level(cycle, start, stop),
+              'observation_hours_per_category': _get_observation_hours_per_category(cycle, start, stop),
+              'weekly_efficiency': _get_weekly_efficiency(cycle, start, stop),
+              'data_ingested_per_site_and_category': _get_data_ingested_per_site_and_category(cycle, start, stop),
+              'projects_summary': _get_projects_summary(request, cycle, start, stop),
+              'usage_mode': _get_usage_mode(cycle, start, stop),
+              'failures': _get_failures(cycle, start, stop),
               }
 
     return result
 
 
-def _get_telescope_time_distribution(cycle: models.Cycle) -> {}:
+def _get_telescope_time_distribution(cycle: models.Cycle, start: datetime, stop: datetime) -> {}:
     """
     Help function to retrieve telescope time distribution info.
     """
+    from lofar.sas.tmss.tmss.workflowapp.models.schedulingunitflow import SchedulingUnitProcess
+
     result = {}
 
-    # TODO: Add SYSTEM/IDLE
     # Consider UNASSIGNED and FILLER as categories for the purposes of reporting
     categories = ['UNASSIGNED', 'FILLER', ] + [c for c in models.ProjectCategory.Choices]
     for c in categories:
@@ -41,141 +44,171 @@ def _get_telescope_time_distribution(cycle: models.Cycle) -> {}:
         projects = models.Project.objects.filter(cycles=cycle, project_category=c.value) if (c != 'UNASSIGNED' and c != 'FILLER') \
             else models.Project.objects.filter(cycles=cycle, filler=True) if c == 'FILLER' \
             else models.Project.objects.filter(cycles=cycle, project_category__isnull=True)
-        # TODO: Use QA workflow flag to get successful or failed SUBs, instead of SUBs' states.
-        #       At the moment just return some 0 placeholder values.
-        # for p in projects:
-        #     # Get durations for single project and aggregate to get the totals
-        #     # Note: We can filter observations by considering observed_duration in the SUB, for now. See TMSS-610.
-        #     _, durations = _get_subs_and_durations_from_project(p)
-        #     total += durations['total']
-        #     succeeded += durations['total_succeeded']
-        #     failed += durations['total_failed']
+        for p in projects:
+            # Get durations for single project
+            subs = models.SchedulingUnitBlueprint.objects.filter(draft__scheduling_set__project=p.pk)
+            for sub in subs:
+                if sub.observed_duration and sub.observed_start_time >= start and sub.observed_end_time <= stop:
+                    sup = SchedulingUnitProcess.objects.filter(su=sub).first()
+                    # Aggregate total, successful and failed durations
+                    total += sub.observed_duration.total_seconds()
+                    succeeded += sub.observed_duration.total_seconds() if sup and sup.results_accepted else 0
+                    failed += sub.observed_duration.total_seconds() if sup and sup.results_accepted is False else 0
+        # Calculate derived and store durations
         idle = total - succeeded - failed
-        result[c if c == 'UNASSIGNED' or c == 'FILLER' else c.name] = {'durations': {'total': total, 'succeeded': succeeded,
-                                                                       'failed': failed, 'idle': idle}}
+        succeeded_perc = round(succeeded / total, 2) if total > 0 else None
+        failed_perc = round(failed / total, 2) if total > 0 else None
+        idle_perc = round(idle / total, 2) if total > 0 else None
+        durations = {'total': total, 'succeeded': succeeded, 'succeeded_perc': succeeded_perc, 'failed': failed, 'failed_perc': failed_perc, 'idle': idle, 'idle_perc': idle_perc}
+        result[c if c == 'UNASSIGNED' or c == 'FILLER' else c.name] = {'durations': durations}
 
     return result
 
 
-def _get_average_efficiency(cycle: models.Cycle) -> {}:
+def _get_average_efficiency(cycle: models.Cycle, start: datetime, stop: datetime) -> {}:
     """
     Help function to retrieve the average efficiency with total and total successful obs durations per day.
     """
-    result = {'target': '0.65'}  # TODO: Default efficiency is 65%. Change it properly when it will be implemented.
+    from lofar.sas.tmss.tmss.workflowapp.models.schedulingunitflow import SchedulingUnitProcess
+
+    result = {'target': 0.65}  # TODO: Default efficiency is 65%. Change it properly when it will be implemented.
     efficiency_per_day = 0
 
     # Get SchedulingUnitBlueprints related to the cycle
     subs = models.SchedulingUnitBlueprint.objects.filter(draft__scheduling_set__project__cycles=cycle.pk)
 
-    # Get start and stop
-    start, stop = cycle.start, cycle.stop
-
     # Iterate through days and sum durations per day
     i, step, d = 0, timedelta(hours=24), start
     while d < stop:
         total_per_day = 0
         total_succeeded_per_day = 0
         for sub in subs:
-            # TODO: This loop takes too much time.
-            total_per_day += sub.observed_duration.total_seconds() if sub.observed_duration and \
-                                                                      d <= sub.observed_start_time < d + step and \
-                                                                      sub.observed_end_time < d + step else 0
-            # TODO: Use QA workflow flag to get successful or failed SUBs, instead of SUBs' states.
-            #       At the moment just return some 0 placeholder values.
-            # total_succeeded_per_day += sub.observed_duration.total_seconds() \
-            #     if sub.observed_duration and sub.status == 'finished' and \
-            #        d <= sub.observed_start_time < d + step and sub.observed_end_time < d + step else 0
+            # Aggregate total and successful durations
+            if sub.observed_duration and d <= sub.observed_start_time < d + step and sub.observed_end_time < d + step:
+                sup = SchedulingUnitProcess.objects.filter(su=sub).first()
+                total_per_day += sub.observed_duration.total_seconds()
+                total_succeeded_per_day += sub.observed_duration.total_seconds() if sup and sup.results_accepted else 0
         efficiency_per_day += total_succeeded_per_day / total_per_day if total_per_day > 0 else 0
         i += 1
         d += step
 
     # Store the efficiency averaged over the entire cycle
-    result['efficiency'] = efficiency_per_day / i if efficiency_per_day > 0 else None
+    result['efficiency'] = round(efficiency_per_day / i, 2) if efficiency_per_day > 0 else None
     return result
 
 
-def _get_completion_level(cycle: models.Cycle) -> {}:
+def _get_completion_level(cycle: models.Cycle, start: datetime, stop: datetime) -> {}:
     """
     Help function to retrieve the completion level info.
     """
-    result = {'target': '0.0'}  # TODO: Change it properly when it will be implemented.
+    from lofar.sas.tmss.tmss.workflowapp.models.schedulingunitflow import SchedulingUnitProcess
+
+    # TODO: Change it properly when it will be implemented.
+    result = {'target': 0.0}
 
     # Get SchedulingUnitBlueprints related to the cycle
     subs = models.SchedulingUnitBlueprint.objects.filter(draft__scheduling_set__project__cycles=cycle.pk)
 
-    total = 0
-    total_succeeded = 0
+    total, total_succeeded = 0, 0
     for sub in subs:
-        total += sub.observed_duration.total_seconds() if sub.observed_duration else 0
-        # TODO: Use QA workflow flag to get successful SUBs, instead of SUBs' states.
-        #       At the moment just return some 0 placeholder values.
-        # total_succeeded += sub.observed_duration.total_seconds() if sub.observed_duration and sub.status == 'finished' else 0
-    result['total'], result['succeeded'] = total, total_succeeded
+        # Aggregate total and successful durations
+        if sub.observed_duration and sub.observed_start_time >= start and sub.observed_end_time <= stop:
+            sup = SchedulingUnitProcess.objects.filter(su=sub).first()
+            total += sub.observed_duration.total_seconds()
+            total_succeeded += sub.observed_duration.total_seconds() if sup and sup.results_accepted else 0
+    # Store durations
+    succeeded_perc = round(total_succeeded / total, 2) if total > 0 else None
+    result['total'], result['succeeded'], result['succeeded_perc'] = total, total_succeeded, succeeded_perc
+
+    # Calculate prognosis
+    unschedulable_subtasks = models.Subtask.objects.filter(task_blueprints__scheduling_unit_blueprint__in=subs).filter(state='unschedulable')
+    unschedulable_duration = sum([uns.duration.total_seconds() for uns in unschedulable_subtasks])
+    result['prognosis'] = round(unschedulable_duration / total, 2) if total > 0 else None
 
     return result
 
 
-def _get_observation_hours_per_category(cycle: models.Cycle) -> {}:
+def _get_observation_hours_per_category(cycle: models.Cycle, start: datetime, stop: datetime) -> {}:
     """
     Help function to retrieve observation hours per category info.
     """
-    result = {'total_duration_failed': 0, 'total_duration_idle': 0}
+    from lofar.sas.tmss.tmss.workflowapp.models.schedulingunitflow import SchedulingUnitProcess
+
+    result = {'total_duration': 0, 'total_duration_successful': 0, 'total_duration_failed': 0, 'total_duration_idle': 0, 'DDT Com Rep': 0}
 
-    # TODO: Filter also according to "DDT Com Rep", and "System Unavailability".
-    # Filter durations for each prio basing on SUBs states
+    # Filter System Unavailability
+    # TODO: Maybe add some other case scenarios where the system is not up and running?
+    reservations_duration = models.Reservation.objects.filter(start_time__gte=start, stop_time__lte=stop).\
+        filter(specifications_doc__activity__type='maintenance').aggregate(duration=Sum(F('stop_time') - F('start_time')))['duration']
+    result['System Unavailability'] = reservations_duration.total_seconds() if reservations_duration else None
+
+    # Filter durations for each prio basing on SUBs and projects
+    cycle_subs = models.SchedulingUnitBlueprint.objects.filter(draft__scheduling_set__project__cycles=cycle.pk)
     for prio in models.PriorityQueueType.Choices:
-        result[f'total_duration_{prio.name}'] = 0
-        subs = models.SchedulingUnitBlueprint.objects.filter(draft__scheduling_set__project__cycles=cycle.pk).filter(priority_queue=prio.value)
+        result[f'total_duration_successful_{prio.name}'] = 0
+        subs = cycle_subs.filter(priority_queue=prio.value)
         for sub in subs:
-            result['total_duration_idle'] += sub.observed_duration.total_seconds() if sub.observed_duration else 0
-            # TODO: Use QA workflow flag to get successful or failed SUBs, instead of SUBs' states.
-            #       At the moment just return some 0 placeholder values.
-            # if sub.status == 'finished':
-            #     result[f'total_duration_{prio.name}'] += sub.observed_duration.total_seconds() if sub.observed_duration else 0
-            # if sub.status == 'error':
-            #     result['total_duration_failed'] += sub.observed_duration.total_seconds() if sub.observed_duration else 0
+            if sub.observed_duration and sub.observed_start_time >= start and sub.observed_end_time <= stop:
+                # Filter DDT Com Rep
+                project_category, copy_reason = sub.project.project_category, sub.draft.copy_reason
+                if (project_category and (project_category.value == 'ddt' or project_category.value == 'commissioning')) or copy_reason == 'repeated':
+                    result['DDT Com Rep'] += sub.observed_duration.total_seconds()
+                # Aggregate total and idle
+                result['total_duration'] += sub.observed_duration.total_seconds()
+                result['total_duration_idle'] += sub.observed_duration.total_seconds()
+                # Distinguish successful and failed
+                sup = SchedulingUnitProcess.objects.filter(su=sub).first()
+                result[f'total_duration_successful_{prio.name}'] += sub.observed_duration.total_seconds() if sup and sup.results_accepted else 0
+                result['total_duration_failed'] += sub.observed_duration.total_seconds() if sup and sup.results_accepted is False else 0
+        # Calculate prio percentages
+        result[f'successful_{prio.name}_perc'] = round(result[f'total_duration_successful_{prio.name}'] / result['total_duration'], 2) if result['total_duration'] > 0 else None
+        # Aggregate prio durations to general successful
+        result['total_duration_successful'] += result[f'total_duration_successful_{prio.name}']
         # Subtract prio states from total to get partial idle
-        result['total_duration_idle'] -= result[f'total_duration_{prio.name}']
+        result['total_duration_idle'] -= result[f'total_duration_successful_{prio.name}']
     # Subtract total failed to get total idle eventually
     result['total_duration_idle'] -= result['total_duration_failed']
 
+    # Calculate percentages
+    result['successful_perc'] = round(result['total_duration_successful'] / result['total_duration'], 2) if result['total_duration'] > 0 else None
+    result['idle_perc'] = round(result['total_duration_idle'] / result['total_duration'], 2) if result['total_duration'] > 0 else None
+    result['failed_perc'] = round(result['total_duration_failed'] / result['total_duration'], 2) if result['total_duration'] > 0 else None
+    result['ddt_com_rep_perc'] = round(result['DDT Com Rep'] / result['total_duration'], 2) if result['total_duration'] > 0 else None
+    result['system_unavailability_perc'] = round(result['System Unavailability'] / result['total_duration'], 2) if result['System Unavailability'] and result['total_duration'] > 0 else None
+
     return result
 
 
-def _get_weekly_efficiency(cycle: models.Cycle):
+def _get_weekly_efficiency(cycle: models.Cycle, start: datetime, stop: datetime) -> {}:
     """
     Help function to retrieve the weekly efficiency with total successful obs durations per week.
     """
+    from lofar.sas.tmss.tmss.workflowapp.models.schedulingunitflow import SchedulingUnitProcess
+
     result = {'weeks': []}
 
     # Get SchedulingUnitBlueprints related to the cycle
     subs = models.SchedulingUnitBlueprint.objects.filter(draft__scheduling_set__project__cycles=cycle.pk)
 
-    # Get start and stop
-    start, stop = cycle.start, cycle.stop
-
     # Iterate through weeks and sum durations per week
     step, d = timedelta(days=7), start
     while d < stop:
         total_per_week = 0
         total_succeeded_per_week = 0
         for sub in subs:
-            total_per_week += sub.observed_duration.total_seconds() if sub.observed_duration and \
-                                                                      d <= sub.observed_start_time < d + step and \
-                                                                      sub.observed_end_time < d + step else 0
-            # TODO: Use QA workflow flag to get successful or failed SUBs, instead of SUBs' states.
-            #       At the moment just return some 0 placeholder values.
-            # total_succeeded_per_week += sub.observed_duration.total_seconds() \
-            #     if sub.observed_duration and sub.status == 'finished' and \
-            #        d <= sub.observed_start_time < d + step and sub.observed_end_time < d + step else 0
-        result['weeks'].append(
-            {'week': d.date().isoformat(), 'efficiency': total_succeeded_per_week / total_per_week if total_per_week > 0 else None})
+            # Aggregate total and successful durations
+            if sub.observed_duration and d <= sub.observed_start_time < d + step and sub.observed_end_time < d + step:
+                sup = SchedulingUnitProcess.objects.filter(su=sub).first()
+                total_per_week += sub.observed_duration.total_seconds()
+                total_succeeded_per_week += sub.observed_duration.total_seconds() if sup and sup.results_accepted else 0
+        efficiency = round(total_succeeded_per_week / total_per_week, 2) if total_per_week > 0 else None
+        result['weeks'].append({'week': d.date().isoformat(), 'efficiency': efficiency})
         d += step
 
     return result
 
 
-def _get_data_ingested_per_site_and_category(cycle: models.Cycle) -> {}:
+def _get_data_ingested_per_site_and_category(cycle: models.Cycle, start: datetime, stop: datetime) -> {}:
     """
     Help function to retrieve data ingested per site and category info.
     """
@@ -187,7 +220,7 @@ def _get_data_ingested_per_site_and_category(cycle: models.Cycle) -> {}:
     # dataproducts = [ai.dataproduct for ai in archive_info]
 
     # Get DataProducts related to the cycle from Subtasks with state 'finished'
-    dataproducts = models.Dataproduct.objects.filter(producer__subtask__state='finished', producer__subtask__task_blueprints__draft__scheduling_unit_draft__scheduling_set__project__cycles=cycle.pk)
+    dataproducts = models.Dataproduct.objects.filter(producer__subtask__state='finished', producer__subtask__task_blueprints__draft__scheduling_unit_draft__scheduling_set__project__cycles=cycle.pk, producer__subtask__start_time__gte=start, producer__subtask__stop_time__lte=stop)
 
     # Combine and filter DataProducts accordingly
     dps_interferometric_obs_sizes = dataproducts.filter(producer__subtask__specifications_template__type='observation', dataformat='MeasurementSet', datatype='visibilities').aggregate(Sum('size'))
@@ -205,7 +238,7 @@ def _get_data_ingested_per_site_and_category(cycle: models.Cycle) -> {}:
     return result
 
 
-def _get_projects_summary(request: Request, cycle: models.Cycle) -> {}:
+def _get_projects_summary(request: Request, cycle: models.Cycle, start: datetime, stop: datetime) -> {}:
     """
     Help function to retrieve projects info.
     """
@@ -214,19 +247,19 @@ def _get_projects_summary(request: Request, cycle: models.Cycle) -> {}:
     projects = models.Project.objects.filter(cycles=cycle)
     for p in projects:
         # Include the Project report info
-        projects_summary.append(create_project_report(request, p))
+        projects_summary.append(create_project_report(request, p, start, stop))
 
     return projects_summary
 
 
-def _get_usage_mode(cycle: models.Cycle) -> {}:
+def _get_usage_mode(cycle: models.Cycle, start: datetime, stop: datetime) -> {}:
     """
     Help function to retrieve ILT and local usage mode info.
     """
     result = {'all modes': {}, 'stand-alone mode': {}, 'ILT mode': {}}
 
     # Get all the reservations in the cycle semester
-    reservations = models.Reservation.objects.filter(start_time__gte=cycle.start, stop_time__lte=cycle.stop)
+    reservations = models.Reservation.objects.filter(start_time__gte=start, stop_time__lte=stop)
     duration = reservations.aggregate(duration=Sum(F('stop_time') - F('start_time')))['duration']
     result['all modes']['total'] = duration.total_seconds() if duration else None
     # Production projects
@@ -260,25 +293,46 @@ def _get_usage_mode(cycle: models.Cycle) -> {}:
     return result
 
 
-def _get_failures(cycle: models.Cycle):
+def _get_failures(cycle: models.Cycle, start: datetime, stop: datetime) -> {}:
     """
     Help function to retrieve failures rate info as a function of time.
     """
+    from lofar.sas.tmss.tmss.workflowapp.models.schedulingunitflow import SchedulingUnitProcess
+
     # TODO: See TMSS-662 for details.
-    return None
+    result = {'months': []}
+
+    # Get SchedulingUnitBlueprints related to the cycle
+    subs = models.SchedulingUnitBlueprint.objects.filter(draft__scheduling_set__project__cycles=cycle.pk)
+
+    # Iterate through weeks and sum durations per week
+    step, d = relativedelta(months=1), start
+    while d < stop:
+        total_per_month = 0
+        total_failed_per_month = 0
+        for sub in subs:
+            # Aggregate total and successful durations
+            if sub.observed_duration and d <= sub.observed_start_time < d + step and sub.observed_end_time < d + step:
+                sup = SchedulingUnitProcess.objects.filter(su=sub).first()
+                total_per_month += sub.observed_duration.total_seconds()
+                total_failed_per_month += sub.observed_duration.total_seconds() if sup and sup.results_accepted is False else 0
+        failed_perc = round(total_failed_per_month / total_per_month, 2) if total_per_month > 0 else None
+        result['months'].append({'month': d.date().isoformat(), 'total': total_per_month, 'total_failed': total_failed_per_month, 'failed_perc': failed_perc})
+        d += step
+
+    return result
 
 
 # Project Report
 
-def create_project_report(request: Request, project: models.Project) -> {}:
+def create_project_report(request: Request, project: models.Project, start: datetime, stop: datetime) -> {}:
     """
     Create a project report as a JSON object.
     """
-    result = {'project': project.pk}
-    result['quota'] = _get_quotas_from_project(request, project.pk)
-    result['SUBs'], result['durations'] = _get_subs_and_durations_from_project(project.pk)
-    result['LTA dataproducts'] = _get_lta_dataproducts(project.name)
-    result['SAPs'] = _get_saps(project.pk)
+    subs, durations = _get_subs_and_durations_from_project(project.pk, start, stop)
+    result = {'project': project.pk, 'quota': _get_quotas_from_project(request, project.pk), 'SUBs': subs,
+              'durations': durations, 'LTA dataproducts': _get_lta_dataproducts(project.name, start, stop),
+              'SAPs exposure': _get_saps_exposure(project.pk, start, stop)}
 
     return result
 
@@ -293,52 +347,118 @@ def _get_quotas_from_project(request: Request, project_pk: int) -> []:
     return quotas
 
 
-def _get_subs_and_durations_from_project(project_pk: int) -> ({}, {}):
+def _get_subs_and_durations_from_project(project_pk: int, start: datetime, stop: datetime) -> ({}, {}):
     """
     Help function to retrieve durations and scheduling_units distinguished by success/fail.
     """
+    from lofar.sas.tmss.tmss.workflowapp.models.schedulingunitflow import SchedulingUnitProcess
+
+    durations = {'total': 0, 'total_not_cancelled': 0, 'total_succeeded': 0, 'total_failed': 0,
+                 'total_observed': 0, 'total_observed_succeeded': 0, 'total_observed_failed': 0}
+
     # Get SUBs related to the project
-    scheduling_unit_blueprints = models.SchedulingUnitBlueprint.objects.filter(draft__scheduling_set__project__pk=project_pk)
-    # TODO: Split into total, prio A, prio B. See TMSS-592.
-    total_duration, total_succeeded_duration, total_failed_duration = timedelta(), timedelta(), timedelta()
-    subs_succeeded, subs_failed = [], []
+    project_subs = models.SchedulingUnitBlueprint.objects.filter(draft__scheduling_set__project__pk=project_pk)
 
-    # NOTE: This might be optimised later with the use of Django's ORM as done for LTA dataproducts.
-    for sub in scheduling_unit_blueprints:  # Distinguish between succeeded and failed observations
-        # TODO: Use QA workflow flag to get successful or failed SUBs, instead of SUBs' states.
-        #       Cancelled SUBs are not failed SUBs. We need to adjust this once the QA workflow flag will be defined.
-        #       Also clarify if this info should be related only to obs or all SUBs in general. The latter are considered for now.
-        #       We can filter observations by considering observed_duration in the SUB, for now. See TMSS-610 comments.
-        if sub.status == 'finished':  # Succeeded SUBs
-            total_succeeded_duration += sub.duration
-            subs_succeeded.append({'id': sub.pk, 'name': sub.name, 'duration': sub.duration.total_seconds()})
-        elif sub.status == 'cancelled':  # Failed SUBs
-            total_failed_duration += sub.duration
-            subs_failed.append({'id': sub.pk, 'name': sub.name, 'duration': sub.duration.total_seconds()})
-        total_duration += sub.duration  # Total duration without considering the status of the SUBs.
-
-    total_not_cancelled = total_duration - total_failed_duration  # Calculate not_cancelled duration
-    durations = {'total': total_duration.total_seconds(), 'total_succeeded': total_succeeded_duration.total_seconds(),
-                 'total_not_cancelled': total_not_cancelled.total_seconds(), 'total_failed': total_failed_duration.total_seconds()}
-    subs = {'finished': subs_succeeded, 'failed': subs_failed}
+    subs_succeeded, subs_failed = [], []
+    for prio in models.PriorityQueueType.Choices:
+        durations[f'total_succeeded_{prio.name}'], durations[f'total_observed_succeeded_{prio.name}'] = 0, 0
+        subs = project_subs.filter(priority_queue=prio.value)
+        for sub in subs:
+            # Check time interval and go to the next iteration (SUB) if the check fails
+            if (start and sub.start_time < start) or (stop and sub.stop_time > stop):
+                continue
+            # Gathering info for reporting
+            sub_start_time = sub.start_time.isoformat() if sub.start_time else None
+            sub_stop_time = sub.stop_time.isoformat() if sub.stop_time else None
+            sub_duration = sub.duration.total_seconds()
+            sub_observed_duration = sub.observed_duration.total_seconds() if sub.observed_duration else 0
+            # Info about the SUB to be returned
+            sub_info = {'id': sub.pk, 'name': sub.name, 'status': sub.status, 'start': sub_start_time,
+                        'stop': sub_stop_time, 'duration': sub_duration, 'observed_duration': sub_observed_duration}
+            try:
+                sub_info['target'] = get_target_observation_task_name_from_requirements_doc(sub)
+            except Exception as e:
+                sub_info['target'] = None
+            # Get SAS ID info
+            subtasks = models.Subtask.objects.filter(task_blueprints__scheduling_unit_blueprint=sub)
+            sub_info['SAS ID'] = {}
+            for template_name in ('observation control', 'preprocessing pipeline', 'pulsar pipeline'):
+                sub_info['SAS ID'][template_name] = [subtask.id for subtask in subtasks.filter(specifications_template__name=template_name)]
+            # Get ingest info
+            dataproducts = models.Dataproduct.objects.filter(producer__subtask__specifications_template__type='ingest').filter(producer__subtask__state__value='finished').filter(producer__subtask__task_blueprints__scheduling_unit_blueprint=sub)
+            # TODO: Maybe it would be useful to implement an 'ingested_stop_time' (and even an 'ingested_start_time' and consequently an 'ingested_duration'?)
+            sub_info['ingested_date'] = max(dataproducts, key=lambda x: x.producer.subtask.stop_time).producer.subtask.stop_time if dataproducts else None
+            sub_info['ingested_data_size'] = dataproducts.aggregate(Sum('size'))['size__sum']
+
+            # Gather durations
+            durations['total'] += sub_duration  # Total
+            if sub.status != 'cancelled':  # Not cancelled SUBs
+                durations['total_not_cancelled'] += sub_duration
+            durations['total_observed'] += sub_observed_duration  # Total observed
+            # Distinguish successful and failed SUBs
+            sup = SchedulingUnitProcess.objects.filter(su=sub).first()
+            if sup and sup.results_accepted:    # Succeeded SUBs
+                durations[f'total_succeeded_{prio.name}'] += sub_duration
+                durations[f'total_observed_succeeded_{prio.name}'] += sub_observed_duration
+                subs_succeeded.append(sub_info)
+            elif sup and sup.results_accepted is False:  # Failed SUBs
+                durations['total_failed'] += sub_duration
+                durations['total_observed_failed'] += sub_observed_duration
+                subs_failed.append(sub_info)
+        # Gather prios durations as well
+        durations['total_succeeded'] += durations[f'total_succeeded_{prio.name}']
+        durations['total_observed_succeeded'] += durations[f'total_observed_succeeded_{prio.name}']
+
+    subs = {'successful': subs_succeeded, 'failed': subs_failed}
+
+    # Calculate percentages
+    durations['not_cancelled_perc'] = round(durations['total_not_cancelled'] / durations['total'], 2) if durations['total'] > 0 else None
+    durations['succeeded_perc'] = round(durations['total_succeeded'] / durations['total'], 2) if durations['total'] > 0 else None
+    durations['failed_perc'] = round(durations['total_failed'] / durations['total'], 2) if durations['total'] > 0 else None
+    durations['observed_perc'] = round(durations['total_observed'] / durations['total'], 2) if durations['total'] > 0 else None
+    durations['observed_succeeded_perc'] = round(durations['total_observed_succeeded'] / durations['total'], 2) if durations['total'] > 0 else None
+    durations['observed_failed_perc'] = round(durations['total_observed_failed'] / durations['total'], 2) if durations['total'] > 0 else None
 
     return subs, durations
 
 
-def _get_lta_dataproducts(project_name: str) -> {}:
+def _get_lta_dataproducts(project_name: str, start: datetime, stop: datetime) -> {}:
     """
     Help function to retrieve the sum of the LTA dataproducts sizes.
     """
     # Query dataproducts from Subtasks of type 'ingest' within 'finished' status
-    return models.Dataproduct.objects.filter(producer__subtask__specifications_template__type='ingest') \
+    dataproducts = models.Dataproduct.objects.filter(producer__subtask__specifications_template__type='ingest') \
         .filter(producer__subtask__state__value='finished') \
-        .filter(producer__subtask__task_blueprints__draft__scheduling_unit_draft__scheduling_set__project__name=project_name) \
-        .aggregate(Sum('size'))
+        .filter(producer__subtask__task_blueprints__draft__scheduling_unit_draft__scheduling_set__project__name=project_name)
+    # Filter basing on date interval if passed
+    dataproducts = dataproducts.filter(producer__subtask__start_time__gte=start) if start else dataproducts
+    dataproducts = dataproducts.filter(producer__subtask__stop_time__lte=stop) if stop else dataproducts
+
+    return dataproducts.aggregate(Sum('size'))
 
 
-def _get_saps(project_pk: int) -> []:
+def _get_saps_exposure(project_pk: int, start: datetime, stop: datetime) -> {}:
     """
     Help function to retrieve SAPs.
     """
-    # TODO: For each unique target (SAP name) get the sum of target observation durations from the tasks.
-    return [{'sap_name': 'placeholder', 'total_exposure': 0}, ]
+    result = {}
+
+    tasks = models.TaskBlueprint.objects.filter(scheduling_unit_blueprint__draft__scheduling_set__project=project_pk)
+    for task in tasks:
+        # Get subtasks and filter basing on date interval if passed
+        subtasks = models.Subtask.objects.filter(task_blueprints=task, specifications_template__type='observation')
+        subtasks = subtasks.filter(start_time__gte=start) if start else subtasks
+        subtasks = subtasks.filter(stop_time__lte=stop) if stop else subtasks
+        # Get SAPs
+        saps = task.specifications_doc.get('SAPs', [])
+        for sap in saps:
+            sap_name = sap['name']
+            result[sap_name] = 0
+            # Aggregate durations per each SAP name
+            for subtask in subtasks:
+                digital_points = subtask.specifications_doc.get('stations', {}).get('digital_pointings', [])
+                for dp in digital_points:
+                    if dp['name'] == sap_name:
+                        result[sap_name] += subtask.duration.total_seconds()
+
+    return result
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/migrations/0001_initial.py b/SAS/TMSS/backend/src/tmss/tmssapp/migrations/0001_initial.py
index c9b1b0d50f4a4bec1eca066c40d86fb3b992d56a..97e17b9d3d22b21f1f3ead469c0508152a8630f8 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/migrations/0001_initial.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/migrations/0001_initial.py
@@ -1,4 +1,4 @@
-# Generated by Django 3.0.9 on 2021-07-09 07:33
+# Generated by Django 3.0.9 on 2021-08-05 10:16
 
 from django.conf import settings
 import django.contrib.auth.models
@@ -631,6 +631,15 @@ class Migration(migrations.Migration):
             },
             bases=(models.Model, lofar.sas.tmss.tmss.tmssapp.models.common.TemplateSchemaMixin),
         ),
+        migrations.CreateModel(
+            name='SchedulingState',
+            fields=[
+                ('value', models.CharField(max_length=128, primary_key=True, serialize=False, unique=True)),
+            ],
+            options={
+                'abstract': False,
+            },
+        ),
         migrations.CreateModel(
             name='SchedulingUnitBlueprint',
             fields=[
@@ -1415,6 +1424,11 @@ class Migration(migrations.Migration):
             name='project_category',
             field=models.ForeignKey(help_text='Category this project falls under.', null=True, on_delete=django.db.models.deletion.PROTECT, to='tmssapp.ProjectCategory'),
         ),
+        migrations.AddField(
+            model_name='project',
+            name='scheduling_state',
+            field=models.ForeignKey(default='opened', help_text='The scheduling state this project is in.', on_delete=django.db.models.deletion.PROTECT, to='tmssapp.SchedulingState'),
+        ),
         migrations.AddConstraint(
             model_name='generatortemplate',
             constraint=models.UniqueConstraint(fields=('name', 'version'), name='generatortemplate_unique_name_version'),
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/models/common.py b/SAS/TMSS/backend/src/tmss/tmssapp/models/common.py
index 834f7bbcdb947eec22918e44ec9f910f4957da65..75b834097b410f744a568b33c67b800ebc82a369 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/models/common.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/models/common.py
@@ -195,7 +195,7 @@ class Template(NamedVersionedCommon):
             logger.error("Could not override schema $id with auto-generated url: %s", e)
 
         # this template's schema has a schema of its own (usually the draft-06 meta schema). Validate it.
-        validate_json_against_its_schema(self.schema)
+        validate_json_against_its_schema(self.schema, cache=TemplateSchemaMixin._schema_cache, max_cache_age=TemplateSchemaMixin._MAX_SCHEMA_CACHE_AGE)
 
     def validate_document(self, json_doc: typing.Union[str, dict]) -> bool:
         '''validate the given json_doc against the template's schema
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/models/permissions.py b/SAS/TMSS/backend/src/tmss/tmssapp/models/permissions.py
index f34cc153a72923939613ae56c0d98ce258fa0a73..068c9439dad6d8604b56a473b5797483f3c18c1d 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/models/permissions.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/models/permissions.py
@@ -36,6 +36,7 @@ class ProjectRole(AbstractChoice):
         CO_I = "co_i"
         CONTACT_AUTHOR = "contact"
         SHARED_SUPPORT = 'shared_support'
+        SHARED_SUPPORT_PRIMARY = 'shared_support_primary'
         FRIEND_OF_PROJECT = 'friend_of_project'
         FRIEND_OF_PROJECT_PRIMARY = 'friend_of_project_primary'
 
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/models/specification.py b/SAS/TMSS/backend/src/tmss/tmssapp/models/specification.py
index c443bfb04340fb77de7c54ba3cfca6b493456438..ea277797d8304f5bfe8eabcf4b00579b324fd8da 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/models/specification.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/models/specification.py
@@ -157,6 +157,18 @@ class PriorityQueueType(AbstractChoice):
         A = "A"
         B = "B"
 
+
+class SchedulingState(AbstractChoice):
+    """Defines the model and predefined list of possible SchedulingState's of a Project.
+    The items in the Choices class below are automagically populated into the database via a data migration."""
+    class Choices(Enum):
+        OPENED = "opened"
+        ACTIVE = "active"
+        FINISHED = "finished"
+        CANCELLED = "cancelled"
+        SUSPENDED = "suspended"
+
+
 # concrete models
 
 class Setting(BasicCommon):
@@ -214,6 +226,7 @@ class SchedulingUnitObservingStrategyTemplate(NamedVersionedCommon):
 
         if self.template and self.scheduling_unit_template_id and self.scheduling_unit_template.schema:
             try:
+                # validate. Do not use a cache upon this save moment, so we validate against the latest remote schemas
                 validate_json_against_schema(self.template, self.scheduling_unit_template.schema)
             except Exception as e:
                 # log the error for debugging and re-raise
@@ -303,6 +316,7 @@ class ReservationStrategyTemplate(NamedCommon):
 
     def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
         if self.template and self.reservation_template_id and self.reservation_template.schema:
+            # validate. Do not use a cache upon this save moment, so we validate against the latest remote schemas
             validate_json_against_schema(self.template, self.reservation_template.schema)
 
         super().save(force_insert, force_update, using, update_fields)
@@ -364,6 +378,7 @@ class Project(RefreshFromDbInvalidatesCachedPropertiesMixin, NamedCommonPK):
     piggyback_allowed_tbb = BooleanField(default=True, help_text='Piggyback key for TBB.')
     piggyback_allowed_aartfaac = BooleanField(default=True, help_text='Piggyback key for AARTFAAC.')
     path_to_project = "project"
+    scheduling_state = ForeignKey('SchedulingState', default=SchedulingState.Choices.OPENED.value, on_delete=PROTECT, null=False, help_text='The scheduling state this project is in.')
 
     @cached_property
     def duration(self) -> datetime.timedelta:
@@ -442,6 +457,7 @@ class SchedulingUnitDraft(NamedCommon, TemplateSchemaMixin, ProjectPropertyMixin
             # If this scheduling unit was created from an observation_strategy_template,
             # then make sure that the observation_strategy_template validates against this unit's requirements_template.schema
             if self.observation_strategy_template_id and self.observation_strategy_template.template:
+                # validate. Do not use a cache upon this save moment, so we validate against the latest remote schemas
                 validate_json_against_schema(self.observation_strategy_template.template, self.requirements_template.schema)
 
         # This code only happens if the objects is not in the database yet. self._state.adding is True creating
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/populate.py b/SAS/TMSS/backend/src/tmss/tmssapp/populate.py
index fad946748e363bc4c1e25a5c1b15b15df86419e9..221e5455b06bf149da57dba3d81f710bd0f8cf7e 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/populate.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/populate.py
@@ -122,7 +122,8 @@ def populate_choices(apps, schema_editor):
     '''
     choice_classes = [Role, IOType, Datatype, Dataformat, CopyReason,
                       SubtaskState, SubtaskType, StationType, HashAlgorithm, SchedulingRelationPlacement,
-                      SystemSettingFlag, ProjectCategory, PeriodCategory, Quantity, TaskType, ProjectRole, PriorityQueueType]
+                      SystemSettingFlag, ProjectCategory, PeriodCategory, Quantity, TaskType, ProjectRole,
+                      PriorityQueueType, SchedulingState]
 
     # upload choices in parallel
     with ThreadPoolExecutor() as executor:
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/LBA-survey-observation-scheduling-unit-observation-strategy.json b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/LBA-survey-observation-scheduling-unit-observation-strategy.json
new file mode 100644
index 0000000000000000000000000000000000000000..809d98e79ce1a8a8dc97d9bbd03da6a97d5a97bc
--- /dev/null
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/LBA-survey-observation-scheduling-unit-observation-strategy.json
@@ -0,0 +1,803 @@
+{
+    "tasks": {
+        "Ingest": {
+            "tags": [],
+            "description": "Ingest all preprocessed dataproducts",
+            "specifications_doc": {},
+            "specifications_template": "ingest"
+        },
+        "Pipeline target1": {
+            "tags": [],
+            "description": "Preprocessing Pipeline for Target Observation target1",
+            "specifications_doc": {
+                "flag": {
+                    "rfi_strategy": "LBAdefault",
+                    "outerchannels": true,
+                    "autocorrelations": true
+                },
+                "demix": {
+                    "sources": {},
+                    "time_steps": 10,
+                    "ignore_target": false,
+                    "frequency_steps": 64
+                },
+                "average": {
+                    "time_steps": 1,
+                    "frequency_steps": 4
+                },
+                "storagemanager": "dysco"
+            },
+            "specifications_template": "preprocessing pipeline"
+        },
+        "Pipeline target2": {
+            "tags": [],
+            "description": "Preprocessing Pipeline for Target Observation target2",
+            "specifications_doc": {
+                "flag": {
+                    "rfi_strategy": "LBAdefault",
+                    "outerchannels": true,
+                    "autocorrelations": true
+                },
+                "demix": {
+                    "sources": {},
+                    "time_steps": 10,
+                    "ignore_target": false,
+                    "frequency_steps": 64
+                },
+                "average": {
+                    "time_steps": 1,
+                    "frequency_steps": 4
+                },
+                "storagemanager": "dysco"
+            },
+            "specifications_template": "preprocessing pipeline"
+        },
+        "Pipeline target3": {
+            "tags": [],
+            "description": "Preprocessing Pipeline for Target Observation target3",
+            "specifications_doc": {
+                "flag": {
+                    "rfi_strategy": "LBAdefault",
+                    "outerchannels": true,
+                    "autocorrelations": true
+                },
+                "demix": {
+                    "sources": {},
+                    "time_steps": 10,
+                    "ignore_target": false,
+                    "frequency_steps": 64
+                },
+                "average": {
+                    "time_steps": 1,
+                    "frequency_steps": 4
+                },
+                "storagemanager": "dysco"
+            },
+            "specifications_template": "preprocessing pipeline"
+        },
+        "Target Observation": {
+            "tags": [],
+            "description": "Target Observation for UC1 LBA scheduling unit",
+            "specifications_doc": {
+                "QA": {
+                    "plots": {
+                        "enabled": true,
+                        "autocorrelation": true,
+                        "crosscorrelation": true
+                    },
+                    "file_conversion": {
+                        "enabled": true,
+                        "nr_of_subbands": -1,
+                        "nr_of_timestamps": 256
+                    }
+                },
+                "SAPs": [
+                    {
+                        "name": "target1",
+                        "subbands": [
+                            217,
+                            218,
+                            219,
+                            220,
+                            221,
+                            222,
+                            223,
+                            224,
+                            225,
+                            226,
+                            227,
+                            228,
+                            229,
+                            230,
+                            231,
+                            232,
+                            233,
+                            234,
+                            235,
+                            236,
+                            237,
+                            238,
+                            239,
+                            240,
+                            241,
+                            242,
+                            243,
+                            244,
+                            245,
+                            246,
+                            247,
+                            248,
+                            249,
+                            250,
+                            251,
+                            252,
+                            253,
+                            254,
+                            255,
+                            256,
+                            257,
+                            258,
+                            259,
+                            260,
+                            261,
+                            262,
+                            263,
+                            264,
+                            265,
+                            266,
+                            267,
+                            268,
+                            269,
+                            270,
+                            271,
+                            272,
+                            273,
+                            274,
+                            275,
+                            276,
+                            277,
+                            278,
+                            279,
+                            280,
+                            281,
+                            282,
+                            283,
+                            284,
+                            285,
+                            286,
+                            287,
+                            288,
+                            289,
+                            290,
+                            291,
+                            292,
+                            293,
+                            294,
+                            295,
+                            296,
+                            297,
+                            298,
+                            299,
+                            300,
+                            301,
+                            302,
+                            303,
+                            304,
+                            305,
+                            306,
+                            307,
+                            308,
+                            309,
+                            310,
+                            311,
+                            312,
+                            313,
+                            314,
+                            315,
+                            316,
+                            317,
+                            318,
+                            319,
+                            320,
+                            321,
+                            322,
+                            323,
+                            324,
+                            325,
+                            326,
+                            327,
+                            328,
+                            329,
+                            330,
+                            331,
+                            332,
+                            333,
+                            334,
+                            335,
+                            336,
+                            337,
+                            338
+                        ],
+                        "digital_pointing": {
+                            "angle1": 0.6624317181687094,
+                            "angle2": 1.5579526427549426,
+                            "direction_type": "J2000"
+                        }
+                    },
+                    {
+                        "name": "target2",
+                        "subbands": [
+                            217,
+                            218,
+                            219,
+                            220,
+                            221,
+                            222,
+                            223,
+                            224,
+                            225,
+                            226,
+                            227,
+                            228,
+                            229,
+                            230,
+                            231,
+                            232,
+                            233,
+                            234,
+                            235,
+                            236,
+                            237,
+                            238,
+                            239,
+                            240,
+                            241,
+                            242,
+                            243,
+                            244,
+                            245,
+                            246,
+                            247,
+                            248,
+                            249,
+                            250,
+                            251,
+                            252,
+                            253,
+                            254,
+                            255,
+                            256,
+                            257,
+                            258,
+                            259,
+                            260,
+                            261,
+                            262,
+                            263,
+                            264,
+                            265,
+                            266,
+                            267,
+                            268,
+                            269,
+                            270,
+                            271,
+                            272,
+                            273,
+                            274,
+                            275,
+                            276,
+                            277,
+                            278,
+                            279,
+                            280,
+                            281,
+                            282,
+                            283,
+                            284,
+                            285,
+                            286,
+                            287,
+                            288,
+                            289,
+                            290,
+                            291,
+                            292,
+                            293,
+                            294,
+                            295,
+                            296,
+                            297,
+                            298,
+                            299,
+                            300,
+                            301,
+                            302,
+                            303,
+                            304,
+                            305,
+                            306,
+                            307,
+                            308,
+                            309,
+                            310,
+                            311,
+                            312,
+                            313,
+                            314,
+                            315,
+                            316,
+                            317,
+                            318,
+                            319,
+                            320,
+                            321,
+                            322,
+                            323,
+                            324,
+                            325,
+                            326,
+                            327,
+                            328,
+                            329,
+                            330,
+                            331,
+                            332,
+                            333,
+                            334,
+                            335,
+                            336,
+                            337,
+                            338
+                        ],
+                        "digital_pointing": {
+                            "angle1": 0.6624317181687094,
+                            "angle2": 1.5579526427549426,
+                            "direction_type": "J2000"
+                        }
+                    },
+                    {
+                        "name": "target3",
+                        "subbands": [
+                            217,
+                            218,
+                            219,
+                            220,
+                            221,
+                            222,
+                            223,
+                            224,
+                            225,
+                            226,
+                            227,
+                            228,
+                            229,
+                            230,
+                            231,
+                            232,
+                            233,
+                            234,
+                            235,
+                            236,
+                            237,
+                            238,
+                            239,
+                            240,
+                            241,
+                            242,
+                            243,
+                            244,
+                            245,
+                            246,
+                            247,
+                            248,
+                            249,
+                            250,
+                            251,
+                            252,
+                            253,
+                            254,
+                            255,
+                            256,
+                            257,
+                            258,
+                            259,
+                            260,
+                            261,
+                            262,
+                            263,
+                            264,
+                            265,
+                            266,
+                            267,
+                            268,
+                            269,
+                            270,
+                            271,
+                            272,
+                            273,
+                            274,
+                            275,
+                            276,
+                            277,
+                            278,
+                            279,
+                            280,
+                            281,
+                            282,
+                            283,
+                            284,
+                            285,
+                            286,
+                            287,
+                            288,
+                            289,
+                            290,
+                            291,
+                            292,
+                            293,
+                            294,
+                            295,
+                            296,
+                            297,
+                            298,
+                            299,
+                            300,
+                            301,
+                            302,
+                            303,
+                            304,
+                            305,
+                            306,
+                            307,
+                            308,
+                            309,
+                            310,
+                            311,
+                            312,
+                            313,
+                            314,
+                            315,
+                            316,
+                            317,
+                            318,
+                            319,
+                            320,
+                            321,
+                            322,
+                            323,
+                            324,
+                            325,
+                            326,
+                            327,
+                            328,
+                            329,
+                            330,
+                            331,
+                            332,
+                            333,
+                            334,
+                            335,
+                            336,
+                            337,
+                            338
+                        ],
+                        "digital_pointing": {
+                            "angle1": 0.6624317181687094,
+                            "angle2": 1.5579526427549426,
+                            "direction_type": "J2000"
+                        }
+                    }
+                ],
+                "filter": "LBA_30_90",
+                "duration": 120,
+                "correlator": {
+                    "storage_cluster": "CEP4",
+                    "integration_time": 1,
+                    "channels_per_subband": 64
+                },
+                "antenna_set": "LBA_SPARSE_EVEN",
+                "station_groups": [
+                    {
+                        "stations": [
+                            "CS001",
+                            "CS002",
+                            "CS003",
+                            "CS004",
+                            "CS005",
+                            "CS006",
+                            "CS007",
+                            "CS011",
+                            "CS013",
+                            "CS017",
+                            "CS021",
+                            "CS024",
+                            "CS026",
+                            "CS028",
+                            "CS030",
+                            "CS031",
+                            "CS032",
+                            "CS101",
+                            "CS103",
+                            "CS201",
+                            "CS301",
+                            "CS302",
+                            "CS401",
+                            "CS501",
+                            "RS106",
+                            "RS205",
+                            "RS208",
+                            "RS210",
+                            "RS305",
+                            "RS306",
+                            "RS307",
+                            "RS310",
+                            "RS406",
+                            "RS407",
+                            "RS409",
+                            "RS503",
+                            "RS508",
+                            "RS509"
+                        ],
+                        "max_nr_missing": 4
+                    },
+                    {
+                        "stations": [
+                            "RS508",
+                            "RS509"
+                        ],
+                        "max_nr_missing": 1
+                    },
+                    {
+                        "stations": [
+                            "RS310",
+                            "RS210"
+                        ],
+                        "max_nr_missing": 0
+                    }
+                ]
+            },
+            "specifications_template": "target observation"
+        },
+        "Calibrator Pipeline": {
+            "tags": [],
+            "description": "Preprocessing Pipeline for Calibrator Observation",
+            "specifications_doc": {
+                "flag": {
+                    "rfi_strategy": "LBAdefault",
+                    "outerchannels": true,
+                    "autocorrelations": true
+                },
+                "demix": {
+                    "sources": {},
+                    "time_steps": 10,
+                    "ignore_target": false,
+                    "frequency_steps": 64
+                },
+                "average": {
+                    "time_steps": 1,
+                    "frequency_steps": 4
+                },
+                "storagemanager": "dysco"
+            },
+            "specifications_template": "preprocessing pipeline"
+        },
+        "Calibrator Observation": {
+            "tags": [],
+            "description": "Calibrator Observation for UC1 LBA scheduling unit",
+            "specifications_doc": {
+                "name": "calibrator",
+                "duration": 120,
+                "pointing": {
+                    "angle1": 0.6624317181687094,
+                    "angle2": 1.5579526427549426,
+                    "direction_type": "J2000"
+                },
+                "autoselect": false
+            },
+            "specifications_template": "calibrator observation"
+        }
+    },
+    "parameters": [
+        {
+            "name": "Target Pointing 1",
+            "refs": [
+                "#/tasks/Target Observation/specifications_doc/SAPs/0/digital_pointing"
+            ]
+        },
+        {
+            "name": "Target Pointing 2",
+            "refs": [
+                "#/tasks/Target Observation/specifications_doc/SAPs/1/digital_pointing"
+            ]
+        },
+        {
+            "name": "Target Pointing 3",
+            "refs": [
+                "#/tasks/Target Observation/specifications_doc/SAPs/2/digital_pointing"
+            ]
+        },
+        {
+            "name": "Time averaging steps",
+            "refs": [
+                "#/tasks/Pipeline target1/specifications_doc/average/time_steps",
+                "#/tasks/Pipeline target2/specifications_doc/average/time_steps",
+                "#/tasks/Pipeline target3/specifications_doc/average/time_steps"
+            ]
+        },
+        {
+            "name": "Frequency averaging steps",
+            "refs": [
+                "#/tasks/Pipeline target1/specifications_doc/average/frequency_steps",
+                "#/tasks/Pipeline target2/specifications_doc/average/frequency_steps",
+                "#/tasks/Pipeline target3/specifications_doc/average/frequency_steps"
+            ]
+        },
+        {
+            "name": "Demix sources",
+            "refs": [
+                "#/tasks/Pipeline target1/specifications_doc/demix/sources",
+                "#/tasks/Pipeline target2/specifications_doc/demix/sources",
+                "#/tasks/Pipeline target3/specifications_doc/demix/sources"
+            ]
+        }
+    ],
+    "task_relations": [
+        {
+            "tags": [],
+            "input": {
+                "role": "any",
+                "datatype": "visibilities",
+                "dataformat": "MeasurementSet"
+            },
+            "output": {
+                "role": "correlator",
+                "datatype": "visibilities",
+                "dataformat": "MeasurementSet"
+            },
+            "consumer": "Calibrator Pipeline",
+            "producer": "Calibrator Observation",
+            "selection_doc": {},
+            "selection_template": "all"
+        },
+        {
+            "tags": [],
+            "input": {
+                "role": "any",
+                "datatype": "visibilities",
+                "dataformat": "MeasurementSet"
+            },
+            "output": {
+                "role": "correlator",
+                "datatype": "visibilities",
+                "dataformat": "MeasurementSet"
+            },
+            "consumer": "Pipeline target1",
+            "producer": "Target Observation",
+            "selection_doc": {
+                "sap": [
+                    "target1"
+                ]
+            },
+            "selection_template": "SAP"
+        },
+        {
+            "tags": [],
+            "input": {
+                "role": "any",
+                "datatype": "visibilities",
+                "dataformat": "MeasurementSet"
+            },
+            "output": {
+                "role": "correlator",
+                "datatype": "visibilities",
+                "dataformat": "MeasurementSet"
+            },
+            "consumer": "Pipeline target2",
+            "producer": "Target Observation",
+            "selection_doc": {
+                "sap": [
+                    "target2"
+                ]
+            },
+            "selection_template": "SAP"
+        },
+        {
+            "tags": [],
+            "input": {
+                "role": "any",
+                "datatype": "visibilities",
+                "dataformat": "MeasurementSet"
+            },
+            "output": {
+                "role": "correlator",
+                "datatype": "visibilities",
+                "dataformat": "MeasurementSet"
+            },
+            "consumer": "Pipeline target3",
+            "producer": "Target Observation",
+            "selection_doc": {
+                "sap": [
+                    "target3"
+                ]
+            },
+            "selection_template": "SAP"
+        },
+        {
+            "tags": [],
+            "input": {
+                "role": "any",
+                "datatype": "visibilities",
+                "dataformat": "MeasurementSet"
+            },
+            "output": {
+                "role": "any",
+                "datatype": "visibilities",
+                "dataformat": "MeasurementSet"
+            },
+            "consumer": "Ingest",
+            "producer": "Calibrator Pipeline",
+            "selection_doc": {},
+            "selection_template": "all"
+        },
+        {
+            "tags": [],
+            "input": {
+                "role": "any",
+                "datatype": "visibilities",
+                "dataformat": "MeasurementSet"
+            },
+            "output": {
+                "role": "any",
+                "datatype": "visibilities",
+                "dataformat": "MeasurementSet"
+            },
+            "consumer": "Ingest",
+            "producer": "Pipeline target1",
+            "selection_doc": {},
+            "selection_template": "all"
+        },
+        {
+            "tags": [],
+            "input": {
+                "role": "any",
+                "datatype": "visibilities",
+                "dataformat": "MeasurementSet"
+            },
+            "output": {
+                "role": "any",
+                "datatype": "visibilities",
+                "dataformat": "MeasurementSet"
+            },
+            "consumer": "Ingest",
+            "producer": "Pipeline target2",
+            "selection_doc": {},
+            "selection_template": "all"
+        },
+        {
+            "tags": [],
+            "input": {
+                "role": "any",
+                "datatype": "visibilities",
+                "dataformat": "MeasurementSet"
+            },
+            "output": {
+                "role": "any",
+                "datatype": "visibilities",
+                "dataformat": "MeasurementSet"
+            },
+            "consumer": "Ingest",
+            "producer": "Pipeline target3",
+            "selection_doc": {},
+            "selection_template": "all"
+        }
+    ],
+    "task_scheduling_relations": [
+        {
+            "first": "Calibrator Observation",
+            "second": "Target Observation",
+            "placement": "parallel",
+            "time_offset": 0
+        }
+    ]
+}
\ No newline at end of file
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/beamforming-complex-voltages-observation-scheduling-unit-observation-strategy.json b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/beamforming-complex-voltages-observation-scheduling-unit-observation-strategy.json
index 2aea1682130225ae3089e9cdbdce83886d9981fb..608d9e7c92b6f34190ca926bb1bd2df5ff23a7cf 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/beamforming-complex-voltages-observation-scheduling-unit-observation-strategy.json
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/beamforming-complex-voltages-observation-scheduling-unit-observation-strategy.json
@@ -880,18 +880,6 @@
               }
             ]
           }
-        ],
-        "station_groups": [
-          {
-            "stations": [
-              "CS002",
-              "CS003",
-              "CS004",
-              "CS005",
-              "CS006",
-              "CS007"
-            ]
-          }
         ]
       },
       "specifications_template": "beamforming observation"
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/common_schema_template-beamforming-1.json b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/common_schema_template-beamforming-1.json
index 21f2f776d969c794ff8c2e4661c5f35c8c9da074..71664e70c49bb16cf28bb22dccd6a2863fca8f50 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/common_schema_template-beamforming-1.json
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/common_schema_template-beamforming-1.json
@@ -23,7 +23,8 @@
       "default": {},
       "properties": {
         "stokes": {
-          "$ref": "#/definitions/stokes"
+          "$ref": "#/definitions/stokes",
+          "default": "I"
         },
         "time_integration_factor": {
           "type": "integer",
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/sap_template-1.json b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/sap_template-1.json
index 946514d0c60e895085e3d74c6390f98241c30a3f..0673d74983b0e613cc84e145559c2454f8b9cef6 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/sap_template-1.json
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/sap_template-1.json
@@ -33,7 +33,8 @@
           "default": "1970-01-01T00:00:00.000000Z"
         },
         "duration": {
-          "$ref": "http://tmss.lofar.org/api/schemas/commonschematemplate/datetime/1/#/definitions/timedelta"
+          "$ref": "http://tmss.lofar.org/api/schemas/commonschematemplate/datetime/1/#/definitions/timedelta",
+          "default": 0
         }
       },
       "additionalProperties": false,
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/simple-beamforming-observation-scheduling-unit-observation-strategy.json b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/simple-beamforming-observation-scheduling-unit-observation-strategy.json
index 53ed5dbf731f4a4e2ef9c9e43380c81690042e68..9425a872ab74b6e3f26209f06bccb081c4c5dd5c 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/simple-beamforming-observation-scheduling-unit-observation-strategy.json
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/simple-beamforming-observation-scheduling-unit-observation-strategy.json
@@ -21,7 +21,8 @@
         ],
         "station_groups": [
           {
-            "stations": [ "CS002", "CS003", "CS004", "CS005", "CS006", "CS007"]
+            "stations": [ "CS002", "CS003", "CS004", "CS005", "CS006", "CS007"],
+            "max_nr_missing": 1
           }
         ],
         "tile_beam": {
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/simple-observation-scheduling-unit-observation-strategy.json b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/simple-observation-scheduling-unit-observation-strategy.json
index b083d1177d7f51941dc17ce3f9b9eceff5f6a357..9d82b941e5577b48a4bd2f2b63808ee757ef4784 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/simple-observation-scheduling-unit-observation-strategy.json
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/simple-observation-scheduling-unit-observation-strategy.json
@@ -25,7 +25,8 @@
         "antenna_set": "HBA_DUAL_INNER",
         "filter": "HBA_110_190",
         "station_groups": [ {
-            "stations": ["CS002", "CS003", "CS004", "CS005", "CS006", "CS007"]
+            "stations": ["CS002", "CS003", "CS004", "CS005", "CS006", "CS007"],
+            "max_nr_missing": 1
         }],
         "tile_beam": {
           "direction_type": "J2000",
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/subtask_template-observation-1.json b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/subtask_template-observation-1.json
index fbf82d5c3878a8fd5cbe8cc8dd0f2319825d89cd..ff1abf265347a47349fc09a4e696466f01ed2cbf 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/subtask_template-observation-1.json
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/subtask_template-observation-1.json
@@ -144,6 +144,7 @@
                 "headerTemplate": "Pipeline {{ self.index }}",
                 "title": "Pipeline",
                 "additionalProperties": false,
+                "default": {},
                 "properties": {
                   "coherent": {
                     "title": "Coherent Stokes Settings",
@@ -178,6 +179,7 @@
                             "title": "Tied-Array Beam",
                             "headerTemplate": "TAB {{ self.index }}",
                             "additonalProperties": false,
+                            "default": {},
                             "properties": {
                               "coherent": {
                                 "type": "boolean",
@@ -214,7 +216,7 @@
                       },
                       "required":[
                         "name",
-                      "tabs"
+                        "tabs"
                       ]
                     },
                     "minItems": 1
@@ -227,7 +229,8 @@
                   }
                 },
                 "required": [
-                  "SAPs"
+                  "SAPs",
+                  "stations"
                 ]
               }
             },
@@ -242,14 +245,17 @@
                 "headerTemplate": "Pipeline {{ self.index }}",
                 "title": "Fly's Eye Pipeline",
                 "additionalProperties": false,
+                "required": ["coherent", "stations"],
                 "properties": {
                   "coherent": {
                     "title": "Coherent Stokes Settings",
-                    "$ref": "http://tmss.lofar.org/api/schemas/commonschematemplate/beamforming/1#/definitions/stokes_settings"
+                    "$ref": "http://tmss.lofar.org/api/schemas/commonschematemplate/beamforming/1#/definitions/stokes_settings",
+                    "default": {}
                   },
                   "stations": {
                     "description": "Stations to (flys eye) beam form. This can be a subset of the obervation stations.",
-                    "$ref": "http://tmss.lofar.org/api/schemas/commonschematemplate/stations/1/#/definitions/station_list"
+                    "$ref": "http://tmss.lofar.org/api/schemas/commonschematemplate/stations/1/#/definitions/station_list",
+                    "default": []
                   }
                 }
               }
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/task_template-beamforming_observation-1.json b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/task_template-beamforming_observation-1.json
index 3bc47caae4730b28eea98e3183f3231c4bd8bfb6..48a4e87166f9c71032ece50965cdd8469e700399 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/task_template-beamforming_observation-1.json
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/task_template-beamforming_observation-1.json
@@ -202,7 +202,8 @@
             "default": {},
             "properties": {
               "settings": {
-                "$ref": "http://tmss.lofar.org/api/schemas/commonschematemplate/beamforming/1#/definitions/stokes_settings"
+                "$ref": "http://tmss.lofar.org/api/schemas/commonschematemplate/beamforming/1#/definitions/stokes_settings",
+                "default": {}
               },
               "SAPs": {
                 "type": "array",
@@ -248,7 +249,8 @@
             "default": {},
             "properties": {
               "settings": {
-                "$ref": "http://tmss.lofar.org/api/schemas/commonschematemplate/beamforming/1#/definitions/stokes_settings"
+                "$ref": "http://tmss.lofar.org/api/schemas/commonschematemplate/beamforming/1#/definitions/stokes_settings",
+                "default": {}
               },
               "enabled": {
                 "title": "Enable Fly's Eye",
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/task_template-pulsar_pipeline-1.json b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/task_template-pulsar_pipeline-1.json
index ff7248ca01a0bc7f560bc6ea7d2fceff269a9dd7..256b033c1d034bfda4f110014a7886b891242e05 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/task_template-pulsar_pipeline-1.json
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/task_template-pulsar_pipeline-1.json
@@ -35,6 +35,7 @@
     "single_pulse_search": {
       "type": "boolean",
       "title": "Single-pulse search",
+      "description": "Instructs PRESTO to process single pulses, and enables Digifil for CV data",
       "default": false
     },
     "presto": {
@@ -81,6 +82,21 @@
           "type": "boolean",
           "default": true
         },
+        "prepdata": {
+          "title": "prepdata",
+          "type": "object",
+          "default": {},
+          "additionalProperties": false,
+          "properties": {
+            "dm": {
+              "title": "DM",
+              "desciption": "Dispersion Measure (-1 for none)",
+              "type": "number",
+              "minimum": -1,
+              "default": -1
+            }
+          }
+        },
         "rrats": {
           "title": "RRATs analysis",
           "type": "object",
@@ -99,6 +115,20 @@
               "default": 5
             }
           }
+        },
+        "rfifind": {
+          "title": "rfifind",
+          "type": "object",
+          "default": {},
+          "additionalProperties": false,
+          "properties": {
+            "blocks": {
+              "title": "blocks",
+              "type": "integer",
+              "minimum": 1,
+              "default": 16
+            }
+          }
         }
       }
     },
@@ -114,17 +144,18 @@
           "default": true
         },
         "digifil": {
-          "title": "DSPSR",
+          "title": "Digifil",
+          "description": "Processes single pulses in CV data if single-pulse search is enabled",
           "type": "object",
           "default": {},
           "additionalProperties": false,
           "properties": {
             "dm": {
               "title": "DM",
-              "desciption": "Dispersion Measure (0.0 for none)",
+              "desciption": "Dispersion Measure (-1 for none)",
               "type": "number",
-              "minimum": 0,
-              "default": 0
+              "minimum": -1,
+              "default": -1
             },
             "integration_time": {
               "title": "Integration time",
@@ -147,6 +178,32 @@
             }
           }
         },
+        "filterbank": {
+          "title": "Create filter bank",
+          "type": "object",
+          "default": {},
+          "additionalProperties": false,
+          "properties": {
+            "enabled": {
+              "type": "boolean",
+              "title": "Enabled",
+              "default": false
+            },
+            "frequency_channels": {
+              "title": "Frequency channels",
+              "description": "Number of frequency channels (multiple of subbands/part)",
+              "type": "integer",
+              "minimum": 1,
+              "maximum": 512,
+              "default": 120
+            },
+            "coherent_dedispersion": {
+              "title": "Coherent Dedispersion",
+              "type": "boolean",
+              "default": true
+            }
+          }
+        },
         "optimise_period_dm": {
           "title": "Optimise period & DM",
           "type": "boolean",
@@ -158,6 +215,12 @@
           "type": "boolean",
           "default": true
         },
+        "single_pulse_subintegration": {
+          "title": "Single pulse subintegration",
+          "description": "Create single-pulse subintegrations with inter-channel dispersion delays removed.",
+          "type": "boolean",
+          "default": false
+        },
         "subintegration_length": {
           "title": "Subintegration length",
           "type": "integer",
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/templates.json b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/templates.json
index fdf0b7943df3db1cc7eb687d5b9716381adff2ed..0b9d027a6e1721604051537375a2ed13e6f9faa9 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/schemas/templates.json
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/schemas/templates.json
@@ -312,6 +312,14 @@
     "name": "VLBI session",
     "description": "VLBI session ongoing. International station network not available.",
     "version": 1
+  },
+    {
+    "file_name": "LBA-survey-observation-scheduling-unit-observation-strategy.json",
+    "template": "scheduling_unit_observing_strategy_template",
+    "scheduling_unit_template_name": "scheduling unit",
+    "scheduling_unit_template_version": "1",
+    "name": "IM LBA Survey Strategy - 3 Beams",
+    "description": "LBA Imaging Observing Strategy using 3 Beams and a parallel Calibrator Beam with a preprocessing pipeline for each, used for the LOFAR LBA Survey and LBA Co-Observing.",
+    "version": 1
   }
-
 ]
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/serializers/specification.py b/SAS/TMSS/backend/src/tmss/tmssapp/serializers/specification.py
index 0e081ba8296b54e329bbc268d870ae689c7337d6..b7a8b57615862950c0a4b9a01406364fd1b34bf7 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/serializers/specification.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/serializers/specification.py
@@ -449,3 +449,9 @@ class SchedulingUnitBlueprintExtendedSerializer(SchedulingUnitBlueprintSerialize
     are expanded into the json response for a single API call (for convenience/optimization).
     """
     task_blueprints = TaskBlueprintExtendedSerializer(many=True)
+
+
+class SchedulingStateSerializer(DynamicRelationalHyperlinkedModelSerializer):
+    class Meta:
+        model = models.SchedulingState
+        fields = '__all__'
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/serializers/widgets.py b/SAS/TMSS/backend/src/tmss/tmssapp/serializers/widgets.py
index 1b5f9dffd1f0861737cc5400f4e9369df4139cd7..385d70ddf89368b5eaf0fc68643fc11f35ceb43e 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/serializers/widgets.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/serializers/widgets.py
@@ -57,7 +57,7 @@ class JSONEditorField(serializers.JSONField):
                 # the josdejong_jsoneditor_widget cannot resolve absolute URL's in the schema
                 # although this should be possible according to the JSON schema standard.
                 # so, let's do the resolving here and feed the resolved schema to the josdejong_jsoneditor_widget
-                schema = json_utils.resolved_refs(schema)
+                schema = json_utils.resolved_remote_refs(schema)
 
                 # the editor already fetched and cached common meta schema's from json-schema.org
                 # and raises an error if we supply it as well
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/subtasks.py b/SAS/TMSS/backend/src/tmss/tmssapp/subtasks.py
index 413c28a1f1bfb9f529d2c335ddec662a0311aeb4..9c581d92f9e8c2f68195dc39db763e5b5d9dc913 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/subtasks.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/subtasks.py
@@ -269,7 +269,7 @@ def create_observation_subtask_specifications_from_observation_task_blueprint(ta
             beamformer_station_set = set(beamformer_station_list).intersection(set(subtask_spec['stations']['station_list']))
 
             # make it a nice readable sorted list.
-            beamformer_station_list = sorted(list(beamformer_station_list))
+            beamformer_station_list = sorted(list(beamformer_station_list))    # todo: should this use beamformer_station_set instead?
             # use the beamformer_station_list below for the tab pipeline and/or flys eye
 
             for stokes_type in ["coherent", "incoherent"]:
@@ -692,14 +692,17 @@ def create_pipeline_subtask_from_task_blueprint(task_blueprint: TaskBlueprint, s
     for task_relation_blueprint in task_blueprint.produced_by.all():
         producing_task_blueprint = task_relation_blueprint.producer
 
-        # TODO: apply some better filtering. Now we're just connecting it to all predecessor observation subtasks
+        # create inputs for all predecessor observation subtask outputs that belong to the producer task of this task relation
+        # TODO: more filtering needed?
         predecessor_observation_subtasks = [st for st in producing_task_blueprint.subtasks.order_by('id').all() if st.specifications_template.type.value == SubtaskType.Choices.OBSERVATION.value]
         for predecessor_obs_subtask in predecessor_observation_subtasks:
             for predecessor_subtask_output in predecessor_obs_subtask.outputs.all():
-                subtask_input = SubtaskInput.objects.create(subtask=subtask,
-                                                            producer=predecessor_subtask_output,
-                                                            selection_doc=task_relation_blueprint.selection_doc,
-                                                            selection_template=task_relation_blueprint.selection_template)
+                if predecessor_subtask_output.task_blueprint == task_relation_blueprint.producer:
+                    subtask_input = SubtaskInput.objects.create(subtask=subtask,
+                                                                producer=predecessor_subtask_output,
+                                                                selection_doc=task_relation_blueprint.selection_doc,
+                                                                selection_template=task_relation_blueprint.selection_template)
+
     subtask_output = SubtaskOutput.objects.create(subtask=subtask,
                                                   task_blueprint=task_blueprint)
 
@@ -1733,6 +1736,7 @@ def schedule_pipeline_subtask(pipeline_subtask: Subtask):
     # iterate over all inputs
     input_dataproducts = []
     for pipeline_subtask_input in pipeline_subtask.inputs.all():
+
         # select and set input dataproducts that meet the filter defined in selection_doc
         dataproducts = [dataproduct for dataproduct in pipeline_subtask_input.producer.dataproducts.all()
                         if specifications_doc_meets_selection_doc(dataproduct.specifications_doc, pipeline_subtask_input.selection_doc)]
@@ -2029,22 +2033,37 @@ def _generate_subtask_specs_from_pulsar_pipeline_task_specs(pipeline_task_specs,
     subtask_specs["presto"]["skip_prepfold"]       = not presto_specs["prepfold"]
     subtask_specs["presto"]["rrats"]               = presto_specs["rrats"]["enabled"]
     subtask_specs["presto"]["rrats_dm_range"]      = presto_specs["rrats"]["dm_range"]
-    subtask_specs["presto"]["prepdata_extra_opts"] = ""
+    subtask_specs["presto"]["prepdata_extra_opts"] = " ".join([
+              "-dm {dm}".format(**presto_specs["prepdata"]) if presto_specs["prepdata"]["dm"] != -1 else "",
+              ])
+
     subtask_specs["presto"]["prepfold_extra_opts"] = ""
     subtask_specs["presto"]["prepsubband_extra_opts"] = ""
-    subtask_specs["presto"]["rfifind_extra_opts"]  = ""
+    subtask_specs["presto"]["rfifind_extra_opts"]  = "".join([
+              "-blocks {blocks}".format(**presto_specs["rfifind"]),
+              ])
+
 
     # DSPSR
     dspsr_specs = pipeline_task_specs["dspsr"]
+    digifil_specs = dspsr_specs["digifil"]
+    filterbank_specs = dspsr_specs["filterbank"]
     subtask_specs["dspsr"] = {}
     subtask_specs["dspsr"]["skip_dspsr"]           = not dspsr_specs["enabled"]
-    subtask_specs["dspsr"]["digifil_extra_opts"]   = "-D {dm} -t {integration_time} -f {frequency_channels}{dedisperse}".format(
-                                                         **dspsr_specs["digifil"],
-                                                         dedisperse = ":D" if dspsr_specs["digifil"]["coherent_dedispersion"] else "")
+    subtask_specs["dspsr"]["digifil_extra_opts"]   = " ".join([
+              "-D {dm}".format(**digifil_specs) if digifil_specs["dm"] != -1 else "",
+              "-t {integration_time}".format(**digifil_specs),
+              "-f {frequency_channels}{dedispersion}".format(**digifil_specs, dedispersion=":D" if digifil_specs["coherent_dedispersion"] else ""),
+              ])
+
     subtask_specs["dspsr"]["nopdmp"]               = not dspsr_specs["optimise_period_dm"]
     subtask_specs["dspsr"]["norfi"]                = not dspsr_specs["rfi_excision"]
     subtask_specs["dspsr"]["tsubint"]              = dspsr_specs["subintegration_length"]
-    subtask_specs["dspsr"]["dspsr_extra_opts"]     = ""
+    subtask_specs["dspsr"]["dspsr_extra_opts"]     = " ".join([
+              "-U minX1 -t 1", # minimise memory usage, and use 1 thread
+              "-s -K" if dspsr_specs["single_pulse_subintegration"] else "",
+              "-F {frequency_channels}{dedispersion}".format(**filterbank_specs, dedispersion=":D" if filterbank_specs["coherent_dedispersion"] else "") if filterbank_specs["enabled"] else "",
+              ])
 
     # output
     output_specs = pipeline_task_specs["output"]
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/views.py b/SAS/TMSS/backend/src/tmss/tmssapp/views.py
index 7620179e0a574d3b5cd51d0f2be6f0379c8364a8..e26298a79d95533ca444e180190e60e2748d78d0 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/views.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/views.py
@@ -13,7 +13,7 @@ from lofar.common.datetimeutils import formatDatetime
 from lofar.common.util import single_line_with_single_spaces
 from lofar.sas.tmss.tmss.tmssapp.adapters.parset import convert_to_parset
 from lofar.sas.tmss.tmss.tmssapp.adapters.reports import create_cycle_report
-from lofar.sas.tmss.tmss.tmssapp.tasks import create_scheduling_unit_draft_from_observing_strategy_template, create_task_blueprints_and_subtasks_from_scheduling_unit_draft
+from lofar.sas.tmss.tmss.tmssapp.tasks import create_scheduling_unit_draft_from_observing_strategy_template, create_task_blueprints_and_subtasks_from_scheduling_unit_draft, create_task_drafts_from_scheduling_unit_draft
 from drf_yasg.utils import swagger_auto_schema
 from drf_yasg.openapi import Parameter
 from rest_framework.authtoken.models import Token
@@ -340,15 +340,38 @@ def get_target_transit(request):
 
 @swagger_auto_schema(method='GET', responses={200: 'A JSON object with cycles information for reporting.'},
                      manual_parameters=[Parameter(name='cycles', required=True, type='array', in_='query',
-                                                  items={'type': 'string'}, description="Cycles' primary keys.")])
+                                                  items={'type': 'string'}, description="Cycles' primary keys."),
+                                        Parameter(name='start_time', required=False, type='string', in_='query',
+                                                  description="A timestamp in isoformat"),
+                                        Parameter(name='stop_time', required=False, type='string', in_='query',
+                                                  description="A timestamp in isoformat")])
 @api_view(['GET'])
 def get_cycles_report(request):
     cycles = str(request.GET.get('cycles')).split(',')
+    start, stop = request.GET.get('start', None), request.GET.get('stop', None)
+    # Check date parameters
+    if start:
+        try:
+            start = dateutil.parser.parse(start, ignoretz=True)
+        except Exception:
+            return HttpResponse('Error: please specify an isoformat timestamp for start_time', status=400)
+    if stop:
+        try:
+            stop = dateutil.parser.parse(stop, ignoretz=True)
+        except Exception:
+            return HttpResponse('Error: please specify an isoformat timestamp for stop_time', status=400)
 
     results = {}
     for c_pk in cycles:
         c = get_object_or_404(models.Cycle, pk=c_pk)
-        results[c_pk] = create_cycle_report(request, c)
+        if not start or start < c.start:
+            start = c.start
+        if not stop or stop > c.stop:
+            stop = c.stop
+        try:
+            results[c_pk] = create_cycle_report(request, c, start, stop)
+        except RuntimeError:
+            return HttpResponse('Error: workflowapp is not running. It is needed to retrieve some reporting information.', status=503)
 
     return JsonResponse(results)
 
@@ -385,6 +408,9 @@ def submit_trigger(request):
         scheduling_unit_draft.interrupts_telescope = True
         scheduling_unit_draft.save()
 
+        # instantiate the task_drafts
+        scheduling_unit_draft = create_task_drafts_from_scheduling_unit_draft(scheduling_unit_draft)
+
         # if the trigger mode is 'run', then turn it into a blueprint which the dynamic scheduler will try to pick up, given the scheduling constraints
         if trigger_doc['mode'].lower() == 'run':
             scheduling_unit_blueprint = create_task_blueprints_and_subtasks_from_scheduling_unit_draft(scheduling_unit_draft)
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/lofar_viewset.py b/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/lofar_viewset.py
index 1234dbfca5d208180f565ede00b20dd5ec720f5e..09538bb3aa46cba4b4d26155d29c96d8252aa9b1 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/lofar_viewset.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/lofar_viewset.py
@@ -24,20 +24,32 @@ from django_filters.rest_framework import DjangoFilterBackend, FilterSet, CharFi
 from django_filters import filterset
 from rest_framework.filters import OrderingFilter
 from django.contrib.postgres.fields import JSONField, ArrayField
+from django.db.models.fields import CharField, TextField
 from copy import deepcopy
 
 
-class LOFARDefaultFilterSet(FilterSet):
-    FILTER_DEFAULTS = deepcopy(filterset.FILTER_FOR_DBFIELD_DEFAULTS)
-    FILTER_DEFAULTS.update({
+FILTER_OVERRIDES = {
         JSONField: {
-            'filter_class': CharFilter
+            'filter_class': CharFilter,
+            'extra': lambda f: {'lookup_expr': 'icontains'}
         },
         ArrayField: {
             'filter_class': CharFilter,
             'extra': lambda f: {'lookup_expr': 'icontains'}
         },
-    })
+        CharField: {
+            'filter_class': CharFilter,
+            'extra': lambda f: {'lookup_expr': 'icontains'}
+        },
+        TextField: {
+            'filter_class': CharFilter,
+            'extra': lambda f: {'lookup_expr': 'icontains'}
+        }
+    }
+
+class LOFARDefaultFilterSet(FilterSet):
+    FILTER_DEFAULTS = deepcopy(filterset.FILTER_FOR_DBFIELD_DEFAULTS)
+    FILTER_DEFAULTS.update(FILTER_OVERRIDES)
 
 
 class LOFARFilterBackend(DjangoFilterBackend):
@@ -148,7 +160,7 @@ class AbstractTemplateViewSet(LOFARViewSet):
     @action(methods=['get'], detail=True)
     def ref_resolved_schema(self, request, pk=None):
         template = get_object_or_404(self.queryset.model, pk=pk)
-        schema = json_utils.resolved_refs(template.schema)
+        schema = json_utils.resolved_remote_refs(template.schema)
         return JsonResponse(schema, json_dumps_params={'indent': 2})
 
     @swagger_auto_schema(responses={200: 'JSON object with all the defaults from the schema filled in',
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/specification.py b/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/specification.py
index dc897e8d234ba0a9b0acf2c3fd85a310bf224f1a..1f4defdc79838614333a9dbb20f9a1b8a8b98e2d 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/specification.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/specification.py
@@ -8,6 +8,7 @@ from django.http import JsonResponse
 from django.contrib.auth import get_user_model
 User = get_user_model()
 from django_filters import rest_framework as filters
+from django_filters import fields as filter_fields
 import django_property_filter as property_filters
 from rest_framework.viewsets import ReadOnlyModelViewSet
 from rest_framework import status
@@ -20,8 +21,9 @@ from rest_framework.response import Response as RestResponse
 
 from drf_yasg.utils import swagger_auto_schema
 from drf_yasg.openapi import Parameter
+from drf_yasg import openapi
 
-from lofar.sas.tmss.tmss.tmssapp.viewsets.lofar_viewset import LOFARViewSet, LOFARNestedViewSet, AbstractTemplateViewSet, LOFARCopyViewSet, LOFARFilterBackend
+from lofar.sas.tmss.tmss.tmssapp.viewsets.lofar_viewset import LOFARViewSet, LOFARNestedViewSet, AbstractTemplateViewSet, LOFARCopyViewSet, LOFARFilterBackend, FILTER_OVERRIDES
 from lofar.sas.tmss.tmss.tmssapp import models
 from lofar.sas.tmss.tmss.tmssapp import serializers
 from lofar.sas.tmss.tmss.tmssapp.adapters.reports import create_cycle_report, create_project_report
@@ -43,7 +45,7 @@ import logging
 import dateutil
 
 from django.core.exceptions import ObjectDoesNotExist
-
+from django import forms
 
 logger = logging.getLogger(__name__)
 
@@ -82,14 +84,14 @@ class SchedulingUnitObservingStrategyTemplateViewSet(LOFARViewSet):
     @swagger_auto_schema(responses={status.HTTP_201_CREATED: 'The newly created scheduling unit',
                                     status.HTTP_403_FORBIDDEN: 'forbidden'},
                          operation_description="Create a new SchedulingUnit based on this SchedulingUnitObservingStrategyTemplate, with the given <name> and <description> and make it a child of the given <scheduling_set_id>",
+                         request_body=openapi.Schema(type=openapi.TYPE_OBJECT,
+                                                     description="a JSON dict containing the override values for the parameters in the template"),
                          manual_parameters=[Parameter(name='scheduling_set_id', required=True, type='integer', in_='query',
                                                       description="the id of the scheduling_set which will be the parent of the newly created scheduling_unit"),
                                             Parameter(name='name', required=False, type='string', in_='query',
                                                       description="The name for the newly created scheduling_unit"),
                                             Parameter(name='description', required=False, type='string', in_='query',
-                                                      description="The description for the newly created scheduling_unit"),
-                                            Parameter(name='requirements_doc_overrides', required=False, type='dict', in_='body',
-                                                      description="a JSON dict containing the override values for the parameters in the template")
+                                                      description="The description for the newly created scheduling_unit")
                                             ])
     @action(methods=['post'], detail=True)
     def create_scheduling_unit(self, request, pk=None):
@@ -352,7 +354,28 @@ class CycleViewSet(LOFARViewSet):
     @action(methods=['get'], detail=True, url_name="report", name="Get Report")
     def report(self, request, pk=None):
         cycle = get_object_or_404(models.Cycle, pk=pk)
-        result = create_cycle_report(request, cycle)
+        # Check start and stop times
+        start, stop = request.query_params.get('start', None), request.query_params.get('stop', None)
+        if start:
+            try:
+                start = dateutil.parser.parse(start, ignoretz=True)
+            except Exception:
+                return Response('Error: please specify an isoformat timestamp for start_time', status=400)
+        if stop:
+            try:
+                stop = dateutil.parser.parse(stop, ignoretz=True)
+            except Exception:
+                return Response('Error: please specify an isoformat timestamp for stop_time', status=400)
+
+        if not start or start < cycle.start:
+            start = cycle.start
+        if not stop or stop > cycle.stop:
+            stop = cycle.stop
+
+        try:
+            result = create_cycle_report(request, cycle, start, stop)
+        except RuntimeError:
+            return Response('Error: workflowapp is not running. It is needed to retrieve some reporting information.', status=status.HTTP_503_SERVICE_UNAVAILABLE)
         return Response(result, status=status.HTTP_200_OK)
 
 
@@ -392,7 +415,24 @@ class ProjectViewSet(LOFARViewSet):
     @action(methods=['get'], detail=True, url_name="report", name="Get Report")
     def report(self, request, pk=None):
         project = get_object_or_404(models.Project, pk=pk)
-        result = create_project_report(request, project)
+
+        # Check start and stop times
+        start, stop = request.query_params.get('start', None), request.query_params.get('stop', None)
+        if start:
+            try:
+                start = dateutil.parser.parse(start, ignoretz=True)
+            except Exception:
+                return Response('Error: please specify an isoformat timestamp for start_time', status=400)
+        if stop:
+            try:
+                stop = dateutil.parser.parse(stop, ignoretz=True)
+            except Exception:
+                return Response('Error: please specify an isoformat timestamp for stop_time', status=400)
+
+        try:
+            result = create_project_report(request, project, start, stop)
+        except RuntimeError:
+            return Response('Error: workflowapp is not running. It is needed to retrieve some reporting information.', status=status.HTTP_503_SERVICE_UNAVAILABLE)
         return Response(result, status=status.HTTP_200_OK)
 
     @swagger_auto_schema(responses={200: 'List of users that have the "friend of project" role for this project',
@@ -495,21 +535,63 @@ class ProjectCategoryViewSet(LOFARViewSet):
     serializer_class = serializers.ProjectCategorySerializer
 
 
+class NumberInFilter(filters.BaseInFilter, filters.NumberFilter):
+    """
+    Custom filter for comma-separated lists of numbers
+    """
+    pass
+
+
+class FloatRangeField(filter_fields.RangeField):
+    """
+    Custom field for use in FloatRangeFilter
+    """
+    def __init__(self, fields=None, *args, **kwargs):
+        if fields is None:
+            fields = (
+                forms.FloatField(),
+                forms.FloatField())
+        super().__init__(fields, *args, **kwargs)
+
+
+class FloatRangeFilter(filters.RangeFilter):
+    """
+    Custom RangeFilter that works on float fields in a JSONField, which by default is not happy with numeric filtering
+     of django_filter due to internal use of a Decimal object.
+    """
+    field_class = FloatRangeField
+
+
 class SchedulingUnitDraftPropertyFilter(property_filters.PropertyFilterSet):
-    project = property_filters.PropertyCharFilter(field_name='project')
+    project = property_filters.PropertyCharFilter(field_name='project', lookup_expr='icontains')
+    scheduling_set = property_filters.PropertyCharFilter(field_name='scheduling_set', lookup_expr='icontains')  # remove to filter based on list of options
+    priority_rank = filters.RangeFilter(field_name='priority_rank')
+    id = NumberInFilter(field_name='id', lookup_expr='in')
+    id_min = filters.NumberFilter(field_name='id', lookup_expr='gte')
+    id_max = filters.NumberFilter(field_name='id', lookup_expr='lte')
+    scheduling_unit_blueprints = filters.ModelMultipleChoiceFilter(field_name='scheduling_unit_blueprints', queryset=models.SchedulingUnitBlueprint.objects.all())
+    duration_min = property_filters.PropertyDurationFilter(field_name='duration', lookup_expr='gte')
+    duration_max = property_filters.PropertyDurationFilter(field_name='duration', lookup_expr='lte')
+    created_at = filters.IsoDateTimeFromToRangeFilter(field_name='created_at')
+    updated_at = filters.IsoDateTimeFromToRangeFilter(field_name='updated_at')
+
+    # Todo: unfortunately we have to reference by task name for the lookup, which is not constant between tasks.
+    #  If there is no fixed name for the task you want to display here, we have to look this up somewhere else (tasks?)
+    #  or we could potentially determine the wanted angles in some function that iterates tasks and checks for sth like
+    #  task['specifications_template'] == 'target observation' and then we just expose the pointing as a property.
+    #  If exact filtering is sufficient, we could also consider to simply filter on a string 'angle1: <user input>' in
+    #  requirements_doc__tasks.
+    angle1 = FloatRangeFilter(field_name='requirements_doc__tasks__Target Observation__specifications_doc__SAPs__0__digital_pointing__angle1')
+    angle2 = FloatRangeFilter(field_name='requirements_doc__tasks__Target Observation__specifications_doc__SAPs__0__digital_pointing__angle2')
+    direction_type = filters.CharFilter(field_name='requirements_doc__tasks__Target Observation__specifications_doc__SAPs__0__digital_pointing__direction_type', lookup_expr='iexact')
+
+    observation_strategy_template_name = filters.CharFilter(field_name='observation_strategy_template__name', lookup_expr='icontains')
+    observation_strategy_template_description = filters.CharFilter(field_name='observation_strategy_template__description', lookup_expr='icontains')
 
     class Meta:
         model = models.SchedulingUnitDraft
         fields = '__all__'
-        filter_overrides = {
-            models.JSONField: {
-                'filter_class': property_filters.CharFilter,
-            },
-            models.ArrayField: {
-                'filter_class': property_filters.CharFilter,
-                'extra': lambda f: {'lookup_expr': 'icontains'}
-            },
-        }
+        filter_overrides = FILTER_OVERRIDES
 
 
 class SchedulingUnitDraftViewSet(LOFARViewSet):
@@ -856,24 +938,43 @@ class TaskBlueprintCopyToTaskDraftViewSet(LOFARCopyViewSet):
             return Response(content, status=status.HTTP_404_NOT_FOUND)
 
 
+class ModelChoiceInFilter(filters.BaseInFilter, filters.ModelChoiceFilter):
+    """
+    Custom filter for comma-separated lists of references
+    """
+    pass
+
 class SchedulingUnitBlueprintPropertyFilter(property_filters.PropertyFilterSet):
     start_time = property_filters.PropertyIsoDateTimeFromToRangeFilter(field_name='start_time')
     stop_time = property_filters.PropertyIsoDateTimeFromToRangeFilter(field_name='stop_time')
-    project = property_filters.PropertyCharFilter(field_name='project')
-    status = property_filters.PropertyCharFilter(field_name='status')
+    project = property_filters.PropertyCharFilter(field_name='project', lookup_expr='icontains')
+    status = property_filters.PropertyChoiceFilter(field_name='status', choices=tuple((i.value, i.value) for i in models.SchedulingUnitBlueprint.Status), lookup_expr='iexact')
+    priority_rank = filters.RangeFilter(field_name='priority_rank')
+    id = NumberInFilter(field_name='id', lookup_expr='in')
+    id_min = filters.NumberFilter(field_name='id', lookup_expr='gte')
+    id_max = filters.NumberFilter(field_name='id', lookup_expr='lte')
+    duration_min = property_filters.PropertyDurationFilter(field_name='duration', lookup_expr='gte')
+    duration_max = property_filters.PropertyDurationFilter(field_name='duration', lookup_expr='lte')
+    created_at = filters.IsoDateTimeFromToRangeFilter(field_name='created_at')
+    updated_at = filters.IsoDateTimeFromToRangeFilter(field_name='updated_at')
+    draft = ModelChoiceInFilter(field_name='draft', lookup_expr='in', queryset=models.SchedulingUnitDraft.objects.all())
+    draft_min = filters.NumberFilter(field_name='draft__id', lookup_expr='gte')
+    draft_max = filters.NumberFilter(field_name='draft__id', lookup_expr='lte')
+
+    # Todo: see SchedulingUnitDraftPropertyFilter
+    angle1 = FloatRangeFilter(field_name='requirements_doc__tasks__Target Observation__specifications_doc__SAPs__0__digital_pointing__angle1')
+    angle2 = FloatRangeFilter(field_name='requirements_doc__tasks__Target Observation__specifications_doc__SAPs__0__digital_pointing__angle2')
+    direction_type = filters.CharFilter(field_name='requirements_doc__tasks__Target Observation__specifications_doc__SAPs__0__digital_pointing__direction_type', lookup_expr='iexact')
+
+    scheduling_set = property_filters.PropertyCharFilter(field_name='draft__scheduling_set', lookup_expr='icontains')  # remove to filter based on list of options
+    observation_strategy_template = filters.ModelChoiceFilter(field_name='draft__observation_strategy_template', queryset=models.SchedulingUnitObservingStrategyTemplate.objects.all())
+    observation_strategy_template_name = filters.CharFilter(field_name='draft__observation_strategy_template__name', lookup_expr='icontains')
+    observation_strategy_template_description = filters.CharFilter(field_name='draft__observation_strategy_template__description', lookup_expr='icontains')
 
     class Meta:
         model = models.SchedulingUnitBlueprint
         fields = '__all__'
-        filter_overrides = {
-            models.JSONField: {
-                'filter_class': property_filters.CharFilter,
-            },
-            models.ArrayField: {
-                'filter_class': property_filters.CharFilter,
-                'extra': lambda f: {'lookup_expr': 'icontains'}
-            },
-        }
+        filter_overrides = FILTER_OVERRIDES
 
 
 class SchedulingUnitBlueprintViewSet(LOFARViewSet):
@@ -1004,10 +1105,34 @@ class SchedulingUnitBlueprintNestedViewSet(LOFARNestedViewSet):
         else:
             return models.SchedulingUnitBlueprint.objects.all()
 
+class TaskDraftPropertyFilter(property_filters.PropertyFilterSet):
+    id = NumberInFilter(field_name='id', lookup_expr='in')
+    id_min = filters.NumberFilter(field_name='id', lookup_expr='gte')
+    id_max = filters.NumberFilter(field_name='id', lookup_expr='lte')
+    scheduling_unit_draft = ModelChoiceInFilter(field_name='scheduling_unit_draft', lookup_expr='in', queryset=models.SchedulingUnitDraft.objects.all())
+    scheduling_unit_draft_min = filters.NumberFilter(field_name='scheduling_unit_draft__id', lookup_expr='gte')
+    scheduling_unit_draft_max = filters.NumberFilter(field_name='scheduling_unit_draft__id', lookup_expr='lte')
+    scheduling_unit_draft_name = filters.CharFilter(field_name='scheduling_unit_draft__name', lookup_expr='icontains')
+    task_blueprints = filters.ModelMultipleChoiceFilter(field_name='task_blueprints', queryset=models.TaskBlueprint.objects.all())
+    duration_min = property_filters.PropertyDurationFilter(field_name='duration', lookup_expr='gte')
+    duration_max = property_filters.PropertyDurationFilter(field_name='duration', lookup_expr='lte')
+    created_at = filters.IsoDateTimeFromToRangeFilter(field_name='created_at')
+    updated_at = filters.IsoDateTimeFromToRangeFilter(field_name='updated_at')
+    relative_start_time_min = property_filters.PropertyDurationFilter(field_name='relative_start_time', lookup_expr='gte')
+    relative_start_time_max = property_filters.PropertyDurationFilter(field_name='relative_start_time', lookup_expr='lte')
+    relative_stop_time_min = property_filters.PropertyDurationFilter(field_name='relative_stop_time', lookup_expr='gte')
+    relative_stop_time_max = property_filters.PropertyDurationFilter(field_name='relative_stop_time', lookup_expr='lte')
+
+    class Meta:
+        model = models.TaskDraft
+        fields = '__all__'
+        filter_overrides = FILTER_OVERRIDES
+
 
 class TaskDraftViewSet(LOFARViewSet):
     queryset = models.TaskDraft.objects.all()
     serializer_class = serializers.TaskDraftSerializer
+    filter_class = TaskDraftPropertyFilter
 
     # prefetch all reverse related references from other models on their related_name to avoid a ton of duplicate queries
     queryset = queryset.prefetch_related('first_scheduling_relation') \
@@ -1131,9 +1256,42 @@ class TaskDraftNestedViewSet(LOFARNestedViewSet):
              return models.TaskDraft.objects.all()
 
 
+class TaskBlueprintPropertyFilter(property_filters.PropertyFilterSet):
+    id = NumberInFilter(field_name='id', lookup_expr='in')
+    id_min = filters.NumberFilter(field_name='id', lookup_expr='gte')
+    id_max = filters.NumberFilter(field_name='id', lookup_expr='lte')
+    scheduling_unit_blueprint = ModelChoiceInFilter(field_name='scheduling_unit_blueprint', lookup_expr='in', queryset=models.SchedulingUnitBlueprint.objects.all())
+    scheduling_unit_blueprint_min = filters.NumberFilter(field_name='scheduling_unit_blueprint__id', lookup_expr='gte')
+    scheduling_unit_blueprint_max = filters.NumberFilter(field_name='scheduling_unit_blueprint__id', lookup_expr='lte')
+    scheduling_unit_blueprint_name = filters.CharFilter(field_name='scheduling_unit_blueprint__name', lookup_expr='icontains')
+    draft = ModelChoiceInFilter(field_name='draft',  lookup_expr='in', queryset=models.TaskDraft.objects.all())
+    draft_min = filters.NumberFilter(field_name='draft__id', lookup_expr='gte')
+    draft_max = filters.NumberFilter(field_name='draft__id', lookup_expr='lte')
+    duration_min = property_filters.PropertyDurationFilter(field_name='duration', lookup_expr='gte')
+    duration_max = property_filters.PropertyDurationFilter(field_name='duration', lookup_expr='lte')
+    created_at = filters.IsoDateTimeFromToRangeFilter(field_name='created_at')
+    updated_at = filters.IsoDateTimeFromToRangeFilter(field_name='updated_at')
+    relative_start_time_min = property_filters.PropertyDurationFilter(field_name='relative_start_time', lookup_expr='gte')
+    relative_start_time_max = property_filters.PropertyDurationFilter(field_name='relative_start_time', lookup_expr='lte')
+    relative_stop_time_min = property_filters.PropertyDurationFilter(field_name='relative_stop_time', lookup_expr='gte')
+    relative_stop_time_max = property_filters.PropertyDurationFilter(field_name='relative_stop_time', lookup_expr='lte')
+    start_time = property_filters.PropertyIsoDateTimeFromToRangeFilter(field_name='start_time')
+    stop_time = property_filters.PropertyIsoDateTimeFromToRangeFilter(field_name='stop_time')
+    status = property_filters.PropertyChoiceFilter(field_name='status', choices=tuple((i.value, i.value) for i in models.SubtaskState.Choices), lookup_expr='iexact')
+    subtasks = filters.ModelMultipleChoiceFilter(field_name='subtasks', queryset=models.Subtask.objects.all())
+    subtasks_min = filters.NumberFilter(field_name='subtasks__id', lookup_expr='gte')
+    subtasks_max = filters.NumberFilter(field_name='subtasks__id', lookup_expr='lte')
+
+    class Meta:
+        model = models.TaskBlueprint
+        fields = '__all__'
+        filter_overrides = FILTER_OVERRIDES
+
+
 class TaskBlueprintViewSet(LOFARViewSet):
     queryset = models.TaskBlueprint.objects.all()
     serializer_class = serializers.TaskBlueprintSerializer
+    filter_class = TaskBlueprintPropertyFilter
 
     # prefetch all reverse related references from other models on their related_name to avoid a ton of duplicate queries
     queryset = queryset.prefetch_related('first_scheduling_relation')\
@@ -1306,3 +1464,7 @@ class PriorityQueueTypeViewSet(LOFARViewSet):
     queryset = models.PriorityQueueType.objects.all()
     serializer_class = serializers.PriorityQueueTypeSerializer
 
+
+class SchedulingStateViewSet(LOFARViewSet):
+    queryset = models.SchedulingState.objects.all()
+    serializer_class = serializers.SchedulingStateSerializer
diff --git a/SAS/TMSS/backend/src/tmss/urls.py b/SAS/TMSS/backend/src/tmss/urls.py
index 409fcec7002c5bf2954bb8382471c7f08d289cb6..62b9edd25c4da8e373f9863e4a4c912559426958 100644
--- a/SAS/TMSS/backend/src/tmss/urls.py
+++ b/SAS/TMSS/backend/src/tmss/urls.py
@@ -132,6 +132,7 @@ router.register(r'project_category', viewsets.ProjectCategoryViewSet)
 router.register(r'quantity', viewsets.QuantityViewSet)
 router.register(r'task_type', viewsets.TaskTypeViewSet)
 router.register(r'priority_queue_type', viewsets.PriorityQueueTypeViewSet)
+router.register(r'scheduling_state', viewsets.SchedulingStateViewSet)
 
 # templates
 router.register(r'common_schema_template', viewsets.CommonSchemaTemplateViewSet)
diff --git a/SAS/TMSS/backend/src/tmss/workflowapp/viewsets/schedulingunitflow.py b/SAS/TMSS/backend/src/tmss/workflowapp/viewsets/schedulingunitflow.py
index 9cee5e3590fa25c91b14f3a5ac08191030f41ca6..f0faef758c15ae77476e14938934fdda3e26b758 100644
--- a/SAS/TMSS/backend/src/tmss/workflowapp/viewsets/schedulingunitflow.py
+++ b/SAS/TMSS/backend/src/tmss/workflowapp/viewsets/schedulingunitflow.py
@@ -28,6 +28,7 @@ from lofar.sas.tmss.tmss.tmssapp.adapters.keycloak import get_users_by_role_in_p
 
 from django.contrib.auth import get_user_model
 User = get_user_model()
+import uuid
 
 from .. import forms, models, serializers, flows
 import logging
@@ -207,7 +208,7 @@ class SchedulingUnitTaskAssignViewSet(mixins.CreateModelMixin,
     if 'qa_scheduling_unit_task_id' in kwargs:
       try:
         if request.GET.get('user_email'):  # For some reason this is GET data, even though it's a POST action...
-            user, _ = User.objects.get_or_create(email=request.GET.get('user_email'))  # Users that log in via Keycloak are matched with Django users with same email address
+            user, _ = User.objects.get_or_create(email=request.GET.get('user_email'), defaults={'username': 'user_%s' % uuid.uuid4()})  # Users that log in via Keycloak are matched with Django users with same email address
         elif request.GET.get('project_role'):  # For some reason this is GET data, even though it's a POST action...
             task = Task.objects.filter(id=self.kwargs['qa_scheduling_unit_task_id'])[0]
             scheduling_unit_blueprint = task.flow_process.su
@@ -220,20 +221,21 @@ class SchedulingUnitTaskAssignViewSet(mixins.CreateModelMixin,
                 # to the user's email address first, so that they can be matched with Django users. Keycloak sometimes
                 # returns an unmappable user representation, in which case we get a human-readable string instead of
                 # an email address returned.
-                content = {'AttributeError': 'Cannot determine a user with role=%s in project=%s to assign this task to' % (kwargs['project_role'], project)}
+                content = {'AttributeError': 'Cannot determine a user with role=%s in project=%s to assign this task to' % (request.GET.get('project_role'), project)}
                 return Response(content, status=status.HTTP_422_UNPROCESSABLE_ENTITY)
-            user, _ = User.objects.get_or_create(email=user_email)
+            user, _ = User.objects.get_or_create(email=user_email, defaults={'username': 'user_%s' % uuid.uuid4()})
         else:
             user = self.request.user
         Task.objects.filter(id=self.kwargs['qa_scheduling_unit_task_id'])[0].activate().assign(user)
         content = {'Assigned': 'Scheduling Unit Task assigned to user=%s' % user.email}
         return Response(content, status=status.HTTP_200_OK)
       except AttributeError:
-        raise
         content = {'AttributeError': 'Cannot assign the specified Scheduling Unit Task to a user'}
+        logger.exception(str(content))
         return Response(content, status=status.HTTP_422_UNPROCESSABLE_ENTITY)
       except IndexError:
         content = {'IndexError': 'No Scheduling Unit Task with the specified id'}
+        logger.exception(str(content))
         return Response(content, status=status.HTTP_422_UNPROCESSABLE_ENTITY)
 
  
diff --git a/SAS/TMSS/backend/test/CMakeLists.txt b/SAS/TMSS/backend/test/CMakeLists.txt
index a90367a2eef58852a966b59ae3d5a9c2dbd5bb57..d8e4d47175ee8b1a3f33dfbdcb13ef91781d3c71 100644
--- a/SAS/TMSS/backend/test/CMakeLists.txt
+++ b/SAS/TMSS/backend/test/CMakeLists.txt
@@ -40,6 +40,7 @@ if(BUILD_TESTING)
     lofar_add_test(t_complex_serializers)
     lofar_add_test(t_observation_strategies_specification_and_scheduling_test)
     lofar_add_test(t_reservations)
+    lofar_add_test(t_swagger)
 
     set_tests_properties(t_scheduling PROPERTIES TIMEOUT 300)
     set_tests_properties(t_tmssapp_scheduling_REST_API PROPERTIES TIMEOUT 300)
diff --git a/SAS/TMSS/backend/test/t_adapter.py b/SAS/TMSS/backend/test/t_adapter.py
index c230c3ed384fb058db42adf0df8cada37a46dfa1..488b9a3bc18400ce6477d5667fd62df4d0fbdf41 100755
--- a/SAS/TMSS/backend/test/t_adapter.py
+++ b/SAS/TMSS/backend/test/t_adapter.py
@@ -33,8 +33,24 @@ exit_with_skipped_code_if_skip_integration_tests()
 # Do Mandatory setup step:
 # use setup/teardown magic for tmss test database, ldap server and django server
 # (ignore pycharm unused import statement, python unittests does use at RunTime the tmss_test_environment_unittest_setup module)
-from lofar.sas.tmss.test.tmss_test_environment_unittest_setup import *
-tmss_test_env.populate_schemas()
+
+from lofar.sas.tmss.test.test_environment import TMSSTestEnvironment
+tmss_test_env = TMSSTestEnvironment(start_workflow_service=True, enable_viewflow=True)
+try:
+    tmss_test_env.start()
+    tmss_test_env.populate_schemas()
+except Exception as e:
+    logger.exception(str(e))
+    tmss_test_env.stop()
+    exit(1)
+
+# tell unittest to stop (and automagically cleanup) the test database once all testing is done.
+def tearDownModule():
+    tmss_test_env.stop()
+
+
+AUTH = requests.auth.HTTPBasicAuth(tmss_test_env.ldap_server.dbcreds.user, tmss_test_env.ldap_server.dbcreds.password)
+BASE_URL = tmss_test_env.django_server.url[:-1] if tmss_test_env.django_server.url.endswith('/')  else tmss_test_env.django_server.url
 
 from lofar.sas.tmss.test.tmss_test_data_django_models import *
 
@@ -43,6 +59,7 @@ from lofar.sas.tmss.test.tmss_test_data_rest import TMSSRESTTestDataCreator
 rest_data_creator = TMSSRESTTestDataCreator(BASE_URL, AUTH)
 
 from lofar.sas.tmss.tmss.tmssapp import models
+from lofar.sas.tmss.tmss.workflowapp.models.schedulingunitflow import SchedulingUnitProcess
 from lofar.sas.tmss.tmss.exceptions import SubtaskInvalidStateException
 from lofar.sas.tmss.tmss.tmssapp.adapters.parset import convert_to_parset, convert_to_parset_dict
 from lofar.common.json_utils import get_default_json_object_for_schema, add_defaults_to_json_object_for_schema
@@ -210,6 +227,7 @@ class ObservationParsetAdapterTest(unittest.TestCase):
         self.assertEqual(nr_is_files, estimations["estimates"][1]["output_files"]["is"][0]["properties"]["nr_of_is_files"] * estimations["estimates"][1]["resource_count"])
         self.assertEqual(4,           estimations["estimates"][1]["output_files"]["is"][0]["properties"]["nr_of_is_stokes"])
 
+
 class PulsarPipelineParsetAdapterTest(unittest.TestCase):
     def create_subtask(self, specifications_doc={}):
         subtask_template = models.SubtaskTemplate.objects.get(name='pulsar pipeline')
@@ -437,22 +455,203 @@ class SIPadapterTest(unittest.TestCase):
         self.assertIn(str('<fileFormat>PULP</fileFormat>'), sip.get_prettyxml())
 
 
+class CycleReportTest(unittest.TestCase):
+    @classmethod
+    def setUpClass(cls) -> None:
+        # Create requirements
+        cls.cycle = models.Cycle.objects.create(**Cycle_test_data(start=datetime.utcnow().isoformat(), stop=(datetime.utcnow() + timedelta(weeks=12)).isoformat()))
+        # Projects
+        project_unassigned = models.Project.objects.create(**Project_test_data(name='unassigned'))
+        project_unassigned.cycles.set([cls.cycle.pk])
+
+        project_filler = models.Project.objects.create(**Project_test_data(name='filler'))
+        project_filler.cycles.set([cls.cycle.pk])
+        project_filler.filler = True
+        project_filler.save()
+
+        cls.projects = {'unassigned': project_unassigned, 'filler': project_filler}
+        for project_category in [c.value for c in models.ProjectCategory.Choices]:
+            project = models.Project.objects.create(**Project_test_data(name=project_category))
+            project.cycles.set([cls.cycle.pk])
+            project.project_category = models.ProjectCategory.objects.get(value=project_category)
+            project.save()
+            cls.projects[project_category] = project
+
+        # SU, SUD and TD
+        cls.projects_components = {}
+        for p in cls.projects.values():
+            scheduling_set = models.SchedulingSet.objects.create(**SchedulingSet_test_data(project=p))
+            scheduling_unit_draft = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(scheduling_set=scheduling_set))
+            task_draft = models.TaskDraft.objects.create(**TaskDraft_test_data(scheduling_unit_draft=scheduling_unit_draft))
+            cls.projects_components[f'{p.name}'] = {'scheduling_set': scheduling_set, 'scheduling_unit_draft': scheduling_unit_draft, 'task_draft': task_draft}
+
+        # SUBs and Workflow acceptance flags
+        for i in range(5):
+            sub, _ = cls._create_subtask_with_type_and_set_status('observation', 'finished', 'regular')
+            # Set workflow flags so we have 3 successful SUBs and 2 failed SUBs
+            SchedulingUnitProcess.objects.create(su=sub, results_accepted=False if i % 6 == 0 else True if i != 4 else None)
+        for i in range(5):
+            sub, _ = cls._create_subtask_with_type_and_set_status('observation', 'finished', 'ddt')
+            # Set workflow flags so we have 4 successful SUBs and 1 failed SUB
+            SchedulingUnitProcess.objects.create(su=sub, results_accepted=False if i % 5 == 0 else True)
+
+        # Create test_data_creator as superuser
+        cls.test_data_creator = TMSSRESTTestDataCreator(BASE_URL, AUTH)
+        response = requests.get(cls.test_data_creator.django_api_url + '/', auth=cls.test_data_creator.auth)
+
+    @classmethod
+    def _create_subtask_with_type_and_set_status(cls, subtask_type, status=None, project_name=None):
+        """
+        Help method to create a Subtask by specifying its type and (optionally) set the its status
+        and (optionally) a project to belong to.
+        """
+        if not project_name:
+            project_name = 'unassigned'
+
+        sub = models.SchedulingUnitBlueprint.objects.create(**SchedulingUnitBlueprint_test_data(draft=cls.projects_components[project_name]['scheduling_unit_draft']))
+        tb = models.TaskBlueprint.objects.create(**TaskBlueprint_test_data(task_draft=cls.projects_components[project_name]['task_draft'], scheduling_unit_blueprint=sub))
+        # Create Subtask
+        subtask_template = models.SubtaskTemplate.objects.create(**SubtaskTemplate_test_data(subtask_type_value=subtask_type))
+        subtask = models.Subtask.objects.create(**Subtask_test_data(subtask_template=subtask_template))
+        subtask.task_blueprints.set([tb])
+
+        if status:
+            set_subtask_state_following_allowed_transitions(subtask, status)
+
+        return sub, subtask
+
+    def test_create_cycle_report(self):
+        """
+        Test create_cycle_report extra action.
+        """
+        # Create and set two Subtasks of type 'observation' and 'pipeline' with the state 'finished'.
+        _, subtask_obs = self._create_subtask_with_type_and_set_status('observation', 'finished')
+        _, subtask_pip = self._create_subtask_with_type_and_set_status('pipeline', 'finished')
+        # Create and set three Subtasks of type 'observation' with the states 'unschedulable'.
+        for i in range(3):
+            self._create_subtask_with_type_and_set_status('observation', 'unschedulable', 'test')
+
+        # Create SubtaskOutput and Dataproducts
+        subtask_output_obs = models.SubtaskOutput.objects.create(**SubtaskOutput_test_data(subtask=subtask_obs))
+        dp_interferometric_obs = models.Dataproduct.objects.create(**Dataproduct_test_data(producer=subtask_output_obs, dataformat=models.Dataformat.objects.get(value="MeasurementSet"), datatype=models.Datatype.objects.get(value="visibilities")))
+        dp_beamformed_obs = models.Dataproduct.objects.create(**Dataproduct_test_data(producer=subtask_output_obs, dataformat=models.Dataformat.objects.get(value="Beamformed"), datatype=models.Datatype.objects.get(value="time series")))
+        subtask_output_pip = models.SubtaskOutput.objects.create(**SubtaskOutput_test_data(subtask=subtask_pip))
+        dp_preprocessing_pip = models.Dataproduct.objects.create(**Dataproduct_test_data(producer=subtask_output_pip, dataformat=models.Dataformat.objects.get(value="MeasurementSet"), datatype=models.Datatype.objects.get(value="visibilities")))
+        dp_pulsar_pip1 = models.Dataproduct.objects.create(**Dataproduct_test_data(producer=subtask_output_pip, dataformat=models.Dataformat.objects.get(value="pulp summary"), datatype=models.Datatype.objects.get(value="pulsar profile")))
+        dp_pulsar_pip2 = models.Dataproduct.objects.create(**Dataproduct_test_data(producer=subtask_output_pip, dataformat=models.Dataformat.objects.get(value="pulp analysis"), datatype=models.Datatype.objects.get(value="time series")))
+
+        # Create generic and 'stand-alone' reservations
+        reservation_no_project = models.Reservation.objects.create(**Reservation_test_data(duration=300))
+        reservation_mixed = models.Reservation.objects.create(**Reservation_test_data(duration=500, project=self.projects['unassigned']))    # Non-production project
+        reservation_project = models.Reservation.objects.create(**Reservation_test_data(duration=600, project=self.projects['regular']))  # Production project
+
+        reservation_template = models.ReservationTemplate.objects.get(name="reservation")
+        reservation_template_spec = get_default_json_object_for_schema(reservation_template.schema)
+        reservation_template_spec['activity']['type'] = 'stand-alone mode'
+        reservation_no_project_sa_mode = models.Reservation.objects.create(start_time=datetime.now(), stop_time=datetime.now()+timedelta(seconds=1200), name="SA no project", description="SA no project", specifications_template=reservation_template, specifications_doc=reservation_template_spec)
+        reservation_mixed_sa_mode = models.Reservation.objects.create(start_time=datetime.now(), stop_time=datetime.now()+timedelta(seconds=350), project=self.projects['unassigned'], name="SA mixed no project", description="SA mixed no project", specifications_template=reservation_template, specifications_doc=reservation_template_spec)
+        reservation_project_sa_mode = models.Reservation.objects.create(start_time=datetime.now(), stop_time=datetime.now() + timedelta(seconds=800), project=self.projects['regular'], name="SA project", description="SA project", specifications_template=reservation_template, specifications_doc=reservation_template_spec)
+
+        # Assertions
+
+        # Assert we get the expected object
+        response = requests.get(BASE_URL + '/cycle/%s/report' % self.cycle.pk, auth=self.test_data_creator.auth)
+        self.assertEqual(response.status_code, 200)
+        result = response.json()
+
+        # Assert telescope_time_distribution
+        telescope_time_distribution = result['telescope_time_distribution']
+        self.assertAlmostEqual(telescope_time_distribution['UNASSIGNED']['durations']['total'], 1200, places=4)
+        self.assertAlmostEqual(telescope_time_distribution['UNASSIGNED']['durations']['succeeded'], 0, places=4)
+        self.assertAlmostEqual(telescope_time_distribution['UNASSIGNED']['durations']['failed'], 0, places=4)
+        self.assertAlmostEqual(telescope_time_distribution['UNASSIGNED']['durations']['idle'], 1200, places=4)
+        self.assertAlmostEqual(telescope_time_distribution['FILLER']['durations']['total'], 0, places=4)
+        self.assertAlmostEqual(telescope_time_distribution['REGULAR']['durations']['total'], 3000, places=4)
+        self.assertAlmostEqual(telescope_time_distribution['REGULAR']['durations']['succeeded'], 1800, places=4)
+        self.assertAlmostEqual(telescope_time_distribution['REGULAR']['durations']['failed'], 600, places=4)
+        self.assertAlmostEqual(telescope_time_distribution['REGULAR']['durations']['idle'], 600, places=4)
+        self.assertAlmostEqual(telescope_time_distribution['USER_SHARED_SUPPORT']['durations']['total'], 0, places=4)
+        self.assertAlmostEqual(telescope_time_distribution['COMMISSIONING']['durations']['total'], 0, places=4)
+        self.assertAlmostEqual(telescope_time_distribution['DDT']['durations']['total'], 3000, places=4)
+        self.assertAlmostEqual(telescope_time_distribution['DDT']['durations']['succeeded'], 2400, places=4)
+        self.assertAlmostEqual(telescope_time_distribution['DDT']['durations']['failed'], 600, places=4)
+        self.assertAlmostEqual(telescope_time_distribution['DDT']['durations']['idle'], 0, places=4)
+        self.assertAlmostEqual(telescope_time_distribution['TEST']['durations']['total'], 0, places=4)
+
+        # Assert average_efficiency
+        average_efficiency = result['average_efficiency']
+        self.assertEqual(average_efficiency['target'], 0.65)        # TODO: Change it when implemented.
+        self.assertEqual(average_efficiency['efficiency'], 0.01)    # Only one day
+
+        # Assert completion_level
+        completion_level = result['completion_level']
+        self.assertEqual(completion_level['target'], 0.0)   # TODO: Change it when implemented.
+        self.assertAlmostEqual(completion_level['total'], 7200, 4)
+        self.assertAlmostEqual(completion_level['succeeded'], 4200, 4)
+        self.assertEqual(completion_level['succeeded_perc'], 0.58)
+        self.assertEqual(completion_level['prognosis'], 0.25)   # Three 'unschedulable' Subtasks
+
+        # Assert observation_hours_per_category
+        observation_hours_per_category = result['observation_hours_per_category']
+        self.assertAlmostEqual(observation_hours_per_category['total_duration'], 7200, places=4)
+        self.assertAlmostEqual(observation_hours_per_category['total_duration_successful'], 4200, places=4)
+        self.assertAlmostEqual(observation_hours_per_category['total_duration_successful_A'], 4200, places=4)
+        self.assertAlmostEqual(observation_hours_per_category['total_duration_successful_B'], 0, places=4)
+        self.assertAlmostEqual(observation_hours_per_category['total_duration_failed'], 1200, places=4)
+        self.assertAlmostEqual(observation_hours_per_category['total_duration_idle'], 1800, places=4)
+        self.assertAlmostEqual(observation_hours_per_category['DDT Com Rep'], 3000, places=4)
+        self.assertIsNone(observation_hours_per_category['System Unavailability'])
+
+        # Assert weekly_efficiency
+        weekly_efficiency = result['weekly_efficiency']
+        self.assertEqual(weekly_efficiency['weeks'][0]['efficiency'], 0.58)   # Only one week
+        self.assertIsNone(weekly_efficiency['weeks'][1]['efficiency'])
+
+        # Assert data_ingested_per_site_and_category
+        data_per_site_and_cat = result['data_ingested_per_site_and_category']
+        self.assertEqual(data_per_site_and_cat['Interferometric Observation']['size__sum'], 123)
+        self.assertEqual(data_per_site_and_cat['Beamformed Observation']['size__sum'], 123)
+        self.assertEqual(data_per_site_and_cat['Preprocessing Pipeline']['size__sum'], 123)
+        self.assertEqual(data_per_site_and_cat['Pulsar Pipeline']['size__sum'], 246)
+
+        # Assert usage_mode
+        usage_mode = result['usage_mode']
+        self.assertAlmostEqual(usage_mode['all modes']['total'], 3750, places=4)
+        self.assertAlmostEqual(usage_mode['all modes']['observing'], 1400, places=4)
+        self.assertAlmostEqual(usage_mode['all modes']['idle/test'], 850, places=4)
+
+        self.assertAlmostEqual(usage_mode['stand-alone mode']['total'], 2350, places=4)
+        self.assertAlmostEqual(usage_mode['stand-alone mode']['no project'], 1200, places=4)
+        self.assertAlmostEqual(usage_mode['stand-alone mode']['project'], 800, places=4)
+        self.assertAlmostEqual(usage_mode['stand-alone mode']['mixed/no project'], 350, places=4)
+
+        self.assertAlmostEqual(usage_mode['ILT mode']['total'], 1400, places=4)
+        self.assertAlmostEqual(usage_mode['ILT mode']['observing'], 600, places=4)
+        self.assertAlmostEqual(usage_mode['ILT mode']['idle/test'], 500, places=4)
+
+        # Assert failures
+        failures = result['failures']
+        self.assertAlmostEqual(failures['months'][0]['total'], 7200, places=4)  # Only one month
+        self.assertAlmostEqual(failures['months'][0]['total_failed'], 1200, places=4)
+        self.assertEqual(failures['months'][0]['failed_perc'], 0.17)
+        self.assertIsNone(failures['months'][1]['failed_perc'])
+
+
 class ProjectReportTest(unittest.TestCase):
-    def setUp(self):
+    @classmethod
+    def setUpClass(cls) -> None:
         # Create requirements
-        self.project = models.Project.objects.create(**Project_test_data(name='test_for_report'))
-        self.project_quota = models.ProjectQuota.objects.create(
-            **ProjectQuota_test_data(project=self.project, resource_type=models.ResourceType.objects.create(
+        cls.project = models.Project.objects.create(**Project_test_data(name='test_for_report'))
+        cls.project_quota = models.ProjectQuota.objects.create(
+            **ProjectQuota_test_data(project=cls.project, resource_type=models.ResourceType.objects.create(
                 **ResourceType_test_data(quantity=models.Quantity.objects.get(value=models.Quantity.Choices.NUMBER.value)))))
-        self.scheduling_set = models.SchedulingSet.objects.create(**SchedulingSet_test_data(project=self.project))
-        self.scheduling_unit_draft = models.SchedulingUnitDraft.objects.create(
-            **SchedulingUnitDraft_test_data(scheduling_set=self.scheduling_set))
-        self.task_draft = models.TaskDraft.objects.create(
-            **TaskDraft_test_data(scheduling_unit_draft=self.scheduling_unit_draft))
+        cls.scheduling_set = models.SchedulingSet.objects.create(**SchedulingSet_test_data(project=cls.project))
+        cls.scheduling_unit_draft = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(scheduling_set=cls.scheduling_set))
+        cls.task_draft = models.TaskDraft.objects.create(**TaskDraft_test_data(scheduling_unit_draft=cls.scheduling_unit_draft))
 
         # Create test_data_creator as superuser
-        self.test_data_creator = TMSSRESTTestDataCreator(BASE_URL, AUTH)
-        response = requests.get(self.test_data_creator.django_api_url + '/', auth=self.test_data_creator.auth)
+        cls.test_data_creator = TMSSRESTTestDataCreator(BASE_URL, AUTH)
+        response = requests.get(cls.test_data_creator.django_api_url + '/', auth=cls.test_data_creator.auth)
 
     def _get_SUB_with_subtask_and_set_status(self, status=None):
         """
@@ -474,25 +673,24 @@ class ProjectReportTest(unittest.TestCase):
         """
         Test create project extra action.
         """
-        # Create and set three SUBs and respectively set the following states: 'finished', 'cancelled', 'defined' (not cancelled)
+        # Create four SUBs and respectively set their states to: 'finished' x2 (so we can create dataproducts, compare
+        # their sizes, and have a successful and a failed SUBs), 'cancelled' and 'defined' (which means not cancelled).
         succeeded_sub, _, succeeded_subtask = self._get_SUB_with_subtask_and_set_status('finished')
+        failed_sub, _, failed_subtask = self._get_SUB_with_subtask_and_set_status('finished')
         cancelled_sub, _, cancelled_subtask = self._get_SUB_with_subtask_and_set_status('cancelled')
         not_cancelled_sub, _, not_cancelled_subtask = self._get_SUB_with_subtask_and_set_status('defined')
+        # Set workflow flags so we have a successful and a failed SUBs
+        SchedulingUnitProcess.objects.create(su=succeeded_sub, results_accepted=True)
+        SchedulingUnitProcess.objects.create(su=failed_sub, results_accepted=False)
 
         # Create SubtaskOutput and Dataproducts from subtask_output
         subtask_output = models.SubtaskOutput.objects.create(**SubtaskOutput_test_data(subtask=succeeded_subtask))
         dataproduct1 = models.Dataproduct.objects.create(**Dataproduct_test_data(producer=subtask_output))
         dataproduct2 = models.Dataproduct.objects.create(**Dataproduct_test_data(producer=subtask_output))
 
-        # Calculate expected durations
-        total = succeeded_subtask.duration.total_seconds() + cancelled_subtask.duration.total_seconds() + \
-                not_cancelled_subtask.duration.total_seconds()
-        total_succeeded = succeeded_subtask.duration.total_seconds()
-        total_not_cancelled = succeeded_subtask.duration.total_seconds() + not_cancelled_subtask.duration.total_seconds()
-        total_failed = cancelled_subtask.duration.total_seconds()
-
         # Assert we get the expected object
         response = requests.get(BASE_URL + '/project/%s/report' % self.project.pk, auth=self.test_data_creator.auth)
+        self.assertEqual(response.status_code, 200)
         result = response.json()
 
         # Assert Project and ProjectQuota ids
@@ -500,20 +698,39 @@ class ProjectReportTest(unittest.TestCase):
         self.assertEqual(result['quota'][0]['id'], self.project_quota.pk)
 
         # Assert durations are well calculated
-        self.assertAlmostEqual(result['durations']['total'], total)
-        self.assertAlmostEqual(result['durations']['total_succeeded'], total_succeeded)
-        self.assertAlmostEqual(result['durations']['total_not_cancelled'], total_not_cancelled)
-        self.assertAlmostEqual(result['durations']['total_failed'], total_failed)
-
-        # There is only one finished SUB
-        self.assertEqual(result['SUBs']['finished'][0]['id'], succeeded_sub.pk)
-        # There is only one cancelled SUB
-        self.assertEqual(result['SUBs']['failed'][0]['id'], cancelled_sub.pk)
-
-        # There are just two dataproducts
-        self.assertEqual(result['LTA dataproducts']['size__sum'], dataproduct1.size + dataproduct2.size)
+        # The four SUBs (successful, failed, cancelled and not cancelled) have a duration/observed_duration of 600s each
+        self.assertAlmostEqual(result['durations']['total'], 2400, places=4)
+        self.assertAlmostEqual(result['durations']['total_not_cancelled'], 1800, places=4)
+        self.assertAlmostEqual(result['durations']['total_succeeded'], 600, places=4)
+        self.assertAlmostEqual(result['durations']['total_succeeded_A'], 600, places=4)  # The succeeded SUB has prio A
+        self.assertAlmostEqual(result['durations']['total_succeeded_B'], 0, places=4)
+        self.assertAlmostEqual(result['durations']['total_failed'], 600, places=4)
+        self.assertAlmostEqual(result['durations']['total_observed'], 1200, places=4)
+        self.assertAlmostEqual(result['durations']['total_observed_succeeded'], 600, places=4)
+        self.assertAlmostEqual(result['durations']['total_observed_succeeded_A'], 600, places=4)
+        self.assertAlmostEqual(result['durations']['total_observed_succeeded_B'], 0, places=4)
+        self.assertAlmostEqual(result['durations']['total_observed_failed'], 600, places=4)
+        # Assert percentages
+        self.assertEqual(result['durations']['not_cancelled_perc'], 0.75)
+        self.assertEqual(result['durations']['succeeded_perc'], 0.25)
+        self.assertEqual(result['durations']['failed_perc'], 0.25)
+        self.assertEqual(result['durations']['observed_perc'], 0.50)
+        self.assertEqual(result['durations']['observed_succeeded_perc'], 0.25)
+        self.assertEqual(result['durations']['observed_failed_perc'], 0.25)
+
+        # There is only one successful SUB
+        self.assertEqual(result['SUBs']['successful'][0]['id'], succeeded_sub.pk)
+        self.assertEqual(result['SUBs']['successful'][0]['status'], 'finished')
+        self.assertEqual(result['SUBs']['successful'][0]['ingested_data_size'], 246)
+        # There is only one failed SUB
+        self.assertEqual(result['SUBs']['failed'][0]['id'], failed_sub.pk)
+        self.assertEqual(result['SUBs']['failed'][0]['status'], 'finished')
+        self.assertIsNone(result['SUBs']['failed'][0]['ingested_data_size'])
+
+        # There are just two dataproducts, each has a size of 123
+        self.assertEqual(result['LTA dataproducts']['size__sum'], 246)
         # Just to check if the placeholder was added
-        self.assertIsNotNone(result['SAPs'])
+        self.assertIsNotNone(result['SAPs exposure'])   # TODO: Implement test properly.
 
 
 if __name__ == "__main__":
diff --git a/SAS/TMSS/backend/test/t_observation_strategies_specification_and_scheduling_test.py b/SAS/TMSS/backend/test/t_observation_strategies_specification_and_scheduling_test.py
index 95fa54683c6782a5ce800f4891633ffd7d44d3f1..eb7f215048e75116dd5476bcb9332b572259c0db 100755
--- a/SAS/TMSS/backend/test/t_observation_strategies_specification_and_scheduling_test.py
+++ b/SAS/TMSS/backend/test/t_observation_strategies_specification_and_scheduling_test.py
@@ -64,6 +64,10 @@ class TestObservationStrategiesSpecificationAndScheduling(unittest.TestCase):
         self.project = test_data_creator.post_data_and_get_response_as_json_object(test_data_creator.Project(auto_ingest=True), '/project/')
         self.scheduling_set = test_data_creator.post_data_and_get_response_as_json_object(test_data_creator.SchedulingSet(project_url=self.project['url']), '/scheduling_set/')
 
+        # clean all specs/tasks/claims in RADB (cascading delete)
+        for spec in self.tmss_test_env.ra_test_environment.radb.getSpecifications():
+            self.tmss_test_env.ra_test_environment.radb.deleteSpecification(spec['id'])
+
     def check_statuses(self, subtask_id, expected_subtask_status, expected_task_status, expected_schedunit_status):
         '''helper method to fetch the latest statuses of the subtask, its task, and its schedulingunit, and check for the expected statuses'''
         subtask = self.tmss_client.get_subtask(subtask_id)
@@ -307,7 +311,6 @@ class TestObservationStrategiesSpecificationAndScheduling(unittest.TestCase):
         set_subtask_state_following_allowed_transitions(cal_pipe2_subtask['id'], 'finished')
         self.check_statuses(cal_pipe2_subtask['id'], "finished", "finished", "processed")
 
-
     def test_beamformed(self):
         def check_parset(obs_subtask):
             '''helper function to check the parset for 'Simple Beamforming Observation' strategy'''
@@ -393,6 +396,208 @@ class TestObservationStrategiesSpecificationAndScheduling(unittest.TestCase):
             set_subtask_state_following_allowed_transitions(subtask['id'], 'finished')
         self.check_statuses(obs_subtask['id'], "finished", "finished", "finished")
 
+    def test_lba_survey(self):
+        def check_parset(obs_subtask, is_target_obs: bool):
+            # todo: check that these values make sense!
+            '''helper function to check the parset for UC1 target/calibrator observations'''
+            obs_parset = parameterset.fromString(self.tmss_client.get_subtask_parset(obs_subtask['id'])).dict()
+            self.assertEqual(obs_subtask['id'], int(obs_parset['Observation.ObsID']))
+            self.assertEqual('LBA', obs_parset['Observation.antennaArray'])
+            self.assertEqual('LBA_SPARSE_EVEN', obs_parset['Observation.antennaSet'])
+            self.assertEqual('LBA_30_90', obs_parset['Observation.bandFilter'])
+            self.assertEqual(1, int(obs_parset['Observation.nrAnaBeams']))
+            self.assertEqual(2 if is_target_obs else 4, int(obs_parset['Observation.nrBeams']))    # todo: why 4? Bug?
+            self.assertEqual('Observation', obs_parset['Observation.processType'])
+            self.assertEqual('Beam Observation', obs_parset['Observation.processSubtype'])
+            self.assertEqual(parser.parse(obs_subtask['start_time']), parser.parse(obs_parset['Observation.startTime']))
+            self.assertEqual(parser.parse(obs_subtask['stop_time']), parser.parse(obs_parset['Observation.stopTime']))
+            self.assertEqual(200, int(obs_parset['Observation.sampleClock']))
+            self.assertEqual(122, len(obs_parset['Observation.Beam[0].subbandList'].split(',')))
+            if is_target_obs:
+                self.assertEqual(244, len(obs_parset['Observation.Beam[1].subbandList'].split(',')))
+            self.assertEqual(True, strtobool(obs_parset['Observation.DataProducts.Output_Correlated.enabled']))
+            self.assertEqual(488 if is_target_obs else 488, len(obs_parset['Observation.DataProducts.Output_Correlated.filenames'].split(',')))
+            self.assertEqual(488 if is_target_obs else 488, len(obs_parset['Observation.DataProducts.Output_Correlated.locations'].split(',')))
+            self.assertEqual(False, strtobool(obs_parset.get('Observation.DataProducts.Output_CoherentStokes.enabled', 'false')))
+            self.assertEqual(False, strtobool(obs_parset.get('Observation.DataProducts.Output_IncoherentStokes.enabled', 'false')))
+            self.assertEqual(False, strtobool(obs_parset.get('Observation.DataProducts.Output_Pulsar.enabled', 'false')))
+            self.assertEqual(False, strtobool(obs_parset.get('Observation.DataProducts.Output_InstrumentModel.enabled', 'false')))
+            self.assertEqual(False, strtobool(obs_parset.get('Observation.DataProducts.Output_SkyImage.enabled', 'false')))
+
+            # import helper method to cycle through allowed state transitions
+
+        from lofar.sas.tmss.test.test_utils import set_subtask_state_following_allowed_transitions
+
+        # setup: create a scheduling unit from the UC1 observation strategy template
+        observing_strategy_templates = self.tmss_client.get_path_as_json_object('scheduling_unit_observing_strategy_template')
+        self.assertGreater(len(observing_strategy_templates), 0)
+
+        uc1_strategy_template = next(ost for ost in observing_strategy_templates if ost['name'] == 'IM LBA Survey Strategy - 3 Beams')
+        self.assertIsNotNone(uc1_strategy_template)
+
+        scheduling_unit_draft = self.tmss_client.create_scheduling_unit_draft_from_strategy_template(
+            uc1_strategy_template['id'], self.scheduling_set['id'])
+        # check general object settings after creation
+        self.assertEqual(uc1_strategy_template['url'], scheduling_unit_draft['observation_strategy_template'])
+        self.assertFalse(scheduling_unit_draft['ingest_permission_required'])
+
+        # TODO: check draft specification, constraints, etc according to LBA survey requirements like antennaset, filters, subbands, etc.
+        # for now, just check if the spec is ok according to schema.
+        validate_json_against_its_schema(scheduling_unit_draft['requirements_doc'])
+
+        scheduling_unit_blueprint = self.tmss_client.create_blueprints_and_subtasks_from_scheduling_unit_draft(scheduling_unit_draft['id'])
+        scheduling_unit_blueprint_ext = self.tmss_client.get_schedulingunit_blueprint(scheduling_unit_blueprint['id'], extended=True)
+        self.assertFalse(scheduling_unit_blueprint_ext['ingest_permission_required'])
+
+        # blueprint spec should be copied verbatim, so should be equal to (unchanged/unedited) draft
+        self.assertEqual(scheduling_unit_draft['requirements_doc'], scheduling_unit_blueprint_ext['requirements_doc'])
+
+        # observation(s) did not run yet, so observed_end_time should be None
+        self.assertIsNone(scheduling_unit_blueprint_ext['observed_end_time'])
+        self.assertEqual("schedulable", scheduling_unit_blueprint_ext['status'])
+
+        # check the tasks
+        tasks = scheduling_unit_blueprint_ext['task_blueprints']
+        self.assertEqual(7, len(tasks))
+        observation_tasks = [t for t in tasks if t['task_type'] == 'observation']
+        self.assertEqual(2, len(observation_tasks))
+        pipeline_tasks = [t for t in tasks if t['task_type'] == 'pipeline']
+        self.assertEqual(4, len(pipeline_tasks))
+        self.assertEqual(1, len([t for t in tasks if t['task_type'] == 'ingest']))
+        ingest_task = next(t for t in tasks if t['task_type'] == 'ingest')
+
+        cal_obs_task = next(t for t in observation_tasks if t['name'] == 'Calibrator Observation')
+        target_obs_task = next(t for t in observation_tasks if t['name'] == 'Target Observation')
+
+        # -------------------
+        # schedule simultaneous calibrator and target obs (two tasks -> one subtask)
+        self.assertEqual(1, len([st for st in cal_obs_task['subtasks'] if st['subtask_type'] == 'observation']))
+        cal_obs_subtask = next(st for st in cal_obs_task['subtasks'] if st['subtask_type'] == 'observation')
+
+        self.assertEqual(1, len([st for st in target_obs_task['subtasks'] if st['subtask_type'] == 'observation']))
+        target_obs_subtask = next(st for st in target_obs_task['subtasks'] if st['subtask_type'] == 'observation')
+
+        self.assertEqual(cal_obs_subtask['id'], target_obs_subtask['id'])
+        cal_obs_subtask = self.tmss_client.schedule_subtask(cal_obs_subtask['id'])
+
+        check_parset(cal_obs_subtask, is_target_obs=False)
+        self.check_statuses(cal_obs_subtask['id'], "scheduled", "scheduled", "scheduled")
+
+        # check output_dataproducts
+        cal_obs_output_dataproducts = self.tmss_client.get_subtask_output_dataproducts(cal_obs_subtask['id'])
+        self.assertEqual(488, len(cal_obs_output_dataproducts))
+
+        # "mimic" that the cal_obs_subtask starts running
+        set_subtask_state_following_allowed_transitions(cal_obs_subtask['id'], 'started')
+        self.check_statuses(cal_obs_subtask['id'], "started", "started", "observing")
+
+        # "mimic" that the cal_obs_subtask finished (including qa subtasks)
+        for subtask in cal_obs_task['subtasks']:
+            set_subtask_state_following_allowed_transitions(subtask['id'], 'finished')
+
+        # todo: check_statuses does not allow for different statuses of multiple related tasks, so we cannot do
+        #  self.check_statuses(cal_obs_subtask['id'], "finished", "finished", "observed")
+        #  but have to assert here directly. (Why are the statuses for target and calibrator tasks inconsistent here?)
+        cal_obs_subtask = self.tmss_client.get_subtask(cal_obs_subtask['id'])
+        self.assertEqual("finished", cal_obs_subtask['state_value'])
+        cal_obs_task = self.tmss_client.get_url_as_json_object(cal_obs_task['url'])
+        self.assertEqual("finished", cal_obs_task['status'])
+        target_obs_task = self.tmss_client.get_url_as_json_object(target_obs_task['url'])
+        self.assertEqual("observed", target_obs_task['status'])
+        schedunit = self.tmss_client.get_url_as_json_object(scheduling_unit_blueprint['url'])
+        self.assertEqual("observed", schedunit['status'])
+
+        # -------------------
+        # check pipelines
+        cal_pipe_task = next(t for t in pipeline_tasks if t['name'] == 'Calibrator Pipeline')
+        target_pipe1_task = next(t for t in pipeline_tasks if t['name'] == 'Pipeline target1')
+        target_pipe2_task = next(t for t in pipeline_tasks if t['name'] == 'Pipeline target2')
+        target_pipe3_task = next(t for t in pipeline_tasks if t['name'] == 'Pipeline target3')
+        # TODO: check relations between tasks
+
+        # -------------------
+        # schedule calibrator pipeline
+        self.assertEqual(1, len([st for st in cal_pipe_task['subtasks'] if st['subtask_type'] == 'pipeline']))
+        cal_pipe_subtask = next(st for st in cal_pipe_task['subtasks'] if st['subtask_type'] == 'pipeline')
+        cal_pipe_subtask = self.tmss_client.schedule_subtask(cal_pipe_subtask['id'])
+        self.check_statuses(cal_pipe_subtask['id'], "scheduled", "scheduled", "observed")
+
+        # check dataproducts
+        cal_pipe1_input_dataproducts = self.tmss_client.get_subtask_input_dataproducts(cal_pipe_subtask['id'])
+        cal_pipe1_output_dataproducts = self.tmss_client.get_subtask_output_dataproducts(cal_pipe_subtask['id'])
+        self.assertEqual(122, len(cal_pipe1_input_dataproducts))
+        self.assertEqual(122, len(cal_pipe1_output_dataproducts))
+
+        # "mimic" that the cal_pipe_subtask starts running
+        set_subtask_state_following_allowed_transitions(cal_pipe_subtask['id'], 'started')
+        self.check_statuses(cal_pipe_subtask['id'], "started", "started", "processing")
+
+        # "mimic" that the cal_pipe_subtask finished
+        set_subtask_state_following_allowed_transitions(cal_pipe_subtask['id'], 'finished')
+        self.check_statuses(cal_pipe_subtask['id'], "finished", "finished", "processing")
+
+        # -------------------
+        # schedule first target pipeline
+        self.assertEqual(1, len([st for st in target_pipe1_task['subtasks'] if st['subtask_type'] == 'pipeline']))
+        target_pipe1_subtask = next(st for st in target_pipe1_task['subtasks'] if st['subtask_type'] == 'pipeline')
+        target_pipe1_subtask = self.tmss_client.schedule_subtask(target_pipe1_subtask['id'])
+        self.check_statuses(target_pipe1_subtask['id'], "scheduled", "scheduled", "processing")
+
+        # check output_dataproducts
+        target_pipe1_input_dataproducts = self.tmss_client.get_subtask_input_dataproducts(target_pipe1_subtask['id'])
+        target_pipe1_output_dataproducts = self.tmss_client.get_subtask_output_dataproducts(target_pipe1_subtask['id'])
+        self.assertEqual(122, len(target_pipe1_input_dataproducts))
+        self.assertEqual(122, len(target_pipe1_output_dataproducts))
+
+        # "mimic" that the target_pipe1_subtask starts running
+        set_subtask_state_following_allowed_transitions(target_pipe1_subtask['id'], 'started')
+        self.check_statuses(target_pipe1_subtask['id'], "started", "started", "processing")
+
+        # "mimic" that the target_pipe1_subtask finished
+        set_subtask_state_following_allowed_transitions(target_pipe1_subtask['id'], 'finished')
+        self.check_statuses(target_pipe1_subtask['id'], "finished", "finished", "processing")
+
+        # -------------------
+        # schedule second target pipeline
+        self.assertEqual(1, len([st for st in target_pipe2_task['subtasks'] if st['subtask_type'] == 'pipeline']))
+        target_pipe2_subtask = next(st for st in target_pipe2_task['subtasks'] if st['subtask_type'] == 'pipeline')
+        target_pipe2_subtask = self.tmss_client.schedule_subtask(target_pipe2_subtask['id'])
+        self.check_statuses(target_pipe2_subtask['id'], "scheduled", "scheduled", "processing")
+
+        # check output_dataproducts
+        target_pipe2_input_dataproducts = self.tmss_client.get_subtask_input_dataproducts(target_pipe2_subtask['id'])
+        target_pipe2_output_dataproducts = self.tmss_client.get_subtask_output_dataproducts(target_pipe2_subtask['id'])
+        self.assertEqual(122, len(target_pipe2_input_dataproducts))
+        self.assertEqual(122, len(target_pipe2_output_dataproducts))
+
+        # "mimic" that the target_pipe2_subtask starts running
+        set_subtask_state_following_allowed_transitions(target_pipe2_subtask['id'], 'started')
+        self.check_statuses(target_pipe2_subtask['id'], "started", "started", "processing")
+
+        # "mimic" that the target_pipe2_subtask finished
+        set_subtask_state_following_allowed_transitions(target_pipe2_subtask['id'], 'finished')
+        self.check_statuses(target_pipe2_subtask['id'], "finished", "finished", "processing")
+
+        # -------------------
+        # schedule third target pipeline
+        self.assertEqual(1, len([st for st in target_pipe3_task['subtasks'] if st['subtask_type'] == 'pipeline']))
+        target_pipe3_subtask = next(st for st in target_pipe3_task['subtasks'] if st['subtask_type'] == 'pipeline')
+        target_pipe3_subtask = self.tmss_client.schedule_subtask(target_pipe3_subtask['id'])
+        self.check_statuses(target_pipe3_subtask['id'], "scheduled", "scheduled", "processing")
+
+        # check output_dataproducts
+        target_pipe3_input_dataproducts = self.tmss_client.get_subtask_input_dataproducts(target_pipe3_subtask['id'])
+        target_pipe3_output_dataproducts = self.tmss_client.get_subtask_output_dataproducts(target_pipe3_subtask['id'])
+        self.assertEqual(122, len(target_pipe3_input_dataproducts))
+        self.assertEqual(122, len(target_pipe3_output_dataproducts))
+
+        # "mimic" that the target_pipe3_subtask starts running
+        set_subtask_state_following_allowed_transitions(target_pipe3_subtask['id'], 'started')
+        self.check_statuses(target_pipe3_subtask['id'], "started", "started", "processing")
+
+        # "mimic" that the target_pipe3_subtask finished
+        set_subtask_state_following_allowed_transitions(target_pipe3_subtask['id'], 'finished')
+        self.check_statuses(target_pipe3_subtask['id'], "finished", "finished", "processing")
 
 
 logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO)
diff --git a/SAS/TMSS/backend/test/t_scheduling.py b/SAS/TMSS/backend/test/t_scheduling.py
index 8bd29da568e0ee999915ec0cc1022d40a95a3dd5..eb45bcb9232ec1fe75a762e60c68d528609f83af 100755
--- a/SAS/TMSS/backend/test/t_scheduling.py
+++ b/SAS/TMSS/backend/test/t_scheduling.py
@@ -191,6 +191,8 @@ class SchedulingTest(unittest.TestCase):
                      "COBALT": { "correlator": { "enabled": True } } }
             self._test_schedule_observation_subtask_with_enough_resources_available(spec)
 
+
+    @unittest.skip("TODO: add missing coherent stokes settings")
     def test_schedule_beamformer_observation_subtask_with_enough_resources_available(self):
             spec = { 
               "stations": { "digital_pointings": [ { "name": "target0", "subbands": [0] } ] },
@@ -434,6 +436,7 @@ class SchedulingTest(unittest.TestCase):
             self.assertEqual('scheduled', subtask['state_value'])
             self.assertEqual('scheduled', tmss_test_env.ra_test_environment.radb.getTask(tmss_id=pipe_subtask['id'])['status'])
 
+    @unittest.skip("TODO: add missing coherent stokes settings")
     def test_schedule_pulsar_pipeline_subtask_with_enough_resources_available(self):
         with tmss_test_env.create_tmss_client() as client:
             obs_subtask_template = client.get_subtask_template("observation control")
diff --git a/SAS/TMSS/backend/test/t_schemas.py b/SAS/TMSS/backend/test/t_schemas.py
index 48c0907f84313f6bd02a6b72bed9eccb7daaef91..db2b39ba1ba6629a06fdd393d53deecf8c96d23a 100755
--- a/SAS/TMSS/backend/test/t_schemas.py
+++ b/SAS/TMSS/backend/test/t_schemas.py
@@ -36,51 +36,56 @@ from lofar.sas.tmss.test.tmss_test_environment_unittest_setup import *
 tmss_test_env.populate_schemas()
 
 from lofar.sas.tmss.tmss.tmssapp import models
-from lofar.common.json_utils import resolved_refs, validate_json_against_schema, get_default_json_object_for_schema
+from lofar.common.json_utils import resolved_remote_refs, validate_json_against_schema, get_default_json_object_for_schema
 
 class TestSchemas(unittest.TestCase):
-    def check_schema(self, name: str, schema: dict):
+    @classmethod
+    def setUpClass(cls) -> None:
+        cls._schema_cache = {}
+
+    def check_schema(self, schema: dict):
         """ Check whether the given schema is valid. """
 
         # Can all $refs be actually resolved?
         try:
-            resolved_refs(schema)
+            resolved_remote_refs(schema, cache=self._schema_cache)
         except Exception as e:
-            raise Exception("Failed to resolve references in schema '%s': %s" % (name, e)) from e
+            raise Exception("Failed to resolve references in schema: %s" % (e,)) from e
 
         # Does this schema provide actually valid defaults?
         try:
-            defaults = get_default_json_object_for_schema(schema)
-            validate_json_against_schema(defaults, schema)
+            defaults = get_default_json_object_for_schema(schema, cache=self._schema_cache)
+            validate_json_against_schema(defaults, schema, cache=self._schema_cache)
         except Exception as e:
-            raise Exception("Failure in defaults in schema '%s': %s" % (name, e)) from e
+            raise Exception("Failure in defaults in schema: %s" % (e,)) from e
 
-    def check_schema_table(self, model):
+    def check_template_table(self, model):
         """ Check all schemas present in the database for a given model. """
 
-        schemas = model.objects.all()
-
-        for schema in schemas:
-            self.check_schema(schema.name, schema.schema)
+        for template in model.objects.all():
+            try:
+                self.check_schema(template.schema)
+            except Exception as e:
+                raise Exception("Error while checking schema for %s name='%s' version=%s: %s" % (template.__class__.__name__, template.name, template.version, e)) from e
 
     def test_subtasks(self):
-        self.check_schema_table(models.SubtaskTemplate)
+        self.check_template_table(models.SubtaskTemplate)
 
     def test_dataproducts(self):
-        self.check_schema_table(models.DataproductSpecificationsTemplate)
-        self.check_schema_table(models.DataproductFeedbackTemplate)
-        self.check_schema_table(models.SAPTemplate)
+        self.check_template_table(models.DataproductSpecificationsTemplate)
+        self.check_template_table(models.DataproductFeedbackTemplate)
+        self.check_template_table(models.SAPTemplate)
 
     def test_tasks(self):
-        self.check_schema_table(models.TaskTemplate)
-        self.check_schema_table(models.TaskRelationSelectionTemplate)
+        self.check_template_table(models.TaskTemplate)
+        self.check_template_table(models.TaskRelationSelectionTemplate)
 
     def test_scheduling_units(self):
-        self.check_schema_table(models.SchedulingUnitTemplate)
-        self.check_schema_table(models.SchedulingConstraintsTemplate)
+        self.check_template_table(models.SchedulingUnitTemplate)
+        self.check_template_table(models.SchedulingConstraintsTemplate)
 
     def test_reservations(self):
-        self.check_schema_table(models.ReservationTemplate)
+        self.check_template_table(models.ReservationTemplate)
 
 if __name__ == "__main__":
     os.environ['TZ'] = 'UTC'
diff --git a/SAS/TMSS/backend/test/t_swagger.py b/SAS/TMSS/backend/test/t_swagger.py
new file mode 100755
index 0000000000000000000000000000000000000000..47cce09f1cdaf35d0342a080dec935063819ea33
--- /dev/null
+++ b/SAS/TMSS/backend/test/t_swagger.py
@@ -0,0 +1,63 @@
+#!/usr/bin/env python3
+
+# Copyright (C) 2018    ASTRON (Netherlands Institute for Radio Astronomy)
+# P.O. Box 2, 7990 AA Dwingeloo, The Netherlands
+#
+# This file is part of the LOFAR software suite.
+# The LOFAR software suite is free software: you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as published
+# by the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# The LOFAR software suite is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.    See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>.
+
+# $Id:  $
+
+
+# This test checks functionality of our swagger API
+
+import unittest
+import logging
+logger = logging.getLogger('lofar.'+__name__)
+logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO)
+
+from lofar.common.test_utils import exit_with_skipped_code_if_skip_integration_tests
+exit_with_skipped_code_if_skip_integration_tests()
+
+# Do Mandatory setup step:
+# use setup/teardown magic for tmss test database, ldap server and django server
+# (ignore pycharm unused import statement, python unittests does use at RunTime the tmss_test_environment_unittest_setup module)
+from lofar.sas.tmss.test.tmss_test_environment_unittest_setup import *
+from lofar.sas.tmss.test.tmss_test_data_django_models import *
+from django.contrib.auth import get_user_model
+User = get_user_model()
+
+from django.test import TestCase
+
+# import and setup test data creator
+from lofar.sas.tmss.test.tmss_test_data_rest import TMSSRESTTestDataCreator
+test_data_creator = TMSSRESTTestDataCreator(BASE_URL, AUTH)
+
+
+class BasicSwaggerTestCase(TestCase):
+    """
+    Test that the Swagger main page loads successfully.
+    """
+
+    def test_generator_template_list_apiformat(self):
+        r = requests.get(BASE_URL + '/swagger/', auth=AUTH)
+        self.assertEqual(r.status_code, 200)
+        self.assertNotIn("Failed to load API definition", r.content.decode('utf8'))
+        self.assertNotIn("Fetch error", r.content.decode('utf8'))
+        self.assertIn("LOFAR Internal API", r.content.decode('utf8'))
+
+
+if __name__ == "__main__":
+    unittest.main()
+
diff --git a/SAS/TMSS/backend/test/t_swagger.run b/SAS/TMSS/backend/test/t_swagger.run
new file mode 100755
index 0000000000000000000000000000000000000000..0c449f04f7d159ecd31f333419b6444fec8a6387
--- /dev/null
+++ b/SAS/TMSS/backend/test/t_swagger.run
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+# Run the unit test
+source python-coverage.sh
+python_coverage_test "*tmss*" t_swagger.py
+
diff --git a/SAS/TMSS/backend/test/t_swagger.sh b/SAS/TMSS/backend/test/t_swagger.sh
new file mode 100755
index 0000000000000000000000000000000000000000..f17d024e62bd4fe3faf875c48beee881ee71bff6
--- /dev/null
+++ b/SAS/TMSS/backend/test/t_swagger.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+./runctest.sh t_swagger
\ No newline at end of file
diff --git a/SAS/TMSS/backend/test/t_tmssapp_specification_REST_API.py b/SAS/TMSS/backend/test/t_tmssapp_specification_REST_API.py
index 9f5eb818ed3c56674f8b4ac87b77479ee24e175e..05a4a49fd9ec04920bc124f172e8c2f110994a23 100755
--- a/SAS/TMSS/backend/test/t_tmssapp_specification_REST_API.py
+++ b/SAS/TMSS/backend/test/t_tmssapp_specification_REST_API.py
@@ -28,7 +28,7 @@
 # We should probably also fully test behavior wrt mandatory and nullable fields.
 
 from dateutil import parser
-from datetime import datetime
+from datetime import datetime, timedelta
 import unittest
 import logging
 logger = logging.getLogger('lofar.'+__name__)
@@ -54,6 +54,8 @@ test_data_creator = TMSSRESTTestDataCreator(BASE_URL, AUTH)
 
 tmss_test_env.populate_schemas()
 
+from lofar.common.json_utils import add_defaults_to_json_object_for_schema
+
 # todo: for overall speed improvements, but also for clarity, it would be nice to switch to django.test.TestCase
 #  in order to separate the db content between them. Investigated why that currently yields a ton of 404 errors.
 #  Note that mixing unittest.TestCase and django.test.TestCase does not seem to isolate tests properly.
@@ -1517,8 +1519,8 @@ class SchedulingUnitDraftTestCase(unittest.TestCase):
         Test we can filter on this property, which is explicitly named on the model-specific property filter
         """
         # setup
-        project_1 = models.Project.objects.create(**Project_test_data(name='myproject1'))
-        project_2 = models.Project.objects.create(**Project_test_data(name='myproject2'))
+        project_1 = models.Project.objects.create(**Project_test_data(name='myproject_draft_partial_1_%s' % uuid.uuid4()))
+        project_2 = models.Project.objects.create(**Project_test_data(name='myproject_draft_partial_2_%s' % uuid.uuid4()))
         scheduling_set_1 = models.SchedulingSet.objects.create(**SchedulingSet_test_data(project=project_1))
         scheduling_set_2 = models.SchedulingSet.objects.create(**SchedulingSet_test_data(project=project_2))
         su_draft_1 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud1_%s' % uuid.uuid4(), scheduling_set=scheduling_set_1))
@@ -1528,14 +1530,153 @@ class SchedulingUnitDraftTestCase(unittest.TestCase):
         response_1 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/?project=%s' % project_1.name, 200)
         response_2 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/?project=%s' % project_2.name, 200)
         response_3 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/?project=foo', 200)
+        response_4 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/?project=myproject_draft_partia', 200)
 
         self.assertEqual(response_1['count'], 1)
         self.assertEqual(response_1['results'][0]['name'], su_draft_1.name)
         self.assertEqual(response_2['count'], 1)
         self.assertEqual(response_2['results'][0]['name'], su_draft_2.name)
         self.assertEqual(response_3['count'], 0)
+        self.assertEqual(response_4['count'], 2)
+        self.assertEqual({response_4['results'][0]['name'], response_4['results'][1]['name']},
+                         {su_draft_1.name, su_draft_2.name})
+
 
+    def test_GET_SchedulingUnitDraft_view_filters_for_id(self):
+        """
+        Test we can filter on this field, which is explicitly named on the model-specific property filter
+        """
+        # setup
+        su_draft_1 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud1_%s' % uuid.uuid4()))
+        su_draft_2 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud2_%s' % uuid.uuid4()))
+        su_draft_3 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud3_%s' % uuid.uuid4()))
 
+        # assert
+        response_1 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/?id=%s' % su_draft_1.id, 200)
+        response_2 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/?id=%s,%s' % (su_draft_1.id, su_draft_3.id), 200)
+        response_3 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/?id=%s' % 999999, 200)
+        response_4 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/?id_min=%s&id_max=%s' % (su_draft_2.id, su_draft_3.id), 200)
+
+        self.assertEqual(response_1['count'], 1)
+        self.assertEqual(response_1['results'][0]['name'], su_draft_1.name)
+        self.assertEqual(response_2['count'], 2)
+        self.assertEqual(response_2['results'][0]['name'], su_draft_1.name)
+        self.assertEqual(response_2['results'][1]['name'], su_draft_3.name)
+        self.assertEqual(response_3['count'], 0)
+        self.assertEqual(response_4['count'], 2)
+        self.assertEqual(response_4['results'][0]['name'], su_draft_2.name)
+        self.assertEqual(response_4['results'][1]['name'], su_draft_3.name)
+
+    def test_GET_SchedulingUnitDraft_view_filters_for_blueprints(self):
+        """
+        Test we can filter on this related field, which is explicitly named on the model-specific property filter
+        """
+        # setup
+        models.SchedulingUnitBlueprint.objects.all().delete()
+        models.SchedulingUnitDraft.objects.all().delete()
+        su_draft_1 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud1_%s' % uuid.uuid4()))
+        su_draft_2 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud2_%s' % uuid.uuid4()))
+        su_draft_3 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud3_%s' % uuid.uuid4()))
+        su_blueprint_1 = models.SchedulingUnitBlueprint.objects.create(**SchedulingUnitBlueprint_test_data(name='sub1_%s' % uuid.uuid4(), draft=su_draft_1))
+        su_blueprint_2 = models.SchedulingUnitBlueprint.objects.create(**SchedulingUnitBlueprint_test_data(name='sub2_%s' % uuid.uuid4(), draft=su_draft_2))
+        su_blueprint_3 = models.SchedulingUnitBlueprint.objects.create(**SchedulingUnitBlueprint_test_data(name='sub3_%s' % uuid.uuid4(), draft=su_draft_3))
+
+        # assert
+        response_1 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/?scheduling_unit_blueprints=%s' % su_blueprint_1.id, 200)
+        response_2 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/?scheduling_unit_blueprints=%s&scheduling_unit_blueprints=%s' % (su_blueprint_1.id, su_blueprint_3.id), 200)
+        response_3 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/?scheduling_unit_blueprints=%s' % 999999, 400)
+
+        self.assertEqual(response_1['count'], 1)
+        self.assertEqual(response_1['results'][0]['name'], su_draft_1.name)
+        self.assertEqual(response_2['count'], 2)
+        self.assertEqual(response_2['results'][0]['name'], su_draft_1.name)
+        self.assertEqual(response_2['results'][1]['name'], su_draft_3.name)
+        self.assertIn('Select a valid choice', str(response_3))
+
+    def test_GET_SchedulingUnitDraft_view_filters_for_priority_rank(self):
+        """
+        Test we can filter on this property, which is explicitly named on the model-specific property filter
+        """
+        # setup
+        su_draft_1 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud1_%s' % uuid.uuid4()), priority_rank=0.111)
+        su_draft_2 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud2_%s' % uuid.uuid4()), priority_rank=0.222)
+        su_draft_3 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud3_%s' % uuid.uuid4()), priority_rank=0.333)
+
+        # assert
+        response_1 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/?priority_rank_min=%s&priority_rank_max=%s' % (0.110, 0.112), 200)
+        response_2 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/?priority_rank_min=%s&priority_rank_max=%s' % (0.2, 0.4), 200)
+
+        self.assertEqual(response_1['count'], 1)
+        self.assertEqual(response_1['results'][0]['name'], su_draft_1.name)
+        self.assertEqual(response_2['count'], 2)
+        self.assertEqual(response_2['results'][0]['name'], su_draft_2.name)
+        self.assertEqual(response_2['results'][1]['name'], su_draft_3.name)
+
+    def test_GET_SchedulingUnitDraft_view_filters_for_duration(self):
+        """
+        Test we can filter on this property, which is explicitly named on the model-specific property filter
+        """
+        # setup
+        models.SchedulingUnitBlueprint.objects.all().delete()
+        models.SchedulingUnitDraft.objects.all().delete()
+        su_draft_1 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud1_%s' % uuid.uuid4()))
+        su_draft_2 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud2_%s' % uuid.uuid4()))
+
+        # assert
+        response_1 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/?duration_min=%s&duration_max=%s' % ('PT1H', 'PT2H'), 200)
+        response_2 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/?duration_min=%s&duration_max=%s' % ('PT0S', 'PT1H'), 200)
+
+        self.assertEqual(response_1['count'], 0)
+        self.assertEqual(response_2['count'], 2)
+        self.assertEqual({result['name'] for result in response_2['results']},
+                         {su_draft_1.name, su_draft_2.name})
+
+    def test_GET_SchedulingUnitDraft_view_filters_for_pointing(self):
+        """
+        Test we can filter on this property, which is explicitly named on the model-specific property filter
+        """
+        # setup
+        strategy_template = models.SchedulingUnitObservingStrategyTemplate.objects.get(name="UC1 CTC+pipelines")
+        specs_1 = add_defaults_to_json_object_for_schema(strategy_template.template,
+                                                         strategy_template.scheduling_unit_template.schema)
+        specs_2 = add_defaults_to_json_object_for_schema(strategy_template.template,
+                                                         strategy_template.scheduling_unit_template.schema)
+        specs_1['tasks']['Target Observation']['specifications_doc']['SAPs'][0]['digital_pointing'] = {'angle1': 0.333, 'angle2': 0.999, 'direction_type': 'J2000'}
+        specs_2['tasks']['Target Observation']['specifications_doc']['SAPs'][0]['digital_pointing'] = {'angle1': 0.111, 'angle2': 0.777, 'direction_type': 'J2000'}
+
+        su_draft_1 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud1_%s' % uuid.uuid4(), template=strategy_template.scheduling_unit_template, observation_strategy_template=strategy_template, requirements_doc=specs_1))
+        su_draft_2 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud2_%s' % uuid.uuid4(), template=strategy_template.scheduling_unit_template, observation_strategy_template=strategy_template, requirements_doc=specs_2))
+
+        # assert
+        response_1 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/?angle1_min=%s' % 0.222, 200)
+        response_2 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/?angle2_max=%s' % 0.888, 200)
+
+        self.assertEqual(response_1['count'], 1)
+        self.assertEqual(response_1['results'][0]['name'], su_draft_1.name)
+        self.assertEqual(response_2['count'], 1)
+        self.assertEqual(response_2['results'][0]['name'], su_draft_2.name)
+
+    def test_GET_SchedulingUnitBlueprint_view_filters_for_strategy_template(self):
+        """
+        Test we can filter on this field, which is explicitly named on the model-specific property filter
+        """
+        # setup
+        template_1 = models.SchedulingUnitObservingStrategyTemplate.objects.create(**SchedulingUnitObservingStrategyTemplate_test_data(name='suost1_%s' % uuid.uuid4()))
+        template_2 = models.SchedulingUnitObservingStrategyTemplate.objects.create(**SchedulingUnitObservingStrategyTemplate_test_data(name='suost1_%s' % uuid.uuid4()))
+        su_draft_1 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud1_%s' % uuid.uuid4(), observation_strategy_template=template_1))
+        su_draft_2 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud2_%s' % uuid.uuid4(), observation_strategy_template=template_2))
+
+        # assert
+        response_1 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/?observation_strategy_template=%s' % template_1.id, 200)
+        response_2 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/?observation_strategy_template_name=%s' % template_2.name[:-3], 200)
+        response_3 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/?observation_strategy_template_name=%s' % 'gibberish', 200)
+        GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/?observation_strategy_template=%s' % 999999, 400)
+
+        self.assertEqual(response_1['count'], 1)
+        self.assertEqual(response_1['results'][0]['name'], su_draft_1.name)
+        self.assertEqual(response_2['count'], 1)
+        self.assertEqual(response_2['results'][0]['name'], su_draft_2.name)
+        self.assertEqual(response_3['count'], 0)
 
 
 class TaskDraftTestCase(unittest.TestCase):
@@ -1735,6 +1876,71 @@ class TaskDraftTestCase(unittest.TestCase):
         GET_and_assert_equal_expected_code(self, BASE_URL + '/task_draft/?copy_reason=gibberish', 400)
 
 
+    def test_TaskDraft_filters_for_TaskBlueprints(self):
+
+        # setup
+        task_draft_1 = models.TaskDraft.objects.create(**TaskDraft_test_data("td_%s" % uuid.uuid4()))
+        task_draft_2 = models.TaskDraft.objects.create(**TaskDraft_test_data("td_%s" % uuid.uuid4()))
+        task_draft_3 = models.TaskDraft.objects.create(**TaskDraft_test_data("td_%s" % uuid.uuid4()))
+        task_blueprint_1 = models.TaskBlueprint.objects.create(**TaskBlueprint_test_data())
+        task_blueprint_1.draft = task_draft_1
+        task_blueprint_1.save()
+        task_blueprint_2 = models.TaskBlueprint.objects.create(**TaskBlueprint_test_data())
+        task_blueprint_2.draft = task_draft_2
+        task_blueprint_2.save()
+        task_blueprint_3 = models.TaskBlueprint.objects.create(**TaskBlueprint_test_data())
+        task_blueprint_3.draft = task_draft_3
+        task_blueprint_3.save()
+
+        #  assert
+        response_1 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_draft/?task_blueprints=%s' % task_blueprint_1.id, 200)
+        response_2 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_draft/?task_blueprints=%s' % task_blueprint_2.id, 200)
+        response_3 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_draft/?task_blueprints=%s&task_blueprints=%s' % (task_blueprint_1.id, task_blueprint_3.id), 200)
+        GET_and_assert_equal_expected_code(self, BASE_URL + '/task_draft/?task_blueprints=gibberish', 400)
+        self.assertIn(task_draft_1.name, str(response_1))
+        self.assertNotIn(task_draft_2.name, str(response_1))
+        self.assertNotIn(task_draft_3.name, str(response_1))
+        self.assertNotIn(task_draft_1.name, str(response_2))
+        self.assertIn(task_draft_2.name, str(response_2))
+        self.assertNotIn(task_draft_3.name, str(response_2))
+        self.assertIn(task_draft_1.name, str(response_3))
+        self.assertNotIn(task_draft_2.name, str(response_3))
+        self.assertIn(task_draft_3.name, str(response_3))
+
+    def test_TaskDraft_filters_for_SchedulingUnitDraft(self):
+
+        # setup
+        su_draft_1 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data("sud_%s" % uuid.uuid4()))
+        su_draft_2 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data("sud_%s" % uuid.uuid4()))
+        su_draft_3 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data("sud_%s" % uuid.uuid4()))
+        task_draft_1 = models.TaskDraft.objects.create(**TaskDraft_test_data("td_%s" % uuid.uuid4(), scheduling_unit_draft=su_draft_1))
+        task_draft_2 = models.TaskDraft.objects.create(**TaskDraft_test_data("td_%s" % uuid.uuid4(), scheduling_unit_draft=su_draft_2))
+        task_draft_3 = models.TaskDraft.objects.create(**TaskDraft_test_data("td_%s" % uuid.uuid4(), scheduling_unit_draft=su_draft_3))
+
+        #  assert
+        response_1 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_draft/?scheduling_unit_draft=%s' % su_draft_1.id, 200)
+        response_2 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_draft/?scheduling_unit_draft=%s,%s' % (su_draft_2.id, su_draft_3.id), 200)
+        response_3 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_draft/?scheduling_unit_draft_min=%s&scheduling_unit_draft_max=%s' % (su_draft_3.id, su_draft_3.id), 200)
+        response_4 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_draft/?scheduling_unit_draft_name=%s' % su_draft_2.name[:-3], 200)
+        GET_and_assert_equal_expected_code(self, BASE_URL + '/task_draft/?scheduling_unit_draft=%s' % 9999999, 400)
+        self.assertEqual(response_1['count'], 1)
+        self.assertIn(task_draft_1.name, str(response_1))
+        self.assertNotIn(task_draft_2.name, str(response_1))
+        self.assertNotIn(task_draft_3.name, str(response_1))
+        self.assertEqual(response_2['count'], 2)
+        self.assertNotIn(task_draft_1.name, str(response_2))
+        self.assertIn(task_draft_2.name, str(response_2))
+        self.assertIn(task_draft_3.name, str(response_2))
+        self.assertEqual(response_3['count'], 1)
+        self.assertNotIn(task_draft_1.name, str(response_3))
+        self.assertNotIn(task_draft_2.name, str(response_3))
+        self.assertIn(task_draft_3.name, str(response_3))
+        self.assertEqual(response_4['count'], 1)
+        self.assertNotIn(task_draft_1.name, str(response_4))
+        self.assertIn(task_draft_2.name, str(response_4))
+        self.assertNotIn(task_draft_3.name, str(response_4))
+
+
 class TaskRelationDraftTestCase(unittest.TestCase):
     @classmethod
     def setUpClass(cls) -> None:
@@ -2063,8 +2269,8 @@ class SchedulingUnitBlueprintTestCase(unittest.TestCase):
         Test we can filter on this property, which is explicitly named on the model-specific property filter
         """
         # setup
-        project_1 = models.Project.objects.create(**Project_test_data(name='myproject1_%s' % uuid.uuid4()))
-        project_2 = models.Project.objects.create(**Project_test_data(name='myproject2_%s' % uuid.uuid4()))
+        project_1 = models.Project.objects.create(**Project_test_data(name='myproject_partial_1_%s' % uuid.uuid4()))
+        project_2 = models.Project.objects.create(**Project_test_data(name='myproject_partial_2_%s' % uuid.uuid4()))
         scheduling_set_1 = models.SchedulingSet.objects.create(**SchedulingSet_test_data(project=project_1))
         scheduling_set_2 = models.SchedulingSet.objects.create(**SchedulingSet_test_data(project=project_2))
         su_draft_1 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(scheduling_set=scheduling_set_1))
@@ -2076,12 +2282,16 @@ class SchedulingUnitBlueprintTestCase(unittest.TestCase):
         response_1 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_blueprint/?project=%s' % project_1.name, 200)
         response_2 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_blueprint/?project=%s' % project_2.name, 200)
         response_3 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_blueprint/?project=foo', 200)
+        response_4 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_blueprint/?project=myproject_partia', 200)
 
         self.assertEqual(response_1['count'], 1)
         self.assertEqual(response_1['results'][0]['name'], su_blueprint_1.name)
         self.assertEqual(response_2['count'], 1)
         self.assertEqual(response_2['results'][0]['name'], su_blueprint_2.name)
         self.assertEqual(response_3['count'], 0)
+        self.assertEqual(response_4['count'], 2)
+        self.assertEqual(response_4['results'][0]['name'], su_blueprint_1.name)
+        self.assertEqual(response_4['results'][1]['name'], su_blueprint_2.name)
 
     def test_GET_SchedulingUnitBlueprint_view_filters_for_output_pinned(self):
         """
@@ -2103,6 +2313,91 @@ class SchedulingUnitBlueprintTestCase(unittest.TestCase):
         self.assertEqual(response_false['count'], 1)
         self.assertEqual(response_false['results'][0]['name'], su_blueprint_false.name)
 
+    def test_GET_SchedulingUnitBlueprint_view_filters_for_draft(self):
+        """
+        Test we can filter on this property, which is explicitly named on the model-specific property filter
+        """
+        # setup
+        su_draft_1 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud1_%s' % uuid.uuid4()))
+        su_draft_2 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud2_%s' % uuid.uuid4()))
+        su_draft_3 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud3_%s' % uuid.uuid4()))
+        su_blueprint_1 = models.SchedulingUnitBlueprint.objects.create(**SchedulingUnitBlueprint_test_data(name='sub1_%s' % uuid.uuid4()))
+        su_blueprint_2 = models.SchedulingUnitBlueprint.objects.create(**SchedulingUnitBlueprint_test_data(name='sub2_%s' % uuid.uuid4()))
+        su_blueprint_3 = models.SchedulingUnitBlueprint.objects.create(**SchedulingUnitBlueprint_test_data(name='sub3_%s' % uuid.uuid4()))
+        su_blueprint_1.draft = su_draft_1
+        su_blueprint_1.save()
+        su_blueprint_2.draft = su_draft_2
+        su_blueprint_2.save()
+        su_blueprint_3.draft = su_draft_3
+        su_blueprint_3.save()
+
+        # assertresponse_3 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/?scheduling_unit_blueprints=%s' % 999999, 200)
+        response_1 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_blueprint/?draft=%s' % su_draft_1.id, 200)
+        response_2 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_blueprint/?draft=%s,%s' % (su_draft_1.id, su_draft_3.id), 200)
+        response_3 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_blueprint/?draft=%s' % 999999, 400)
+        response_4 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_blueprint/?draft_min=%s&draft_max=%s' % (su_draft_2.id, su_draft_3.id), 200)
+
+        self.assertEqual(response_1['count'], 1)
+        self.assertEqual(response_1['results'][0]['name'], su_blueprint_1.name)
+        self.assertEqual(response_2['count'], 2)
+        self.assertEqual(response_2['results'][0]['name'], su_blueprint_1.name)
+        self.assertEqual(response_2['results'][1]['name'], su_blueprint_3.name)
+        self.assertIn('Select a valid choice', str(response_3))
+        self.assertEqual(response_4['count'], 2)
+        self.assertEqual(response_4['results'][0]['name'], su_blueprint_2.name)
+        self.assertEqual(response_4['results'][1]['name'], su_blueprint_3.name)
+
+
+    def test_GET_SchedulingUnitBlueprint_view_filters_for_id(self):
+        """
+        Test we can filter on this field, which is explicitly named on the model-specific property filter
+        """
+        # setup
+        su_blueprint_1 = models.SchedulingUnitBlueprint.objects.create(**SchedulingUnitBlueprint_test_data(name='sub1_%s' % uuid.uuid4()))
+        su_blueprint_2 = models.SchedulingUnitBlueprint.objects.create(**SchedulingUnitBlueprint_test_data(name='sub2_%s' % uuid.uuid4()))
+        su_blueprint_3 = models.SchedulingUnitBlueprint.objects.create(**SchedulingUnitBlueprint_test_data(name='sub3_%s' % uuid.uuid4()))
+
+        # assert
+        response_1 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_blueprint/?id=%s' % su_blueprint_1.id, 200)
+        response_2 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_blueprint/?id=%s,%s' % (su_blueprint_1.id, su_blueprint_3.id), 200)
+        response_3 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_blueprint/?id=%s' % 999999, 200)
+        response_4 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_blueprint/?id_min=%s&id_max=%s' % (su_blueprint_2.id, su_blueprint_3.id), 200)
+
+        self.assertEqual(response_1['count'], 1)
+        self.assertEqual(response_1['results'][0]['name'], su_blueprint_1.name)
+        self.assertEqual(response_2['count'], 2)
+        self.assertEqual(response_2['results'][0]['name'], su_blueprint_1.name)
+        self.assertEqual(response_2['results'][1]['name'], su_blueprint_3.name)
+        self.assertEqual(response_3['count'], 0)
+        self.assertEqual(response_4['count'], 2)
+        self.assertEqual(response_4['results'][0]['name'], su_blueprint_2.name)
+        self.assertEqual(response_4['results'][1]['name'], su_blueprint_3.name)
+
+
+    def test_GET_SchedulingUnitBlueprint_view_filters_for_strategy_template(self):
+        """
+        Test we can filter on this field, which is explicitly named on the model-specific property filter
+        """
+        # setup
+        template_1 = models.SchedulingUnitObservingStrategyTemplate.objects.create(**SchedulingUnitObservingStrategyTemplate_test_data(name='suost1_%s' % uuid.uuid4()))
+        template_2 = models.SchedulingUnitObservingStrategyTemplate.objects.create(**SchedulingUnitObservingStrategyTemplate_test_data(name='suost1_%s' % uuid.uuid4()))
+        su_draft_1 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud1_%s' % uuid.uuid4(), observation_strategy_template=template_1))
+        su_draft_2 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud2_%s' % uuid.uuid4(), observation_strategy_template=template_2))
+        su_blueprint_1 = models.SchedulingUnitBlueprint.objects.create(**SchedulingUnitBlueprint_test_data(name='sub1_%s' % uuid.uuid4(), draft=su_draft_1))
+        su_blueprint_2 = models.SchedulingUnitBlueprint.objects.create(**SchedulingUnitBlueprint_test_data(name='sub2_%s' % uuid.uuid4(), draft=su_draft_2))
+
+        # assert
+        response_1 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_blueprint/?observation_strategy_template=%s' % template_1.id, 200)
+        response_2 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_blueprint/?observation_strategy_template_name=%s' % template_2.name[:-3], 200)
+        response_3 = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_blueprint/?observation_strategy_template_name=%s' % 'gibberish', 200)
+        GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_blueprint/?observation_strategy_template=%s' % 999999, 400)
+
+        self.assertEqual(response_1['count'], 1)
+        self.assertEqual(response_1['results'][0]['name'], su_blueprint_1.name)
+        self.assertEqual(response_2['count'], 1)
+        self.assertEqual(response_2['results'][0]['name'], su_blueprint_2.name)
+        self.assertEqual(response_3['count'], 0)
+
 
 class TaskBlueprintTestCase(unittest.TestCase):
     @classmethod
@@ -2305,25 +2600,116 @@ class TaskBlueprintTestCase(unittest.TestCase):
         response_data = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/%s/' % task_blueprint.id, 200)
         assertUrlList(self, response_data['subtasks'], [subtask_1, subtask_2])
 
-    @unittest.skip("This test is dependend on previous tests (in the results list). ToDo: fix it.")
     def test_TaskBlueprint_contains_lists_of_related_TaskRelationBlueprint(self):
 
         # setup
-        test_data_1 = TaskBlueprint_test_data()
-        test_data_2 = TaskBlueprint_test_data()
-        trbt_test_data_1 = TaskRelationBlueprint_test_data()
-        trbt_test_data_2 = TaskRelationBlueprint_test_data()
-        task_blueprint = models.TaskBlueprint.objects.create(**test_data_1)
-        task_relation_blueprint_1 = models.TaskRelationBlueprint.objects.create(**trbt_test_data_1)
-        task_relation_blueprint_1.producer = task_blueprint
-        task_relation_blueprint_1.save()
-        task_relation_blueprint_2 = models.TaskRelationBlueprint.objects.create(**trbt_test_data_2)
-        task_relation_blueprint_2.consumer = task_blueprint
-        task_relation_blueprint_2.save()
+        task_blueprint = models.TaskBlueprint.objects.create(**TaskBlueprint_test_data())
+        task_relation_blueprint_1 = models.TaskRelationBlueprint.objects.create(**TaskRelationBlueprint_test_data(producer=task_blueprint))
+        task_relation_blueprint_2 = models.TaskRelationBlueprint.objects.create(**TaskRelationBlueprint_test_data(consumer=task_blueprint))
+
         # assert
         response_data = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/%s/' % task_blueprint.id, 200)
-        assertUrlList(self, response_data['produced_by'], [task_relation_blueprint_1])
-        assertUrlList(self, response_data['consumed_by'], [task_relation_blueprint_2])
+        assertUrlList(self, response_data['consumed_by'], [task_relation_blueprint_1])
+        assertUrlList(self, response_data['produced_by'], [task_relation_blueprint_2])
+
+    def test_TaskBlueprint_filters_for_SchedulingUnitBlueprint(self):
+
+        # setup
+        su_blueprint_1 = models.SchedulingUnitBlueprint.objects.create(**SchedulingUnitBlueprint_test_data("sub_%s" % uuid.uuid4()))
+        su_blueprint_2 = models.SchedulingUnitBlueprint.objects.create(**SchedulingUnitBlueprint_test_data("sub_%s" % uuid.uuid4()))
+        su_blueprint_3 = models.SchedulingUnitBlueprint.objects.create(**SchedulingUnitBlueprint_test_data("sub_%s" % uuid.uuid4()))
+        task_blueprint_1 = models.TaskBlueprint.objects.create(**TaskBlueprint_test_data("tb_%s" % uuid.uuid4(), scheduling_unit_blueprint=su_blueprint_1))
+        task_blueprint_2 = models.TaskBlueprint.objects.create(**TaskBlueprint_test_data("tb_%s" % uuid.uuid4(), scheduling_unit_blueprint=su_blueprint_2))
+        task_blueprint_3 = models.TaskBlueprint.objects.create(**TaskBlueprint_test_data("tb_%s" % uuid.uuid4(), scheduling_unit_blueprint=su_blueprint_3))
+
+        #  assert
+        response_1 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?scheduling_unit_blueprint=%s' % su_blueprint_1.id, 200)
+        response_2 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?scheduling_unit_blueprint=%s,%s' % (su_blueprint_2.id, su_blueprint_3.id), 200)
+        response_3 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?scheduling_unit_blueprint_min=%s&scheduling_unit_blueprint_max=%s' % (su_blueprint_3.id, su_blueprint_3.id), 200)
+        response_4 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?scheduling_unit_blueprint_name=%s' % su_blueprint_2.name[:-3], 200)
+        GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?scheduling_unit_blueprint=%s' % 99999, 400)
+        self.assertEqual(response_1['count'], 1)
+        self.assertIn(task_blueprint_1.name, str(response_1))
+        self.assertEqual(response_2['count'], 2)
+        self.assertNotIn(task_blueprint_1.name, str(response_2))
+        self.assertIn(task_blueprint_2.name, str(response_2))
+        self.assertIn(task_blueprint_3.name, str(response_2))
+        self.assertEqual(response_3['count'], 1)
+        self.assertNotIn(task_blueprint_1.name, str(response_3))
+        self.assertNotIn(task_blueprint_2.name, str(response_3))
+        self.assertIn(task_blueprint_3.name, str(response_3))
+        self.assertEqual(response_4['count'], 1)
+        self.assertNotIn(task_blueprint_1.name, str(response_4))
+        self.assertIn(task_blueprint_2.name, str(response_4))
+        self.assertNotIn(task_blueprint_3.name, str(response_4))
+
+    def test_TaskBlueprint_filters_for_TaskDraft(self):
+
+        # setup
+        task_draft_1 = models.TaskDraft.objects.create(**TaskDraft_test_data("td_%s" % uuid.uuid4()))
+        task_draft_2 = models.TaskDraft.objects.create(**TaskDraft_test_data("td_%s" % uuid.uuid4()))
+        task_draft_3 = models.TaskDraft.objects.create(**TaskDraft_test_data("td_%s" % uuid.uuid4()))
+        task_blueprint_1 = models.TaskBlueprint.objects.create(**TaskBlueprint_test_data(name="tb_%s" % uuid.uuid4(), task_draft=task_draft_1))
+        task_blueprint_2 = models.TaskBlueprint.objects.create(**TaskBlueprint_test_data(name="tb_%s" % uuid.uuid4(), task_draft=task_draft_2))
+        task_blueprint_3 = models.TaskBlueprint.objects.create(**TaskBlueprint_test_data(name="tb_%s" % uuid.uuid4(), task_draft=task_draft_3))
+
+        #  assert
+        response_1 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?draft=%s' % task_draft_1.id, 200)
+        response_2 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?draft_min=%s&draft_max=%s' % (task_draft_2.id, task_draft_2.id), 200)
+        response_3 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?draft=%s,%s' % (task_draft_1.id, task_draft_3.id), 200)
+        GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?draft=%s' % 9999999, 400)
+        self.assertIn(task_blueprint_1.name, str(response_1))
+        self.assertNotIn(task_blueprint_2.name, str(response_1))
+        self.assertNotIn(task_blueprint_3.name, str(response_1))
+        self.assertNotIn(task_blueprint_1.name, str(response_2))
+        self.assertIn(task_blueprint_2.name, str(response_2))
+        self.assertNotIn(task_blueprint_3.name, str(response_2))
+        self.assertIn(task_blueprint_1.name, str(response_3))
+        self.assertNotIn(task_blueprint_2.name, str(response_3))
+        self.assertIn(task_blueprint_3.name, str(response_3))
+
+    def test_TaskBlueprint_filters_for_Subtask(self):
+
+        # setup
+        task_blueprint_1 = models.TaskBlueprint.objects.create(**TaskBlueprint_test_data(name="tb_%s" % uuid.uuid4()))
+        task_blueprint_2 = models.TaskBlueprint.objects.create(**TaskBlueprint_test_data(name="tb_%s" % uuid.uuid4()))
+        task_blueprint_3 = models.TaskBlueprint.objects.create(**TaskBlueprint_test_data(name="tb_%s" % uuid.uuid4()))
+        subtask_1 = models.Subtask.objects.create(**Subtask_test_data())
+        subtask_2 = models.Subtask.objects.create(**Subtask_test_data())
+        subtask_3 = models.Subtask.objects.create(**Subtask_test_data())
+        subtask_1.task_blueprints.set([task_blueprint_1])
+        subtask_2.task_blueprints.set([task_blueprint_2])
+        subtask_3.task_blueprints.set([task_blueprint_3])
+        subtask_1.save()
+        subtask_2.save()
+        subtask_3.save()
+
+        #  assert
+        response_1 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?subtasks=%s' % subtask_1.id, 200)
+        response_2 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?subtasks_min=%s&subtasks_max=%s' % (subtask_2.id, subtask_2.id), 200)
+        response_3 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?subtasks=%s&subtasks=%s' % (subtask_1.id, subtask_3.id), 200)
+        GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?subtasks=%s' % 9999999, 400)
+        self.assertIn(task_blueprint_1.name, str(response_1))
+        self.assertNotIn(task_blueprint_2.name, str(response_1))
+        self.assertNotIn(task_blueprint_3.name, str(response_1))
+        self.assertNotIn(task_blueprint_1.name, str(response_2))
+        self.assertIn(task_blueprint_2.name, str(response_2))
+        self.assertNotIn(task_blueprint_3.name, str(response_2))
+        self.assertIn(task_blueprint_1.name, str(response_3))
+        self.assertNotIn(task_blueprint_2.name, str(response_3))
+        self.assertIn(task_blueprint_3.name, str(response_3))
+
+    def test_TaskBlueprint_filters_for_status(self):
+
+        # setup
+        task_blueprint_1 = models.TaskBlueprint.objects.create(**TaskBlueprint_test_data(name="tb_%s" % uuid.uuid4()))
+
+        #  assert
+        response_1 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?status=defined', 200)
+        response_2 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?status=obsolete', 200)
+        GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?status=gibberish', 400)
+        self.assertGreater(response_1['count'], 0)
+        self.assertEqual(response_2['count'], 0)
 
 
 class TaskRelationBlueprintTestCase(unittest.TestCase):
diff --git a/SAS/TMSS/backend/test/tmss_test_data_rest.py b/SAS/TMSS/backend/test/tmss_test_data_rest.py
index aac0a57eb172238b906740df2d410c2ed9a6441a..ad598429c8d0f77db2634798ec6ed28c8974d234 100644
--- a/SAS/TMSS/backend/test/tmss_test_data_rest.py
+++ b/SAS/TMSS/backend/test/tmss_test_data_rest.py
@@ -254,7 +254,7 @@ class TMSSRESTTestDataCreator():
             self._cycle_url = self.post_data_and_get_url(self.Cycle(), '/cycle/')
             return self._cycle_url
 
-    def Project(self, description="my project description", name=None, auto_pin=False, auto_ingest=False, cycle_urls=[]):
+    def Project(self, description="my project description", name=None, auto_pin=False, auto_ingest=False, cycle_urls=None, scheduling_state="opened"):
         if name is None:
             name = 'my_project_' + str(uuid.uuid4())
 
@@ -271,7 +271,8 @@ class TMSSRESTTestDataCreator():
                 "private_data": True,
                 "cycles": cycle_urls,
                 "auto_pin": auto_pin,
-                "auto_ingest": auto_ingest}
+                "auto_ingest": auto_ingest,
+                "scheduling_state": self.django_api_url + '/scheduling_state/%s' % scheduling_state}
 
     @property
     def cached_project_url(self):
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/App.js b/SAS/TMSS/frontend/tmss_webapp/src/App.js
index 563065029dd6533cd87ab700d05f34f874bb90b0..5d09a9b26f6ba7d291ae733cab4e4c74da5b9cde 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/App.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/App.js
@@ -26,6 +26,8 @@ import { CustomDialog } from './layout/components/CustomDialog';
 
 import AuthStore from './authenticate/auth.store';
 import {Provider} from "react-redux";
+import AuthComponent from './components/AuthComponent';
+
 
 const {  publish, subscribe } = pubsub();
 
@@ -45,16 +47,16 @@ class App extends Component {
         staticMenuInactive: localStorage.getItem('staticMenuInactive') === 'true' ? true : false,
         overlayMenuActive: localStorage.getItem('overlayMenuActive') === 'true' ? true : false,
         mobileMenuActive: localStorage.getItem('mobileMenuActive') === 'true' ? true : false,
-        authenticated: Auth.isAuthenticated(),
+        authenticated: true,
         findObjectPlaceholder: 'Sub Task',
-        redirect: (Auth.isAuthenticated() && window.location.pathname === "/login")?"/":window.location.pathname
+        redirect: window.location.pathname,
+        isLogin: true
         };
         this.onWrapperClick = this.onWrapperClick.bind(this);
         this.onToggleMenu = this.onToggleMenu.bind(this);
         this.onSidebarClick = this.onSidebarClick.bind(this);
         this.onMenuItemClick = this.onMenuItemClick.bind(this);
         this.setPageTitle = this.setPageTitle.bind(this);
-        this.loggedIn = this.loggedIn.bind(this);
         this.logout = this.logout.bind(this);
         this.validateAndLogout = this.validateAndLogout.bind(this);
         this.setSearchField = this.setSearchField.bind(this);
@@ -70,7 +72,6 @@ class App extends Component {
         {label: 'Reports', icon: 'pi pi-fw pi-chart-bar', to:'/reports',section: 'reports'},
     ];
     }
-
     onWrapperClick(event) {
         if (!this.menuClick) {
             this.setState({
@@ -134,17 +135,13 @@ class App extends Component {
      * Callback function from login page to set the authentication state to true amd redirect to the 
      * original requested URL.
      */
-    loggedIn() {
-        const redirect = this.state.redirect;
-        this.setState({authenticated: true, redirect: redirect==="/login"?"/":redirect});
-    }
 
     /**
      * Logout and redirect to login page.
      */
     logout() {
         Auth.logout();
-        this.setState({authenticated: false, redirect:"/"});
+        this.setState({ redirect:"/", isLogin: false});
     }
 
     /**
@@ -168,21 +165,22 @@ class App extends Component {
         subscribe('edit-dirty', (flag) => {
             this.setState({ isEditDirty: flag }, () => {
                 if (flag) {
-                    window.addEventListener("beforeunload", function (e) {
-                        var confirmationMessage = "\o/";
-                        (e || window.event).returnValue = confirmationMessage; //Gecko + IE
-                        return confirmationMessage;   
-                       // this.toggleDirtyDialog();
-                    });
+                    window.addEventListener("beforeunload", reloadDirty);
                     // window.addEventListener('popstate', this.onBackButtonEvent);
                     window.history.pushState(null, document.title, window.location.href);
                     window.addEventListener('popstate', this.onBackButtonEvent);
                 } else {
-                    //window.removeEventListener('beforeunload');
+                    window.removeEventListener("beforeunload",reloadDirty);
                 }
             });
         });
-       
+
+        var reloadDirty =function  (e) {
+            var confirmationMessage = "\o/";
+            (e || window.event).returnValue = confirmationMessage; //Gecko + IE
+            return confirmationMessage;   
+           // this.toggleDirtyDialog();
+        };
     }
 
     onBackButtonEvent = (e) => {
@@ -246,17 +244,17 @@ class App extends Component {
             'layout-overlay-sidebar-active': this.state.overlayMenuActive && this.state.layoutMode === 'overlay',
             'layout-mobile-sidebar-active': this.state.mobileMenuActive			
         });
-        //console.log(this.props);
         return (
             <React.Fragment>
                 <div className="App">
                     <Provider store={AuthStore}>
                     {/* <div className={wrapperClass} onClick={this.onWrapperClick}> */}
                     <div className={wrapperClass}>
-                        
                         {/* Load main routes and application only if the application is authenticated */}
-                        {this.state.authenticated &&
                         <>
+                        {this.state.redirect &&
+                        // <AuthComponent isLogin = {this.state.isLogin}>
+                        <AuthComponent>
                             <AppTopbar 
                                 onToggleMenu={this.onToggleMenu} 
                                 isLoggedIn={this.state.authenticated} 
@@ -268,30 +266,20 @@ class App extends Component {
                                 <AppMenu model={this.menu} toggleDirtyDialog={this.toggleDirtyDialog} isEditDirty={this.state.isEditDirty} onMenuItemClick={this.onMenuItemClick} layoutMode={this.state.la} active={this.state.menuActive}/>
                                 <div className="layout-main">
                                     {this.state.redirect &&
-                                        <Redirect to={{pathname: this.state.redirect}} />}
+                                        <Redirect to={{pathname: this.state.redirect, state: {userrole: this.state.userrole}}} />}
                                     <AppBreadcrumb setPageTitle={this.setPageTitle} section={this.state.currentMenu} onBreadcrumbClick={this.onBreadcrumbClick} />
                                     <RoutedContent />
                                 </div>
-                            </Router>
-                            <AppFooter></AppFooter>
-                        </>
-                        }
+                            </Router>   
 
-                        {/* If not authenticated, show only login page */}
-                        {!this.state.authenticated &&
-                            <>
-                                <Router basename={ this.state.currentPath }>
-                                    <Redirect to={{pathname: "/login"}} />
-                                    <Login onLogin={this.loggedIn} />
-                                </Router>
-                            </>
+                            <AppFooter></AppFooter>
+                            </AuthComponent>
                         }
-
+                        </>
                         <CustomDialog type="confirmation" visible={this.state.showDirtyDialog} width="40vw"
                             header={'Confirmation'} message={'Do you want to leave this page? Your changes may not be saved.'} 
                             content={''} onClose={this.close} onCancel={this.close} onSubmit={this.cancelEdit}>
                         </CustomDialog>
-                        
                     </div>
                     </Provider>
                 </div>
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/authenticate/auth.js b/SAS/TMSS/frontend/tmss_webapp/src/authenticate/auth.js
index 4f66abbf5e0626a4f7361141868754060033e7cb..8648fb81067b770f0820edf02495faee8de1e96e 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/authenticate/auth.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/authenticate/auth.js
@@ -1,4 +1,5 @@
 import AuthService from "../services/auth.service";
+import AuthStore from "./auth.store";
 import PermissionStackUtil from './permission.stack.handler';
 const axios = require('axios');
 
@@ -7,17 +8,20 @@ const axios = require('axios');
  */
 const Auth = {
     /** To check if user already logged in and the token is available in the browser local storage */
-    isAuthenticated: () => {
+    isAuthenticated: async () => {
         let user = localStorage.getItem("user");
         if (user) {
             user = JSON.parse(user);
             if (user.token) {
                 axios.defaults.headers.common['Authorization'] = `Token ${user.token}`;
-                PermissionStackUtil.getPermissions(true);
+                const permissions = await AuthStore.getState();
+                if(!permissions.userRolePermission.project) {
+                    await PermissionStackUtil.getPermissions(true);
+                }
                 return true;
             }
         }
-        PermissionStackUtil.getPermissions(false);
+        await PermissionStackUtil.getPermissions(false);
         return false;
     },
     /** Gets user details from browser local storage */
@@ -29,7 +33,7 @@ const Auth = {
         const authData = await AuthService.authenticate(user, pass);
         if (authData) {
             localStorage.setItem("user", JSON.stringify({name:user, token: authData.token}));
-            PermissionStackUtil.getPermissions(true);
+            await PermissionStackUtil.getPermissions(true);
             return true;
         }   else {
             return false;
@@ -38,6 +42,7 @@ const Auth = {
     /** Remove user details from localstorage on logout */
     logout: () => {
         AuthService.deAuthenticate();
+        PermissionStackUtil.deleteStore()
         localStorage.removeItem("user");
     }
 }
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/authenticate/auth.store.js b/SAS/TMSS/frontend/tmss_webapp/src/authenticate/auth.store.js
index 72724214366e831b5b0846e48c8cd48c3b34022e..f14a99f2c1a0df727a024731aa1907e2e95d3cde 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/authenticate/auth.store.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/authenticate/auth.store.js
@@ -27,9 +27,20 @@ const rolePermissionReducer = (state, action) => {
             const keys = Object. keys(permissionStack);
             for ( const key of keys) {
                 state[key] = permissionStack[key];
-            } 
+            }
             return  { ...state};
         }
+        case 'loadpermissionbyid': {
+            permissionStack = action.payload;
+            state['rolePermission'][action.module] = {...state['rolePermission'][action.module] , [action.id]: permissionStack[action.module][action.id] }
+            return {...state};
+        }
+
+        case 'deletestore': {
+            state = action.payload;
+            return {...state};
+        }
+       
         default: {
             const actionType = action.type;
             if (permissionStack && permissionStack[actionType]) {
@@ -39,8 +50,7 @@ const rolePermissionReducer = (state, action) => {
                 return { ...state, [actionType]:permissionStack[actionType]};
             }   else {
                 return  { ...state, rolePermission: {}};
-            }
-            
+            } 
         }
     }
 } 
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/authenticate/login.js b/SAS/TMSS/frontend/tmss_webapp/src/authenticate/login.js
index dc664ca93ed31e31f1a3240ecad5698848b5ce62..383fe9b68d1840a2badde6b390f5e1b2dc7bc3f5 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/authenticate/login.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/authenticate/login.js
@@ -13,7 +13,7 @@ export class Login extends Component {
         this.state = {
             username: null,
             password: null,
-            redirect: Auth.isAuthenticated()?"/":null,          //If already logged in, redirect to home page
+            redirect: null,          //If already logged in, redirect to home page
             error: null,
             errors: {},
             validFields: {}
@@ -98,7 +98,7 @@ export class Login extends Component {
                                                 <h4>Login</h4>
                                                 <div className="form-field">
                                                     <span className="p-float-label">
-                                                        <InputText id="" className={`${this.state.errors.username?"input-error ":""} form-control`} 
+                                                        <InputText id="" className={`${this.state.errors.username?"input-error ":""} form-control`} autoFocus
                                                                     value={this.state.username} onChange={(e) => this.setCredentials('username', e.target.value)}
                                                                     onKeyUp={this.formSubmit} />
                                                         <label htmlFor="username"><i className="fa fa-user"></i>Enter Username</label>
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/authenticate/permission.stack.handler.js b/SAS/TMSS/frontend/tmss_webapp/src/authenticate/permission.stack.handler.js
index ddf4c2815af516f57b451a5acbe735319a84ee83..1d1c2be92ecdc8d61cb144763bbfa67cd5b10bce 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/authenticate/permission.stack.handler.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/authenticate/permission.stack.handler.js
@@ -1,4 +1,4 @@
-import AuthStore from './../authenticate/auth.store';
+import AuthStore, { persistor } from './../authenticate/auth.store';
 import AuthService from '../services/auth.service';
 import _ from 'lodash';
 
@@ -30,42 +30,121 @@ const PermissionStackUtil = {
             } */
         }
         AuthStore.dispatch({ type: 'loadpermission', payload: permissionStack});
-        return permissionStack
+        return permissionStack;
     },
     async getAPIBasedPermission() {
         let permissionStack = {};
-        const modules = ['project', 'scheduleunit_draft', 'scheduleunit_blueprint'];
         const module_url = {
             project: 'project',
             scheduleunit_draft: 'scheduling_unit_draft',
-            scheduleunit_blueprint: 'scheduling_unit_blueprint'
+            scheduleunit_blueprint: 'scheduling_unit_blueprint',
+            scheduling_set: 'scheduling_set',
+            cycle: 'cycle',
+            task_draft: 'task_draft',
+            task_blueprint: 'task_blueprint',
+            reservation: 'reservation',
+            task_relation_draft: 'task_relation_draft',
+            task_relation_blueprint: 'task_relation_blueprint'
         }
+        const modules = Object.keys(module_url);
         for(const module of modules) {
             const url = module_url[module];
             const allowedPermission = await AuthService.getAccessControlMethod(url);
             if (allowedPermission) {
-               // const allowedMethods = allowedPermission.headers['access-control-allow-methods'];
                 if (module === 'project') {
                     permissionStack[module] ={
+                        list: allowedPermission?(_.includes(allowedPermission, 'GET')):false,
                         create: allowedPermission?(_.includes(allowedPermission, 'PUT')):false,
                         edit: allowedPermission?(_.includes(allowedPermission, 'PATCH')):false,
                         delete: allowedPermission?(_.includes(allowedPermission, 'DELETE')):false};
-                }   else {
+                }  
+                else if(module ===  'scheduleunit_draft' || module === 'scheduleunit_blueprint') {
+                    let getAccesss = allowedPermission?(_.includes(allowedPermission, 'GET')):false;
                     let putAccesss = allowedPermission?(_.includes(allowedPermission, 'PUT')):false;
                     let patchAccess = allowedPermission?(_.includes(allowedPermission, 'PATCH')):false;
                     let deleteAccess = allowedPermission?(_.includes(allowedPermission, 'DELETE')):false;
+                    let postAccess = allowedPermission?(_.includes(allowedPermission, 'POST')):false;
                     permissionStack['scheduleunit'] ={
-                        create: putAccesss, edit: patchAccess, delete: deleteAccess,
-                        createsub: putAccesss, autodeletion:patchAccess, copysu:putAccesss, excelview:putAccesss,
-                        cleanuptask:true, cancelsu:true, viewworkflow:true,dataproduct: true };
+                        create: putAccesss, edit: patchAccess, delete: deleteAccess, list: getAccesss,
+                        createsub: putAccesss, autodeletion:patchAccess, copysu:putAccesss, excelview:getAccesss,
+                        cleanuptask:true, cancelsu:true, viewworkflow:true };
+                    permissionStack[module] = {
+                        create: putAccesss, edit: patchAccess, delete: deleteAccess, list: getAccesss, add: postAccess
+                    }  
                 }
-            }   else {
-                permissionStack['project'] = {create: false, edit: false, delete: false};
-                permissionStack['scheduleunit'] =  {create: false, edit: false, delete: false, createsub: false, autodeletion:false, 
-                    copysu:false, excelview:false, cleanuptask:true, cancelsu:true, viewworkflow:true,dataproduct: true,};
+                else if(module === 'task_relation_draft') {
+                    permissionStack['scheduleunit'].dataproduct = allowedPermission?(_.includes(allowedPermission, 'POST')):false;
+                }
+                else if(module === 'task_relation_blueprint') {
+                    permissionStack['scheduleunit_blueprint'].dataproduct = allowedPermission?(_.includes(allowedPermission, 'POST')):false;
+                }
+                else if (module === 'scheduling_set') {
+                    permissionStack['scheduleunit_draft']['scheduling_set'] = allowedPermission?(_.includes(allowedPermission, 'POST')):false;
+                }
+                else if(module === 'cycle') {
+                    permissionStack[module] ={
+                        list: allowedPermission?(_.includes(allowedPermission, 'GET')):false,
+                        create: allowedPermission?(_.includes(allowedPermission, 'PUT')):false,
+                        edit: allowedPermission?(_.includes(allowedPermission, 'PATCH')):false,
+                        delete: allowedPermission?(_.includes(allowedPermission, 'DELETE')):false};
+                } 
+                else if(module === 'task_draft' || module === 'task_blueprint'){
+                    permissionStack['task'] ={
+                        list: allowedPermission?(_.includes(allowedPermission, 'GET')):false,
+                        edit: allowedPermission?(_.includes(allowedPermission, 'PATCH')):false,
+                        delete: allowedPermission?(_.includes(allowedPermission, 'DELETE')):false,
+                    }
+                    permissionStack[module] = {
+                        canceltask: allowedPermission?(_.includes(allowedPermission, 'POST')):false
+                    };
+                } 
+                else if(module === 'reservation') {
+                    let getAccesss = allowedPermission?(_.includes(allowedPermission, 'GET')):false;
+                    let postAccess = allowedPermission?(_.includes(allowedPermission, 'POST')):false;
+                    permissionStack['timeline'] = {
+                        addreservation: postAccess,
+                        listreservation: getAccesss
+                    };
+                    permissionStack['weekoverview'] = {
+                        addreservation: postAccess,
+                        listreservation: getAccesss 
+                    };
+                    permissionStack['reservation'] = {
+                        create: postAccess,
+                        list: getAccesss,
+                        edit: allowedPermission?(_.includes(allowedPermission, 'PATCH')):false,
+                        delete: allowedPermission?(_.includes(allowedPermission, 'DELETE')):false
+                    };
+                }    
             }
         }
+        permissionStack['workflow'] = {
+                'qa_reporting_to': true,
+                'qa_reporting_sos':true,
+                'pi_verification':true,
+                'decide_acceptance':true,
+                'unpin_data':true,
+        };
         return permissionStack;
+    },
+    async getAccessByModuleAndId(module, id) {
+        let permissionStack = {};
+        const url = module+'/'+id;
+        const allowedPermission = await AuthService.getAccessControlMethod(url);
+        permissionStack[module] = {}
+        if(allowedPermission) {
+            permissionStack[module][id] ={ 
+                view : allowedPermission?(_.includes(allowedPermission, 'GET')):false,
+                edit : allowedPermission?(_.includes(allowedPermission, 'PUT')):false,
+                delete : allowedPermission?(_.includes(allowedPermission, 'DELETE')):false
+            }
+        }
+        AuthStore.dispatch({ type: 'loadpermissionbyid', payload: permissionStack, id: id, module: module});
+        return permissionStack[module];
+    },
+    async deleteStore() {
+        await AuthStore.dispatch({type: 'deletestore', payload: { rolePermission: {}}});
+        return
     }
 }
 
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/components/AuthComponent.js b/SAS/TMSS/frontend/tmss_webapp/src/components/AuthComponent.js
new file mode 100644
index 0000000000000000000000000000000000000000..cbf79319b1b487b62815f465a9a7c16692bd8350
--- /dev/null
+++ b/SAS/TMSS/frontend/tmss_webapp/src/components/AuthComponent.js
@@ -0,0 +1,52 @@
+import React, {Component} from 'react';
+import { BrowserRouter as Router } from 'react-router-dom';
+import { Redirect} from 'react-router-dom';
+import Auth from '../authenticate/auth'
+import { Login } from '../authenticate/login';
+
+class AuthComponent extends Component {
+
+    constructor(props) {
+        super(props)
+        this.state = {
+            authenticated: false,
+            isLoginProgress : true
+        }
+        this.loggedIn = this.loggedIn.bind(this);
+    }
+
+    async componentDidMount() {
+        const authenticate = await Auth.isAuthenticated();
+        this.setState({authenticated: authenticate, isLoginProgress: authenticate});
+    }
+
+    async componentDidUpdate(prevProp, prevState) {
+        const authenticate = await Auth.isAuthenticated();
+        if(prevState.authenticated != authenticate){
+        this.setState({authenticated: authenticate, isLoginProgress: authenticate});
+        }
+    }
+    
+    loggedIn() {
+        this.setState({authenticated: true, redirect: "/", isLoginProgress: true});
+    }
+
+    render() {
+        return(
+            <>
+            { this.state.authenticated ? this.props.children:  
+            <>  
+                {!this.state.isLoginProgress &&
+                    <Router basename={ "/" }>
+                        <Redirect to={{pathname: "/login"}} />
+                        <Login onLogin={this.loggedIn} />
+                    </Router>
+                }
+            </>
+            }
+            </>
+        )
+    }
+}
+
+export default AuthComponent;
\ No newline at end of file
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/components/ProtectedRouteComponent.js b/SAS/TMSS/frontend/tmss_webapp/src/components/ProtectedRouteComponent.js
new file mode 100644
index 0000000000000000000000000000000000000000..037194a9b2aa8fbe7b0ec15ab2460246e6ed38a0
--- /dev/null
+++ b/SAS/TMSS/frontend/tmss_webapp/src/components/ProtectedRouteComponent.js
@@ -0,0 +1,58 @@
+import React, { Component } from "react";
+import {
+    Route,
+    Redirect,
+} from 'react-router-dom';
+import AuthStore from '../authenticate/auth.store';
+import AuthUtil from "../utils/auth.util";
+import _ from 'lodash';
+
+class ProtectedRoute extends Component{
+
+    constructor(props){
+        super(props)
+        this.state={
+            permission_set: AuthStore.getState()
+        }
+    }
+
+    async componentDidMount() {
+        const permission = await AuthUtil.getUserRolePermission();
+        this.setState({permission_set: permission});
+    }
+    
+    hasPermission() {
+        const permission = this.props.permissions
+        if(this.state.permission_set['userRolePermission']){
+            if(permission.length <= 2) {
+                if(typeof(permission[0]) !== undefined && permission[1] !== undefined) {
+                    if(this.state.permission_set['userRolePermission'][permission[0]] && this.state.permission_set['userRolePermission'][permission[0]][permission[1]]) {
+                        return true;
+                    } else {
+                        return false;
+                    }
+                }
+            }
+        }
+    }
+
+    render() {
+        const { name, component, path, exact, permissions } = this.props;
+        if(permissions) {
+           if(this.hasPermission()) {
+                return <Route path={path} name={name} component={component} />
+            }
+            else {
+                return <Redirect to={{
+                    pathname: '/access-denied',
+                    state: { from: this.props.location }
+                }}/> 
+            }
+        }
+        else {
+            return <Route path={path} name={name} component={component} />
+        }
+    }
+}
+
+export default ProtectedRoute;
\ No newline at end of file
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/components/Spreadsheet/BetweenEditor.js b/SAS/TMSS/frontend/tmss_webapp/src/components/Spreadsheet/BetweenEditor.js
index 54391d1a0277ab010e410ac6c067413161a0ba2d..90580a248473a1339bee434c67443319b486edd2 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/components/Spreadsheet/BetweenEditor.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/components/Spreadsheet/BetweenEditor.js
@@ -120,7 +120,7 @@ render() {
         <Button key="back" label="Close" onClick={() => {this.copyDateValue()}} />
         </div>
     } >
-          <div className="ag-theme-balham" style={{ height: '400px', width: '500px', paddingLeft: '20px' }}>
+          <div className="ag-theme-balham" style={{ maxHeight: '335px', minHeight: '200px', width: '500px', paddingLeft: '20px' }}>
             <div className="p-field p-grid" >
               <React.Fragment>
                 <label key={'labelFrom'} className="col-lg-5 col-md-5 col-sm-12">From</label>
@@ -185,7 +185,7 @@ render() {
                           </button>
                       </Flatpickr>
                         {this.state.rowData.length !== (index+1) &&
-                        <button className="p-link" style={{marginLeft: '6vw'}}  onClick={(e) => this.removeInput(index)} >
+                        <button className="p-link" style={{marginLeft: '1vw'}}  onClick={(e) => this.removeInput(index)} >
                               <i className="fa fa-trash pi-error"></i></button>
                               }
                     </div>
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/components/Timeline/CalendarTimeline.js b/SAS/TMSS/frontend/tmss_webapp/src/components/Timeline/CalendarTimeline.js
index ba7e2a0a68516aead646fd6e31794ec482c6132a..bed0a742a19ac942a70fa7491b5e09451bcf628c 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/components/Timeline/CalendarTimeline.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/components/Timeline/CalendarTimeline.js
@@ -1515,7 +1515,7 @@ export class CalendarTimeline extends Component {
                             <div className='col-1 su-legend su-finished' title="Finished">Finished</div>
                         </div>
                     </div>
-                    {!this.props.showSunTimings && 
+                    {/* {!this.props.showSunTimings &&  */}
                     <div className="col-3">
                         <div style={{fontWeight:'500', height: '25px'}}>Station Reservation</div>
                         <div className="p-grid">
@@ -1525,7 +1525,7 @@ export class CalendarTimeline extends Component {
                             <div className="col-3 su-legend reserve-dynamic" title="Dynamic">Dynamic</div>
                         </div>
                     </div>
-                    }
+                    {/* } */}
                 </div>
                 <Timeline
                     groups={this.state.group}
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/components/ViewTable.js b/SAS/TMSS/frontend/tmss_webapp/src/components/ViewTable.js
index edd2baf03bc4ed342deb9b56e16a62c794ad66d1..129b8232bf12d6353bc1507d27f1b17a1821b683 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/components/ViewTable.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/components/ViewTable.js
@@ -1,11 +1,11 @@
 import React, { useRef, useState } from "react";
 import { useSortBy, useTable, useFilters, useGlobalFilter, useAsyncDebounce, usePagination, useRowSelect, useColumnOrder } from 'react-table'
 import matchSorter from 'match-sorter'
-import _ from 'lodash';
+import _, { filter } from 'lodash';
 import moment from 'moment';
 import { useHistory } from "react-router-dom";
 import { OverlayPanel } from 'primereact/overlaypanel';
-//import {InputSwitch} from 'primereact/inputswitch';
+import { InputMask } from 'primereact/inputmask';
 import { InputText } from 'primereact/inputtext';
 import { Calendar } from 'primereact/calendar';
 import { Paginator } from 'primereact/paginator';
@@ -18,10 +18,18 @@ import { MultiSelect } from 'primereact/multiselect';
 import { RadioButton } from 'primereact/radiobutton';
 import { useExportData } from "react-table-plugins";
 import { ProgressBar } from 'primereact/progressbar';
-//import UIConstants from '../utils/ui.constants';
+
+import "flatpickr/dist/flatpickr.css";
+import Flatpickr from "react-flatpickr";
+import confirmDatePlugin from "flatpickr/dist/plugins/confirmDate/confirmDate";
+import shortcutButtonsPlugin from "shortcut-buttons-flatpickr";
+
+import UtilService from '../../src/services/util.service'
 import Papa from "papaparse";
 import JsPDF from "jspdf";
 import "jspdf-autotable";
+import TableUtil from "../utils/table.util";
+import Validator from  "../utils/validator"
 
 let doServersideFilter = false;
 let tbldata = [], filteredData = [];
@@ -36,16 +44,19 @@ let allowRowSelection = false;
 let columnclassname = [];
 let parentCallbackFunction, parentCBonSelection;
 let showCSV = false;
-let anyOfFilter = '';
+let multiSelectOption = {};
 let filterCallback = null;
 let tableOptionsState = null;
+let tableToolTipsState = {};
 let setLoaderFunction = null;
 let showFilterOption = null;
 let hasFilters = false;
 let loadingStatus = false;
 let tmpTableData = null;
 let currentTableName = null;
-
+let storeFilter = false;
+let storage_array = [];
+//let confirmDatePlugin = new confirmDatePlugin();
 // Define a default UI for filtering
 function GlobalFilter({
   preGlobalFilteredRows,
@@ -75,10 +86,20 @@ function DefaultColumnFilter({
   const [filtered, setFiltered] = useState(false);
   React.useEffect(() => {
     if (!filterValue && value) {
-      setValue('');
+      setValue('');     
     }
-  }, [filterValue, value]);
-
+    if (storeFilter) {
+      const filterValue = TableUtil.getFilter(currentTableName, Header);
+      if (filterValue) {
+          setFiltered(true);
+      }
+      if(!value){
+          setValue(filterValue);
+          setFilter(filterValue);
+      }
+    }
+  }, [filterValue, value]); 
+  
   // Function to call the server side filtering
   const callServerFilter = (event, isCleared) => {
       hasFilters = true;
@@ -91,16 +112,19 @@ function DefaultColumnFilter({
       }   else {
           filterCallback(tableOptionsState, setLoaderFunction);
       }
-  };
-
+  }; 
   return (
     <>
         <div className="table-filter" onClick={e => { e.stopPropagation() }} style={{marginRight: '5px'}}>
-            <input title="Enter the exact value to be searched and press 'Enter' key"
+            <input 
+              title={(tableToolTipsState[Header])?tableToolTipsState[Header]:"Enter few characters and press ‘Enter’ key to search"}
               value={value}   //***TO REMOVE - INCOMING CHANGE WAS value={filterValue || ''}
               onChange={e => {
                 setValue(e.target.value);
                 setFilter(e.target.value || undefined) // Set undefined to remove the filter entirely
+                if(storeFilter) {
+                  TableUtil.saveFilter(currentTableName, Header, e.target.value);
+                }
               }}
               onKeyUp={(e) => {
                 if (e.key === "Enter" && doServersideFilter) {
@@ -119,6 +143,9 @@ function DefaultColumnFilter({
                     setValue('');
                     callServerFilter(e, true);
                   }
+                  if(storeFilter){
+                    TableUtil.saveFilter(currentTableName, Header, '');
+                  }
                 }} />
             }
         </div>
@@ -127,6 +154,32 @@ function DefaultColumnFilter({
   )
 }
 
+const setStoreData = (id, value) => { 
+  debugger
+  let localstorage_key = window.location.pathname.split('/')[1];
+  let storage =  UtilService.localStore({ type: 'get', key: localstorage_key }); 
+  if(storage && storage.length > 0) {
+              storage.forEach(function(value, index) {
+                if(value.name === id) {
+                  value.name =  id
+                  value.value = value
+                }
+              });
+              const selected = _.filter(storage, function (filter) {
+                if ( filter.name === id) {
+                  return true;
+                }
+              })
+              if(selected.length <= 0) {
+                storage.push({name: id, value: value})
+              }
+            } else {
+              storage = [{name: id, value: value}]
+            }
+            UtilService.localStore({ type: 'set', key: localstorage_key, value: storage });
+}
+
+
 /* 
 Generate and download csv 
 */
@@ -174,7 +227,13 @@ function SelectColumnFilter({
     if (!filterValue && value) {
       setValue('');
     }
+    if (storeFilter) {
+      const filterValue = TableUtil.getFilter(currentTableName, Header);
+      setValue(filterValue);
+      setFilter(filterValue);
+    }
   }, [filterValue, value]);
+
   const options = React.useMemo(() => {
     let options = null;
     if (showFilterOption) {
@@ -199,9 +258,9 @@ function SelectColumnFilter({
     _.remove(tableOptionsState.filters, function(filter) { return filter.id === Header });
     if (isCleared) {
         hasFilters = false;
-        if (filtered) {
+        //if (filtered) {
             filterCallback(tableOptionsState, setLoaderFunction);
-        }
+        //}
     }   else {
         tableOptionsState.filters.push({id: Header, value: event.target.value});
         filterCallback(tableOptionsState, setLoaderFunction);
@@ -212,6 +271,7 @@ function SelectColumnFilter({
   return (
     <div onClick={e => { e.stopPropagation() }}>
       <select
+        title={(tableToolTipsState[Header])?tableToolTipsState[Header]:"Select a value from list to search"}
         className= {columnclassname[0][Header]}
         style={{
           height: '24.2014px',
@@ -233,6 +293,9 @@ function SelectColumnFilter({
               callServerFilter(e, false);
             }
           }
+          if(storeFilter) {
+            TableUtil.saveFilter(currentTableName, Header, e.target.value);
+          }
         }}
       >
         <option value="">All</option>
@@ -248,15 +311,18 @@ function SelectColumnFilter({
 
 // Multi-Select Custom Filter and set unique options value
 function MultiSelectColumnFilter({
-  column: { filterValue, setFilter, preFilteredRows, id },
+  column: { filterValue, setFilter, preFilteredRows, id, Header },
 }) {
   const [value, setValue] = useState('');
   const [filtertype, setFiltertype] = useState('Any');
   // Set Any / All Filter type
   const setSelectTypeOption = (option) => {
     setFiltertype(option);
-    anyOfFilter = option
+    multiSelectOption[Header] = option
     if (value !== '') {
+      if (storeFilter) {
+        TableUtil.saveFilter(currentTableName, `${Header}-FilterOption`, option);
+      }
       setFilter(value);
     }
   };
@@ -266,10 +332,24 @@ function MultiSelectColumnFilter({
       setValue('');
       setFiltertype('Any');
     }
+    if (storeFilter) {
+      const filterValue = TableUtil.getFilter(currentTableName, Header);
+      const filterType = TableUtil.getFilter(currentTableName, `${Header}-FilterOption`);
+      if(filterValue && !value){
+        setValue(filterValue);
+        setFilter(filterValue);
+        setFiltertype(filterType);
+        multiSelectOption[Header] = filterType;
+      }
+    }
   }, [filterValue, value, filtertype]);
-  anyOfFilter = filtertype;
+
+  multiSelectOption[Header] = filtertype;
   const options = React.useMemo(() => {
     let options = new Set();
+    if (showFilterOption) {
+      return showFilterOption(id);
+    } 
     preFilteredRows.forEach(row => {
       row.values[id].split(',').forEach(value => {
         if (value !== '') {
@@ -306,9 +386,97 @@ function MultiSelectColumnFilter({
           options={options}
           onChange={e => {
             setValue(e.target.value);
-            setFilter(e.target.value || undefined, filtertype)
+            setFilter(e.target.value || undefined);
+            setFiltertype(filtertype);
+            if(storeFilter) {
+              if (e.target.value.length > 0) {
+                TableUtil.saveFilter(currentTableName, Header, e.target.value);
+                TableUtil.saveFilter(currentTableName, `${Header}-FilterOption`, filtertype);
+              } else {
+                TableUtil.clearColumnFilter(currentTableName, Header);
+                TableUtil.clearColumnFilter(currentTableName, `${Header}-FilterOption`);
+              }
+            }
+          }}
+          maxSelectedLabels="1"
+          selectedItemsLabel="{0} Selected"
+          className="multi-select"
+          tooltip={(tableToolTipsState[Header])?tableToolTipsState[Header]:"Select one or more value from list to search"}
+        />
+      </div>
+    </div>
+  )
+}
+
+// Multi-Select Custom Filter and set unique options value
+function MultiSelectFilter({
+  column: { filterValue, setFilter, preFilteredRows, id, Header },
+}) {
+  const [value, setValue] = useState('');
+  const [filtertype, setFiltertype] = useState('Any');
+  
+  React.useEffect(() => {
+    if (!filterValue && value) {
+      setValue('');
+      setFiltertype('Any');
+    }
+    if (storeFilter) {
+      const filterValue = TableUtil.getFilter(currentTableName, Header);
+      if(filterValue && !value){
+        setValue(filterValue);
+        setFilter(filterValue);
+        setFiltertype(filtertype);
+      }
+    }
+  }, [filterValue, value, filtertype]);
+
+  multiSelectOption[Header] = filtertype;
+  const options = React.useMemo(() => {
+    let options = new Set();
+    if (showFilterOption) {
+      return showFilterOption(id);
+    } 
+    preFilteredRows.forEach(row => {
+      row.values[id].split(',').forEach(value => {
+        if (value !== '') {
+          let hasValue = false;
+          options.forEach(option => {
+            if (option.name === value) {
+              hasValue = true;
+            }
+          });
+          if (!hasValue) {
+            let option = { 'name': value, 'value': value };
+            options.add(option);
+          }
+        }
+      });
+    });
+    return [...options.values()]
+  }, [id, preFilteredRows]);
+
+  // Render a multi-select box
+  return (
+    <div onClick={e => { e.stopPropagation() }} >
+      <div style={{ position: 'relative' }} >
+        <MultiSelect data-testid="multi-select" id="multi-select-1" optionLabel="value" optionValue="value" filter={true}
+          value={value}
+          options={options}
+          onChange={e => {
+            setValue(e.target.value);
+            setFilter(e.target.value || undefined);
+            if(storeFilter) {
+              if (e.target.value.length > 0) {
+                TableUtil.saveFilter(currentTableName, Header, e.target.value);
+              } else {
+                TableUtil.clearColumnFilter(currentTableName, Header);
+              }
+            }
           }}
+          maxSelectedLabels="1"
+          selectedItemsLabel="{0} Selected"
           className="multi-select"
+          tooltip={(tableToolTipsState[Header])?tableToolTipsState[Header]:"Select one or more value from list to search"}
         />
       </div>
     </div>
@@ -319,7 +487,7 @@ function MultiSelectColumnFilter({
 // slider to set the filter value between a column's
 // min and max values
 function SliderColumnFilter({
-  column: { filterValue, setFilter, preFilteredRows, id },
+  column: { filterValue, setFilter, preFilteredRows, id, Header },
 }) {
   // Calculate the min and max
   // using the preFilteredRows
@@ -334,9 +502,27 @@ function SliderColumnFilter({
     return [min, max]
   }, [id, preFilteredRows])*/
 
+  React.useEffect(() => {
+    if (storeFilter) {
+      const filterValue = TableUtil.getFilter(currentTableName, Header);
+      if (filterValue && !value) {
+        setValue(filterValue);
+        setFilter(filterValue);
+      }
+    }
+  });
+
   return (
     <div onClick={e => { e.stopPropagation() }} className="table-slider">
-      <Slider value={value} onChange={(e) => { setFilter(e.value); setValue(e.value) }} />
+      <Slider value={value} 
+        onChange={(e) => { 
+          setFilter(e.value); setValue(e.value);
+          if (storeFilter) {
+            TableUtil.saveFilter(currentTableName, Header, e.value);
+          }
+        }}
+        tooltip={(tableToolTipsState[Header])?tableToolTipsState[Header]:"Select range value to search"}
+      />
     </div>
   )
 }
@@ -354,6 +540,13 @@ function BooleanColumnFilter({
     if (!filterValue && value) {
       setValue(null);
     }
+    if (storeFilter) {
+      const filterValue = TableUtil.getFilter(currentTableName, Header);
+      if(filterValue && !value){
+        setValue(filterValue);
+        setFilter(filterValue);
+      }
+    }
   }, [filterValue, value]);
   // Function to call the server side filtering
   const callServerFilter = (isCleared) => {
@@ -377,18 +570,282 @@ function BooleanColumnFilter({
   return (
     <div onClick={e => { e.stopPropagation() }}>
       <TriStateCheckbox value={value} style={{ 'width': '15px', 'height': '24.2014px' }} on
-      onChange={(e) => { 
-        setValue(e.target.value);
-        setFilter(e.target.value || undefined); 
-        setFiltered(true);
+        onChange={(e) => { 
+          setValue(e.target.value);
+          setFilter(e.target.value || undefined); 
+          setFiltered(true);
+          if (storeFilter) {
+            TableUtil.saveFilter(currentTableName, Header, e.target.value);
+          }
+          if (doServersideFilter) {
+            callServerFilter(e.value);
+          }
+        }}
+        tooltip={(tableToolTipsState[Header])?tableToolTipsState[Header]:"Select checkbox (True/False/None) to search"}
+       />
+    </div>
+  )
+}
+
+// This is a custom filter UI that uses a
+// calendar to set the valueCalendar
+function ColumnFilter({
+  column: { setFilter, filterValue, Header },
+}) {
+  // Calculate the min and max
+  // using the preFilteredRows
+  const [value, setValue] = useState('');
+  const [filtered, setFiltered] = useState(false);
+  React.useEffect(() => {
+    if (!filterValue && value) {
+      setValue(null);
+    }
+  }, [filterValue, value]);
+
+  React.useEffect(() => {
+    // let localstorage_key = window.location.pathname.split('/')[1];
+    // let storage =  UtilService.localStore({ type: 'get', key: localstorage_key }); 
+    // let storageStatus =_.filter(storage, function (filter) {
+    // if ( filter.name === Header && storeFilter) {
+    //   setValue(filter.value);
+    //   setFilter(filter.value);
+    //   setFiltered(true);
+    //     return true;
+    //   }
+    // })
+  }, []);
+
+  // Function to call the server side filtering
+  const callServerFilter = (event, isCleared) => {
+    hasFilters = true;
+    if (isCleared) {
+        hasFilters = false;
+        if (filtered) {
+            _.remove(tableOptionsState.filters, function(filter) { return filter.id === Header });
+            filterCallback(tableOptionsState, setLoaderFunction);
+        }
+    }   else {
+        filterCallback(tableOptionsState, setLoaderFunction);
+    }
+};
+  return (
+
+    <div className="table-filter" onClick={e => { e.stopPropagation() }}>
+      <Calendar value={filterValue} appendTo={document.body} dateFormat="yy-mm-dd" 
+      onChange={(e) => {
+        const value = moment(e.value).format('YYYY-MM-DD')
+        setValue(value);
+        setFilter(e.value);
+        if (value !== 'Invalid date'  && doServersideFilter) {
+          setFiltered(true);
+          callServerFilter(e);
+        }
+        // if(storeFilter) {
+        //   let localstorage_key = window.location.pathname.split('/')[1];
+        //   let storage =  UtilService.localStore({ type: 'get', key: localstorage_key }); 
+        //   if(storage && storage.length > 0) {
+        //     storage.forEach(function(value, index) {
+        //       if(value.name === Header) {
+        //         value.name =  Header
+        //         value.value = moment(e.value).format('YYYY-MM-DD')
+        //       }
+        //     });
+        //     const selected = _.filter(storage, function (filter) {
+        //       if ( filter.name === Header) {
+        //         return true;
+        //       }
+        //     })
+        //     if(selected.length <= 0) {
+        //       storage.push({name: Header, value: moment(e.value).format('YYYY-MM-DD')})
+        //     }
+        //   } else {
+        //     storage = [{name: Header, value: value}]
+        //   }
+        //   UtilService.localStore({ type: 'set', key: localstorage_key, value: storage });
+        //   }
+      }} 
+      showIcon></Calendar>
+      {value && <i onClick={(e) => { setFilter(undefined); setValue(''); setFiltered(false);
         if (doServersideFilter) {
-          callServerFilter(e.value);
+          setFilter(undefined); 
+          setValue('');
+          callServerFilter(e, true);
+        } }} className="tb-cal-reset fa fa-times" />}
+    </div>
+  )
+}
+
+// This is a custom filter UI that uses a
+// calendar range to set the value
+function DateRangeColumnFilter({
+  column: { setFilter, filterValue, Header },
+}) {
+  // Calculate the min and max
+  // using the preFilteredRows
+  const [value, setValue] = useState('');
+  const [filtered, setFiltered] = useState(false);
+  React.useEffect(() => {
+    if (!filterValue && value) {
+      setValue(null);
+    }
+    
+    if (storeFilter) {
+      const filter = TableUtil.getFilter(currentTableName, Header);
+      const filterValue = _.map(filter, date => {return new Date(date)} )
+      if (filterValue[1] &&  !value ){
+        setValue(filterValue);
+        setFilter(filterValue);
+      }
+    }
+  }, [filterValue, value]);
+  // Function to call the server side filtering
+  const callServerFilter = (value, isCleared) => {
+    hasFilters = true;
+    if (isCleared) {
+        hasFilters = false;
+        if (filtered) {
+            _.remove(tableOptionsState.filters, function(filter) { return filter.id === Header });
+            filterCallback(tableOptionsState, setLoaderFunction);
+        }
+    }   else {
+      let filterColumn = _.find(tableOptionsState.filters, {id: Header });
+      if(filterColumn) {
+        filterColumn.value = value;
+        filterCallback(tableOptionsState, setLoaderFunction);
+      } else {
+        filterCallback(tableOptionsState, setLoaderFunction);
+      }
+    }
+};
+  return (
+    <div className="table-filter" onClick={e => { e.stopPropagation() }}>
+      <Calendar selectionMode="range" value={filterValue} appendTo={document.body}
+        placeholder="Range"
+        onChange={(e) => {  
+          setValue(e.value);
+          setFilter(e.value);
+          if(storeFilter) {
+            TableUtil.saveFilter(currentTableName, Header, e.target.value);
+          }
+          if ((value !== '' && value !== 'Invalid date' ) && doServersideFilter) {
+            setFiltered(true);
+            callServerFilter(e.target.value);
+          }
+        }} 
+        showIcon></Calendar>
+      {value && <i onClick={(e) => { 
+        setFilter(undefined); setValue([]); setFiltered(false);
+        if(storeFilter){
+          TableUtil.saveFilter(currentTableName, Header, []  );
         }
-      }} />
+        if (doServersideFilter) {
+          setFilter(undefined); 
+          setValue('');
+          callServerFilter(e.target.value, true);
+        } }} className="tb-cal-reset fa fa-times" />}
     </div>
   )
 }
 
+// This is a custom filter UI that uses a
+// flatpickr range calendar to set the value
+function FlatpickrRangeColumnFilter({
+  column: { setFilter, filterValue, Header },
+}) {
+    const [value, setValue] = useState('');
+    const [filtered, setFiltered] = useState(false);  
+    React.useEffect(() => {
+        if (!filterValue && value) {
+        setValue(null);
+    }
+    if (storeFilter) {
+        const filter = TableUtil.getFilter(currentTableName, Header);
+        const filterValue = _.map(filter, date => {return new Date(date)} )
+        if (filter === '') {
+          TableUtil.saveFilter(currentTableName, Header, []  );
+          setFilter(undefined); 
+        }
+        if (filterValue[1] &&  !value ){
+            setValue(filterValue);
+            setFilter(filterValue);
+        }
+    }
+  }, [filterValue, value]);
+  // Function to call the server side filtering
+  const callServerFilter = (value, isCleared) => {
+      hasFilters = true;
+      if (isCleared) {
+          hasFilters = false;
+          _.remove(tableOptionsState.filters, function(filter) { return filter.id === Header });
+          filterCallback(tableOptionsState, setLoaderFunction);
+      }   else {
+          let filterColumn = _.find(tableOptionsState.filters, {id: Header });
+          if(filterColumn) {
+              filterColumn.value = value;
+              filterCallback(tableOptionsState, setLoaderFunction);
+          } else if (!filterColumn && value && value.length === 2) {
+              // Here the above condition placed because the Start/End time filters is not consistency in tableOptionsState.filters
+              filterColumn = {id: Header, value: value}
+              tableOptionsState.filters.push(filterColumn);
+              filterCallback(tableOptionsState, setLoaderFunction);
+          } else {
+              filterCallback(tableOptionsState, setLoaderFunction);
+          }
+    }
+  };
+  return (
+      <div className="table-filter" onClick={e => { e.stopPropagation() }}>
+          <Flatpickr data-enable-time data-input 
+            options={{  "inlineHideInput": true,
+                        "wrap": true,
+                        "enableSeconds": true,
+                        "time_24hr": true,
+                        "minuteIncrement": 1,
+                        "allowInput": true,
+                        "mode": "range",
+                        "defaultHour": 0,
+                        "plugins": [new confirmDatePlugin()]
+                    }}
+            title={(tableToolTipsState[Header])?tableToolTipsState[Header]:"Enter the date & time range to search and press ‘Ok’ button"}
+            value={filterValue}
+            onClose={value => {
+              if(value.length === 2) {
+                  setValue(value);
+                  setFilter(value);
+                  if(storeFilter) {
+                    TableUtil.saveFilter(currentTableName, Header, value);
+                  }
+                  if ((value !== '' && value !== 'Invalid date' ) && doServersideFilter) {
+                    setFiltered(true);
+                    callServerFilter(value);
+                  }
+              }
+            }}
+          >
+              <input type="text" data-input className={`p-inputtext p-component calendar-input`}  />
+              <button class="p-button p-component p-button-icon-only calendar-button" data-toggle
+                      title="Click to select the date range" >
+                      <i class="fas fa-calendar"></i>
+              </button>
+              <button class="p-button p-component p-button-icon-only calendar-reset" 
+                onClick={(value) => { 
+                  setFilter(undefined); setValue([]); setFiltered(false);filterValue = [];
+                  if(storeFilter){
+                      TableUtil.saveFilter(currentTableName, Header, []  );
+                  }
+                  if (doServersideFilter) {
+                      setFilter(undefined); 
+                      setValue('');
+                      callServerFilter(value, true);
+                  }
+              }} title="Clear date range" >
+                  <i class="fa fa-times" style={{color:'white', marginTop:'-2.85px'}} ></i>
+              </button>
+          </Flatpickr>
+      </div>
+  )
+}
+
 // This is a custom filter UI that uses a
 // calendar to set the value
 function CalendarColumnFilter({
@@ -402,7 +859,17 @@ function CalendarColumnFilter({
     if (!filterValue && value) {
       setValue(null);
     }
+    if (storeFilter) {
+      const filterValue = TableUtil.getFilter(currentTableName, Header);
+      if(filterValue && !value){
+        const valueAsDate = new Date(filterValue)
+        setValue(valueAsDate);
+        setFilter(valueAsDate);
+      }
+    }
+    
   }, [filterValue, value]);
+
   // Function to call the server side filtering
   const callServerFilter = (event, isCleared) => {
     hasFilters = true;
@@ -428,9 +895,21 @@ function CalendarColumnFilter({
           setFiltered(true);
           callServerFilter(e);
         }
+
+          if(storeFilter) {
+            TableUtil.saveFilter(currentTableName, Header, value);
+          }
       }} 
+      onClearButtonClick={(e) => {
+        if(storeFilter) {
+          TableUtil.clearColumnFilter(currentTableName, Header);
+        }
+      }}
       showIcon></Calendar>
       {value && <i onClick={(e) => { setFilter(undefined); setValue(''); setFiltered(false);
+        if (storeFilter) {
+          TableUtil.clearColumnFilter(currentTableName, Header);
+        }
         if (doServersideFilter) {
           setFilter(undefined); 
           setValue('');
@@ -450,9 +929,17 @@ function DateTimeColumnFilter({
     if (!filterValue && value) {
       setValue(null);
     }
+    if (storeFilter) {
+      const getValue = TableUtil.getFilter(currentTableName, Header);
+      if (getValue && !value) {
+        const valueAsDate = new Date(getValue)
+        setValue(valueAsDate);
+        setFilter(valueAsDate);
+      }
+    }
   }, [filterValue, value]);
-
-   // Function to call the server side filtering
+  
+  // Function to call the server side filtering
   const callServerFilter = (event, isCleared) => {
       hasFilters = true;
       _.remove(tableOptionsState.filters, function(filter) { return filter.id === Header });
@@ -465,7 +952,6 @@ function DateTimeColumnFilter({
       }
   };
   return (
-
     <div className="table-filter" onClick={e => { e.stopPropagation() }}>
       <Calendar value={value} appendTo={document.body} dateFormat="yy/mm/dd"
        onKeyUp={(e) => {
@@ -479,6 +965,10 @@ function DateTimeColumnFilter({
         if (value !== 'Invalid date'  && doServersideFilter) {
           callServerFilter(e);
         }
+        
+        if(storeFilter) {
+          TableUtil.saveFilter(currentTableName, Header, value);
+        }
       }} 
       showIcon
       // showTime= {true}
@@ -492,6 +982,9 @@ function DateTimeColumnFilter({
           setValue('');
           callServerFilter(e, true);
         }
+        if (storeFilter) {
+          TableUtil.clearColumnFilter(currentTableName, Header);
+        }
      }} className="tb-cal-reset fa fa-times" />}
     </div>
   )
@@ -540,21 +1033,13 @@ function multiSelectFilterFn(rows, id, filterValue) {
       }
       let rowValue = row.values[id];
       let hasData = false;
-      if (anyOfFilter === 'Any') {
-        hasData = false;
-        filterValue.forEach(filter => {
-          if (rowValue.includes(filter)) {
-            hasData = true;
-          }
-        });
+      let columnValues = rowValue.split(',');
+      let unfilteredColValues = _.difference(filterValue, columnValues);
+      if (multiSelectOption[id] === 'Any') {
+          hasData = unfilteredColValues.length < filterValue.length;
       }
       else {
-        hasData = true;
-        filterValue.forEach(filter => {
-          if (!rowValue.includes(filter)) {
-            hasData = false;
-          }
-        });
+          hasData = unfilteredColValues.length === 0;
       }
       return hasData;
     });
@@ -612,11 +1097,38 @@ function dateFilterFn(rows, id, filterValue) {
   return filteredRows;
 }
 
+/**
+ * Custom function to filter data Range from date field.
+ * @param {Array} rows 
+ * @param {String} id 
+ * @param {String} filterValue 
+ */
+ function dateRangeFilterFn(rows, id, filterValue) {
+  const filteredRows = _.filter(rows, function (row) {
+    // If cell value is null or empty
+    if (!row.values[id]) {
+      return false;
+    }
+    //Remove microsecond if value passed is UTC string in format "YYYY-MM-DDTHH:mm:ss.sssss"
+    let rowValue = moment.utc(row.values[id].split('.')[0]);
+    if (!rowValue.isValid()) {
+      // For cell data in format 'YYYY-MMM-DD'
+      rowValue = moment.utc(moment(row.values[id], 'YYYY-MM-DD').format("YYYY-MM-DDT00:00:00"));
+    }
+    const start = moment.utc(moment(filterValue[0], 'YYYY-MM-DD').format("YYYY-MM-DDT00:00:00"));
+    const end = moment.utc(moment(filterValue[1], 'YYYY-MM-DD').format("YYYY-MM-DDT23:59:59"));
+    return (start.isSameOrBefore(rowValue) && end.isSameOrAfter(rowValue));
+  });
+  return filteredRows;
+}
+
 // This is a custom UI for our 'between' or number range
 // filter. It uses slider to filter between min and max values.
 function RangeColumnFilter({
-  column: { filterValue = [], preFilteredRows, setFilter, id },
+  column: { filterValue = [], preFilteredRows, setFilter, id, Header },
 }) {
+  let [value, setValue] = useState('');
+  let [firstLoad, setFirstLoad] = useState(true);
   const [min, max] = React.useMemo(() => {
     let min = 0;
     let max = 0;
@@ -627,12 +1139,19 @@ function RangeColumnFilter({
       min = Math.min(row.values[id] ? row.values[id] : 0, min);
       max = Math.max(row.values[id] ? row.values[id] : 0, max);
     });
+    if (storeFilter && firstLoad) {
+      let storedFilter = TableUtil.getFilter(currentTableName, Header);
+      if (storedFilter) {
+        setValue(storedFilter);
+        setFilter(storedFilter);
+        setFirstLoad(false);
+      }
+    }
     return [min, max];
   }, [id, preFilteredRows]);
   if (filterValue.length === 0) {
     filterValue = [min, max];
   }
-
   return (
     <>
       <div className="filter-slider-label">
@@ -641,16 +1160,370 @@ function RangeColumnFilter({
       </div>
       <Slider value={filterValue} min={min} max={max} className="filter-slider"
         style={{}}
-        onChange={(e) => { setFilter(e.value); }} range />
+        onChange={(e) => { 
+          setValue(e.value);
+          setFilter(e.value); 
+            if(storeFilter) {
+              TableUtil.saveFilter(currentTableName, Header, e.value);
+            }
+          }} range />
     </>
   );
 }
 
+/**
+ * Number range rilter
+ * @param {number} param0 : Range value for min and max filters
+ * @returns 
+ */
+function NumberRangeFilter({
+  column: { filterValue = [], preFilteredRows, setFilter, id, Header },
+}) {
+  let [rangeValue, setRangeValue] = useState([0,0]);
+  const [value, setValue] = useState('');
+  const [filtered, setFiltered] = useState(false);
+  React.useEffect(() => {
+    if (!filterValue && value) {
+      setValue('');     
+    }
+    if (storeFilter) {
+      const filterValue = TableUtil.getFilter(currentTableName, Header);
+      if (filterValue) {
+          setFiltered(true);
+      }
+      if(!value){
+          setValue(filterValue);
+          //setFilter(filterValue);
+      }
+    }
+  }, [filterValue, value]);
+  
+   // Function to call the server side filtering
+   const callServerFilter = (event, isCleared) => {
+    hasFilters = true;
+    _.remove(tableOptionsState.filters, function(filter) { return filter.id === Header });
+    if (isCleared) {
+        hasFilters = false;
+        if (filtered) {
+            filterCallback(tableOptionsState, setLoaderFunction);
+        }
+    }   else {
+        tableOptionsState.filters.push({id: Header, value: rangeValue});
+        filterCallback(tableOptionsState, setLoaderFunction);
+    }
+  };
+
+  return (
+    <div
+      style={{
+        alignItems: 'center'
+      }}
+    >
+      <InputText
+        value={value[0]}
+        type="number"
+        tooltip="Enter the minimum value to search"
+        onKeyUp={(e) => {
+          if (e.key === "Enter" && doServersideFilter) {
+            TableUtil.saveFilter(currentTableName, Header, rangeValue);
+            setFiltered(true);
+            callServerFilter(e, false);
+          }
+        }}
+        onChange={e => {
+          setFilter(undefined);  setFiltered(false);
+          const val = e.target.value;
+          let max = rangeValue[1];
+          setValue([val,max]);
+          setFilter([val,max] || undefined);
+          setRangeValue([val,max]);
+          filterValue[0] = val;
+          if(storeFilter) {
+            TableUtil.saveFilter(currentTableName, Header, [val,max]);
+            setFilter([val,max]);
+          }
+        }}
+        style={{
+          width: '65px',
+          height: '25px'
+          // marginRight: '0.5rem',
+        }}
+        tooltip={(tableToolTipsState[Header])?tableToolTipsState[Header]:"Enter Minimum Range value and press ‘Enter’ key to search"}
+      />
+      
+      <InputText
+        value={value[1]}
+        type="number"
+        tooltip="Enter the maximum value to search"
+        onKeyUp={(e) => {
+          if (e.key === "Enter" && doServersideFilter) {
+            setFiltered(true);
+            callServerFilter(e, false);
+          }
+        }}
+        onChange={e => {
+          const val = e.target.value;
+          let min = rangeValue[0];
+          setRangeValue([min,val]);
+          filterValue[1] = val;
+          setValue([min,val]);
+          setFilter([min,val] || undefined);
+          if(storeFilter) {
+            TableUtil.saveFilter(currentTableName, Header, [min,val]);
+            setFilter([min,val]);
+          }
+        }}
+         
+        style={{
+          width: '65px',
+          height: '25px'
+        }}
+        tooltip={(tableToolTipsState[Header])?tableToolTipsState[Header]:"Enter Maximum Range value and press ‘Enter’ key to search"}
+      />
+    </div>
+  )
+}
+
+// Priority Rank Range Filter
+function RankRangeFilter({
+  column: { filterValue = [], preFilteredRows, setFilter, id, Header },
+}) {
+  let [rangeValue, setRangeValue] = useState([]);
+  const [value, setValue] = useState('');
+  const [filtered, setFiltered] = useState(false);
+  React.useEffect(() => {
+    if (!filterValue && value) {
+      setValue('');     
+      //setRangeValue([])
+    }
+    if (storeFilter) {
+      const filterValue = TableUtil.getFilter(currentTableName, Header);
+      if (filterValue) {
+          setFiltered(true);
+      }
+      if(!value){
+          setValue(filterValue);
+          //setFilter(filterValue);
+      }
+    }
+  }, [filterValue, value]);
+  
+   // Function to call the server side filtering
+   const callServerFilter = (event, isCleared) => {
+    hasFilters = true;
+    _.remove(tableOptionsState.filters, function(filter) { return filter.id === Header });
+    if (isCleared) {
+        hasFilters = false;
+        if (filtered) {
+            filterCallback(tableOptionsState, setLoaderFunction);
+        }
+    }   else {
+        tableOptionsState.filters.push({id: Header, value: rangeValue});
+        filterCallback(tableOptionsState, setLoaderFunction);
+    }
+  };
+
+  return (
+    <div
+      style={{
+        alignItems: 'center'
+      }}
+    >
+      <input type="decimal"
+          title={(tableToolTipsState[Header])?tableToolTipsState[Header]:"Enter Minimum Range value and press ‘Enter’ key to search"}
+          max="1"
+          min="0"
+          className="p-inputtext p-component"
+          value={value[0]}
+          step="0.0001"
+          onKeyUp={(e) => {
+              if (e.key === "Enter" && doServersideFilter) {
+                  TableUtil.saveFilter(currentTableName, Header, rangeValue);
+                  setFiltered(true);
+                  callServerFilter(e, false);
+              }
+          }}
+          onChange={e => {
+              setFilter(undefined);  setFiltered(false);
+              let val = e.target.value;
+              val = val.replace(/([^0-9.]+)/, "");
+              const match = /(\d{0,1})[^.]*((?:\.\d{0,4})?)/g.exec(val);
+              val = match[1] + match[2];
+              if (val == '' || (val >= 0 && val <= 1)) {
+                  let max = rangeValue[1];
+                  setValue([val,max]);
+                  setFilter([val,max] || undefined);
+                  setRangeValue([val,max]);
+                  filterValue[0] = val;
+                  if(storeFilter) {
+                      //TableUtil.saveFilter(currentTableName, Header, [val,max]);
+                      setFilter([val,max]);
+                  }
+            }   else {
+                e.target.value = rangeValue[0];
+            }
+          }}
+          style={{
+            width: '75px',
+            height: '25px'
+          }}
+      />
+       
+      <input type="decimal"
+          title={(tableToolTipsState[Header])?tableToolTipsState[Header]:"Enter Maximum Range value and press ‘Enter’ key to search"}
+          max="1"
+          min="0"
+          className="p-inputtext p-component"
+          value={value[1]}
+          step="0.0001"
+          onKeyUp={(e) => {
+              if (e.key === "Enter" && doServersideFilter) {
+                  TableUtil.saveFilter(currentTableName, Header, rangeValue);
+                  setFiltered(true);
+                  callServerFilter(e, false);
+              }
+          }}
+          onChange={e => {
+              setFilter(undefined);  setFiltered(false);
+              let val = e.target.value;
+              val = val.replace(/([^0-9.]+)/, "");
+              const match = /(\d{0,1})[^.]*((?:\.\d{0,4})?)/g.exec(val);
+              val = match[1] + match[2];
+              if (val == '' || (val >= 0 && val <= 1)) {
+                  let min = rangeValue[0];
+                  setRangeValue([min,val]);
+                  filterValue[1] = val;
+                  setValue([min,val]);
+                  setFilter([min,val] || undefined);
+                  if(storeFilter) {
+                    //TableUtil.saveFilter(currentTableName, Header, [min,val]);
+                    setFilter([min,val]);
+                  }  
+              }   else {
+                  e.target.value = rangeValue[0];
+              }
+          }}
+          style={{
+            width: '75px',
+            height: '25px'
+          }}
+      />
+    </div>
+  )
+}
+
+// Duration Range Filter
+function DurationRangeFilter({
+  column: { filterValue = [], preFilteredRows, setFilter, id, Header },
+}) {
+  let [rangeValue, setRangeValue] = useState([0,0]);
+  const [value, setValue] = useState('');
+  const [filtered, setFiltered] = useState(false);
+  React.useEffect(() => {
+    if (!filterValue && value) {
+      setValue('');     
+    }
+    if (storeFilter) {
+      const filterValue = TableUtil.getFilter(currentTableName, Header);
+      if (filterValue) {
+          setFiltered(true);
+      }
+      if(!value){
+          setValue(filterValue);
+          //setFilter(filterValue);
+      }
+    }
+  }, [filterValue, value]);
+  
+   // Function to call the server side filtering
+   const callServerFilter = (event, isCleared) => {
+    hasFilters = true;
+    _.remove(tableOptionsState.filters, function(filter) { return filter.id === Header });
+    if (isCleared) {
+        hasFilters = false;
+        if (filtered) {
+            filterCallback(tableOptionsState, setLoaderFunction);
+        }
+    }   else {
+        tableOptionsState.filters.push({id: Header, value: rangeValue});
+        filterCallback(tableOptionsState, setLoaderFunction);
+    }
+  };
+
+  return (
+    <div
+      onKeyPress={(e) => {
+        if (e.key === "Enter" && doServersideFilter) {
+          TableUtil.saveFilter(currentTableName, Header, rangeValue);
+          setFiltered(true);
+          callServerFilter(e, false);
+        }
+      }}
+      style={{
+        alignItems: 'center'
+      }}
+    >
+      <InputMask mask="99:99:99"
+          value={value[0]}
+          placeholder="HH:mm:ss"
+          tooltip={(tableToolTipsState[Header])?tableToolTipsState[Header]:"Enter Minimum Range value in HH:mm:ss format and press ‘Enter’ key to search"}
+          onChange={e => {
+            setFilter(undefined);  setFiltered(false);
+            let val = e.target.value;
+            if (val.includes(":") && !Validator.isValidHHmmss(val, true)) {
+              val = rangeValue[0];
+            }
+            let max = rangeValue[1];
+            setValue([val,max]);
+            setFilter([val,max] || undefined);
+            setRangeValue([val,max]);
+            filterValue[0] = val;
+            if(storeFilter) {
+                //TableUtil.saveFilter(currentTableName, Header, [val,max]);
+                setFilter([val,max]);
+            }
+          }}
+          style={{
+            width: '85px',
+            height: '25px'
+          }}
+      />
+    
+    <InputMask mask="99:99:99"
+          value={value[1]}
+          tooltip={(tableToolTipsState[Header])?tableToolTipsState[Header]:"Enter Maximum Range value in HH:mm:ss format and press ‘Enter’ key to search"}
+          placeholder="HH:mm:ss"
+          onChange={e => {
+            setFilter(undefined);  setFiltered(false);
+            let val = e.target.value;
+            if (val.includes(":") && !Validator.isValidHHmmss(val, true)) {
+              val = rangeValue[1];
+            }
+            let min = rangeValue[0];
+            setValue([min,val]);
+            setFilter([min,val] || undefined);
+            setRangeValue([min,val]);
+            filterValue[1] = val;
+            if(storeFilter) {
+                //TableUtil.saveFilter(currentTableName, Header, [min,val]);
+                setFilter([min,val]);
+            }
+          }}
+          style={{
+            width: '85px',
+            height: '25px'
+          }}
+    />
+    </div>
+     
+  )
+}
+
 // This is a custom UI for our 'between' or number range
 // filter. It uses two number boxes and filters rows to
 // ones that have values between the two
 function NumberRangeColumnFilter({
-  column: { filterValue = [], preFilteredRows, setFilter, id },
+  column: { filterValue = [], preFilteredRows, setFilter, id, Header },
 }) {
   const [errorProps, setErrorProps] = useState({});
   const [maxErr, setMaxErr] = useState(false);
@@ -685,6 +1558,7 @@ function NumberRangeColumnFilter({
           height: '25px'
           // marginRight: '0.5rem',
         }}
+        tooltip={(tableToolTipsState[Header])?tableToolTipsState[Header]:"Enter Minimum Range value and press ‘Enter’ key to search"}
       />
       <InputText
         value={filterValue[1] || ''}
@@ -712,6 +1586,7 @@ function NumberRangeColumnFilter({
           height: '25px'
           //  marginLeft: '0.5rem',
         }}
+        tooltip={(tableToolTipsState[Header])?tableToolTipsState[Header]:"Enter Maximum Range value and press ‘Enter’ key to search"}
       />
     </div>
   )
@@ -726,20 +1601,36 @@ const filterTypes = {
   'select': {
     fn: SelectColumnFilter,
   },
+  // This component has Any and All Radio buttons
   'multiselect': {
     fn: MultiSelectColumnFilter,
     type: multiSelectFilterFn
   },
+  // This component does not have Any and All Radio buttons
+  'multiselect-filter': {
+    fn: MultiSelectFilter,
+    type: multiSelectFilterFn
+  },
   'switch': {
     fn: BooleanColumnFilter
   },
   'slider': {
     fn: SliderColumnFilter
-  },
+  },  
+  
   'date': {
     fn: CalendarColumnFilter,
     type: dateFilterFn
   },
+  'dateRange': {
+    fn: DateRangeColumnFilter,
+    type: dateRangeFilterFn
+  },
+  'flatpickrDateRange': {
+    fn: FlatpickrRangeColumnFilter,
+    type: dateRangeFilterFn
+  },
+  
   'fromdatetime': {
     fn: DateTimeColumnFilter,
     type: fromDatetimeFilterFn
@@ -755,6 +1646,18 @@ const filterTypes = {
   'minMax': {
     fn: NumberRangeColumnFilter,
     type: 'between'
+  },
+  'numberRangeMinMax': {
+    fn: NumberRangeFilter,
+    type: 'between'
+  },
+  'rankMinMax': {
+    fn: RankRangeFilter,
+    type: 'between'
+  },
+  'durationMinMax': {
+    fn: DurationRangeFilter,
+    type: 'between'
   }
 };
 // Let the table remove the filter if the string is empty
@@ -908,7 +1811,7 @@ function Table(props) {
   if (currentTableName && currentTableName !== tablename) {
       state.sortBy = defaultSortColumn
   }
-  currentTableName = tablename;
+  currentTableName = props.tablename;
   tableOptionsState = _.cloneDeep(state);
   // Pass the table's state to the parent function if the parent function has set the callback function for it.
   if (props.setTableState) {
@@ -1001,7 +1904,8 @@ function Table(props) {
     if (e.target.id === '') {
       defaultVisible = e.target.checked;
     } 
-    allColumns.forEach(acolumn => {
+    // allColumns.forEach(acolumn => {
+    for (const acolumn of allColumns) {
       let jsonobj = {};
       let visible = (acolumn.Header === e.target.id) ? ((acolumn.isVisible) ? false : true) : e.target.id === '' ? defaultVisible : acolumn.isVisible;
       jsonobj['Header'] = acolumn.Header;
@@ -1012,7 +1916,16 @@ function Table(props) {
         sortedColumn['Header'] = acolumn.Header;
         sortedColumn['isVisible'] = visible;
       }
-    });
+      // Remove the column filters stored and clear the column filter, if the column is toogled to 
+      if (!visible) {
+          if (storeFilter) {
+              TableUtil.clearColumnFilter(currentTableName, acolumn.Header);
+          }
+          _.remove(tableOptionsState.filters, ['id', acolumn.Header]);
+          setAllFilters(tableOptionsState.filters);
+      }
+    }
+  // });
     localStorage.setItem(tablename, JSON.stringify(lsToggleColumns));
 
     if (onColumnToggleViewTable) {
@@ -1052,7 +1965,11 @@ function Table(props) {
     if (doServersideFilter) {
       filterCallback(tableOptionsState, setLoaderFunction);
     }
+    if (storeFilter) {
+        TableUtil.clearTableFilter(currentTableName);
+    }
   }
+  
   return (
     <>
       <div style={{display:'flex',justifyContent:'space-between',height:'35px'}}>
@@ -1246,6 +2163,7 @@ function ViewTable(props) {
   let defaultheader = props.defaultcolumns;
   let optionalheader = props.optionalcolumns;
   let defaultSortColumn = props.defaultSortColumn;
+  storeFilter = props.storeFilter? props.storeFilter : false
   let tablename = (props.tablename) ? props.tablename : window.location.pathname;
 
   if (!defaultSortColumn) {
@@ -1255,7 +2173,20 @@ function ViewTable(props) {
   let columns = [];
   let defaultdataheader = Object.keys(defaultheader[0]);
   let optionaldataheader = Object.keys(optionalheader[0]);
-    
+
+  // Get Tooltips for each column if provided and used in filter components
+  tableToolTipsState = {};
+  for(const headerId of defaultdataheader) {
+      if (defaultheader[0][headerId].tooltip) {
+          tableToolTipsState[defaultheader[0][headerId].name] = defaultheader[0][headerId].tooltip;
+      }
+   }
+  for(const headerId of optionaldataheader) {
+    if (optionalheader[0][headerId].tooltip) {
+        tableToolTipsState[optionalheader[0][headerId].name] = optionalheader[0][headerId].tooltip;
+    }
+  }
+
   /* If allowRowSelection property is true for the component, add checkbox column as 1st column.
      If the record has property to select, enable the checkbox */
   if (allowRowSelection) {
@@ -1394,14 +2325,22 @@ function ViewTable(props) {
   // const [loading, setLoading] = React.useState(false);
   const [currentPage, setCurrentPage] = React.useState(0);
   const fetchData = React.useCallback( ({ state, setLoading }) => {
-      loadServerData(state, setLoading);
+      loadServerData(state, setLoading, true);
   }, []);
   
-  const loadServerData = (state, setLoading) => {
+  const loadServerData = (state, setLoading, onload) => {
       //setLoading(true);
       loadingStatus = true;
       setCurrentPage(state.pageIndex);
       if(props.callBackFunction) {
+        if(storeFilter) {
+          if (onload) {
+            let filters = UtilService.localStore({ type: 'get', key: tablename });
+            UtilService.localStore({ type: 'set', key: tablename, value: filters});    
+          } else {
+            UtilService.localStore({ type: 'set', key: tablename, value: state.filters});    
+          }
+        }
           const promises = [props.callBackFunction(state)];
           Promise.all(promises).then(async responses => {
               tbldata = responses[0][0];
@@ -1446,7 +2385,7 @@ function ViewTable(props) {
       <Table fetchData={fetchData} pageCount={pageCount} currentPage={currentPage} dataFetchStatus={loadingStatus} columns={columns}
         data={data} defaultheader={defaultheader[0]} optionalheader={optionalheader[0]} showAction={props.showaction}
         defaultSortColumn={defaultSortColumn} tablename={tablename} defaultpagesize={defaultpagesize} columnOrders={props.columnOrders} 
-        toggleBySorting={(sortData) => props.toggleBySorting(sortData)} onColumnToggle={props.onColumnToggle} lsKeySortColumn={props.lsKeySortColumn}
+        toggleBySorting={(sortData) => {if(props.toggleBySorting){props.toggleBySorting(sortData)}}} onColumnToggle={props.onColumnToggle} lsKeySortColumn={props.lsKeySortColumn}
         descendingColumn={props.descendingColumn} ignoreSorting={props.ignoreSorting} setTableState={props.setTableState} />
     </div>
   )
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/layout/_overrides.scss b/SAS/TMSS/frontend/tmss_webapp/src/layout/_overrides.scss
index 192a08ec3dfcfd916615ab33b5ddf1c8233213bd..cab44def2fe830b39552340546375b3d59abb3bc 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/layout/_overrides.scss
+++ b/SAS/TMSS/frontend/tmss_webapp/src/layout/_overrides.scss
@@ -232,6 +232,9 @@ In Excel View the for Accordion  background color override
     align-items: center;
     display: flex !important;
 }
+.content_dlg .p-dialog-content {
+    align-items: start;
+}
 .p-grid {
     width: -webkit-fill-available;
 }
@@ -263,6 +266,9 @@ In Excel View the for Accordion  background color override
 .p-multiselect-panel {
     min-width: 15em !important;
 }
+.p-highlight label {
+    color: #ffffff !important;
+}
 .pi-search {
     right: -1.25em !important;
 }
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/layout/components/CustomDialog.js b/SAS/TMSS/frontend/tmss_webapp/src/layout/components/CustomDialog.js
index 2fd3c9c2c3be1cd013b31ecc8f371361c542b33e..36fdcb1febdf2569f4944e362bfb076c043ffa43 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/layout/components/CustomDialog.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/layout/components/CustomDialog.js
@@ -46,7 +46,7 @@ export class CustomDialog extends Component {
                                 })}
                                 </div>
                             } >
-                            <div className="p-grid">
+                            <div className="p-grid" style={{marginTop: '10px'}}>
                                 {showIcon &&
                                     <div className="col-lg-2 col-md-2 col-sm-2">
                                         <span style={{position: 'absolute', top: '50%', '-ms-transform': 'translateY(-50%)', transform: 'translateY(-50%)'}}>
@@ -57,10 +57,13 @@ export class CustomDialog extends Component {
                                 <div className= {(showIcon)? "col-lg-10 col-md-10 col-sm-10":"dialog-delete-msg"}>
                                     {/* Display message passed */}
                                     {this.props.message?this.props.message:""}
-                                    {/* Render subcomponent passed as function */}
-                                    {this.props.content?this.props.content():""}
+                                    
                                 </div>
                             </div>
+                            <div>
+                            {/* Render subcomponent passed as function */}
+                            {this.props.content?this.props.content():""}
+                            </div>
                     </Dialog>
                 </div>
         );
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_main.scss b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_main.scss
index 9c4b17db84c02f84691163de1075398385ef0230..e398654e2b1549cb2ba49e395eefc9aac26014ec 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_main.scss
+++ b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_main.scss
@@ -26,3 +26,12 @@ a {
     // min-height: 100vh;
 }
 
+.disabled-link {
+    color: lightgray;
+    pointer-events: none;
+}
+
+.disabled-link>i {
+    color: lightgray !important;
+}
+
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_report.scss b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_report.scss
index 34fd70c89c704649e53031de34068ab382a7742d..ac9ed42c071bbe40358cff2eb0ae364966d6d024 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_report.scss
+++ b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_report.scss
@@ -51,4 +51,23 @@
     float: right;
     margin-left: 5px;
     font-size: 20px;
+}
+
+.float-btn-right-bottom {
+    position: fixed;
+    right: 20px;
+    bottom: 10px;
+}
+
+.checkbox-label {
+    cursor: pointer;
+}
+
+.checkbox-label-disabled {
+    cursor: not-allowed;
+}
+
+.csv-options-dlg-content {
+    padding: 5px 10px 5px 10px;
+    border: 1px solid lightgrey;
 }
\ No newline at end of file
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_timeline.scss b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_timeline.scss
index 01e0e0eee1ce5e7b4547ac240e0e0f804e8c0877..fe83753908167bd00d16a39fc386151ed528d9a8 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_timeline.scss
+++ b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_timeline.scss
@@ -430,6 +430,10 @@ body .p-multiselect-panel .p-multiselect-header .p-multiselect-filter-container
     padding: 0em .2em 0em .2em
 }
 
+#reserv-reasons .p-multiselect-panel {
+    left: -110px !important
+}
+
 .alignTimeLineHeader {
     display: flex;
     justify-content: space-between;
@@ -451,6 +455,10 @@ body .p-multiselect-panel .p-multiselect-header .p-multiselect-filter-container
 
 .sub-header .toggle-btn {
     margin-top: 5px;
+    font-size: 10px !important;
+    min-height: 25px;
+    height: auto;
+    vertical-align: top;
 }
 
 .body .p-inputswitch {
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_workflow.scss b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_workflow.scss
index c1935e5355f79b0a0281046b1ebf1bf3d0976772..b0c427c6a34916d5e9752b2e2b4f0f31d98da64d 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_workflow.scss
+++ b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_workflow.scss
@@ -97,3 +97,20 @@
 .btn-bar {
   padding: 10px;
 }
+
+.comment-editor-content table,
+.operator-report table {
+  width: 100%;
+}
+
+.comment-editor-content table th,
+.comment-editor-content table td {
+  border: 1px solid lightgray;
+  padding: 3px;
+}
+
+.operator-report table th,
+.operator-report table td {
+  border: 1px solid lightgray;
+  padding: 3px;
+}
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/response.handler.js b/SAS/TMSS/frontend/tmss_webapp/src/response.handler.js
index 7c4da4c87de73f67983fb60f36e2c6aff269ab8d..253c68c04cb76c5c6d82b0f9941722b40724ae08 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/response.handler.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/response.handler.js
@@ -14,7 +14,9 @@ const handleResponse= Wrapped => {
             axios.interceptors.response.use(function (response) {
                 return response;
             }, function (error) {
-                showMessage(error.response);
+                if (error.response.status !== 403) {
+                    showMessage(error.response);
+                }
                 return Promise.reject(error);
             });
         })
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Cycle/list.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Cycle/list.js
index b137037c0a2ef0ba24b5a175c035de0dc74cf37b..c205b72f0370be86558d81fc21cb0146a6ed9d43 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Cycle/list.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Cycle/list.js
@@ -9,6 +9,8 @@ import AppLoader from '../../layout/components/AppLoader';
 import PageHeader from '../../layout/components/PageHeader';
 import UIConstants from '../../utils/ui.constants';
 import UtilService from '../../services/util.service';
+import AuthUtil from '../../utils/auth.util';
+import AccessDenied from '../../layout/components/AccessDenied';
 /* eslint-disable no-unused-expressions */
 
 class CycleList extends Component {
@@ -22,7 +24,10 @@ class CycleList extends Component {
             paths: [{
                 "View": "/cycle/view",
             }],
-            isLoading: true
+            isLoading: true,
+            userrole:  {
+                userRolePermission : {}
+            }
         }
         this.projectCategory = ['regular', 'user_shared_support'];
         this.periodCategory = ['long_term'];
@@ -150,9 +155,11 @@ class CycleList extends Component {
         });
     }
 
-    componentDidMount() {
+    async componentDidMount() {
         this.pageUpdated = true;
         const promises = [CycleService.getAllCycleQuotas(), CycleService.getResources()]
+        const permission = await AuthUtil.getUserPermissionByModule('cycle');
+        this.setState({userrole: permission});
         Promise.all(promises).then(responses => {
             const cycleQuota = responses[0];
             this.setState({ resources: responses[1] });
@@ -183,52 +190,63 @@ class CycleList extends Component {
     }
 
     render() {
+        const  {cycle}  = this.state.userrole;
         return (
             <>
-                { /*<div className="p-grid">
-                    <div className="p-col-10 p-lg-10 p-md-10">
-                        <h2>Cycle - List </h2>
-                    </div>
-                    <div className="p-col-2 p-lg-2 p-md-2">
-                        <Link to={{ pathname: '/cycle/create'}} title="Add New Cycle" style={{float: "right"}}>
-                            <i className="fa fa-plus-square" style={{marginTop: "10px"}}></i>
-                        </Link>
-                    </div>
-                </div> */}
-                {/*
-                    * Call View table to show table data, the parameters are,
-                    data - Pass API data
-                    defaultcolumns - This colum will be populate by default in table with header mentioned
-                    showaction - {true/false} -> to show the action column
-                    paths - specify the path for navigation - Table will set "id" value for each row in action button
-                */}
-                <PageHeader location={this.props.location} title={'Cycle - List'} actions={[{ icon: 'fa-plus-square', title: 'Click to Add Cycle', props: { pathname: '/cycle/create' } }]} />
-                {/*
-                    * Call View table to show table data, the parameters are,
-                    data - Pass API data
-                    defaultcolumns - This colum will be populate by default in table with header mentioned
-                    showaction - {true/false} -> to show the action column
-                    paths - specify the path for navigation - Table will set "id" value for each row in action button
-                */}
+            {cycle &&
+                <>
+                    { /*<div className="p-grid">
+                        <div className="p-col-10 p-lg-10 p-md-10">
+                            <h2>Cycle - List </h2>
+                        </div>
+                        <div className="p-col-2 p-lg-2 p-md-2">
+                            <Link to={{ pathname: '/cycle/create'}} title="Add New Cycle" style={{float: "right"}}>
+                                <i className="fa fa-plus-square" style={{marginTop: "10px"}}></i>
+                            </Link>
+                        </div>
+                    </div> */}
+                    {/*
+                        * Call View table to show table data, the parameters are,
+                        data - Pass API data
+                        defaultcolumns - This colum will be populate by default in table with header mentioned
+                        showaction - {true/false} -> to show the action column
+                        paths - specify the path for navigation - Table will set "id" value for each row in action button
+                    */}
+                    <PageHeader location={this.props.location} title={'Cycle - List'} 
+                                actions={[
+                                    { icon: 'fa-plus-square', 
+                                        title: cycle.create ?'Click to Add Cycle': `Don't have permission to add new Cycle`,
+                                        disabled: cycle.create?!cycle.create:true,  
+                                        props: { pathname: '/cycle/create' } }]} />
+                    {/*
+                        * Call View table to show table data, the parameters are,
+                        data - Pass API data
+                        defaultcolumns - This colum will be populate by default in table with header mentioned
+                        showaction - {true/false} -> to show the action column
+                        paths - specify the path for navigation - Table will set "id" value for each row in action button
+                    */}
 
-                {this.state.isLoading ? <AppLoader /> : (this.state.cyclelist && this.state.cyclelist.length) ?
+                    {this.state.isLoading ? <AppLoader /> : (this.state.cyclelist && this.state.cyclelist.length) ?
 
-                    <ViewTable
-                        data={this.state.cyclelist}
-                        defaultcolumns={this.defaultcolumns}
-                        optionalcolumns={this.optionalcolumns}
-                        columnclassname={this.columnclassname}
-                        defaultSortColumn={this.defaultSortColumn}
-                        columnOrders={this.columnOrder}
-                        showaction={true}
-                        paths={this.state.paths}
-                        tablename={this.lsTableName}
-                        toggleBySorting={(sortData) => this.toggleBySorting(sortData)}
-                        lsKeySortColumn={this.lsKeySortColumn}
-                        descendingColumn={this.descendingColumn}
-                        pageUpdated={this.pageUpdated}
-                    /> : <></>
-                }
+                        <ViewTable
+                            data={this.state.cyclelist}
+                            defaultcolumns={this.defaultcolumns}
+                            optionalcolumns={this.optionalcolumns}
+                            columnclassname={this.columnclassname}
+                            defaultSortColumn={this.defaultSortColumn}
+                            columnOrders={this.columnOrder}
+                            showaction={true}
+                            paths={this.state.paths}
+                            tablename={this.lsTableName}
+                            toggleBySorting={(sortData) => this.toggleBySorting(sortData)}
+                            lsKeySortColumn={this.lsKeySortColumn}
+                            descendingColumn={this.descendingColumn}
+                            pageUpdated={this.pageUpdated}
+                            storeFilter={false}
+                        /> : <></>
+                    }
+                    
+                </>}
             </>
         )
     }
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Cycle/view.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Cycle/view.js
index 2d3dec85738a927061d5b05396e020cf6112b423..3d6b3a4e5fff34dc69d0155b71e4dbabc5589478 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Cycle/view.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Cycle/view.js
@@ -13,6 +13,8 @@ import CycleService from '../../services/cycle.service';
 import UnitConverter from '../../utils/unit.converter';
 import UIConstants from '../../utils/ui.constants';
 import {ProjectList} from './../Project/list';
+import AuthUtil from '../../utils/auth.util';
+import AccessDenied from '../../layout/components/AccessDenied';
 
 /**
  * Component to view the details of a cycle
@@ -24,6 +26,9 @@ export class CycleView extends Component {
         this.state = {
             isLoading: true,
             cycle:'',
+            userrole: {
+                userRolePermission: {}
+            }
         };
         if (this.props.match.params.id) {
             this.state.cycleId  = this.props.match.params.id;
@@ -34,13 +39,15 @@ export class CycleView extends Component {
         this.resourceUnitMap = UnitConverter.resourceUnitMap;       // Resource unit conversion factor and constraints
     }
 
-    componentDidMount() {
+    async componentDidMount() {
         const cycleId = this.state.cycleId;
+        const permission = await AuthUtil.getUserRolePermission();
         if (cycleId) {
             this.getCycleDetails();
         }   else {
             this.setState({redirect: "/not-found"});
         }
+        this.setState({userrole: permission});
     }
 
     /**
@@ -76,7 +83,7 @@ export class CycleView extends Component {
         if (this.state.redirect) {
             return <Redirect to={ {pathname: this.state.redirect} }></Redirect>
         }
-        
+        const  {cycle}  = this.state.userrole.userRolePermission;
         return (
             <React.Fragment>
                {/* <div className="p-grid">
@@ -95,8 +102,13 @@ export class CycleView extends Component {
                     </div>
                     }
                 </div> */ }
+                {cycle && cycle.list?
+                <>
                 <PageHeader location={this.props.location} title={'Cycle - Details'} 
-                            actions={[ {icon:'fa-edit', title:'Click to Edit Cycle', props:{ pathname: `/cycle/edit/${this.state.cycle.name}`, 
+                            actions={[ {icon:'fa-edit', 
+                                        title:cycle.edit?'Click to Edit Cycle': `Don't have permission to edit`, 
+                                        disabled: cycle.edit? !cycle.edit:true,
+                                        props:{ pathname: `/cycle/edit/${this.state.cycle.name}`, 
                                         state: {id: this.state.cycle?this.state.cycle.name:''}}},
                                         {icon: 'fa-window-close',link: this.props.history.goBack}]}/>
                 { this.state.isLoading && <AppLoader /> }
@@ -151,6 +163,7 @@ export class CycleView extends Component {
                         </div>
                     </React.Fragment>
                 }
+                </>: <AccessDenied/>}
             </React.Fragment>
         );
     }
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Project/create.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Project/create.js
index 3b937cb55067067736f3b5deccbd0e9102650bbc..635c8a622fe8f9a13c3231809d90e64ceb4b6984 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Project/create.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Project/create.js
@@ -196,7 +196,7 @@ export class ProjectCreate extends Component {
      * @param {any} value 
      */
     async setProjectParams(key, value, type) {
-        let project = _.cloneDeep(this.state.project);
+        let project = this.state.project;
         switch(type) {
             case 'NUMBER': {
                 project[key] = value?parseInt(value):0;
@@ -239,12 +239,9 @@ export class ProjectCreate extends Component {
         if (type==='PROJECT_NAME' & value!=="") {
             validForm = this.validateForm('archive_subdirectory');
         }
-        if  ( !this.state.isDirty && !_.isEqual(this.state.project, project) ) {
-            this.setState({validForm: validForm, isDirty: true});
-            publish('edit-dirty', true);
-        }   else {
-            this.setState({validForm: validForm});
-        }
+        this.setState({validForm: validForm, isDirty: true});
+        publish('edit-dirty', true);
+        
     }
 
     /**
@@ -384,9 +381,7 @@ export class ProjectCreate extends Component {
      */
     cancelCreate() {
         publish('edit-dirty', false);
-        this.props.history.goBack();
-        this.setState({showDialog: false});
-        this.props.history.goBack();
+        this.setState({redirect: `/project`});
     }
 
     /**
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Project/edit.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Project/edit.js
index b763a3e5a4ff6db0859eccbed184e5c28bfa546a..c802afe98a84362e6f540ebed2c485d4ef32ef0c 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Project/edit.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Project/edit.js
@@ -23,11 +23,13 @@ import UnitConverter from '../../utils/unit.converter';
 import UIConstants from '../../utils/ui.constants';
 import ReactTooltip from "react-tooltip";
 import AuthUtil from '../../utils/auth.util';
+import AccessDenied from '../../layout/components/AccessDenied';
 
 export class ProjectEdit extends Component {
     constructor(props) {
         super(props);
         this.state = {
+            userModulePermission: null,
             showDialog: false,
             isDirty: false,
             isLoading: true,
@@ -83,46 +85,47 @@ export class ProjectEdit extends Component {
     }
 
     componentDidMount() {
-        // const modulePermissions = AuthUtil.getUserModulePermission("project");
-        // if (modulePermissions && modulePermissions.edit) {
-            ProjectService.getDefaultProjectResources()
-                .then(defaults => {
-                    this.projectResourceDefaults = defaults;
-                });
-            CycleService.getAllCycles()
-                .then(cycles => {
-                    this.setState({cycles: cycles});
-                });
-            ProjectService.getProjectCategories()
-                .then(categories => {
-                    this.setState({projectCategories: categories});
-                });
-            ProjectService.getPeriodCategories()
-                .then(categories => {
-                    this.setState({periodCategories: categories});
-                });
-            Promise.all([ProjectService.getFileSystem(),  ProjectService.getCluster()]).then(response => {
-                const options = [];
-                response[0].map(fileSystem => {
-                    const cluster =  response[1].filter(clusterObj => clusterObj.id === fileSystem.cluster_id && clusterObj.archive_site);
-                    if (cluster.length) {
-                        fileSystem.label =`${cluster[0].name} - ${fileSystem.name}`
-                        options.push(fileSystem);
-                    }
-                    return fileSystem;
-                });
-                this.setState({archive_location: response[0], ltaStorage: options, cluster: response[1] });
-            });
-            ProjectService.getResources()
-                .then(resourceList => {
-                    this.setState({resourceList: resourceList});
-                })
-                .then((resourceList, resources) => {
-                    this.getProjectDetails();
+        AuthUtil.getUserPermissionByModuleId('project', this.props.match.params.id)
+        .then(permissions => {
+            this.setState({userModulePermission: permissions});
+            if (permissions[this.props.match.params.id] && permissions[this.props.match.params.id].edit) {
+                ProjectService.getDefaultProjectResources()
+                    .then(defaults => {
+                        this.projectResourceDefaults = defaults;
+                    });
+                CycleService.getAllCycles()
+                    .then(cycles => {
+                        this.setState({cycles: cycles});
+                    });
+                ProjectService.getProjectCategories()
+                    .then(categories => {
+                        this.setState({projectCategories: categories});
+                    });
+                ProjectService.getPeriodCategories()
+                    .then(categories => {
+                        this.setState({periodCategories: categories});
+                    });
+                Promise.all([ProjectService.getFileSystem(),  ProjectService.getCluster()]).then(response => {
+                    const options = [];
+                    response[0].map(fileSystem => {
+                        const cluster =  response[1].filter(clusterObj => clusterObj.id === fileSystem.cluster_id && clusterObj.archive_site);
+                        if (cluster.length) {
+                            fileSystem.label =`${cluster[0].name} - ${fileSystem.name}`
+                            options.push(fileSystem);
+                        }
+                        return fileSystem;
+                    });
+                    this.setState({archive_location: response[0], ltaStorage: options, cluster: response[1] });
                 });
-        // }   else {
-        //     this.setState({redirect: "/access-denied"});
-        // }
+                ProjectService.getResources()
+                    .then(resourceList => {
+                        this.setState({resourceList: resourceList});
+                    })
+                    .then((resourceList, resources) => {
+                        this.getProjectDetails();
+                    });
+            }
+        });
     }
 
     /**
@@ -187,7 +190,6 @@ export class ProjectEdit extends Component {
             const newResource = _.remove(resourceList, {'name': this.state.newResource});
             let resources = this.state.resources?this.state.resources:[];
             resources.push(newResource[0]);
-            console.log(resources);
             if  ( !this.state.isDirty && !_.isEqual(this.state.resourceList, resourceList) ) {
                 this.setState({resources: resources, resourceList: resourceList, newResource: null, isDirty: true});
                 publish('edit-dirty', true);
@@ -225,7 +227,6 @@ export class ProjectEdit extends Component {
         let project = _.cloneDeep(this.state.project);
         switch(type) {
             case 'NUMBER': {
-                console.log("Parsing Number");
                 project[key] = value?parseInt(value):0;
                 break;
             }
@@ -262,17 +263,15 @@ export class ProjectEdit extends Component {
                 break;
             }
         }
-        await  this.setState({project: project});
+        let isDirty = this.state.isDirty || ( !this.state.isDirty && !_.isEqual(this.state.project, project) );
+        await  this.setState({project: _.cloneDeep(project)});
         let validForm = this.validateForm(key);
         if (type==='PROJECT_NAME' & value!=="") {
             validForm = this.validateForm('archive_subdirectory');
         }
-        if  ( !this.state.isDirty && !_.isEqual(this.state.project, project) ) {
-            this.setState({validForm: validForm, isDirty: true});
-            publish('edit-dirty', true);
-        }   else {
-            this.setState({validForm: validForm});
-        }
+        this.setState({validForm: validForm, isDirty: isDirty});
+        publish('edit-dirty', true);
+        
     }
 
     /**
@@ -451,220 +450,225 @@ export class ProjectEdit extends Component {
      */
     cancelEdit() {
         publish('edit-dirty', false);
-        this.props.history.goBack();
-        this.setState({showDialog: false});
-        this.props.history.goBack();
+        this.setState({redirect: `/project/view/${this.props.match.params.id}`});
     }
 
     render() {
         if (this.state.redirect) {
             return <Redirect to={ {pathname: this.state.redirect} }></Redirect>
-        }
-        
+        } 
         return (
             <React.Fragment>
-               <Growl ref={(el) => this.growl = el} />
-                 <PageHeader location={this.props.location} title={'Project - Edit'} actions={[{icon:'fa-window-close',
-                 title:'Click to Close Project Edit Page', type: 'button',  actOn: 'click', props:{ callback: this.checkIsDirty }}]}/>
-
-                { this.state.isLoading ? <AppLoader/> :
+                {/* Before loading the permission show empty page */}
+                {this.state.userModulePermission? 
                 <>
-                <div>
-                    <div className="p-fluid">
-                        <div className="p-field p-grid">
-                            <label htmlFor="projectName" className="col-lg-2 col-md-2 col-sm-12">Name <span style={{color:'red'}}>*</span></label>
-                            <div className="col-lg-3 col-md-3 col-sm-12">
-                                <InputText className={this.state.errors.name ?'input-error':''} id="projectName" data-testid="name"
-                                            tooltip="Enter name of the project" tooltipOptions={this.tooltipOptions} maxLength="128"
-                                            value={this.state.project.name} 
-                                            onChange={(e) => this.setProjectParams('name', e.target.value, 'PROJECT_NAME')}
-                                            onBlur={(e) => this.setProjectParams('name', e.target.value, 'PROJECT_NAME')}/>
-                                <label className={this.state.errors.name?"error":"info"}>
-                                    {this.state.errors.name ? this.state.errors.name : "Max 128 characters"}
-                                </label>
-                            </div>
-                            <div className="col-lg-1 col-md-1 col-sm-12"></div>
-                            <label htmlFor="description" className="col-lg-2 col-md-2 col-sm-12">Description <span style={{color:'red'}}>*</span></label>
-                            <div className="col-lg-3 col-md-3 col-sm-12">
-                                <InputTextarea className={this.state.errors.description ?'input-error':''} rows={3} cols={30} 
-                                            tooltip="Short description of the project" tooltipOptions={this.tooltipOptions} maxLength="128"
-                                            data-testid="description" value={this.state.project.description} 
-                                            onChange={(e) => this.setProjectParams('description', e.target.value)}
-                                            onBlur={(e) => this.setProjectParams('description', e.target.value)}/>
-                                <label className={this.state.errors.description ?"error":"info"}>
-                                    {this.state.errors.description ? this.state.errors.description : "Max 255 characters"}
-                                </label>
-                            </div>
-                        </div>
-                        <div className="p-field p-grid">
-                            <label htmlFor="triggerPriority" className="col-lg-2 col-md-2 col-sm-12">Trigger Priority </label>
-                            <div className="col-lg-3 col-md-3 col-sm-12">
-                                <InputNumber inputId="trig_prio" name="trig_prio" className={this.state.errors.name ?'input-error':''} 
-                                            tooltip="Priority of this project with respect to triggers" tooltipOptions={this.tooltipOptions}
-                                            value={this.state.project.trigger_priority} showButtons 
-                                            min={0} max={1001} step={10} useGrouping={false}
-                                            onChange={(e) => this.setProjectParams('trigger_priority', e.value)}
-                                            onBlur={(e) => this.setProjectParams('trigger_priority', e.target.value, 'NUMBER')} />
-                                <label className="error">
-                                    {this.state.errors.trigger_priority ? this.state.errors.trigger_priority : ""}
-                                </label>
-                            </div>
-                            <div className="col-lg-1 col-md-1 col-sm-12"></div>
-                            <label htmlFor="trigger" className="col-lg-2 col-md-2 col-sm-12">Allows Trigger Submission</label>
-                            <div className="col-lg-3 col-md-3 col-sm-12">
-                                <Checkbox inputId="trigger" role="trigger" 
-                                        tooltip="Is this project allowed to supply observation requests on the fly, possibly interrupting currently running observations (responsive telescope)?" 
-                                        tooltipOptions={this.tooltipOptions}
-                                        checked={this.state.project.can_trigger} onChange={e => this.setProjectParams('can_trigger', e.target.checked)}></Checkbox>
-                            </div>
-                        </div>
-                        <div className="p-field p-grid">
-                            <label htmlFor="projCategory" className="col-lg-2 col-md-2 col-sm-12">Project Category </label>
-                            <div className="col-lg-3 col-md-3 col-sm-12">
-                                <Dropdown inputId="projCat" optionLabel="value" optionValue="url" 
-                                        tooltip="Project Category" tooltipOptions={this.tooltipOptions}
-                                        value={this.state.project.project_category} 
-                                        options={this.state.projectCategories} 
-                                        onChange={(e) => {this.setProjectParams('project_category', e.value)}} 
-                                        placeholder="Select Project Category" />
-                            </div>
-                            <div className="col-lg-1 col-md-1 col-sm-12"></div>
-                            <label htmlFor="periodCategory" className="col-lg-2 col-md-2 col-sm-12">Period Category</label>
-                            <div className="col-lg-3 col-md-3 col-sm-12">
-                                <Dropdown data-testid="period-cat" id="period-cat" optionLabel="value" optionValue="url" 
-                                        tooltip="Period Category" tooltipOptions={this.tooltipOptions}
-                                        value={this.state.project.period_category} 
-                                        options={this.state.periodCategories} 
-                                        onChange={(e) => {this.setProjectParams('period_category',e.value)}} 
-                                        placeholder="Select Period Category" />
-                            </div>
-                        </div>
-                        <div className="p-field p-grid">
-                            <label htmlFor="triggerPriority" className="col-lg-2 col-md-2 col-sm-12">Cycle(s)</label>
-                            <div className="col-lg-3 col-md-3 col-sm-12">
-                                <MultiSelect data-testid="cycle" id="cycle" optionLabel="name" optionValue="url" filter={true}
-                                        tooltip="Cycle(s) to which this project belongs" tooltipOptions={this.tooltipOptions}
-                                        value={this.state.project.cycles} 
-                                        options={this.state.cycles} 
-                                        onChange={(e) => {this.setProjectParams('cycles',e.value)}} 
-                                        
-                                />
-                            </div>
-                            <div className="col-lg-1 col-md-1 col-sm-12"></div>
-                            <label htmlFor="projRank" className="col-lg-2 col-md-2 col-sm-12">Project Rank <span style={{color:'red'}}>*</span></label>
-                            <div className="col-lg-3 col-md-3 col-sm-12">
-                                <input type="number"
-                                    data-for="reacttooltip"
-                                    data-iscapture="true"
-                                    data-tip="Priority of this project w.r.t. other projects. Projects can interrupt observations of lower-priority projects. Min-0.00, Max-6.00"
-                                    inputId="proj-rank" name="rank" data-testid="rank"
-                                    className="p-inputtext p-component"
-                                    value={this.state.project.priority_rank}
-                                    step="0.01"
-                                    onChange={(e)=> this.setProjectParams('priority_rank', e.target.value, "DECIMAL")}/>
-                                <label className="error">
-                                    {this.state.errors.priority_rank ? this.state.errors.priority_rank : ""}
-                                </label>
-                            </div>
-                        </div>
-                        <div className="p-field p-grid">
-                            <label htmlFor="ltaStorage" className="col-lg-2 col-md-2 col-sm-12">LTA Storage Location</label>
-                                <div className="col-lg-3 col-md-3 col-sm-12" >
-                                    <Dropdown inputId="ltaStore" optionValue="url" 
-                                            tooltip="LTA Storage" tooltipOptions={this.tooltipOptions}
-                                            value={this.state.project.archive_location}
-                                            options={this.state.ltaStorage}
-                                            onChange={(e) => {this.setProjectParams('archive_location', e.value)}} 
-                                            placeholder="Select LTA Storage" />
-                                </div>
+                    {/* If project specific edit permission  does not exist for the user display 'Access Denied' */}
+                    {this.state.userModulePermission[this.props.match.params.id] && this.state.userModulePermission[this.props.match.params.id].edit?
+                    <>
+                        <Growl ref={(el) => this.growl = el} />
+                        <PageHeader location={this.props.location} title={'Project - Edit'} actions={[{icon:'fa-window-close',
+                        title:'Click to Close Project Edit Page', type: 'button',  actOn: 'click', props:{ callback: this.checkIsDirty }}]}/>
 
-                            <div className="col-lg-1 col-md-1 col-sm-12"></div>
-                            <label htmlFor="ltastoragepath" className="col-lg-2 col-md-2 col-sm-12">LTA Storage Path <span style={{color:'red'}}>*</span> </label>
-                                <div className="col-lg-3 col-md-3 col-sm-12">
-                                    <InputText className={this.state.errors.archive_subdirectory ?'input-error':''} id="StoragePath" data-testid="name" 
-                                                tooltip="Enter storage relative path" tooltipOptions={this.tooltipOptions} maxLength="1024"
-                                                value={this.state.project.archive_subdirectory} 
-                                                onChange={(e) => this.setProjectParams('archive_subdirectory', e.target.value)}
-                                                onBlur={(e) => this.setProjectParams('archive_subdirectory', e.target.value,'SUB-DIRECTORY')}/>
-                                    <label className={this.state.errors.archive_subdirectory?"error":"info"}>
-                                        {this.state.errors.archive_subdirectory? this.state.errors.archive_subdirectory : "Max 1024 characters"}
-                                    </label>
-                             </div>
-                             <div className="col-lg-1 col-md-1 col-sm-12"></div>
-                                <label htmlFor="preventdeletionafteringest" className="col-lg-2 col-md-2 col-sm-12">Prevent Automatic Deletion After Ingest</label>
-                                <div className="col-lg-3 col-md-3 col-sm-12" data-testid="preventdeletionafteringest">
-                                    <Checkbox inputId="preventdeletionafteringest" role="preventdeletionafteringest" 
-                                            tooltip="Prevent automatic deletion after ingest" 
-                                            tooltipOptions={this.tooltipOptions}
-                                            checked={this.state.project.auto_pin} onChange={e => this.setProjectParams('auto_pin', e.target.checked)}></Checkbox>
-                             </div>
-                        </div>
-                        {this.state.resourceList &&
+                        { this.state.isLoading ? <AppLoader/> :
+                        <>
+                        <div>
                             <div className="p-fluid">
                                 <div className="p-field p-grid">
-                                    <div className="col-lg-2 col-md-2 col-sm-12">
-                                        <h5>Resource Allocations:</h5>
+                                    <label htmlFor="projectName" className="col-lg-2 col-md-2 col-sm-12">Name <span style={{color:'red'}}>*</span></label>
+                                    <div className="col-lg-3 col-md-3 col-sm-12">
+                                        <InputText className={this.state.errors.name ?'input-error':''} id="projectName" data-testid="name"
+                                                    tooltip="Enter name of the project" tooltipOptions={this.tooltipOptions} maxLength="128"
+                                                    value={this.state.project.name} 
+                                                    onChange={(e) => this.setProjectParams('name', e.target.value, 'PROJECT_NAME')}
+                                                    onBlur={(e) => this.setProjectParams('name', e.target.value, 'PROJECT_NAME')}/>
+                                        <label className={this.state.errors.name?"error":"info"}>
+                                            {this.state.errors.name ? this.state.errors.name : "Max 128 characters"}
+                                        </label>
                                     </div>
-                                    <div className="col-lg-3 col-md-3 col-sm-10">
-                                        <Dropdown optionLabel="name" optionValue="name" 
-                                            tooltip="Resources to be allotted for the project" 
-                                            tooltipOptions={this.tooltipOptions}
-                                            value={this.state.newResource} 
-                                            options={_.sortBy(this.state.resourceList, ['name'])} 
-                                            onChange={(e) => {this.setState({'newResource': e.value})}}
-                                            placeholder="Add Resources" />
+                                    <div className="col-lg-1 col-md-1 col-sm-12"></div>
+                                    <label htmlFor="description" className="col-lg-2 col-md-2 col-sm-12">Description <span style={{color:'red'}}>*</span></label>
+                                    <div className="col-lg-3 col-md-3 col-sm-12">
+                                        <InputTextarea className={this.state.errors.description ?'input-error':''} rows={3} cols={30} 
+                                                    tooltip="Short description of the project" tooltipOptions={this.tooltipOptions} maxLength="128"
+                                                    data-testid="description" value={this.state.project.description} 
+                                                    onChange={(e) => this.setProjectParams('description', e.target.value)}
+                                                    onBlur={(e) => this.setProjectParams('description', e.target.value)}/>
+                                        <label className={this.state.errors.description ?"error":"info"}>
+                                            {this.state.errors.description ? this.state.errors.description : "Max 255 characters"}
+                                        </label>
                                     </div>
-                                    <div className="col-lg-2 col-md-2 col-sm-2">
-                                    <Button label="" className="p-button-primary" icon="pi pi-plus" onClick={this.addNewResource} disabled={!this.state.newResource} data-testid="add_res_btn" />
+                                </div>
+                                <div className="p-field p-grid">
+                                    <label htmlFor="triggerPriority" className="col-lg-2 col-md-2 col-sm-12">Trigger Priority </label>
+                                    <div className="col-lg-3 col-md-3 col-sm-12">
+                                        <InputNumber inputId="trig_prio" name="trig_prio" className={this.state.errors.name ?'input-error':''} 
+                                                    tooltip="Priority of this project with respect to triggers" tooltipOptions={this.tooltipOptions}
+                                                    value={this.state.project.trigger_priority} showButtons 
+                                                    min={0} max={1001} step={10} useGrouping={false}
+                                                    onChange={(e) => this.setProjectParams('trigger_priority', e.value)}
+                                                    onBlur={(e) => this.setProjectParams('trigger_priority', e.target.value, 'NUMBER')} />
+                                        <label className="error">
+                                            {this.state.errors.trigger_priority ? this.state.errors.trigger_priority : ""}
+                                        </label>
+                                    </div>
+                                    <div className="col-lg-1 col-md-1 col-sm-12"></div>
+                                    <label htmlFor="trigger" className="col-lg-2 col-md-2 col-sm-12">Allows Trigger Submission</label>
+                                    <div className="col-lg-3 col-md-3 col-sm-12">
+                                        <Checkbox inputId="trigger" role="trigger" 
+                                                tooltip="Is this project allowed to supply observation requests on the fly, possibly interrupting currently running observations (responsive telescope)?" 
+                                                tooltipOptions={this.tooltipOptions}
+                                                checked={this.state.project.can_trigger} onChange={e => this.setProjectParams('can_trigger', e.target.checked)}></Checkbox>
                                     </div>
                                 </div>
-                                {/* {_.keys(this.state.projectQuota).length>0 && */}
-                                    <div className="p-field p-grid resource-input-grid">
-                                        <ResourceInputList list={this.state.resources} unitMap={this.resourceUnitMap} 
-                                                        projectQuota={this.state.projectQuota} callback={this.setProjectQuotaParams} 
-                                                        removeInputCallback={this.removeResource} />
+                                <div className="p-field p-grid">
+                                    <label htmlFor="projCategory" className="col-lg-2 col-md-2 col-sm-12">Project Category </label>
+                                    <div className="col-lg-3 col-md-3 col-sm-12">
+                                        <Dropdown inputId="projCat" optionLabel="value" optionValue="url" 
+                                                tooltip="Project Category" tooltipOptions={this.tooltipOptions}
+                                                value={this.state.project.project_category} 
+                                                options={this.state.projectCategories} 
+                                                onChange={(e) => {this.setProjectParams('project_category', e.value)}} 
+                                                placeholder="Select Project Category" />
+                                    </div>
+                                    <div className="col-lg-1 col-md-1 col-sm-12"></div>
+                                    <label htmlFor="periodCategory" className="col-lg-2 col-md-2 col-sm-12">Period Category</label>
+                                    <div className="col-lg-3 col-md-3 col-sm-12">
+                                        <Dropdown data-testid="period-cat" id="period-cat" optionLabel="value" optionValue="url" 
+                                                tooltip="Period Category" tooltipOptions={this.tooltipOptions}
+                                                value={this.state.project.period_category} 
+                                                options={this.state.periodCategories} 
+                                                onChange={(e) => {this.setProjectParams('period_category',e.value)}} 
+                                                placeholder="Select Period Category" />
                                     </div>
-                                {/* } */}
-                            </div>
-                        }
-                         <ReactTooltip id="reacttooltip" place={'left'}  type={'dark'} effect={'solid'} multiline={true} />
-                    </div>
-                </div>
-                <div className="p-grid p-justify-start act-btn-grp">
-                    <div className="p-col-1">
-                        <Button label="Save" className="p-button-primary" id="save-btn" data-testid="save-btn" icon="pi pi-check" onClick={this.saveProject} disabled={!this.state.validForm} />
-                    </div>
-                    <div className="p-col-1">
-                        <Button label="Cancel" className="p-button-danger" icon="pi pi-times" onClick={this.checkIsDirty}  />
-                    </div>
-                </div>
-
-                </>
-                }
-                {/* Dialog component to show messages and get input */}
-                <div className="p-grid" data-testid="confirm_dialog">
-                    <Dialog header={this.state.dialog.header} visible={this.state.dialogVisible} style={{width: '30vw'}} inputId="confirm_dialog"
-                            modal={true}  onHide={() => {this.setState({dialogVisible: false})}} 
-                            footer={<div>
-                                <Button key="back" onClick={() => {this.setState({dialogVisible: false}); this.cancelEdit();}} label="Ok" />
-                                {/* <Button key="submit" type="primary" onClick={this.reset} label="Yes" /> */}
                                 </div>
-                            } >
-                            <div className="p-grid">
-                                <div className="col-lg-2 col-md-2 col-sm-2">
-                                    <i className="pi pi-check-circle pi-large pi-success"></i>
+                                <div className="p-field p-grid">
+                                    <label htmlFor="triggerPriority" className="col-lg-2 col-md-2 col-sm-12">Cycle(s)</label>
+                                    <div className="col-lg-3 col-md-3 col-sm-12">
+                                        <MultiSelect data-testid="cycle" id="cycle" optionLabel="name" optionValue="url" filter={true}
+                                                tooltip="Cycle(s) to which this project belongs" tooltipOptions={this.tooltipOptions}
+                                                value={this.state.project.cycles} 
+                                                options={this.state.cycles} 
+                                                onChange={(e) => {this.setProjectParams('cycles',e.value)}} 
+                                                
+                                        />
+                                    </div>
+                                    <div className="col-lg-1 col-md-1 col-sm-12"></div>
+                                    <label htmlFor="projRank" className="col-lg-2 col-md-2 col-sm-12">Project Rank <span style={{color:'red'}}>*</span></label>
+                                    <div className="col-lg-3 col-md-3 col-sm-12">
+                                        <input type="number"
+                                            data-for="reacttooltip"
+                                            data-iscapture="true"
+                                            data-tip="Priority of this project w.r.t. other projects. Projects can interrupt observations of lower-priority projects. Min-0.00, Max-6.00"
+                                            inputId="proj-rank" name="rank" data-testid="rank"
+                                            className="p-inputtext p-component"
+                                            value={this.state.project.priority_rank}
+                                            step="0.01"
+                                            onChange={(e)=> this.setProjectParams('priority_rank', e.target.value, "DECIMAL")}/>
+                                        <label className="error">
+                                            {this.state.errors.priority_rank ? this.state.errors.priority_rank : ""}
+                                        </label>
+                                    </div>
                                 </div>
-                                <div className="col-lg-10 col-md-10 col-sm-10">
-                                    <span style={{marginTop:"5px"}}>{this.state.dialog.detail}</span>
+                                <div className="p-field p-grid">
+                                    <label htmlFor="ltaStorage" className="col-lg-2 col-md-2 col-sm-12">LTA Storage Location</label>
+                                        <div className="col-lg-3 col-md-3 col-sm-12" >
+                                            <Dropdown inputId="ltaStore" optionValue="url" 
+                                                    tooltip="LTA Storage" tooltipOptions={this.tooltipOptions}
+                                                    value={this.state.project.archive_location}
+                                                    options={this.state.ltaStorage}
+                                                    onChange={(e) => {this.setProjectParams('archive_location', e.value)}} 
+                                                    placeholder="Select LTA Storage" />
+                                        </div>
+
+                                    <div className="col-lg-1 col-md-1 col-sm-12"></div>
+                                    <label htmlFor="ltastoragepath" className="col-lg-2 col-md-2 col-sm-12">LTA Storage Path <span style={{color:'red'}}>*</span> </label>
+                                        <div className="col-lg-3 col-md-3 col-sm-12">
+                                            <InputText className={this.state.errors.archive_subdirectory ?'input-error':''} id="StoragePath" data-testid="name" 
+                                                        tooltip="Enter storage relative path" tooltipOptions={this.tooltipOptions} maxLength="1024"
+                                                        value={this.state.project.archive_subdirectory} 
+                                                        onChange={(e) => this.setProjectParams('archive_subdirectory', e.target.value)}
+                                                        onBlur={(e) => this.setProjectParams('archive_subdirectory', e.target.value,'SUB-DIRECTORY')}/>
+                                            <label className={this.state.errors.archive_subdirectory?"error":"info"}>
+                                                {this.state.errors.archive_subdirectory? this.state.errors.archive_subdirectory : "Max 1024 characters"}
+                                            </label>
+                                    </div>
+                                    <div className="col-lg-1 col-md-1 col-sm-12"></div>
+                                        <label htmlFor="preventdeletionafteringest" className="col-lg-2 col-md-2 col-sm-12">Prevent Automatic Deletion After Ingest</label>
+                                        <div className="col-lg-3 col-md-3 col-sm-12" data-testid="preventdeletionafteringest">
+                                            <Checkbox inputId="preventdeletionafteringest" role="preventdeletionafteringest" 
+                                                    tooltip="Prevent automatic deletion after ingest" 
+                                                    tooltipOptions={this.tooltipOptions}
+                                                    checked={this.state.project.auto_pin} onChange={e => this.setProjectParams('auto_pin', e.target.checked)}></Checkbox>
+                                    </div>
                                 </div>
+                                {this.state.resourceList &&
+                                    <div className="p-fluid">
+                                        <div className="p-field p-grid">
+                                            <div className="col-lg-2 col-md-2 col-sm-12">
+                                                <h5>Resource Allocations:</h5>
+                                            </div>
+                                            <div className="col-lg-3 col-md-3 col-sm-10">
+                                                <Dropdown optionLabel="name" optionValue="name" 
+                                                    tooltip="Resources to be allotted for the project" 
+                                                    tooltipOptions={this.tooltipOptions}
+                                                    value={this.state.newResource} 
+                                                    options={_.sortBy(this.state.resourceList, ['name'])} 
+                                                    onChange={(e) => {this.setState({'newResource': e.value})}}
+                                                    placeholder="Add Resources" />
+                                            </div>
+                                            <div className="col-lg-2 col-md-2 col-sm-2">
+                                            <Button label="" className="p-button-primary" icon="pi pi-plus" onClick={this.addNewResource} disabled={!this.state.newResource} data-testid="add_res_btn" />
+                                            </div>
+                                        </div>
+                                        {/* {_.keys(this.state.projectQuota).length>0 && */}
+                                            <div className="p-field p-grid resource-input-grid">
+                                                <ResourceInputList list={this.state.resources} unitMap={this.resourceUnitMap} 
+                                                                projectQuota={this.state.projectQuota} callback={this.setProjectQuotaParams} 
+                                                                removeInputCallback={this.removeResource} />
+                                            </div>
+                                        {/* } */}
+                                    </div>
+                                }
+                                <ReactTooltip id="reacttooltip" place={'left'}  type={'dark'} effect={'solid'} multiline={true} />
+                            </div>
+                        </div>
+                        <div className="p-grid p-justify-start act-btn-grp">
+                            <div className="p-col-1">
+                                <Button label="Save" className="p-button-primary" id="save-btn" data-testid="save-btn" icon="pi pi-check" onClick={this.saveProject} disabled={!this.state.validForm} />
                             </div>
-                    </Dialog>
+                            <div className="p-col-1">
+                                <Button label="Cancel" className="p-button-danger" icon="pi pi-times" onClick={this.checkIsDirty}  />
+                            </div>
+                        </div>
+
+                        </>
+                        }
+                        {/* Dialog component to show messages and get input */}
+                        <div className="p-grid" data-testid="confirm_dialog">
+                            <Dialog header={this.state.dialog.header} visible={this.state.dialogVisible} style={{width: '30vw'}} inputId="confirm_dialog"
+                                    modal={true}  onHide={() => {this.setState({dialogVisible: false})}} 
+                                    footer={<div>
+                                        <Button key="back" onClick={() => {this.setState({dialogVisible: false}); this.cancelEdit();}} label="Ok" />
+                                        {/* <Button key="submit" type="primary" onClick={this.reset} label="Yes" /> */}
+                                        </div>
+                                    } >
+                                    <div className="p-grid">
+                                        <div className="col-lg-2 col-md-2 col-sm-2">
+                                            <i className="pi pi-check-circle pi-large pi-success"></i>
+                                        </div>
+                                        <div className="col-lg-10 col-md-10 col-sm-10">
+                                            <span style={{marginTop:"5px"}}>{this.state.dialog.detail}</span>
+                                        </div>
+                                    </div>
+                            </Dialog>
 
-                    <CustomDialog type="confirmation" visible={this.state.showDialog} width="40vw"
-                        header={'Edit Project'} message={'Do you want to leave this page? Your changes may not be saved.'} 
-                        content={''} onClose={this.close} onCancel={this.close} onSubmit={this.cancelEdit}>
-                    </CustomDialog>
-                </div>
+                            <CustomDialog type="confirmation" visible={this.state.showDialog} width="40vw"
+                                header={'Edit Project'} message={'Do you want to leave this page? Your changes may not be saved.'} 
+                                content={''} onClose={this.close} onCancel={this.close} onSubmit={this.cancelEdit}>
+                            </CustomDialog>
+                        </div>
+                    </>: <AccessDenied/>}
+                </>:''}
             </React.Fragment>
         );
     }
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Project/list.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Project/list.js
index 08c0763cb1ce2ddb9904ce902b748ab9a0526f0e..f9fd930b9a299d1d89c92fcc0414f28dfebc4841 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Project/list.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Project/list.js
@@ -6,6 +6,7 @@ import PageHeader from '../../layout/components/PageHeader';
 import CycleService from '../../services/cycle.service';
 import UtilService from '../../services/util.service';
 import AuthUtil from '../../utils/auth.util';
+import AccessDenied from '../../layout/components/AccessDenied';
 
 /* eslint-disable no-unused-expressions */
 
@@ -16,6 +17,9 @@ export class ProjectList extends Component {
     constructor(props) {
         super(props)
         this.state = {
+            userrole: {
+                userRolePermission: {}
+            },
             projectlist: [],
             defaultcolumns: [{
                 name: "Name / Project Code",
@@ -27,7 +31,7 @@ export class ProjectList extends Component {
                     name: "Category of Project",
                     filter: "select"
                 },
-                description: "Description",
+                description: "Description",              
                 archive_location_label: {
                     name: "LTA Storage Location",
                     filter: "select"
@@ -127,14 +131,16 @@ export class ProjectList extends Component {
         this.setState({userrole: permission});
         Promise.all([ProjectService.getFileSystem(), ProjectService.getCluster()]).then(async (response) => {
             const options = {};
-            response[0].map(fileSystem => {
-                const cluster = response[1].filter(clusterObj => { return (clusterObj.id === fileSystem.cluster_id && clusterObj.archive_site); });
-                if (cluster.length) {
-                    fileSystem.label = `${cluster[0].name} - ${fileSystem.name}`
-                    options[fileSystem.url] = fileSystem;
-                }
-                return fileSystem;
-            });
+            if (response.length === 2 && response[0] && response[1]) {
+                response[0].map(fileSystem => {
+                    const cluster = response[1].filter(clusterObj => { return (clusterObj.id === fileSystem.cluster_id && clusterObj.archive_site); });
+                    if (cluster.length) {
+                        fileSystem.label = `${cluster[0].name} - ${fileSystem.name}`
+                        options[fileSystem.url] = fileSystem;
+                    }
+                    return fileSystem;
+                });
+            }
             let projects = [];
             if (cycleId) {
                 projects = await CycleService.getProjectsByCycle(cycleId);
@@ -193,6 +199,7 @@ export class ProjectList extends Component {
     // }
 
     render() {
+        const {project} = this.state.userrole.userRolePermission
         return (
             <>
                 {/*<div className="p-grid">
@@ -210,7 +217,7 @@ export class ProjectList extends Component {
                     </>
                     :
                     <PageHeader location={this.props.location} title={'Project - List'}
-                        actions={[{ icon: 'fa-plus-square', title: this.state.userrole && this.state.userrole.userRolePermission.project && this.state.userrole.userRolePermission.project.create?'Click to Add Project':"Don't have permission", 
+                        actions={[{ icon: 'fa-plus-square', title: this.state.userrole && this.state.userrole.userRolePermission.project && this.state.userrole.userRolePermission.project.create?'Click to Add Project':"Don't have permission to add new Project", 
                         disabled: this.state.userrole && this.state.userrole.userRolePermission.project?!this.state.userrole.userRolePermission.project.create:true, props: { pathname: '/project/create' } }]}
                     />
                 }
@@ -230,10 +237,12 @@ export class ProjectList extends Component {
                         toggleBySorting={(sortData) => this.toggleBySorting(sortData)}
                         lsKeySortColumn={this.lsKeySortColumn}
                         pageUpdated={this.pageUpdated}
+                        storeFilter={false}
                     />                   
                     : <div>No project found </div>
                 }
             </>
+            
         )
     }
 
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Project/view.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Project/view.js
index aebb296a6fe2dc83e924480a93619b1700c2b203..2bf59fe21e01e20a720199cd760caf0d0bcaf649 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Project/view.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Project/view.js
@@ -14,6 +14,7 @@ import UnitConverter from '../../utils/unit.converter';
 import SchedulingUnitList from './../Scheduling/SchedulingUnitList';
 import UIConstants from '../../utils/ui.constants';
 import AuthUtil from '../../utils/auth.util';
+import AccessDenied from '../../layout/components/AccessDenied';
 
 /**
  * Component to view the details of a project
@@ -38,21 +39,29 @@ export class ProjectView extends Component {
     componentDidMount() {
         const projectId = this.state.projectId;
         if (projectId) {
-            this.getProjectDetails(projectId);
+            AuthUtil.getUserPermissionByModuleId('project', projectId)
+            .then (permission => {
+                this.setState({ permissionById: permission});
+                if (permission[projectId] && permission[projectId].view) {
+                    this.getProjectDetails(projectId);
+                    Promise.all([ProjectService.getFileSystem(), ProjectService.getCluster()]).then(response => {
+                        const options = {};
+                        if (response.length === 2 && response[0] && response[1]) {
+                            response[0].map(fileSystem => {
+                                const cluster =  response[1].filter(clusterObj => clusterObj.id === fileSystem.cluster_id && clusterObj.archive_site);
+                                if (cluster.length) {
+                                    options[fileSystem.url] = `${cluster[0].name} - ${fileSystem.name}`
+                                }
+                                return fileSystem;
+                            });
+                            this.setState({archive_location: response[0], ltaStorage: options, cluster: response[1] });
+                        }
+                    });
+                }
+            });
         }   else {
             this.setState({redirect: "/not-found"});
         }
-        Promise.all([ProjectService.getFileSystem(), ProjectService.getCluster()]).then(response => {
-            const options = {};
-            response[0].map(fileSystem => {
-                const cluster =  response[1].filter(clusterObj => clusterObj.id === fileSystem.cluster_id && clusterObj.archive_site);
-                if (cluster.length) {
-                    options[fileSystem.url] = `${cluster[0].name} - ${fileSystem.name}`
-                }
-                return fileSystem;
-            });
-            this.setState({archive_location: response[0], ltaStorage: options, cluster: response[1] });
-        });
     }
 
     /**
@@ -60,8 +69,6 @@ export class ProjectView extends Component {
      * 
      */
     async getProjectDetails() {
-        const permission = await AuthUtil.getUserRolePermission();
-        this.setState({userrole: permission});
         let project = await ProjectService.getProjectDetails(this.state.projectId);
         let projectQuota = [];
         let resources = []; 
@@ -74,7 +81,7 @@ export class ProjectView extends Component {
             for (const id of project.quota_ids) {
                 let quota = await ProjectService.getProjectQuota(id);
                 let resource = _.find(resources, ['name', quota.resource_type_id]);
-                quota.resource = resource;
+                quota.resource = resource?resource:{name:quota.resource_type_id};
                 projectQuota.push(quota);
             };
             this.setState({project: project, projectQuota: projectQuota, isLoading: false});
@@ -95,94 +102,99 @@ export class ProjectView extends Component {
         if (this.state.redirect) {
             return <Redirect to={ {pathname: this.state.redirect} }></Redirect>
         }
-         
         return (
             <React.Fragment>
-                <TieredMenu className="app-header-menu" model={this.menuOptions} popup ref={el => this.optionsMenu = el} />
-                <PageHeader location={this.props.location} title={'Project - Details'} 
-                            actions={[  {icon: 'fa-edit',
-                                        title: this.state.userrole && this.state.userrole.userRolePermission.project && this.state.userrole.userRolePermission.project.edit?'Click to Edit Project':"Don't have permission",
-                                        type:'link',
-                                        disabled: this.state.userrole && this.state.userrole.userRolePermission.project && this.state.userrole.userRolePermission.project?!this.state.userrole.userRolePermission.project.edit:true, 
-                                        props : { pathname: `/project/edit/${this.state.project.name}`, 
-                                                   state: {id: this.state.project?this.state.project.name:''&& this.state.project}}},
-                                        {icon:'fa-window-close',title: 'Click to Close Project View', link: this.props.history.goBack}]}/>
-                { this.state.isLoading && <AppLoader /> }
-                { this.state.project &&
-                    <React.Fragment>
-                        <div className="main-content">
-                            <div className="p-grid">
-                                <label className="col-lg-2 col-md-2 col-sm-12">Name</label>
-                                <span className="col-lg-4 col-md-4 col-sm-12">{this.state.project.name}</span>
-                                <label className="col-lg-2 col-md-2 col-sm-12">Description</label>
-                                <span className="col-lg-4 col-md-4 col-sm-12">{this.state.project.description}</span>
-                            </div>
-                            <div className="p-grid">
-                                <label className="col-lg-2 col-md-2 col-sm-12">Created At</label>
-                                <span className="col-lg-4 col-md-4 col-sm-12">{moment.utc(this.state.project.created_at).format(UIConstants.CALENDAR_DATETIME_FORMAT)}</span>
-                                <label className="col-lg-2 col-md-2 col-sm-12">Updated At</label>
-                                <span className="col-lg-4 col-md-4 col-sm-12">{moment.utc(this.state.project.updated_at).format(UIConstants.CALENDAR_DATETIME_FORMAT)}</span>
-                            </div>
-                            <div className="p-grid">
-                                <label className="col-lg-2 col-md-2 col-sm-12">Trigger Priority</label>
-                                <span className="col-lg-4 col-md-4 col-sm-12">{this.state.project.trigger_priority}</span>
-                                <label className="col-lg-2 col-md-2 col-sm-12">Allows Trigger Submission</label>
-                                <span className="col-lg-4 col-md-4 col-sm-12"><i className={this.state.project.can_trigger?'fa fa-check-circle':'fa fa-times-circle'}></i></span>
-                            </div>
-                            <div className="p-grid">
-                                <label className="col-lg-2 col-md-2 col-sm-12">Project Category</label>
-                                <span className="col-lg-4 col-md-4 col-sm-12">{this.state.project.project_category_value}</span>
-                                <label className="col-lg-2 col-md-2 col-sm-12">Period Category</label>
-                                <span className="col-lg-4 col-md-4 col-sm-12">{this.state.project.period_category_value}</span>
-                            </div>
-                            <div className="p-grid">
-                                <label className="col-lg-2 col-md-2 col-sm-12">Cycles</label>
-                                <Chips className="col-lg-4 col-md-4 col-sm-12 chips-readonly" disabled value={this.state.project.cycles_ids}></Chips>
-                                <label className="col-lg-2 col-md-2 col-sm-12">Project Rank</label>
-                                <span className="col-lg-4 col-md-4 col-sm-12">{this.state.project.priority_rank}</span>
-                            </div>
-                            <div className="p-grid">
-                                <label className="col-lg-2 col-md-2 col-sm-12">LTA Storage Location</label>
-                                <span className="col-lg-4 col-md-4 col-sm-12">{this.state.ltaStorage[this.state.project.archive_location]}</span>
-                                <label className="col-lg-2 col-md-2 col-sm-12">LTA Storage Path</label>
-                                <span className="col-lg-4 col-md-4 col-sm-12">{this.state.project.archive_subdirectory	}</span>
-                            </div>
-                            <div className="p-grid">
-                                <label className="col-lg-2 col-md-2 col-sm-12">Prevent Automatic Deletion After Ingest</label>
-                                <span className="col-lg-4 col-md-4 col-sm-12"><i className={this.state.project.auto_pin?'fa fa-check-circle':'fa fa-times-circle'}></i></span>
-                            </div>
-                            <div className="p-fluid">
-                                <div className="p-field p-grid">
-                                    <div className="col-lg-3 col-md-3 col-sm-12">
-                                        <h5 data-testid="resource_alloc">Resource Allocations</h5>
+                {this.state.permissionById &&
+                    <>
+                        {this.state.permissionById[this.state.projectId] && this.state.permissionById[this.state.projectId].view ?
+                        <>
+                        <TieredMenu className="app-header-menu" model={this.menuOptions} popup ref={el => this.optionsMenu = el} />
+                        <PageHeader location={this.props.location} title={'Project - Details'} 
+                                    actions={[  {icon: 'fa-edit',
+                                                title: this.state.permissionById[this.state.projectId].edit?'Click to Edit Project':"Don't have permission to edit",
+                                                type:'link',
+                                                disabled: this.state.permissionById[this.state.projectId].edit?!this.state.permissionById[this.state.projectId].edit:true, 
+                                                props : { pathname: `/project/edit/${this.state.project.name}`, 
+                                                        state: {id: this.state.project?this.state.project.name:''&& this.state.project}}},
+                                                {icon:'fa-window-close',title: 'Click to Close Project View', link: this.props.history.goBack}]}/>
+                        { this.state.isLoading && <AppLoader /> }
+                        { this.state.project &&
+                            <React.Fragment>
+                                <div className="main-content">
+                                    <div className="p-grid">
+                                        <label className="col-lg-2 col-md-2 col-sm-12">Name</label>
+                                        <span className="col-lg-4 col-md-4 col-sm-12">{this.state.project.name}</span>
+                                        <label className="col-lg-2 col-md-2 col-sm-12">Description</label>
+                                        <span className="col-lg-4 col-md-4 col-sm-12">{this.state.project.description}</span>
                                     </div>
-                                </div>
-                            </div>
-                            {this.state.projectQuota.length===0 && 
-                                <div className="p-field p-grid">
-                                    <div className="col-lg-12 col-md-12 col-sm-12">
-                                        <span>Reosurces not yet allocated. 
-                                            <Link to={{ pathname: `/project/edit/${this.state.project.name}`, state: {id: this.state.project?this.state.project.name:''}}} title="Edit Project" > Click</Link> to add.
-                                        </span>
+                                    <div className="p-grid">
+                                        <label className="col-lg-2 col-md-2 col-sm-12">Created At</label>
+                                        <span className="col-lg-4 col-md-4 col-sm-12">{moment.utc(this.state.project.created_at).format(UIConstants.CALENDAR_DATETIME_FORMAT)}</span>
+                                        <label className="col-lg-2 col-md-2 col-sm-12">Updated At</label>
+                                        <span className="col-lg-4 col-md-4 col-sm-12">{moment.utc(this.state.project.updated_at).format(UIConstants.CALENDAR_DATETIME_FORMAT)}</span>
                                     </div>
-                                </div>
-                            }
-                            <div className="p-field p-grid resource-input-grid">
-                                <ResourceDisplayList projectQuota={this.state.projectQuota}  unitMap={this.resourceUnitMap} />
-                            </div>
-                            {/* Show Schedule Unit belongs to Project */}
-                            <div className="p-fluid">
-                                <div className="p-field p-grid">
-                                    <div className="col-lg-3 col-md-3 col-sm-12">
-                                        <h5 data-testid="resource_alloc">Scheduling Unit - List</h5>
+                                    <div className="p-grid">
+                                        <label className="col-lg-2 col-md-2 col-sm-12">Trigger Priority</label>
+                                        <span className="col-lg-4 col-md-4 col-sm-12">{this.state.project.trigger_priority}</span>
+                                        <label className="col-lg-2 col-md-2 col-sm-12">Allows Trigger Submission</label>
+                                        <span className="col-lg-4 col-md-4 col-sm-12"><i className={this.state.project.can_trigger?'fa fa-check-circle':'fa fa-times-circle'}></i></span>
+                                    </div>
+                                    <div className="p-grid">
+                                        <label className="col-lg-2 col-md-2 col-sm-12">Project Category</label>
+                                        <span className="col-lg-4 col-md-4 col-sm-12">{this.state.project.project_category_value}</span>
+                                        <label className="col-lg-2 col-md-2 col-sm-12">Period Category</label>
+                                        <span className="col-lg-4 col-md-4 col-sm-12">{this.state.project.period_category_value}</span>
                                     </div>
+                                    <div className="p-grid">
+                                        <label className="col-lg-2 col-md-2 col-sm-12">Cycles</label>
+                                        <Chips className="col-lg-4 col-md-4 col-sm-12 chips-readonly" disabled value={this.state.project.cycles_ids}></Chips>
+                                        <label className="col-lg-2 col-md-2 col-sm-12">Project Rank</label>
+                                        <span className="col-lg-4 col-md-4 col-sm-12">{this.state.project.priority_rank}</span>
+                                    </div>
+                                    <div className="p-grid">
+                                        <label className="col-lg-2 col-md-2 col-sm-12">LTA Storage Location</label>
+                                        <span className="col-lg-4 col-md-4 col-sm-12">{this.state.ltaStorage[this.state.project.archive_location]}</span>
+                                        <label className="col-lg-2 col-md-2 col-sm-12">LTA Storage Path</label>
+                                        <span className="col-lg-4 col-md-4 col-sm-12">{this.state.project.archive_subdirectory	}</span>
+                                    </div>
+                                    <div className="p-grid">
+                                        <label className="col-lg-2 col-md-2 col-sm-12">Prevent Automatic Deletion After Ingest</label>
+                                        <span className="col-lg-4 col-md-4 col-sm-12"><i className={this.state.project.auto_pin?'fa fa-check-circle':'fa fa-times-circle'}></i></span>
+                                    </div>
+                                    <div className="p-fluid">
+                                        <div className="p-field p-grid">
+                                            <div className="col-lg-3 col-md-3 col-sm-12">
+                                                <h5 data-testid="resource_alloc">Resource Allocations</h5>
+                                            </div>
+                                        </div>
+                                    </div>
+                                    {this.state.projectQuota.length===0 && 
+                                        <div className="p-field p-grid">
+                                            <div className="col-lg-12 col-md-12 col-sm-12">
+                                                <span>Reosurces not yet allocated. 
+                                                    <Link to={{ pathname: `/project/edit/${this.state.project.name}`, state: {id: this.state.project?this.state.project.name:''}}} title="Edit Project" > Click</Link> to add.
+                                                </span>
+                                            </div>
+                                        </div>
+                                    }
+                                    <div className="p-field p-grid resource-input-grid">
+                                        <ResourceDisplayList projectQuota={this.state.projectQuota}  unitMap={this.resourceUnitMap} />
+                                    </div>
+                                    {/* Show Schedule Unit belongs to Project */}
+                                    <div className="p-fluid">
+                                        <div className="p-field p-grid">
+                                            <div className="col-lg-3 col-md-3 col-sm-12">
+                                                <h5 data-testid="resource_alloc">Scheduling Unit - List</h5>
+                                            </div>
+                                        </div>
+                                    </div>
+                                    <SchedulingUnitList project={this.state.project.name} hideProjectColumn 
+                                        allowRowSelection={true} ref={suList => {this.suList = suList}} />
                                 </div>
-                            </div>
-                            <SchedulingUnitList project={this.state.project.name} hideProjectColumn 
-                                allowRowSelection={true} ref={suList => {this.suList = suList}} />
-                        </div>
-                    </React.Fragment>
-                }
+                            </React.Fragment>
+                        }
+                    </>: <AccessDenied/>}
+                </>}
             </React.Fragment>
         );
     }
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.category.data.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.category.data.js
index 066c8b18141e41e63f1280dbc871f7dd504f68c1..bd4b8277a40a0ae915f7a973999420e05a8918e5 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.category.data.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.category.data.js
@@ -20,7 +20,7 @@ class CycleCategoryWiseData extends Component{
     getBarData() {
         let reportData = this.getReportData(false);
         if (this.props.setExportData && reportData.length>0) {
-            this.props.setExportData('DataIngestedPerCateegory', reportData);
+            this.props.setExportData('DataIngestedPerCategory', reportData);
         }
         return {
             labels: _.map(reportData, 'cycle'),
@@ -100,11 +100,11 @@ class CycleCategoryWiseData extends Component{
             const cycleData = repData.data_ingested_per_site_and_category;
             categoryData['cycle'] = repData.cycle;
             // TODO: Update field names and values once API is complete
-            categoryData['rawIF'] = cycleData["Interferometric Observation"].dataproducts.length;
-            categoryData['rawBF'] = cycleData["Beamformed Observation"].dataproducts.length;
+            categoryData['rawIF'] = cycleData["Interferometric Observation"].size__sum;
+            categoryData['rawBF'] = cycleData["Beamformed Observation"].size__sum;
             categoryData['rawTBB'] = cycleData.rawTBB;
-            categoryData['preprocIF'] = cycleData["Preprocessing Pipeline"].dataproducts.length;
-            categoryData['pulpBF'] = cycleData["Pulsar Pipeline"].dataproducts.length;
+            categoryData['preprocIF'] = cycleData["Preprocessing Pipeline"].size__sum;
+            categoryData['pulpBF'] = cycleData["Pulsar Pipeline"].size__sum;
             categoryData['dynspecBF'] = cycleData.dynspecBF;
             reportData.push(categoryData);
         });
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.category.observations.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.category.observations.js
index bf776d5b221e8d5963ac9cf29615c545fe3f1a09..01952e2da0db554bdc8536ac2213a4154176a774 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.category.observations.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.category.observations.js
@@ -95,10 +95,10 @@ class CycleCategoryObservations extends Component{
         this.props.data.map(repData => {
             let cycleData = {}
             cycleData['cycle'] = repData.cycle;
-            cycleData['prio_A'] = repData.observation_hours_per_category.total_duration_A;
-            cycleData['prio_B'] = repData.observation_hours_per_category.total_duration_B;
-            cycleData['ddt_com_reg'] = repData.observation_hours_per_category.total_duration_ddt;
-            cycleData['unavailable'] = repData.observation_hours_per_category.total_duration_unavailable;
+            cycleData['prio_A'] = repData.observation_hours_per_category.total_duration_successful_A;
+            cycleData['prio_B'] = repData.observation_hours_per_category.total_duration_successful_B;
+            cycleData['ddt_com_reg'] = repData.observation_hours_per_category["DDT Com Rep"];
+            cycleData['unavailable'] = repData.observation_hours_per_category["System Unavailability"];
             cycleData['failed'] = repData.observation_hours_per_category.total_duration_failed;
             cycleData['idle'] = repData.observation_hours_per_category.total_duration_idle;
             reportData.push(cycleData);
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.cycle.completion.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.cycle.completion.js
index bdd10c32521f630bd8b76238ce1880d0ef7dfaf7..bd23220f57f438044fa2f48a1159c82332e367a2 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.cycle.completion.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.cycle.completion.js
@@ -127,7 +127,8 @@ class CycleCompletionLevel extends Component {
             const completionLevel = repData.completion_level;
             reportData.push( {cycle: repData.cycle, 
                     performed: completionLevel.total?parseInt((completionLevel.succeeded/completionLevel.total*100).toFixed(0)):null, 
-                    prognosis: completionLevel.total?parseInt((completionLevel.prognosis/completionLevel.total*100).toFixed(0)):null, 
+                    prognosis: completionLevel.total?parseInt((completionLevel.prognosis/completionLevel.total*100).toFixed(0)):null,
+                    // prognosis: completionLevel.prognosis,
                     target: repData.completion_level.target?repData.completion_level.target*100:null} );
         });
         if (forTable && reportData.length > 0) {
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.failure.rate.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.failure.rate.js
index 4fbf5c78569aef4c8c7ca17c9a7427d743bbd062..3dced22f2f7a7717140da9747300b67ac87acf72 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.failure.rate.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.failure.rate.js
@@ -101,13 +101,14 @@ class CycleFailureRate extends Component {
         // [{cycle: 'Cycle 15', failures: [{month: "2020-06-01", duration: 1200}, {month: "2020-07-01", duration: 1300},....]}]
         let reportData = {chartData: [], monthTableData: [], cycleTableData: []};
         _.map(data, repData=> {
-            const monthlyFailures = repData.failures;
+            const monthlyFailures = repData.failures.months;
             let cycleMonthlyFailures = []
             for (const failureData of monthlyFailures) {
                 cycleMonthlyFailures.push({   cycle: repData.cycle,
                                     date: failureData.month,
                                     month: moment(failureData.month).format("YYYY-MM"),
-                                    duration: failureData.duration?(failureData.duration/timeConversionFactor).toFixed(2):null
+                                    // duration: failureData.duration?(failureData.duration/timeConversionFactor).toFixed(2):null
+                                    duration: failureData.total_failed?(failureData.total_failed/timeConversionFactor).toFixed(2):null
                 });
             }
             reportData.chartData = reportData.chartData.concat(cycleMonthlyFailures);
@@ -115,7 +116,7 @@ class CycleFailureRate extends Component {
                 cycle: repData.cycle,
                 period: _.minBy(cycleMonthlyFailures, 'date')?
                         `${(_.minBy(cycleMonthlyFailures, 'date')).month} -  ${(_.maxBy(cycleMonthlyFailures, 'date')).month}`:'',
-                duration: ((_.sumBy(monthlyFailures, 'duration'))/timeConversionFactor).toFixed(2)
+                duration: ((_.sumBy(monthlyFailures, 'total_failed'))/timeConversionFactor).toFixed(2)
             });
         });
         reportData.monthTableData = reportData.chartData;
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.main.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.main.js
index 7e932aceb97f77e7447a5a08279a2c617207bbba..1838c322cfd2de742ebdea4475095d28ede75d6c 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.main.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.main.js
@@ -9,10 +9,12 @@ import ReactToPrint from "react-to-print";
 
 import { AutoComplete } from 'primereact/autocomplete';
 import { Calendar } from 'primereact/calendar';
+import { Checkbox } from 'primereact/checkbox';
 import { Button } from 'primereact/button';
 import { ProgressBar } from 'primereact/progressbar';
 import { AppLoader } from '../../../layout/components/AppLoader';
 import { appGrowl } from '../../../layout/components/AppGrowl';
+import { CustomDialog } from '../../../layout/components/CustomDialog';
 import CycleService from '../../../services/cycle.service';
 import ReportService from '../../../services/report.service';
 import CycleReportIntro from './report.intro';
@@ -51,7 +53,8 @@ class CycleReportMain extends Component {
             pageLoading: true,
             selectedCycles: [],   // Used by the Autocomplete field
             reportCycles: [],     // Used to generate the report for selected cycles
-            reportPeriod: []        // Period of reporting
+            reportPeriod: [],        // Period of reporting
+            dialog: null
         };
         this.searchCycles = this.searchCycles.bind(this);
         this.selectCycles = this.selectCycles.bind(this);
@@ -61,6 +64,12 @@ class CycleReportMain extends Component {
         this.downloadCSV = this.downloadCSV.bind(this);
         this.downloadPDF = this.downloadPDF.bind(this);
         this.clearAll = this.clearAll.bind(this);
+        this.toggleScroll = this.toggleScroll.bind(this);
+        this.csvDialogContent = this.csvDialogContent.bind(this);
+        this.showCSVReportDialog = this.showCSVReportDialog.bind(this);
+        this.changeCSVOption = this.changeCSVOption.bind(this);
+        this.selectAllCSVOptions = this.selectAllCSVOptions.bind(this);
+        this.closeDialog = this.closeDialog.bind(this);
     }
 
     componentDidMount() {
@@ -68,6 +77,7 @@ class CycleReportMain extends Component {
         .then(resourceList => {this.resourceList = resourceList});
         CycleService.getAllCyclesWithQuota()
         .then(cycles => {this.cycles = cycles; this.setState({cycles: cycles, pageLoading: false})});
+        window.addEventListener('scroll', this.toggleScroll);
     }
 
     /**
@@ -155,13 +165,103 @@ class CycleReportMain extends Component {
         this.setState({isDownloading: false});
     }
 
+    /**
+     * Report list shown in the dialog as checkbox to include or exclude while exporting CSV files.
+     * @returns Component
+     */
+    csvDialogContent() {
+        let allReports = _.keys(REPORT_VARIABLE_MAP);
+        allReports = allReports.splice(1);
+        const repWithData = _.keys(this.cyclesReportData); //this.state.reportNames;
+        let csvOptions = [];
+        for (const report of allReports) {
+            let csvOption = {name: report};
+            csvOption.disabled = repWithData.indexOf(report) < 0;
+            csvOption.checked = this.state.reportNames.indexOf(report) >= 0;
+            csvOptions.push(csvOption);
+        }
+        return (
+            <div className="fluid" className="csv-options-dlg-content">
+                <div className="col-lg-12" style={{padding: '5px'}}>
+                    <Checkbox inputId={`cb-all`} value="all" 
+                        checked={this.state.reportNames.length === _.keys(REPORT_VARIABLE_MAP).length-1}
+                        onChange={e => {this.selectAllCSVOptions()}}></Checkbox>
+                    <label htmlFor={`cb-all`} className="p-checkbox-label checkbox-label">All</label>
+                </div>
+                {csvOptions.map((item, index) => (
+                    <div className="col-lg-12" style={{padding: '5px'}}>
+                        <Checkbox inputId={`cb-${index}`} value={item.name} 
+                            checked={item.checked} disabled={item.disabled}
+                            onChange={e => {this.changeCSVOption(item.name, !item.checked)}}></Checkbox>
+                        <label htmlFor={`cb-${index}`} className={`p-checkbox-label checkbox-label${item.disabled?'-disabled':''}`}>{item.name}</label>
+                    </div>
+                ))}
+            </div>);
+    }
+
+    /**
+     * Function called when report is selected or unselected from the list
+     * @param {string} reportName - name of the report passed from the checkbox component of the list dialog
+     * @param {boolean} selected - to include or exclude
+     */
+    changeCSVOption(reportName, selected) {
+        let reportNames = this.state.reportNames;
+        if (selected) {
+            reportNames.push(reportName);
+        }   else {
+            reportNames = _.filter(reportNames, rep => rep !== reportName);
+        }
+        this.setState({reportNames: reportNames});
+    }
+
+    /**
+     * Select or Unselect all reports in the dialog
+     */
+    selectAllCSVOptions() {
+        let allReports = _.keys(REPORT_VARIABLE_MAP);
+        allReports = allReports.splice(1);
+        let repWithData = _.keys(this.cyclesReportData);
+        if (repWithData.length > this.state.reportNames.length) {
+            this.setState({reportNames: repWithData});
+        }   else {
+            this.setState({reportNames: []});
+        }
+    }
+
+    /**
+     * To show the dialog with reports to be selected or unselected for downloading as CSV files.
+     * @returns 
+     */
+    showCSVReportDialog() {
+        const reportNames = (this.state.reportNames && this.state.reportNames.length > 0)?
+                                this.state.reportNames: _.keys(this.cyclesReportData);
+        if (reportNames.length === 0) {
+            appGrowl.show({severity: 'info', summary: 'No Data', detail: 'None of the report has data to download'});
+            return;
+        }
+        let dialog = { header: "CSV Report(s) to download", width: "40vw", actions: null, showIcon: false};
+        dialog.detail = "Following selected reports will be downloaded. Report(s) with no data are disabled. Select/Unselect the reports of your interest and click 'Ok'";
+        dialog.content = this.csvDialogContent;
+        dialog.onSubmit = this.downloadCSV;
+        dialog.actions = [{ id: 'yes', title: 'Ok', callback: this.downloadCSV},
+                            { id: 'no', title: 'Cancel', callback: this.closeDialog}]
+        this.setState({csvDlgVisible: true, dialog: dialog, reportNames: reportNames});
+    }
+
+    /**
+     * Closes the dialog.
+     */
+    closeDialog() {
+        this.setState({csvDlgVisible: false});
+    }
+
     /**
      * Function to download the report data in CSV format
      */
     downloadCSV() {
-        const reportNames = _.keys(this.cyclesReportData);
+        const reportNames = this.state.reportNames;
         if (reportNames.length === 0) {
-            appGrowl.show({severity: 'info', summary: 'No Data', detail: 'None of the report has data to download'});
+            appGrowl.show({severity: 'info', summary: 'No Report Selected', detail: 'No report selected to download'});
         }
         // For every sub-report of the main report get report data
         for(const reportName of reportNames) {
@@ -205,13 +305,15 @@ class CycleReportMain extends Component {
             a.click();
             window.URL.revokeObjectURL(url);   
         }
+        this.setState({csvDlgVisible: false});
     }
 
     /**
      * Function called to set report cycles from the selected cycles.
      */
     async setReportCycles() {
-        this.setState({isLoading: true});
+        this.cyclesReportData = null;
+        this.setState({isLoading: true, cyclesReportData: [], reportNames: null});
         const cycleNames = _.map(_.orderBy(this.state.selectedCycles, 'start'), 'name');
         
         let cyclesReportData = [];
@@ -259,6 +361,27 @@ class CycleReportMain extends Component {
         this.setState({selectedCycles:[], reportPeriod:[], reportCycles:[]});
     }
 
+    /**
+     * Callback function to window scroll event listener to set or unset flag to show or hide ScrollToTop button
+     */
+    toggleScroll() {
+        const scrolled = document.documentElement.scrollTop;
+        if (scrolled > 300){
+            this.setState({scrollTopVisible: true});
+        } else if (scrolled <= 300){
+            this.setState({scrollTopVisible: false});
+        }
+    };
+
+    /**
+     * Function to scroll to top of the window on clicking ScrollToTop button.
+     */
+    scrollToTop() {
+        window.scrollTo({
+            top: 75, 
+            behavior: 'smooth'});
+    }
+
     render() {
         return(
             <React.Fragment>
@@ -294,7 +417,7 @@ class CycleReportMain extends Component {
                     <div ref={(el) => (this.reportDownloadBarRef = el)} >   
                         <Link to={{}} className="report-download-bar" style={{color: "#148048"}} 
                             title="Download Report Data in CSV format. Each report data will be downloaded as separate .csv file. Enable auto downloading multiple files in browser settings." 
-                            onClick={this.downloadCSV}>
+                            onClick={this.showCSVReportDialog}>
                             <i className="fas fa-file-csv"></i>
                         </Link> 
                         <Link to={{}} className="report-download-bar" style={{color: "#f20f00"}} title="Download Report as PDF" 
@@ -377,8 +500,20 @@ class CycleReportMain extends Component {
                     {/* Dummy reference div to scroll down before exporting to PDF so that 
                         all components will be rendered properly before exporting */}
                     <div ref={(el) => {this.reportEndRef = el}}></div>
+                    {/* Scroll To Top button */}
+                    {this.state.scrollTopVisible &&
+                        <Button className="p-button-info p-button-raised float-btn-right-bottom"
+                            onClick={this.scrollToTop}
+                            icon="pi pi-arrow-up" tooltip="Move to top"></Button>
+                    }
                 </>
                 }
+                {this.state.csvDlgVisible && 
+                    <CustomDialog type="confirmation" visible={this.state.csvDlgVisible}
+                        header={this.state.dialog.header} message={this.state.dialog.detail} actions={this.state.dialog.actions}
+                        content={this.state.dialog.content} width={this.state.dialog.width} showIcon={this.state.dialog.showIcon}
+                        onClose={this.closeDialog} onCancel={this.closeDialog} onSubmit={this.state.dialog.onSubmit}/>
+                }
             </React.Fragment>
         );
     }
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.project.summary.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.project.summary.js
index 9762566d3abe795cf768b45ac0bf033c0a46316c..d62705003a45ea5aadbef609192c9fe3b98910f6 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.project.summary.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/cycle/report.project.summary.js
@@ -30,7 +30,7 @@ class CycleProjectSummary extends Component{
                 projectData['cycle'] = repData.cycle;
                 projectData['project'] = projData.project;
                 // TODO: Update field names and values once API is complete
-                projectData['durationObserved'] = (projData.durations.total/timeConversionFactor).toFixed(2);
+                projectData['durationObserved'] = (projData.durations.total_observed/timeConversionFactor).toFixed(2);
                 projectData['durationProcessed'] = projData.durations.processed;
                 projectData['dataToSara'] = projData["Sara"];
                 projectData['dataToJuelich'] = projData["Juelich"];
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/project.report.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/project.report.js
index 2027e1dd191c89a89f2d947d94986636c18999d9..bb345c59ed062b7daa08ef196fc8bf2a9dd3020d 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/project.report.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/project.report.js
@@ -6,6 +6,7 @@ import { Bar } from 'react-chartjs-2';
 
 import ReportService from '../../services/report.service';
 import UnitConverter from '../../utils/unit.converter';
+import UIConstants from '../../utils/ui.constants';
 
 /**
  * Component to get report data and display them for a Project.
@@ -68,21 +69,21 @@ class ProjectReport extends Component {
                 let subs = projectReport["SUBs"][subStatus];
                 for (const sub of subs) {
                     let reportSub = _.cloneDeep(sub);
-                    reportSub.status = subStatus;
+                    // reportSub.status = subStatus;
                     suStatsList.push(reportSub);
                 }
             }
             suStatsList = _.orderBy(suStatsList, ['id']);
             for (const reportSub of suStatsList) {
-                if (reportSub.duration) {
-                    reportSub.observingTime = (reportSub.duration/timeFactor).toFixed(2);
-                    totalSUBObsTime += reportSub.duration;
+                if (reportSub.observed_duration) {
+                    reportSub.observingTime = (reportSub.observed_duration/timeFactor).toFixed(2);
+                    totalSUBObsTime += reportSub.observed_duration;
                     reportSub.observingTimeInc = (totalSUBObsTime / timeFactor).toFixed(2);
                     reportSub.observingTimeLeft = ((projectObservingTime - totalSUBObsTime)/timeFactor).toFixed(2);
                     reportSub.observingTimeIncPercent = (totalSUBObsTime/projectObservingTime*100).toFixed(2);
                 }
                 // For testing set duration as processDuration
-                reportSub.processDuration = reportSub.duration;    
+                reportSub.processDuration = reportSub.observed_duration;    
                 if (reportSub.processDuration) {
                     reportSub.processTime = (reportSub.processDuration/timeFactor).toFixed(2);
                     totalProcessTime += reportSub.processDuration;
@@ -91,13 +92,17 @@ class ProjectReport extends Component {
                     reportSub.processTimeIncPercent = (totalProcessTime / projectProcessTime *100).toFixed(2);
                 }
                 // For testing set dummy value for LTA dataproducts
-                reportSub["LTA dataproducts"] = {size__sum: 10737418240};
-                if (reportSub["LTA dataproducts"]) {
-                    reportSub.ingestDataSize = ((reportSub["LTA dataproducts"]["size__sum"] || 0)/dataSizeFactor).toFixed(2);
-                    totalLTAStorage += reportSub["LTA dataproducts"]["size__sum"];
+                // reportSub["LTA dataproducts"] = {size__sum: 10737418240};
+                // if (reportSub["LTA dataproducts"]) {
+                    reportSub.ingestDataSize = ((reportSub["ingested_data_size"] || 0)/dataSizeFactor).toFixed(2);
+                    totalLTAStorage += reportSub["ingested_data_size"];
                     reportSub.ingestDataIncPercent = (totalLTAStorage / projectLTAStorage * 100).toFixed(2);
-                }
-                delete reportSub["LTA dataproducts"];
+                // }
+                // delete reportSub["LTA dataproducts"];
+                reportSub.ingestDate = reportSub.ingested_date?moment.utc(reportSub.ingested_date).format(UIConstants.CALENDAR_DEFAULTDATE_FORMAT):"";
+                reportSub.execDate = moment.utc(reportSub.start).format(UIConstants.CALENDAR_DEFAULTDATE_FORMAT);
+                reportSub.observationSASId = reportSub["SAS ID"]["observation control"].join();
+                reportSub.pipelinseSASId = (reportSub["SAS ID"]["preprocessing pipeline"].concat(reportSub["SAS ID"]["pulsar pipeline"])).join(", ");
             }
 
             let observTimeUtilization = {type: 'Observing', value: parseFloat((totalSUBObsTime/timeFactor).toFixed(2)),
@@ -122,6 +127,59 @@ class ProjectReport extends Component {
         
     }
 
+    getTargetData() {
+        const projectObservingTime = this.state.projectResources["LOFAR Observing Time"]?this.state.projectResources["LOFAR Observing Time"].value:0;
+        const timeFactor = UnitConverter.resourceUnitMap["time"].conversionFactor;
+        const sapsData = this.state.reportData["SAPs exposure"];
+        const targets = _.keys(sapsData);
+        let targetReports = [];
+        for (let target of targets) {
+            let targetReport = {name: _.startCase(target)};
+            targetReport.exposure = parseFloat(sapsData[target] / timeFactor).toFixed(2);
+            targetReport.expPercent = parseFloat(sapsData[target] / projectObservingTime * 100 ).toFixed(2);
+            targetReports.push(targetReport);
+        }
+        let targetBarData = {
+            labels: _.map(targetReports, 'name'),
+            datasets: [
+                {   label: 'Exposure', 
+                    data: _.map(targetReports, 'expPercent'),
+                    backgroundColor: [
+                        '#44a3ce',
+                        '#44a3ce',
+                        '#44a3ce'
+                    ]
+                }
+            ]
+        };
+        let targetBarOptions = {
+            indexAxis: 'y',
+            elements: {
+                bar: { borderWidth: 1 },
+            },
+            scales: {
+                x: { max: 100 }
+            },
+            responsive: true,
+            plugins: {
+                legend: { position: 'right' },
+                title: {
+                    display: true,
+                    text: 'Target Exposure',
+                },
+                tooltip: {
+                    callbacks: {
+                        label: function(tooltipItem, data) {
+                            const itemData = _.find(targetReports, ['name', tooltipItem.label]);
+                            return `${itemData?itemData.expPercent:""}% (${itemData?itemData.exposure:""} hrs)`;
+                        }
+                    }
+                }
+            }
+        };
+        return {barData: targetBarData, barOptions: targetBarOptions};
+    }
+
     /**
      * Renders the SU table header component
      * @returns Component
@@ -173,7 +231,7 @@ class ProjectReport extends Component {
         const project = this.props.project;
         let barData = {}, barOptions = {};
         const resourceUtilization = this.state.resourceUtilization;
-
+        const targetData = reportData?this.getTargetData():null;
         // Resource Utilization bar chart data set with options
         if (resourceUtilization.length > 0) {
             barData = {
@@ -291,6 +349,12 @@ class ProjectReport extends Component {
                             </tbody>
                         </table>
                     </div>
+                    {targetData &&
+                    <div className="target-exposure" id={`${this.props.project.name}-target-exposure`}
+                        style={{paddingTop: "10px", paddingBottom: "10px"}}>
+                        <Bar data={targetData.barData} options={targetData.barOptions} width="50%" height="10"/>
+                    </div>
+                    }
                 </div>
                 </>
                 }
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/project.report.main.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/project.report.main.js
index b84b2b3fb3bfb329b730a69835f0d9f96db80017..ddf04ee5411093e210ccf06f7c04920f319e01b5 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/project.report.main.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/project.report.main.js
@@ -20,7 +20,7 @@ import ProjectReport from './project.report';
 // report data and title for displaying in reports and while exporting them.
 const SU_DETAILS_COLUMNS = [{name: "su_name", headerTitle: "SU Name & Link in TMSS", propertyName: "name"},
                             {name: "su_status", headerTitle: "SU Status Failed / Success ", propertyName: "status"},
-                            {name: "su_execDate", headerTitle: "SU Execution Date", propertyName: "exec_date"},
+                            {name: "su_execDate", headerTitle: "SU Execution Date", propertyName: "execDate"},
                             {name: "observTime", headerTitle: "Time Observed (hr)", propertyName: "observingTime"},
                             {name: "observTimeInc", headerTitle: "Time Observed Incremental (hr)", propertyName: "observingTimeInc"},
                             {name: "observTimeLeft", headerTitle: "Time left for Observing (hr)", propertyName: "observingTimeLeft"},
@@ -58,6 +58,7 @@ class ProjectReportMain extends Component {
         this.downloadCSV = this.downloadCSV.bind(this);
         this.downloadPDF = this.downloadPDF.bind(this);
         this.clearAll = this.clearAll.bind(this);
+        this.toggleScroll = this.toggleScroll.bind(this);
     }
 
     componentDidMount() {
@@ -67,6 +68,7 @@ class ProjectReportMain extends Component {
         .then(cycles => {this.cycles = cycles});
         ProjectService.getProjects()
         .then(projects => { this.setState({projects: projects, pageLoading: false}) });
+        window.addEventListener('scroll', this.toggleScroll);
     }
 
     /**
@@ -276,6 +278,27 @@ class ProjectReportMain extends Component {
         );
     }
 
+    /**
+     * Callback function to window scroll event listener to set or unset flag to show or hide ScrollToTop button
+     */
+     toggleScroll() {
+        const scrolled = document.documentElement.scrollTop;
+        if (scrolled > 300){
+            this.setState({scrollTopVisible: true});
+        } else if (scrolled <= 300){
+            this.setState({scrollTopVisible: false});
+        }
+    };
+
+    /**
+     * Function to scroll to top of the window on clicking ScrollToTop button.
+     */
+     scrollToTop() {
+        window.scrollTo({
+            top: 75, 
+            behavior: 'smooth'});
+    }
+
     render() {
         return(
             <React.Fragment>
@@ -327,6 +350,12 @@ class ProjectReportMain extends Component {
                     {/* Dummy reference div to scroll down before exporting to PDF so that 
                         all components will be rendered properly before exporting */}
                     <div ref={(el) => {this.reportEndRef = el}}></div>
+                    {/* Scroll To Top button */}
+                    {this.state.scrollTopVisible &&
+                        <Button className="p-button-info p-button-raised float-btn-right-bottom"
+                            onClick={this.scrollToTop}
+                            icon="pi pi-arrow-up" tooltip="Move to top"></Button>
+                    }
                 </>
                 }
             </React.Fragment>
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Reservation/reservation.create.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Reservation/reservation.create.js
index 510f8ccd624b9999e706c619a6e4035914ba676c..bfa70d3a2fd71f4aedb02a59a8540a70a0962288 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Reservation/reservation.create.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Reservation/reservation.create.js
@@ -672,7 +672,7 @@ export class ReservationCreate extends Component {
 
                     <CustomDialog type="confirmation" visible={this.state.showDialog} width="40vw"
                         header={'Add Reservation'} message={'Do you want to leave this page? Your changes may not be saved.'}
-                        content={''} onClose={this.cancelCreate} onCancel={this.close} onSubmit={this.cancelCreate}>
+                        content={''} onClose={this.close} onCancel={this.close} onSubmit={this.cancelCreate}>
                     </CustomDialog>
                 </div>
             </React.Fragment>
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Reservation/reservation.edit.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Reservation/reservation.edit.js
index 46e6f0f87d0ad4e0461e67ed4d31ae49e732c574..0263f87a5c5ea5823cd17c10c423b9b78fda99a8 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Reservation/reservation.edit.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Reservation/reservation.edit.js
@@ -630,7 +630,7 @@ export class ReservationEdit extends Component {
 
                 <CustomDialog type="confirmation" visible={this.state.showDialog} width="40vw"
                     header={'Edit Reservation'} message={'Do you want to leave this page? Your changes may not be saved.'}
-                    content={''} onClose={this.cancelEdit} onCancel={this.close} onSubmit={this.cancelEdit}>
+                    content={''} onClose={this.close} onCancel={this.close} onSubmit={this.cancelEdit}>
                 </CustomDialog>
 
             </React.Fragment>
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Reservation/reservation.list.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Reservation/reservation.list.js
index 17043373e5a652f6c9ccb8b0b3ce5278a587173e..aff992ee5c742cd9420160633e040d3539b7581a 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Reservation/reservation.list.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Reservation/reservation.list.js
@@ -17,6 +17,9 @@ import UIConstants from '../../utils/ui.constants';
 import ReservationService from '../../services/reservation.service'; 
 import CycleService from '../../services/cycle.service';
 import UtilService from '../../services/util.service';
+import AuthStore from '../../authenticate/auth.store';
+import AuthUtil from '../../utils/auth.util';
+import AccessDenied from '../../layout/components/AccessDenied';
 
 export class ReservationList extends Component{
     lsKeySortColumn = "ReservationListSortData";
@@ -80,9 +83,18 @@ export class ReservationList extends Component{
                     name: "Project",
                     filter:"select"
                 },
-                expert: "Expert",
-                hba_rfi: "HBA-RFI",
-                lba_rfi: "LBA-RFI",
+                expert: {
+                    name: "Expert",
+                    filter:"switch"
+                },
+                hba_rfi: {
+                    name: "HBA-RFI",
+                    filter: 'switch'
+                },
+                lba_rfi: {
+                    name: "LBA-RFI",
+                    filter: 'switch'
+                },
                 actionpath: "actionpath"
             }],
             optionalcolumns:  [{ 
@@ -104,6 +116,7 @@ export class ReservationList extends Component{
             defaultSortColumn: [{id: "System Id", desc: false}],
             isLoading: true,
             cycleList: [],
+            userrole: AuthStore.getState()
         }
 
         this.formRules = {
@@ -126,6 +139,8 @@ export class ReservationList extends Component{
         const promises = [  ReservationService.getReservations(),
             CycleService.getAllCycles(),
         ];
+        const permission = await AuthUtil.getUserRolePermission();
+        this.setState({userrole: permission});
              
         this.reservations = [];
         await Promise.all(promises).then(responses => {
@@ -417,12 +432,18 @@ export class ReservationList extends Component{
     }
 
     render() {
+        const permissions = this.state.userrole.userRolePermission.reservation;
         return ( 
             <React.Fragment>
                 <PageHeader location={this.props.location} title={'Reservation - List'} 
-                           actions={[{icon: 'fa-plus-square', title:'Add Reservation', props : { pathname: `/reservation/create`}},
+                           actions={[{icon: 'fa-plus-square', 
+                                    title:permissions.create?'Add Reservation': "Don't have permission to add new Reservation",
+                                    disabled: permissions.create? !permissions.create: true,
+                                    props : { pathname: `/reservation/create`}},
                                      {icon: 'fa-window-close', title:'Click to close Reservation list', props : { pathname: `/su/timelineview`}}]}/>     
                  {this.state.isLoading? <AppLoader /> : (this.state.reservationsList && this.state.reservationsList.length>0) ?
+                 <>
+                 {permissions.list?
                  <>
                     <div className="p-select " style={{position: 'relative'}}>
                         <div className="p-field p-grid">
@@ -489,8 +510,9 @@ export class ReservationList extends Component{
                     <div className="delete-option">
                         <div >
                             <span className="p-float-label">
-                                <a href="#" onClick={this.confirmDeleteReservations}  title="Delete selected Reservation(s)">
-                                    <i class="fa fa-trash" aria-hidden="true" ></i>
+                                <a href="#" onClick={permissions.delete?this.confirmDeleteReservations:()=>{}}
+                                    title={permissions.delete?"Delete selected Reservation(s)":"Don't have delete permission"}>
+                                    <i class={`fa fa-trash${permissions.delete?'':' fa-disabled'}`} aria-hidden="true" ></i>
                                 </a>
                             </span>
                         </div>                           
@@ -510,7 +532,9 @@ export class ReservationList extends Component{
                         toggleBySorting={(sortData) => this.toggleBySorting(sortData)}
                         lsKeySortColumn={this.lsKeySortColumn}
                         pageUpdated={this.pageUpdated}
+                        storeFilter={true}
                     />
+                    </>: <AccessDenied/>}
                 </>
                 : <div>No Reservation found </div>
                 }
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Reservation/reservation.summary.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Reservation/reservation.summary.js
index b8efdbb609987c7bc7e00837d9d6c9ba3c2d11ff..e1e5d89bbdb7fe920ad96933626ed1a220560b46 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Reservation/reservation.summary.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Reservation/reservation.summary.js
@@ -92,6 +92,17 @@ export class ReservationSummary extends Component {
         return specification;
     }
 
+    /**
+     * Funtion to open the reservation view page in same or new tab/window.
+     */
+    redirectToReservDetails = () => {
+        if (this.props.viewInNewWindow) {
+            window.open(`/reservation/view/${this.props.reservation.id}`, '_blank');
+        } else {
+            this.props.history.push(`/reservation/view/${this.props.reservation.id}`);
+        }
+    }
+
     render() {
         const reservation = this.props.reservation;
         let specifications = reservation?_.cloneDeep(reservation.specifications_doc):null;
@@ -105,8 +116,8 @@ export class ReservationSummary extends Component {
                 <div className="p-grid timeline-details-pane" style={{marginTop: '10px'}}>
                     <h6 className="col-lg-10 col-sm-10">Reservation Details</h6>
                     {/* TODO: Enable the link once Reservation view page is created */}
-                    {/* <Link to={`/su/timeline/reservation/view/${reservation.id}`} title="View Full Details" ><i className="fa fa-eye"></i></Link> */}
-                    <i className="fa fa-eye" style={{color: 'grey'}}></i>
+                    <Link onClick={this.redirectToReservDetails} title="View Full Details" ><i className="fa fa-eye"></i></Link>
+                    {/* <i className="fa fa-eye" style={{color: 'grey'}}></i> */}
                     <Link to={this.props.location?this.props.location.pathname:"/su/timelineview"} onClick={this.closeSUDets} title="Close Details"><i className="fa fa-times"></i></Link>
                     <div className="col-4"><label>Name:</label></div>
                     <div className="col-8">{reservation.name}</div>
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Reservation/reservation.view.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Reservation/reservation.view.js
index 1664a34d86f6ba722aa00506611da9d6a101a1e4..96369d608381b047184a8810a4b0488acdb315e7 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Reservation/reservation.view.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Reservation/reservation.view.js
@@ -13,6 +13,9 @@ import AppLoader from '../../layout/components/AppLoader';
 import PageHeader from '../../layout/components/PageHeader';
 import ReservationService from '../../services/reservation.service';
 import UnitConverter from '../../utils/unit.converter';
+import AuthStore from '../../authenticate/auth.store';
+import AuthUtil from '../../utils/auth.util';
+import AccessDenied from '../../layout/components/AccessDenied';
 
 export class ReservationView extends Component {
     constructor(props) {
@@ -20,6 +23,7 @@ export class ReservationView extends Component {
         this.state = {
             isLoading: true,
             confirmDialogVisible: false,
+            userrole: AuthStore.getState()
         };
         this.showIcon = false;
         this.dialogType = "confirmation";
@@ -44,7 +48,9 @@ export class ReservationView extends Component {
         
     }
 
-    componentDidMount() {
+    async componentDidMount() {
+        const permission = await AuthUtil.getUserRolePermission();
+        this.setState({userrole: permission})
         const reserId = this.props.match?this.props.match.params.id: null;
         this.getReservationDetails(reserId);
     }
@@ -129,6 +135,7 @@ export class ReservationView extends Component {
     }
 
     render() {
+        const permissions = this.state.userrole.userRolePermission.reservation;
         if (this.state.redirect) {
             return <Redirect to={ {pathname: this.state.redirect} }></Redirect>
         }
@@ -146,13 +153,20 @@ export class ReservationView extends Component {
         }
 
         let actions = [ ];
-        actions.push({ icon: 'fa-edit', title:'Click to Edit Reservation', props : { pathname:`/reservation/edit/${this.state.reservation?this.state.reservation.id:null}`}}); 
-        actions.push({ icon: 'fa fa-trash',title:'Click to Delete Reservation',  
+        actions.push({ icon: 'fa-edit', 
+                        title: permissions.edit?'Click to Edit Reservation': "Don't have permission to edit",
+                        disabled: permissions.edit? !permissions.edit : true,
+                        props : { pathname:`/reservation/edit/${this.state.reservation?this.state.reservation.id:null}`}}); 
+        actions.push({ icon: 'fa fa-trash',
+                        title: permissions.delete?'Click to Delete Reservation': "Don't have permission to delete",
+                        disabled: !permissions.delete,
                         type: 'button',  actOn: 'click', props:{ callback: this.showConfirmation}});
         actions.push({  icon: 'fa-window-close', link: this.props.history.goBack,
                         title:'Click to Close Reservation', props : { pathname:'/reservation/list' }});
         return (
             <React.Fragment>
+                {permissions.list ?
+                <>
                 <PageHeader location={this.props.location} title={'Reservation – Details'} actions={actions}/>
                 { this.state.isLoading? <AppLoader /> : this.state.reservation &&
                     <React.Fragment>
@@ -191,6 +205,7 @@ export class ReservationView extends Component {
                     content={this.dialogContent} onClose={this.onClose} onCancel={this.onCancel} onSubmit={this.callBackFunction}
                     showIcon={this.showIcon} actions={this.actions}>
                 </CustomDialog>
+                </>: <AccessDenied/>}
             </React.Fragment>
         );
     }
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/SchedulingUnitList.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/SchedulingUnitList.js
index 62f864e695ef95ebacc68d0e5341cc2d190611c8..990c1afc455317df16cbb52108fedb0fa2825449 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/SchedulingUnitList.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/SchedulingUnitList.js
@@ -28,36 +28,35 @@ class SchedulingUnitList extends Component{
     //Expand details for API Query
     SU_DRAFT_EXPAND = 'scheduling_set,scheduling_set.project,observation_strategy_template';
     SU_BLUEPRINT_EXPAND = 'draft,draft.scheduling_set,draft.scheduling_set.project,draft.observation_strategy_template';
+    COMMA_SEPARATE_TOOLTIP ='Enter Id and press ‘Enter’ key to search. For multiple values enter comma separated values. For range, provide input like 1..6';
 
     constructor(props){
        super(props);
        this. setToggleBySorting();
        this.defaultcolumns = {
-        status: {
-            name: "Status",
-            filter: "select",
-        },
-        workflowStatus: {name: "Workflow Status"},
-        suid: {name: "Scheduling Unit ID"},
-        project:{name:"Project",},
+        status: {name: "Status",filter: "select"},
+        workflowStatus: {name: "Workflow Status",filter: "select"},
+        suid: {name: "Scheduling Unit ID", tooltip: this.COMMA_SEPARATE_TOOLTIP},
+        project:{name:"Project"},
         name:{name:"Name",},
         description: {name: "Description"},
-        priority: {name: "Priority"},
-        suSet: {name: "Scheduling Set"},       
-        template_name: {name: "Template Name"},
-        template_description: {name: "Template Description"},
+        priority: {name: "Priority", filter: "numberRangeMinMax"},
+        scheduling_set: {name: "Scheduling Set",},       
+        observation_strategy_template_name: {name: "Template Name"},
+        observation_strategy_template_description: {name: "Template Description"},
         start_time:{
             name:"Start Time",
-            filter:"fromdatetime",
+            filter:"flatpickrDateRange",
             format:UIConstants.CALENDAR_DATETIME_FORMAT
         },
         stop_time:{
             name:"End Time",
-            filter:"todatetime",
+            filter:"flatpickrDateRange",
             format:UIConstants.CALENDAR_DATETIME_FORMAT
         },
         duration:{
             name:"Duration (HH:mm:ss)",
+            filter: "durationMinMax",
             format:UIConstants.CALENDAR_TIME_FORMAT
         },
         station_group: {name: "Stations (CS/RS/IS)"},
@@ -71,13 +70,15 @@ class SchedulingUnitList extends Component{
         if (props.hideProjectColumn) {
             delete this.defaultcolumns['project'];
         }
+        this.getUIAttr();
         this.STATUS_BEFORE_SCHEDULED = ['defining', 'defined', 'schedulable'];  // Statuses before scheduled to get station_group
         this.mainStationGroups = {};
         this.suTypeList = [{name: 'Blueprint'}, {name: 'Draft'}]
         this.totalPage = 0;
+        this.statusList = [];
         this.state = {
             showSpinner: false,
-            suType: "Draft",
+            suType: this.suUIAttr['listType'] || "Draft",
             columnOrders: [ 
                 "Status", 
                 "Workflow Status",
@@ -118,35 +119,32 @@ class SchedulingUnitList extends Component{
             defaultcolumns: [this.defaultcolumns],
             optionalcolumns:  [{
                 actionpath:"actionpath",
-                draft:{name: "Linked Blueprint Id"},
-                priority_queue: {name: "Priority Queue"},
-                priority_rank: {name: "Priority Rank"},
-                observation_strategy_template_id:{
-                    name: "Template ID",
-                    filter: "select"
-                },
+                draft:{name: "Linked Blueprint Id", tooltip: this.COMMA_SEPARATE_TOOLTIP},
+                priority_queue: {name: "Priority Queue", filter: "select"},
+                priority_rank: {name: "Priority Rank",filter: "rankMinMax"},
+                observation_strategy_template_id:{name: "Template ID", tooltip: 'Enter Id and press ‘Enter’ key to search'},
                 created_at:{
                     name:"Created_At",
-                    filter: "fromdatetime",
+                    filter: "flatpickrDateRange",
                     format:UIConstants.CALENDAR_DATETIME_FORMAT
                 },
                 updated_at:{
                     name:"Updated_At",
-                    filter: "todatetime",
+                    filter: "flatpickrDateRange",
                     format:UIConstants.CALENDAR_DATETIME_FORMAT
                 },
-                output_pinned:{name: "Prevent Autodeletion"},
+                output_pinned:{name: "Prevent Autodeletion", filter: "switch"},
             }],
             columnclassname: [{
-                "Scheduling Unit ID":"filter-input-50",
+                "Scheduling Unit ID":"filter-input-100",
                 "Template":"filter-input-50",
                 "Template Description": "filter-input-200",
                 "Scheduling Set": "filter-input-150",
                 "Project":"filter-input-100",
-                "Priority Rank":"filter-input-50",
-                "Duration (HH:mm:ss)":"filter-input-75",
-                "Linked Draft ID":"filter-input-50",
-                "Linked Blueprint ID":"filter-input-50",
+                "Priority Rank":"filter-input-75",
+                "Duration (HH:mm:ss)":"filter-input-100",
+                "Linked Draft ID":"filter-input-100",
+                "Linked Blueprint ID":"filter-input-100",
                 "Type": "filter-input-75",
                 "Status":"filter-input-100",
                 "workflowStatus":"filter-input-100",
@@ -155,11 +153,14 @@ class SchedulingUnitList extends Component{
                 "Number of SAPs in the target observation":"filter-input-50",
                 "Start Time":"filter-input-150",
                 "End Time":"filter-input-150",
+                "Created_At":"filter-input-150",
+                "Updated_At":"filter-input-150",
+                "Template ID":"filter-input-75",
             }],
             //defaultSortColumn: [{id: "Name", desc: false}],
             dialog: {header: 'Confirm', detail: 'Do you want to create a Scheduling Unit Blueprint?'}
         }
-        this.access_dined_message = "Don't have permission";
+        this.access_denied_message = "Don't have permission";
         this.lsKeySortColumn = "SchedulingUnit_"+this.state.suType+"_SortData";
         this.selectedRows = [];
         this.suDraftsList = []; // List of selected SU Drafts
@@ -320,11 +321,17 @@ class SchedulingUnitList extends Component{
                 columnDef[key]['disableSortBy'] = !_.includes(suFilters.data.ordering, tempKey);
                 columnDef[key]['disableFilters'] = false;
                 if(UIConstants.FILTER_MAP[suFilters.data.filters[tempKey].type]) {
-                    if (tempKey === 'draft') { //this condition because to avoid dropdown filter for 'Linked Draft ID'
+                    if (tempKey === 'draft' || tempKey === 'observation_strategy_template') { //this condition because to avoid dropdown filter for 'Linked Draft ID'
                         suFilters.data.filters[tempKey].type = 'CharFilter';
                     }
                     columnDef[key]['filter'] = UIConstants.FILTER_MAP[suFilters.data.filters[tempKey].type];
                 }
+            }   else if (key === 'draft' && suFilters.data.filters['scheduling_unit_blueprints']) {
+                columnDef[key]['disableSortBy'] = !_.includes(suFilters.data.ordering, 'scheduling_unit_blueprints');
+                columnDef[key]['disableFilters'] = false;
+            }   else if (key === 'duration' && suFilters.data.filters['duration_min']) {
+                columnDef[key]['disableSortBy'] = !_.includes(suFilters.data.ordering, 'duration_min');
+                columnDef[key]['disableFilters'] = false;
             }   else if (columnDef[key]['name']) {
                 columnDef[key]['disableSortBy'] = true;
                 columnDef[key]['disableFilters'] = true;
@@ -386,12 +393,25 @@ class SchedulingUnitList extends Component{
             this.removeColumns(tmpOptionalColumns, columnDefinitionToBeRemove);
         }
         if(suFilters) {
+            this.getStatusList(suFilters);
             tmpDefaulColumns = this.getAPIFilter(suFilters, tmpDefaulColumns);
             tmpOptionalColumns = this.getAPIFilter(suFilters, tmpOptionalColumns);
             await this.setState({tmpDefaulcolumns: [tmpDefaulColumns], tmpOptionalcolumns:[tmpOptionalColumns], tmpColumnOrders: tmpColumnOrders, columnMap: this.columnMap})
         }
     }
 
+    /**
+     * Get Status list frol filter
+     * @param {Array} suFilters 
+     */
+    getStatusList(suFilters) {
+        if (suFilters.data.filters['status']) {
+            suFilters.data.filters['status'].choices.forEach(choice => {
+                this.statusList.push(choice.value);
+            })
+        }
+    }
+
     /**
      * 
      * @param {Boolean} isInitial - true => While loading page, false => while doing server side access
@@ -427,7 +447,7 @@ class SchedulingUnitList extends Component{
         }   else {
             let scheduleunits = [];
             let expand = suType.toLowerCase() === 'draft' ? this.SU_DRAFT_EXPAND: this.SU_BLUEPRINT_EXPAND;
-            let response = await ScheduleService.getSchedulingUnitsExpandWithFilter(suType.toLowerCase(), expand, filterQry, orderBy, limit, offset);
+            let response = await ScheduleService.getSchedulingUnitsExpandWithFilter(suType.toLowerCase(), expand, filterQry, orderBy, limit, offset);          
             if (response && response.data) {
                 this.totalPage = response.data.count;
                 scheduleunits = response.data.results;
@@ -441,8 +461,8 @@ class SchedulingUnitList extends Component{
                     if (!this.props.project || (this.props.project && this.props.project === scheduleunit.scheduling_set.project.name)) {
                         scheduleunit['status'] = null;
                         scheduleunit['workflowStatus'] = null;
-                        scheduleunit['template_name'] = scheduleunit.observation_strategy_template.name;
-                        scheduleunit['template_description'] = scheduleunit.observation_strategy_template.description;
+                        scheduleunit['observation_strategy_template_name'] = scheduleunit.observation_strategy_template.name;
+                        scheduleunit['observation_strategy_template_description'] = scheduleunit.observation_strategy_template.description;
                         scheduleunit['draft'] = this.getLinksList(scheduleunit.scheduling_unit_blueprints_ids, 'blueprint');
                         scheduleunit['task_content'] = this.getTaskTypeGroupCounts(scheduleunit['task_drafts']);
                         scheduleunit['station_group'] = this.getStationGroup(scheduleunit).counts;
@@ -451,13 +471,13 @@ class SchedulingUnitList extends Component{
                         scheduleunit['duration'] = moment.utc((scheduleunit.duration || 0)*1000).format('HH:mm:ss');
                         scheduleunit.project = scheduleunit.scheduling_set.project.name;
                         scheduleunit.canSelect = true;
-                        scheduleunit.suSet = scheduleunit.scheduling_set.name;
                         scheduleunit.links = ['Project', 'id'];
                         scheduleunit.linksURL = {
                             'Project': `/project/view/${scheduleunit.scheduling_set.project.name}`,
                             'id': `/schedulingunit/view/draft/${scheduleunit.id}`
                         };
                         scheduleunit['suid'] =  scheduleunit.id;
+                        scheduleunit.scheduling_set = scheduleunit.scheduling_set.name;
                         output.push(scheduleunit);
                     }
                 }  
@@ -502,13 +522,13 @@ class SchedulingUnitList extends Component{
             }  else {
                 for( const scheduleunit  of scheduleunits){
                     this.draftIds.push(scheduleunit.draft_id);
-                    scheduleunit['suSet'] = scheduleunit.draft.scheduling_set.name;
                     scheduleunit['project'] = scheduleunit.draft.scheduling_set.project.name;
                     scheduleunit['links'] = ['Project', 'id'];
                     scheduleunit['linksURL'] = {
                                                 'Project': `/project/view/${scheduleunit.draft.scheduling_set.project.name}`,
                                                 'id': `/schedulingunit/view/blueprint/${scheduleunit.id}`
                                             };
+                    scheduleunit['scheduling_set'] = scheduleunit.draft.scheduling_set.name;
                     scheduleunit['workflowStatus'] = null;
                     const workflowProcess = _.find(this.state.workflowProcesses, ['su', scheduleunit.id]);
                     scheduleunit['workflowStatus'] = workflowProcess?workflowProcess.status: null;
@@ -516,8 +536,8 @@ class SchedulingUnitList extends Component{
                     scheduleunit.type= 'Blueprint'; 
                     scheduleunit['actionpath'] ='/schedulingunit/view/blueprint/'+scheduleunit.id;
                     scheduleunit['task_content'] = this.getTaskTypeGroupCounts(scheduleunit['task_blueprints']);
-                    scheduleunit['template_name'] = scheduleunit.draft? scheduleunit.draft.observation_strategy_template.name : '';
-                    scheduleunit['template_description'] = scheduleunit.draft? scheduleunit.draft.observation_strategy_template.description : '';
+                    scheduleunit['observation_strategy_template_name'] = scheduleunit.draft? scheduleunit.draft.observation_strategy_template.name : '';
+                    scheduleunit['observation_strategy_template_description'] = scheduleunit.draft? scheduleunit.draft.observation_strategy_template.description : '';
                     scheduleunit['observation_strategy_template_id'] = scheduleunit.draft? scheduleunit.draft.observation_strategy_template.id : '';
                     scheduleunit['station_group'] = this.getStationGroup(scheduleunit).counts;
                     scheduleunit['draft'] = this.getLinksList([scheduleunit.draft_id], 'draft'); //key 'drafts' used in filters, so use after process or change variable while fetching
@@ -581,7 +601,7 @@ class SchedulingUnitList extends Component{
             }
             return su;
         });
-       await this.setState({
+        await this.setState({
             scheduleunit: schedulingUnits, isLoading: false, optionalColumns: [optionalColumns],
             columnclassname: [columnclassname], loadingStatus: dataLoadstatus
         });
@@ -593,10 +613,31 @@ class SchedulingUnitList extends Component{
         this.setState({userrole: permission});
         //this.getUserRolePermission();
         this.pageUpdated = true;
+        this.getFilterColumns(this.state.suType.toLowerCase());
         this.getSchedulingUnitList(true, this.state.suType, this.filterQry, this.orderBy, this.limit, this.offset); 
         this.setToggleBySorting();
     }
 
+    /**
+     * Function to get the UI attributes from local storage that are stored in the previous view
+     */
+    getUIAttr() {
+        this.suUIAttr = UtilService.localStore({ type: 'get', 
+                            key: this.props.project?'PROJECT_VIEW_UI_ATTR':'SCHEDULE_LIST_UI_ATTR' }) || {};
+    }
+
+    /**
+     * Function that stores the preferred values in local storage to restore the same in the next view
+     * @param {string} key 
+     * @param {Object} value 
+     */
+    storeUIAttr(key, value) {
+        this.suUIAttr[key] = value;
+        UtilService.localStore({ type: 'set', 
+                                    key: this.props.project?'PROJECT_VIEW_UI_ATTR':'SCHEDULE_LIST_UI_ATTR', 
+                                    value: this.suUIAttr }); 
+    }
+    
     setToggleBySorting() {
         let sortData = null;
         if (this.lsKeySortColumn) {
@@ -1082,33 +1123,91 @@ class SchedulingUnitList extends Component{
             }
         }
         this.getSchedulingUnitList(false, this.state.suType.toLowerCase(),this.filterQry, this.orderBy, this.limit, this.offset);
+        this.storeUIAttr("listType", type);
     }
-    
+
     /**
      * Fetch data from server side - while doing pagination, filtering, sorting
      * @param {Table State} Table props state 
      * @returns 
      */
     async fetchTableData(state) {
+        // UtilService.localStore({ type: 'set', key: 'schedulingUnitFilter' ,value:state.filters});    
         this.filterQry = '';
         this.orderBy = '';
         this.pageUpdated = true;
         this.setState({loadingStatus:true});
-        for( const filter of state.filters) {
-            if (filter.id === 'Start Time') {
-                this.filterQry += 'start_time_after='+filter.value+'&start_time_before='+_.replace(filter.value, '00:00:00', '23:59:59')+'&';
-            }   else if (filter.id === 'End Time') {
-                //let end = moment.utc(moment(filter.value, 'YYYY-MM-DDTHH:mm:SS').format("YYYY-MM-DDTHH:mm:SS"));
-                //end = moment(end, "DD-MM-YYYY").add(1, 'days');
-                //filter.value = _.replace(filter.value, '00:00:00', '23:59:59');
-                this.filterQry += 'stop_time_after='+filter.value+'&stop_time_before='+_.replace(filter.value, '00:00:00', '23:59:59')+'&'
-            }   else {
-                let columnDetails = _.find(this.state.columnMap, {displayName:filter.id});
-                if(columnDetails) {
-                    this.filterQry += columnDetails.orgField +'='+filter.value+'&'
+        let filters = UtilService.localStore({ type: 'get', key: "scheduleunit_list_"+this.state.suType });
+        if(filters.length > 0 ) {
+            for( const filter of filters) {
+                if (filter.id === 'Start Time') {
+                    const values = _.split(filter.value, ",");
+                    if (values.length>2){
+                        continue;
+                    }
+                    if((values[0] && values[0] != '' && values[0] != 'null') && (values[1] && values[1] != '' && values[1] != 'null')) {
+                        this.filterQry += 'start_time_after='+ moment(new Date(values[0])).format("YYYY-MM-DDT00:00:00")+".000Z&";
+                        this.filterQry += 'start_time_before='+moment(new Date(values[1])).format("YYYY-MM-DDT23:59:59")+".000Z&";
+                    }
+                }   else if (filter.id === 'End Time') {
+                    const values = _.split(filter.value, ",");
+                    if (values.length>2){
+                        continue;
+                    }
+                    if((values[0] && values[0] != '' && values[0] != 'null') && (values[1] && values[1] != '' && values[1] != 'null')) {
+                        this.filterQry += 'stop_time_after='+ moment(new Date(values[0])).format("YYYY-MM-DDT00:00:00")+".000Z&";
+                        this.filterQry += 'stop_time_before='+moment(new Date(values[1])).format("YYYY-MM-DDT23:59:59")+".000Z&";
+                    }
+                }   else if ((filter.id === 'Scheduling Unit ID' || filter.id === 'Linked Draft ID') && filter.value != '') {
+                    let columnDetails = _.find(this.state.columnMap, {displayName:filter.id});
+                    const values = UnitConverter.getSubbandOutput(filter.value);
+                    this.filterQry +=  columnDetails.orgField+'='+values.toString()+"&";
+                }   else if (filter.id === 'Linked Blueprint ID' && filter.value != '') {
+                    const values = UnitConverter.getSubbandOutput(filter.value);//_.split(filter.value, ",");
+                    for ( const value of values) {
+                        this.filterQry += 'scheduling_unit_blueprints='+value+"&";
+                    }
+                }   else if (filter.id === 'Priority Rank' && filter.value != '') {
+                    const values = _.split(filter.value, ",");
+                    if (values[0] && values[0] !== '' && values[0]>0) {
+                        this.filterQry += "priority_rank_min" +'='+parseFloat(values[0])+'&';
+                    }
+                    if (values[1] && values[1] !== '' && values[1]>0) {
+                        this.filterQry += "priority_rank_max" +'='+parseFloat(values[1])+'&';
+                    }
+                }   else if ((filter.id === 'Created_At' || filter.id === 'Updated_At') && filter.value != '') {
+                    let columnDetails = _.find(this.state.columnMap, {displayName:filter.id});
+                    const values = _.split(filter.value, ",");
+                    if (values.length>2){
+                        continue;
+                    }
+                    if((values[0] && values[0] != '' && values[0] != 'null') && (values[1] && values[1] != '' && values[1] != 'null')) {
+                        this.filterQry += columnDetails.orgField+'_after='+ moment(new Date(values[0])).format("YYYY-MM-DDT00:00:00")+".000Z&";
+                        this.filterQry += columnDetails.orgField+'_before='+moment(new Date(values[1])).format("YYYY-MM-DDT23:59:59")+".000Z&";
+                    }
+                }   else if (filter.id === 'Duration (HH:mm:ss)' && filter.value != '') {
+                    let columnDetails = _.find(this.state.columnMap, {displayName:filter.id});
+                    const values = _.split(filter.value, ",");
+                    if (values[0].includes(":")) {
+                        this.filterQry += columnDetails.orgField+"_min" +'=PT'+UnitConverter.getHHmmssToSecs(values[0])+'S&';
+                    }
+                    if (values[1].includes(":")) {
+                        this.filterQry += columnDetails.orgField+"_max" +'=PT'+UnitConverter.getHHmmssToSecs(values[1])+'S&';
+                    }
+                    
+                }   else if (filter.id === 'Template ID' && filter.value != '') {
+                    // Since it is ModelChoiceFilter, it will allow single parameter, so use last parameter if contains multi parameter
+                    const values = _.split(filter.value, ",");
+                    this.filterQry += 'observation_strategy_template='+values[values.length-1]+"&";
+                }   else {
+                    let columnDetails = _.find(this.state.columnMap, {displayName:filter.id});
+                    if(columnDetails) {
+                        this.filterQry += columnDetails.orgField +'='+filter.value+'&'
+                    }
                 }
             }
         }
+
         let sortBy = state.sortBy?state.sortBy[0]:null;
         if (sortBy) {
             this.defaultSortColumn = sortBy;
@@ -1152,9 +1251,11 @@ class SchedulingUnitList extends Component{
     getFilterOptions(id) {
         let options = null;
         if(id && id === 'Status') {
-            options = UIConstants.SU_STATUS;
+            options = this.statusList;//UIConstants.SU_STATUS;
         }   else if (id === 'Linked Draft ID') {
             options = _.sortBy(this.draftIds);
+        }   else if (id === 'Priority Queue') {
+            options = UIConstants.SU_PRIORITY_QUEUE;
         }
         return options;
     }
@@ -1430,7 +1531,7 @@ class SchedulingUnitList extends Component{
                                 {this.state.suType === 'Draft' &&
                                     <>
                                         <a href="#" style={{marginLeft: "5px"}} onClick={this.checkAndCreateSUB} 
-                                            title={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.createsub ? "Create Blueprint(s)":this.access_dined_message} >
+                                            title={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.createsub ? "Create Blueprint(s)":`${this.access_denied_message} to create Blueprint(s)`} >
                                             <i class= {this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.createsub ?"fa fa-stamp":"fa fa-disabled fa-stamp"} 
                                             aria-hidden="true" ></i>
                                         </a>
@@ -1439,28 +1540,28 @@ class SchedulingUnitList extends Component{
                                 {this.state.suType === 'Blueprint' &&
                                     <>
                                         <a href="#" style={{marginLeft: "5px"}} onClick={this.cleanUpSUTask}
-                                            title={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.cleanuptask ? "Create Clean-up Task(s)":this.access_dined_message} > 
-                                            <i class={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.cleanuptask?"fa fa-recycle":"fa fa-disabled fa-recycle"}
+                                            title={this.state.userrole && this.state.userrole.userRolePermission.task_blueprint && this.state.userrole.userRolePermission.task_blueprint.canceltask ? "Create Clean-up Task(s)":`${this.access_denied_message} to create Clean-up Task(s)`} > 
+                                            <i class={this.state.userrole && this.state.userrole.userRolePermission.task_blueprint && this.state.userrole.userRolePermission.task_blueprint.canceltask?"fa fa-recycle":"fa fa-disabled fa-recycle"}
                                             aria-hidden="true" ></i>
                                         </a>
                                         <a href="#" style={{marginLeft: "5px"}} onClick={this.confirmCancelSchedulingUnit}
-                                            title={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.cancelsu ? "Cancel selected Scheduling Unit(s)":this.access_dined_message} > 
-                                            <i class={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.cancelsu?"fa fa-ban":"fa fa-disabled fa-ban"}
+                                            title={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit_blueprint && this.state.userrole.userRolePermission.scheduleunit_blueprint.edit ? "Cancel selected Scheduling Unit(s)":`${this.access_denied_message} to cancel Scheduling Unit(s)`} > 
+                                            <i class={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit_blueprint && this.state.userrole.userRolePermission.scheduleunit_blueprint.edit?"fa fa-ban":"fa fa-disabled fa-ban"}
                                             aria-hidden="true" ></i>
                                         </a>
                                     </>
                                 }
                                 <a href="#" style={{marginLeft: "5px"}} onClick={this.confirmAutoDeletion} 
-                                    title={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.autodeletion ? "Prevent/Allow Automatic Deletion":this.access_dined_message} > 
+                                    title={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.autodeletion ? "Prevent/Allow Automatic Deletion":`${this.access_denied_message} to allow/prevent Automatic Deletion`} > 
                                     <i class={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.autodeletion?"fa fa-thumbtack":"fa fa-disabled fa-thumbtack"}
                                     aria-hidden="true" ></i>
                                 </a>
                                 <a href="#" style={{marginLeft: "5px"}} onClick={this.confirmCopyingSU}
-                                    title={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.copysu ? "Copy Scheduling Unit(s) Draft/Blueprint":this.access_dined_message} > 
+                                    title={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.copysu ? "Copy Scheduling Unit(s) Draft/Blueprint":`${this.access_denied_message} to copy Scheduling Unit(s)`} > 
                                     <i class={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.copysu?"fa fa-copy":"fa fa-disabled fa-copy"} ></i>
                                 </a>                                
                                 <a href="#"  style={{marginLeft: "5px"}} onClick={this.checkAndDeleteSchedulingUnit} 
-                                    title={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.delete ? "Delete selected Scheduling Unit(s)":this.access_dined_message} > 
+                                    title={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.delete ? "Delete selected Scheduling Unit(s)":`${this.access_denied_message} to delete Scheduling Unit(s)`} > 
                                     <i class={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.delete?"fa fa-trash":"fa fa-disabled fa fa-trash"}
                                     aria-hidden="true" ></i>
                                 </a>
@@ -1469,11 +1570,11 @@ class SchedulingUnitList extends Component{
                             {this.props.project &&
                                     <>
                                         <Link style={{marginLeft: "5px"}} to={`${this.props.project?"/project/"+this.props.project:""}/schedulingunit/create`}
-                                            title={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.create ? "Add New Scheduling Unit to this Project":this.access_dined_message} > 
+                                            title={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.create ? "Add New Scheduling Unit to this Project":`${this.access_denied_message} to add new Scheduling Unit`} > 
                                             <i class={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.create?"fa fa-plus":"fa fa-disabled fa fa-plus"}
                                             ></i></Link>
                                         <Link style={{marginLeft: "5px"}} to={`${this.props.project?"/project/"+this.props.project:""}/schedulingset/schedulingunit/create`}
-                                            title={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.excelview ? "Add Scheduling Set to this Project":this.access_dined_message} > 
+                                            title={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.excelview ? "Add Scheduling Set to this Project":`${this.access_denied_message} to add/view Scheduling Set`} > 
                                             <i class={this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.excelview?"fa fa-table":"fa fa-disabled fa fa-table"}
                                             ></i></Link>
                                     </>
@@ -1507,6 +1608,7 @@ class SchedulingUnitList extends Component{
                         loadingStatus={this.state.loadingStatus}
                         showFilterOption={this.getFilterOptions} //Callback function to provide inputs for option-list in Select Dropdown filter
                         pageUpdated={this.pageUpdated}
+                        storeFilter={true}
                         setTableReloadFunction={this.setTableReloadFunction}
                         setTableState={this.setTableState}
                     />
@@ -1524,4 +1626,4 @@ class SchedulingUnitList extends Component{
     }
 }
 
-export default SchedulingUnitList
+export default SchedulingUnitList
\ No newline at end of file
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/ViewSchedulingUnit.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/ViewSchedulingUnit.js
index e96df454791789f150958828f4d145de3079be83..521de333fb73efe8270b8aabf42c01e90d8226ea 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/ViewSchedulingUnit.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/ViewSchedulingUnit.js
@@ -27,6 +27,8 @@ import UIConstants from '../../utils/ui.constants';
 import UtilService from '../../services/util.service';
 import { flattenDiagnosticMessageText } from 'typescript';
 import AuthUtil from '../../utils/auth.util';
+import AccessDenied from '../../layout/components/AccessDenied';
+import AuthStore from '../../authenticate/auth.store';
 
 class ViewSchedulingUnit extends Component {
     lsKeySortColumn = 'SortDataViewSchedulingUnit';
@@ -153,9 +155,11 @@ class ViewSchedulingUnit extends Component {
             dialogVisible: false,
             actions: [],
             dataformat: ['MeasurementSet'],
-            taskStatus: []
+            taskStatus: [],
+            userPermission: {permissions: AuthStore.getState().userRolePermission}
         }
-        this.access_dined_message = "Don't have permission";
+        this.statusList = [];
+        this.access_denied_message = "Don't have permission";
         this.actions = [];
         this.stations = [];
         this.constraintTemplates = [];
@@ -199,6 +203,7 @@ class ViewSchedulingUnit extends Component {
         this.getCleanUpDialogContent = this.getCleanUpDialogContent.bind(this);
         this.cleanUpSUTask = this.cleanUpSUTask.bind(this);
         this.confirmAutoDeletion = this.confirmAutoDeletion.bind(this);
+        this.getFilterOptions = this.getFilterOptions.bind(this);
     }
 
     componentDidUpdate(prevProps, prevState) {
@@ -213,14 +218,41 @@ class ViewSchedulingUnit extends Component {
         this.setState({ showTaskRelationDialog: !this.state.showTaskRelationDialog });
     }
 
+    /**
+     * Get Status list for UI drop downl
+     */
+    async getStatusList() {
+        const taskFilters = await TaskService.getTaskFilterDefinition('blueprint');
+        if (taskFilters && taskFilters.data.filters['status']) {
+            taskFilters.data.filters['status'].choices.forEach(choice => {
+                this.statusList.push(choice.value);
+            })
+        }
+    }
+
+    /**
+     * Get Option-list values for Select Dropdown filter in 'Viewtable'
+     * @param {String} id : Column id
+     * @returns 
+     */
+     getFilterOptions(id) {
+        let options = null;
+        if(id && id === 'Status') {
+            options = this.statusList;
+        }
+        return options;
+    }
+
     async componentDidMount() {
-        const permission = await AuthUtil.getUserRolePermission();
-        this.setState({userrole: permission});
-        //this.getUserRolePermission();
+        this.getStatusList();
+        let permission = (await AuthUtil.getUserRolePermission());
+        permission = { permissions: permission.userRolePermission};
         this.pageUpdated = true;
         this.setToggleBySorting();
         let schedule_id = this.props.match.params.id;
         let schedule_type = this.props.match.params.type;
+        const permissionById = await AuthUtil.getUserPermissionByModuleId('scheduling_unit_draft', schedule_id)
+        this.setState({userPermission: permission, permissionById: permissionById, schedule_id: schedule_id});
         if (schedule_type && schedule_id) {
             this.stations = await ScheduleService.getStationGroup();
             this.setState({ stationOptions: this.stations });
@@ -284,7 +316,7 @@ class ViewSchedulingUnit extends Component {
                     await Promise.all(tasks.map(async task => {
                         task.status_logs = task.tasktype === "Blueprint" ? this.subtaskComponent(task) : "";
                         //Displaying SubTask ID of the 'control' Task
-                        const subTaskIds = task.subTasks ? task.subTasks.filter(sTask => sTask.subTaskTemplate.name.indexOf('control') >= 0) : [];
+                        const subTaskIds = task.subTasks ? task.subTasks.filter(sTask => sTask.subTaskTemplate?(sTask.subTaskTemplate.name.indexOf('control') >= 0):false) : [];
                         const promise = [];
                         subTaskIds.map(subTask => promise.push(ScheduleService.getSubtaskOutputDataproduct(subTask.id)));
                         const dataProducts = promise.length > 0 ? await Promise.all(promise) : [];
@@ -336,21 +368,22 @@ class ViewSchedulingUnit extends Component {
     /**
      * Get action menus for page header
      */
-     getActionMenu(schedule_type, isIngestPresent) {
+    getActionMenu(schedule_type, isIngestPresent) {
+        const userPermissions = this.state.userPermission?this.state.userPermission.permissions:{};
         this.actions = []; 
         this.actions.unshift({
             icon: 'fa-copy', 
-            title: this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.copysu?'Copy Draft/Blueprint':this.access_dined_message, 
+            title: userPermissions.scheduleunit && userPermissions.scheduleunit.copysu?'Copy Draft/Blueprint':`${this.access_denied_message} to copy`, 
             type: 'button',
-            disabled: this.state.userrole && this.state.userrole.userRolePermission.scheduleunit?!this.state.userrole.userRolePermission.scheduleunit.copysu:true,
+            disabled: userPermissions.scheduleunit?!userPermissions.scheduleunit.copysu:true,
             actOn: 'click', props: { callback: this.confirmCopyingSU },
         });           
         let canDelete = (this.state.scheduleunit &&
             (!this.state.scheduleunit.scheduling_unit_blueprints_ids || this.state.scheduleunit.scheduling_unit_blueprints_ids.length === 0));                 
         this.actions.push({
             icon: 'fa fa-trash',
-            title: this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.delete?!canDelete ? 'Cannot delete Draft when Blueprint exists' : 'Delete Scheduling Unit':this.access_dined_message, 
-            disabled: this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.delete?canDelete?false:true : true,
+            title: userPermissions.scheduleunit && userPermissions.scheduleunit.delete?!canDelete ? 'Cannot delete Draft when Blueprint exists' : 'Delete Scheduling Unit':`${this.access_denied_message} to delete`, 
+            disabled: userPermissions.scheduleunit && userPermissions.scheduleunit.delete?canDelete?false:true : true,
             type: 'button', actOn: 'click', props: { callback: this.showDeleteSUConfirmation }
         });
         this.actions.push({ icon: 'fa-window-close', title: 'Click to Close Scheduling Unit View', link: this.props.history.goBack });
@@ -359,58 +392,58 @@ class ViewSchedulingUnit extends Component {
             if(isIngestPresent) {
                 this.actions.unshift({
                     icon: 'fa-file-import', 
-                    title: this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.dataproduct?'Data Products To Ingest':this.access_dined_message, 
+                    title: userPermissions.scheduleunit && userPermissions.scheduleunit.dataproduct?'Data Products To Ingest':`${this.access_denied_message} to edit dataproducts to ingest`, 
                     type: 'button',
-                    disabled: this.state.userrole && this.state.userrole.userRolePermission.scheduleunit?!this.state.userrole.userRolePermission.scheduleunit.dataproduct:true,
+                    disabled: userPermissions.scheduleunit?!userPermissions.scheduleunit.dataproduct:true,
                     actOn: 'click', props: { callback: this.showTaskRelationDialog }
                 });
             }
             this.actions.unshift({
                 icon: 'fa-edit', 
-                title: this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.edit?'Click to edit':this.access_dined_message, 
-                disabled: this.state.userrole && this.state.userrole.userRolePermission.scheduleunit?!this.state.userrole.userRolePermission.scheduleunit.edit:true,
+                title: this.state.permissionById[this.state.schedule_id].edit?'Click to edit':`${this.access_denied_message} to edit`, 
+                disabled: this.state.permissionById[this.state.schedule_id].edit?!this.state.permissionById[this.state.schedule_id].edit:true,
                 props: { pathname: `/schedulingunit/edit/${this.props.match.params.id}` }
             });
             this.actions.unshift({
                 icon: 'fa-stamp', 
-                title: this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.createsub?blueprintExist?'Blueprint already exists': 'Create Blueprint':this.access_dined_message, 
+                title: userPermissions.scheduleunit && userPermissions.scheduleunit.createsub?blueprintExist?'Blueprint already exists': 'Create Blueprint':`${this.access_denied_message} to create Blueprint`,
                 type: 'button',
-                disabled: this.state.userrole && this.state.userrole.userRolePermission.scheduleunit?!this.state.userrole.userRolePermission.scheduleunit.createsub:true,
+                disabled: userPermissions.scheduleunit?!userPermissions.scheduleunit.createsub:true,
                 actOn: 'click', disabled: blueprintExist, props: { callback: this.checkAndCreateBlueprint },
             });
         } else {
             this.actions.unshift({ 
                 icon: 'fa-thumbtack', 
-                title: this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.autodeletion?this.state.scheduleunit.output_pinned? 'Allow Automatic Deletion' : 'Prevent Automatic Deletion':this.access_dined_message, 
-                disabled: this.state.userrole && this.state.userrole.userRolePermission.scheduleunit?!this.state.userrole.userRolePermission.scheduleunit.autodeletion:true,
+                title: userPermissions.scheduleunit && userPermissions.scheduleunit.autodeletion?this.state.scheduleunit.output_pinned? 'Allow Automatic Deletion' : 'Prevent Automatic Deletion':`${this.access_denied_message} to allow/prevent automatic deletion`, 
+                disabled: userPermissions.scheduleunit?!userPermissions.scheduleunit.autodeletion:true,
                 type: 'button', actOn: 'click', props: { callback: this.confirmAutoDeletion } 
             });
             if(isIngestPresent) {
                 this.actions.unshift({
                     icon: 'fa-file-import', 
-                    title: this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.dataproduct?'Data Products To Ingest':this.access_dined_message, 
+                    title: userPermissions.scheduleunit && userPermissions.scheduleunit.dataproduct?'Data Products To Ingest':`${this.access_denied_message} to edit dataproducts to ingest`, 
                     type: 'button',
-                    disabled:  this.state.userrole && this.state.userrole.userRolePermission.scheduleunit?!this.state.userrole.userRolePermission.scheduleunit.dataproduct:!(this.state.scheduleunit.status === 'defined' || this.state.scheduleunit.status === 'scheduled' || this.state.scheduleunit.status === 'schedulable'),                    
+                    disabled:  userPermissions.scheduleunit?!userPermissions.scheduleunit.dataproduct:!(this.state.scheduleunit.status === 'defined' || this.state.scheduleunit.status === 'scheduled' || this.state.scheduleunit.status === 'schedulable'),                    
                     actOn: 'click', props: { callback: this.showTaskRelationDialog }
                 });
             }
             this.actions.unshift({
                 icon: 'fa-ban', type: 'button', actOn: 'click',
-                title: this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.cancelsu?this.SU_END_STATUSES.indexOf(this.state.scheduleunit.status.toLowerCase())>=0?'Cannot Cancel Scheduling Unit':'Cancel Scheduling Unit':this.access_dined_message,  
-                disabled:this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.cancelsu? this.SU_END_STATUSES.indexOf(this.state.scheduleunit.status.toLowerCase())>=0 ? true : false:true, 
+                title: userPermissions.scheduleunit_blueprint && userPermissions.scheduleunit_blueprint.edit?this.SU_END_STATUSES.indexOf(this.state.scheduleunit.status.toLowerCase())>=0?'Cannot Cancel Scheduling Unit':'Cancel Scheduling Unit':`${this.access_denied_message} to cancel Scheduling Unit`,  
+                disabled:userPermissions.scheduleunit_blueprint && userPermissions.scheduleunit_blueprint.edit? this.SU_END_STATUSES.indexOf(this.state.scheduleunit.status.toLowerCase())>=0 ? true : false:true, 
                 props: { callback: this.showCancelSUConfirmation }
             });            
             this.actions.unshift({
                 icon: 'fa fa-recycle', 
-                title: this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.cleanuptask?'Create Clean-up Task':this.access_dined_message, 
+                title: userPermissions.scheduleunit_blueprint && userPermissions.scheduleunit_blueprint.add?'Create Clean-up Task':`${this.access_denied_message} to create Clean-up Task`, 
                 type: 'button',
-                disabled: this.state.userrole && this.state.userrole.userRolePermission.scheduleunit?!this.state.userrole.userRolePermission.scheduleunit.cleanuptask:true,
+                disabled: userPermissions.scheduleunit_blueprint?!userPermissions.scheduleunit_blueprint.add:true,
                 actOn: 'click', props: { callback: this.cleanUpSUTask }
             });
             this.actions.unshift({ 
                 icon: 'fa-sitemap', 
-                title: this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.viewworkflow?'View Workflow':this.access_dined_message, 
-                disabled: this.state.userrole && this.state.userrole.userRolePermission.scheduleunit?!this.state.userrole.userRolePermission.scheduleunit.viewworkflow:true,
+                title: userPermissions.scheduleunit && userPermissions.scheduleunit.viewworkflow?'View Workflow':`${this.access_denied_message} to view Workflow`, 
+                disabled: userPermissions.scheduleunit?!userPermissions.scheduleunit.viewworkflow:true,
                 props: { pathname: `/schedulingunit/${this.props.match.params.id}/workflow` } });
             this.actions.unshift({ icon: 'fa-lock', title: 'Cannot edit blueprint' });            
         }
@@ -1257,15 +1290,18 @@ class ViewSchedulingUnit extends Component {
      * Get current user role permission for selected Schedule Unit
      */
     // getUserRolePermission = async () => {
-    //     await userrole.dispatch({ type: 'scheduleunit' });
-    //     this.setState({userrole: userrole.getState()});
+    //     await userPermission.dispatch({ type: 'scheduleunit' });
+    //     this.setState({userPermission: userPermission.getState()});
     // }
 
     render() {
         if (this.state.redirect) {
             return <Redirect to={{ pathname: this.state.redirect }}></Redirect>
         }
+        const userPermissions = this.state.userPermission.permissions;
         return (
+            <>
+            {userPermissions.scheduleunit.list ?
             <>
                 <PageHeader location={this.props.location} title={'Scheduling Unit - Details'}
                     actions={this.state.actions} />
@@ -1360,17 +1396,34 @@ class ViewSchedulingUnit extends Component {
                     
                 */}
 
+                
                 <div className="delete-option">
                     <div >
                         <span className="p-float-label">
                             {this.state.schedulingUnitTasks && this.state.schedulingUnitTasks.length > 0 &&
                                 <>
-                                    <a href="#" onClick={this.confirmCancelTasks} title="Cancel selected Task(s)">
-                                        <i class="fa fa-ban" aria-hidden="true" ></i>
-                                    </a>
-                                    <a href="#" onClick={this.confirmDeleteTasks} title="Delete selected Task(s)">
-                                        <i class="fa fa-trash" aria-hidden="true" ></i>
-                                    </a>
+                                    {this.props.match.params.type === 'draft' &&
+                                    <>
+                                        <a href="#" onClick={this.confirmCancelTasks} 
+                                        title={userPermissions.task_draft.canceltask?"Cancel selected Task(s)": `${this.access_denied_message} to cancel Task(s)`}>
+                                            <i class={userPermissions.task_draft.canceltask?"fa fa-ban":"fa fa-ban fa-disabled"} aria-hidden="true" ></i>
+                                        </a>
+                                        <a href="#" style={{ pointerEvents: this.props.disabled ? 'none' : 'auto' }}onClick={this.confirmDeleteTasks} 
+                                            title={userPermissions.task.delete?"Delete selected Task(s)": `${this.access_denied_message} to delete Task(s)`} >
+                                            <i class={userPermissions.task.delete?"fa fa-trash":"fa fa-trash fa-disabled"}  aria-hidden="true" ></i>
+                                        </a>
+                                    </>
+                                    }
+                                    {this.props.match.params.type === 'blueprint' &&
+                                    <>
+                                        <a href="#" onClick={this.confirmCancelTasks} 
+                                            title={userPermissions.task_blueprint.canceltask?"Cancel selected Task(s)": `${this.access_denied_message} to cancel Task(s)`}>
+                                            <i class={userPermissions.task_blueprint.canceltask?"fa fa-ban":"fa fa-ban fa-disabled"} aria-hidden="true" ></i></a>
+                                        <a href="#" style={{ pointerEvents: this.props.disabled ? 'none' : 'auto' }}onClick={this.confirmDeleteTasks} 
+                                            title={userPermissions.task.delete?"Delete selected Task(s)": `${this.access_denied_message} to delete Task(s)`} >
+                                            <i class={userPermissions.task.delete?"fa fa-trash":"fa fa-trash fa-disabled"}  aria-hidden="true" ></i></a>
+                                    </>
+                                    }
                                 </>
                             }
                         </span>
@@ -1384,11 +1437,12 @@ class ViewSchedulingUnit extends Component {
                         optionalcolumns={this.state.optionalcolumns}
                         columnclassname={this.state.columnclassname}
                         columnOrders={this.state.columnOrders}
+                        showFilterOption={this.getFilterOptions} //Callback function to provide inputs for option-list in Select Dropdown filter
                         showaction="true"
                         keyaccessor="id"
                         paths={this.state.paths}
                         unittest={this.state.unittest}
-                        tablename="scheduleunit_task_list"
+                        tablename={`scheduleunit_${this.props.match.params.type}_task_list`}
                         allowRowSelection={true}
                         onRowSelection={this.onRowSelection}
                         ignoreSorting={this.ignoreSorting}
@@ -1396,6 +1450,7 @@ class ViewSchedulingUnit extends Component {
                         toggleBySorting={(sortData) => this.toggleBySorting(sortData)}
                         defaultSortColumn={this.defaultSortColumn}
                         pageUpdated={this.pageUpdated}
+                        storeFilter={true}
                     />
                     : <div>No Tasks found</div>
                 }
@@ -1423,7 +1478,8 @@ class ViewSchedulingUnit extends Component {
                 {this.state.showStatusLogs &&
                     <Dialog header={`Status change logs - ${this.state.task ? this.state.task.name : ""}`}
                         visible={this.state.showStatusLogs} maximizable maximized={false} position="left" style={{ width: '50vw' }}
-                        onHide={() => { this.setState({ showStatusLogs: false }) }}>
+                        onHide={() => { this.setState({ showStatusLogs: false }) }}
+                        className="content_dlg">
                         <TaskStatusLogs taskId={this.state.task.id}></TaskStatusLogs>
                     </Dialog>
                 }
@@ -1458,7 +1514,9 @@ class ViewSchedulingUnit extends Component {
                     showIcon={this.showIcon} onClose={this.cancelDialog} onCancel={this.cancelDialog} onSubmit={this.submitTaskReplationDialog}>
                 </CustomDialog>
                 <CustomPageSpinner visible={this.state.showSpinner} />
+            </> : <AccessDenied/>}
             </>
+
         )
     }
 }
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/create.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/create.js
index f71d9c67ae576a8a4670b29e8f39216f25818554..069dd9273fb2ae3ae9ffad52bc369fb15a57ad63 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/create.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/create.js
@@ -28,6 +28,7 @@ import { CustomDialog } from '../../layout/components/CustomDialog';
 import SchedulingSet from './schedulingset.create';
 import UtilService from '../../services/util.service';
 import ReactTooltip from "react-tooltip";
+import AuthUtil from '../../utils/auth.util';
 
 /**
  * Component to create a new SchedulingUnit from Observation strategy template
@@ -36,6 +37,7 @@ export class SchedulingUnitCreate extends Component {
     constructor(props) {
         super(props);
         this.state = {
+            userrole: {},
             selectedProject: {},
             showAddSet: false,
             showDialog: false,
@@ -99,7 +101,9 @@ export class SchedulingUnitCreate extends Component {
         this.setSUSet = this.setSUSet.bind(this);
     }
 
-    componentDidMount() {
+    async componentDidMount() {
+        const permission = await AuthUtil.getUserPermissionByModule('scheduleunit_draft');
+        this.setState({userrole: permission});
         const promises = [  ProjectService.getProjectList(), 
                             ScheduleService.getSchedulingSets(),
                             ScheduleService.getObservationStrategies(),
@@ -166,36 +170,41 @@ export class SchedulingUnitCreate extends Component {
         const $strategyRefs = await $RefParser.resolve(observStrategy.template);
         // TODo: This schema reference resolving code has to be moved to common file and needs to rework
         for (const param of parameters) {
+            // TODO: make parameter handling more generic, instead of task specific.
+            if (!param.refs[0].startsWith("#/tasks/")) { continue; }
+
             let taskPaths = param.refs[0].split("/");
             const taskName = taskPaths[2];
             taskPaths = taskPaths.slice(4, taskPaths.length);
             const task = tasks[taskName];
-            const taskTemplate = _.find(this.taskTemplates, {'name': task['specifications_template']});
-            if (taskTemplate.type_value==='observation' && task.specifications_doc.station_groups) {
-                station_group = task.specifications_doc.station_groups;
-            }
-            // Get the default Bandpass filter and pass to the editor to for frequency calculation from subband list
-            if (taskTemplate.type_value === 'observation' && task.specifications_doc.filter) {
-                bandPassFilter = task.specifications_doc.filter;
-            }   else if (taskTemplate.type_value === 'observation' && taskTemplate.schema.properties.filter) {
-                bandPassFilter = taskTemplate.schema.properties.filter.default;
-            }
-            let taskTemplateSchema = this.taskTemplateSchemas[task['specifications_template']];
-            if (!taskTemplateSchema) {
-                taskTemplateSchema = _.find(this.taskTemplates, {'name': task['specifications_template']}).schema;
-                taskTemplateSchema = await UtilService.resolveSchema(_.cloneDeep(taskTemplateSchema));
-                //TODO: change the code to make custom fields work for server side resolved schema.
-                // taskTemplateSchema = await UtilService.getResolvedSchema(taskTemplate.url);
-                this.taskTemplateSchemas[task['specifications_template']] = taskTemplateSchema;
-            }
-            schema.definitions = {...schema.definitions, ...taskTemplateSchema.definitions};
-            taskPaths.reverse();
-            const paramProp = await ParserUtility.getParamProperty($strategyRefs, taskPaths, taskTemplateSchema, param);
-            schema.properties[param.name] = _.cloneDeep(paramProp);
-            if (schema.properties[param.name]) {
-                schema.properties[param.name].title = param.name;
-                schema.properties[param.name].default = $strategyRefs.get(param.refs[0]);
-                paramsOutput[param.name] = schema.properties[param.name].default; 
+            if (task) {
+                const taskTemplate = _.find(this.taskTemplates, {'name': task['specifications_template']});
+                if (taskTemplate.type_value==='observation' && task.specifications_doc.station_groups) {
+                    station_group = task.specifications_doc.station_groups;
+                }
+                // Get the default Bandpass filter and pass to the editor to for frequency calculation from subband list
+                if (taskTemplate.type_value === 'observation' && task.specifications_doc.filter) {
+                    bandPassFilter = task.specifications_doc.filter;
+                }   else if (taskTemplate.type_value === 'observation' && taskTemplate.schema.properties.filter) {
+                    bandPassFilter = taskTemplate.schema.properties.filter.default;
+                }
+                let taskTemplateSchema = this.taskTemplateSchemas[task['specifications_template']];
+                if (!taskTemplateSchema) {
+                    taskTemplateSchema = _.find(this.taskTemplates, {'name': task['specifications_template']}).schema;
+                    taskTemplateSchema = await UtilService.resolveSchema(_.cloneDeep(taskTemplateSchema));
+                    //TODO: change the code to make custom fields work for server side resolved schema.
+                    // taskTemplateSchema = await UtilService.getResolvedSchema(taskTemplate.url);
+                    this.taskTemplateSchemas[task['specifications_template']] = taskTemplateSchema;
+                }
+                schema.definitions = {...schema.definitions, ...taskTemplateSchema.definitions};
+                taskPaths.reverse();
+                const paramProp = await ParserUtility.getParamProperty($strategyRefs, taskPaths, taskTemplateSchema, param);
+                schema.properties[param.name] = _.cloneDeep(paramProp);
+                if (schema.properties[param.name]) {
+                    schema.properties[param.name].title = param.name;
+                    schema.properties[param.name].default = $strategyRefs.get(param.refs[0]);
+                    paramsOutput[param.name] = schema.properties[param.name].default; 
+                }
             }
         }
         this.setState({observStrategy: observStrategy, paramsSchema: _.cloneDeep(schema), 
@@ -553,6 +562,7 @@ export class SchedulingUnitCreate extends Component {
             return <Redirect to={ {pathname: this.state.redirect} }></Redirect>
         }
         const schema = this.state.paramsSchema;
+        const {scheduleunit_draft} = this.state.userrole;
         
         let jeditor = null;
         if (schema) {
@@ -632,7 +642,7 @@ export class SchedulingUnitCreate extends Component {
                                         onClick={() => {this.setState({showAddSet: true})}}  
                                         tooltip="Add new Scheduling Set"
                                         style={{marginLeft: '-10px'}}
-                                        disabled={this.state.schedulingUnit.project !== null ? false : true }/>
+                                        disabled={this.state.schedulingUnit.project !== null && scheduleunit_draft.scheduling_set? false : true }/>
 
                                 
                             </div>
@@ -669,7 +679,7 @@ export class SchedulingUnitCreate extends Component {
                                 <Dropdown inputId="observStrategy" optionLabel="name" optionValue="id" 
                                         tooltip="Observation Strategy Template to be used to create the Scheduling Unit and Tasks" tooltipOptions={this.tooltipOptions}
                                         value={this.state.observStrategy.id} 
-                                        options={this.observStrategies} 
+                                        options={this.observStrategies} filter
                                         itemTemplate={this.observOptionTemplate}
                                         onChange={(e) => {this.changeStrategy(e.value)}} 
                                         placeholder="Select Strategy" />
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/edit.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/edit.js
index 8aac693a65c3ee17558a2b36c761b9373c2a1e0b..91bddd3e2f2ceaab7c338f4649272b221725f08b 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/edit.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/edit.js
@@ -27,6 +27,8 @@ import ParserUtility from '../../utils/parser.utility';
 import SchedulingConstraint from './Scheduling.Constraints';
 import UtilService from '../../services/util.service';
 import ReactTooltip from "react-tooltip";
+import AuthUtil from '../../utils/auth.util';
+import AccessDenied from '../../layout/components/AccessDenied';
 
 /**
  * Compoenent to edit scheduling unit draft
@@ -52,7 +54,8 @@ export class EditSchedulingUnit extends Component {
             observStrategyVisible: false,
             missingStationFieldsErrors: [],                // Validation for max no.of missing station
             stationGroup: [],
-            customSelectedStations: []              // Custom Stations    
+            customSelectedStations: [],
+            permissionById: {}              // Custom Stations    
         }
         this.priorityQueueTypes = [];
         this.projects = [];                         // All projects to load project dropdown
@@ -104,39 +107,44 @@ export class EditSchedulingUnit extends Component {
         const $strategyRefs = await $RefParser.resolve(observStrategy.template);
         // TODo: This schema reference resolving code has to be moved to common file and needs to rework
         for (const param of parameters) {
+            // TODO: make parameter handling more generic, instead of task specific.
+            if (!param.refs[0].startsWith("#/tasks/")) { continue; }
+
             let taskPaths = param.refs[0].split("/");
             const taskName = taskPaths[2];
-            tasksToUpdate[taskName] = taskName;
             taskPaths = taskPaths.slice(4, taskPaths.length);
             const task = tasks[taskName];
             const taskDraft = this.state.taskDrafts.find(taskD => taskD.name === taskName);
             if (taskDraft) {
                 task.specifications_doc = taskDraft.specifications_doc;
             }
-            const taskTemplate = _.find(this.taskTemplates, {'name': task['specifications_template']});
-            if (taskTemplate.type_value==='observation' && task.specifications_doc.station_groups) {
-                station_group = task.specifications_doc.station_groups;
-            }
-            // Get the default Bandpass filter and pass to the editor to for frequency calculation from subband list
-            if (taskTemplate.type_value === 'observation' && task.specifications_doc.filter) {
-                bandPassFilter = task.specifications_doc.filter;
-            }   else if (taskTemplate.type_value === 'observation' && taskTemplate.schema.properties.filter) {
-                bandPassFilter = taskTemplate.schema.properties.filter.default;
-            }
-            let taskTemplateSchema = this.taskTemplateSchemas[task['specifications_template']];
-            if (!taskTemplateSchema) {
-                taskTemplateSchema = _.find(this.taskTemplates, {'name': task['specifications_template']}).schema;
-                taskTemplateSchema = await UtilService.resolveSchema(_.cloneDeep(taskTemplateSchema));
-                this.taskTemplateSchemas[task['specifications_template']] = taskTemplateSchema;
-            }
-            schema.definitions = {...schema.definitions, ...taskTemplateSchema.definitions};
-            taskPaths.reverse();
-            const paramProp = await ParserUtility.getParamProperty($strategyRefs, taskPaths, taskTemplateSchema, param);
-            schema.properties[param.name] = _.cloneDeep(paramProp);
-            if (schema.properties[param.name]) {
-                schema.properties[param.name].title = param.name;
-                schema.properties[param.name].default = $strategyRefs.get(param.refs[0]);
-                paramsOutput[param.name] = schema.properties[param.name].default; 
+            if (task) {
+                tasksToUpdate[taskName] = taskName;
+                const taskTemplate = _.find(this.taskTemplates, {'name': task['specifications_template']});
+                if (taskTemplate.type_value==='observation' && task.specifications_doc.station_groups) {
+                    station_group = task.specifications_doc.station_groups;
+                }
+                // Get the default Bandpass filter and pass to the editor to for frequency calculation from subband list
+                if (taskTemplate.type_value === 'observation' && task.specifications_doc.filter) {
+                    bandPassFilter = task.specifications_doc.filter;
+                }   else if (taskTemplate.type_value === 'observation' && taskTemplate.schema.properties.filter) {
+                    bandPassFilter = taskTemplate.schema.properties.filter.default;
+                }
+                let taskTemplateSchema = this.taskTemplateSchemas[task['specifications_template']];
+                if (!taskTemplateSchema) {
+                    taskTemplateSchema = _.find(this.taskTemplates, {'name': task['specifications_template']}).schema;
+                    taskTemplateSchema = await UtilService.resolveSchema(_.cloneDeep(taskTemplateSchema));
+                    this.taskTemplateSchemas[task['specifications_template']] = taskTemplateSchema;
+                }
+                schema.definitions = {...schema.definitions, ...taskTemplateSchema.definitions};
+                taskPaths.reverse();
+                const paramProp = await ParserUtility.getParamProperty($strategyRefs, taskPaths, taskTemplateSchema, param);
+                schema.properties[param.name] = _.cloneDeep(paramProp);
+                if (schema.properties[param.name]) {
+                    schema.properties[param.name].title = param.name;
+                    schema.properties[param.name].default = $strategyRefs.get(param.refs[0]);
+                    paramsOutput[param.name] = schema.properties[param.name].default; 
+                }
             }
         }
         this.setState({observStrategy: observStrategy, paramsSchema: schema, paramsOutput: paramsOutput, 
@@ -149,7 +157,7 @@ export class EditSchedulingUnit extends Component {
         }
     }
 
-    componentDidMount() {
+    async componentDidMount() {
         const promises = [  ProjectService.getProjectList(), 
                             ScheduleService.getSchedulingSets(),
                             ScheduleService.getObservationStrategies(),
@@ -160,6 +168,8 @@ export class EditSchedulingUnit extends Component {
                             ScheduleService.getStationGroup(),
                             UtilService.getPriorityQueueType()
                         ];
+        const permissionById = await AuthUtil.getUserPermissionByModuleId('scheduling_unit_draft', this.props.match.params.id)
+        this.setState({permissionById: permissionById})
         Promise.all(promises).then(responses => {
             this.projects = responses[0];
             this.schedulingSets = responses[1];
@@ -396,7 +406,7 @@ export class EditSchedulingUnit extends Component {
             this.growl.show({severity: 'error', summary: 'Error Occured', detail: 'Template Missing.'});
         }
         this.setState({isDirty: false});
-        publish('edit-dirty', true);
+        publish('edit-dirty', false);
         
     }
     
@@ -481,180 +491,181 @@ export class EditSchedulingUnit extends Component {
                                                         bandPassFilter: this.state.bandPassFilter
                                                     });
         }
-       
        return (
             <React.Fragment>
-                <Growl ref={el => (this.growl = el)} />
-                <PageHeader location={this.props.location} title={'Scheduling Unit - Edit'} 
-                           actions={[{icon: 'fa-window-close', title:'Click to Close Scheduling Unit View', 
-                           type: 'button',  actOn: 'click', props:{ callback: this.checkIsDirty }}]}/>
-                { this.state.isLoading ? <AppLoader /> :
+                {this.state.permissionById[this.props.match.params.id] && this.state.permissionById[this.props.match.params.id].edit?
                 <>
-                <div>
-                    <div className="p-fluid">
-                        <div className="p-field p-grid">
-                            <label htmlFor="schedUnitName" className="col-lg-2 col-md-2 col-sm-12">Name <span style={{color:'red'}}>*</span></label>
-                            <div className="col-lg-3 col-md-3 col-sm-12">
-                                <InputText className={this.state.errors.name ?'input-error':''} id="schedUnitName" data-testid="name" 
-                                            tooltip="Enter name of the Scheduling Unit" tooltipOptions={this.tooltipOptions} maxLength="128"
-                                            ref={input => {this.nameInput = input;}}
-                                            value={this.state.schedulingUnit.name} autoFocus
-                                            onChange={(e) => this.setSchedUnitParams('name', e.target.value)}
-                                            onBlur={(e) => this.setSchedUnitParams('name', e.target.value)}/>
-                                <label className={this.state.errors.name?"error":"info"}>
-                                    {this.state.errors.name ? this.state.errors.name : "Max 128 characters"}
-                                </label>
+                    <Growl ref={el => (this.growl = el)} />
+                    <PageHeader location={this.props.location} title={'Scheduling Unit - Edit'} 
+                            actions={[{icon: 'fa-window-close', title:'Click to Close Scheduling Unit View', 
+                            type: 'button',  actOn: 'click', props:{ callback: this.checkIsDirty }}]}/>
+                    { this.state.isLoading ? <AppLoader /> :
+                    <>
+                    <div>
+                        <div className="p-fluid">
+                            <div className="p-field p-grid">
+                                <label htmlFor="schedUnitName" className="col-lg-2 col-md-2 col-sm-12">Name <span style={{color:'red'}}>*</span></label>
+                                <div className="col-lg-3 col-md-3 col-sm-12">
+                                    <InputText className={this.state.errors.name ?'input-error':''} id="schedUnitName" data-testid="name" 
+                                                tooltip="Enter name of the Scheduling Unit" tooltipOptions={this.tooltipOptions} maxLength="128"
+                                                ref={input => {this.nameInput = input;}}
+                                                value={this.state.schedulingUnit.name} autoFocus
+                                                onChange={(e) => this.setSchedUnitParams('name', e.target.value)}
+                                                onBlur={(e) => this.setSchedUnitParams('name', e.target.value)}/>
+                                    <label className={this.state.errors.name?"error":"info"}>
+                                        {this.state.errors.name ? this.state.errors.name : "Max 128 characters"}
+                                    </label>
+                                </div>
+                                <div className="col-lg-1 col-md-1 col-sm-12"></div>
+                                <label htmlFor="description" className="col-lg-2 col-md-2 col-sm-12">Description <span style={{color:'red'}}>*</span></label>
+                                <div className="col-lg-3 col-md-3 col-sm-12">
+                                    <InputTextarea className={this.state.errors.description ?'input-error':''} rows={3} cols={30} 
+                                                tooltip="Longer description of the scheduling unit" tooltipOptions={this.tooltipOptions} maxLength="128"
+                                                data-testid="description" value={this.state.schedulingUnit.description} 
+                                                onChange={(e) => this.setSchedUnitParams('description', e.target.value)}
+                                                onBlur={(e) => this.setSchedUnitParams('description', e.target.value)}/>
+                                    <label className={this.state.errors.description ?"error":"info"}>
+                                        {this.state.errors.description ? this.state.errors.description : "Max 255 characters"}
+                                    </label>
+                                </div>
                             </div>
-                            <div className="col-lg-1 col-md-1 col-sm-12"></div>
-                            <label htmlFor="description" className="col-lg-2 col-md-2 col-sm-12">Description <span style={{color:'red'}}>*</span></label>
-                            <div className="col-lg-3 col-md-3 col-sm-12">
-                                <InputTextarea className={this.state.errors.description ?'input-error':''} rows={3} cols={30} 
-                                            tooltip="Longer description of the scheduling unit" tooltipOptions={this.tooltipOptions} maxLength="128"
-                                            data-testid="description" value={this.state.schedulingUnit.description} 
-                                            onChange={(e) => this.setSchedUnitParams('description', e.target.value)}
-                                            onBlur={(e) => this.setSchedUnitParams('description', e.target.value)}/>
-                                <label className={this.state.errors.description ?"error":"info"}>
-                                    {this.state.errors.description ? this.state.errors.description : "Max 255 characters"}
-                                </label>
+                            <div className="p-field p-grid">
+                                <label htmlFor="project" className="col-lg-2 col-md-2 col-sm-12">Project </label>
+                                <div className="col-lg-3 col-md-3 col-sm-12" data-testid="project" >
+                                    <Dropdown inputId="project" optionLabel="name" optionValue="name" 
+                                            tooltip="Project" tooltipOptions={this.tooltipOptions}
+                                            value={this.state.schedulingUnit.project} disabled={this.state.schedulingUnit.project?true:false}
+                                            options={this.projects} 
+                                            placeholder="Select Project" />
+                                </div>
+                                <div className="col-lg-1 col-md-1 col-sm-12"></div>
+                                <label htmlFor="schedSet" className="col-lg-2 col-md-2 col-sm-12">Scheduling Set </label>
+                                <div className="col-lg-3 col-md-3 col-sm-12">
+                                    <Dropdown data-testid="schedSet" id="schedSet" optionLabel="name" optionValue="id" 
+                                            tooltip="Scheduling set of the project" tooltipOptions={this.tooltipOptions}
+                                            value={this.state.schedulingUnit.scheduling_set_id} 
+                                            options={this.state.schedulingSets} 
+                                            disabled={this.state.schedulingUnit.scheduling_set_id?true:false}
+                                            placeholder="Select Scheduling Set" />
+                                </div>
                             </div>
-                        </div>
-                        <div className="p-field p-grid">
-                            <label htmlFor="project" className="col-lg-2 col-md-2 col-sm-12">Project </label>
-                            <div className="col-lg-3 col-md-3 col-sm-12" data-testid="project" >
-                                <Dropdown inputId="project" optionLabel="name" optionValue="name" 
-                                        tooltip="Project" tooltipOptions={this.tooltipOptions}
-                                        value={this.state.schedulingUnit.project} disabled={this.state.schedulingUnit.project?true:false}
-                                        options={this.projects} 
-                                        placeholder="Select Project" />
+                            <div className="p-field p-grid">
+                                <label htmlFor="priorityRank" className="col-lg-2 col-md-2 col-sm-12">Priority Rank</label>
+                                <div className="col-lg-3 col-md-3 col-sm-12" data-testid="priority_rank" >
+                                    <input type="number"
+                                            data-for="reacttooltip"
+                                            data-iscapture="true"
+                                            data-tip="Priority of this scheduling unit w.r.t. other scheduling units within the same queue and project.. Min-0.0000, Max-1.0000"
+                                            inputId="proj-rank" name="rank" data-testid="rank"
+                                            className="p-inputtext p-component p-filled"
+                                            value={this.state.schedulingUnit.priority_rank}
+                                            step="0.0001"
+                                            onChange={(e)=> this.setSchedUnitParams('priority_rank', e.target.value)}/>
+                                    <label className="error">
+                                        {this.state.errors.priority_rank ? this.state.errors.priority_rank : ""}
+                                    </label>
+                                </div>
+                                <div className="col-lg-1 col-md-1 col-sm-12"></div>
+                                <label htmlFor="priority_queue" className="col-lg-2 col-md-2 col-sm-12">Priority Queue</label>
+                                <div className="col-lg-3 col-md-3 col-sm-10">
+                                    <Dropdown data-testid="priority_queue" id="priority_queue" optionLabel="value" optionValue="url" 
+                                            tooltip="Priority Queue of the Scheduling Unit" tooltipOptions={this.tooltipOptions}
+                                            value={this.state.schedulingUnit.priority_queue} 
+                                            options={this.priorityQueueTypes} 
+                                            onChange={(e) => {this.setSchedUnitParams('priority_queue',e.value)}} 
+                                            placeholder="Select Priority Queue" />
+                                    <label className={(this.state.errors.priority_queue && this.state.touched.priority_queue) ?"error":"info"}>
+                                        {(this.state.errors.priority_queue && this.state.touched.priority_queue) ? this.state.errors.priority_queue : ""}
+                                    </label>
+                                </div>
                             </div>
-                            <div className="col-lg-1 col-md-1 col-sm-12"></div>
-                            <label htmlFor="schedSet" className="col-lg-2 col-md-2 col-sm-12">Scheduling Set </label>
-                            <div className="col-lg-3 col-md-3 col-sm-12">
-                                <Dropdown data-testid="schedSet" id="schedSet" optionLabel="name" optionValue="id" 
-                                        tooltip="Scheduling set of the project" tooltipOptions={this.tooltipOptions}
-                                        value={this.state.schedulingUnit.scheduling_set_id} 
-                                        options={this.state.schedulingSets} 
-                                        disabled={this.state.schedulingUnit.scheduling_set_id?true:false}
-                                        placeholder="Select Scheduling Set" />
+                            <div className="p-field p-grid">
+                                { this.state.observStrategyVisible && 
+                                    <>
+                                        <label htmlFor="observStrategy" className="col-lg-2 col-md-2 col-sm-12">Observation Strategy </label>
+                                        <div className="col-lg-3 col-md-3 col-sm-12" data-testid="observStrategy" >
+                                            <Dropdown inputId="observStrategy" optionLabel="name" optionValue="id" 
+                                                    tooltip="Observation Strategy Template to be used to create the Scheduling Unit and Tasks" tooltipOptions={this.tooltipOptions}
+                                                    value={this.state.schedulingUnit.observation_strategy_template_id} 
+                                                    disabled={this.state.schedulingUnit.observation_strategy_template_id?true:false} 
+                                                    options={this.observStrategies} 
+                                                    onChange={(e) => {this.changeStrategy(e)}} 
+                                                    placeholder="Select Strategy" />
+                                            <label className="info">
+                                                {this.state.observStrategy? this.state.observStrategy.description : "Select Observation Strategy"}
+                                            </label>
+                                        </div>
+                                    </>
+                                }
+                                <div className="col-lg-1 col-md-1 col-sm-12"></div>
+                                    <label htmlFor="project" className="col-lg-2 col-md-2 col-sm-12">Prevent Automatic Deletion</label>
+                                    <div className="col-lg-3 col-md-3 col-sm-12" data-testid="project" >
+                                        <Checkbox inputId="trigger" role="trigger" 
+                                                tooltip="Select to Prevent or Unselect to Allow Automatic Deletion of Dataproducts" 
+                                                tooltipOptions={this.tooltipOptions}
+                                                checked={this.state.schedulingUnit.output_pinned} 
+                                                onChange={(e) => this.setSchedUnitParams('output_pinned', e.target.checked)}
+                                        ></Checkbox>
+                                    </div>
+                                    {/*
+                                <label htmlFor="schedulingConstraintsTemp" className="col-lg-2 col-md-2 col-sm-12 hide">Scheduling Constraints Template</label>
+                                <div className="col-lg-3 col-md-3 col-sm-12 hide" data-testid="schedulingConstraintsTemp">
+                                    <Dropdown inputId="schedulingConstraintsTemp" optionLabel="name" optionValue="id" 
+                                            tooltip="Scheduling Constraints Template to add scheduling constraints to a scheduling unit" tooltipOptions={this.tooltipOptions}
+                                            value={this.state.schedulingUnit.scheduling_constraints_template_id}
+                                            disabled
+                                            options={this.constraintTemplates} 
+                                            //onChange={(e) => { this.constraintStrategy(e);}}
+                                            placeholder="Select Constraints Template"/>
+                                
+                                    </div> */}
                             </div>
                         </div>
-                        <div className="p-field p-grid">
-                            <label htmlFor="priorityRank" className="col-lg-2 col-md-2 col-sm-12">Priority Rank</label>
-                            <div className="col-lg-3 col-md-3 col-sm-12" data-testid="priority_rank" >
-                                <input type="number"
-                                        data-for="reacttooltip"
-                                        data-iscapture="true"
-                                        data-tip="Priority of this scheduling unit w.r.t. other scheduling units within the same queue and project.. Min-0.0000, Max-1.0000"
-                                        inputId="proj-rank" name="rank" data-testid="rank"
-                                        className="p-inputtext p-component p-filled"
-                                        value={this.state.schedulingUnit.priority_rank}
-                                        step="0.0001"
-                                        onChange={(e)=> this.setSchedUnitParams('priority_rank', e.target.value)}/>
-                                <label className="error">
-                                    {this.state.errors.priority_rank ? this.state.errors.priority_rank : ""}
-                                </label>
-                            </div>
-                            <div className="col-lg-1 col-md-1 col-sm-12"></div>
-                            <label htmlFor="priority_queue" className="col-lg-2 col-md-2 col-sm-12">Priority Queue</label>
-                            <div className="col-lg-3 col-md-3 col-sm-10">
-                                <Dropdown data-testid="priority_queue" id="priority_queue" optionLabel="value" optionValue="url" 
-                                        tooltip="Priority Queue of the Scheduling Unit" tooltipOptions={this.tooltipOptions}
-                                        value={this.state.schedulingUnit.priority_queue} 
-                                        options={this.priorityQueueTypes} 
-                                        onChange={(e) => {this.setSchedUnitParams('priority_queue',e.value)}} 
-                                        placeholder="Select Priority Queue" />
-                                <label className={(this.state.errors.priority_queue && this.state.touched.priority_queue) ?"error":"info"}>
-                                    {(this.state.errors.priority_queue && this.state.touched.priority_queue) ? this.state.errors.priority_queue : ""}
-                                </label>
+                        
+                        <Stations
+                            stationGroup={this.state.stationGroup}
+                            onUpdateStations={this.onUpdateStations.bind(this)}
+                        />
+
+                        {this.state.constraintSchema && <div className="p-fluid">
+                            <div className="p-grid">
+                                <div className="p-col-12">
+                                    <SchedulingConstraint initValue={this.state.initValue} constraintTemplate={this.state.constraintSchema} callback={this.setEditorOutputConstraint} />
+                                </div>
                             </div>
-                        </div>
-                        <div className="p-field p-grid">
-                            { this.state.observStrategyVisible && 
-                                <>
-                                    <label htmlFor="observStrategy" className="col-lg-2 col-md-2 col-sm-12">Observation Strategy </label>
-                                    <div className="col-lg-3 col-md-3 col-sm-12" data-testid="observStrategy" >
-                                        <Dropdown inputId="observStrategy" optionLabel="name" optionValue="id" 
-                                                tooltip="Observation Strategy Template to be used to create the Scheduling Unit and Tasks" tooltipOptions={this.tooltipOptions}
-                                                value={this.state.schedulingUnit.observation_strategy_template_id} 
-                                                disabled={this.state.schedulingUnit.observation_strategy_template_id?true:false} 
-                                                options={this.observStrategies} 
-                                                onChange={(e) => {this.changeStrategy(e)}} 
-                                                placeholder="Select Strategy" />
-                                        <label className="info">
-                                            {this.state.observStrategy? this.state.observStrategy.description : "Select Observation Strategy"}
-                                        </label>
-                                    </div>
-                                </>
-                            }
-                            <div className="col-lg-1 col-md-1 col-sm-12"></div>
-                                <label htmlFor="project" className="col-lg-2 col-md-2 col-sm-12">Prevent Automatic Deletion</label>
-                                <div className="col-lg-3 col-md-3 col-sm-12" data-testid="project" >
-                                    <Checkbox inputId="trigger" role="trigger" 
-                                            tooltip="Select to Prevent or Unselect to Allow Automatic Deletion of Dataproducts" 
-                                            tooltipOptions={this.tooltipOptions}
-                                            checked={this.state.schedulingUnit.output_pinned} 
-                                            onChange={(e) => this.setSchedUnitParams('output_pinned', e.target.checked)}
-                                    ></Checkbox>
+                        </div>}
+                        
+                        <div className="p-fluid">
+                            <div className="p-grid">
+                                <div className="p-col-12">
+                                    {this.state.paramsSchema?jeditor:""}
                                 </div>
-                                {/*
-                            <label htmlFor="schedulingConstraintsTemp" className="col-lg-2 col-md-2 col-sm-12 hide">Scheduling Constraints Template</label>
-                            <div className="col-lg-3 col-md-3 col-sm-12 hide" data-testid="schedulingConstraintsTemp">
-                                <Dropdown inputId="schedulingConstraintsTemp" optionLabel="name" optionValue="id" 
-                                        tooltip="Scheduling Constraints Template to add scheduling constraints to a scheduling unit" tooltipOptions={this.tooltipOptions}
-                                        value={this.state.schedulingUnit.scheduling_constraints_template_id}
-                                        disabled
-                                        options={this.constraintTemplates} 
-                                        //onChange={(e) => { this.constraintStrategy(e);}}
-                                        placeholder="Select Constraints Template"/>
-                            
-                                </div> */}
-                        </div>
-                    </div>
-                    
-                    <Stations
-                        stationGroup={this.state.stationGroup}
-                        onUpdateStations={this.onUpdateStations.bind(this)}
-                    />
-
-                    {this.state.constraintSchema && <div className="p-fluid">
-                        <div className="p-grid">
-                            <div className="p-col-12">
-                                <SchedulingConstraint initValue={this.state.initValue} constraintTemplate={this.state.constraintSchema} callback={this.setEditorOutputConstraint} />
                             </div>
                         </div>
-                    </div>}
-                    
-                    <div className="p-fluid">
-                        <div className="p-grid">
-                            <div className="p-col-12">
-                                {this.state.paramsSchema?jeditor:""}
+                        <ReactTooltip id="reacttooltip" place={'left'}  type={'dark'} effect={'solid'} multiline={true} />
+                        <div className="p-grid p-justify-start">
+                            <div className="p-col-1">
+                                <Button label="Save" className="p-button-primary" icon="pi pi-check" onClick={this.saveSchedulingUnit} 
+                                        disabled={!this.state.validEditor || !this.state.validForm} data-testid="save-btn" />
+                            </div>
+                            <div className="p-col-1">
+                                <Button label="Cancel" className="p-button-danger" icon="pi pi-times" onClick={this.checkIsDirty}  />
                             </div>
                         </div>
-                    </div>
-                    <ReactTooltip id="reacttooltip" place={'left'}  type={'dark'} effect={'solid'} multiline={true} />
-                    <div className="p-grid p-justify-start">
-                        <div className="p-col-1">
-                            <Button label="Save" className="p-button-primary" icon="pi pi-check" onClick={this.saveSchedulingUnit} 
-                                    disabled={!this.state.validEditor || !this.state.validForm} data-testid="save-btn" />
-                        </div>
-                        <div className="p-col-1">
-                            <Button label="Cancel" className="p-button-danger" icon="pi pi-times" onClick={this.checkIsDirty}  />
-                        </div>
-                    </div>
 
-                    <div className="p-grid" data-testid="confirm_dialog">
-                        <CustomDialog type="confirmation" visible={this.state.showDialog} width="40vw"
-                            header={'Edit Scheduling Unit'} message={'Do you want to leave this page? Your changes may not be saved.'} 
-                            content={''} onClose={this.close} onCancel={this.close} onSubmit={this.cancelCreate}>
-                        </CustomDialog>
+                        <div className="p-grid" data-testid="confirm_dialog">
+                            <CustomDialog type="confirmation" visible={this.state.showDialog} width="40vw"
+                                header={'Edit Scheduling Unit'} message={'Do you want to leave this page? Your changes may not be saved.'} 
+                                content={''} onClose={this.close} onCancel={this.close} onSubmit={this.cancelCreate}>
+                            </CustomDialog>
+                        </div>
                     </div>
-                </div>
-                    
-                </>
-                }
-
+                        
+                    </>
+                    }
+                </>:<AccessDenied/>}
             </React.Fragment>
         );
     }
 }
-export default EditSchedulingUnit
+export default EditSchedulingUnit
\ No newline at end of file
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/excelview.schedulingset.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/excelview.schedulingset.js
index 6fb9c245967251bc7d9126d77f5e1968a0dbbb73..a6461e52dfd4deb0697689f4097df9887296ad61 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/excelview.schedulingset.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/excelview.schedulingset.js
@@ -45,6 +45,8 @@ import { AgGridReact } from 'ag-grid-react';
 import { AllCommunityModules } from '@ag-grid-community/all-modules';
 import 'ag-grid-community/dist/styles/ag-grid.css';
 import 'ag-grid-community/dist/styles/ag-theme-alpine.css';
+import AccessDenied from '../../layout/components/AccessDenied';
+import AuthUtil from '../../utils/auth.util';
 
 const BG_COLOR = '#f878788f';
 /**
@@ -54,6 +56,7 @@ export class SchedulingSetCreate extends Component {
     constructor(props) {
         super(props);
         this.state= {
+            userrole: {},
             redirect: null,
             errors: [],
             validFields: {},
@@ -187,6 +190,8 @@ export class SchedulingSetCreate extends Component {
         this.copyHeader = this.copyHeader.bind(this);
         this.copyOnlyHeader = this.copyOnlyHeader.bind(this);
         this.clipboardEvent = this.clipboardEvent.bind(this);
+        this.copyFromClipboard = this.copyFromClipboard.bind(this);
+        this.pasteTextField = this.pasteTextField.bind(this);
         this.applyToAll =  this.applyToAll.bind(this);
         this.applyToSelected =  this.applyToSelected.bind(this);
         this.applyToEmptyRows =  this.applyToEmptyRows.bind(this);
@@ -467,6 +472,8 @@ export class SchedulingSetCreate extends Component {
             ScheduleService.getSchedulingConstraintTemplates(),
             UtilService.getPriorityQueueType()
         ];
+        const permission = await AuthUtil.getUserPermissionByModule('scheduleunit_draft');
+        this.setState({userrole: permission});
         await Promise.all(promises).then(responses => {
             this.projects = responses[0];
             this.schedulingSets = responses[1];
@@ -533,29 +540,34 @@ export class SchedulingSetCreate extends Component {
             const $strategyRefs = await $RefParser.resolve(observStrategy.template);
             // TODo: This schema reference resolving code has to be moved to common file and needs to rework
             for (const param of parameters) {
+                // TODO: make parameter handling more generic, instead of task specific.
+                if (!param.refs[0].startsWith("#/tasks/")) { continue; }
+
                 let taskPaths = param.refs[0].split("/");
                 const taskName = taskPaths[2];
                 tasksToUpdate[taskName] = taskName;
                 taskPaths = taskPaths.slice(4, taskPaths.length);
                 const task = tasks[taskName];
-                const taskTemplate = _.find(this.taskTemplates, {'name': task['specifications_template']});
-                if (taskTemplate.type_value==='observation' && task.specifications_doc.station_groups) {
-                    station_group = task.specifications_doc.station_groups;
-                }
-                let taskTemplateSchema = this.taskTemplateSchemas[task['specifications_template']];
-                if (!taskTemplateSchema) {
-                    taskTemplateSchema = _.find(this.taskTemplates, {'name': task['specifications_template']}).schema;
-                    taskTemplateSchema = await UtilService.resolveSchema(_.cloneDeep(taskTemplateSchema));
-                    this.taskTemplateSchemas[task['specifications_template']] = taskTemplateSchema;
-                }
-                schema.definitions = {...schema.definitions, ...taskTemplateSchema.definitions};
-                taskPaths.reverse();
-                const paramProp = await ParserUtility.getParamProperty($strategyRefs, taskPaths, taskTemplateSchema, param);
-                schema.properties[param.name] = _.cloneDeep(paramProp);
-                if (schema.properties[param.name]) {
-                    schema.properties[param.name].title = param.name;
-                    schema.properties[param.name].default = $strategyRefs.get(param.refs[0]);
-                    paramsOutput[param.name] = schema.properties[param.name].default; 
+                if (task) {
+                    const taskTemplate = _.find(this.taskTemplates, {'name': task['specifications_template']});
+                    if (taskTemplate.type_value==='observation' && task.specifications_doc.station_groups) {
+                        station_group = task.specifications_doc.station_groups;
+                    }
+                    let taskTemplateSchema = this.taskTemplateSchemas[task['specifications_template']];
+                    if (!taskTemplateSchema) {
+                        taskTemplateSchema = _.find(this.taskTemplates, {'name': task['specifications_template']}).schema;
+                        taskTemplateSchema = await UtilService.resolveSchema(_.cloneDeep(taskTemplateSchema));
+                        this.taskTemplateSchemas[task['specifications_template']] = taskTemplateSchema;
+                    }
+                    schema.definitions = {...schema.definitions, ...taskTemplateSchema.definitions};
+                    taskPaths.reverse();
+                    const paramProp = await ParserUtility.getParamProperty($strategyRefs, taskPaths, taskTemplateSchema, param);
+                    schema.properties[param.name] = _.cloneDeep(paramProp);
+                    if (schema.properties[param.name]) {
+                        schema.properties[param.name].title = param.name;
+                        schema.properties[param.name].default = $strategyRefs.get(param.refs[0]);
+                        paramsOutput[param.name] = schema.properties[param.name].default; 
+                    }
                 }
             }
             await this.setState({observStrategy: observStrategy, paramsSchema: schema, paramsOutput: paramsOutput,defaultStationGroups: station_group, tasksToUpdate: tasksToUpdate});
@@ -686,6 +698,7 @@ export class SchedulingSetCreate extends Component {
      * Function to prepare row data for ag-grid. 
      */
      async prepareScheduleUnitListForGrid(){
+        let defaultCommonRowData ={};
         this.agSUWithDefaultValue = {'id': 0, 'suname': '', 'sudesc': ''};
         let schedulingUnitList = _.filter(this.state.schedulingUnitList,{'observation_strategy_template_id': this.state.observStrategy.id});
         if ( schedulingUnitList  && schedulingUnitList.length === 0) {
@@ -698,7 +711,7 @@ export class SchedulingSetCreate extends Component {
         this.tmpRowData = [];
         let totalSU = this.state.noOfSU;
         let lastRow = {};
-        let hasSameValue = true;
+        //let hasSameValue = true;
         if(schedulingUnitList && schedulingUnitList.length > 0) {
             for(const scheduleunit of schedulingUnitList){
                 let observationProps = {
@@ -798,18 +811,29 @@ export class SchedulingSetCreate extends Component {
                 //Set values for global row if all rows has same value
                 if (_.isEmpty(lastRow)) {
                     lastRow = observationProps;
-                }   else if (!_.isEqual(
+                    defaultCommonRowData = _.cloneDeep(observationProps);
+                }   else /* if (!_.isEqual(
                         _.omit(lastRow, ['id']),
                         _.omit(observationProps, ['id'])
-                    ))  {
-                    hasSameValue = false;
+                    )) */ { 
+
+                    const keys = Object.keys(lastRow);
+                    for (const key of keys) {
+                        if (key === 'daily') {
+                            console.log("key =>",key,lastRow[key], observationProps[key])
+                        }
+                        if ( !_.isEqual(lastRow[key], observationProps[key])) {
+                            defaultCommonRowData[key] = ''; 
+                        }
+                    }    
+                    //hasSameValue = false;
                 }
             }
         }   
-        let defaultCommonRowData = {};
+       /* let defaultCommonRowData = {};
         if (hasSameValue) {
             defaultCommonRowData = observationPropsList[observationPropsList.length-1];
-        }
+        }*/
         this.tmpRowData = observationPropsList;
         // find No. of rows filled in array
         let totalCount = this.tmpRowData.length;
@@ -853,7 +877,7 @@ export class SchedulingSetCreate extends Component {
             isAGLoading: false,
             commonRowData: [defaultCommonRowData],
             defaultCommonRowData: defaultCommonRowData,
-            hasSameValue: hasSameValue
+           // hasSameValue: hasSameValue
         });
         {this.state.gridApi && 
             this.state.gridApi.setRowData(this.state.rowData);
@@ -998,6 +1022,11 @@ export class SchedulingSetCreate extends Component {
                 values: schema.definitions.pointing.properties.direction_type.enum,
             }, 
         };
+        cellProps['filter'] = {isgroup: false, cellEditor: 'agSelectCellEditor',default: schema.definitions.filter.default,
+        cellEditorParams: {
+            values: schema.definitions.filter.enum,
+        }, 
+    };
         cellProps['duration'] = { type:'numberValueColumn', cellEditor:'numericEditor', cellStyle: function(params) {
             if  (params.value){
                 if ( !Number(params.value)){
@@ -1091,25 +1120,39 @@ export class SchedulingSetCreate extends Component {
                 let property = schema.properties[prop];
                 if(property && property.$ref) {
                     cellProps['headerName'] = property.title;
-                    let defaultKeys = Object.keys(property.default);
-                    let children = [];
-                    for(const defaultKey of defaultKeys) {
-                        this.colKeyOrder.push(prop+"~"+defaultKey);
-                        if(defaultKey === 'angle1') {
-                            this.agSUWithDefaultValue[prop+"~"+defaultKey] = UnitConverter.getAngleInput( property.default[defaultKey], false);
-                        }   else if(defaultKey === 'angle2') {
-                            this.agSUWithDefaultValue[prop+"~"+defaultKey] = UnitConverter.getAngleInput( property.default[defaultKey], true);
-                        }   else{
-                            this.agSUWithDefaultValue[prop+"~"+defaultKey] = property.default[defaultKey];
+                    if (property.title === 'Filter') {
+                        colProperty ={};
+                        cellProps['headerName'] = property.title;
+                        this.colKeyOrder.push(prop+"~"+property.title);
+                        this.agSUWithDefaultValue[prop+"~"+property.title] = property.default;
+                        cellProps['field'] = prop+"~"+property.title;
+                        cellProps = this.getAGGridAngelColumnsProperty(predefineCellProps, cellProps, _.lowerCase(property.title));
+                        colProperty[property.title] = prop+"~"+property.title;
+                        columnMap[property.title] = colProperty;
+                        columnDefs.push(cellProps);
+                    }   else {
+                        let defaultKeys = Object.keys(property.default);
+                        let children = [];
+                        for(const defaultKey of defaultKeys) {
+                            this.colKeyOrder.push(prop+"~"+defaultKey);
+                            if(defaultKey === 'angle1') {
+                                this.agSUWithDefaultValue[prop+"~"+defaultKey] = UnitConverter.getAngleInput( property.default[defaultKey], false);
+                            }   else if(defaultKey === 'angle2') {
+                                this.agSUWithDefaultValue[prop+"~"+defaultKey] = UnitConverter.getAngleInput( property.default[defaultKey], true);
+                            }   else{
+                                this.agSUWithDefaultValue[prop+"~"+defaultKey] = property.default[defaultKey];
+                            }
+                            let childCellProps = { headerName : _.startCase(defaultKey), field : prop+"~"+defaultKey};
+                            childCellProps = this.getAGGridAngelColumnsProperty(predefineCellProps, childCellProps, defaultKey);
+                            colProperty[defaultKey] =  prop+"~"+defaultKey;
+                            children.push(childCellProps);
                         }
-                        let childCellProps = { headerName : _.startCase(defaultKey), field : prop+"~"+defaultKey};
-                        childCellProps = this.getAGGridAngelColumnsProperty(predefineCellProps, childCellProps, defaultKey);
-                        colProperty[defaultKey] =  prop+"~"+defaultKey;
-                        children.push(childCellProps);
-                    }
-                    columnMap[property.title] = colProperty;
-                    cellProps['children'] = children;
-                    columnDefs.push(cellProps);
+                        columnMap[property.title] = colProperty;
+                        cellProps['children'] = children;
+                        columnDefs.push(cellProps);
+                        }
+                    
+                    
                 }   else {
                     colProperty ={};
                     cellProps['headerName'] = property.title;
@@ -1154,6 +1197,8 @@ export class SchedulingSetCreate extends Component {
                     if (childColDef.field) {
                         if(childColDef.field.endsWith('direction_type')) {
                             childColDef.cellEditorParams.values = direction_type_Values;
+                        }   else if(childColDef.field === 'filter') {
+                            childColDef.cellEditorParams.values =  [...' ', ...schema.definitions.filter.enum];
                         }
                         childColDef.field = 'gdef_'+childColDef.field;
                         if (childColDef.default) {
@@ -1750,6 +1795,14 @@ export class SchedulingSetCreate extends Component {
         //If No SU Constraint create default ( maintain default struc)
         constraint['scheduler'] = suRow.scheduler;
         if  (suRow.scheduler === 'dynamic'  || suRow.scheduler === 'online'){
+            if (constraint.time) {
+                delete constraint.time.at;
+                delete constraint.time.after;
+                delete constraint.time.before;
+                delete constraint.time.between;
+                delete constraint.time.not_between;
+            }
+            /*
             if (this.isNotEmpty(suRow.timeat)) {
                 delete constraint.time.at;
             }
@@ -1760,7 +1813,7 @@ export class SchedulingSetCreate extends Component {
            
             if (!this.isNotEmpty(suRow.timebefore) && constraint.time) {
                 delete constraint.time.before;
-            }
+            } */
         }  
         else  {
             //mandatory
@@ -2120,7 +2173,7 @@ export class SchedulingSetCreate extends Component {
             clipboardData += line + '\r\n'; 
             clipboardData = _.trim(clipboardData);
             const queryOpts = { name: 'clipboard-write', allowWithoutGesture: true };
-            await navigator.permissions.query(queryOpts);
+            // await navigator.permissions.query(queryOpts);
             await navigator.clipboard.writeText(clipboardData);
             this.growl.show({severity: 'success', summary: '', detail: 'Header copied to clipboard '});
         }
@@ -2132,7 +2185,7 @@ export class SchedulingSetCreate extends Component {
      async readClipBoard(){
         try{
             const queryOpts = { name: 'clipboard-read', allowWithoutGesture: true };
-            await navigator.permissions.query(queryOpts);
+            // await navigator.permissions.query(queryOpts);
             let data = await navigator.clipboard.readText();
             return data;
         }catch(err){
@@ -2140,27 +2193,10 @@ export class SchedulingSetCreate extends Component {
         }
     }  
 
-    /**
-     * Copy data to/from clipboard
-     * @param {*} e 
-     */
-    async clipboardEvent(e){
-        var key = e.which || e.keyCode;
-        var ctrl = e.ctrlKey ? e.ctrlKey : ((key === 17) ? true : false);
-        if ( key === 67 && ctrl ) {
-            //Ctrl+C
-            this.copyToClipboard();
-        } 
-        else if ( key === 86 && ctrl ) {
-            // Ctrl+V
-            this.copyFromClipboard();
-        }
-    }
-
     /**
      * Function to copy the data to clipboard
      */
-     async copyToClipboard(){
+     async copyToClipboard() {
         var columnsName = this.state.gridColumnApi.getAllGridColumns();
         var selectedRows = this.state.gridApi.getSelectedRows();
         let clipboardData = '';
@@ -2174,10 +2210,14 @@ export class SchedulingSetCreate extends Component {
             line = _.trim(line);
             clipboardData += line + '\r\n'; 
         }
-        for(const rowData of selectedRows){
+        //for(const rowData of selectedRows){
+        for(var rowCount=0; rowCount < selectedRows.length ; rowCount++) {
+            const rowData = selectedRows[rowCount];
             var line = '';
-            for(const key of this.state.colKeyOrder){
+            //for(const key of this.state.colKeyOrder){
+            for(var count =0; count < this.state.colKeyOrder.length; count++) {
                 let value = ' ';
+                const key = this.state.colKeyOrder[count];
                 if(key.endsWith('Beamformers')) {
                     let tmp = rowData[key];
                     if(tmp['param_0']) {
@@ -2191,19 +2231,127 @@ export class SchedulingSetCreate extends Component {
                 if(value === undefined) {
                     value = ' ';
                 }
-                line +=  value+ '\t';
+                line +=  value + ((count === this.state.colKeyOrder.length-1) ? '' :'\t');                 
             }
-            line = line.slice(0, -2); 
-            clipboardData += line + '\r\n'; 
+            //line = line.slice(0, -2);
+            clipboardData += line + ((rowCount === selectedRows.length-1) ? '' : '\r\n'); 
         }
-        clipboardData = clipboardData.slice(0, -4); 
+        //clipboardData = clipboardData.slice(0, -2); 
+        try {
+            const queryOpts = { name: 'clipboard-write', allowWithoutGesture: true };
+            await navigator.permissions.query(queryOpts);
+            await navigator.clipboard.writeText(clipboardData);
+        }   catch(error) {
+            try{
+                const elem = document.createElement('textarea');
+                elem.value = clipboardData;
+                document.body.appendChild(elem);
+                elem.select();
+                document.execCommand('copy');
+                document.body.removeChild(elem);
+            } catch (error) {
+                this.growl.show({severity: 'error', summary: 'Warning', detail: 'Unable to copy the data to clipboard'});
+            }
+        }
+        
+       /* if (navigator.userAgent.indexOf('Firefox')>=0) {
+            if (navigator.appVersion.indexOf("Win") != -1) {
+                const queryOpts = { name: 'clipboard-write', allowWithoutGesture: true };
+                await navigator.permissions.query(queryOpts);
+                await navigator.clipboard.writeText(clipboardData);
+            }   else {
+                const elem = document.createElement('textarea');
+                elem.value = clipboardData;
+                document.body.appendChild(elem);
+                elem.select();
+                document.execCommand('copy');
+                document.body.removeChild(elem);
+            }
+        }   else {
+            const elem = document.createElement('textarea');
+            elem.value = clipboardData;
+            document.body.appendChild(elem);
+            elem.select();
+            document.execCommand('copy');
+            document.body.removeChild(elem);
+          //  await navigator.clipboard.writeText(clipboardData);
+        } */
         
-        const queryOpts = { name: 'clipboard-write', allowWithoutGesture: true };
-        await navigator.permissions.query(queryOpts);
-        await navigator.clipboard.writeText(clipboardData);
         const headerText = (this.state.copyHeader) ?'with Header' : '';
         this.growl.show({severity: 'success', summary: '', detail: selectedRows.length+' row(s) copied to clipboard '+headerText });
     }
+    /**
+     * Copy data to/from clipboard
+     * @param {*} e 
+     */
+    async clipboardEvent(e){
+        var key = e.which || e.keyCode;
+        var ctrl = e.ctrlKey ? e.ctrlKey : ((key === 17) ? true : false);
+        if ( key === 67 && ctrl ) {
+            //Ctrl+C
+            this.copyToClipboard();
+        } 
+        else if ( key === 86 && ctrl ) {        // Ctrl+V
+            // If browser is Firefox, show the dialog to paste clipboard content and 
+            if (navigator.appVersion.indexOf("Win") != -1  && navigator.userAgent.indexOf('Firefox')<0) {
+                this.copyFromClipboard();
+            }   else {
+                this.setState({
+                    confirmDialogVisible: true,
+                });
+                this.callBackFunction = this.copyFromClipboard;
+                this.onCancel = () => {
+                    this.setState({confirmDialogVisible: false, clipText: ''});
+                    this.actions = null;
+                };
+                this.onClose = () => {
+                    this.setState({confirmDialogVisible: false, clipText: ''});
+                    this.actions = null;
+                };
+                this.showIcon = false;
+                this.dialogType = "confirmation";
+                this.dialogHeader = "Paste Copied Data";
+                this.dialogMsg = "Paste copied content in the field and click Ok to paste to the selected row(s)";
+                this.dialogContent = this.pasteTextField;
+                this.actions = [{id: "ok_btn", title: "Ok", callback: this.copyFromClipboard},
+                                {id: "cancel_btn", title: "Cancel", callback: this.onCancel}];
+            }
+           /* if (navigator.userAgent.indexOf('Firefox')>=0) {
+                this.setState({
+                    confirmDialogVisible: true,
+                });
+                this.callBackFunction = this.copyFromClipboard;
+                this.onCancel = () => {
+                    this.setState({confirmDialogVisible: false, clipText: ''});
+                    this.actions = null;
+                };
+                this.onClose = () => {
+                    this.setState({confirmDialogVisible: false, clipText: ''});
+                    this.actions = null;
+                };
+                this.showIcon = false;
+                this.dialogType = "confirmation";
+                this.dialogHeader = "Paste Copied Data";
+                this.dialogMsg = "Paste copied content in the field and click Ok to paste to the selected row(s)";
+                this.dialogContent = this.pasteTextField;
+                this.actions = [{id: "ok_btn", title: "Ok", callback: this.copyFromClipboard},
+                                {id: "cancel_btn", title: "Cancel", callback: this.onCancel}]
+            }   else {
+                this.copyFromClipboard();
+            }*/
+        }
+    }
+
+    /**
+     * Text area component passed to dialog to get the clipboard data from user
+     * @returns Component
+     */
+    pasteTextField() {
+        return <textarea value={this.state.clipText} style={{width: '100%'}} autoFocus
+                 onChange={e => this.setState({clipText: e.target.value})}></textarea>;
+    }
+
+     
 
     /**
      * Function to copy the data from clipboard
@@ -2214,12 +2362,13 @@ export class SchedulingSetCreate extends Component {
             this.tmpRowData = this.state.rowData;
             let dataRowCount = this.state.totalCount;
             //Read Clipboard Data
-            let clipboardData = await this.readClipBoard();
+            let clipboardData = this.state.clipText?this.state.clipText:await this.readClipBoard();
             let selectedRowIndex = 0;
             if  (selectedRows){
                 await selectedRows.map(selectedRow =>{
                     selectedRowIndex = selectedRow.rowIndex;
                     if  (clipboardData){
+                        clipboardData = _.trimEnd(clipboardData);
                         let suGridRowData = this.state.emptyRow;
                         let suRows = clipboardData.split("\n");
                         suRows.forEach(line => {
@@ -2263,8 +2412,11 @@ export class SchedulingSetCreate extends Component {
                     rowData: this.tmpRowData,
                     noOfSU: this.tmpRowData.length,
                     totalCount: dataRowCount,
+                    confirmDialogVisible: false,
+                    clipText: "",
                     isDirty: true
                 });
+                this.actions = null;
                 publish('edit-dirty', true);
                 this.state.gridApi.setRowData(this.state.rowData);
                 this.state.gridApi.redrawRows();
@@ -2296,25 +2448,25 @@ export class SchedulingSetCreate extends Component {
     /**
      * Reset the top table values
      */
-     resetCommonData(){
-        this.setState({commonRowData: []});
+    async resetCommonData(){
+        await this.setState({commonRowData: []});
         let tmpData = [this.state.defaultCommonRowData]; //[...[this.state.emptyRow]];
         let gRowData = {};
         for (const key of _.keys(tmpData[0])) {
             if (key === 'id') {
                 gRowData[key] = tmpData[0][key];
             }
-            else if(this.state.hasSameValue) {
+            //else if(this.state.hasSameValue) {
                 gRowData['gdef_'+key] = tmpData[0][key];
-            } else {
+            /*} else {
                 gRowData['gdef_'+key] = '';
-            }
+            }*/
         }
-        gRowData['offset_from_max'] = this.constraintSchema.schema.properties.sky.properties.transit_offset.properties.from.maximum;
-        gRowData['offset_from_min'] =  this.constraintSchema.schema.properties.sky.properties.transit_offset.properties.from.minimum;
-        gRowData['offset_to_max'] = this.constraintSchema.schema.properties.sky.properties.transit_offset.properties.to.maximum;
-        gRowData['offset_to_min'] = this.constraintSchema.schema.properties.sky.properties.transit_offset.properties.to.minimum;
-        this.setState({commonRowData: [gRowData]});
+        gRowData['gdef_offset_from_max'] = this.constraintSchema.schema.properties.sky.properties.transit_offset.properties.from.maximum;
+        gRowData['gdef_offset_from_min'] =  this.constraintSchema.schema.properties.sky.properties.transit_offset.properties.from.minimum;
+        gRowData['gdef_offset_to_max'] = this.constraintSchema.schema.properties.sky.properties.transit_offset.properties.to.maximum;
+        gRowData['gdef_offset_to_min'] = this.constraintSchema.schema.properties.sky.properties.transit_offset.properties.to.minimum;
+        await this.setState({commonRowData: [gRowData]});
     }
 
      /**
@@ -2446,7 +2598,8 @@ export class SchedulingSetCreate extends Component {
                             row[key] = value;
                         }
                         else {
-                            row[key] = (_.isEmpty(value))?  row[key] : value;
+                            //Lodash is not checking the number, so append string
+                            row[key] = (_.isEmpty(value+''))?  row[key] : value;
                         }
                     }
                 });
@@ -2480,8 +2633,11 @@ export class SchedulingSetCreate extends Component {
         if (this.state.redirect) {
             return <Redirect to={ {pathname: this.state.redirect} }></Redirect>
         }
+        const {scheduleunit_draft} = this.state.userrole;
         return (
             <React.Fragment>
+                {scheduleunit_draft && scheduleunit_draft.list ?
+                <>
                  <Growl ref={(el) => this.growl = el} />
                  <PageHeader location={this.props.location} title={'Scheduling Unit(s) Add Multiple'} 
                 actions={[{icon: 'fa-window-close',title:'Close',  type: 'button',  actOn: 'click', props:{ callback: this.checkIsDirty }}]}
@@ -2528,7 +2684,7 @@ export class SchedulingSetCreate extends Component {
                                         onClick={this.showAddSchedulingSet}  
                                         tooltip="Add new Scheduling Set"
                                         style={{marginLeft: '-10px'}}
-                                        disabled={this.state.schedulingUnit.project !== null ? false : true }/>
+                                        disabled={this.state.schedulingUnit.project !== null && scheduleunit_draft.scheduling_set? false : true }/>
                                 </div>
                             </div>
                             <div className="p-field p-grid">
@@ -2537,7 +2693,7 @@ export class SchedulingSetCreate extends Component {
                                     <Dropdown inputId="observStrategy" optionLabel="name" optionValue="id" 
                                             tooltip="Observation Strategy Template to be used to create the Scheduling Unit" tooltipOptions={this.tooltipOptions}
                                             value={this.state.observStrategy.id} 
-                                            options={this.observStrategies} 
+                                            options={this.observStrategies} filter
                                             itemTemplate={this.observOptionTemplate}
                                             onChange={(e) => {this.onStrategyChange(e.value)}} 
                                             placeholder="Select Strategy" />
@@ -2637,7 +2793,7 @@ export class SchedulingSetCreate extends Component {
 
                                     {this.state.observStrategy.id &&
                                         <div className="ag-theme-alpine" style={ {overflowX: 'inherit !importent', height: '500px', marginBottom: '3em', padding: '0.5em' } } onKeyDown={this.clipboardEvent}>
-                                             <label >Scheduling Unit(s) </label>
+                                            <label >Scheduling Unit(s) </label>
                                             <AgGridReact 
                                                 suppressClipboardPaste={false}
                                                 columnDefs={this.state.columnDefs}
@@ -2662,7 +2818,7 @@ export class SchedulingSetCreate extends Component {
                         </>
                         <div className="p-grid p-justify-start">
                             <div className="p-col-1">
-                                <Button label="Save" className="p-button-primary" icon="pi pi-check" onClick={this.saveSchedulingUnit} 
+                                <Button label="Save" className="p-button-primary" icon="pi pi-check" disabled={scheduleunit_draft.create && scheduleunit_draft.edit ? false: true}  onClick={this.saveSchedulingUnit} 
                                         data-testid="save-btn" />
                             </div>
                             <div className="p-col-1">
@@ -2681,6 +2837,7 @@ export class SchedulingSetCreate extends Component {
                     showIcon={this.showIcon} actions={this.actions}>
                 </CustomDialog>
                 <CustomPageSpinner visible={this.state.showSpinner} />
+                </>:<AccessDenied/>}
             </React.Fragment>
         );
     }
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/index.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/index.js
index ccb826e083dfa7370d2b1f7630410c64e6ad1346..c0662b20d505ffdcdc60b6625d5f5e4820d91878 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/index.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/index.js
@@ -7,9 +7,10 @@ import PageHeader from '../../layout/components/PageHeader';
 import { appGrowl } from '../../layout/components/AppGrowl';
 import { CustomDialog } from '../../layout/components/CustomDialog';
 import AuthUtil from '../../utils/auth.util';
+import AuthStore from '../../authenticate/auth.store';
 
 export class Scheduling extends Component {
-    constructor(props){
+     constructor(props){
         super(props);
         this.state = {
             scheduleunit: [],
@@ -17,7 +18,8 @@ export class Scheduling extends Component {
             isLoading:false,
             redirect: '',
             dialog: {header: 'Confirm', detail: 'Do you want to create blueprints for the selected drafts?'},
-            dialogVisible: false
+            dialogVisible: false,
+            userrole : AuthStore.getState()
         };
         this.access_dined_message = "Don't have permission";
         this.optionsMenu = React.createRef();
@@ -29,8 +31,7 @@ export class Scheduling extends Component {
    
     async componentDidMount() {
         const permission = await AuthUtil.getUserRolePermission();
-        this.setState({userrole: permission});
-        //this.getUserRolePermission()
+        this.setState({userrole: permission})
     }
     
     /**
@@ -72,13 +73,13 @@ export class Scheduling extends Component {
                 <PageHeader location={this.props.location} title={'Scheduling Unit - List'}
                             actions={[
                                 {icon: 'fa fa-plus-square', 
-                                        title: this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.create?'Add New Scheduling Unit':this.access_dined_message,
-                                        disabled: this.state.userrole && this.state.userrole.userRolePermission.scheduleunit?!this.state.userrole.userRolePermission.scheduleunit.create:true, 
+                                        title: this.state.userrole.userRolePermission && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.create?'Add New Scheduling Unit':this.access_dined_message,
+                                         disabled: this.state.userrole.userRolePermission && this.state.userrole.userRolePermission.scheduleunit?!this.state.userrole.userRolePermission.scheduleunit.create:true, 
                                         props: {pathname: '/schedulingunit/create'}},
                                         
                                 {icon: 'fa fa-table',
-                                        title: this.state.userrole && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.excelview?'Add Scheduling Set':this.access_dined_message,
-                                        disabled: this.state.userrole && this.state.userrole.userRolePermission.scheduleunit?!this.state.userrole.userRolePermission.scheduleunit.excelview:true,
+                                        title: this.state.userrole.userRolePermission && this.state.userrole.userRolePermission.scheduleunit && this.state.userrole.userRolePermission.scheduleunit.excelview?'Add Scheduling Set':this.access_dined_message,
+                                        disabled: this.state.userrole.userRolePermission && this.state.userrole.userRolePermission.scheduleunit?!this.state.userrole.userRolePermission.scheduleunit.excelview:true,
                                         props: {pathname: '/schedulingset/schedulingunit/create'}},
                                 ]} />
                 {this.state.scheduleunit && 
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/edit.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/edit.js
index 6383e13aeae9983f9601ec0921fce8e405fc32b3..a71b2eb11b091630e4c802669f30fbe498c7e6e5 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/edit.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/edit.js
@@ -14,6 +14,8 @@ import { publish } from '../../App';
 import TaskService from '../../services/task.service';
 import AppLoader from "./../../layout/components/AppLoader";
 import PageHeader from '../../layout/components/PageHeader';
+import AuthUtil from '../../utils/auth.util';
+import AccessDenied from '../../layout/components/AccessDenied';
 
 
 export class TaskEdit extends Component {
@@ -36,7 +38,9 @@ export class TaskEdit extends Component {
             validEditor: false,
             validForm: false,
             errors: {},
-            isLoading: true
+            isLoading: true,
+            userrole: {},
+            taskId: ''
         };
         this.formRules = {
             name: {required: true, message: "Name can not be empty"},
@@ -175,7 +179,7 @@ export class TaskEdit extends Component {
         this.props.history.goBack();
     }
 
-    componentDidMount() {
+    async componentDidMount() {
         this.setState({ isLoading: true });
         TaskService.getTaskTemplates()
         .then((templates) => {            
@@ -183,6 +187,8 @@ export class TaskEdit extends Component {
         });
         let taskId = this.props.match.params?this.props.match.params.id:null;
         taskId = taskId?taskId:(this.props.taskId?this.props.taskId:this.props.location.state.taskId);
+        const permission = await AuthUtil.getUserPermissionByModuleId('task_draft',taskId);
+        this.setState({userrole: permission, taskId:taskId})
         TaskService.getTaskDetails("draft", taskId)
         .then((task) => {
             if (task) {
@@ -236,89 +242,92 @@ export class TaskEdit extends Component {
                         </Link>
                     </div>
                     </div> */}
-                <PageHeader location={this.props.location} title={'Task - Edit'} actions={[{icon: 'fa-window-close',
-                 title:'Click to Close Task Edit Page',type: 'button',  actOn: 'click',props : { pathname:  `/task/view/draft/${this.state.task?this.state.task.id:''}`,callback: this.checkIsDirty}}]}/>
-				{isLoading ? <AppLoader/> :
-                <div>
-			        <div className="p-fluid">
-                    <div className="p-field p-grid">
-                    <label htmlFor="taskName" className="col-lg-2 col-md-2 col-sm-12">Name <span style={{color:'red'}}>*</span></label>
-                    <div className="col-lg-4 col-md-4 col-sm-12">
-                        <InputText className={this.state.errors.name ?'input-error':''} id="taskName" type="text" value={this.state.task.name} 
-                        onChange={(e) => this.setTaskParams('name', e.target.value)}/>
-                        <label className="error">
-                            {this.state.errors.name ? this.state.errors.name : ""}
-                        </label>
-                    </div>
-                    <label htmlFor="description" className="col-lg-2 col-md-2 col-sm-12">Description <span style={{color:'red'}}>*</span></label>
-                    <div className="col-lg-4 col-md-4 col-sm-12">
-                        <InputTextarea className={this.state.errors.description ?'input-error':''} rows={3} cols={30} value={this.state.task.description} onChange={(e) => this.setTaskParams('description', e.target.value)}/>
-                        <label className="error">
-                            {this.state.errors.description ? this.state.errors.description : ""}
-                        </label>
-                    </div>
-                    </div>
-                    {/* <div className="p-field p-grid">
-                        <label htmlFor="createdAt" className="col-lg-2 col-md-2 col-sm-12">Created At</label>
+                {this.state.userrole[this.state.taskId] && this.state.userrole[this.state.taskId].edit ?
+                <>
+                    <PageHeader location={this.props.location} title={'Task - Edit'} actions={[{icon: 'fa-window-close',
+                    title:'Click to Close Task Edit Page',type: 'button',  actOn: 'click',props : { pathname:  `/task/view/draft/${this.state.task?this.state.task.id:''}`,callback: this.checkIsDirty}}]}/>
+                    {isLoading ? <AppLoader/> :
+                    <div>
+                        <div className="p-fluid">
+                        <div className="p-field p-grid">
+                        <label htmlFor="taskName" className="col-lg-2 col-md-2 col-sm-12">Name <span style={{color:'red'}}>*</span></label>
                         <div className="col-lg-4 col-md-4 col-sm-12">
-                            <Calendar showTime={true} hourFormat="24" value={created_at} onChange={(e) => this.setState({date2: e.value})}></Calendar>
+                            <InputText className={this.state.errors.name ?'input-error':''} id="taskName" type="text" value={this.state.task.name} 
+                            onChange={(e) => this.setTaskParams('name', e.target.value)}/>
+                            <label className="error">
+                                {this.state.errors.name ? this.state.errors.name : ""}
+                            </label>
                         </div>
-                        <label htmlFor="updatedAt" className="col-lg-2 col-md-2 col-sm-12">Updated At</label>
+                        <label htmlFor="description" className="col-lg-2 col-md-2 col-sm-12">Description <span style={{color:'red'}}>*</span></label>
                         <div className="col-lg-4 col-md-4 col-sm-12">
-                            <Calendar showTime={true} hourFormat="24" value={updated_at} onChange={(e) => this.setState({date2: e.value})}></Calendar>
+                            <InputTextarea className={this.state.errors.description ?'input-error':''} rows={3} cols={30} value={this.state.task.description} onChange={(e) => this.setTaskParams('description', e.target.value)}/>
+                            <label className="error">
+                                {this.state.errors.description ? this.state.errors.description : ""}
+                            </label>
                         </div>
-                        </div> 
-                    */}
-                    <div className="p-field p-grid">
-                    <label htmlFor="tags" className="col-lg-2 col-md-2 col-sm-12">Tags</label>
-                    <div className="col-lg-4 col-md-4 col-sm-12">
-                        <Chips value={this.state.task.tags?this.state.task.tags:[]} onChange={(e) => this.setTaskParams('tags', e.value)}></Chips>
-                    </div>
-                    {/* <label htmlFor="doCancel" className="col-lg-2 col-md-2 col-sm-12">Do Cancel</label>
-                    <div className="col-lg-4 col-md-4 col-sm-12">
-                        <Checkbox onChange={e => this.setTaskParams('do_cancel', e.checked)} checked={this.state.task.do_cancel}></Checkbox>
-                    </div> */}
-                    {this.state.schedulingUnit &&
-                    <>
-                        <label className="col-lg-2 col-md-2 col-sm-12">Scheduling Unit</label>
-                        <Link className="col-lg-4 col-md-4 col-sm-12" to={ { pathname:'/schedulingunit/view', state: {id: this.state.schedulingUnit.id}}}>{this.state.schedulingUnit?this.state.schedulingUnit.name:''}</Link>
-                    </>
-                    }
-                    </div>
-                    <div className="p-field p-grid">
-                        <label htmlFor="tags" className="col-lg-2 col-md-2 col-sm-12">Template</label>
+                        </div>
+                        {/* <div className="p-field p-grid">
+                            <label htmlFor="createdAt" className="col-lg-2 col-md-2 col-sm-12">Created At</label>
+                            <div className="col-lg-4 col-md-4 col-sm-12">
+                                <Calendar showTime={true} hourFormat="24" value={created_at} onChange={(e) => this.setState({date2: e.value})}></Calendar>
+                            </div>
+                            <label htmlFor="updatedAt" className="col-lg-2 col-md-2 col-sm-12">Updated At</label>
+                            <div className="col-lg-4 col-md-4 col-sm-12">
+                                <Calendar showTime={true} hourFormat="24" value={updated_at} onChange={(e) => this.setState({date2: e.value})}></Calendar>
+                            </div>
+                            </div> 
+                        */}
+                        <div className="p-field p-grid">
+                        <label htmlFor="tags" className="col-lg-2 col-md-2 col-sm-12">Tags</label>
                         <div className="col-lg-4 col-md-4 col-sm-12">
-                            <Dropdown optionLabel="name" optionValue="id" 
-                            value={this.state.task.specifications_template_id} 
-                            options={this.state.taskTemplates} 
-                            onChange={(e) => {this.changeTaskTemplate(e.value)}} 
-                            placeholder="Select Task Template"/>
+                            <Chips value={this.state.task.tags?this.state.task.tags:[]} onChange={(e) => this.setTaskParams('tags', e.value)}></Chips>
+                        </div>
+                        {/* <label htmlFor="doCancel" className="col-lg-2 col-md-2 col-sm-12">Do Cancel</label>
+                        <div className="col-lg-4 col-md-4 col-sm-12">
+                            <Checkbox onChange={e => this.setTaskParams('do_cancel', e.checked)} checked={this.state.task.do_cancel}></Checkbox>
+                        </div> */}
+                        {this.state.schedulingUnit &&
+                        <>
+                            <label className="col-lg-2 col-md-2 col-sm-12">Scheduling Unit</label>
+                            <Link className="col-lg-4 col-md-4 col-sm-12" to={ { pathname:'/schedulingunit/view', state: {id: this.state.schedulingUnit.id}}}>{this.state.schedulingUnit?this.state.schedulingUnit.name:''}</Link>
+                        </>
+                        }
+                        </div>
+                        <div className="p-field p-grid">
+                            <label htmlFor="tags" className="col-lg-2 col-md-2 col-sm-12">Template</label>
+                            <div className="col-lg-4 col-md-4 col-sm-12">
+                                <Dropdown optionLabel="name" optionValue="id" 
+                                value={this.state.task.specifications_template_id} 
+                                options={this.state.taskTemplates} 
+                                onChange={(e) => {this.changeTaskTemplate(e.value)}} 
+                                placeholder="Select Task Template"/>
+                            </div>
                         </div>
+                        </div>
+                        </div>
+                    }
+                    <div className="p-fluid">
+                    <div className="p-grid"><div className="p-col-12">
+                        {this.state.taskSchema?jeditor:""}
                     </div>
                     </div>
-				    </div>
-                }
-                <div className="p-fluid">
-                <div className="p-grid"><div className="p-col-12">
-                    {this.state.taskSchema?jeditor:""}
-                </div>
-                </div>
-                </div>
-            
-                <div className="p-grid p-justify-start">
-                <div className="p-col-1">
-                    <Button label="Save" className="p-button-primary" icon="pi pi-check" onClick={this.saveTask} disabled={!this.state.validEditor || !this.state.validForm} />
-                </div>
-                <div className="p-col-1">
-                    <Button label="Cancel" className="p-button-danger" icon="pi pi-times" onClick={this.checkIsDirty}  />
-                </div>
-                </div>
-                <div className="p-grid" data-testid="confirm_dialog">
-                    <CustomDialog type="confirmation" visible={this.state.showDialog} width="40vw"
-                        header={'Edit Task'} message={'Do you want to leave this page? Your changes may not be saved.'} 
-                        content={''} onClose={this.close} onCancel={this.close} onSubmit={this.cancelEdit}>
-                    </CustomDialog>
-                </div>
+                    </div>
+                
+                    <div className="p-grid p-justify-start">
+                    <div className="p-col-1">
+                        <Button label="Save" className="p-button-primary" icon="pi pi-check" onClick={this.saveTask} disabled={!this.state.validEditor || !this.state.validForm} />
+                    </div>
+                    <div className="p-col-1">
+                        <Button label="Cancel" className="p-button-danger" icon="pi pi-times" onClick={this.checkIsDirty}  />
+                    </div>
+                    </div>
+                    <div className="p-grid" data-testid="confirm_dialog">
+                        <CustomDialog type="confirmation" visible={this.state.showDialog} width="40vw"
+                            header={'Edit Task'} message={'Do you want to leave this page? Your changes may not be saved.'} 
+                            content={''} onClose={this.close} onCancel={this.close} onSubmit={this.cancelEdit}>
+                        </CustomDialog>
+                    </div>
+                </>: <AccessDenied/>}
             </React.Fragment>
         );
     }
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/list.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/list.js
index ea37b6ee52fbf8a21eb9052bdafc17621d273d8a..580724bf427183a33697b1450dc0cdd573975664 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/list.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/list.js
@@ -17,26 +17,36 @@ import { CustomDialog } from '../../layout/components/CustomDialog';
 import UnitConverter from '../../utils/unit.converter';
 import UtilService from '../../services/util.service';
 import { Link } from 'react-router-dom';
+import AuthUtil from '../../utils/auth.util';
+import AuthStore from '../../authenticate/auth.store';
+import AccessDenied from '../../layout/components/AccessDenied';
 
 export class TaskList extends Component {
     
     // The following values should be lower case
     ignoreSorting = ['status logs'];
     TASK_END_STATUSES = ['finished', 'error', 'cancelled'];
-    TASK_DRAFT_EXPAND = 'task_blueprints,task_blueprints.subtasks,scheduling_unit_draft';
-    TASK_BLUEPRINT_EXPAND = 'subtasks,subtasks.output_dataproducts,draft,scheduling_unit_blueprint';
+    TASK_DRAFT_EXPAND = 'task_blueprints,task_blueprints.subtasks,scheduling_unit_draft,scheduling_unit_draft.scheduling_set';
+    TASK_BLUEPRINT_EXPAND = 'subtasks,subtasks.output_dataproducts,draft,scheduling_unit_blueprint,draft.scheduling_unit_draft,draft.scheduling_unit_draft.scheduling_set';
+    COMMA_SEPARATE_TOOLTIP ='Enter Id and press ‘Enter’ key to search. For multiple values enter comma separated values. For range, provide input like 1..6';
+
     constructor(props) {
         super(props);
+        this.getUIAttr();
         this.state = {
-            taskType: 'Draft',
+            taskType: this.taskUIAttr['listType'] || 'Draft',
             isLoading: true,
             tasks: [],
             paths: [{
                 "View": "/task",
             }],
+            userrole: {
+                userRolePermission: {}
+            },
             columnOrders: [
                 "Status Logs",
                 "Status",
+                "Project",
                 "Scheduling Unit ID",
                 "Scheduling Unit Name",
                 "ID",
@@ -69,18 +79,26 @@ export class TaskList extends Component {
                     filter: "select"
                 },
                 scheduling_unit_draft: {
-                    name:"Scheduling Unit ID"
+                    name:"Scheduling Unit ID",
+                    tooltip: this.COMMA_SEPARATE_TOOLTIP
                 },
                 scheduling_unit_blueprint: {
-                    name:"Scheduling Unit ID"
+                    name:"Scheduling Unit ID",
+                    tooltip: this.COMMA_SEPARATE_TOOLTIP
                 },
                 schedulingUnitName: {
-                    name:"Scheduling Unit Name"},
+                    name:"Scheduling Unit Name"
+                },
+                project: {
+                    name: "Project"
+                },
                 id: {
-                    name:"ID"
+                    name:"ID",
+                    tooltip: this.COMMA_SEPARATE_TOOLTIP
                 },
                 subTaskID: {
-                    name:"Control ID"
+                    name:"Control ID",
+                    tooltip: this.COMMA_SEPARATE_TOOLTIP
                 },
                 name: {
                     name:"Name"
@@ -90,22 +108,25 @@ export class TaskList extends Component {
                 },
                 start_time: {
                     name: "Start Time",
-                    filter: "date",
+                    filter: "flatpickrDateRange",
                     format: UIConstants.CALENDAR_DATETIME_FORMAT
                 },
                 stop_time: {
                     name: "End Time",
-                    filter: "date",
+                    filter: "flatpickrDateRange",
                     format: UIConstants.CALENDAR_DATETIME_FORMAT
                 },
                 duration: {
-                    name:"Duration (HH:mm:ss)"
+                    name:"Duration (HH:mm:ss)",
+                    filter: "durationMinMax",
                 },
                 relative_start_time: {
-                    name:"Relative Start Time (HH:mm:ss)"
+                    name:"Relative Start Time (HH:mm:ss)",
+                    filter: "durationMinMax",
                 },
                 relative_stop_time: {
-                    name:"Relative End Time (HH:mm:ss)"
+                    name:"Relative End Time (HH:mm:ss)",
+                    filter: "durationMinMax",
                 },
                 noOfOutputProducts: {
                     name:"#Dataproducts"
@@ -129,19 +150,20 @@ export class TaskList extends Component {
                     name:"Tags"
                 },
                 draft: {
-                    name:"Linked Draft ID"
+                    name:"Linked Draft ID",
+                    tooltip: this.COMMA_SEPARATE_TOOLTIP
                 },
                 url: {
                     name:"API URL"
                 },
                 created_at: {
                     name: "Created at",
-                    filter: "date",
+                    filter: "flatpickrDateRange",
                     format: UIConstants.CALENDAR_DATETIME_FORMAT
                 },
                 updated_at: {
                     name: "Updated at",
-                    filter: "date",
+                    filter: "flatpickrDateRange",
                     format: UIConstants.CALENDAR_DATETIME_FORMAT
                 },
                 actionpath: "actionpath"
@@ -151,12 +173,13 @@ export class TaskList extends Component {
                 "Type": "filter-input-75",
                 "Scheduling Unit ID": "filter-input-50",
                 "Scheduling Unit Name": "filter-input-100",
+                "Project":"filter-input-100",
                 "ID": "filter-input-50",
                 "Control ID": "filter-input-75",
                 "Cancelled": "filter-input-50",
                 "Duration (HH:mm:ss)": "filter-input-75",
                 "Template ID": "filter-input-50",
-                "Linked Draft ID": "filter-input-50",
+                "Linked Draft ID": "filter-input-75",
                 "Relative Start Time (HH:mm:ss)": "filter-input-75",
                 "Relative End Time (HH:mm:ss)": "filter-input-75",
                 "Start Time": "filter-input-150",
@@ -166,11 +189,15 @@ export class TaskList extends Component {
                 "Data size": "filter-input-50",
                 "Data size on Disk": "filter-input-50",
                 "Subtask Content": "filter-input-75",
-                "Linked BluePrint ID": "filter-input-50",
-                "API URL":"filter-input-175"
+                "Linked BluePrint ID": "filter-input-75",
+                "API URL":"filter-input-175",
+                "Created at":"filter-input-150",
+                "Updated at":"filter-input-150",
             }],
             actions: []
         };
+        this.statusList = [];
+        this.access_denied_message = "Don't have permission";
         this.pageUpdated = true;
         this.taskTypeList = [{name: 'Blueprint'}, {name: 'Draft'}];
         this.filterQry = '';
@@ -192,6 +219,7 @@ export class TaskList extends Component {
         this.getTaskCancelStatusContent = this.getTaskCancelStatusContent.bind(this);
         this.changeTaskType = this.changeTaskType.bind(this);
         this.fetchTableData = this.fetchTableData.bind(this);
+        this.getFilterOptions = this.getFilterOptions.bind(this);
     }
 
     subtaskComponent = (task) => {
@@ -210,6 +238,7 @@ export class TaskList extends Component {
     getFormattedTaskBlueprints(tasks) {
         let taskBlueprintsList = [];
         for (const taskBlueprint of tasks) {
+            taskBlueprint['project'] = taskBlueprint.draft.scheduling_unit_draft.scheduling_set.project_id;
             taskBlueprint['status_logs'] = this.subtaskComponent(taskBlueprint);
             taskBlueprint['tasktype'] = 'Blueprint';
             taskBlueprint['actionpath'] = '/task/view/blueprint/' + taskBlueprint['id'];
@@ -243,7 +272,7 @@ export class TaskList extends Component {
             scheduletask['actionpath'] = '/task/view/draft/' + task['id'];
             scheduletask['blueprint_draft'] = this.getLinksList(task['task_blueprints_ids'], 'blueprint');
             scheduletask['status'] = task['status'];
-
+            scheduletask['project'] = task.scheduling_unit_draft.scheduling_set.project_id;
             //fetch task draft details
             for (const key of commonkeys) {
                 scheduletask[key] = task[key];
@@ -295,13 +324,50 @@ export class TaskList extends Component {
     async componentDidMount() {
         await this.getFilterColumns(this.state.taskType.toLowerCase());
         this.setToggleBySorting();
-        this.subtaskTemplates = await TaskService.getSubtaskTemplates()
-        const actions = [{icon: 'fa fa-ban', title: 'Cancel Task(s)',
-                                    type: 'button', actOn: 'click', props: { callback: this.confirmCancelTasks }},
-                                {icon: 'fa fa-trash', title: 'Delete Task(s)',
-                                    type: 'button', actOn: 'click', props: { callback: this.confirmDeleteTasks }}
-                                ];
-        this.setState({ tasks: [], isLoading: false, actions: actions, loadingStatus: false });
+        const permission = await AuthUtil.getUserRolePermission();
+        const {task, task_blueprint, task_draft} = permission.userRolePermission
+        this.subtaskTemplates = await TaskService.getSubtaskTemplates();
+        let actions = [];
+        if(this.state.taskType === 'Draft'){
+            actions = [{icon: 'fa fa-ban', 
+                        title: task_draft.canceltask?'Cancel Task(s)': `${this.access_denied_message} to cancel Task(s)`,
+                        disabled: task_draft.canceltask? !task_draft.canceltask: true,
+                        type: 'button', actOn: 'click', props: { callback: this.confirmCancelTasks }},
+                        {icon: 'fa fa-trash', 
+                         title: task.delete?'Delete Task(s)':`${this.access_denied_message} to delete Task(s)`,
+                         disabled: task.delete? !task.delete: true,
+                         type: 'button', actOn: 'click', props: { callback: this.confirmDeleteTasks }}
+                        ];
+        }
+        else {
+            actions = [{icon: 'fa fa-ban', 
+                        title: task_blueprint.canceltask?'Cancel Task(s)': `${this.access_denied_message} to cancel Task(s)`,
+                        disabled: task_blueprint.canceltask? !task_blueprint.canceltask: true,
+                        type: 'button', actOn: 'click', props: { callback: this.confirmCancelTasks }},
+                         {icon: 'fa fa-trash', 
+                            title: task.delete?'Delete Task(s)':`${this.access_denied_message} to delete Task(s)`,
+                            disabled: task.delete? !task.delete: true,
+                            type: 'button', actOn: 'click', props: { callback: this.confirmDeleteTasks }}
+                        ];
+        }
+        this.setState({ tasks: [], isLoading: false, actions: actions, loadingStatus: false, userrole: permission });
+    }
+
+    /**
+     * Function to get the UI attributes from local storage that are stored in the previous view
+     */
+    getUIAttr() {
+        this.taskUIAttr = UtilService.localStore({ type: 'get', key: 'TASK_LIST_UI_ATTR' }) || {};
+    }
+
+    /**
+     * Function that stores the preferred values in local storage to restore the same in the next view
+     * @param {string} key 
+     * @param {Object} value 
+     */
+    storeUIAttr(key, value) {
+        this.taskUIAttr[key] = value;
+        UtilService.localStore({ type: 'set', key: 'TASK_LIST_UI_ATTR', value: this.taskUIAttr }); 
     }
 
     toggleBySorting = (sortData) => {
@@ -540,6 +606,7 @@ export class TaskList extends Component {
             }
         }
         this.getTaskLists(this.state.taskType, this.filterQry, this.orderBy, this.limit, this.offset);
+        this.storeUIAttr('listType', type)
     }
 
     /**
@@ -571,12 +638,25 @@ export class TaskList extends Component {
         tmpDefaulColumns = _.omit(tmpDefaulColumns,columnDefinitionToRemove);
         tmpOptionalColumns = _.omit(tmpOptionalColumns,columnDefinitionToRemove);
         if(taskFilters) {
+            this.getStatusList(taskFilters);
             tmpDefaulColumns = this.getAPIFilter(taskFilters, tmpDefaulColumns);
             tmpOptionalColumns = this.getAPIFilter(taskFilters, tmpOptionalColumns);
             await this.setState({tmpDefaulcolumns: [tmpDefaulColumns], tmpOptionalcolumns:[tmpOptionalColumns], tmpColumnOrders: tmpColumnOrders, columnMap: this.columnMap})
         }
     }
 
+    /**
+     * Get Status list frol filter
+     * @param {Array} suFilters 
+     */
+     getStatusList(taskFilters) {
+        if (taskFilters.data.filters['status']) {
+            taskFilters.data.filters['status'].choices.forEach(choice => {
+                this.statusList.push(choice.value);
+            })
+        }
+    }
+
     getAPIFilter(taskFilters, columnDef) {
         const defaultColKeys = Object.keys(columnDef);
         defaultColKeys.forEach(key => {
@@ -593,11 +673,35 @@ export class TaskList extends Component {
                 columnDef[key]['disableSortBy'] = !_.includes(taskFilters.data.ordering, tempKey);
                 columnDef[key]['disableFilters'] = false;
                 if(UIConstants.FILTER_MAP[taskFilters.data.filters[tempKey].type]) {
-                    if (tempKey === 'draft') { //this condition because to avoid dropdown filter for 'Linked Draft ID'
+                    /*if (tempKey === 'draft') { //this condition because to avoid dropdown filter for 'Linked Draft ID'
                         taskFilters.data.filters[tempKey].type = 'CharFilter';
-                    }
+                    }*/
                     columnDef[key]['filter'] = UIConstants.FILTER_MAP[taskFilters.data.filters[tempKey].type];
                 }
+            }   else if (key === 'subTaskID' && taskFilters.data.filters['subtasks']) {
+                    columnDef[key]['disableSortBy'] = !_.includes(taskFilters.data.ordering, 'subtasks');
+                    columnDef[key]['disableFilters'] = false;
+            }   else if (tempKey === 'schedulingUnitName' && 
+                    (taskFilters.data.filters['scheduling_unit_draft_name'] || taskFilters.data.filters['scheduling_unit_blueprint_name'])) {
+                if (this.state.taskType === 'Draft') {
+                    columnDef[key]['disableSortBy'] = !_.includes(taskFilters.data.ordering, 'scheduling_unit_draft_name');
+                    columnDef[key]['disableFilters'] = false;
+                }   else {
+                    columnDef[key]['disableSortBy'] = !_.includes(taskFilters.data.ordering, 'scheduling_unit_blueprint_name');
+                    columnDef[key]['disableFilters'] = false;
+                }
+            }   else if (key === 'duration' && taskFilters.data.filters['duration_min']) {
+                columnDef[key]['disableSortBy'] = !_.includes(taskFilters.data.ordering, 'duration_min');
+                columnDef[key]['disableFilters'] = false;
+            }   else if (key === 'relative_start_time' && taskFilters.data.filters['relative_start_time_min']) {
+                columnDef[key]['disableSortBy'] = !_.includes(taskFilters.data.ordering, 'relative_start_time_min');
+                columnDef[key]['disableFilters'] = false;
+            }   else if (key === 'relative_stop_time' && taskFilters.data.filters['relative_stop_time_min']) {
+                columnDef[key]['disableSortBy'] = !_.includes(taskFilters.data.ordering, 'relative_stop_time_min');
+                columnDef[key]['disableFilters'] = false;
+            }   else if (key === 'draft' && taskFilters.data.filters['task_blueprints']) {
+                columnDef[key]['disableSortBy'] = !_.includes(taskFilters.data.ordering, 'task_blueprints');
+                columnDef[key]['disableFilters'] = false;
             }   else if (columnDef[key]['name']) {
                 columnDef[key]['disableSortBy'] = true;
                 columnDef[key]['disableFilters'] = true;
@@ -627,17 +731,38 @@ export class TaskList extends Component {
     async getTaskLists(taskType, filterQry, orderBy, limit, offset) {
         let expand = taskType.toLowerCase() === 'draft' ? this.TASK_DRAFT_EXPAND: this.TASK_BLUEPRINT_EXPAND;
         let response = await TaskService.getExpandedTasksWithFilter(taskType.toLowerCase(), expand, filterQry, orderBy, limit, offset);
+        const {task, task_draft, task_blueprint} = this.state.userrole.userRolePermission
         if (response && response.data) {
             this.totalPage = response.data.count;
             let tasks = taskType.toLowerCase() === 'draft' ? (await this.getFormattedTaskDrafts(response.data.results)) : this.getFormattedTaskBlueprints(response.data.results);
             let ingestGroup = tasks.map(task => ({ name: task.name, canIngest: task.canIngest, type_value: task.type_value, id: task.id }));
             ingestGroup = _.groupBy(_.filter(ingestGroup, 'type_value'), 'type_value');
             tasks = await this.formatDataProduct(tasks);
-            const actions = [{icon: 'fa fa-ban', title: 'Cancel Task(s)',
-                                type: 'button', actOn: 'click', props: { callback: this.confirmCancelTasks }},
-                            {icon: 'fa fa-trash', title: 'Delete Task(s)',
+            let actions = [];
+            if(task_blueprint && task_draft){
+            if(taskType === 'draft'){
+                actions = [{icon: 'fa fa-ban', 
+                            title: task_draft.canceltask?'Cancel Task(s)': `${this.access_denied_message} to cancel Task(s)`,
+                            disabled: task_draft.canceltask? !task_draft.canceltask: true,
+                            type: 'button', actOn: 'click', props: { callback: this.confirmCancelTasks }},
+                            {icon: 'fa fa-trash', 
+                                title: task.delete?'Delete Task(s)':`${this.access_denied_message} to delete Task(s)`,
+                                disabled: task.delete? !task.delete: true,
+                                type: 'button', actOn: 'click', props: { callback: this.confirmDeleteTasks }}
+                            ];
+            }
+            else {
+                actions = [{icon: 'fa fa-ban', 
+                            title: task_blueprint.canceltask?'Cancel Task(s)': `${this.access_denied_message} to cancel Task(s)`,
+                            disabled: task_blueprint.canceltask? !task_blueprint.canceltask: true,
+                            type: 'button', actOn: 'click', props: { callback: this.confirmCancelTasks }},
+                                {icon: 'fa fa-trash', 
+                                title: task.delete?'Delete Task(s)':`${this.access_denied_message} to delete Task(s)`,
+                                disabled: task.delete? !task.delete: true,
                                 type: 'button', actOn: 'click', props: { callback: this.confirmDeleteTasks }}
                             ];
+            }
+        }
             this.setState({ tasks: tasks, isLoading: false, actions: actions, loadingStatus: false });
         }   else {
             appGrowl.show({severity: 'error', summary: 'Error', detail: 'Unable to fetch records'});
@@ -654,18 +779,78 @@ export class TaskList extends Component {
         this.orderBy = '';
         this.pageUpdated = true;
         this.setState({loadingStatus:true});
-        for( const filter of state.filters) {
+        let filters = UtilService.localStore({ type: 'get', key: "su_task_list_"+this.state.taskType });
+        if(filters.length > 0 ) {
+            for( const filter of filters) {
             if (filter.id === 'Start Time') {
-                this.filterQry += 'start_time_after='+filter.value+'&start_time_before='+_.replace(filter.value, '00:00:00', '23:59:59')+'&';
+                const values = _.split(filter.value, ",");
+                if (values.length>2){
+                    continue;
+                }
+                if((values[0] && values[0] != '' && values[0] != 'null') && (values[1] && values[1] != '' && values[1] != 'null')) {
+                    this.filterQry += 'start_time_after='+ moment(new Date(values[0])).format("YYYY-MM-DDT00:00:00")+".000Z&";
+                    this.filterQry += 'start_time_before='+moment(new Date(values[1])).format("YYYY-MM-DDT23:59:59")+".000Z&";
+                }
             }   else if (filter.id === 'End Time') {
-                this.filterQry += 'stop_time_after='+filter.value+'&stop_time_before='+_.replace(filter.value, '00:00:00', '23:59:59')+'&'
-            }   else {
+                const values = _.split(filter.value, ",");
+                if (values.length>2){
+                    continue;
+                }
+                if((values[0] && values[0] != '' && values[0] != 'null') && (values[1] && values[1] != '' && values[1] != 'null')) {
+                    this.filterQry += 'stop_time_after='+ moment(new Date(values[0])).format("YYYY-MM-DDT00:00:00")+".000Z&";
+                    this.filterQry += 'stop_time_before='+moment(new Date(values[1])).format("YYYY-MM-DDT23:59:59")+".000Z&";
+                }
+            }   else if (filter.id === 'Scheduling Unit Name') {
+                if (this.state.taskType === 'Draft') {
+                    this.filterQry += 'scheduling_unit_draft_name='+filter.value+'&';
+                }   else {
+                    this.filterQry += 'scheduling_unit_blueprint_name='+filter.value+'&';
+                }
+            }   else if ((filter.id === 'Duration (HH:mm:ss)' || filter.id === 'Relative Start Time (HH:mm:ss)' || filter.id === 'Relative End Time (HH:mm:ss)') && filter.value != '') {
+                let columnDetails = _.find(this.state.columnMap, {displayName:filter.id});
+                const values = _.split(filter.value, ",");
+                if (values[0].includes(":")) {
+                    this.filterQry += columnDetails.orgField+"_min" +'=PT'+UnitConverter.getHHmmssToSecs(values[0])+'S&';
+                }
+                if (values[1].includes(":")) {
+                    this.filterQry += columnDetails.orgField+"_max" +'=PT'+UnitConverter.getHHmmssToSecs(values[1])+'S&';
+                }
+            }   else if (filter.id === 'Linked Blueprint ID' && filter.value != '') {
+                const values = UnitConverter.getSubbandOutput(filter.value)
+                _.split(values, ",").forEach(value =>{
+                    if(value && _.trim(value) !== '') {
+                     this.filterQry += 'task_blueprints='+_.trim(value)+'&';
+                    }
+                });
+            }   else if ((filter.id === 'Created at' || filter.id === 'Updated at') && filter.value != '') {
+                let columnDetails = _.find(this.state.columnMap, {displayName:filter.id});
+                const values = _.split(filter.value, ",");
+                if (values.length>2){
+                    continue;
+                }
+                if((values[0] && values[0] != '' && values[0] != 'null') && (values[1] && values[1] != '' && values[1] != 'null')) {
+                    this.filterQry += columnDetails.orgField+'_after='+ moment(new Date(values[0])).format("YYYY-MM-DDT00:00:00")+".000Z&";
+                    this.filterQry += columnDetails.orgField+'_before='+moment(new Date(values[1])).format("YYYY-MM-DDT23:59:59")+".000Z&";
+                }
+            }   else if ((filter.id === 'Control ID') && filter.value != '') {
+                const values = UnitConverter.getSubbandOutput(filter.value);
+                _.split(values, ",").forEach(value =>{
+                    if(value && _.trim(value) !== '') {
+                     this.filterQry += 'subtasks='+_.trim(value)+'&';
+                    }
+                });
+            }   else if ((filter.id === 'Scheduling Unit ID' || filter.id === 'Linked Draft ID'|| filter.id === 'ID') && filter.value != '') {
+                let columnDetails = _.find(this.state.columnMap, {displayName:filter.id});
+                const values = UnitConverter.getSubbandOutput(filter.value);
+                this.filterQry +=  columnDetails.orgField+'='+values.toString()+"&";
+            }    else {
                 let columnDetails = _.find(this.state.columnMap, {displayName:filter.id});
                 if(columnDetails) {
-                    this.filterQry += columnDetails.orgField +'='+filter.value+'&'
+                    this.filterQry += columnDetails.orgField +'='+_.trim(filter.value)+'&'
                 }
             }
         }
+    }
         let sortBy = state.sortBy?state.sortBy[0]:null;
         if (sortBy) {
             this.setState({defaultSortColumn: [sortBy]}); 
@@ -680,66 +865,90 @@ export class TaskList extends Component {
         return [this.state.tasks, this.totalPage]; 
      }
 
+     /**
+     * Get Option-list values for Select Dropdown filter in 'Viewtable'
+     * @param {String} id : Column id
+     * @returns 
+     */
+    getFilterOptions(id) {
+        let options = null;
+        if(id && id === 'Status') {
+            options = this.statusList;
+        }
+        return options;
+    }
+
     render() {
         if (this.state.redirect) {
             return <Redirect to={{ pathname: this.state.redirect }}></Redirect>
         }
+        const {task} = this.state.userrole.userRolePermission
 
         return (
             <React.Fragment>
-                <PageHeader location={this.props.location} title={'Task - List'} actions={this.state.actions}/>
-                {this.state.isLoading ? <AppLoader /> :
+                {task &&
+                <>
+                    {task.list?
                     <>
-                        <div className="p-select " style={{position: 'relative'}}>
-                            <div className="p-field p-grid" style={{position: 'absolute', marginLeft: '-11em', top: '-2em'}}>
-                                <label>Select Task Blueprint/Draft</label>
-                                    <span className="p-float-label">
-                                        <Dropdown inputId="tasktype" optionLabel="name" optionValue="name" 
-                                            tooltip="Task Type" tooltipOptions={this.tooltipOptions}
-                                            value={this.state.taskType}
-                                            options={this.taskTypeList} 
-                                            onChange={(e) => {this.changeTaskType( e.value)}} 
-                                            style={{width: '10em', marginLeft: '0.5em'}}
-                                            />
-                                    </span>
+                        <PageHeader location={this.props.location} title={'Task - List'} 
+                            actions={this.state.actions}/>
+                        {this.state.isLoading ? <AppLoader /> :
+                        <>
+                            <div className="p-select " style={{position: 'relative'}}>
+                                <div className="p-field p-grid" style={{position: 'absolute', marginLeft: '-11em', top: '-2em'}}>
+                                    <label>Select Task Blueprint/Draft</label>
+                                        <span className="p-float-label">
+                                            <Dropdown inputId="tasktype" optionLabel="name" optionValue="name" 
+                                                tooltip="Task Type" tooltipOptions={this.tooltipOptions}
+                                                value={this.state.taskType}
+                                                options={this.taskTypeList} 
+                                                onChange={(e) => {this.changeTaskType( e.value)}} 
+                                                style={{width: '10em', marginLeft: '0.5em'}}
+                                                />
+                                        </span>
+                                </div>
                             </div>
-                        </div>
-                        <ViewTable
-                            data={this.state.tasks}
-                            totalPage={this.totalPage}
-                            defaultcolumns={this.state.tmpDefaulcolumns ? this.state.tmpDefaulcolumns : this.state.defaultcolumns} 
-                            optionalcolumns={this.state.tmpOptionalcolumns ? this.state.tmpOptionalcolumns : this.state.optionalcolumns}
-                            columnclassname={this.state.columnclassname}
-                            columnOrders={this.state.tmpColumnOrders}
-                            defaultSortColumn={this.defaultSortColumn}
-                            showaction="true"
-                            keyaccessor="id"
-                            paths={this.state.paths}
-                            unittest={this.state.unittest}
-                            tablename={"su_task_list_"+this.state.taskType}
-                            allowRowSelection={true}
-                            onRowSelection={this.onRowSelection}
-                            lsKeySortColumn={this.lsKeySortColumn}
-                            toggleBySorting={(sortData) => this.toggleBySorting(sortData)}
-                            ignoreSorting={this.ignoreSorting}
-                            pageUpdated={this.pageUpdated}
-                            callBackFunction={this.fetchTableData} 
-                            loadingStatus={this.state.loadingStatus}
-                            showGlobalFilter={false}
-                        />
-                    </>
-                }
-                {this.state.showStatusLogs &&
-                    <Dialog header={`Status change logs - ${this.state.task ? this.state.task.name : ""}`}
-                        visible={this.state.showStatusLogs} maximizable maximized={false} position="left" style={{ width: '50vw' }}
-                        onHide={() => { this.setState({ showStatusLogs: false }) }}>
-                        <TaskStatusLogs taskId={this.state.task.id}></TaskStatusLogs>
-                    </Dialog>
-                }
-                <CustomDialog type="confirmation" visible={this.state.dialogVisible}
-                    header={this.state.dialog.header} message={this.state.dialog.detail} actions={this.state.dialog.actions}
-                    content={this.state.dialog.content} width={this.state.dialog.width} showIcon={this.state.dialog.showIcon}
-                    onClose={this.closeDialog} onCancel={this.closeDialog} onSubmit={this.state.dialog.onSubmit} />
+                            <ViewTable
+                                data={this.state.tasks}
+                                totalPage={this.totalPage}
+                                defaultcolumns={this.state.tmpDefaulcolumns ? this.state.tmpDefaulcolumns : this.state.defaultcolumns} 
+                                optionalcolumns={this.state.tmpOptionalcolumns ? this.state.tmpOptionalcolumns : this.state.optionalcolumns}
+                                columnclassname={this.state.columnclassname}
+                                columnOrders={this.state.tmpColumnOrders}
+                                defaultSortColumn={this.defaultSortColumn}
+                                showFilterOption={this.getFilterOptions} //Callback function to provide inputs for option-list in Select Dropdown filter
+                                showaction="true"
+                                keyaccessor="id"
+                                paths={this.state.paths}
+                                unittest={this.state.unittest}
+                                tablename={"su_task_list_"+this.state.taskType}
+                                allowRowSelection={true}
+                                onRowSelection={this.onRowSelection}
+                                lsKeySortColumn={this.lsKeySortColumn}
+                                toggleBySorting={(sortData) => this.toggleBySorting(sortData)}
+                                ignoreSorting={this.ignoreSorting}
+                                pageUpdated={this.pageUpdated}
+                                callBackFunction={this.fetchTableData} 
+                                loadingStatus={this.state.loadingStatus}
+                                showGlobalFilter={false}
+                                storeFilter={true}
+                            />
+                        </>
+                        }
+                        {this.state.showStatusLogs &&
+                            <Dialog header={`Status change logs - ${this.state.task ? this.state.task.name : ""}`}
+                                visible={this.state.showStatusLogs} maximizable maximized={false} position="left" style={{ width: '50vw' }}
+                                onHide={() => { this.setState({ showStatusLogs: false }) }}
+                                className="content_dlg">
+                                <TaskStatusLogs taskId={this.state.task.id}></TaskStatusLogs>
+                            </Dialog>
+                        }
+                        <CustomDialog type="confirmation" visible={this.state.dialogVisible}
+                            header={this.state.dialog.header} message={this.state.dialog.detail} actions={this.state.dialog.actions}
+                            content={this.state.dialog.content} width={this.state.dialog.width} showIcon={this.state.dialog.showIcon}
+                            onClose={this.closeDialog} onCancel={this.closeDialog} onSubmit={this.state.dialog.onSubmit} />
+                    </>:<AccessDenied/>}
+                </>}
             </React.Fragment>
         );
     }
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/state_logs.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/state_logs.js
index bd33d13b192c7efd087bf6580d4bfbd511ced14a..858d439be2a6410f5dc9908062b716166f92f30b 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/state_logs.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/state_logs.js
@@ -3,6 +3,9 @@ import _ from 'lodash';
 import TaskService from '../../services/task.service';
 import ViewTable from '../../components/ViewTable';
 import AppLoader from '../../layout/components/AppLoader';
+import { Button } from 'primereact/button';
+import UtilService from '../../services/util.service';
+import UIConstants from '../../utils/ui.constants';
 
 /**
  * Component that list down the status change logs of subtasks
@@ -11,39 +14,93 @@ export class TaskStatusLogs extends Component {
 
     constructor(props) {
         super(props);
+        this.getStoreAttributes();
         this.state = {
             isLoading: true,
-            logs: []
+            logs: [],
+            showLatest: this.taskListAttribute["showLatestLogs"] || false,
+            defaultSortColumn: [this.taskListAttribute["statusLogSorting"] || {id: 'Updated At', desc: true}]
         }
+        this.setShowLatest = this.setShowLatest.bind(this);
     }
 
     async componentDidMount() {
         let logs = await TaskService.getTaskStatusLogs(this.props.taskId);
-        logs = _.sortBy(logs, ['subtask_id', 'updated_at']);
+        // logs = _.sortBy(logs, ['subtask_id', 'updated_at']);
         this.setState({logs: logs, isLoading: false});
     }
 
+    /**
+     * Function to show latest or all logs and store the option selected for rendering the same when opened again.
+     */
+    setShowLatest() {
+        let showLatest = !this.state.showLatest
+        this.taskListAttribute['showLatestLogs'] = showLatest;
+        this.setState({showLatest: showLatest});
+        this.setStoreAttributes();
+    }
+
+    /**
+     * Callback function passed to ViewTable component. This function is called from the ViewTable component
+     * when sorting on a column and the sorting option is stored in the local storage.
+     * @param {Object} sortData 
+     */
+    toggleBySorting(sortData) {
+        this.taskListAttribute["statusLogSorting"] = sortData;
+        this.setStoreAttributes();
+    }
+    
+    /**
+     * Function to retrieve the stored attributes for this component.
+     */
+    getStoreAttributes() {
+        this.taskListAttribute = UtilService.localStore({ type: 'get', key: "TASK_LIST_UI_ATTR" }) || {};
+    }
+
+    /**
+     * Function to store the attributes of the component to use on re-initialization
+     */
+    setStoreAttributes() {
+        UtilService.localStore({ type: 'set', key: 'TASK_LIST_UI_ATTR', value: this.taskListAttribute });
+    }
+
     render() {
+        let logs = _.sortBy(this.state.logs, ['subtask_id', 'updated_at']);
+        if (this.state.showLatest) {
+            logs = _(logs).orderBy(['subtask_id', 'updated_at'], ['asc', 'desc']).uniqBy('subtask_id').value();
+        }
         return(
             <React.Fragment>
             { this.state.isLoading? <AppLoader /> : 
-                <ViewTable 
-                    data={this.state.logs} 
-                    defaultcolumns={[{subtask_id: "Subtask Id", subtask_type: "Type", updated_at: "Updated At", 
-                                        old_state_value: "From State", new_state_value: "To State", user: 'User'}]} 
-                    optionalcolumns={[{}]}
-                    columnclassname={[{"Subtask Id": "filter-input-75", "Type": "filter-input-75",
-                                        "Updated At": "filter-input-75", "From State": "filter-input-75",
-                                        "To State": "filter-input-75", "User": "filter-input-75"}]}
-                    defaultSortColumn={[{}]}
-                    showaction="false"
-                    keyaccessor="id"
-                    paths={this.state.paths}
-                    defaultpagesize={this.state.logs.length}
-                    showTopTotal={false}
-                    showGlobalFilter={false}
-                    allowColumnSelection={false}
-                />
+                <div className="p-grid">
+                    <div className="col-lg-12" style={{zIndex:"1"}}>
+                        <Button className="dialog-btn" label={this.state.showLatest?"Show All":"Show Latest Only"} 
+                            style={{width:"150px"}} 
+                            // icon={`pi ${this.state.showLatest?"pi-angle-left":"pi-angle-right"}`} 
+                            // iconPos={`${this.state.showLatest?"left":"right"}`}
+                            onClick={(e) => this.setShowLatest()} />
+                    </div>
+                    <div className="col-lg-12" style={{marginTop:"-30px", zIndex:"0"}}>
+                        <ViewTable 
+                            data={logs} 
+                            defaultcolumns={[{subtask_id: "Subtask Id", subtask_type: "Type", 
+                                                updated_at: {name:"Updated At", format:UIConstants.CALENDAR_DATETIME_FORMAT}, 
+                                                old_state_value: "From State", new_state_value: "To State", user: 'User'}]} 
+                            optionalcolumns={[{}]}
+                            columnclassname={[{"Subtask Id": "filter-input-75", "Type": "filter-input-75",
+                                                "Updated At": "filter-input-75", "From State": "filter-input-75",
+                                                "To State": "filter-input-75", "User": "filter-input-75"}]}
+                            defaultSortColumn={this.state.defaultSortColumn}
+                            toggleBySorting={(sortData) => {this.toggleBySorting(sortData)}}
+                            showAction="false"
+                            keyaccessor="id"
+                            paths={this.state.paths}
+                            showTopTotal={false}
+                            showGlobalFilter={false}
+                            allowColumnSelection={false}
+                        />
+                    </div>
+                </div>
             }
             </React.Fragment>
         );
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/view.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/view.js
index 63498d225bfb465f7d834aebfede6632e7f1aa4b..08f084530c8cdcb7a6281b004da1eeef74aeeec0 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/view.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/view.js
@@ -15,6 +15,8 @@ import TaskStatusLogs from './state_logs';
 import { DataTable } from 'primereact/datatable';
 import { Column } from 'primereact/column';
 import UtilService from '../../services/util.service';
+import AuthUtil from '../../utils/auth.util';
+import AccessDenied from '../../layout/components/AccessDenied';
 
 export class TaskView extends Component {
    // DATE_FORMAT = 'YYYY-MMM-DD HH:mm:ss';
@@ -28,9 +30,13 @@ export class TaskView extends Component {
             isLoading: true,
             confirmDialogVisible: false,
             hasBlueprint: true,
-            dialog: {}
+            dialog: {},
+            userrole: {
+                userRolePermission: {}
+            },
+            permissionById: {}
         };
-
+        this.access_denied_message = "Don't have permission";
         this.setEditorFunction = this.setEditorFunction.bind(this);
         this.deleteTask = this.deleteTask.bind(this);
         this.showDeleteConfirmation = this.showDeleteConfirmation.bind(this);
@@ -62,19 +68,29 @@ export class TaskView extends Component {
     //     return null;
     // }
 
-    componentDidUpdate(prevProps, prevState) {
+    async componentDidUpdate(prevProps, prevState) {
         if (this.state.task && this.props.match.params &&
             (this.state.taskId.toString() !== this.props.match.params.id ||
             this.state.taskType !== this.props.match.params.type)) {
             this.getTaskDetails(this.props.match.params.id, this.props.match.params.type);
        }
+       const moduleName = this.props.match.params.type === 'draft' ? 'task_draft': 'task_blueprint'
+       if(prevState.taskId != this.props.match.params.id || prevState.moduleName !== moduleName ) {
+            const permissionById = await AuthUtil.getUserPermissionByModuleId(moduleName, this.props.match.params.id)
+            this.setState({ permissionById: permissionById, moduleName: moduleName, taskId: this.props.match.params.id});
+       }
+
+
     }
 
-    componentDidMount() {
+    async componentDidMount() {
         const taskId = this.props.location.state?this.props.location.state.id:this.state.taskId;
         let taskType = this.props.location.state && this.props.location.state.type?this.props.location.state.type:this.state.taskType;
         taskType = taskType?taskType:'draft';
-
+        const moduleName = taskType === 'draft' ? 'task_draft': 'task_blueprint'
+        const permission = await AuthUtil.getUserRolePermission();
+        const permissionById = await AuthUtil.getUserPermissionByModuleId(moduleName, taskId)
+        this.setState({userrole: permission, permissionById: permissionById, moduleName: moduleName, taskId: taskId});
         if (taskId && taskType) {
             this.getTaskDetails(taskId, taskType);
         }   else {
@@ -212,12 +228,12 @@ export class TaskView extends Component {
         let task = this.state.task;
         let cancelledTask = await TaskService.cancelTask(task.id);
         if (!cancelledTask) {
-            appGrowl.show({ severity: 'error', summary: 'error', detail: 'Error while cancelling Scheduling Unit' });
+            appGrowl.show({ severity: 'error', summary: 'error', detail: 'Error while cancelling Task' });
             this.setState({ dialogVisible: false });
         } else {
             task.status = cancelledTask.status;
             let actions = this.state.actions;
-            appGrowl.show({ severity: 'success', summary: 'Success', detail: 'Scheduling Unit is cancelled successfully' });
+            appGrowl.show({ severity: 'success', summary: 'Success', detail: 'Task is cancelled successfully' });
             this.setState({ confirmDialogVisible: false, task: task, actions: actions});
         }
     }
@@ -226,6 +242,7 @@ export class TaskView extends Component {
         if (this.state.redirect) {
             return <Redirect to={ {pathname: this.state.redirect} }></Redirect>
         }
+        const {task} = this.state.userrole.userRolePermission;
         let jeditor = null
         if (this.state.taskTemplate) {
             jeditor = React.createElement(Jeditor, {title: "Specification", 
@@ -242,7 +259,8 @@ export class TaskView extends Component {
         if (this.state.taskType === 'draft') {
             const taskId = this.state.task?this.state.task.id:'';
             actions = [{   icon: 'fa-edit',
-                            title:'Click to Edit Task',
+                            title:this.state.permissionById[this.state.taskId] && this.state.permissionById[this.state.taskId].edit ?'Click to Edit Task': `${this.access_denied_message} to edit`,
+                            disabled: this.state.permissionById[this.state.taskId] ? !this.state.permissionById[this.state.taskId].edit: true,
                             props : { pathname:`/task/edit/draft/${taskId}`,
                                         state: {taskId: taskId} 
                                     } 
@@ -258,7 +276,8 @@ export class TaskView extends Component {
                                 });
             }
         }
-        actions.push({icon: 'fa fa-trash',title:this.state.hasBlueprint? 'Cannot delete Draft when Blueprint exists':'Delete Task',  
+        actions.push({icon: 'fa fa-trash',title:this.state.hasBlueprint ? 'Cannot delete Draft when Blueprint exists':
+                        this.state.permissionById && this.state.permissionById[this.state.taskId].delete? 'Delete Task': `${this.access_denied_message} to delete`,  
                         type: 'button',  disabled: this.state.hasBlueprint, actOn: 'click', props:{ callback: this.showDeleteConfirmation}});
         actions.push({  icon: 'fa-window-close', link: this.props.history.goBack,
                         title:'Click to Close Task', props : { pathname:'/schedulingunit' }});
@@ -275,122 +294,130 @@ export class TaskView extends Component {
             </ul>
           );
         return (
+
             <React.Fragment>
-                {/* <div className="p-grid">
-                    <div className="p-col-10 p-lg-10 p-md-10">
-                        <h2>Task - Details </h2>
-                    </div>
-                    <div className="p-col-2 p-lg-2 p-md-2">
-                        {this.state.taskType === 'draft' &&
-                            <div>
-                            <Link to={{ pathname: '/task'}} tooltip="Edit Task" 
-                                style={{float: 'right'}}>
-                                <i className="fa fa-times" style={{marginLeft:"5px", marginTop: "10px"}}></i>
-                            </Link>
-                            <Link to={{ pathname: '/task/edit', state: {taskId: this.state.task?this.state.task.id:''}}} tooltip="Edit Task" 
-                                style={{float: 'right'}}>
-                                <i className="fa fa-edit" style={{marginTop: "10px"}}></i>
-                            </Link>
-                            </div>
-                        }
-                        {this.state.taskType === 'blueprint' &&
-                            <i className="fa fa-lock" style={{float:"right", marginTop: "10px"}}></i>
-                        }
-                    </div>
-                    </div> */}
-                <PageHeader location={this.props.location} title={'Task - Details'} 
-                            actions={actions}/>
-                { this.state.isLoading? <AppLoader /> : this.state.task &&
-                    <React.Fragment>
-                        <div className="main-content">
-                        <div className="p-grid">
-                            <label className="col-lg-2 col-md-2 col-sm-12">Name</label>
-                            <span className="col-lg-4 col-md-4 col-sm-12">{this.state.task.name}</span>
-                            <label className="col-lg-2 col-md-2 col-sm-12">Description</label>
-                            <span className="col-lg-4 col-md-4 col-sm-12">{this.state.task.description}</span>
-                        </div>
-                        <div className="p-grid">
-                            <label className="col-lg-2 col-md-2 col-sm-12">Created At</label>
-                            <span className="col-lg-4 col-md-4 col-sm-12">{moment.utc(this.state.task.created_at).format(UIConstants.CALENDAR_DATETIME_FORMAT)}</span>
-                            <label className="col-lg-2 col-md-2 col-sm-12">Updated At</label>
-                            <span className="col-lg-4 col-md-4 col-sm-12">{moment.utc(this.state.task.updated_at).format(UIConstants.CALENDAR_DATETIME_FORMAT)}</span>
-                        </div>
-                        <div className="p-grid">
-                            <label className="col-lg-2 col-md-2 col-sm-12">Copies</label>
-                            <span className="col-lg-4 col-md-4 col-sm-12">{this.state.taskType==='draft'?this.state.task.copies:this.state.task.draftObject.copies}</span>
-                            <label className="col-lg-2 col-md-2 col-sm-12">Copy Reason</label>
-                            <span className="col-lg-4 col-md-4 col-sm-12">{this.state.taskType==='draft'?this.state.task.copy_reason_value:this.state.task.draftObject.copy_reason_value}</span>
-                        </div>
-                        <div className="p-grid">
-                            <label className="col-lg-2 col-md-2 col-sm-12">Start Time</label>
-                            <span className="col-lg-4 col-md-4 col-sm-12">{this.state.task.start_time?moment(this.state.task.start_time,moment.ISO_8601).format(UIConstants.CALENDAR_DATETIME_FORMAT):""}</span>
-                            <label className="col-lg-2 col-md-2 col-sm-12">End Time</label>
-                            <span className="col-lg-4 col-md-4 col-sm-12">{this.state.task.end_time?moment(this.state.task.end_time,moment.ISO_8601).format(UIConstants.CALENDAR_DATETIME_FORMAT):""}</span>
-                        </div>
-                        <div className="p-grid">
-                            {/* <label className="col-lg-2 col-md-2 col-sm-12">Tags</label>
-                            <Chips className="col-lg-4 col-md-4 col-sm-12 chips-readonly" disabled value={this.state.task.tags}></Chips> */}
-                            <label className="col-lg-2 col-md-2 col-sm-12">Status</label>
-                            <span className="col-lg-4 col-md-4 col-sm-12">{this.state.task.status}</span>
-                            {this.state.schedulingUnit &&
+                {this.state.permissionById[this.state.taskId] &&
+                    <>
+                        { this.state.permissionById[this.state.taskId].view ?
                             <>
-                                <label className="col-lg-2 col-md-2 col-sm-12">Scheduling Unit</label>
-                                <Link className="col-lg-4 col-md-4 col-sm-12" to={ { pathname:this.state.supath, state: {id: this.state.schedulingUnit.id}}}>{this.state.schedulingUnit?this.state.schedulingUnit.name:''}</Link>
-                            </>}
-                        </div>
-                        <div className="p-grid">
-                            <label className="col-lg-2 col-md-2 col-sm-12">Predecessors</label>
-                            <div className="col-lg-4 col-md-4 col-sm-12">
-                                <TaskRelationList list={this.state.task.predecessors} />
-                            </div>
-                            <label className="col-lg-2 col-md-2 col-sm-12">Successors</label>
-                            <div className="col-lg-4 col-md-4 col-sm-12">
-                                <TaskRelationList list={this.state.task.successors} />
-                            </div>
-                        </div>
-                        <div className="p-grid">
-                            <label className="col-lg-2 col-md-2 col-sm-12">Template</label>
-                            <span className="col-lg-4 col-md-4 col-sm-12">{this.state.taskTemplate.name}</span>
-                            <label className="col-lg-2 col-md-2 col-sm-12">{this.state.taskType==='draft'?'Blueprints':'Draft'}</label>
-                            <div className="col-lg-4 col-md-4 col-sm-12">
-                                {this.state.taskType === 'draft' &&
-                                    <TaskRelationList list={this.state.task.blueprints} />
-                                }
-                                {this.state.taskType === 'blueprint' &&
-                                    // <Link className="col-lg-4 col-md-4 col-sm-12" to={ { pathname:'/task/view', state: {id: this.state.task.draft_id, type: 'draft'}}}>{this.state.task.draftObject.name}</Link>
-                                    <Link to={ { pathname:`/task/view/draft/${this.state.task.draft_id}`}}>{this.state.task.draftObject.name}</Link>
-                                }
-                            </div>
-                        </div>
-                        {this.state.taskType === 'blueprint' &&
-                            <div className="p-grid">
-                                <label className="col-lg-2 col-md-2 col-sm-12">Data Product</label>
-                                <div className="col-lg-4 col-md-4 col-sm-12">
-                                    <Link to={ { pathname:`/task/view/blueprint/${this.state.taskId}/dataproducts`}}> View Data Product</Link>
+                            {/* <div className="p-grid">
+                                <div className="p-col-10 p-lg-10 p-md-10">
+                                    <h2>Task - Details </h2>
                                 </div>
-                                <label className="col-lg-2 col-md-2 col-sm-12">Status Logs</label>
-                                <div className="col-lg-4 col-md-4 col-sm-12">
-                                    <button className="p-link" onMouseOver={(e) => { this.setState({showStatusLogs: true})}}><i className="fa fa-history"></i></button>
-                                    <Dialog header="State change logs" visible={this.state.showStatusLogs} maximizable position="right" style={{ width: '50vw' }} 
-                                            onHide={() => {this.setState({showStatusLogs: false})}}>
-                                        <TaskStatusLogs taskId={this.state.taskId}></TaskStatusLogs>
-                                    </Dialog>
+                                <div className="p-col-2 p-lg-2 p-md-2">
+                                    {this.state.taskType === 'draft' &&
+                                        <div>
+                                        <Link to={{ pathname: '/task'}} tooltip="Edit Task" 
+                                            style={{float: 'right'}}>
+                                            <i className="fa fa-times" style={{marginLeft:"5px", marginTop: "10px"}}></i>
+                                        </Link>
+                                        <Link to={{ pathname: '/task/edit', state: {taskId: this.state.task?this.state.task.id:''}}} tooltip="Edit Task" 
+                                            style={{float: 'right'}}>
+                                            <i className="fa fa-edit" style={{marginTop: "10px"}}></i>
+                                        </Link>
+                                        </div>
+                                    }
+                                    {this.state.taskType === 'blueprint' &&
+                                        <i className="fa fa-lock" style={{float:"right", marginTop: "10px"}}></i>
+                                    }
                                 </div>
-                            </div>
-                        }
-                        <div className="p-fluid">
-                            <div className="p-grid"><div className="p-col-12">
-                                {this.state.taskTemplate?jeditor:""}
-                            </div></div>
-                        </div>
-                        </div>
-                    </React.Fragment>
-                }
-                 <CustomDialog type="confirmation" visible={this.state.confirmDialogVisible} width={this.state.dialog.width}
-                    header={this.state.dialog.header} message={this.state.dialog.detail} 
-                    content={this.state.dialog.content} onClose={this.closeDialog} onCancel={this.closeDialog} onSubmit={this.callBackFunction}
-                    showIcon={this.state.dialog.showIcon} actions={this.state.dialog.actions}>
-                </CustomDialog>
+                                </div> */}
+                                <PageHeader location={this.props.location} title={'Task - Details'} 
+                                            actions={actions}/>
+                                { this.state.isLoading? <AppLoader /> : this.state.task &&
+                                    <React.Fragment>
+                                        <div className="main-content">
+                                        <div className="p-grid">
+                                            <label className="col-lg-2 col-md-2 col-sm-12">Name</label>
+                                            <span className="col-lg-4 col-md-4 col-sm-12">{this.state.task.name}</span>
+                                            <label className="col-lg-2 col-md-2 col-sm-12">Description</label>
+                                            <span className="col-lg-4 col-md-4 col-sm-12">{this.state.task.description}</span>
+                                        </div>
+                                        <div className="p-grid">
+                                            <label className="col-lg-2 col-md-2 col-sm-12">Created At</label>
+                                            <span className="col-lg-4 col-md-4 col-sm-12">{moment.utc(this.state.task.created_at).format(UIConstants.CALENDAR_DATETIME_FORMAT)}</span>
+                                            <label className="col-lg-2 col-md-2 col-sm-12">Updated At</label>
+                                            <span className="col-lg-4 col-md-4 col-sm-12">{moment.utc(this.state.task.updated_at).format(UIConstants.CALENDAR_DATETIME_FORMAT)}</span>
+                                        </div>
+                                        <div className="p-grid">
+                                            <label className="col-lg-2 col-md-2 col-sm-12">Copies</label>
+                                            <span className="col-lg-4 col-md-4 col-sm-12">{this.state.taskType==='draft'?this.state.task.copies:this.state.task.draftObject.copies}</span>
+                                            <label className="col-lg-2 col-md-2 col-sm-12">Copy Reason</label>
+                                            <span className="col-lg-4 col-md-4 col-sm-12">{this.state.taskType==='draft'?this.state.task.copy_reason_value:this.state.task.draftObject.copy_reason_value}</span>
+                                        </div>
+                                        <div className="p-grid">
+                                            <label className="col-lg-2 col-md-2 col-sm-12">Start Time</label>
+                                            <span className="col-lg-4 col-md-4 col-sm-12">{this.state.task.start_time?moment(this.state.task.start_time,moment.ISO_8601).format(UIConstants.CALENDAR_DATETIME_FORMAT):""}</span>
+                                            <label className="col-lg-2 col-md-2 col-sm-12">End Time</label>
+                                            <span className="col-lg-4 col-md-4 col-sm-12">{this.state.task.end_time?moment(this.state.task.end_time,moment.ISO_8601).format(UIConstants.CALENDAR_DATETIME_FORMAT):""}</span>
+                                        </div>
+                                        <div className="p-grid">
+                                            {/* <label className="col-lg-2 col-md-2 col-sm-12">Tags</label>
+                                            <Chips className="col-lg-4 col-md-4 col-sm-12 chips-readonly" disabled value={this.state.task.tags}></Chips> */}
+                                            <label className="col-lg-2 col-md-2 col-sm-12">Status</label>
+                                            <span className="col-lg-4 col-md-4 col-sm-12">{this.state.task.status}</span>
+                                            {this.state.schedulingUnit &&
+                                            <>
+                                                <label className="col-lg-2 col-md-2 col-sm-12">Scheduling Unit</label>
+                                                <Link className="col-lg-4 col-md-4 col-sm-12" to={ { pathname:this.state.supath, state: {id: this.state.schedulingUnit.id}}}>{this.state.schedulingUnit?this.state.schedulingUnit.name:''}</Link>
+                                            </>}
+                                        </div>
+                                        <div className="p-grid">
+                                            <label className="col-lg-2 col-md-2 col-sm-12">Predecessors</label>
+                                            <div className="col-lg-4 col-md-4 col-sm-12">
+                                                <TaskRelationList list={this.state.task.predecessors} />
+                                            </div>
+                                            <label className="col-lg-2 col-md-2 col-sm-12">Successors</label>
+                                            <div className="col-lg-4 col-md-4 col-sm-12">
+                                                <TaskRelationList list={this.state.task.successors} />
+                                            </div>
+                                        </div>
+                                        <div className="p-grid">
+                                            <label className="col-lg-2 col-md-2 col-sm-12">Template</label>
+                                            <span className="col-lg-4 col-md-4 col-sm-12">{this.state.taskTemplate.name}</span>
+                                            <label className="col-lg-2 col-md-2 col-sm-12">{this.state.taskType==='draft'?'Blueprints':'Draft'}</label>
+                                            <div className="col-lg-4 col-md-4 col-sm-12">
+                                                {this.state.taskType === 'draft' &&
+                                                    <TaskRelationList list={this.state.task.blueprints} />
+                                                }
+                                                {this.state.taskType === 'blueprint' &&
+                                                    // <Link className="col-lg-4 col-md-4 col-sm-12" to={ { pathname:'/task/view', state: {id: this.state.task.draft_id, type: 'draft'}}}>{this.state.task.draftObject.name}</Link>
+                                                    <Link to={ { pathname:`/task/view/draft/${this.state.task.draft_id}`}}>{this.state.task.draftObject.name}</Link>
+                                                }
+                                            </div>
+                                        </div>
+                                        {this.state.taskType === 'blueprint' &&
+                                            <div className="p-grid">
+                                                <label className="col-lg-2 col-md-2 col-sm-12">Data Product</label>
+                                                <div className="col-lg-4 col-md-4 col-sm-12">
+                                                    <Link to={ { pathname:`/task/view/blueprint/${this.state.taskId}/dataproducts`}}> View Data Product</Link>
+                                                </div>
+                                                <label className="col-lg-2 col-md-2 col-sm-12">Status Logs</label>
+                                                <div className="col-lg-4 col-md-4 col-sm-12">
+                                                    <button className="p-link" onMouseOver={(e) => { this.setState({showStatusLogs: true})}}><i className="fa fa-history"></i></button>
+                                                    <Dialog header="State change logs" visible={this.state.showStatusLogs} maximizable position="right" style={{ width: '50vw' }} 
+                                                            onHide={() => {this.setState({showStatusLogs: false})}}
+                                                            maximized={false} className="content_dlg">
+                                                        <TaskStatusLogs taskId={this.state.taskId}></TaskStatusLogs>
+                                                    </Dialog>
+                                                </div>
+                                            </div>
+                                        }
+                                        <div className="p-fluid">
+                                            <div className="p-grid"><div className="p-col-12">
+                                                {this.state.taskTemplate?jeditor:""}
+                                            </div></div>
+                                        </div>
+                                        </div>
+                                    </React.Fragment>
+                                }
+                                <CustomDialog type="confirmation" visible={this.state.confirmDialogVisible} width={this.state.dialog.width}
+                                    header={this.state.dialog.header} message={this.state.dialog.detail} 
+                                    content={this.state.dialog.content} onClose={this.closeDialog} onCancel={this.closeDialog} onSubmit={this.callBackFunction}
+                                    showIcon={this.state.dialog.showIcon} actions={this.state.dialog.actions}>
+                                </CustomDialog>
+                            </>: <AccessDenied/>}
+                    </> }
             </React.Fragment>
         );
     }
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/list.tabs.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/list.tabs.js
index cebe73f0aa5a71237abdfb3cc7cc2fad0b557cfd..1d6b270679205a88a36a258e980942d7e49b2fbd 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/list.tabs.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/list.tabs.js
@@ -28,6 +28,8 @@ class TimelineListTabs extends Component {
         this.suListFilterCallback = this.suListFilterCallback.bind(this);
         this.taskListFilterCallback = this.taskListFilterCallback.bind(this);
         this.getTaskList = this.getTaskList.bind(this);
+        this.getSUFilterOptions = this.getSUFilterOptions.bind(this);
+        this.getTaskFilterOptions = this.getTaskFilterOptions.bind(this);
     }
 
     /**
@@ -121,6 +123,32 @@ class TimelineListTabs extends Component {
         return sortData?[{...sortData}]:[this.defaultSortColumns[listName]];
     }
 
+    /**
+     * Get Option-list values for Select Dropdown filter in SU 'Viewtable'
+     * @param {String} id : Column id
+     * @returns 
+     */
+     getSUFilterOptions(id) {
+        let options = null;
+        if(id && id === 'Status') {
+            options = this.props.suStatusList;
+        }
+        return options;
+    }
+
+    /**
+     * Get Option-list values for Select Dropdown filter in Task 'Viewtable'
+     * @param {String} id : Column id
+     * @returns 
+     */
+     getTaskFilterOptions(id) {
+        let options = null;
+        if(id && id === 'Status') {
+            options = this.props.taskStatusList;
+        }
+        return options;
+    }
+
     render() {
         const taskList = this.getTaskList();
         return(
@@ -137,6 +165,7 @@ class TimelineListTabs extends Component {
                         defaultSortColumn={this.getSortingColumn("SUListSortColumn")}
                         showaction="true"
                         tablename={`timeline_scheduleunit_list`}
+                        showFilterOption={this.getSUFilterOptions} //Callback function to provide inputs for option-list in Select Dropdown filter
                         showTopTotal={false}
                         showGlobalFilter={true}
                         showColumnFilter={true}
@@ -159,6 +188,7 @@ class TimelineListTabs extends Component {
                         showGlobalFilter={true}
                         showColumnFilter={true}
                         tablename={`timeline_task_list`}
+                        showFilterOption={this.getTaskFilterOptions} //Callback function to provide inputs for option-list in Select Dropdown filter
                         showTopTotal={false}
                         filterCallback={this.taskListFilterCallback}
                         lsKeySortColumn={"TaskListSortColumn"}
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/view.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/view.js
index e50e9d13912246383a41c71461eb1f4058306369..1faf0cf5704099a5f8114ad5884b45fd9680a530 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/view.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/view.js
@@ -28,6 +28,8 @@ import { MultiSelect } from 'primereact/multiselect';
 import { Button } from 'primereact/button';
 import TimelineListTabs from './list.tabs';
 import TimelineCommonUtils from './common.utils';
+import AuthStore from '../../authenticate/auth.store';
+import AuthUtil from '../../utils/auth.util';
 //import { TRUE } from 'node-sass';
 
 
@@ -78,22 +80,26 @@ export class TimelineView extends Component {
             stationView: this.timelineUIAttributes.stationView || false,
             stationGroup: [],
             selectedStationGroup: [], //Station Group(core,international,remote)
-            reservationFilter: null,
+            reservationFilter: [],
             showSUs: this.timelineUIAttributes.showSUs===undefined?true:this.timelineUIAttributes.showSUs,
             showTasks: this.timelineUIAttributes.showTasks || false,
             groupByProject: this.timelineUIAttributes.groupByProject || false,
             taskTypes: [],
             selectedTaskTypes: this.timelineUIAttributes["taskTypes"] || ['observation'],
-            isStationTasksVisible: this.timelineUIAttributes.isStationTasksVisible===undefined?true:this.timelineUIAttributes.isStationTasksVisible
+            isStationTasksVisible: this.timelineUIAttributes.isStationTasksVisible===undefined?true:this.timelineUIAttributes.isStationTasksVisible,
+            showReservation: this.timelineUIAttributes.showReservation || false,     // Flag to show reservations in normal timeline view
+            userrole: AuthStore.getState(),
+            suStatusList: [],
+            taskStatusList: []
         }
         this.STATUS_BEFORE_SCHEDULED = ['defining', 'defined', 'schedulable'];  // Statuses before scheduled to get station_group
         this.allStationsGroup = [];
         this.reservations = [];
         this.reservationReasons = [];
         this.optionsMenu = React.createRef();
-        this.menuOptions = [{ label: 'Add Reservation', icon: "fa fa-", command: () => { this.selectOptionMenu('Add Reservation') } },
-        { label: 'Reservation List', icon: "fa fa-", command: () => { this.selectOptionMenu('Reservation List') } },
-        ];
+        // this.menuOptions = [{ label: 'Add Reservation', icon: "fa fa-", disabled: true , command: () => { this.selectOptionMenu('Add Reservation') } },
+        // { label: 'Reservation List', icon: "fa fa-", command: () => { this.selectOptionMenu('Reservation List') } },
+        // ];
 
         this.showOptionMenu = this.showOptionMenu.bind(this);
         this.selectOptionMenu = this.selectOptionMenu.bind(this);
@@ -116,11 +122,19 @@ export class TimelineView extends Component {
         this.getStationsByGroupName = this.getStationsByGroupName.bind(this);
         this.setGroupByProject = this.setGroupByProject.bind(this);
         this.changeViewBlocks = this.changeViewBlocks.bind(this);
+        this.showReservationBlocks = this.showReservationBlocks.bind(this);
     }
 
     async componentDidMount() {
-        this.setState({ loader: true });
+        this.getStatusList();
+        const permission = await AuthUtil.getUserRolePermission();
+        const timelinePermission = permission.userRolePermission.timeline;
+        
         let taskTypes = []
+        let menuOptions = [{ label: 'Add Reservation', icon: "fa fa-", disabled: !timelinePermission.addreservation, command: () => { this.selectOptionMenu('Add Reservation') } },
+        { label: 'Reservation List', icon: "fa fa-", disabled: !timelinePermission.listreservation, command: () => { this.selectOptionMenu('Reservation List') } },
+        ]
+        this.setState({menuOptions: menuOptions, loader: true });
         TaskService.getTaskTypes().then(results => {taskTypes = results});
         // Fetch Reservations and keep ready to use in station view
         ReservationService.getReservations().then(reservations => {
@@ -205,6 +219,13 @@ export class TimelineView extends Component {
         });
     }
 
+    componentDidUpdate(prevProps, prevState){
+        // const permission = await AuthUtil.getUserRolePermission();
+        // const {timeline} = permission.userRolePermission;
+        // if(prevState.userrole.userRolePermission.timeline.addreservation != timeline. )
+        
+    }
+
     setSelectedStationGroup(value) {
         // By default all stations groups are selected. 
         // In that case no need to store the selected group otherwise store the selected groups in local storage
@@ -488,9 +509,16 @@ export class TimelineView extends Component {
                     suBlueprintList.push(suBlueprint);
                 }
             }
-            if (this.state.stationView) {
+            if (this.state.stationView || this.state.showReservation) {
                 items = this.addStationReservations(items, startTime, endTime);
             }
+            if (this.state.showReservation) {
+                let reservationGroup = [{id: "RESERVATION", parent: "RESERVATION", 
+                                            start: moment.utc("1900-01-01", "YYYY-MM-DD"),
+                                            title: "RESERVATIONS"}
+                                        ];
+                group = reservationGroup.concat(group);
+            }
         } else {
             suBlueprintList = _.clone(this.state.suBlueprints);
             group = this.state.group;
@@ -547,6 +575,7 @@ export class TimelineView extends Component {
      */
     addStationReservations(items, startTime, endTime) {
         let reservations = this.reservations;
+        let reservationItems = [];
         for (const reservation of reservations) {
             const reservationStartTime = moment.utc(reservation.start_time);
             const reservationEndTime = reservation.duration ? reservationStartTime.clone().add(reservation.duration, 'seconds') : endTime;
@@ -559,13 +588,18 @@ export class TimelineView extends Component {
                 || reservationEndTime.isBetween(startTime, endTime)
                 || (reservationStartTime.isSameOrBefore(startTime)
                     && reservationEndTime.isSameOrAfter(endTime)))
-                && (!this.state.reservationFilter ||                                        // No reservation filter added
-                    reservationSpec.activity.type === this.state.reservationFilter)) {     // Reservation reason == Filtered reaseon
-                if (reservationSpec.resources.stations) {
-                    items = items.concat(this.getReservationItems(reservation, endTime));
+                && (this.state.reservationFilter.length === 0 ||                                        // No reservation filter added
+                    this.state.reservationFilter.indexOf(reservationSpec.activity.type) >= 0 )) {     // Reservation reason == Filtered reaseon
+                if (this.state.stationView) {
+                    if (reservationSpec.resources.stations) {
+                        items = items.concat(this.getReservationItems(reservation, endTime, this.state.stationView));
+                    }
+                }   else {
+                    reservationItems.push(this.getReservationItems(reservation, endTime, this.state.stationView)[0]);
                 }
             }
         }
+        items = reservationItems.concat(items);
         return items;
     }
 
@@ -574,18 +608,33 @@ export class TimelineView extends Component {
      * @param {Object} reservation 
      * @param {moment} endTime 
      */
-    getReservationItems(reservation, endTime) {
+    getReservationItems(reservation, endTime, stationView) {
         const reservationSpec = reservation.specifications_doc;
         let items = [];
         const start_time = moment.utc(reservation.start_time);
         const end_time = reservation.duration ? start_time.clone().add(reservation.duration, 'seconds') : endTime;
-        for (const station of reservationSpec.resources.stations) {
+        if (stationView) {
+            for (const station of reservationSpec.resources.stations) {
+                const blockColor = RESERVATION_COLORS[this.getReservationType(reservationSpec.schedulability)];
+                let item = {
+                    id: `Res-${reservation.id}-${station}`,
+                    start_time: start_time, end_time: end_time,
+                    name: reservationSpec.activity.type, project: reservation.project_id,
+                    group: station, type: 'RESERVATION',
+                    title: `${reservationSpec.activity.type}${reservation.project_id ? ("-" + reservation.project_id) : ""}`,
+                    desc: reservation.description,
+                    duration: reservation.duration ? UnitConverter.getSecsToHHmmss(reservation.duration) : "Unknown",
+                    bgColor: blockColor.bgColor, selectedBgColor: blockColor.bgColor, color: blockColor.color
+                };
+                items.push(item);
+            }
+        }   else {
             const blockColor = RESERVATION_COLORS[this.getReservationType(reservationSpec.schedulability)];
             let item = {
-                id: `Res-${reservation.id}-${station}`,
+                id: `Res-${reservation.id}`,
                 start_time: start_time, end_time: end_time,
                 name: reservationSpec.activity.type, project: reservation.project_id,
-                group: station, type: 'RESERVATION',
+                group: "RESERVATION", type: 'RESERVATION',
                 title: `${reservationSpec.activity.type}${reservation.project_id ? ("-" + reservation.project_id) : ""}`,
                 desc: reservation.description,
                 duration: reservation.duration ? UnitConverter.getSecsToHHmmss(reservation.duration) : "Unknown",
@@ -642,8 +691,8 @@ export class TimelineView extends Component {
                 || reservationEndTime.isBetween(startTime, endTime)
                 || (reservationStartTime.isSameOrBefore(startTime)
                     && reservationEndTime.isSameOrAfter(endTime)))
-                && (!this.state.reservationFilter ||                                        // No reservation filter added
-                    reservationSpec.activity.type === this.state.reservationFilter)) {     // Reservation reason == Filtered reaseon
+                && (this.state.reservationFilter.length === 0 ||                                        // No reservation filter added
+                    this.state.reservationFilter.indexOf(reservationSpec.activity.type) >= 0 )) {     // Reservation reason == Filtered reaseon
                 if (!this.state.stationView || 
                     (this.state.stationView && reservationSpec.resources.stations)) {
                     let item = _.cloneDeep(reservation);
@@ -761,9 +810,16 @@ export class TimelineView extends Component {
                 }
             }
         }
-        if (this.state.stationView) {
+        if (this.state.stationView || this.state.showReservation) {
             items = this.addStationReservations(items, this.state.currentStartTime, this.state.currentEndTime);
         }
+        if (this.state.showReservation) {
+            let reservationGroup = [{id: "RESERVATION", parent: "RESERVATION", 
+                                        start: moment.utc("1900-01-01", "YYYY-MM-DD"),
+                                        title: "RESERVATIONS"}
+                                    ];
+            group = reservationGroup.concat(group);
+        }
         if (this.timeline) {
             this.timeline.updateTimeline({ group: this.state.stationView ? this.getStationsByGroupName() : _.orderBy(_.uniqBy(group, 'id'), ["parent", "start"], ['asc', 'asc']), 
                                             items: items, stationView: this.state.stationView});
@@ -1013,10 +1069,41 @@ export class TimelineView extends Component {
         this.setState({isStationTasksVisible: !this.state.isStationTasksVisible});
     }
     
+    /**
+     * Function sets the flag to show or hide reservation blocks in normal timeline view and the options is remembered.
+     */
+    showReservationBlocks() {
+        this.timelineUIAttributes["showReservation"] = !this.state.showReservation;
+        this.timelineCommonUtils.storeUIAttributes(this.timelineUIAttributes);
+        this.setState({showReservation: !this.state.showReservation});
+    }
+
+    /**
+     * Get Status list for UI drop down list
+     */
+     async getStatusList() {
+        let suStatusList = [];
+        let taskStatusList = [];
+        const suFilters = await ScheduleService.getSchedulingUnitFilterDefinition('blueprint');
+        if (suFilters && suFilters.data.filters['status']) {
+            suFilters.data.filters['status'].choices.forEach(choice => {
+                suStatusList.push(choice.value);
+            });
+        }
+        const taskFilters = await TaskService.getTaskFilterDefinition('blueprint');
+        if (taskFilters && taskFilters.data.filters['status']) {
+            taskFilters.data.filters['status'].choices.forEach(choice => {
+                taskStatusList.push(choice.value);
+            });
+        }
+        this.setState({suStatusList: suStatusList, taskStatusList: taskStatusList});
+    }
+
     render() {
         if (this.state.redirect) {
             return <Redirect to={{ pathname: this.state.redirect }}></Redirect>
         }
+        // const {timeline} = this.state.userrole.userRolePermission
         //  if (this.state.loader) {
         //     return <AppLoader />
         // }
@@ -1037,10 +1124,11 @@ export class TimelineView extends Component {
         let mouseOverItem = this.state.mouseOverItem;
         return (
             <React.Fragment>
-                <TieredMenu className="app-header-menu" model={this.menuOptions} popup ref={el => this.optionsMenu = el} />
+                <TieredMenu className="app-header-menu" model={this.state.menuOptions} popup ref={el => this.optionsMenu = el} />
                 <PageHeader location={this.props.location} title={'Scheduling Units - Timeline View'}
                     actions={[
-                        { icon: 'fa-bars', title: '', type: 'button', actOn: 'mouseOver', props: { callback: this.showOptionMenu }, },
+                        { icon: 'fa-bars', title: '',
+                            type: 'button', actOn: 'mouseOver', props: { callback: this.showOptionMenu }, },
                         { icon: 'fa-calendar-alt', title: 'Week View', props: { pathname: `/su/timelineview/week` } }
                     ]}
                 />
@@ -1053,7 +1141,10 @@ export class TimelineView extends Component {
                             style={isSUListVisible ? { position: "inherit", borderRight: "3px solid #efefef", paddingTop: "10px" } : { display: 'none' }}>
                             <TimelineListTabs suBlueprintList={this.state.suBlueprintList}
                                 suListFilterCallback={this.suListFilterCallback}
-                                reservationList={this.getReservationList()}></TimelineListTabs>
+                                reservationList={this.getReservationList()}
+                                suStatusList={this.state.suStatusList}
+                                taskStatusList={this.state.taskStatusList}
+                                ></TimelineListTabs>
                         </div>
                         {/* Timeline Panel */}
                         <div className={isSUListVisible ? ((isSUDetsVisible || isReservDetsVisible) ? "col-lg-5 col-md-5 col-sm-12" :
@@ -1094,7 +1185,7 @@ export class TimelineView extends Component {
                                 }
                             </div>
                             <div className={`timeline-view-toolbar p-grid ${this.state.stationView && 'alignTimeLineHeader'}`}>
-                                <div className="sub-header col-lg-3">
+                                <div className="sub-header col-lg-2">
                                     <label >Station View</label>
                                     <InputSwitch checked={this.state.stationView} onChange={(e) => { this.setStationView(e) }} />
                                 </div>
@@ -1119,22 +1210,11 @@ export class TimelineView extends Component {
                                             onChange={(e) => this.setSelectedStationGroup(e.value)}
                                         />
                                     </div>
-                                    <div className="sub-header col-lg-3">
-                                        <label style={{ marginLeft: '20px' }}>Reservation</label>
-                                        <Dropdown optionLabel="name" optionValue="name"
-                                            style={{ top: '2px' }}
-                                            value={this.state.reservationFilter}
-                                            options={this.reservationReasons}
-                                            filter showClear={true} filterBy="name"
-                                            onChange={(e) => { this.setReservationFilter(e.value) }}
-                                            placeholder="Reason" />
-
-                                    </div>
                                 </>
                                 }
                                 {!this.state.stationView &&
                                     <>
-                                    <div className="sub-header col-lg-6">
+                                    <div className="sub-header col-lg-5">
                                         <div className={`sub-header-content ${isSUListVisible?"col-lg-12":"col-lg-8"}`} style={{padding: '0px !important'}}>
                                         <fieldset>
                                             <label style={{ marginLeft: '0px' }}>Show :</label>
@@ -1163,7 +1243,7 @@ export class TimelineView extends Component {
                                             </div>
                                         }
                                     </div>
-                                    <div className="sub-header col-lg-3" style={{paddingTop: "15px !important"}}>
+                                    <div className="sub-header col-lg-2" style={{paddingTop: "15px !important"}}>
                                         {this.state.groupByProject &&
                                             <Button className="p-button-rounded toggle-btn" label="Group By SU" onClick={e => this.setGroupByProject(false)} />}
                                         {!this.state.groupByProject &&
@@ -1171,6 +1251,35 @@ export class TimelineView extends Component {
                                     </div>
                                     </>
                                 }
+                                <div className="sub-header col-lg-3">
+                                    {!this.state.stationView && 
+                                        <Button className="p-button-rounded toggle-btn" 
+                                        tooltip={this.state.showReservation?"Hide Reservations":"Show Reservations"}
+                                        style={{minWidth: "50px"}}
+                                        label={this.state.showReservation?"Hide Reservation":"Show Reservation"} 
+                                        onClick={e => this.showReservationBlocks()} />
+                                    }
+                                    { this.state.stationView && 
+                                        <label style={{ marginLeft: '20px' }}>Reservation</label>
+                                    }
+                                    { (this.state.stationView || this.state.showReservation) &&
+                                        <>
+                                        <MultiSelect data-testid="reserv-reasons" id="reserv-reasons" 
+                                            optionLabel="name" optionValue="name"
+                                            style={{ top: '2px', marginLeft:'5px', minWidth: '100px' }}
+                                            panelStyle={{right: '0px'}}
+                                            tooltip="Select Reservation Reason(s)"
+                                            value={this.state.reservationFilter}
+                                            options={this.reservationReasons}
+                                            maxSelectedLabels="1"
+                                            filter showClear={true} filterBy="name"
+                                            placeholder="Reason"
+                                            onChange={(e) => this.setReservationFilter(e.value)}
+                                        />
+                                        </>
+                                    }
+                                </div>
+
                             </div>
 
                             <Timeline ref={(tl) => { this.timeline = tl }}
@@ -1217,7 +1326,8 @@ export class TimelineView extends Component {
                             <div className="col-lg-3 col-md-3 col-sm-12"
                                 style={{ borderLeft: "1px solid #efefef", marginTop: "0px", backgroundColor: "#f2f2f2" }}>
                                 {this.state.isSummaryLoading ? <AppLoader /> :
-                                    <ReservationSummary reservation={reservation} closeCallback={this.closeSUDets}></ReservationSummary>
+                                    <ReservationSummary reservation={reservation} viewInNewWindow={true}
+                                        closeCallback={this.closeSUDets}></ReservationSummary>
                                 }
                             </div>
                         }
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/week.view.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/week.view.js
index 611c5219d26ef17f1a3cd0d933d0e138a936e21a..e07a63a57a083c1fb822e049d0d5d23689b7eee2 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/week.view.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/week.view.js
@@ -12,6 +12,7 @@ import PageHeader from '../../layout/components/PageHeader';
 import Timeline from '../../components/Timeline';
 
 import ScheduleService from '../../services/schedule.service';
+import TaskService from '../../services/task.service';
 import UtilService from '../../services/util.service';
 
 import UnitConverter from '../../utils/unit.converter';
@@ -26,6 +27,7 @@ import ReservationSummary from '../Reservation/reservation.summary';
 import TimelineListTabs from './list.tabs';
 import TimelineCommonUtils from './common.utils';
 import ReservationService from '../../services/reservation.service';
+import AuthUtil from '../../utils/auth.util';
 
 // Color constant for status
 const STATUS_COLORS = {
@@ -63,16 +65,14 @@ export class WeekTimelineView extends Component {
             suTaskList: [],
             isSummaryLoading: false,
             stationGroup: [],
-            reservationEnabled: true
+            reservationEnabled: true,
+            suStatusList: [],
+            taskStatusList: []
         }
         this.STATUS_BEFORE_SCHEDULED = ['defining', 'defined', 'schedulable'];  // Statuses before scheduled to get station_group
         this.reservations = [];
         this.reservationReasons = [];
         this.optionsMenu = React.createRef();
-        this.menuOptions = [{ label: 'Add Reservation', icon: "fa fa-", command: () => { this.selectOptionMenu('Add Reservation') } },
-        { label: 'Reservation List', icon: "fa fa-", command: () => { this.selectOptionMenu('Reservation List') } },
-        ];
-
         this.showOptionMenu = this.showOptionMenu.bind(this);
         this.selectOptionMenu = this.selectOptionMenu.bind(this);
         this.onItemClick = this.onItemClick.bind(this);
@@ -92,6 +92,14 @@ export class WeekTimelineView extends Component {
     }
 
     async componentDidMount() {
+        this.getStatusList();
+        const permission = await AuthUtil.getUserRolePermission();
+        const weekviewPermission = permission.userRolePermission.weekoverview;
+        let menuOptions = [{ label: 'Add Reservation', icon: "fa fa-", disabled: !weekviewPermission.addreservation, command: () => { this.selectOptionMenu('Add Reservation') } },
+        { label: 'Reservation List', icon: "fa fa-", disabled: !weekviewPermission.listreservation, command: () => { this.selectOptionMenu('Reservation List') } },
+        ]
+        this.setState({menuOptions: menuOptions, userPermission: weekviewPermission});
+
         ReservationService.getReservations().then(reservations => {
             this.reservations = reservations;
         });
@@ -797,6 +805,27 @@ export class WeekTimelineView extends Component {
         this.timeline.updateTimeline(updatedItemGroupData);
     }
 
+     /**
+     * Get Status list for UI drop down list
+     */
+      async getStatusList() {
+        let suStatusList = [];
+        let taskStatusList = [];
+        const suFilters = await ScheduleService.getSchedulingUnitFilterDefinition('blueprint');
+        if (suFilters && suFilters.data.filters['status']) {
+            suFilters.data.filters['status'].choices.forEach(choice => {
+                suStatusList.push(choice.value);
+            });
+        }
+        const taskFilters = await TaskService.getTaskFilterDefinition('blueprint');
+        if (taskFilters && taskFilters.data.filters['status']) {
+            taskFilters.data.filters['status'].choices.forEach(choice => {
+                taskStatusList.push(choice.value);
+            });
+        }
+        this.setState({suStatusList: suStatusList, taskStatusList: taskStatusList});
+    }
+
     render() {
         if (this.state.redirect) {
             return <Redirect to={{ pathname: this.state.redirect }}></Redirect>
@@ -817,7 +846,7 @@ export class WeekTimelineView extends Component {
         const mouseOverItem = this.state.mouseOverItem;
         return (
             <React.Fragment>
-                <TieredMenu className="app-header-menu" model={this.menuOptions} popup ref={el => this.optionsMenu = el} />
+                <TieredMenu className="app-header-menu" model={this.state.menuOptions} popup ref={el => this.optionsMenu = el} />
                 <PageHeader location={this.props.location} title={'Scheduling Units - Week View'}
                     actions={[
                         { icon: 'fa-bars', title: '', type: 'button', actOn: 'mouseOver', props: { callback: this.showOptionMenu }, },
@@ -841,6 +870,8 @@ export class WeekTimelineView extends Component {
                                 <TimelineListTabs suBlueprintList={this.state.suBlueprintList}
                                     suListFilterCallback={this.suListFilterCallback}
                                     reservationList={this.getReservationList()}
+                                    suStatusList={this.state.suStatusList}
+                                    taskStatusList={this.state.taskStatusList}
                                 ></TimelineListTabs>
                             </div>
                             {/* Timeline Panel */}
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/decide.acceptance.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/decide.acceptance.js
index dd34e5d253c3e165ef8acf09b7ed76bb0c1f1eb1..c26c41b85b2dfd9eb11ac3b667313e7dfdd01519 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/decide.acceptance.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/decide.acceptance.js
@@ -5,6 +5,8 @@ import SunEditor from 'suneditor-react';
 import 'suneditor/dist/css/suneditor.min.css'; // Import Sun Editor's CSS File
 import { Checkbox } from 'primereact/checkbox';
 import WorkflowService from '../../services/workflow.service';
+import { Link } from 'react-router-dom';
+import TaskAssigner from './task.assigner';
 
 class DecideAcceptance extends Component {
     constructor(props) {
@@ -21,9 +23,16 @@ class DecideAcceptance extends Component {
         this.handleChange = this.handleChange.bind(this);
         this.onChangePIComment = this.onChangePIComment.bind(this);
         this.getQADecideAcceptance = this.getQADecideAcceptance.bind(this);
+        this.assignTaskCB = this.assignTaskCB.bind(this);
     }
 
     async componentDidMount() {
+        let currentWorkflowTask = null;
+        if (this.props.readOnly) {
+            this.getQADecideAcceptance();
+        }   else {
+            currentWorkflowTask = await this.props.getCurrentTaskDetails();
+        }
         const qaReportingResponse = await WorkflowService.getQAReportingTo(this.props.process.qa_reporting_to);
         const qaSOSResponse = await WorkflowService.getQAReportingSOS(this.props.process.qa_reporting_sos);
         const piVerificationResponse = await WorkflowService.getQAPIverification(this.props.process.pi_verification);
@@ -34,11 +43,10 @@ class DecideAcceptance extends Component {
             operator_accept: qaReportingResponse.operator_accept,
             quality_within_policy: qaSOSResponse.quality_within_policy,
             sos_accept_show_pi: qaSOSResponse.sos_accept_show_pi,
-            sos_accept_after_pi: piVerificationResponse.pi_accept
+            sos_accept_after_pi: piVerificationResponse.pi_accept,
+            assignTo: this.props.readOnly?this.props.workflowTask.owner:(currentWorkflowTask?currentWorkflowTask.fields.owner:null), 
+            currentWorkflowTask: currentWorkflowTask
         });
-        if (this.props.readOnly) {
-            this.getQADecideAcceptance();
-        }
     }
 
     async getQADecideAcceptance() {
@@ -61,14 +69,22 @@ class DecideAcceptance extends Component {
     }
 
     async Next() {
-        const currentWorkflowTask = await this.props.getCurrentTaskDetails();
+        let currentWorkflowTask = await this.props.getCurrentTaskDetails();
         const promise = [];
         if (currentWorkflowTask && !currentWorkflowTask.fields.owner) {
             promise.push(WorkflowService.updateAssignTo(currentWorkflowTask.pk, { owner: this.state.assignTo }));
         }
         promise.push(WorkflowService.updateQA_Perform(this.props.id, {"sos_accept_after_pi":this.state.sos_accept_after_pi}));
-        Promise.all(promise).then((responses) => {
+        Promise.all(promise).then(async(responses) => {
             if (responses.indexOf(null)<0) {
+                // After completing the current task, get the next task triggered in the workflow and assign project role user for the next task.
+                currentWorkflowTask = await this.props.getCurrentTaskDetails();
+                if (!currentWorkflowTask.fields.owner) {
+                    await WorkflowService.updateAssignTo(currentWorkflowTask.pk, 
+                        `project_role=${this.props.project.project_category_value==='user_shared_support'?
+                                        'shared_support_user':'friend_of_project_primary'}`, 
+                        { owner: this.state.assignTo });
+                }
                 this.props.onNext({ report: this.state.content , pireport: this.state.comment});
             }   else {
                 this.props.onError();
@@ -85,13 +101,42 @@ class DecideAcceptance extends Component {
             return;
         }
         this.setState({comment: a});
-     }
+    }
 
+    /**
+     * Callback function passed to the Task Assigner and is called after assigning or reassigning task owner.
+     */
+    async assignTaskCB() {
+        let currentWorkflowTask = await this.props.getCurrentTaskDetails();
+        this.setState({currentWorkflowTask: currentWorkflowTask, 
+                        assignTo: currentWorkflowTask.fields.owner, reassign: false});
+    }
+    
     render() {
         return (
             <>
                 <div className={`p-fluid-grid`}>
-                    <label htmlFor="operatorReport" >Operator Report</label>
+                        <div className="p-field p-grid" style={{ paddingLeft: '-10px' }}>
+                            <label htmlFor="assignTo" className="col-lg-2 col-md-2 col-sm-12">Assign To</label>
+                            <div className="col-lg-3 col-md-3 col-sm-12" data-testid="assignTo" >
+                            {/* Display the assigned owner of the task */}
+                            {this.state.assignTo && 
+                                <>{this.state.assignTo} 
+                                    {/* Allow to edit the owner if the task is not yet completed */}
+                                    {!this.props.readOnly && !this.state.reassign &&
+                                        <Link onClick={e => this.setState({reassign: true})} style={{marginLeft: '10px'}}>
+                                            <i className="pi pi-pencil"></i>
+                                        </Link>}
+                                </>
+                            }
+                            {/* Display the task assigner if owner is not assigned or to reassign to other user */}
+                            {(!this.state.assignTo || this.state.reassign) && this.state.currentWorkflowTask &&
+                                <TaskAssigner currentWorkflowTask={this.state.currentWorkflowTask} 
+                                        projectRoles={this.props.projectRoles} callback={this.assignTaskCB} />
+                            }
+                            </div>
+                        </div>
+                        <label htmlFor="operatorReport" >Operator Report</label>
                         {this.state.showEditor && <SunEditor setDefaultStyle="min-height: 250px; height: auto;" enableToolbar={true}
                         onChange={this.handleChange}
                         setContents={this.state.content}
@@ -102,7 +147,7 @@ class DecideAcceptance extends Component {
                             ]
                         }}
                         />}
-                        <div style={{ padding: '2px' }} dangerouslySetInnerHTML={{ __html: this.state.content }}></div>
+                        <div className="operator-report" style={{ padding: '2px' }} dangerouslySetInnerHTML={{ __html: this.state.content }}></div>
                 
                         <label htmlFor="piReport">PI Report</label>
                             {this.state.showEditor && <SunEditor setDefaultStyle="min-height: 250px; height: auto;" enableToolbar={true}
@@ -115,7 +160,7 @@ class DecideAcceptance extends Component {
                                     ]
                                 }}
                             />}
-                        <div style={{ padding: '2px' }} dangerouslySetInnerHTML={{ __html: this.state.comment }}></div>                        
+                        <div className="operator-report" style={{ padding: '2px' }} dangerouslySetInnerHTML={{ __html: this.state.comment }}></div>                        
                             
                         <div className="p-fluid-grid" style={{ padding: '2px' }}>
                             <Checkbox disabled inputId="operator_accept" checked={this.state.operator_accept} />
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/index.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/index.js
index f2baaf1d0d7b6c317da5d7f55c3b429ceabf33d4..c36001e6cd4a2d0af57f762ee13a8fd43960b1d1 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/index.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/index.js
@@ -19,9 +19,12 @@ import AppLoader from '../../layout/components/AppLoader';
 import WorkflowService from '../../services/workflow.service';
 import DataProductService from '../../services/data.product.service';
 import TaskService from '../../services/task.service';
+import AuthUtil from '../../utils/auth.util';
+import UtilService from '../../services/util.service';
 
 const RedirectionMap = {
     'wait scheduled': 1,
+    'wait observed': 2,
     'wait processed': 2,
     'qa reporting to': 3,
     'qa reporting sos':4,
@@ -46,6 +49,15 @@ const RedirectionMap = {
 //Workflow Page Title 
 const pageTitle = ['Waiting To Be Scheduled','Scheduled','QA Reporting (TO)', 'QA Reporting (SDCO)', 'PI Verification', 'Decide Acceptance','Ingesting','Unpin Data','Done'];
 
+const ALLOWED_PROJECT_ROLES = {'qa reporting to': ["shared_support", "friend_of_project", "friend_of_project_primary"],
+                                'qa reporting sos': ["shared_support", "friend_of_project", "friend_of_project_primary"],
+                                'pi verification': ["pi", "contact", "shared_support", "friend_of_project", "friend_of_project_primary"],
+                                'decide acceptance': ["friend_of_project", "friend_of_project_primary"],
+                                'unpin data': ["shared_support", "friend_of_project", "friend_of_project_primary"]
+                              };
+
+const roleTitleMap = {pi: "PI", co_i: "Co-I", contact: "Contact Author", shared_support: "Shared Support User",
+                        friend_of_project: "Friend of Project", friend_of_project_primary:"Friend of Project(Primary)"};
 export default (props) => {
     let growl;
     // const [disableNextButton, setDisableNextButton] = useState(false);
@@ -55,25 +67,40 @@ export default (props) => {
     const [tasks, setTasks] = useState([]);
     const [showIngestTab, setShowIngestTab] = useState(false);
     const [QASUProcess, setQASUProcess] = useState();
+    const [workflowTasks, setWorkflowTasks] = useState([]);
     const [currentView, setCurrentView] = useState();
     const [schedulingUnit, setSchedulingUnit] = useState();
+    const [userrole, setPermissions] = useState({})
+    const [projectRoles, setProjectRoles] = useState();
     // const [ingestTask, setInjestTask] = useState({});
     // const [QASchedulingTask, setQASchdulingTask] = useState([]);
 
     useEffect(() => {
         setLoader(true);
         const promises = [
-            ScheduleService.getSchedulingUnitExtended('blueprint', props.match.params.id)
+            ScheduleService.getSchedulingUnitExtended('blueprint', props.match.params.id),
+            UtilService.getProjectRoles()
         ]
+        
         Promise.all(promises).then(responses => {
             const SUB = responses[0];
-            setSchedulingUnit(responses[0]);
+            setSchedulingUnit(SUB);
+            for (let projectRole of responses[1]) {
+                projectRole.displayValue = roleTitleMap[projectRole.value] || projectRole.value.toUpperCase();
+            }
+            setProjectRoles(responses[1]);
             setTasks(SUB.task_blueprints);
             getStatusUpdate(SUB.task_blueprints);
+            getPermissions();
             // setShowIngestTab(SUB.task_blueprints.filter(i => i.specifications_template.name === 'ingest').length > 0);
         });
     }, []);
 
+    const getPermissions = async () => {
+        const permissions = await AuthUtil.getUserPermissionByModule('workflow');
+        setPermissions(permissions);
+    }
+
     
     /**
      * Method to fetch data product for each sub task except ingest.
@@ -127,6 +154,7 @@ export default (props) => {
             const suQAProcess = responses[0].find(process => process.su === parseInt(props.match.params.id));
             setQASUProcess(suQAProcess);
             const suQAProcessTasks = responses[1].filter(item => item.process === suQAProcess.id);
+            setWorkflowTasks(suQAProcessTasks);
             // setQASchdulingTask(suQAProcessTasks);
             // const workflowLastTask = responses[1].find(task => task.process === suQAProcess.id);
             const workflowLastTask = (_.orderBy(suQAProcessTasks, ['id'], ['desc']))[0];
@@ -172,6 +200,17 @@ export default (props) => {
         return response;
     };
 
+    const getProject = () => {
+        return schedulingUnit.scheduling_set_object.project;
+    };
+
+    const getProjectRoles = (view) => {
+        const allowedProjectRoles = ALLOWED_PROJECT_ROLES[view];
+        return _.filter(projectRoles, projectRole => {
+            return allowedProjectRoles.indexOf(projectRole.value)>=0;
+        });
+    }
+
    //Pages changes step by step
     const onNext = (content) => {
         setState({...state, ...content});
@@ -186,8 +225,7 @@ export default (props) => {
     const showMessage = () => {
         growl.show({severity: 'error', summary: 'Unable to proceed', detail: 'Please clear your browser cookies and try again'});
     }
-
-    const title = pageTitle[currentView - 1];
+    
     const getStepItems = () => {
         let stepItemsModel = _.cloneDeep(stepItems);
         if (!showIngestTab) {
@@ -196,11 +234,17 @@ export default (props) => {
         return stepItemsModel;
     }
 
+    const getTitle = () => {
+        let title = getStepItems()[currentView - 1].label;
+        return title;
+    }
+    
     return (
+        
         <>
             <Growl ref={(el) => growl = el} />
             {currentStep && 
-            <PageHeader location={props.location} title={`${title}`} 
+            <PageHeader location={props.location} title={getTitle()} 
                 actions={[{type:'ext_link', icon:'', label: 'SDC Helpdesk', title: 'Report major issues here', props: { pathname: 'https://support.astron.nl/sdchelpdesk' } },
                             {icon: 'fa-window-close', link: props.history.goBack, title: 'Click to Close Workflow', props: { pathname: '/schedulingunit/1/workflow' } },
                         ]} />}
@@ -232,6 +276,7 @@ export default (props) => {
                             </div>                                             
                         </div>}
                         <div className={`step-header-${currentStep}`}>
+                            
                             <Steps model={getStepItems()} activeIndex={currentView - 1} readOnly={false} 
                                     onSelect={(e) => e.index<currentStep?setCurrentView(e.index+1):setCurrentView(currentView)} />
                         </div>
@@ -244,34 +289,41 @@ export default (props) => {
                             <ProcessingDone onNext={onNext} onCancel={onCancel} readOnly={ currentStep !== 2 }
                                     schedulingUnit={schedulingUnit}  />
                             }
-                            {currentView === 3 &&
+                            {}
+                            {currentView === 3 && userrole.workflow.qa_reporting_to &&
                             <QAreporting onNext={onNext} onCancel={onCancel} id={QASUProcess.id} readOnly={ currentStep !== 3 } 
                                     process={QASUProcess} getCurrentTaskDetails={getCurrentTaskDetails}
-                                    onError={showMessage} />
+                                    workflowTask={_.find(workflowTasks, ['flow_task', 'Qa Reporting To'])}
+                                    onError={showMessage} projectRoles={getProjectRoles('qa reporting to')} />
                             }
-                            {currentView === 4 &&
+                            {currentView === 4 && userrole.workflow.qa_reporting_sos &&
                             <QAsos onNext={onNext} onCancel={onCancel} id={QASUProcess.id} readOnly={ currentStep !== 4 }
                                     process={QASUProcess} getCurrentTaskDetails={getCurrentTaskDetails} 
-                                    onError={showMessage} />
+                                    workflowTask={_.find(workflowTasks, ['flow_task', 'Qa Reporting Sos'])}
+                                    onError={showMessage} projectRoles={getProjectRoles('qa reporting sos')} />
                             }
-                            {currentView === 5 &&
+                            {currentView === 5 && userrole.workflow.pi_verification &&
                             <PIverification onNext={onNext} onCancel={onCancel} id={QASUProcess.id} readOnly={ currentStep !== 5 } 
                                     process={QASUProcess} getCurrentTaskDetails={getCurrentTaskDetails} 
-                                    onError={showMessage} />
+                                    workflowTask={_.find(workflowTasks, ['flow_task', 'Pi Verification'])}
+                                    onError={showMessage} projectRoles={getProjectRoles('pi verification')} />
                             }
-                            {currentView === 6 &&
+                            {currentView === 6 && userrole.workflow.decide_acceptance &&
                             <DecideAcceptance onNext={onNext} onCancel={onCancel} id={QASUProcess.id} readOnly={ currentStep !== 6 }
                                     process={QASUProcess} getCurrentTaskDetails={getCurrentTaskDetails} 
-                                    onError={showMessage} />
+                                    workflowTask={_.find(workflowTasks, ['flow_task', 'Decide Acceptance'])}
+                                    onError={showMessage} project={getProject()}
+                                    projectRoles={getProjectRoles('decide acceptance')} />
                             }
-                            {(showIngestTab && currentView === 7) &&
+                            {(showIngestTab && currentView === 7) && userrole.workflow.unpin_data &&
                             <Ingesting onNext={onNext} onCancel={onCancel} id={QASUProcess.id} readOnly={ currentStep !== 7 } 
                                     onError={showMessage} task={getIngestTask()} />
                             }
                             {currentView === (showIngestTab?8:7) &&
                             <DataProduct onNext={onNext} onCancel={onCancel} id={QASUProcess.id} onError={showMessage} readOnly={ currentStep !== (showIngestTab?8:7) }  
-                                    tasks={tasks} getCurrentTaskDetails={getCurrentTaskDetails}  onError={showMessage} 
-                                    schedulingUnit={schedulingUnit} />
+                                    tasks={tasks} getCurrentTaskDetails={getCurrentTaskDetails} 
+                                    schedulingUnit={schedulingUnit} projectRoles={getProjectRoles('unpin data')} 
+                                    workflowTask={_.find(workflowTasks, ['flow_task', 'Unpin Data'])} />
                             }
                             {currentView === (showIngestTab?9:8) &&
                             <Done onNext={onNext} onCancel={onCancel} onError={showMessage} 
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/pi.verification.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/pi.verification.js
index e325433fc29d6f5da4530761cadd6ac8df6c69f3..535290a2b922f86b51add8bbb32859a615f5a3d5 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/pi.verification.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/pi.verification.js
@@ -4,7 +4,8 @@ import SunEditor from 'suneditor-react';
 import 'suneditor/dist/css/suneditor.min.css'; // Import Sun Editor's CSS File
 import { Checkbox } from 'primereact/checkbox';
 import WorkflowService from '../../services/workflow.service';
-//import {InputTextarea} from 'primereact/inputtextarea';
+import { Link } from 'react-router-dom';
+import TaskAssigner from './task.assigner';
 
 class PIverification extends Component {
     constructor(props) {
@@ -22,11 +23,16 @@ class PIverification extends Component {
         this.handleChange = this.handleChange.bind(this);
         this.onChangePIComment = this.onChangePIComment.bind(this);
         this.getPIVerificationDetails = this.getPIVerificationDetails.bind(this);
+        this.assignTaskCB = this.assignTaskCB.bind(this);
     }
 
     async componentDidMount() {
+        let currentWorkflowTask = null;
         if (this.props.readOnly) {
             this.getPIVerificationDetails();
+
+        }   else {
+            currentWorkflowTask = await this.props.getCurrentTaskDetails();
         }
         const operatorResponse = await WorkflowService.getQAReportingTo(this.props.process.qa_reporting_to);
         const sosResponse = await WorkflowService.getQAReportingSOS(this.props.process.qa_reporting_sos);
@@ -34,7 +40,9 @@ class PIverification extends Component {
             operator_accept: operatorResponse.operator_accept,
             content: sosResponse.sos_report,
             quality_within_policy: sosResponse.quality_within_policy,
-            sos_accept_show_pi: sosResponse.sos_accept_show_pi
+            sos_accept_show_pi: sosResponse.sos_accept_show_pi,
+            assignTo: this.props.readOnly?this.props.workflowTask.owner:(currentWorkflowTask?currentWorkflowTask.fields.owner:null), 
+            currentWorkflowTask: currentWorkflowTask,
         });
     }
 
@@ -66,14 +74,19 @@ class PIverification extends Component {
      * here onNext props coming from parent, where will handle redirection to other page
      */
     async Next() {
-        const currentWorkflowTask = await this.props.getCurrentTaskDetails();
+        let currentWorkflowTask = await this.props.getCurrentTaskDetails();
         const promise = [];
         if (currentWorkflowTask && !currentWorkflowTask.fields.owner) {
             promise.push(WorkflowService.updateAssignTo(currentWorkflowTask.pk),{ owner: this.state.assignTo });
         }
         promise.push(WorkflowService.updateQA_Perform(this.props.id,{"pi_report": this.state.comment, "pi_accept": this.state.pi_accept}));
-        Promise.all(promise).then((responses) => {
+        Promise.all(promise).then(async(responses) => {
             if (responses.indexOf(null)<0) {
+                // After completing the current task, get the next task triggered in the workflow and assign project role user for the next task.
+                currentWorkflowTask = await this.props.getCurrentTaskDetails();
+                if (!currentWorkflowTask.fields.owner) {
+                    await WorkflowService.updateAssignTo(currentWorkflowTask.pk, "project_role=friend_of_project", { owner: this.state.assignTo })
+                }
                 this.props.onNext({ report:this.state.content, pireport: this.state.comment, pi_accept: this.state.pi_accept});
             }   else {
                 this.props.onError();
@@ -92,11 +105,40 @@ class PIverification extends Component {
         this.setState({comment: a  });
     }
 
+    /**
+     * Callback function passed to the Task Assigner and is called after assigning or reassigning task owner.
+     */
+    async assignTaskCB() {
+        let currentWorkflowTask = await this.props.getCurrentTaskDetails();
+        this.setState({currentWorkflowTask: currentWorkflowTask, 
+                        assignTo: currentWorkflowTask.fields.owner, reassign: false});
+    }
+    
     render() {
         return (
             <>
              <div>
-                  <div className={`p-fluid-grid`}>
+                    <div className={`p-fluid-grid`}>
+                        <div className="p-field p-grid" style={{ paddingLeft: '-10px' }}>
+                            <label htmlFor="assignTo" className="col-lg-2 col-md-2 col-sm-12">Assign To</label>
+                            <div className="col-lg-3 col-md-3 col-sm-12" data-testid="assignTo" >
+                            {/* Display the assigned owner of the task */}
+                            {this.state.assignTo && 
+                                <>{this.state.assignTo} 
+                                    {/* Allow to edit the owner if the task is not yet completed */}
+                                    {!this.props.readOnly && !this.state.reassign &&
+                                        <Link onClick={e => this.setState({reassign: true})} style={{marginLeft: '10px'}}>
+                                            <i className="pi pi-pencil"></i>
+                                        </Link>}
+                                </>
+                            }
+                            {/* Display the task assigner if owner is not assigned or to reassign to other user */}
+                            {(!this.state.assignTo || this.state.reassign) && this.state.currentWorkflowTask &&
+                                <TaskAssigner currentWorkflowTask={this.state.currentWorkflowTask} 
+                                        projectRoles={this.props.projectRoles} callback={this.assignTaskCB} />
+                            }
+                            </div>
+                        </div>
                         <div className="p-fluid-grid">
                             <label htmlFor="operatorReport" style={{ padding: '2px' }} >Operator Report</label>
                             <div className="col-lg-12 col-md-12 col-sm-12"></div>
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/qa.reporting.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/qa.reporting.js
index e31a93ea7bc8d2db8dc85c9798347fae806b2011..6ea48a86a5fff8cbe77f49c4db9ea411de5f9c8d 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/qa.reporting.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/qa.reporting.js
@@ -2,9 +2,12 @@ import React, { Component } from 'react';
 import { Button } from 'primereact/button';
 import SunEditor from 'suneditor-react';
 import 'suneditor/dist/css/suneditor.min.css'; // Import Sun Editor's CSS File
-import { Dropdown } from 'primereact/dropdown';
 import WorkflowService from '../../services/workflow.service';
 import { Checkbox } from 'primereact/checkbox';
+import QaReportingTemplate from './qa.reporting.template';
+import { Link } from 'react-router-dom';
+import TaskAssigner from './task.assigner';
+import AppLoader from '../../layout/components/AppLoader';
 
 //import katex from 'katex' // for mathematical operations on sun editor this component should be added
 //import 'katex/dist/katex.min.css'
@@ -16,10 +19,12 @@ class QAreporting extends Component{
         this.state={
             content: '',
             assignTo: '',
-            operator_accept: true
+            operator_accept: true,
+            templateLoading: true
         };
         this.Next = this.Next.bind(this);
         this.handleChange = this.handleChange.bind(this);
+        this.assignTaskCB = this.assignTaskCB.bind(this);
     }
 
     async componentDidMount() {
@@ -28,8 +33,14 @@ class QAreporting extends Component{
             this.setState({
                 content: QAreportingresponse.operator_report,
                 operator_accept: QAreportingresponse.operator_accept,
-                assignTo: 1     // Temporary value. This should be taken from ProcessTask owner.
+                assignTo: this.props.workflowTask?this.props.workflowTask.owner:''     // Temporary value. This should be taken from ProcessTask owner.
             });
+        }   else {
+            const defaultTemplate = await QaReportingTemplate.getReportTemplate(this.props.id)
+            const currentWorkflowTask = await this.props.getCurrentTaskDetails();
+            this.setState({defaultTemplate: defaultTemplate, templateLoading: false,
+                            assignTo: currentWorkflowTask.fields.owner, 
+                            currentWorkflowTask: currentWorkflowTask});
         }
     }
 
@@ -38,14 +49,20 @@ class QAreporting extends Component{
      * here onNext props coming from parent, where will handle redirection to other page
      */
      async Next() {
-        const currentWorkflowTask = await this.props.getCurrentTaskDetails();
+        let currentWorkflowTask = await this.props.getCurrentTaskDetails();
         const promise = [];
+        // If no task owner is assigned, assign to the current logged in user
         if (currentWorkflowTask && !currentWorkflowTask.fields.owner) {
-            promise.push(WorkflowService.updateAssignTo(currentWorkflowTask.pk, { owner: this.state.assignTo }));
+            promise.push(WorkflowService.updateAssignTo(currentWorkflowTask.pk, "", { owner: this.state.assignTo }));
         }
         promise.push(WorkflowService.updateQA_Perform(this.props.id, {"operator_report": this.state.content, "operator_accept": this.state.operator_accept}));
-        Promise.all(promise).then((responses) => {
+        Promise.all(promise).then(async(responses) => {
             if (responses.indexOf(null)<0) {
+                // After completing the current task, get the next task triggered in the workflow and assign project role user for the next task.
+                currentWorkflowTask = await this.props.getCurrentTaskDetails();
+                if (!currentWorkflowTask.fields.owner) {
+                    await WorkflowService.updateAssignTo(currentWorkflowTask.pk, "project_role=friend_of_project", { owner: this.state.assignTo })
+                }
                 this.props.onNext({ report: this.state.content });
             }   else {
                 this.props.onError();
@@ -68,6 +85,15 @@ class QAreporting extends Component{
         let desc = "";
     }
 
+    /**
+     * Callback function passed to the Task Assigner and is called after assigning or reassigning task owner.
+     */
+    async assignTaskCB() {
+        let currentWorkflowTask = await this.props.getCurrentTaskDetails();
+        this.setState({currentWorkflowTask: currentWorkflowTask, 
+                        assignTo: currentWorkflowTask.fields.owner, reassign: false});
+    }
+
     render() {
         return (
         <>
@@ -76,30 +102,48 @@ class QAreporting extends Component{
                 <div className="p-field p-grid" style={{ paddingLeft: '-10px' }}>
                     <label htmlFor="assignTo" className="col-lg-2 col-md-2 col-sm-12">Assign To</label>
                     <div className="col-lg-3 col-md-3 col-sm-12" data-testid="assignTo" >
-                    <Dropdown disabled={this.props.readOnly} inputId="assignToValue" value={this.state.assignTo} optionLabel="value" optionValue="id" onChange={(e) => this.setState({assignTo: e.value})}
-                            options={[{ value: 'User 1', id: 1 }, { value: 'User 2', id: 2 }, { value: 'User 3', id: 3 }]}
-                            placeholder="Assign To" />
+                    {/* Display the assigned owner of the task */}
+                    {this.state.assignTo && 
+                        <>{this.state.assignTo} 
+                            {/* Allow to edit the owner if the task is not yet completed */}
+                            {!this.props.readOnly && !this.state.reassign &&
+                                <Link onClick={e => this.setState({reassign: true})} style={{marginLeft: '10px'}}>
+                                    <i className="pi pi-pencil"></i>
+                                </Link>}
+                        </>
+                    }
+                    {/* Display the task assigner if owner is not assigned or to reassign to other user */}
+                    {(!this.state.assignTo || this.state.reassign) && this.state.currentWorkflowTask &&
+                        <TaskAssigner currentWorkflowTask={this.state.currentWorkflowTask} 
+                                projectRoles={this.props.projectRoles} callback={this.assignTaskCB} />
+                    }
                     </div>
-                </div>                
+                </div>
                 <div className="p-field p-grid" style={{ padding: '12px', position:'relative' }}>
                     <label htmlFor="comments" >Comments {(!this.state.showEditor && !this.props.readOnly) && 
                         <>
-                        <span className="con-edit">(Click content to edit)</span>
                         <span style={{color:'red'}}>*</span>
                         </>}
                     </label>
                     <div className="col-lg-12 col-md-12 col-sm-12"></div>
-                    {!this.props.readOnly && <SunEditor setDefaultStyle="min-height: 250px; height: auto" enableToolbar={true}  disabled={this.props.readOnly}
-                        onChange={ this.handleChange }
-                        setContents={this.state.content}
-                        setOptions={{
-                            buttonList: [
-                                ['undo', 'redo', 'bold', 'underline', 'fontColor', 'table', 'link', 'image', 'video', 'italic', 'strike', 'subscript',
-                                    'superscript', 'outdent', 'indent', 'fullScreen', 'showBlocks', 'codeView', 'preview', 'print', 'removeFormat']
-                            ]
-                        }} />}
-                         {!this.state.showEditor && <div onClick={() => !this.props.readOnly && this.setState({ showEditor: !this.state.showEditor })} className="operator-report"></div>}
-                         {this.props.readOnly &&<div class="comment-editor-content" dangerouslySetInnerHTML={{ __html: this.state.content }}></div>}
+                    {!this.props.readOnly && 
+                    <>
+                        {this.state.templateLoading?<AppLoader />:
+                        <SunEditor setDefaultStyle="min-height: 250px; height: auto;" enableToolbar={true}  disabled={this.props.readOnly}
+                            onChange={ this.handleChange }
+                            setContents={this.state.defaultTemplate}
+                            setOptions={{
+                                buttonList: [
+                                    ['undo', 'redo', 'bold', 'underline', 'fontColor', 'table', 'link', 'image', 'video', 'italic', 'strike', 'subscript',
+                                        'superscript', 'outdent', 'indent', 'fullScreen', 'showBlocks', 'codeView', 'preview', 'print', 'removeFormat']
+                                ]
+                            }} />
+                        }
+                    </>
+                    }
+
+                    {!this.state.showEditor && <div onClick={() => !this.props.readOnly && this.setState({ showEditor: !this.state.showEditor })} className="operator-report"></div>}
+                    {this.props.readOnly &&<div class="comment-editor-content" dangerouslySetInnerHTML={{ __html: this.state.content }}></div>}
                 </div>            
                 <div className="p-col-12">
                     <Checkbox disabled={this.props.readOnly} inputId="operator_accept" onChange={e => this.setState({operator_accept: e.checked})} checked={this.state.operator_accept}></Checkbox>
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/qa.reporting.template.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/qa.reporting.template.js
new file mode 100644
index 0000000000000000000000000000000000000000..68d40a07a634460d61a09992464cf9ef85d1b979
--- /dev/null
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/qa.reporting.template.js
@@ -0,0 +1,148 @@
+import moment from 'moment';
+import _ from 'lodash';
+
+import ScheduleService from "../../services/schedule.service";
+import UIConstants from '../../utils/ui.constants';
+import TaskService from "../../services/task.service";
+
+const QaReportingTemplate = {
+    /**
+     * Function that return the QA Reporting template with values pre-populated from the Scheduling Unit
+     * and tasks.
+     * @param {number} id - Scheduling Unit blueprint id
+     * @returns - QA Reporting template component
+     */
+    getReportTemplate : async function(id) {
+        const SUB = await ScheduleService.getSchedulingUnitExtended('blueprint', id);
+        let dataproducts = await ScheduleService.getSUDataproducts(id);
+        let cycleName = SUB.scheduling_set_object.project.cycles_ids.join(", ");
+        let tasks = SUB.task_blueprints;
+        let project_id =  SUB.scheduling_set_object.project_id;
+
+        let observations = []
+        for (let task of tasks) {
+            let observation = {
+                pipeline: []
+            };
+            if (task.task_type === "observation") {
+                const taskSuccessors = await TaskService.getTaskSuccessors('blueprint', task.id)
+                let taskDataproducts = _.find(dataproducts.task_blueprints, {'id': task.id})
+                for(const successor of taskSuccessors) {
+                    if(successor.task_type === "pipeline") {
+                        observation.pipeline.push(successor.id);
+                    }
+                }
+                let taskDP = [];
+                let completeness = [];
+                // From the dataproducts of all subtasks of the task filter the ones with feedback to get number of files with feedback.
+                // Calculate the completeness from the percentage written in the feedback
+                for (const subtask of taskDataproducts.subtasks) {
+                    const dataproducts = _.filter(subtask.output_dataproducts, dataproduct => {
+                        if (dataproduct.feedback_doc && dataproduct.feedback_doc.percentage_written) {
+                            completeness.push(dataproduct.feedback_doc.percentage_written);
+                        }
+                        return dataproduct.feedback_doc?true:false;
+                    });
+                    taskDP.push(...dataproducts);
+                }
+                observation.dataproducts = taskDP.length;
+                observation.completeness = _.mean(completeness) || 0;
+                let subtasks = _.filter(task.subtasks, ['subtask_type', 'observation']);
+                for (const subtask of subtasks) {
+                    observation.controlId = subtask.id;
+                    observation.scheduleUnitId =  task.scheduling_unit_blueprint_id;
+                    observation.taskId = task.id;
+                    observation.project =  project_id;
+                    observation.antenna = subtask.specifications_doc.stations.antenna_set;
+                    observation.filter = subtask.specifications_doc.stations.filter;
+                    observation.startTime = moment(subtask.start_time, moment.ISO_8601).format(UIConstants.CALENDAR_DATETIME_FORMAT);
+                    observation.stopTime = moment(subtask.stop_time, moment.ISO_8601).format(UIConstants.CALENDAR_DATETIME_FORMAT);
+                    observation.targetname = task.specifications_doc.SAPs ? 
+                                                task.specifications_doc.SAPs.map(sap => sap.name): [];
+                    observation.targetname = observation.targetname.join(", ");
+                    observation.subbands = task.specifications_doc.SAPs ? 
+                                                task.specifications_doc.SAPs.map(sap => sap.subbands.length): [];
+                    observation.subbands = observation.subbands.join(", ");
+                    observations.push(observation);
+                }
+            }
+        }
+        
+        let tableBody = ''
+        for (const observation of observations) {
+            tableBody = tableBody + `
+            <tr>
+                <td><a href="https://proxy.lofar.eu/inspect/HTML/${observation.controlId}/index.html">${observation.controlId}</a></td>
+                <td>${observation.scheduleUnitId}</td>
+                <td>${observation.taskId}</td>
+                <td>${observation.pipeline.join(",")}</td>
+                <td>${observation.project}</td>
+                <td>${observation.targetname}</td>
+                <td><a href="https://proxy.lofar.eu/inspect/HTML/${observation.controlId}/Stations/station_beamlets.html">BST</a></td>
+                <td><a href="https://proxy.lofar.eu/inspect/HTML/${observation.controlId}/index.html">${observation.completeness}%</a></td>
+                <td>${observation.antenna}</td>
+                <td>${observation.filter}</td>
+                <td>${observation.startTime}</td>
+                <td>${observation.stopTime}</td>
+                <td>${observation.subbands}</td>
+                <td>${observation.dataproducts}</td>
+                <td><a href="https://proxy.lofar.eu/inspect/${observation.controlId}/rtcp-${observation.controlId}.parset">parset</a></td>
+            </tr>`
+        }
+        
+        return (
+            `<p>Subject- Observation ${SUB.status.toLowerCase() === 'error'?'Failed': 'Success'}</p>
+            <p>Dear Colleague,</p>
+            <p> The following message contains information regarding a LOFAR ${cycleName} project for which you are listed as the contact author.
+            Please forward this information to your collaborators.</p>
+            <p> We would like to inform you that observations related to your LOFAR ${cycleName} project have been performed. Please find detailed information below.</p>
+            <strong>General notes:</strong>
+            <p> The validation plots linked below remains online for 3 weeks from the date of observation. After that, they are compressed and transferred to offline storage. users can request access to them by submitting a ticket through the <a href="https://support.astron.nl/sdchelpdesk">helpdesk</a>.</p>
+            <strong>Observations:</strong>
+            <table>
+                <thead>
+                    <th>Observation ID</th>
+                    <th> Scheduling Unit ID</th>
+                    <th> Task ID</th>
+                    <th> Pipeline ID</th>
+                    <th> Project</th>
+                    <th> Target Name</th>
+                    <th> Station plots</th>
+                    <th> Completeness</th>
+                    <th> Antenna Set</th>
+                    <th> Filter</th>
+                    <th> Start Time</th>
+                    <th> End time</th>
+                    <th> Number of Sub-bands</th>
+                    <th> Number of files</th>
+                    <th> Parset</th>
+                </thead>
+                <tbody>
+                    ${tableBody}
+                </tbody>
+            </table>
+            <br/>
+            <strong>Performance of the system:</strong>
+            <strong>Data recording:</strong>
+            <strong>Data processing:</strong>
+            <strong>Archiving:</strong>
+            <strong style='display:inline'>Remarks:</strong><p style= "display:inline; position: relative"> Please analyse the validation plots at 
+            <a href="https://proxy.lofar.eu/inspect/HTML/">https://proxy.lofar.eu/inspect/HTML/</a> within 24 hours after this notification and submit your 
+            findings using the form at <a href="http://localhost:3000/schedulingunit/${id}/workflow">http://localhost:3000/schedulingunit/${id}/workflow </a>.
+            After this time window has passed, we will assume that your judgement is that the observation was successful and we will complete the actions described above ourselves to support your run.</p>
+            <br/>
+            <p>From the moment the data are made available to you at the LTA you have four weeks to check their quality and to report any problems to the 
+            Observatory through the <a href="https://support.astron.nl/sdchelpdesk">helpdesk</a>. After this time window has passed, no requests for re-observations will be considered.</p>
+
+            <strong>Actions:</strong>
+            <p>If you need any further clarification, please do not hesitate to contact us through the SDC helpdesk at <a href="https://support.astron.nl/sdchelpdesk">https://support.astron.nl/sdchelpdesk</a>, specifying your project code in the subject.
+
+            <p>Best regards,</p>
+            <p>TO name (Telescope Operations)</p>
+            <p>SDCO name (Science Data center Operations)</p>`
+        );
+    }
+    
+};
+
+export default QaReportingTemplate;
\ No newline at end of file
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/qa.sos.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/qa.sos.js
index 3bad90ec6782363da16b58161e9c3784f83fbf7f..9d9b53db4140e112cc09d6581683c68309540eb7 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/qa.sos.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/qa.sos.js
@@ -4,6 +4,8 @@ import SunEditor from 'suneditor-react';
 import 'suneditor/dist/css/suneditor.min.css'; // Import Sun Editor's CSS File
 import { Checkbox } from 'primereact/checkbox';
 import WorkflowService from '../../services/workflow.service';
+import { Link } from 'react-router-dom';
+import TaskAssigner from './task.assigner';
 
 class QAreportingSDCO extends Component {
     constructor(props) {
@@ -18,16 +20,19 @@ class QAreportingSDCO extends Component {
         this.Next = this.Next.bind(this);
         this.handleChange = this.handleChange.bind(this);
         this.getQASOSDetails = this.getQASOSDetails.bind(this);
+        this.assignTaskCB = this.assignTaskCB.bind(this);
     }
 
     async componentDidMount() {
         if (this.props.readOnly) {
             this.getQASOSDetails()
-        } else {
+        }   else {
+            const currentWorkflowTask = await this.props.getCurrentTaskDetails();
             const response = await WorkflowService.getQAReportingTo(this.props.process.qa_reporting_to);
             this.setState({
                 content: response.operator_report,
-                operator_accept: response.operator_accept
+                operator_accept: response.operator_accept,
+                assignTo: currentWorkflowTask.fields.owner, currentWorkflowTask: currentWorkflowTask
             });
         }
     }
@@ -35,6 +40,7 @@ class QAreportingSDCO extends Component {
     async getQASOSDetails() {
         const QASOSresponse = await WorkflowService.getQAReportingSOS(this.props.process.qa_reporting_sos,this.props.process.operator_report);
         this.setState({
+            assignTo: this.props.workflowTask?this.props.workflowTask?.owner:null,
             content: QASOSresponse.sos_report,
             quality_within_policy: QASOSresponse.quality_within_policy,
             sos_accept_show_pi: QASOSresponse.sos_accept_show_pi            
@@ -57,14 +63,19 @@ class QAreportingSDCO extends Component {
      * here onNext props coming from parent, where will handle redirection to other page
      */
     async Next() {
-        const currentWorkflowTask = await this.props.getCurrentTaskDetails();
+        let currentWorkflowTask = await this.props.getCurrentTaskDetails();
         const promise = [];
         if (currentWorkflowTask && !currentWorkflowTask.fields.owner) {
             promise.push(WorkflowService.updateAssignTo(currentWorkflowTask.pk, { owner: this.state.assignTo }));
         }
         promise.push(WorkflowService.updateQA_Perform(this.props.id, {"sos_report": this.state.content, "sos_accept_show_pi": this.state.sos_accept_show_pi, "quality_within_policy": this.state.quality_within_policy}));
-        Promise.all(promise).then((responses) => {
+        Promise.all(promise).then(async(responses) => {
             if (responses.indexOf(null)<0) {
+                // After completing the current task, get the next task triggered in the workflow and assign project role user for the next task.
+                currentWorkflowTask = await this.props.getCurrentTaskDetails();
+                if (!currentWorkflowTask.fields.owner) {
+                    await WorkflowService.updateAssignTo(currentWorkflowTask.pk, "project_role=contact", { owner: this.state.assignTo })
+                }
                 this.props.onNext({ report: this.state.content });
             }   else {
                 this.props.onError();
@@ -77,11 +88,40 @@ class QAreportingSDCO extends Component {
         this.props.history.goBack();
     }
 
+    /**
+     * Callback function passed to the Task Assigner and is called after assigning or reassigning task owner.
+     */
+    async assignTaskCB() {
+        let currentWorkflowTask = await this.props.getCurrentTaskDetails();
+        this.setState({currentWorkflowTask: currentWorkflowTask, 
+                        assignTo: currentWorkflowTask.fields.owner, reassign: false});
+    }
+
     render() {
         return (
             <>
                 <div>                    
-                        <div className={`p-fluid-grid`}>
+                    <div className={`p-fluid-grid`}>
+                        <div className="p-field p-grid" style={{ paddingLeft: '-10px' }}>
+                            <label htmlFor="assignTo" className="col-lg-2 col-md-2 col-sm-12">Assign To</label>
+                            <div className="col-lg-3 col-md-3 col-sm-12" data-testid="assignTo" >
+                            {/* Display the assigned owner of the task */}
+                            {this.state.assignTo &&
+                                <>{this.state.assignTo} 
+                                    {/* Allow to edit the owner if the task is not yet completed */}
+                                    {!this.props.readOnly && !this.state.reassign &&
+                                        <Link onClick={e => this.setState({reassign: true})} style={{marginLeft: '10px'}}>
+                                            <i className="pi pi-pencil"></i>
+                                        </Link>}
+                                </>
+                            }
+                            {/* Display the task assigner if owner is not assigned or to reassign to other user */}
+                            {(!this.state.assignTo || this.state.reassign) && this.state.currentWorkflowTask &&
+                                <TaskAssigner currentWorkflowTask={this.state.currentWorkflowTask} 
+                                        projectRoles={this.props.projectRoles} callback={this.assignTaskCB} />
+                            }
+                            </div>
+                        </div>
                         <Checkbox inputId="operator_accept" checked={this.state.operator_accept} disabled />
                         <label htmlFor="operator_accept" style={{paddingLeft:"5px"}}>The data quality adheres to policy (Operator evaluation)</label>
                         <div className="col-lg-1 col-md-1 col-sm-12"></div>   
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/task.assigner.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/task.assigner.js
new file mode 100644
index 0000000000000000000000000000000000000000..2b37bd388b451567a0f6ad6b6bd3270712183a5c
--- /dev/null
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/task.assigner.js
@@ -0,0 +1,89 @@
+import React, { Component } from 'react';
+import { Dropdown } from 'primereact/dropdown';
+import WorkflowService from '../../services/workflow.service';
+import { Link } from 'react-router-dom';
+import { InputText } from 'primereact/inputtext';
+
+/** Component to assign workflow tasks in the Workflow process */
+class TaskAssigner extends Component {
+
+    constructor(props) {
+        super(props);
+        this.state = { 
+            errors: {}
+        };
+        this.assignUser = this.assignUser.bind(this);
+    }
+
+    /**
+     * Validate and set value for user amail field
+     * @param {string} email 
+     */
+    setUserMail(email) {
+        // TODO: Move the validator to validator file
+        const emailRegex = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
+        let errors = this.state.errors;
+        if (email && !emailRegex.test(email.toLowerCase())) {
+            errors['email'] = "Enter vaild email";
+        }   else {
+            delete errors['email'];
+        }
+        this.setState({assignToEmail: email, assignToRole: null, errors: errors});
+    }
+
+    /**
+     * To assign or reassign user to the current workflow task. To assign to the logged in user 'Assign To Me' link is clcked 
+     * and self assigned.
+     * @param {boolean} selfAssign 
+     */
+    async assignUser(selfAssign) {
+        let toUser = selfAssign?`self=true`:
+                            (this.state.assignToRole?`project_role=${this.state.assignToRole}`
+                                :(this.state.assignToEmail?`user_email=${this.state.assignToEmail}`:""));
+        let assignStatus = null;
+        if (this.props.currentWorkflowTask.fields.owner) {
+            if (toUser) {
+                assignStatus = await WorkflowService.reAssignTo(this.props.currentWorkflowTask.pk, toUser, {});
+            }
+        }   else {
+            assignStatus = await WorkflowService.updateAssignTo(this.props.currentWorkflowTask.pk, toUser, {});
+        }
+        // Callback to the parent component after assigning user to the task.
+        this.props.callback();
+    }
+
+    render() {
+        const allowSave = this.state.assignToRole  || (this.state.assignToEmail && !this.state.errors.email);
+        return (
+            <>
+                <div>
+                    <Link to="#" onClick={e => {this.assignUser(true)}}>
+                        Assign to me</Link>
+                </div>
+                <Dropdown disabled={this.props.readOnly} inputId="assignToValue" 
+                        tooltip="Assign to user with role (will be assigned to the first user in this role)"
+                        value={this.state.assignToRole} optionLabel="displayValue" optionValue="value" 
+                        onChange={(e) => this.setState({assignToRole: e.value, assignToEmail: null})}
+                        options={this.props.projectRoles}
+                        placeholder="Project Role" style={{marginBottom: '5px'}} />
+                <div style={{marginBottom: '5px'}} >
+                    <InputText value={this.state.assignToEmail} placeholder="User Email" 
+                        tooltip="Assign to user with this email"
+                        onChange={e => this.setUserMail(e.target.value)} />
+                    <label className="error">
+                        {this.state.errors.email ? this.state.errors.email : ""}
+                    </label>
+                </div>
+                <div style={{float: 'right'}}>
+                    <Link to="#" onClick={e => {this.assignUser()}} style={{marginRight: '10px'}}
+                        className={allowSave?'':'disabled-link'}>
+                        <i className="fa fa-check"></i></Link>
+                    <Link to="#" onClick={e => {this.props.callback()}}>
+                    <i className="fa fa-times"></i></Link>
+                </div>
+            </>
+        );
+    }
+}
+
+export default TaskAssigner;
\ No newline at end of file
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/unpin.data.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/unpin.data.js
index 51365b130e68c7d3359458c1e646d119927cad09..6cddb845928e3b4c41114b82a9a2e0eb73d5567b 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/unpin.data.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/unpin.data.js
@@ -1,13 +1,17 @@
-import React, { useState } from 'react';
+import React, { useEffect, useState } from 'react';
 import { Button } from 'primereact/button';
 import { Dialog } from 'primereact/dialog';
 import ViewTable from './../../components/ViewTable';
 import { Link } from 'react-router-dom';
 import WorkflowService from '../../services/workflow.service';
+import TaskAssigner from './task.assigner';
 
 export default ({ tasks, schedulingUnit, onCancel, ...props }) => {
     const [showConfirmDialog, setShowConfirmDialog] = useState(false);
   //  const [QASUProcess, setQASUProcess] = useState();
+    const [currentWorkflowTask, setCurrentWorkflowTask] = useState();
+    const [assignTo, setAssignTo] = useState();
+    const [reassign, setReassign] = useState(false);
     const defaultcolumns = [ {
         name: "Name",
         totalDataSize:"Total Data Size(TB)", 
@@ -27,7 +31,7 @@ export default ({ tasks, schedulingUnit, onCancel, ...props }) => {
      * Method will trigger on click next buton
      * here onNext props coming from parent, where will handle redirection to other page
      */
-      const Next = async () => {
+    const Next = async () => {
         const currentWorkflowTask = await props.getCurrentTaskDetails();
         const promise = [];
         if (currentWorkflowTask && !currentWorkflowTask.fields.owner) {
@@ -44,10 +48,54 @@ export default ({ tasks, schedulingUnit, onCancel, ...props }) => {
         setShowConfirmDialog(false)
     }
 
+    useEffect(() => {
+        if (!props.readOnly && !currentWorkflowTask) {
+            props.getCurrentTaskDetails()
+            .then(currentWorkflowTask => {
+                setCurrentWorkflowTask(currentWorkflowTask);
+            });
+        }
+        if (props.readOnly && !assignTo) {
+            setAssignTo(props.workflowTask.owner);
+        }
+    }, []);
+
+    /**
+     * Callback function passed to the Task Assigner and is called after assigning or reassigning task owner.
+     */
+    const assignTaskCB = async() => {
+        let currentWorkflowTask = await props.getCurrentTaskDetails();
+        setCurrentWorkflowTask(currentWorkflowTask); 
+        setAssignTo(currentWorkflowTask.fields.owner);
+        setReassign(false);
+    }
+    
+    
     return (
         <div className="p-fluid mt-2">
+            <div className="p-field p-grid" style={{ paddingLeft: '-10px' }}>
+                <label htmlFor="assignTo" className="col-lg-2 col-md-2 col-sm-12">Assign To</label>
+                <div className="col-lg-3 col-md-3 col-sm-12" data-testid="assignTo" >
+                {/* Display the assigned owner of the task */}
+                {assignTo && 
+                    <>{assignTo} 
+                        {/* Allow to edit the owner if the task is not yet completed */}
+                        {!props.readOnly && !reassign &&
+                            <Link onClick={e => setReassign(true)} style={{marginLeft: '10px'}}>
+                                <i className="pi pi-pencil"></i>
+                            </Link>}
+                    </>
+                }
+                {/* Display the task assigner if owner is not assigned or to reassign to other user */}
+                {(!assignTo || reassign) && currentWorkflowTask &&
+                    <TaskAssigner currentWorkflowTask={currentWorkflowTask} 
+                            projectRoles={props.projectRoles} callback={assignTaskCB} />
+                }
+                </div>
+            </div>
         <label><h6>Details of data products of Tasks</h6></label>
-         <ViewTable 
+        <div style={{marginTop: "-50px"}}>
+            <ViewTable 
                 data={tasks.filter(task => (task.totalDataSize!==undefined || task.dataSizeNotDeleted!==undefined))} 
                 optionalcolumns={optionalcolumns}
                 defaultcolumns={defaultcolumns} 
@@ -60,7 +108,8 @@ export default ({ tasks, schedulingUnit, onCancel, ...props }) => {
                 showaction="true"
                 keyaccessor="id"
                 defaultpagesize={tasks.length}
-             />
+            />
+        </div>
            <div className="p-grid p-justify-start mt-2">
            {!props.readOnly && <div className="btn-bar">
                     <Button label="Delete" className="p-button-primary" icon="pi pi-trash" onClick={toggleDialog} />
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/workflow.list.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/workflow.list.js
index fc4d5e0be02873c7a6a9888bcc0d5c7d137d7d44..2d8c808db2db4090c012a7940784ae0a3abcf964 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/workflow.list.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/workflow.list.js
@@ -12,14 +12,21 @@ import WorkflowService from  '../../services/workflow.service';
 import ScheduleService from  '../../services/schedule.service';
 import UIConstants from '../../utils/ui.constants';
 import UtilService from '../../services/util.service';
+import UnitConverter from '../../utils/unit.converter';
+import AuthUtil from '../../utils/auth.util';
+import AccessDenied from '../../layout/components/AccessDenied';
 
 class WorkflowList extends Component{
     lsKeySortColumn = 'SortDataWorkflowList';
     defaultSortColumn = [];
+    SU_BLUEPRINT_EXPAND = 'draft,draft.scheduling_set,draft.scheduling_set.project,draft.observation_strategy_template';
+
     constructor(props) {
         super(props);
         this.setToggleBySorting();
+        this.workflowUIAttr = UtilService.localStore({ type: 'get', key: 'WORKFLOW_UI_ATTR' }) || {};
         this.state={
+            userrole: {},
             ftAssignstatus: '',
             activeWorkflow: null,
             showActiveStage: 'Show Active Workflow Process',
@@ -36,11 +43,16 @@ class WorkflowList extends Component{
                     name: "Scheduling Unit Status",
                     filter: "select",
                 },
+                project: "Project",
                 assignedTo: "Assigned To",
-                lastTaskName:"Current Workflow Stage",               
+                lastTaskName:  {
+                    name:"Current Workflow Stage",
+                    filter: "multiselect-filter"
+                },
+                
                 updated_at: {
                     name:"Updated At",
-                    filter:"date",
+                    filter:"dateRange",
                     format:UIConstants.CALENDAR_DATETIME_FORMAT
                 },
                 actionpath: "actionpath"
@@ -53,12 +65,14 @@ class WorkflowList extends Component{
             defaultSortColumn: [{id: "Scheduling unit ID", desc: false}],
             isLoading: true,
         };
+        this.statusList = [];
         this.pageUpdated = true;
         this.schedulingUnitList = null;
         this.workflowProcessList = null;
         this.workflowTasksList = null;
         this.redirectionMap = {
             'wait scheduled': 'Waiting To Be Scheduled',
+            'wait observed': 'Scheduled',
             'wait processed': 'Scheduled',
             'qa reporting to': 'QA Reporting (TO)',
             'qa reporting sos': 'QA Reporting (SDCO)',
@@ -74,26 +88,46 @@ class WorkflowList extends Component{
         this.getFilterOptions = this.getFilterOptions.bind(this);
     }
  
-    componentDidMount() {
+    async componentDidMount() {
+        const permission = await AuthUtil.getUserPermissionByModule('project');
+        this.setState({userrole: permission});
         this.pageUpdated = true;
         this.setToggleBySorting();
         const promises = [  WorkflowService.getWorkflowProcesses(),
                             WorkflowService.getWorkflowTasks(), 
-                            ScheduleService.getSchedulingUnitBlueprint(),];
+                            ScheduleService.getSchedulingUnitsExpandWithFilter('blueprint',this.SU_BLUEPRINT_EXPAND, '', 10, 0),
+                            ScheduleService.getSchedulingUnitFilterDefinition('blueprint')
+                        ];
         Promise.all(promises).then(async responses => {
+            this.getStatusList(responses[3]);
             this.workflowProcessList = responses[0];
             this.workflowTasksList = responses[1];
             this.schedulingUnitList = responses[2].data.results;
             this.prepareWorkflowProcesslist();
         });
+        
+        
+    }
+
+    /**
+     * get Status list
+     * @param {*} suFilters 
+     */
+    getStatusList(suFilters) {
+        if(suFilters){
+            this.statusList = UnitConverter.getStatusList(suFilters);
+        }
     }
 
     toggleBySorting = (sortData) => {
-        UtilService.localStore({ type: 'set', key: this.lsKeySortColumn, value: sortData });
+        
+        this.storeUIAttr(this.lsKeySortColumn, sortData)
     }
 
     setToggleBySorting() {    
-        let sortData = UtilService.localStore({ type: 'get', key: this.lsKeySortColumn });
+        this.workflowUIAttr = UtilService.localStore({ type: 'get', key: 'WORKFLOW_UI_ATTR' });
+        let sortData = this.workflowUIAttr[this.lsKeySortColumn];
+        
         if (sortData) {
             if (Object.prototype.toString.call(sortData) === '[object Array]') {
                 this.defaultSortColumn = sortData;
@@ -103,21 +137,16 @@ class WorkflowList extends Component{
             }
         }
         this.defaultSortColumn = this.defaultSortColumn || [];
-        UtilService.localStore({ type: 'set', key: this.lsKeySortColumn, value: [...this.defaultSortColumn] });
+        
+        this.storeUIAttr(this.lsKeySortColumn, [...this.defaultSortColumn])
     }
 
-    /**
-     * Get Option-list values for Select Dropdown filter in 'Viewtable'
-     * @param {String} id : Column id
-     * @returns 
-     */
-     getFilterOptions(id) {
-        let options = null;
-        if(id && id === 'Scheduling Unit Status') {
-            options = UIConstants.SU_STATUS;
-        }   
-        return options;
+    storeUIAttr(key, value){
+        this.workflowUIAttr[key] = value
+        UtilService.localStore({ type: 'set', key: 'WORKFLOW_UI_ATTR', value: this.workflowUIAttr })  
     }
+
+    
     
     /**
      * Prepare Workflow Process data
@@ -126,39 +155,46 @@ class WorkflowList extends Component{
         let workflowProcessList = [];
         if (this.workflowProcessList) {
             for(const wfSU of this.workflowProcessList) {
-                const schedulingUnit = _.find(this.schedulingUnitList, {'id': wfSU.su});
+                const schedulingUnit = _.find(this.schedulingUnitList, {'id': wfSU.su});                
                 if(schedulingUnit) {
                     wfSU['suName'] = schedulingUnit.name;
+                    wfSU['project'] = schedulingUnit.draft.scheduling_set.project.name;                    
                     wfSU['status'] = schedulingUnit.status;
-                }
-                const workflowTasks = _.orderBy(this.workflowTasksList.filter(item => item.process === wfSU.id), ['id'], ['desc']);
-                const workflowTask = workflowTasks[0];
-                // workflowTask :- latest task /current task
-                if(workflowTask) {
-                    wfSU['updated_at'] =  moment(workflowTask['assigned']?workflowTask['assigned']:workflowTask['created']).format(UIConstants.UTC_DATE_TIME_FORMAT);
-                    wfSU['flow_task'] = workflowTask.flow_task;
-                    wfSU['lastTaskName'] = this.redirectionMap[workflowTask.flow_task.toLowerCase()];
-                    //let currenttask = await WorkflowService.getCurrentTask(wfSU.id);
-                    //wfSU['owner'] = (currenttask && currenttask.fields.owner)? currenttask.fields.owner : '';
-                    wfSU['owner'] = workflowTask.owner? workflowTask.owner : '';
-                    wfSU['assignedTo'] = workflowTask.owner? workflowTask.owner : '';;
-                }
-               
-                //TODO: this code commented and can be used to show only current task owner details when filter enabled
-                //Get assigned name list
-                /*  let assignedTo = '';
-                workflowLastTasks.forEach(task => {
-                    if(task.owner) {
-                        assignedTo += task.owner+', ';
+                    const workflowTasks = _.orderBy(this.workflowTasksList.filter(item => item.process === wfSU.id), ['id'], ['desc']);
+                    const workflowTask = workflowTasks[0];
+                    // workflowTask :- latest task /current task
+                    if(workflowTask) {
+                        wfSU['updated_at'] =  moment(workflowTask['assigned']?workflowTask['assigned']:workflowTask['created']).format(UIConstants.UTC_DATE_TIME_FORMAT);
+                        wfSU['flow_task'] = workflowTask.flow_task;
+                        wfSU['lastTaskName'] = this.redirectionMap[workflowTask.flow_task.toLowerCase()];
+                        //let currenttask = await WorkflowService.getCurrentTask(wfSU.id);
+                        //wfSU['owner'] = (currenttask && currenttask.fields.owner)? currenttask.fields.owner : '';
+                        wfSU['owner'] = workflowTask.owner? workflowTask.owner : '';
+                        wfSU['assignedTo'] = workflowTask.owner? workflowTask.owner : '';
                     }
-                });
-                assignedTo = assignedTo.slice(0, -2); 
-                wfSU['assignedTo'] = assignedTo; */
-                wfSU['actionpath'] = `/schedulingunit/${wfSU.id}/workflow`;
-                workflowProcessList.push(wfSU);
+                
+                    //TODO: this code commented and can be used to show only current task owner details when filter enabled
+                    //Get assigned name list
+                    /*  let assignedTo = '';
+                    workflowLastTasks.forEach(task => {
+                        if(task.owner) {
+                            assignedTo += task.owner+', ';
+                        }
+                    });
+                    assignedTo = assignedTo.slice(0, -2); 
+                    wfSU['assignedTo'] = assignedTo; */
+                    wfSU['actionpath'] = `/schedulingunit/${wfSU.id}/workflow`;
+                    workflowProcessList.push(wfSU);
+                }
             }
         }
-        this.setState({workflowProcessList: workflowProcessList, filteredWorkflowProcessList:workflowProcessList,isLoading: false});
+         
+        this.workflowUIAttr=  UtilService.localStore({ type: 'get', key: 'WORKFLOW_UI_ATTR' }); 
+        let ftAssignstatus = this.workflowUIAttr.ftAssignstatus;
+        let activeWorkflow =  this.workflowUIAttr.activeWorkflow || this.state.activeWorkflow;
+        let showActiveStage = this.workflowUIAttr.showActiveStage ; 
+        this.setState({ftAssignstatus: ftAssignstatus?ftAssignstatus: [] , activeWorkflow:activeWorkflow, showActiveStage:showActiveStage,workflowProcessList: workflowProcessList, filteredWorkflowProcessList:workflowProcessList,isLoading: false });       
+        this.filterTableData();
     }
 
     /**
@@ -168,12 +204,30 @@ class WorkflowList extends Component{
         this.props.history.goBack();
     }
 
+     /**
+     * Get Option-list values for Select Dropdown filter in 'Viewtable'
+     * @param {String} id : Column id
+     * @returns 
+     */
+      getFilterOptions(id) {
+        let options = null;
+        if(id && id === 'Current Workflow Stage') {
+            options = _.map(UIConstants.CURRENT_WORKFLOW_STAGE, stage=> {return {name: stage, value: stage}});
+        }  
+        else if(id && id === 'Scheduling Unit Status') {
+            options = this.statusList;//UIConstants.SU_STATUS;
+        }
+        return options;
+      }
+
     /**
      * Filter the table data with drop down selected
      * @param {String} value - Drop Down filter value
      */
     async assignStatusChangeEvent(value) {
         await this.setState({'ftAssignstatus': value});
+        
+        this.storeUIAttr('ftAssignstatus', value)
         //TODO: commented this code. It requires user details, waiting for API changes
         //await this.filterTableData();
     }
@@ -182,7 +236,7 @@ class WorkflowList extends Component{
      * Filter the table data with checkbox value, it will fetch active workflow stagerows if the checkbox selected
      * @param {Boolena} value 
      */
-    async setWorkflowActiveState(value) {
+    async setWorkflowActiveState(value) {       
         let showActiveStage = '';
         if(value === null) {
             showActiveStage = 'Show Active Workflow Process';
@@ -192,6 +246,10 @@ class WorkflowList extends Component{
             showActiveStage = 'Show All Workflow Process';
         }
         await this.setState({'activeWorkflow': value, showActiveStage: showActiveStage});
+        
+        this.storeUIAttr('activeWorkflow', value)
+        
+        this.storeUIAttr('showActiveStage', showActiveStage )
         await this.filterTableData();
     }
 
@@ -245,64 +303,68 @@ class WorkflowList extends Component{
     }
  
     render() {
+            const {project} = this.state.userrole;
         return (
             <React.Fragment>
-                <PageHeader location={this.props.location} title={'Workflow - List'} 
-                            actions={[{icon: 'fa-window-close', title:'Click to Close Workflow - List', 
-                            type: 'button',  actOn: 'click', props:{ callback: this.close }}]}/>
-                <div>
-                {this.state.isLoading ? <AppLoader/> : (this.state.workflowProcessList.length>0 )?
+                {project && project.list ?
                     <>
-                        <div className="p-select " style={{position: 'relative', marginLeft: '27em', marginTop: '-2em'}}>
-                            <div className="p-field p-grid">
-                                <div className="col-lg-4 col-md-3 col-sm-12 ms-height">
-                                    <span className="p-float-label">
-                                        <MultiSelect data-testid="workflowoverview" id="workflowoverview" optionLabel="name" optionValue="code" filter={true}
-                                                tooltip="Show workflows those are 'Assigned to me' / 'Unassigned'/ 'I Participated'" tooltipOptions={this.tooltipOptions}
-                                                value={this.state.ftAssignstatus} 
-                                                options={this.filterslist} 
-                                                onChange={(e) => {this.assignStatusChangeEvent(e.value)}} 
-                                                className="ms-width"
-                                                style={{width: '14em'}}
-                                        />
-                                        <label htmlFor="workflowoverview" >Show Workflow </label>
-                                    </span>
-                                </div>
-                                <div>
-                                    <label htmlFor="cb1" className="p-checkbox-label">Active</label>
-                                    <TriStateCheckbox  
-                                    onChange={(e) => {this.setWorkflowActiveState(e.value)}}  
-                                    value={this.state.activeWorkflow} 
-                                    style={{marginLeft: '5px', marginTop: '5px'}}
-                                    tooltip={this.state.showActiveStage} tooltipOptions={this.tooltipOptions}
-                                    ></TriStateCheckbox>
+                        <PageHeader location={this.props.location} title={'Workflow - List'} 
+                                    actions={[{icon: 'fa-window-close', title:'Click to Close Workflow - List', 
+                                    type: 'button',  actOn: 'click', props:{ callback: this.close }}]}/>
+                        <div style={{marginTop: '15px'}}>
+                        {this.state.isLoading ? <AppLoader/> : (this.state.workflowProcessList.length>0 )?
+                            <>
+                                <div className="p-select " style={{position: 'relative', marginLeft: '27em', marginTop: '-2em'}}>
+                                    <div className="p-field p-grid">
+                                        <div className="col-lg-4 col-md-3 col-sm-12 ms-height">
+                                            <span className="p-float-label">
+                                                <MultiSelect data-testid="workflowoverview" id="workflowoverview" optionLabel="name" optionValue="code" filter={true}
+                                                        tooltip="Show workflows those are 'Assigned to me' / 'Unassigned'/ 'I Participated'" tooltipOptions={this.tooltipOptions}
+                                                        value={this.state.ftAssignstatus} 
+                                                        options={this.filterslist} 
+                                                        onChange={(e) => {this.assignStatusChangeEvent(e.value)}} 
+                                                        className="ms-width"
+                                                        style={{width: '14em'}}
+                                                />
+                                                <label htmlFor="workflowoverview" >Show Workflow </label>
+                                            </span>
+                                        </div>
+                                        <div>
+                                            <label htmlFor="cb1" className="p-checkbox-label">Active</label>
+                                            <TriStateCheckbox  
+                                            onChange={(e) => {this.setWorkflowActiveState(e.value)}}  
+                                            value={this.state.activeWorkflow} 
+                                            style={{marginLeft: '5px', marginTop: '5px'}}
+                                            tooltip={this.state.showActiveStage} tooltipOptions={this.tooltipOptions}
+                                            ></TriStateCheckbox>
+                                        </div>
+                                    </div>
+                                
                                 </div>
-                            </div>
-                        
+                                <ViewTable 
+                                    data={this.state.filteredWorkflowProcessList} 
+                                    defaultcolumns={this.state.defaultcolumns} 
+                                    optionalcolumns={this.state.optionalcolumns}
+                                    columnclassname={this.state.columnclassname}
+                                    defaultSortColumn={this.state.defaultSortColumn}
+                                    showaction="true"
+                                    keyaccessor="su"
+                                    paths={this.state.paths}
+                                    tablename="workflow_process_list"
+                                    showTopTotal={true}
+                                    showGlobalFilter={true}
+                                    showColumnFilter={true}
+                                    showFilterOption={this.getFilterOptions} //Callback function to provide inputs for option-list in Select Dropdown filter
+                                    lsKeySortColumn={this.lsKeySortColumn}
+                                    toggleBySorting={(sortData) => this.toggleBySorting(sortData)}    
+                                    pageUpdated={this.pageUpdated}
+                                    storeFilter={true}
+                                />
+                            </>
+                            :<div>No Workflow Process SU found</div>
+                            }
                         </div>
-                        <ViewTable 
-                            data={this.state.filteredWorkflowProcessList} 
-                            defaultcolumns={this.state.defaultcolumns} 
-                            optionalcolumns={this.state.optionalcolumns}
-                            columnclassname={this.state.columnclassname}
-                            defaultSortColumn={this.state.defaultSortColumn}
-                            showaction="true"
-                            keyaccessor="su"
-                            paths={this.state.paths}
-                            tablename="workflow_process_list"
-                            showTopTotal={true}
-                            showGlobalFilter={true}
-                            showColumnFilter={true}
-                            showFilterOption={this.getFilterOptions} //Callback function to provide inputs for option-list in Select Dropdown filter
-                            lsKeySortColumn={this.lsKeySortColumn}
-                            toggleBySorting={(sortData) => this.toggleBySorting(sortData)}
-                            defaultSortColumn= {this.defaultSortColumn}
-                            pageUpdated={this.pageUpdated}
-                        />
-                    </>
-                    :<div>No Workflow Process SU found</div>
-                    }
-                </div>
+                    </>: <AccessDenied/> }
             </React.Fragment>
         );
     };
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/index.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/index.js
index 78981fdaa8b786502c517ce008a61dc320350a5b..b838150d01a5cfe62cd5cb7e695b12fd04e150f2 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/routes/index.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/index.js
@@ -25,6 +25,7 @@ import ReportHome from './Report';
 import { Growl } from 'primereact/components/growl/Growl';
 import { setAppGrowl } from '../layout/components/AppGrowl';
 import WorkflowList from './Workflow/workflow.list'
+import ProtectedRoute from '../components/ProtectedRouteComponent';
 
 export const routes = [
     {
@@ -32,7 +33,9 @@ export const routes = [
         component: NotFound,
     },{
         path: "/access-denied",
-        component: AccessDenied
+        component: AccessDenied,
+        name: 'Access Denied',
+        title: 'Access Denied'
     },{
         path: "/dashboard",
         component: Dashboard,
@@ -42,27 +45,29 @@ export const routes = [
         path: "/schedulingunit",
         component: Scheduling,
         name: 'Scheduling Unit',
-        title: 'Scheduling Unit - List'
+        title: 'Scheduling Unit - List',
     },{
         path: "/schedulingunit/create",
         component: SchedulingUnitCreate,
         name: 'Scheduling Unit Add',
-        title: 'Scheduling Unit - Add'
+        title: 'Scheduling Unit - Add',
+        permissions: ['scheduleunit', 'create']
     },{
         path: "/task",
         component: TaskList,
         name: 'Task',
-        title: 'Task-List'
+        title: 'Task-List',
+        permissions: ['task', 'list']
     },{
         path: "/task/view",
         component: TaskView,
         name: 'Task',
-        title: 'Task View'
+        title: 'Task View',
     },{
         path: "/task/view/:type/:id",
         component: TaskView,
         name: 'Task View',
-        title: 'Task - View'
+        title: 'Task - View',
     },{
         path: "/task/edit",
         component: TaskEdit,
@@ -72,7 +77,8 @@ export const routes = [
         path: "/task/edit/draft/:id",
         component: TaskEdit,
         name: 'Task Edit',
-        title: 'Task-Edit'
+        title: 'Task-Edit',
+
     },{
         path: "/schedulingunit/view",
         component: ViewSchedulingUnit,
@@ -82,64 +88,76 @@ export const routes = [
         path: "/schedulingunit/edit/:id",
         component: EditSchedulingUnit,
         name: 'Scheduling Edit',
-        title: 'Scheduling Unit - Edit'
+        title: 'Scheduling Unit - Edit',
+        // permissions: ['scheduleunit', 'edit']
     },{
         path: "/schedulingunit/view/:type/:id",
         component: ViewSchedulingUnit,
-        name: 'Scheduling View'
+        name: 'Scheduling View',
+        // permissions: ['scheduleunit', 'list']
     },{
         path: "/project",
         component: ProjectList,
         name: 'Project List',
-        title: 'Project - List'
+        title: 'Project - List',
+        permissions: ['project', 'list']
+
     },{
         path: "/project/create",
         component: ProjectCreate,
         name: 'Project Add',
-        title: 'Project - Add'
+        title: 'Project - Add',
+        permissions: ['project', 'create']
     },{
         path: "/project/view/:id",
         component: ProjectView,
         name: 'Project View',
-        title: 'Project - Details '
+        title: 'Project - Details ',
+
     },
     {
         path: "/project/edit/:id",
         component: ProjectEdit,
         name: 'Project Edit',
-        title: 'Project Edit'
+        title: 'Project Edit',
     },{
         path: "/project/:project/schedulingunit/create",
         component: SchedulingUnitCreate,
         name: 'Scheduling Unit Add',
-        title: 'Scheduling Unit - Add'
+        title: 'Scheduling Unit - Add',
+        permissions: ['scheduleunit', 'create']
     },
     {
         path: "/project/:project/schedulingset/schedulingunit/create",
         component: SchedulingSetCreate,
-        name: 'Scheduling Set Add'
+        name: 'Scheduling Set Add',
+        permissions: ['scheduleunit', 'excelview']
     },
     {
         path: "/cycle/edit/:id",
         component: CycleEdit,
         name: 'Cycle Edit',
-        title:'Cycle-Edit'
+        title:'Cycle-Edit',
+        permissions: ['cycle', 'edit']
     },{
         path: "/cycle/view/:id",
         component: CycleView,
         name: 'Cycle View',
-        title:'Cycle-View'
+        title:'Cycle-View',
+        permissions: ['cycle', 'list']
     }, {
         path: "/cycle/create",
         component: CycleCreate,
         name: 'Cycle Add',
-        title:'Cycle-Add'
+        title:'Cycle-Add',
+        permissions: ['cycle', 'create']
     },
     {
         path: "/cycle",
         component: CycleList,
         name: 'Cycle List',
-        title:'Cycle-List'
+        title:'Cycle-List',
+        permissions: ['cycle', 'list']
     },
     {
         path: "/su/timelineview",
@@ -161,7 +179,8 @@ export const routes = [
     {
         path: "/schedulingset/schedulingunit/create",
         component: SchedulingSetCreate,
-        name: 'Scheduling Set Add'
+        name: 'Scheduling Set Add',
+        permissions: ['scheduleunit', 'excelview']
     },
     {
        path: "/schedulingunit/:id/workflow",
@@ -173,25 +192,29 @@ export const routes = [
         path: "/reservation/list",
         component: ReservationList,
         name: 'Reservation List',
-        title:'Reservation List'
+        title:'Reservation List',
+        permissions: ['reservation', 'list']
     },
     {
         path: "/reservation/create",
         component: ReservationCreate,
         name: 'Reservation Add',
-        title: 'Reservation - Add'
+        title: 'Reservation - Add',
+        permissions: ['reservation', 'create']
     },
     {
         path: "/reservation/view/:id",
         component: ReservationView,
         name: 'Reservation View',
-        title: 'Reservation - View'
+        title: 'Reservation - View',
+        permissions: ['reservation', 'list']
     },
     {
         path: "/reservation/edit/:id",
         component: ReservationEdit,
         name: 'Reservation Edit',
-        title: 'Reservation - Edit'
+        title: 'Reservation - Edit',
+        permissions: ['reservation', 'edit']
     },
     {
         path: "/find/object/:type/:id",
@@ -225,7 +248,7 @@ export const RoutedContent = () => {
         <Growl ref={(el) => setAppGrowl(el)} />
 	    <Switch>
             {/* <Redirect from="/" to="/" exact /> */}
-            {routes.map(routeProps => <Route {...routeProps} exact key={routeProps.path} />)}
+            {routes.map(routeProps => <ProtectedRoute {...routeProps} exact key={routeProps.path} />)}
         </Switch>
         </>
     );
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/services/project.service.js b/SAS/TMSS/frontend/tmss_webapp/src/services/project.service.js
index 5613c91deba01e0375f622e7e16700d872c9a494..dc39649c70af543104eac4021e8e76d7d49eaa61 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/services/project.service.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/services/project.service.js
@@ -50,6 +50,7 @@ const ProjectService = {
             return response.data.results;
           } catch (error) {
             console.error(error);
+            return [];
           }
     },
     getDefaultProjectResources: async function() {
@@ -199,8 +200,8 @@ const ProjectService = {
               for(const  id of project.quota_ids){
                 await ProjectService.getProjectQuota(id).then(async quota =>{
                     const resourceType = _.find(results.resourcetypes, ["name", quota.resource_type_id]);
-                    project[quota.resource_type_id] = UnitConverter.getUIResourceUnit(resourceType.quantity_value, quota.value);
-                  })
+                    project[quota.resource_type_id] = resourceType?UnitConverter.getUIResourceUnit(resourceType.quantity_value, quota.value):quota.value;
+                });
               }
               projects.map((pro,index) => {
                 if(pro.name === project.name){
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/services/report.service.js b/SAS/TMSS/frontend/tmss_webapp/src/services/report.service.js
index c254a0a24232b3450ad7f710f31c2f964ff3a405..81185d3cc482a01f9d3b9b59d77af0b63d080e76 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/services/report.service.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/services/report.service.js
@@ -8,6 +8,72 @@ const ReportService = {
         try {
             const response = await axios.get(`/api/project/${project}/report/`);
             reportData = response.data;
+            // TODO: TEST DATA to be removed
+            /*reportData = {
+              "project": "test_for_report", 
+              "quota": [
+                  {
+                      "id": 4,
+                      "resource_type_id": "CEP Processing Time",
+                      "value": 7200
+                  },
+                  {
+                    "id": 5,
+                    "resource_type_id": "LOFAR Observing Time",
+                    "value": 7200
+                  },
+                  {
+                    "id": 6,
+                    "resource_type_id": "LTA Storage",
+                    "value": 64*1024*1024*1024
+                  }
+              ],
+              "SUBs": {
+                  "successful": [
+                      {
+                          "id": 1,
+                          "name": "my_scheduling_unit_blueprint_30a70066-c09b-48f1-8061-c7e20017af9d",
+                          "status": "finished",
+                          "start": "2021-07-29T14:15:44.330405",
+                          "stop": "2021-07-29T14:25:44.330407",
+                          "duration": 600.000002, 
+                          "observed_duration": 600.000002,
+                          "target": null,
+                          "SAS ID": {
+                              "observation control": [2000014, 200010],
+                              "preprocessing pipeline": [],
+                              "pulsar pipeline": [200023]
+                          },
+                          "ingested_date": "2021-07-29T14:25:44.330407",
+                          "ingested_data_size": 246
+                      }
+                  ],
+                  "failed": []
+              },
+              "durations": {
+                  "total": 2400.000011,
+                  "total_not_cancelled": 1800.000008,
+                  "total_succeeded": 600.000002,
+                  "total_failed": 600.000003,
+                  "total_observed": 1200.0000049999999,
+                  "total_observed_succeeded": 600.000002,
+                  "total_observed_failed": 600.000003,
+                  "total_succeeded_A": 600.000002,
+                  "total_observed_succeeded_A": 600.000002,
+                  "total_succeeded_B": 0,
+                  "total_observed_succeeded_B": 0,
+                  "not_cancelled_perc": 0.75,
+                  "succeeded_perc": 0.25,
+                  "failed_perc": 0.25,
+                  "observed_perc": 0.50,
+                  "observed_succeeded_perc": 0.25,
+                  "observed_failed_perc": 0.25},
+              "LTA dataproducts": {"size__sum": 246},
+              "SAPs exposure": {
+                  "target1": 7200.0,
+                  "target2": 3200.0
+              }
+          }*/
         }   catch(error) {
             console.error(error);
             reportData.error = error;
@@ -26,7 +92,6 @@ const ReportService = {
     getCyclesReport: async(cycleList) => {
       try {
         const response = await axios.get(`/api/util/cycles_report/?cycles=${cycleList.join(',')}`);
-        // return response.data;
         const testData = {
           "Cycle 12": {
             "cycle": "Cycle 12",
@@ -99,10 +164,12 @@ const ReportService = {
               "prognosis": 960
             },
             "observation_hours_per_category": {
+              "DDT Com rep": 80,
+              "System unavailability":null,
               "total_duration_failed": 100,
               "total_duration_idle": 200,
-              "total_duration_A": 500,
-              "total_duration_B": 300
+              "total_duration_successful_A": 500,
+              "total_duration_successful_B": 300
             },
             "weekly_efficiency": {
               "weeks": [
@@ -214,16 +281,16 @@ const ReportService = {
             },
             "data_ingested_per_site_and_category": {
               "Interferometric Observation": {
-                "dataproducts": [1,2,3,4,6,7,8,8]
+                "size__sum": 140
               },
               "Beamformed Observation": {
-                "dataproducts": [2,3,4]
+                "size__sum": 150
               },
               "Preprocessing Pipeline": {
-                "dataproducts": [1,2,3,4,5,6,7,10,12,13,45]
+                "size__sum": 160
               },
               "Pulsar Pipeline": {
-                "dataproducts": [1,1,1,1,1,2]
+                "size__sum": 170
               }
             },
             "projects_summary": [
@@ -242,8 +309,9 @@ const ReportService = {
                 },
                 "durations": {
                   "total": 12720,
+                  "total_observevd": 200,
                   "total_succeeded": 0,
-                  "total_not_cancelled": 12720,
+                  "total_not_cancelled": 12520,
                   "total_failed": 0
                 },
                 "LTA dataproducts": {
@@ -333,7 +401,7 @@ const ReportService = {
                 "idle/test": 150
               }
             },
-            "failures": [{month: "2020-03-01", duration: 1200}, {month: "2020-04-01", duration: 1300}]
+            "failures": {months: [{month: "2020-03-01", total_failed: 1200}, {month: "2020-04-01", total_failed: 1300}]}
           },
           "Cycle 13": {
             "cycle": "Cycle 13",
@@ -406,10 +474,12 @@ const ReportService = {
               "prognosis": 95
             },
             "observation_hours_per_category": {
+              "DDT Com rep": 40,
+              "System unavailability":null,
               "total_duration_failed": 10,
               "total_duration_idle": 20,
-              "total_duration_A": 100,
-              "total_duration_B": 50
+              "total_duration_successful_A": 100,
+              "total_duration_successful_B": 50
             },
             "weekly_efficiency": {
               "weeks": [
@@ -521,16 +591,16 @@ const ReportService = {
             },
             "data_ingested_per_site_and_category": {
               "Interferometric Observation": {
-                "dataproducts": [1,2,3,4]
+                "size__sum": 140
               },
               "Beamformed Observation": {
-                "dataproducts": [2,3,4]
+                "size__sum": 150
               },
               "Preprocessing Pipeline": {
-                "dataproducts": [1,2,3,4,5,6,7]
+                "size__sum": 160
               },
               "Pulsar Pipeline": {
-                "dataproducts": [1,1,1,1]
+                "size__sum": 170
               }
             },
             "projects_summary": [
@@ -549,8 +619,9 @@ const ReportService = {
                 },
                 "durations": {
                   "total": 12720,
+                  "total_observed": 700,
                   "total_succeeded": 0,
-                  "total_not_cancelled": 12720,
+                  "total_not_cancelled": 12020,
                   "total_failed": 0
                 },
                 "LTA dataproducts": {
@@ -640,7 +711,7 @@ const ReportService = {
                 "idle/test": 143
               }
             },
-            "failures": []
+            "failures": {months: []}
           },
           "Cycle 14": {
             "cycle": "Cycle 14",
@@ -713,10 +784,12 @@ const ReportService = {
               "prognosis": 95
             },
             "observation_hours_per_category": {
+              "DDT Com rep": 60,
+              "System unavailability":null,
               "total_duration_failed": 10,
               "total_duration_idle": 20,
-              "total_duration_A": 100,
-              "total_duration_B": 50
+              "total_duration_successful_A": 100,
+              "total_duration_successful_B": 50
             },
           "weekly_efficiency": {
               "weeks": [
@@ -828,16 +901,16 @@ const ReportService = {
             },
             "data_ingested_per_site_and_category": {
               "Interferometric Observation": {
-                "dataproducts": [1,3,4]
+                "size__sum": 140
               },
               "Beamformed Observation": {
-                "dataproducts": [2,2,3,4]
+                "size__sum": 150
               },
               "Preprocessing Pipeline": {
-                "dataproducts": [1,4,5,6,7]
+                "size__sum": 160
               },
               "Pulsar Pipeline": {
-                "dataproducts": [1,1]
+                "size__sum": 170
               }
             },
             "projects_summary": [
@@ -856,8 +929,9 @@ const ReportService = {
                 },
                 "durations": {
                   "total": 12720,
+                  "total_observed": 10000,
                   "total_succeeded": 0,
-                  "total_not_cancelled": 12720,
+                  "total_not_cancelled": 2720,
                   "total_failed": 0
                 },
                 "LTA dataproducts": {
@@ -947,7 +1021,7 @@ const ReportService = {
                 "idle/test": 955
               }
             },
-            "failures": [{month: "2020-03-01", duration: 1200}, {month: "2020-04-01", duration: 1300}]
+            "failures": {months:[{month: "2020-03-01", total_failed: 1200}, {month: "2020-04-01", total_failed: 1300}]}
           },
           "Cycle 15": {
             "cycle": "Cycle 15",
@@ -1020,10 +1094,12 @@ const ReportService = {
               "prognosis": 95
             },
             "observation_hours_per_category": {
+              "DDT Com rep": 60,
+              "System unavailability":null,
               "total_duration_failed": 10,
               "total_duration_idle": 20,
-              "total_duration_A": 100,
-              "total_duration_B": 50
+              "total_duration_successful_A": 100,
+              "total_duration_successful_B": 50
             },
             "weekly_efficiency": {
               "weeks": [
@@ -1135,16 +1211,16 @@ const ReportService = {
             },
             "data_ingested_per_site_and_category": {
               "Interferometric Observation": {
-                "dataproducts": [1,2,3,4,5]
+                "size__sum": 140
               },
               "Beamformed Observation": {
-                "dataproducts": [2,3,4,6,7]
+                "size__sum": 150
               },
               "Preprocessing Pipeline": {
-                "dataproducts": [1,2,3]
+                "size__sum": 160
               },
               "Pulsar Pipeline": {
-                "dataproducts": [1,1,1,1,2,3,1]
+                "size__sum": 170
               }
             },
             "projects_summary": [
@@ -1163,6 +1239,7 @@ const ReportService = {
                 },
                 "durations": {
                   "total": 12720,
+                  "total_observed": 0,
                   "total_succeeded": 0,
                   "total_not_cancelled": 12720,
                   "total_failed": 0
@@ -1254,11 +1331,12 @@ const ReportService = {
                 "idle/test": 980
               }
             },
-            "failures": [{month: "2020-06-01", duration: 1200}, {month: "2020-07-01", duration: 1300}]
-          }
+            "failures": {months: [{month: "2020-06-01", total_failed: 1200}, {month: "2020-07-01", total_failed: 1300}]}
+          },
+          "Cycle 16": {"cycle": "Cycle 16", "telescope_time_distribution": {"UNASSIGNED": {"durations": {"total": 720.0, "succeeded": 720.0, "succeeded_perc": 1.0, "failed": 0, "failed_perc": 0.0, "idle": 0.0, "idle_perc": 0.0}}, "FILLER": {"durations": {"total": 0, "succeeded": 0, "succeeded_perc": null, "failed": 0, "failed_perc": null, "idle": 0, "idle_perc": null}}, "REGULAR": {"durations": {"total": 0, "succeeded": 0, "succeeded_perc": null, "failed": 0, "failed_perc": null, "idle": 0, "idle_perc": null}}, "USER_SHARED_SUPPORT": {"durations": {"total": 0, "succeeded": 0, "succeeded_perc": null, "failed": 0, "failed_perc": null, "idle": 0, "idle_perc": null}}, "COMMISSIONING": {"durations": {"total": 0, "succeeded": 0, "succeeded_perc": null, "failed": 0, "failed_perc": null, "idle": 0, "idle_perc": null}}, "DDT": {"durations": {"total": 0, "succeeded": 0, "succeeded_perc": null, "failed": 0, "failed_perc": null, "idle": 0, "idle_perc": null}}, "TEST": {"durations": {"total": 0, "succeeded": 0, "succeeded_perc": null, "failed": 0, "failed_perc": null, "idle": 0, "idle_perc": null}}}, "average_efficiency": {"target": 0.65, "efficiency": 0.01}, "completion_level": {"target": 0.0, "total": 720.0, "succeeded": 720.0, "succeeded_perc": 1.0, "prognosis": 0.0}, "observation_hours_per_category": {"total_duration": 720.0, "total_duration_successful": 720.0, "total_duration_failed": 0, "total_duration_idle": 0.0, "DDT Com Rep": 0, "System Unavailability": null, "total_duration_successful_A": 720.0, "successful_A_perc": 1.0, "total_duration_successful_B": 0, "successful_B_perc": 0.0, "successful_perc": 1.0, "idle_perc": 0.0, "failed_perc": 0.0, "ddt_com_rep_perc": 0.0, "system_unavailability_perc": null}, "weekly_efficiency": {"weeks": [{"week": "2021-06-01", "efficiency": null}, {"week": "2021-06-08", "efficiency": null}, {"week": "2021-06-15", "efficiency": null}, {"week": "2021-06-22", "efficiency": null}, {"week": "2021-06-29", "efficiency": null}, {"week": "2021-07-06", "efficiency": null}, {"week": "2021-07-13", "efficiency": null}, {"week": "2021-07-20", "efficiency": null}, {"week": "2021-07-27", "efficiency": null}, {"week": "2021-08-03", "efficiency": null}, {"week": "2021-08-10", "efficiency": null}, {"week": "2021-08-17", "efficiency": 1.0}, {"week": "2021-08-24", "efficiency": null}, {"week": "2021-08-31", "efficiency": null}, {"week": "2021-09-07", "efficiency": null}, {"week": "2021-09-14", "efficiency": null}, {"week": "2021-09-21", "efficiency": null}, {"week": "2021-09-28", "efficiency": null}, {"week": "2021-10-05", "efficiency": null}, {"week": "2021-10-12", "efficiency": null}, {"week": "2021-10-19", "efficiency": null}, {"week": "2021-10-26", "efficiency": null}, {"week": "2021-11-02", "efficiency": null}, {"week": "2021-11-09", "efficiency": null}, {"week": "2021-11-16", "efficiency": null}, {"week": "2021-11-23", "efficiency": null}]}, "data_ingested_per_site_and_category": {"Interferometric Observation": {"size__sum": 0}, "Beamformed Observation": {"size__sum": null}, "Preprocessing Pipeline": {"size__sum": null}, "Pulsar Pipeline": {"size__sum": null}}, "projects_summary": [{"project": "normal", "quota": [{"id": 2, "resource_type_id": "LTA Storage", "value": 1000000000000.0}], "SUBs": {"successful": [], "failed": []}, "durations": {"total": 2160.0, "total_not_cancelled": 2160.0, "total_succeeded": 0, "total_failed": 0, "total_observed": 0, "total_observed_succeeded": 0, "total_observed_failed": 0, "total_succeeded_A": 0, "total_observed_succeeded_A": 0, "total_succeeded_B": 0, "total_observed_succeeded_B": 0, "not_cancelled_perc": 1.0, "succeeded_perc": 0.0, "failed_perc": 0.0, "observed_perc": 0.0, "observed_succeeded_perc": 0.0, "observed_failed_perc": 0.0}, "LTA dataproducts": {"size__sum": null}, "SAPs exposure": {"Polaris": 120.0}}, {"project": "low", "quota": [{"id": 3, "resource_type_id": "LTA Storage", "value": 1000000000000.0}], "SUBs": {"successful": [], "failed": []}, "durations": {"total": 87720.0, "total_not_cancelled": 87720.0, "total_succeeded": 0, "total_failed": 0, "total_observed": 0, "total_observed_succeeded": 0, "total_observed_failed": 0, "total_succeeded_A": 0, "total_observed_succeeded_A": 0, "total_succeeded_B": 0, "total_observed_succeeded_B": 0, "not_cancelled_perc": 1.0, "succeeded_perc": 0.0, "failed_perc": 0.0, "observed_perc": 0.0, "observed_succeeded_perc": 0.0, "observed_failed_perc": 0.0}, "LTA dataproducts": {"size__sum": null}, "SAPs exposure": {"target1": 28800.0, "target2": 28800.0}}, {"project": "high", "quota": [{"id": 1, "resource_type_id": "LTA Storage", "value": 1099511627776.0}, {"id": 4, "resource_type_id": "LOFAR Observing Time", "value": 72000.0}, {"id": 5, "resource_type_id": "CEP Processing Time", "value": 72000.0}], "SUBs": {"successful": [{"id": 1, "name": "Obs high 1", "status": "finished", "start": "2021-08-18T21:35:22", "stop": "2021-08-18T21:47:22", "duration": 720.0, "observed_duration": 720.0, "target": "Observation", "SAS ID": {"observation control": [2000000], "preprocessing pipeline": [2000003], "pulsar pipeline": []}, "ingested_date": null, "ingested_data_size": null}], "failed": []}, "durations": {"total": 12720.0, "total_not_cancelled": 12720.0, "total_succeeded": 720.0, "total_failed": 0, "total_observed": 720.0, "total_observed_succeeded": 720.0, "total_observed_failed": 0, "total_succeeded_A": 720.0, "total_observed_succeeded_A": 720.0, "total_succeeded_B": 0, "total_observed_succeeded_B": 0, "not_cancelled_perc": 1.0, "succeeded_perc": 0.06, "failed_perc": 0.0, "observed_perc": 0.06, "observed_succeeded_perc": 0.06, "observed_failed_perc": 0.0}, "LTA dataproducts": {"size__sum": null}, "SAPs exposure": {"target1": 7200.0, "target2": 7200.0, "B0329+54": 120.0, "Polaris": 120.0}}], "usage_mode": {"all modes": {"total": null, "observing": null, "idle/test": null}, "stand-alone mode": {"total": null, "no project": null, "project": null, "mixed/no project": null}, "ILT mode": {"total": null, "observing": null, "idle/test": null}}, "failures": {"months": [{"month": "2021-06-01", "total": 0, "total_failed": 0, "failed_perc": null}, {"month": "2021-07-01", "total": 0, "total_failed": 0, "failed_perc": null}, {"month": "2021-08-01", "total": 720.0, "total_failed": 0, "failed_perc": 0.0}, {"month": "2021-09-01", "total": 0, "total_failed": 0, "failed_perc": null}, {"month": "2021-10-01", "total": 0, "total_failed": 0, "failed_perc": null}, {"month": "2021-11-01", "total": 0, "total_failed": 0, "failed_perc": null}]}}
         }
-        
-        return _.filter(testData, data => { return cycleList.indexOf(data.cycle)>=0 }) ;
+        return response.data;
+        // return _.filter(testData, data => { return cycleList.indexOf(data.cycle)>=0 }) ;
       } catch(error) {
         console.error(error);
         return null;
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/services/schedule.service.js b/SAS/TMSS/frontend/tmss_webapp/src/services/schedule.service.js
index 8a8d9dffdb406617684b998c7e18a78e27241d20..0bfe14f1e6965ccda55973dc287367df2e7c2465 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/services/schedule.service.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/services/schedule.service.js
@@ -115,7 +115,7 @@ const ScheduleService = {
                     // Fetch all blueprints data associated with draft to display the name
                     schedulingUnit.blueprintList = (await this.getBlueprintsByschedulingUnitId(schedulingUnit.id)).data.results;
                 }
-                const schedulingSet = (await axios.get(`/api/scheduling_set/${schedulingUnit.scheduling_set_id}`)).data;
+                const schedulingSet = (await axios.get(`/api/scheduling_set/${schedulingUnit.scheduling_set_id}/?expand=project`)).data;
                 schedulingUnit.scheduling_set_object = schedulingSet;
                 schedulingUnit.scheduling_set = schedulingSet.url;
 
@@ -616,7 +616,7 @@ const ScheduleService = {
     },
     getObservationStrategies: async function () {
         try {
-            const response = await axios.get('/api/scheduling_unit_observing_strategy_template/');
+            const response = await axios.get('/api/scheduling_unit_observing_strategy_template/?ordering=name');
             return response.data.results;
         } catch (error) {
             console.error(error);
@@ -1027,6 +1027,20 @@ const ScheduleService = {
             return null
         }
     },
+    getSUDataproducts: async function (id) {
+        let response = {};
+        try {
+            let url = `/api/scheduling_unit_blueprint/${id}/?expand=task_blueprints,task_blueprints.subtasks,task_blueprints.subtasks.output_dataproducts`+
+                        `&fields=task_blueprints.id,task_blueprints.subtasks.id,task_blueprints.subtasks.output_dataproducts.feedback_doc`;
+            response = await axios.get(url);
+            return response.data;
+            
+        } catch (error) {
+            console.error('[schedule.services.getSUDataproduct]', error);
+            return null;
+        }
+    }
+
 
 }
 
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/services/util.service.js b/SAS/TMSS/frontend/tmss_webapp/src/services/util.service.js
index 57ae894ac8d0fa888b8d57ed31815f2849b92d64..cdb5e1876a588a79ab2ff479f5c93ec5cc0b78aa 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/services/util.service.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/services/util.service.js
@@ -220,6 +220,15 @@ const UtilService = {
       } catch (error) {
         console.error('[UtilService.getPriorityQueueType]',error);
       }
+    },
+    getProjectRoles: async function() {
+        try {
+            const response = await axios.get('/api/project_role/');
+            return response.data.results;
+        } catch (error) {
+            console.error('[UtilService.getProjectRoles]', error);
+            return [];
+        }
     }
 }
 
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/services/workflow.service.js b/SAS/TMSS/frontend/tmss_webapp/src/services/workflow.service.js
index ea8530ca76afd3cb18c5c913a8483e8797efc198..28b9ba276372bb164d44f0df2c829ce99d0b0d6f 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/services/workflow.service.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/services/workflow.service.js
@@ -33,15 +33,40 @@ const WorkflowService = {
         }
         return data;
     },
-    updateAssignTo: async (id, data) => {
+    updateAssignTo: async (id, toUser, data) => {
         try {
-            const response = await axios.post(`/workflow_api/scheduling_unit_flow/qa_scheduling_unit_task/${id}/assign/`, data);
+            const response = await axios.post(`/workflow_api/scheduling_unit_flow/qa_scheduling_unit_task/${id}/assign/?${toUser}`, data);
             return response.data;
         }   catch(error) {
             console.error('[workflow.services.updateAssignTo]',error);
             return null;
         }
     },
+    unAssign: async function(id, data) {
+        try {
+            const response = await axios.post(`/workflow_api/scheduling_unit_flow/qa_scheduling_unit_task/${id}/unassign/`, data);
+            return response.data;
+        }   catch(error) {
+            console.error('[workflow.services.updateAssignTo]',error);
+            return null;
+        }
+    },
+    reAssignTo: async function(id, toUser, data) {
+        try {
+            console.log("Unassigning...");
+            const unAssignStatus = await this.unAssign(id, data);
+            console.log(unAssignStatus);
+            if (unAssignStatus) {
+                const response = this.updateAssignTo(id, toUser, data);
+                return response;
+            }   else {
+                return null;
+            }
+        }   catch(error) {
+            console.error('[workflow.services.updateAssignTo]',error);
+            return null;
+        }
+    },
     updateQA_Perform: async (id, data) => {
         try {
             const response = await axios.post(`/workflow_api/scheduling_unit_flow/qa_scheduling_unit_process/${id}/perform/`, data);
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/shared/timeline.constants.js b/SAS/TMSS/frontend/tmss_webapp/src/shared/timeline.constants.js
index c588cbafccdc976da6fd44d642e68aed61e54738..65d51fe61b2805b6ef729f418282f41f35309a06 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/shared/timeline.constants.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/shared/timeline.constants.js
@@ -3,7 +3,8 @@ import UIConstants from "../utils/ui.constants";
 const TimelineConstants = {
     SU_LIST_DEFAULT_COLUMNS: [{
         status: {
-            name:"Status"
+            name:"Status",
+            filter: "select",
         },
         do_cancel: {
             name:"Cancelled"
@@ -81,7 +82,7 @@ const TimelineConstants = {
     }],
     TASK_LIST_DEFAULT_COLUMNS: [{
         status: {
-            name: "Status"
+            name: "Status", filter: "select"
         },
         do_cancel: {
             name: "Cancelled"
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/utils/auth.util.js b/SAS/TMSS/frontend/tmss_webapp/src/utils/auth.util.js
index c982947e762b9d1cf21e6fb26cd3bd9424277abe..0bd958f5f01cd4904acd65c66386cea26b28e432 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/utils/auth.util.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/utils/auth.util.js
@@ -1,15 +1,30 @@
 import AuthStore from "../authenticate/auth.store";
+import PermissionStackUtil from "../authenticate/permission.stack.handler";
 
 const AuthUtil = {
     getUserRolePermission : async function(module) {
         //await AuthStore.dispatch({ type: module });
         return AuthStore.getState();
     },
-    getUserModulePermission: (module_ => {
+    getUserPermissionByModule: module => {
         const allPermissions = AuthStore.getState();
-        const modulePermissions = allPermissions.userRolePermission[module];
+        let modulePermissions = {}
+        modulePermissions[module] = allPermissions.userRolePermission[module];
         return modulePermissions?modulePermissions:{};
-    })
+    },
+
+    getUserPermissionByModuleId: async (module, id) => {
+        const allPermissions = AuthStore.getState();
+        let modulePermissions ={};
+        modulePermissions = allPermissions.userRolePermission.rolePermission && allPermissions.userRolePermission.rolePermission[module] ? allPermissions.userRolePermission.rolePermission[module]:{};
+        if(modulePermissions[id]) {
+            return modulePermissions;
+        }
+        else {
+            modulePermissions = await PermissionStackUtil.getAccessByModuleAndId(module, id);
+            return modulePermissions;
+        }
+    }
 };
 
 export default AuthUtil;
\ No newline at end of file
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/utils/table.util.js b/SAS/TMSS/frontend/tmss_webapp/src/utils/table.util.js
new file mode 100644
index 0000000000000000000000000000000000000000..aaf33d71cd15f7569d1ae34a527f21ae2471ffdb
--- /dev/null
+++ b/SAS/TMSS/frontend/tmss_webapp/src/utils/table.util.js
@@ -0,0 +1,60 @@
+import { find, findIndex, remove } from 'lodash';
+
+import UtilService from '../services/util.service'
+
+/** Utility to handle table filter in localstorage */
+const TableUtil = {
+    /**
+     * Function to store the filter values applied in a table against each column/header
+     * @param {String} tableName 
+     * @param {String} headerName 
+     * @param {any} updatedValue 
+     */
+    saveFilter: (tableName, headerName, updatedValue) => { 
+        let tableStore =  UtilService.localStore({ type: 'get', key: tableName });
+        if(tableStore && tableStore.length>0) {
+            let columnFilter = {id: headerName, value: updatedValue};
+            let index = findIndex(tableStore, ['id', headerName]);
+            if (index >= 0) {
+                tableStore.splice(index, 1, columnFilter);
+            }   else {
+                tableStore.push(columnFilter);
+            }
+        }   else {
+            tableStore = [{id: headerName, value: updatedValue}]
+        }
+        UtilService.localStore({ type: 'set', key: tableName, value: tableStore });
+    },
+    /**
+     * Get the stored filtered value of the header in the table
+     * @param {String} tableName 
+     * @param {String} headerName 
+     * @returns any
+     */
+    getFilter: (tableName, headerName) => {
+        let tableStore =  UtilService.localStore({ type: 'get', key: tableName });
+        let columnFilter = tableStore?find(tableStore, ['id', headerName]):null;
+        return columnFilter?columnFilter.value:"";
+    },
+    /**
+     * Remove the filter value of the column in the table
+     * @param {String} tableName 
+     * @param {String} columnName 
+     */
+    clearColumnFilter: (tableName, columnName) => {
+        let tableFilters = UtilService.localStore({type: 'get', key: tableName});
+        if (tableFilters) {
+            remove(tableFilters, filter => filter.id === columnName);
+            UtilService.localStore({type: 'set', key: tableName, value: tableFilters});
+        }
+    },
+    /**
+     * Remove all the values stored for the table
+     * @param {String} tableName 
+     */
+    clearTableFilter: (tableName) => {
+        UtilService.localStore({type: 'remove', key: tableName});
+    }
+}
+
+export default TableUtil;  
\ No newline at end of file
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/utils/ui.constants.js b/SAS/TMSS/frontend/tmss_webapp/src/utils/ui.constants.js
index 8768347688b9579a43ec2e6a0f673dc08f0fda60..d89aadf99a448db85546f15d0ffec2b6ec8272b0 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/utils/ui.constants.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/utils/ui.constants.js
@@ -28,6 +28,8 @@ const UIConstants = {
         'NumberFilter':'',
         'PropertyIsoDateTimeFromToRangeFilter':'',
         },
-    SU_STATUS:['cancelled', 'error', 'defining', 'defined', 'schedulable', 'scheduled','started', 'observing', 'observed', 'processing', 'processed', 'ingesting','finished', 'unschedulable']   
+    SU_STATUS:['cancelled', 'error', 'defining', 'defined', 'schedulable', 'scheduled','started', 'observing', 'observed', 'processing', 'processed', 'ingesting','finished', 'unschedulable'],
+    CURRENT_WORKFLOW_STAGE:['Waiting To Be Scheduled','Scheduled','QA Reporting (TO)', 'QA Reporting (SDCO)', 'PI Verification', 'Decide Acceptance','Ingesting','Unpin Data','Done'],
+    SU_PRIORITY_QUEUE:['A','B'],
 }
 export default UIConstants;
\ No newline at end of file
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/utils/unit.converter.js b/SAS/TMSS/frontend/tmss_webapp/src/utils/unit.converter.js
index 1f135a9fd6fd152fab1765bb0909f1886c72a260..a5f59b0b9d6fec5aaeb89b36e1addaccb6b27205 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/utils/unit.converter.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/utils/unit.converter.js
@@ -236,7 +236,34 @@ const UnitConverter = {
             radian = this.convertToRadians((degreeHour * 15 + minute / 4 + second / 240));
         }
         return radian;
-    }
+    },
+    getStatusList(suFilters) {
+        let statusList = [];
+        if (suFilters.data.filters['status']) {
+            suFilters.data.filters['status'].choices.forEach(choice => {
+                statusList.push(choice.value);
+            });
+        }
+        return statusList;
+    },
+    /**
+      * Convert the string input for subband list to Array
+      * @param {String} prpOutput 
+      */
+     getSubbandOutput(prpOutput) {
+         const subbandArray = prpOutput ? prpOutput.split(",") : [];
+         let subbandList = [];
+         for (const subband of subbandArray) {
+             const subbandRange = subband.split('..');
+             if (subbandRange.length > 1) {
+                 subbandList = subbandList.concat(_.range(subbandRange[0], (parseInt(subbandRange[1]) + 1)));
+             } else if (subbandRange[0] !== ''){
+                 subbandList = subbandList.concat(parseInt(subbandRange[0]));
+             }
+         }
+         prpOutput = subbandList;
+         return prpOutput;
+     }
 };
 
 export default UnitConverter;
\ No newline at end of file
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/utils/validator.js b/SAS/TMSS/frontend/tmss_webapp/src/utils/validator.js
index 050639115a1bea70a502e340482f360f27134b48..4198a7ea71537b9719213bb0e75a5111c1043ea5 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/utils/validator.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/utils/validator.js
@@ -46,6 +46,28 @@ const Validator = {
             }
         }
         return isModified;
+    },
+    /**
+     * Validate time
+     * @param {string value with HH:mm:ss format} time 
+     * @returns 
+     */
+    isValidHHmmss(time, excludeHour) {
+        let isValid = true;
+        if (time && time.includes(':')) {
+            time = time.replaceAll("_", "0");
+            if(excludeHour) {
+                var timeFormat = /^([0-9]|[0-9][0-9]):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])$/;
+                isValid = timeFormat.test(time);
+            }   else {
+                var timeFormat = /^([0-9]|[0-2][0-3]):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])$/;
+                isValid = timeFormat.test(time);
+            }
+            
+        }   else {
+            isValid = false;
+        }
+        return isValid;
     }
 };
 
diff --git a/SubSystems/Online_Cobalt/test/Correlator/CMakeLists.txt b/SubSystems/Online_Cobalt/test/Correlator/CMakeLists.txt
index f80f6f44e12bd99db8e32c8900c34a85fdd1e77c..db86ee52b7d341006a73451a8e6b22a0852032a8 100644
--- a/SubSystems/Online_Cobalt/test/Correlator/CMakeLists.txt
+++ b/SubSystems/Online_Cobalt/test/Correlator/CMakeLists.txt
@@ -4,6 +4,7 @@ include(LofarCTest)
 
 set(_tests
   tCorrelate_1sec_1st_5sb_noflagging
+  tCorrelate_1sec_1st_5sb_2saps_noflagging
   tCorrelate_3sec_1st_5sb
   tCorrelate_3sec_2st_5sb
   tCorrelate_3sec_2st_5sb_doppler
diff --git a/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.output/SB0.cfloat.raw b/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.output/SB0.cfloat.raw
new file mode 100644
index 0000000000000000000000000000000000000000..db6bd410af7a241c3a4f0f1eb1e1f2c05e65226f
Binary files /dev/null and b/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.output/SB0.cfloat.raw differ
diff --git a/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.output/SB1.cfloat.raw b/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.output/SB1.cfloat.raw
new file mode 100644
index 0000000000000000000000000000000000000000..c714e44f37fb3f32bf5fd1ded98f9f3af8ed2e32
Binary files /dev/null and b/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.output/SB1.cfloat.raw differ
diff --git a/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.output/SB2.cfloat.raw b/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.output/SB2.cfloat.raw
new file mode 100644
index 0000000000000000000000000000000000000000..8f4e2debc8a9367808dfb047498d48d046a7583e
Binary files /dev/null and b/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.output/SB2.cfloat.raw differ
diff --git a/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.output/SB3.cfloat.raw b/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.output/SB3.cfloat.raw
new file mode 100644
index 0000000000000000000000000000000000000000..0b7047ba5d5f622a8d4a2cb3ebc166ce5846719c
Binary files /dev/null and b/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.output/SB3.cfloat.raw differ
diff --git a/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.output/SB4.cfloat.raw b/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.output/SB4.cfloat.raw
new file mode 100644
index 0000000000000000000000000000000000000000..5d2522eed286551c29613fc37ffde1082876edc9
Binary files /dev/null and b/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.output/SB4.cfloat.raw differ
diff --git a/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.output/queues/mac.task.feedback.state b/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.output/queues/mac.task.feedback.state
new file mode 100644
index 0000000000000000000000000000000000000000..086a26cf2ed792a3dbc086fbcb5e7e4628572f82
--- /dev/null
+++ b/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.output/queues/mac.task.feedback.state
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<message>
+   <header>
+      <system>LOFAR</system>
+      <version>1.0.0</version>
+      <protocol>
+         <name>task.feedback.state</name>
+         <version>1.0.0</version>
+      </protocol>
+      <source>
+         <name>Cobalt/GPUProc/send_state</name>
+         <user></user>
+         <uuid>0d53dcf4-80b0-4a13-9bf5-8695650957fa</uuid>
+         <timestamp>2015-06-25T09:30:24</timestamp>
+         <summary>State feedback</summary>
+      </source>
+      <ids>
+         <momid>-1</momid>
+         <sasid>76966</sasid>
+      </ids>
+   </header>
+   <payload><task>
+  <type>observation</type>
+  <state>finished</state>
+</task></payload>
+</message>
+
diff --git a/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.output/queues/otdb.task.feedback.processing b/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.output/queues/otdb.task.feedback.processing
new file mode 100644
index 0000000000000000000000000000000000000000..bdd31462a7943569a596b683ec1695d65b32df0d
--- /dev/null
+++ b/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.output/queues/otdb.task.feedback.processing
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<message>
+   <header>
+      <system>LOFAR</system>
+      <version>1.0.0</version>
+      <protocol>
+         <name>task.feedback.processing</name>
+         <version>1.0.0</version>
+      </protocol>
+      <source>
+         <name>Cobalt/GPUProc/rtcp</name>
+         <user></user>
+         <uuid>75fbde01-0ce0-4abd-b45c-72d1aec44c42</uuid>
+         <timestamp>2015-06-25T09:30:21</timestamp>
+         <summary>Processing feedback</summary>
+      </source>
+      <ids>
+         <momid>0</momid>
+         <sasid>76966</sasid>
+      </ids>
+   </header>
+   <payload>Observation.Correlator.channelWidth=12207.03125
+Observation.Correlator.channelsPerSubband=16
+Observation.Correlator.integrationInterval=0.25165824
+Observation.DataProducts.nrOfOutput_Beamformed_=0
+Observation.DataProducts.nrOfOutput_Correlated_=5
+_isCobalt=T
+feedback_version=03.01.00
+</payload>
+</message>
+
diff --git a/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.parset b/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.parset
new file mode 100644
index 0000000000000000000000000000000000000000..d66027e4e25c97ceb75e3e2d94c484bd7b6d3e09
--- /dev/null
+++ b/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.parset
@@ -0,0 +1,4915 @@
+Cobalt.blockSize = 49152
+Cobalt.BeamFormer.CoherentStokes.nrChannelsPerSubband = 16
+Cobalt.BeamFormer.CoherentStokes.subbandsPerFile = 512
+Cobalt.BeamFormer.CoherentStokes.timeIntegrationFactor = 16
+Cobalt.BeamFormer.CoherentStokes.which = I
+Cobalt.BeamFormer.IncoherentStokes.nrChannelsPerSubband = 16
+Cobalt.BeamFormer.IncoherentStokes.subbandsPerFile = 512
+Cobalt.BeamFormer.IncoherentStokes.timeIntegrationFactor = 16
+Cobalt.BeamFormer.IncoherentStokes.which = I
+Cobalt.Correlator.nrBlocksPerIntegration = 1
+Cobalt.BeamFormer.flysEye = false
+Cobalt.BeamFormer.coherentDedisperseChannels = false
+Cobalt.correctBandPass = true
+Cobalt.correctClocks = T
+Cobalt.delayCompensation = true
+OLAP.dispersionMeasure = 0
+Observation.nrBitsPerSample = 8
+OLAP.nrPsets = 64
+Cobalt.realTime = false
+Observation.AnaBeam[0].angle1 = 2.15374
+Observation.AnaBeam[0].angle2 = 0.841549
+Observation.AnaBeam[0].directionType = J2000
+Observation.AnaBeam[0].duration = 300
+Observation.AnaBeam[0].maximizeDuration = false
+Observation.AnaBeam[0].rank = 1
+Observation.AnaBeam[0].startTime = 0
+Observation.AnaBeam[0].target = 
+Observation.Beam[0].angle1 = 2.15374
+Observation.Beam[0].angle2 = 0.841549
+Observation.Beam[0].beamletList = []
+Observation.Beam[0].directionType = J2000
+Observation.Beam[0].duration = 300
+Observation.Beam[0].maximizeDuration = false
+Observation.Beam[0].momID = 0
+Observation.Beam[0].nrTabRings = 0
+Observation.Beam[0].nrTiedArrayBeams = 0
+Observation.Beam[0].startTime = 0
+Observation.Beam[0].subbandList = [24,25,26]
+Observation.Beam[0].tabRingSize = 0
+Observation.Beam[0].target = 3c196
+Observation.Beam[1].angle1 = 2.15374
+Observation.Beam[1].angle2 = 0.841549
+Observation.Beam[1].beamletList = []
+Observation.Beam[1].directionType = J2000
+Observation.Beam[1].duration = 300
+Observation.Beam[1].maximizeDuration = false
+Observation.Beam[1].momID = 0
+Observation.Beam[1].nrTabRings = 0
+Observation.Beam[1].nrTiedArrayBeams = 0
+Observation.Beam[1].startTime = 0
+Observation.Beam[1].subbandList = [27,28]
+Observation.Beam[1].tabRingSize = 0
+Observation.Beam[1].target = 3c196
+Observation.Beamformer.stationList = []
+Observation.Campaign.CO_I = 
+Observation.Campaign.PI = 'Hessels, Dr. Jason'
+Observation.Campaign.contact = 'Hessels, Dr. Jason'
+Observation.Campaign.name = Pulsars2
+Observation.Campaign.title = Pulsars2
+Observation.DataProducts.Output_CoherentStokes.enabled = false
+Observation.DataProducts.Output_CoherentStokes.filenames = []
+Observation.DataProducts.Output_CoherentStokes.locations = []
+Observation.DataProducts.Output_Correlated.enabled = true
+Observation.DataProducts.Output_Correlated.filenames = [SB0.cfloat.raw,SB1.cfloat.raw,SB2.cfloat.raw,SB3.cfloat.raw,SB4.cfloat.raw]
+Observation.DataProducts.Output_Correlated.locations = [5*:.]
+Observation.DataProducts.Output_IncoherentStokes.enabled = false
+Observation.DataProducts.Output_IncoherentStokes.filenames = []
+Observation.DataProducts.Output_IncoherentStokes.locations = []
+Observation.Dataslots.DataslotInfo.DataslotList = []
+Observation.Dataslots.DataslotInfo.RSPBoardList = []
+Observation.Dataslots.RS106HBA.DataslotList = [0..4]
+Observation.Dataslots.RS106HBA.RSPBoardList = [5*0]
+Observation.ObsID = 76966
+Observation.ObserverName = unknown
+Observation.ProjectName = unknown
+Observation.VirtualInstrument.stationList = [RS106]
+Observation.antennaArray = HBA
+Observation.antennaSet = HBA_DUAL
+Observation.bandFilter = HBA_110_190
+Observation.beamList = [5*0]
+Observation.channelWidth = 762.939453125
+Cobalt.Correlator.nrChannelsPerSubband = 16
+Observation.longBaselines = false
+Observation.nrAnaBeams = 1
+Observation.nrBeamformers = 0
+Observation.nrBeams = 2
+Observation.nrPolarisations = 2
+Observation.nrSlotsInFrame = 122
+Observation.referencePhaseCenter = [3826577.066,461022.948,5064892.786]
+Observation.rspBoardList = [5*0]
+Observation.rspSlotList = [5*0]
+Observation.sampleClock = 200
+Observation.samplesPerSecond = 196608
+Observation.startTime = '2012-11-21 12:47:01'
+Observation.stopTime = '2012-11-21 12:47:02'
+PIC.Core.RS106HBA.clockCorrectionTime = 0
+PIC.Core.RS106HBA.phaseCenter = [3829205.598,469142.533,5062181.002]
+PIC.Core.RS106HBA.position = [3829205.598,469142.533,5062181.002]
+PIC.Core.RS106HBA.RSP.sources = [file:/opt/shared/test_sets/3sec/rs106.udp]
+_DPname = LOFAR_ObsSW_TempObs0024
+Cobalt.Kernels.BeamFormerKernel.dumpOutput = false
+Cobalt.Kernels.BeamFormerTransposeKernel.dumpOutput = false
+Cobalt.Kernels.CoherentStokesKernel.dumpOutput = false
+Cobalt.Kernels.CorrelatorKernel.dumpOutput = false
+Cobalt.Kernels.DelayAndBandPassKernel.dumpOutput = false
+Cobalt.Kernels.FIR_FilterKernel.dumpOutput = false
+Cobalt.Kernels.IntToFloatKernel.dumpOutput = false
+PIC.Core.CS001LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS001LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS001LBA.LBA_INNER.LBA_10_70.delay.X  =   4.656295e-06
+PIC.Core.CS001LBA.LBA_INNER.LBA_10_70.delay.Y  =   4.655852e-06
+PIC.Core.CS001LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS001LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS001LBA.LBA_INNER.LBA_30_70.delay.X  =   4.656295e-06
+PIC.Core.CS001LBA.LBA_INNER.LBA_30_70.delay.Y  =   4.655852e-06
+PIC.Core.CS001LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS001LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS001LBA.LBA_INNER.LBA_10_90.delay.X  =   4.656295e-06
+PIC.Core.CS001LBA.LBA_INNER.LBA_10_90.delay.Y  =   4.655852e-06
+PIC.Core.CS001LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS001LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS001LBA.LBA_INNER.LBA_30_90.delay.X  =   4.656295e-06
+PIC.Core.CS001LBA.LBA_INNER.LBA_30_90.delay.Y  =   4.655852e-06
+PIC.Core.CS001LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS001LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS001LBA.LBA_OUTER.LBA_10_70.delay.X  =   4.656295e-06
+PIC.Core.CS001LBA.LBA_OUTER.LBA_10_70.delay.Y  =   4.655852e-06
+PIC.Core.CS001LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS001LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS001LBA.LBA_OUTER.LBA_30_70.delay.X  =   4.656295e-06
+PIC.Core.CS001LBA.LBA_OUTER.LBA_30_70.delay.Y  =   4.655852e-06
+PIC.Core.CS001LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS001LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS001LBA.LBA_OUTER.LBA_10_90.delay.X  =   4.656295e-06
+PIC.Core.CS001LBA.LBA_OUTER.LBA_10_90.delay.Y  =   4.655852e-06
+PIC.Core.CS001LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS001LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS001LBA.LBA_OUTER.LBA_30_90.delay.X  =   4.656295e-06
+PIC.Core.CS001LBA.LBA_OUTER.LBA_30_90.delay.Y  =   4.655852e-06
+PIC.Core.CS001HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS001HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS001HBA0.HBA_ZERO.HBA_110_190.delay.X  =   4.656321e-06
+PIC.Core.CS001HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   4.655847e-06
+PIC.Core.CS001HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS001HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS001HBA0.HBA_ZERO.HBA_170_230.delay.X  =   4.656321e-06
+PIC.Core.CS001HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   4.655847e-06
+PIC.Core.CS001HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS001HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS001HBA0.HBA_ZERO.HBA_210_250.delay.X  =   4.656321e-06
+PIC.Core.CS001HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   4.655847e-06
+PIC.Core.CS001HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS001HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS001HBA0.HBA_DUAL.HBA_110_190.delay.X  =   4.656321e-06
+PIC.Core.CS001HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   4.655847e-06
+PIC.Core.CS001HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS001HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS001HBA0.HBA_DUAL.HBA_170_230.delay.X  =   4.656321e-06
+PIC.Core.CS001HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   4.655847e-06
+PIC.Core.CS001HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS001HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS001HBA0.HBA_DUAL.HBA_210_250.delay.X  =   4.656321e-06
+PIC.Core.CS001HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   4.655847e-06
+PIC.Core.CS001HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS001HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS001HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   4.656321e-06
+PIC.Core.CS001HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   4.655847e-06
+PIC.Core.CS001HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS001HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS001HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   4.656321e-06
+PIC.Core.CS001HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   4.655847e-06
+PIC.Core.CS001HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS001HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS001HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   4.656321e-06
+PIC.Core.CS001HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   4.655847e-06
+PIC.Core.CS001HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS001HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS001HBA1.HBA_ONE.HBA_110_190.delay.X  =   4.656269e-06
+PIC.Core.CS001HBA1.HBA_ONE.HBA_110_190.delay.Y  =   4.655857e-06
+PIC.Core.CS001HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS001HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS001HBA1.HBA_ONE.HBA_170_230.delay.X  =   4.656269e-06
+PIC.Core.CS001HBA1.HBA_ONE.HBA_170_230.delay.Y  =   4.655857e-06
+PIC.Core.CS001HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS001HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS001HBA1.HBA_ONE.HBA_210_250.delay.X  =   4.656269e-06
+PIC.Core.CS001HBA1.HBA_ONE.HBA_210_250.delay.Y  =   4.655857e-06
+PIC.Core.CS001HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS001HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS001HBA1.HBA_DUAL.HBA_110_190.delay.X  =   4.656269e-06
+PIC.Core.CS001HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   4.655857e-06
+PIC.Core.CS001HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS001HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS001HBA1.HBA_DUAL.HBA_170_230.delay.X  =   4.656269e-06
+PIC.Core.CS001HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   4.655857e-06
+PIC.Core.CS001HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS001HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS001HBA1.HBA_DUAL.HBA_210_250.delay.X  =   4.656269e-06
+PIC.Core.CS001HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   4.655857e-06
+PIC.Core.CS001HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS001HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS001HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   4.656269e-06
+PIC.Core.CS001HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   4.655857e-06
+PIC.Core.CS001HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS001HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS001HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   4.656269e-06
+PIC.Core.CS001HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   4.655857e-06
+PIC.Core.CS001HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS001HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS001HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   4.656269e-06
+PIC.Core.CS001HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   4.655857e-06
+PIC.Core.CS001HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS001HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS001HBA.HBA_JOINED.HBA_110_190.delay.X  =   4.656295e-06
+PIC.Core.CS001HBA.HBA_JOINED.HBA_110_190.delay.Y  =   4.655852e-06
+PIC.Core.CS001HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS001HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS001HBA.HBA_JOINED.HBA_170_230.delay.X  =   4.656295e-06
+PIC.Core.CS001HBA.HBA_JOINED.HBA_170_230.delay.Y  =   4.655852e-06
+PIC.Core.CS001HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS001HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS001HBA.HBA_JOINED.HBA_210_250.delay.X  =   4.656295e-06
+PIC.Core.CS001HBA.HBA_JOINED.HBA_210_250.delay.Y  =   4.655852e-06
+PIC.Core.CS002LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS002LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS002LBA.LBA_INNER.LBA_10_70.delay.X  =   6.876039e-06
+PIC.Core.CS002LBA.LBA_INNER.LBA_10_70.delay.Y  =   6.876581e-06
+PIC.Core.CS002LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS002LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS002LBA.LBA_INNER.LBA_30_70.delay.X  =   6.876039e-06
+PIC.Core.CS002LBA.LBA_INNER.LBA_30_70.delay.Y  =   6.876581e-06
+PIC.Core.CS002LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS002LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS002LBA.LBA_INNER.LBA_10_90.delay.X  =   6.876039e-06
+PIC.Core.CS002LBA.LBA_INNER.LBA_10_90.delay.Y  =   6.876581e-06
+PIC.Core.CS002LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS002LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS002LBA.LBA_INNER.LBA_30_90.delay.X  =   6.876039e-06
+PIC.Core.CS002LBA.LBA_INNER.LBA_30_90.delay.Y  =   6.876581e-06
+PIC.Core.CS002LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS002LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS002LBA.LBA_OUTER.LBA_10_70.delay.X  =   6.876039e-06
+PIC.Core.CS002LBA.LBA_OUTER.LBA_10_70.delay.Y  =   6.876581e-06
+PIC.Core.CS002LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS002LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS002LBA.LBA_OUTER.LBA_30_70.delay.X  =   6.876039e-06
+PIC.Core.CS002LBA.LBA_OUTER.LBA_30_70.delay.Y  =   6.876581e-06
+PIC.Core.CS002LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS002LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS002LBA.LBA_OUTER.LBA_10_90.delay.X  =   6.876039e-06
+PIC.Core.CS002LBA.LBA_OUTER.LBA_10_90.delay.Y  =   6.876581e-06
+PIC.Core.CS002LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS002LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS002LBA.LBA_OUTER.LBA_30_90.delay.X  =   6.876039e-06
+PIC.Core.CS002LBA.LBA_OUTER.LBA_30_90.delay.Y  =   6.876581e-06
+PIC.Core.CS002HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS002HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS002HBA0.HBA_ZERO.HBA_110_190.delay.X  =   6.875965e-06
+PIC.Core.CS002HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   6.876319e-06
+PIC.Core.CS002HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS002HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS002HBA0.HBA_ZERO.HBA_170_230.delay.X  =   6.875965e-06
+PIC.Core.CS002HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   6.876319e-06
+PIC.Core.CS002HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS002HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS002HBA0.HBA_ZERO.HBA_210_250.delay.X  =   6.875965e-06
+PIC.Core.CS002HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   6.876319e-06
+PIC.Core.CS002HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS002HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS002HBA0.HBA_DUAL.HBA_110_190.delay.X  =   6.875965e-06
+PIC.Core.CS002HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   6.876319e-06
+PIC.Core.CS002HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS002HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS002HBA0.HBA_DUAL.HBA_170_230.delay.X  =   6.875965e-06
+PIC.Core.CS002HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   6.876319e-06
+PIC.Core.CS002HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS002HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS002HBA0.HBA_DUAL.HBA_210_250.delay.X  =   6.875965e-06
+PIC.Core.CS002HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   6.876319e-06
+PIC.Core.CS002HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS002HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS002HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   6.875965e-06
+PIC.Core.CS002HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   6.876319e-06
+PIC.Core.CS002HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS002HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS002HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   6.875965e-06
+PIC.Core.CS002HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   6.876319e-06
+PIC.Core.CS002HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS002HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS002HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   6.875965e-06
+PIC.Core.CS002HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   6.876319e-06
+PIC.Core.CS002HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS002HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS002HBA1.HBA_ONE.HBA_110_190.delay.X  =   6.876113e-06
+PIC.Core.CS002HBA1.HBA_ONE.HBA_110_190.delay.Y  =   6.876844e-06
+PIC.Core.CS002HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS002HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS002HBA1.HBA_ONE.HBA_170_230.delay.X  =   6.876113e-06
+PIC.Core.CS002HBA1.HBA_ONE.HBA_170_230.delay.Y  =   6.876844e-06
+PIC.Core.CS002HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS002HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS002HBA1.HBA_ONE.HBA_210_250.delay.X  =   6.876113e-06
+PIC.Core.CS002HBA1.HBA_ONE.HBA_210_250.delay.Y  =   6.876844e-06
+PIC.Core.CS002HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS002HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS002HBA1.HBA_DUAL.HBA_110_190.delay.X  =   6.876113e-06
+PIC.Core.CS002HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   6.876844e-06
+PIC.Core.CS002HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS002HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS002HBA1.HBA_DUAL.HBA_170_230.delay.X  =   6.876113e-06
+PIC.Core.CS002HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   6.876844e-06
+PIC.Core.CS002HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS002HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS002HBA1.HBA_DUAL.HBA_210_250.delay.X  =   6.876113e-06
+PIC.Core.CS002HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   6.876844e-06
+PIC.Core.CS002HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS002HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS002HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   6.876113e-06
+PIC.Core.CS002HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   6.876844e-06
+PIC.Core.CS002HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS002HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS002HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   6.876113e-06
+PIC.Core.CS002HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   6.876844e-06
+PIC.Core.CS002HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS002HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS002HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   6.876113e-06
+PIC.Core.CS002HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   6.876844e-06
+PIC.Core.CS002HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS002HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS002HBA.HBA_JOINED.HBA_110_190.delay.X  =   6.876039e-06
+PIC.Core.CS002HBA.HBA_JOINED.HBA_110_190.delay.Y  =   6.876581e-06
+PIC.Core.CS002HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS002HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS002HBA.HBA_JOINED.HBA_170_230.delay.X  =   6.876039e-06
+PIC.Core.CS002HBA.HBA_JOINED.HBA_170_230.delay.Y  =   6.876581e-06
+PIC.Core.CS002HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS002HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS002HBA.HBA_JOINED.HBA_210_250.delay.X  =   6.876039e-06
+PIC.Core.CS002HBA.HBA_JOINED.HBA_210_250.delay.Y  =   6.876581e-06
+PIC.Core.CS003LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS003LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS003LBA.LBA_INNER.LBA_10_70.delay.X  =   5.471480e-06
+PIC.Core.CS003LBA.LBA_INNER.LBA_10_70.delay.Y  =   5.471185e-06
+PIC.Core.CS003LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS003LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS003LBA.LBA_INNER.LBA_30_70.delay.X  =   5.471480e-06
+PIC.Core.CS003LBA.LBA_INNER.LBA_30_70.delay.Y  =   5.471185e-06
+PIC.Core.CS003LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS003LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS003LBA.LBA_INNER.LBA_10_90.delay.X  =   5.471480e-06
+PIC.Core.CS003LBA.LBA_INNER.LBA_10_90.delay.Y  =   5.471185e-06
+PIC.Core.CS003LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS003LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS003LBA.LBA_INNER.LBA_30_90.delay.X  =   5.471480e-06
+PIC.Core.CS003LBA.LBA_INNER.LBA_30_90.delay.Y  =   5.471185e-06
+PIC.Core.CS003LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS003LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS003LBA.LBA_OUTER.LBA_10_70.delay.X  =   5.471480e-06
+PIC.Core.CS003LBA.LBA_OUTER.LBA_10_70.delay.Y  =   5.471185e-06
+PIC.Core.CS003LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS003LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS003LBA.LBA_OUTER.LBA_30_70.delay.X  =   5.471480e-06
+PIC.Core.CS003LBA.LBA_OUTER.LBA_30_70.delay.Y  =   5.471185e-06
+PIC.Core.CS003LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS003LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS003LBA.LBA_OUTER.LBA_10_90.delay.X  =   5.471480e-06
+PIC.Core.CS003LBA.LBA_OUTER.LBA_10_90.delay.Y  =   5.471185e-06
+PIC.Core.CS003LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS003LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS003LBA.LBA_OUTER.LBA_30_90.delay.X  =   5.471480e-06
+PIC.Core.CS003LBA.LBA_OUTER.LBA_30_90.delay.Y  =   5.471185e-06
+PIC.Core.CS003HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS003HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS003HBA0.HBA_ZERO.HBA_110_190.delay.X  =   5.471519e-06
+PIC.Core.CS003HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   5.471004e-06
+PIC.Core.CS003HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS003HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS003HBA0.HBA_ZERO.HBA_170_230.delay.X  =   5.471519e-06
+PIC.Core.CS003HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   5.471004e-06
+PIC.Core.CS003HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS003HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS003HBA0.HBA_ZERO.HBA_210_250.delay.X  =   5.471519e-06
+PIC.Core.CS003HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   5.471004e-06
+PIC.Core.CS003HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS003HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS003HBA0.HBA_DUAL.HBA_110_190.delay.X  =   5.471519e-06
+PIC.Core.CS003HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   5.471004e-06
+PIC.Core.CS003HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS003HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS003HBA0.HBA_DUAL.HBA_170_230.delay.X  =   5.471519e-06
+PIC.Core.CS003HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   5.471004e-06
+PIC.Core.CS003HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS003HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS003HBA0.HBA_DUAL.HBA_210_250.delay.X  =   5.471519e-06
+PIC.Core.CS003HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   5.471004e-06
+PIC.Core.CS003HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS003HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS003HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   5.471519e-06
+PIC.Core.CS003HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   5.471004e-06
+PIC.Core.CS003HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS003HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS003HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   5.471519e-06
+PIC.Core.CS003HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   5.471004e-06
+PIC.Core.CS003HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS003HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS003HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   5.471519e-06
+PIC.Core.CS003HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   5.471004e-06
+PIC.Core.CS003HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS003HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS003HBA1.HBA_ONE.HBA_110_190.delay.X  =   5.471440e-06
+PIC.Core.CS003HBA1.HBA_ONE.HBA_110_190.delay.Y  =   5.471366e-06
+PIC.Core.CS003HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS003HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS003HBA1.HBA_ONE.HBA_170_230.delay.X  =   5.471440e-06
+PIC.Core.CS003HBA1.HBA_ONE.HBA_170_230.delay.Y  =   5.471366e-06
+PIC.Core.CS003HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS003HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS003HBA1.HBA_ONE.HBA_210_250.delay.X  =   5.471440e-06
+PIC.Core.CS003HBA1.HBA_ONE.HBA_210_250.delay.Y  =   5.471366e-06
+PIC.Core.CS003HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS003HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS003HBA1.HBA_DUAL.HBA_110_190.delay.X  =   5.471440e-06
+PIC.Core.CS003HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   5.471366e-06
+PIC.Core.CS003HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS003HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS003HBA1.HBA_DUAL.HBA_170_230.delay.X  =   5.471440e-06
+PIC.Core.CS003HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   5.471366e-06
+PIC.Core.CS003HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS003HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS003HBA1.HBA_DUAL.HBA_210_250.delay.X  =   5.471440e-06
+PIC.Core.CS003HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   5.471366e-06
+PIC.Core.CS003HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS003HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS003HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   5.471440e-06
+PIC.Core.CS003HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   5.471366e-06
+PIC.Core.CS003HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS003HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS003HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   5.471440e-06
+PIC.Core.CS003HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   5.471366e-06
+PIC.Core.CS003HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS003HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS003HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   5.471440e-06
+PIC.Core.CS003HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   5.471366e-06
+PIC.Core.CS003HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS003HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS003HBA.HBA_JOINED.HBA_110_190.delay.X  =   5.471480e-06
+PIC.Core.CS003HBA.HBA_JOINED.HBA_110_190.delay.Y  =   5.471185e-06
+PIC.Core.CS003HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS003HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS003HBA.HBA_JOINED.HBA_170_230.delay.X  =   5.471480e-06
+PIC.Core.CS003HBA.HBA_JOINED.HBA_170_230.delay.Y  =   5.471185e-06
+PIC.Core.CS003HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS003HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS003HBA.HBA_JOINED.HBA_210_250.delay.X  =   5.471480e-06
+PIC.Core.CS003HBA.HBA_JOINED.HBA_210_250.delay.Y  =   5.471185e-06
+PIC.Core.CS004LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS004LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS004LBA.LBA_INNER.LBA_10_70.delay.X  =   6.451439e-06
+PIC.Core.CS004LBA.LBA_INNER.LBA_10_70.delay.Y  =   6.452039e-06
+PIC.Core.CS004LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS004LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS004LBA.LBA_INNER.LBA_30_70.delay.X  =   6.451439e-06
+PIC.Core.CS004LBA.LBA_INNER.LBA_30_70.delay.Y  =   6.452039e-06
+PIC.Core.CS004LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS004LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS004LBA.LBA_INNER.LBA_10_90.delay.X  =   6.451439e-06
+PIC.Core.CS004LBA.LBA_INNER.LBA_10_90.delay.Y  =   6.452039e-06
+PIC.Core.CS004LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS004LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS004LBA.LBA_INNER.LBA_30_90.delay.X  =   6.451439e-06
+PIC.Core.CS004LBA.LBA_INNER.LBA_30_90.delay.Y  =   6.452039e-06
+PIC.Core.CS004LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS004LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS004LBA.LBA_OUTER.LBA_10_70.delay.X  =   6.451439e-06
+PIC.Core.CS004LBA.LBA_OUTER.LBA_10_70.delay.Y  =   6.452039e-06
+PIC.Core.CS004LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS004LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS004LBA.LBA_OUTER.LBA_30_70.delay.X  =   6.451439e-06
+PIC.Core.CS004LBA.LBA_OUTER.LBA_30_70.delay.Y  =   6.452039e-06
+PIC.Core.CS004LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS004LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS004LBA.LBA_OUTER.LBA_10_90.delay.X  =   6.451439e-06
+PIC.Core.CS004LBA.LBA_OUTER.LBA_10_90.delay.Y  =   6.452039e-06
+PIC.Core.CS004LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS004LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS004LBA.LBA_OUTER.LBA_30_90.delay.X  =   6.451439e-06
+PIC.Core.CS004LBA.LBA_OUTER.LBA_30_90.delay.Y  =   6.452039e-06
+PIC.Core.CS004HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS004HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS004HBA0.HBA_ZERO.HBA_110_190.delay.X  =   6.451586e-06
+PIC.Core.CS004HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   6.451887e-06
+PIC.Core.CS004HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS004HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS004HBA0.HBA_ZERO.HBA_170_230.delay.X  =   6.451586e-06
+PIC.Core.CS004HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   6.451887e-06
+PIC.Core.CS004HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS004HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS004HBA0.HBA_ZERO.HBA_210_250.delay.X  =   6.451586e-06
+PIC.Core.CS004HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   6.451887e-06
+PIC.Core.CS004HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS004HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS004HBA0.HBA_DUAL.HBA_110_190.delay.X  =   6.451586e-06
+PIC.Core.CS004HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   6.451887e-06
+PIC.Core.CS004HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS004HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS004HBA0.HBA_DUAL.HBA_170_230.delay.X  =   6.451586e-06
+PIC.Core.CS004HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   6.451887e-06
+PIC.Core.CS004HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS004HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS004HBA0.HBA_DUAL.HBA_210_250.delay.X  =   6.451586e-06
+PIC.Core.CS004HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   6.451887e-06
+PIC.Core.CS004HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS004HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS004HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   6.451586e-06
+PIC.Core.CS004HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   6.451887e-06
+PIC.Core.CS004HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS004HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS004HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   6.451586e-06
+PIC.Core.CS004HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   6.451887e-06
+PIC.Core.CS004HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS004HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS004HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   6.451586e-06
+PIC.Core.CS004HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   6.451887e-06
+PIC.Core.CS004HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS004HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS004HBA1.HBA_ONE.HBA_110_190.delay.X  =   6.451293e-06
+PIC.Core.CS004HBA1.HBA_ONE.HBA_110_190.delay.Y  =   6.452190e-06
+PIC.Core.CS004HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS004HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS004HBA1.HBA_ONE.HBA_170_230.delay.X  =   6.451293e-06
+PIC.Core.CS004HBA1.HBA_ONE.HBA_170_230.delay.Y  =   6.452190e-06
+PIC.Core.CS004HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS004HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS004HBA1.HBA_ONE.HBA_210_250.delay.X  =   6.451293e-06
+PIC.Core.CS004HBA1.HBA_ONE.HBA_210_250.delay.Y  =   6.452190e-06
+PIC.Core.CS004HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS004HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS004HBA1.HBA_DUAL.HBA_110_190.delay.X  =   6.451293e-06
+PIC.Core.CS004HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   6.452190e-06
+PIC.Core.CS004HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS004HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS004HBA1.HBA_DUAL.HBA_170_230.delay.X  =   6.451293e-06
+PIC.Core.CS004HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   6.452190e-06
+PIC.Core.CS004HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS004HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS004HBA1.HBA_DUAL.HBA_210_250.delay.X  =   6.451293e-06
+PIC.Core.CS004HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   6.452190e-06
+PIC.Core.CS004HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS004HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS004HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   6.451293e-06
+PIC.Core.CS004HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   6.452190e-06
+PIC.Core.CS004HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS004HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS004HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   6.451293e-06
+PIC.Core.CS004HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   6.452190e-06
+PIC.Core.CS004HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS004HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS004HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   6.451293e-06
+PIC.Core.CS004HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   6.452190e-06
+PIC.Core.CS004HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS004HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS004HBA.HBA_JOINED.HBA_110_190.delay.X  =   6.451439e-06
+PIC.Core.CS004HBA.HBA_JOINED.HBA_110_190.delay.Y  =   6.452039e-06
+PIC.Core.CS004HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS004HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS004HBA.HBA_JOINED.HBA_170_230.delay.X  =   6.451439e-06
+PIC.Core.CS004HBA.HBA_JOINED.HBA_170_230.delay.Y  =   6.452039e-06
+PIC.Core.CS004HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS004HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS004HBA.HBA_JOINED.HBA_210_250.delay.X  =   6.451439e-06
+PIC.Core.CS004HBA.HBA_JOINED.HBA_210_250.delay.Y  =   6.452039e-06
+PIC.Core.CS005LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS005LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS005LBA.LBA_INNER.LBA_10_70.delay.X  =   7.102005e-06
+PIC.Core.CS005LBA.LBA_INNER.LBA_10_70.delay.Y  =   7.102630e-06
+PIC.Core.CS005LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS005LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS005LBA.LBA_INNER.LBA_30_70.delay.X  =   7.102005e-06
+PIC.Core.CS005LBA.LBA_INNER.LBA_30_70.delay.Y  =   7.102630e-06
+PIC.Core.CS005LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS005LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS005LBA.LBA_INNER.LBA_10_90.delay.X  =   7.102005e-06
+PIC.Core.CS005LBA.LBA_INNER.LBA_10_90.delay.Y  =   7.102630e-06
+PIC.Core.CS005LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS005LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS005LBA.LBA_INNER.LBA_30_90.delay.X  =   7.102005e-06
+PIC.Core.CS005LBA.LBA_INNER.LBA_30_90.delay.Y  =   7.102630e-06
+PIC.Core.CS005LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS005LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS005LBA.LBA_OUTER.LBA_10_70.delay.X  =   7.102005e-06
+PIC.Core.CS005LBA.LBA_OUTER.LBA_10_70.delay.Y  =   7.102630e-06
+PIC.Core.CS005LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS005LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS005LBA.LBA_OUTER.LBA_30_70.delay.X  =   7.102005e-06
+PIC.Core.CS005LBA.LBA_OUTER.LBA_30_70.delay.Y  =   7.102630e-06
+PIC.Core.CS005LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS005LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS005LBA.LBA_OUTER.LBA_10_90.delay.X  =   7.102005e-06
+PIC.Core.CS005LBA.LBA_OUTER.LBA_10_90.delay.Y  =   7.102630e-06
+PIC.Core.CS005LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS005LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS005LBA.LBA_OUTER.LBA_30_90.delay.X  =   7.102005e-06
+PIC.Core.CS005LBA.LBA_OUTER.LBA_30_90.delay.Y  =   7.102630e-06
+PIC.Core.CS005HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS005HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS005HBA0.HBA_ZERO.HBA_110_190.delay.X  =   7.101819e-06
+PIC.Core.CS005HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   7.102702e-06
+PIC.Core.CS005HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS005HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS005HBA0.HBA_ZERO.HBA_170_230.delay.X  =   7.101819e-06
+PIC.Core.CS005HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   7.102702e-06
+PIC.Core.CS005HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS005HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS005HBA0.HBA_ZERO.HBA_210_250.delay.X  =   7.101819e-06
+PIC.Core.CS005HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   7.102702e-06
+PIC.Core.CS005HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS005HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS005HBA0.HBA_DUAL.HBA_110_190.delay.X  =   7.101819e-06
+PIC.Core.CS005HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   7.102702e-06
+PIC.Core.CS005HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS005HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS005HBA0.HBA_DUAL.HBA_170_230.delay.X  =   7.101819e-06
+PIC.Core.CS005HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   7.102702e-06
+PIC.Core.CS005HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS005HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS005HBA0.HBA_DUAL.HBA_210_250.delay.X  =   7.101819e-06
+PIC.Core.CS005HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   7.102702e-06
+PIC.Core.CS005HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS005HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS005HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   7.101819e-06
+PIC.Core.CS005HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   7.102702e-06
+PIC.Core.CS005HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS005HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS005HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   7.101819e-06
+PIC.Core.CS005HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   7.102702e-06
+PIC.Core.CS005HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS005HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS005HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   7.101819e-06
+PIC.Core.CS005HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   7.102702e-06
+PIC.Core.CS005HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS005HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS005HBA1.HBA_ONE.HBA_110_190.delay.X  =   7.102190e-06
+PIC.Core.CS005HBA1.HBA_ONE.HBA_110_190.delay.Y  =   7.102558e-06
+PIC.Core.CS005HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS005HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS005HBA1.HBA_ONE.HBA_170_230.delay.X  =   7.102190e-06
+PIC.Core.CS005HBA1.HBA_ONE.HBA_170_230.delay.Y  =   7.102558e-06
+PIC.Core.CS005HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS005HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS005HBA1.HBA_ONE.HBA_210_250.delay.X  =   7.102190e-06
+PIC.Core.CS005HBA1.HBA_ONE.HBA_210_250.delay.Y  =   7.102558e-06
+PIC.Core.CS005HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS005HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS005HBA1.HBA_DUAL.HBA_110_190.delay.X  =   7.102190e-06
+PIC.Core.CS005HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   7.102558e-06
+PIC.Core.CS005HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS005HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS005HBA1.HBA_DUAL.HBA_170_230.delay.X  =   7.102190e-06
+PIC.Core.CS005HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   7.102558e-06
+PIC.Core.CS005HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS005HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS005HBA1.HBA_DUAL.HBA_210_250.delay.X  =   7.102190e-06
+PIC.Core.CS005HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   7.102558e-06
+PIC.Core.CS005HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS005HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS005HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   7.102190e-06
+PIC.Core.CS005HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   7.102558e-06
+PIC.Core.CS005HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS005HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS005HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   7.102190e-06
+PIC.Core.CS005HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   7.102558e-06
+PIC.Core.CS005HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS005HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS005HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   7.102190e-06
+PIC.Core.CS005HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   7.102558e-06
+PIC.Core.CS005HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS005HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS005HBA.HBA_JOINED.HBA_110_190.delay.X  =   7.102005e-06
+PIC.Core.CS005HBA.HBA_JOINED.HBA_110_190.delay.Y  =   7.102630e-06
+PIC.Core.CS005HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS005HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS005HBA.HBA_JOINED.HBA_170_230.delay.X  =   7.102005e-06
+PIC.Core.CS005HBA.HBA_JOINED.HBA_170_230.delay.Y  =   7.102630e-06
+PIC.Core.CS005HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS005HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS005HBA.HBA_JOINED.HBA_210_250.delay.X  =   7.102005e-06
+PIC.Core.CS005HBA.HBA_JOINED.HBA_210_250.delay.Y  =   7.102630e-06
+PIC.Core.CS006LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS006LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS006LBA.LBA_INNER.LBA_10_70.delay.X  =   6.447453e-06
+PIC.Core.CS006LBA.LBA_INNER.LBA_10_70.delay.Y  =   6.447862e-06
+PIC.Core.CS006LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS006LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS006LBA.LBA_INNER.LBA_30_70.delay.X  =   6.447453e-06
+PIC.Core.CS006LBA.LBA_INNER.LBA_30_70.delay.Y  =   6.447862e-06
+PIC.Core.CS006LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS006LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS006LBA.LBA_INNER.LBA_10_90.delay.X  =   6.447453e-06
+PIC.Core.CS006LBA.LBA_INNER.LBA_10_90.delay.Y  =   6.447862e-06
+PIC.Core.CS006LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS006LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS006LBA.LBA_INNER.LBA_30_90.delay.X  =   6.447453e-06
+PIC.Core.CS006LBA.LBA_INNER.LBA_30_90.delay.Y  =   6.447862e-06
+PIC.Core.CS006LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS006LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS006LBA.LBA_OUTER.LBA_10_70.delay.X  =   6.447453e-06
+PIC.Core.CS006LBA.LBA_OUTER.LBA_10_70.delay.Y  =   6.447862e-06
+PIC.Core.CS006LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS006LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS006LBA.LBA_OUTER.LBA_30_70.delay.X  =   6.447453e-06
+PIC.Core.CS006LBA.LBA_OUTER.LBA_30_70.delay.Y  =   6.447862e-06
+PIC.Core.CS006LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS006LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS006LBA.LBA_OUTER.LBA_10_90.delay.X  =   6.447453e-06
+PIC.Core.CS006LBA.LBA_OUTER.LBA_10_90.delay.Y  =   6.447862e-06
+PIC.Core.CS006LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS006LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS006LBA.LBA_OUTER.LBA_30_90.delay.X  =   6.447453e-06
+PIC.Core.CS006LBA.LBA_OUTER.LBA_30_90.delay.Y  =   6.447862e-06
+PIC.Core.CS006HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS006HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS006HBA0.HBA_ZERO.HBA_110_190.delay.X  =   6.447259e-06
+PIC.Core.CS006HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   6.447846e-06
+PIC.Core.CS006HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS006HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS006HBA0.HBA_ZERO.HBA_170_230.delay.X  =   6.447259e-06
+PIC.Core.CS006HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   6.447846e-06
+PIC.Core.CS006HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS006HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS006HBA0.HBA_ZERO.HBA_210_250.delay.X  =   6.447259e-06
+PIC.Core.CS006HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   6.447846e-06
+PIC.Core.CS006HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS006HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS006HBA0.HBA_DUAL.HBA_110_190.delay.X  =   6.447259e-06
+PIC.Core.CS006HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   6.447846e-06
+PIC.Core.CS006HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS006HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS006HBA0.HBA_DUAL.HBA_170_230.delay.X  =   6.447259e-06
+PIC.Core.CS006HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   6.447846e-06
+PIC.Core.CS006HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS006HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS006HBA0.HBA_DUAL.HBA_210_250.delay.X  =   6.447259e-06
+PIC.Core.CS006HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   6.447846e-06
+PIC.Core.CS006HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS006HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS006HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   6.447259e-06
+PIC.Core.CS006HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   6.447846e-06
+PIC.Core.CS006HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS006HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS006HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   6.447259e-06
+PIC.Core.CS006HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   6.447846e-06
+PIC.Core.CS006HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS006HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS006HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   6.447259e-06
+PIC.Core.CS006HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   6.447846e-06
+PIC.Core.CS006HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS006HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS006HBA1.HBA_ONE.HBA_110_190.delay.X  =   6.447646e-06
+PIC.Core.CS006HBA1.HBA_ONE.HBA_110_190.delay.Y  =   6.447877e-06
+PIC.Core.CS006HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS006HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS006HBA1.HBA_ONE.HBA_170_230.delay.X  =   6.447646e-06
+PIC.Core.CS006HBA1.HBA_ONE.HBA_170_230.delay.Y  =   6.447877e-06
+PIC.Core.CS006HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS006HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS006HBA1.HBA_ONE.HBA_210_250.delay.X  =   6.447646e-06
+PIC.Core.CS006HBA1.HBA_ONE.HBA_210_250.delay.Y  =   6.447877e-06
+PIC.Core.CS006HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS006HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS006HBA1.HBA_DUAL.HBA_110_190.delay.X  =   6.447646e-06
+PIC.Core.CS006HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   6.447877e-06
+PIC.Core.CS006HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS006HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS006HBA1.HBA_DUAL.HBA_170_230.delay.X  =   6.447646e-06
+PIC.Core.CS006HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   6.447877e-06
+PIC.Core.CS006HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS006HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS006HBA1.HBA_DUAL.HBA_210_250.delay.X  =   6.447646e-06
+PIC.Core.CS006HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   6.447877e-06
+PIC.Core.CS006HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS006HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS006HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   6.447646e-06
+PIC.Core.CS006HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   6.447877e-06
+PIC.Core.CS006HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS006HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS006HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   6.447646e-06
+PIC.Core.CS006HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   6.447877e-06
+PIC.Core.CS006HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS006HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS006HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   6.447646e-06
+PIC.Core.CS006HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   6.447877e-06
+PIC.Core.CS006HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS006HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS006HBA.HBA_JOINED.HBA_110_190.delay.X  =   6.447453e-06
+PIC.Core.CS006HBA.HBA_JOINED.HBA_110_190.delay.Y  =   6.447862e-06
+PIC.Core.CS006HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS006HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS006HBA.HBA_JOINED.HBA_170_230.delay.X  =   6.447453e-06
+PIC.Core.CS006HBA.HBA_JOINED.HBA_170_230.delay.Y  =   6.447862e-06
+PIC.Core.CS006HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS006HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS006HBA.HBA_JOINED.HBA_210_250.delay.X  =   6.447453e-06
+PIC.Core.CS006HBA.HBA_JOINED.HBA_210_250.delay.Y  =   6.447862e-06
+PIC.Core.CS007LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS007LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS007LBA.LBA_INNER.LBA_10_70.delay.X  =   6.476847e-06
+PIC.Core.CS007LBA.LBA_INNER.LBA_10_70.delay.Y  =   6.476400e-06
+PIC.Core.CS007LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS007LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS007LBA.LBA_INNER.LBA_30_70.delay.X  =   6.476847e-06
+PIC.Core.CS007LBA.LBA_INNER.LBA_30_70.delay.Y  =   6.476400e-06
+PIC.Core.CS007LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS007LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS007LBA.LBA_INNER.LBA_10_90.delay.X  =   6.476847e-06
+PIC.Core.CS007LBA.LBA_INNER.LBA_10_90.delay.Y  =   6.476400e-06
+PIC.Core.CS007LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS007LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS007LBA.LBA_INNER.LBA_30_90.delay.X  =   6.476847e-06
+PIC.Core.CS007LBA.LBA_INNER.LBA_30_90.delay.Y  =   6.476400e-06
+PIC.Core.CS007LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS007LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS007LBA.LBA_OUTER.LBA_10_70.delay.X  =   6.476847e-06
+PIC.Core.CS007LBA.LBA_OUTER.LBA_10_70.delay.Y  =   6.476400e-06
+PIC.Core.CS007LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS007LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS007LBA.LBA_OUTER.LBA_30_70.delay.X  =   6.476847e-06
+PIC.Core.CS007LBA.LBA_OUTER.LBA_30_70.delay.Y  =   6.476400e-06
+PIC.Core.CS007LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS007LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS007LBA.LBA_OUTER.LBA_10_90.delay.X  =   6.476847e-06
+PIC.Core.CS007LBA.LBA_OUTER.LBA_10_90.delay.Y  =   6.476400e-06
+PIC.Core.CS007LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS007LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS007LBA.LBA_OUTER.LBA_30_90.delay.X  =   6.476847e-06
+PIC.Core.CS007LBA.LBA_OUTER.LBA_30_90.delay.Y  =   6.476400e-06
+PIC.Core.CS007HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS007HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS007HBA0.HBA_ZERO.HBA_110_190.delay.X  =   6.476597e-06
+PIC.Core.CS007HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   6.476583e-06
+PIC.Core.CS007HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS007HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS007HBA0.HBA_ZERO.HBA_170_230.delay.X  =   6.476597e-06
+PIC.Core.CS007HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   6.476583e-06
+PIC.Core.CS007HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS007HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS007HBA0.HBA_ZERO.HBA_210_250.delay.X  =   6.476597e-06
+PIC.Core.CS007HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   6.476583e-06
+PIC.Core.CS007HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS007HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS007HBA0.HBA_DUAL.HBA_110_190.delay.X  =   6.476597e-06
+PIC.Core.CS007HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   6.476583e-06
+PIC.Core.CS007HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS007HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS007HBA0.HBA_DUAL.HBA_170_230.delay.X  =   6.476597e-06
+PIC.Core.CS007HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   6.476583e-06
+PIC.Core.CS007HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS007HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS007HBA0.HBA_DUAL.HBA_210_250.delay.X  =   6.476597e-06
+PIC.Core.CS007HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   6.476583e-06
+PIC.Core.CS007HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS007HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS007HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   6.476597e-06
+PIC.Core.CS007HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   6.476583e-06
+PIC.Core.CS007HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS007HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS007HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   6.476597e-06
+PIC.Core.CS007HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   6.476583e-06
+PIC.Core.CS007HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS007HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS007HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   6.476597e-06
+PIC.Core.CS007HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   6.476583e-06
+PIC.Core.CS007HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS007HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS007HBA1.HBA_ONE.HBA_110_190.delay.X  =   6.477097e-06
+PIC.Core.CS007HBA1.HBA_ONE.HBA_110_190.delay.Y  =   6.476217e-06
+PIC.Core.CS007HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS007HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS007HBA1.HBA_ONE.HBA_170_230.delay.X  =   6.477097e-06
+PIC.Core.CS007HBA1.HBA_ONE.HBA_170_230.delay.Y  =   6.476217e-06
+PIC.Core.CS007HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS007HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS007HBA1.HBA_ONE.HBA_210_250.delay.X  =   6.477097e-06
+PIC.Core.CS007HBA1.HBA_ONE.HBA_210_250.delay.Y  =   6.476217e-06
+PIC.Core.CS007HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS007HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS007HBA1.HBA_DUAL.HBA_110_190.delay.X  =   6.477097e-06
+PIC.Core.CS007HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   6.476217e-06
+PIC.Core.CS007HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS007HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS007HBA1.HBA_DUAL.HBA_170_230.delay.X  =   6.477097e-06
+PIC.Core.CS007HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   6.476217e-06
+PIC.Core.CS007HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS007HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS007HBA1.HBA_DUAL.HBA_210_250.delay.X  =   6.477097e-06
+PIC.Core.CS007HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   6.476217e-06
+PIC.Core.CS007HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS007HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS007HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   6.477097e-06
+PIC.Core.CS007HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   6.476217e-06
+PIC.Core.CS007HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS007HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS007HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   6.477097e-06
+PIC.Core.CS007HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   6.476217e-06
+PIC.Core.CS007HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS007HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS007HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   6.477097e-06
+PIC.Core.CS007HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   6.476217e-06
+PIC.Core.CS007HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS007HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS007HBA.HBA_JOINED.HBA_110_190.delay.X  =   6.476847e-06
+PIC.Core.CS007HBA.HBA_JOINED.HBA_110_190.delay.Y  =   6.476400e-06
+PIC.Core.CS007HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS007HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS007HBA.HBA_JOINED.HBA_170_230.delay.X  =   6.476847e-06
+PIC.Core.CS007HBA.HBA_JOINED.HBA_170_230.delay.Y  =   6.476400e-06
+PIC.Core.CS007HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS007HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS007HBA.HBA_JOINED.HBA_210_250.delay.X  =   6.476847e-06
+PIC.Core.CS007HBA.HBA_JOINED.HBA_210_250.delay.Y  =   6.476400e-06
+PIC.Core.CS011LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS011LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS011LBA.LBA_INNER.LBA_10_70.delay.X  =   7.468948e-06
+PIC.Core.CS011LBA.LBA_INNER.LBA_10_70.delay.Y  =   7.469310e-06
+PIC.Core.CS011LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS011LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS011LBA.LBA_INNER.LBA_30_70.delay.X  =   7.468948e-06
+PIC.Core.CS011LBA.LBA_INNER.LBA_30_70.delay.Y  =   7.469310e-06
+PIC.Core.CS011LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS011LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS011LBA.LBA_INNER.LBA_10_90.delay.X  =   7.468948e-06
+PIC.Core.CS011LBA.LBA_INNER.LBA_10_90.delay.Y  =   7.469310e-06
+PIC.Core.CS011LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS011LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS011LBA.LBA_INNER.LBA_30_90.delay.X  =   7.468948e-06
+PIC.Core.CS011LBA.LBA_INNER.LBA_30_90.delay.Y  =   7.469310e-06
+PIC.Core.CS011LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS011LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS011LBA.LBA_OUTER.LBA_10_70.delay.X  =   7.468948e-06
+PIC.Core.CS011LBA.LBA_OUTER.LBA_10_70.delay.Y  =   7.469310e-06
+PIC.Core.CS011LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS011LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS011LBA.LBA_OUTER.LBA_30_70.delay.X  =   7.468948e-06
+PIC.Core.CS011LBA.LBA_OUTER.LBA_30_70.delay.Y  =   7.469310e-06
+PIC.Core.CS011LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS011LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS011LBA.LBA_OUTER.LBA_10_90.delay.X  =   7.468948e-06
+PIC.Core.CS011LBA.LBA_OUTER.LBA_10_90.delay.Y  =   7.469310e-06
+PIC.Core.CS011LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS011LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS011LBA.LBA_OUTER.LBA_30_90.delay.X  =   7.468948e-06
+PIC.Core.CS011LBA.LBA_OUTER.LBA_30_90.delay.Y  =   7.469310e-06
+PIC.Core.CS011HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS011HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS011HBA0.HBA_ZERO.HBA_110_190.delay.X  =   7.468901e-06
+PIC.Core.CS011HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   7.469469e-06
+PIC.Core.CS011HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS011HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS011HBA0.HBA_ZERO.HBA_170_230.delay.X  =   7.468901e-06
+PIC.Core.CS011HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   7.469469e-06
+PIC.Core.CS011HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS011HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS011HBA0.HBA_ZERO.HBA_210_250.delay.X  =   7.468901e-06
+PIC.Core.CS011HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   7.469469e-06
+PIC.Core.CS011HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS011HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS011HBA0.HBA_DUAL.HBA_110_190.delay.X  =   7.468901e-06
+PIC.Core.CS011HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   7.469469e-06
+PIC.Core.CS011HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS011HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS011HBA0.HBA_DUAL.HBA_170_230.delay.X  =   7.468901e-06
+PIC.Core.CS011HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   7.469469e-06
+PIC.Core.CS011HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS011HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS011HBA0.HBA_DUAL.HBA_210_250.delay.X  =   7.468901e-06
+PIC.Core.CS011HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   7.469469e-06
+PIC.Core.CS011HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS011HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS011HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   7.468901e-06
+PIC.Core.CS011HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   7.469469e-06
+PIC.Core.CS011HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS011HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS011HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   7.468901e-06
+PIC.Core.CS011HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   7.469469e-06
+PIC.Core.CS011HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS011HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS011HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   7.468901e-06
+PIC.Core.CS011HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   7.469469e-06
+PIC.Core.CS011HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS011HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS011HBA1.HBA_ONE.HBA_110_190.delay.X  =   7.468994e-06
+PIC.Core.CS011HBA1.HBA_ONE.HBA_110_190.delay.Y  =   7.469150e-06
+PIC.Core.CS011HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS011HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS011HBA1.HBA_ONE.HBA_170_230.delay.X  =   7.468994e-06
+PIC.Core.CS011HBA1.HBA_ONE.HBA_170_230.delay.Y  =   7.469150e-06
+PIC.Core.CS011HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS011HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS011HBA1.HBA_ONE.HBA_210_250.delay.X  =   7.468994e-06
+PIC.Core.CS011HBA1.HBA_ONE.HBA_210_250.delay.Y  =   7.469150e-06
+PIC.Core.CS011HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS011HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS011HBA1.HBA_DUAL.HBA_110_190.delay.X  =   7.468994e-06
+PIC.Core.CS011HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   7.469150e-06
+PIC.Core.CS011HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS011HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS011HBA1.HBA_DUAL.HBA_170_230.delay.X  =   7.468994e-06
+PIC.Core.CS011HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   7.469150e-06
+PIC.Core.CS011HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS011HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS011HBA1.HBA_DUAL.HBA_210_250.delay.X  =   7.468994e-06
+PIC.Core.CS011HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   7.469150e-06
+PIC.Core.CS011HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS011HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS011HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   7.468994e-06
+PIC.Core.CS011HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   7.469150e-06
+PIC.Core.CS011HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS011HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS011HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   7.468994e-06
+PIC.Core.CS011HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   7.469150e-06
+PIC.Core.CS011HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS011HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS011HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   7.468994e-06
+PIC.Core.CS011HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   7.469150e-06
+PIC.Core.CS011HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS011HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS011HBA.HBA_JOINED.HBA_110_190.delay.X  =   7.468948e-06
+PIC.Core.CS011HBA.HBA_JOINED.HBA_110_190.delay.Y  =   7.469310e-06
+PIC.Core.CS011HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS011HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS011HBA.HBA_JOINED.HBA_170_230.delay.X  =   7.468948e-06
+PIC.Core.CS011HBA.HBA_JOINED.HBA_170_230.delay.Y  =   7.469310e-06
+PIC.Core.CS011HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS011HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS011HBA.HBA_JOINED.HBA_210_250.delay.X  =   7.468948e-06
+PIC.Core.CS011HBA.HBA_JOINED.HBA_210_250.delay.Y  =   7.469310e-06
+PIC.Core.CS013LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS013LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS013LBA.LBA_INNER.LBA_10_70.delay.X  =   8.689485e-06
+PIC.Core.CS013LBA.LBA_INNER.LBA_10_70.delay.Y  =   8.689511e-06
+PIC.Core.CS013LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS013LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS013LBA.LBA_INNER.LBA_30_70.delay.X  =   8.689485e-06
+PIC.Core.CS013LBA.LBA_INNER.LBA_30_70.delay.Y  =   8.689511e-06
+PIC.Core.CS013LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS013LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS013LBA.LBA_INNER.LBA_10_90.delay.X  =   8.689485e-06
+PIC.Core.CS013LBA.LBA_INNER.LBA_10_90.delay.Y  =   8.689511e-06
+PIC.Core.CS013LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS013LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS013LBA.LBA_INNER.LBA_30_90.delay.X  =   8.689485e-06
+PIC.Core.CS013LBA.LBA_INNER.LBA_30_90.delay.Y  =   8.689511e-06
+PIC.Core.CS013LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS013LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS013LBA.LBA_OUTER.LBA_10_70.delay.X  =   8.689485e-06
+PIC.Core.CS013LBA.LBA_OUTER.LBA_10_70.delay.Y  =   8.689511e-06
+PIC.Core.CS013LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS013LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS013LBA.LBA_OUTER.LBA_30_70.delay.X  =   8.689485e-06
+PIC.Core.CS013LBA.LBA_OUTER.LBA_30_70.delay.Y  =   8.689511e-06
+PIC.Core.CS013LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS013LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS013LBA.LBA_OUTER.LBA_10_90.delay.X  =   8.689485e-06
+PIC.Core.CS013LBA.LBA_OUTER.LBA_10_90.delay.Y  =   8.689511e-06
+PIC.Core.CS013LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS013LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS013LBA.LBA_OUTER.LBA_30_90.delay.X  =   8.689485e-06
+PIC.Core.CS013LBA.LBA_OUTER.LBA_30_90.delay.Y  =   8.689511e-06
+PIC.Core.CS013HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS013HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS013HBA0.HBA_ZERO.HBA_110_190.delay.X  =   8.689572e-06
+PIC.Core.CS013HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   8.689498e-06
+PIC.Core.CS013HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS013HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS013HBA0.HBA_ZERO.HBA_170_230.delay.X  =   8.689572e-06
+PIC.Core.CS013HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   8.689498e-06
+PIC.Core.CS013HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS013HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS013HBA0.HBA_ZERO.HBA_210_250.delay.X  =   8.689572e-06
+PIC.Core.CS013HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   8.689498e-06
+PIC.Core.CS013HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS013HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS013HBA0.HBA_DUAL.HBA_110_190.delay.X  =   8.689572e-06
+PIC.Core.CS013HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   8.689498e-06
+PIC.Core.CS013HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS013HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS013HBA0.HBA_DUAL.HBA_170_230.delay.X  =   8.689572e-06
+PIC.Core.CS013HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   8.689498e-06
+PIC.Core.CS013HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS013HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS013HBA0.HBA_DUAL.HBA_210_250.delay.X  =   8.689572e-06
+PIC.Core.CS013HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   8.689498e-06
+PIC.Core.CS013HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS013HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS013HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   8.689572e-06
+PIC.Core.CS013HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   8.689498e-06
+PIC.Core.CS013HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS013HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS013HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   8.689572e-06
+PIC.Core.CS013HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   8.689498e-06
+PIC.Core.CS013HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS013HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS013HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   8.689572e-06
+PIC.Core.CS013HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   8.689498e-06
+PIC.Core.CS013HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS013HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS013HBA1.HBA_ONE.HBA_110_190.delay.X  =   8.689397e-06
+PIC.Core.CS013HBA1.HBA_ONE.HBA_110_190.delay.Y  =   8.689523e-06
+PIC.Core.CS013HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS013HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS013HBA1.HBA_ONE.HBA_170_230.delay.X  =   8.689397e-06
+PIC.Core.CS013HBA1.HBA_ONE.HBA_170_230.delay.Y  =   8.689523e-06
+PIC.Core.CS013HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS013HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS013HBA1.HBA_ONE.HBA_210_250.delay.X  =   8.689397e-06
+PIC.Core.CS013HBA1.HBA_ONE.HBA_210_250.delay.Y  =   8.689523e-06
+PIC.Core.CS013HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS013HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS013HBA1.HBA_DUAL.HBA_110_190.delay.X  =   8.689397e-06
+PIC.Core.CS013HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   8.689523e-06
+PIC.Core.CS013HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS013HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS013HBA1.HBA_DUAL.HBA_170_230.delay.X  =   8.689397e-06
+PIC.Core.CS013HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   8.689523e-06
+PIC.Core.CS013HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS013HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS013HBA1.HBA_DUAL.HBA_210_250.delay.X  =   8.689397e-06
+PIC.Core.CS013HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   8.689523e-06
+PIC.Core.CS013HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS013HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS013HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   8.689397e-06
+PIC.Core.CS013HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   8.689523e-06
+PIC.Core.CS013HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS013HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS013HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   8.689397e-06
+PIC.Core.CS013HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   8.689523e-06
+PIC.Core.CS013HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS013HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS013HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   8.689397e-06
+PIC.Core.CS013HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   8.689523e-06
+PIC.Core.CS013HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS013HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS013HBA.HBA_JOINED.HBA_110_190.delay.X  =   8.689485e-06
+PIC.Core.CS013HBA.HBA_JOINED.HBA_110_190.delay.Y  =   8.689511e-06
+PIC.Core.CS013HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS013HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS013HBA.HBA_JOINED.HBA_170_230.delay.X  =   8.689485e-06
+PIC.Core.CS013HBA.HBA_JOINED.HBA_170_230.delay.Y  =   8.689511e-06
+PIC.Core.CS013HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS013HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS013HBA.HBA_JOINED.HBA_210_250.delay.X  =   8.689485e-06
+PIC.Core.CS013HBA.HBA_JOINED.HBA_210_250.delay.Y  =   8.689511e-06
+PIC.Core.CS017LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS017LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS017LBA.LBA_INNER.LBA_10_70.delay.X  =   1.532258e-05
+PIC.Core.CS017LBA.LBA_INNER.LBA_10_70.delay.Y  =   1.532111e-05
+PIC.Core.CS017LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS017LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS017LBA.LBA_INNER.LBA_30_70.delay.X  =   1.532258e-05
+PIC.Core.CS017LBA.LBA_INNER.LBA_30_70.delay.Y  =   1.532111e-05
+PIC.Core.CS017LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS017LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS017LBA.LBA_INNER.LBA_10_90.delay.X  =   1.532258e-05
+PIC.Core.CS017LBA.LBA_INNER.LBA_10_90.delay.Y  =   1.532111e-05
+PIC.Core.CS017LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS017LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS017LBA.LBA_INNER.LBA_30_90.delay.X  =   1.532258e-05
+PIC.Core.CS017LBA.LBA_INNER.LBA_30_90.delay.Y  =   1.532111e-05
+PIC.Core.CS017LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS017LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS017LBA.LBA_OUTER.LBA_10_70.delay.X  =   1.532258e-05
+PIC.Core.CS017LBA.LBA_OUTER.LBA_10_70.delay.Y  =   1.532111e-05
+PIC.Core.CS017LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS017LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS017LBA.LBA_OUTER.LBA_30_70.delay.X  =   1.532258e-05
+PIC.Core.CS017LBA.LBA_OUTER.LBA_30_70.delay.Y  =   1.532111e-05
+PIC.Core.CS017LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS017LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS017LBA.LBA_OUTER.LBA_10_90.delay.X  =   1.532258e-05
+PIC.Core.CS017LBA.LBA_OUTER.LBA_10_90.delay.Y  =   1.532111e-05
+PIC.Core.CS017LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS017LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS017LBA.LBA_OUTER.LBA_30_90.delay.X  =   1.532258e-05
+PIC.Core.CS017LBA.LBA_OUTER.LBA_30_90.delay.Y  =   1.532111e-05
+PIC.Core.CS017HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS017HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS017HBA0.HBA_ZERO.HBA_110_190.delay.X  =   1.532263e-05
+PIC.Core.CS017HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   1.532123e-05
+PIC.Core.CS017HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS017HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS017HBA0.HBA_ZERO.HBA_170_230.delay.X  =   1.532263e-05
+PIC.Core.CS017HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   1.532123e-05
+PIC.Core.CS017HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS017HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS017HBA0.HBA_ZERO.HBA_210_250.delay.X  =   1.532263e-05
+PIC.Core.CS017HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   1.532123e-05
+PIC.Core.CS017HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS017HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS017HBA0.HBA_DUAL.HBA_110_190.delay.X  =   1.532263e-05
+PIC.Core.CS017HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   1.532123e-05
+PIC.Core.CS017HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS017HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS017HBA0.HBA_DUAL.HBA_170_230.delay.X  =   1.532263e-05
+PIC.Core.CS017HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   1.532123e-05
+PIC.Core.CS017HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS017HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS017HBA0.HBA_DUAL.HBA_210_250.delay.X  =   1.532263e-05
+PIC.Core.CS017HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   1.532123e-05
+PIC.Core.CS017HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS017HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS017HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   1.532263e-05
+PIC.Core.CS017HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   1.532123e-05
+PIC.Core.CS017HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS017HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS017HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   1.532263e-05
+PIC.Core.CS017HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   1.532123e-05
+PIC.Core.CS017HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS017HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS017HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   1.532263e-05
+PIC.Core.CS017HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   1.532123e-05
+PIC.Core.CS017HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS017HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS017HBA1.HBA_ONE.HBA_110_190.delay.X  =   1.532252e-05
+PIC.Core.CS017HBA1.HBA_ONE.HBA_110_190.delay.Y  =   1.532100e-05
+PIC.Core.CS017HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS017HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS017HBA1.HBA_ONE.HBA_170_230.delay.X  =   1.532252e-05
+PIC.Core.CS017HBA1.HBA_ONE.HBA_170_230.delay.Y  =   1.532100e-05
+PIC.Core.CS017HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS017HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS017HBA1.HBA_ONE.HBA_210_250.delay.X  =   1.532252e-05
+PIC.Core.CS017HBA1.HBA_ONE.HBA_210_250.delay.Y  =   1.532100e-05
+PIC.Core.CS017HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS017HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS017HBA1.HBA_DUAL.HBA_110_190.delay.X  =   1.532252e-05
+PIC.Core.CS017HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   1.532100e-05
+PIC.Core.CS017HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS017HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS017HBA1.HBA_DUAL.HBA_170_230.delay.X  =   1.532252e-05
+PIC.Core.CS017HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   1.532100e-05
+PIC.Core.CS017HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS017HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS017HBA1.HBA_DUAL.HBA_210_250.delay.X  =   1.532252e-05
+PIC.Core.CS017HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   1.532100e-05
+PIC.Core.CS017HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS017HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS017HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   1.532252e-05
+PIC.Core.CS017HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   1.532100e-05
+PIC.Core.CS017HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS017HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS017HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   1.532252e-05
+PIC.Core.CS017HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   1.532100e-05
+PIC.Core.CS017HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS017HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS017HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   1.532252e-05
+PIC.Core.CS017HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   1.532100e-05
+PIC.Core.CS017HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS017HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS017HBA.HBA_JOINED.HBA_110_190.delay.X  =   1.532258e-05
+PIC.Core.CS017HBA.HBA_JOINED.HBA_110_190.delay.Y  =   1.532111e-05
+PIC.Core.CS017HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS017HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS017HBA.HBA_JOINED.HBA_170_230.delay.X  =   1.532258e-05
+PIC.Core.CS017HBA.HBA_JOINED.HBA_170_230.delay.Y  =   1.532111e-05
+PIC.Core.CS017HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS017HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS017HBA.HBA_JOINED.HBA_210_250.delay.X  =   1.532258e-05
+PIC.Core.CS017HBA.HBA_JOINED.HBA_210_250.delay.Y  =   1.532111e-05
+PIC.Core.CS021LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS021LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS021LBA.LBA_INNER.LBA_10_70.delay.X  =   5.959107e-06
+PIC.Core.CS021LBA.LBA_INNER.LBA_10_70.delay.Y  =   5.959842e-06
+PIC.Core.CS021LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS021LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS021LBA.LBA_INNER.LBA_30_70.delay.X  =   5.959107e-06
+PIC.Core.CS021LBA.LBA_INNER.LBA_30_70.delay.Y  =   5.959842e-06
+PIC.Core.CS021LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS021LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS021LBA.LBA_INNER.LBA_10_90.delay.X  =   5.959107e-06
+PIC.Core.CS021LBA.LBA_INNER.LBA_10_90.delay.Y  =   5.959842e-06
+PIC.Core.CS021LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS021LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS021LBA.LBA_INNER.LBA_30_90.delay.X  =   5.959107e-06
+PIC.Core.CS021LBA.LBA_INNER.LBA_30_90.delay.Y  =   5.959842e-06
+PIC.Core.CS021LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS021LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS021LBA.LBA_OUTER.LBA_10_70.delay.X  =   5.959107e-06
+PIC.Core.CS021LBA.LBA_OUTER.LBA_10_70.delay.Y  =   5.959842e-06
+PIC.Core.CS021LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS021LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS021LBA.LBA_OUTER.LBA_30_70.delay.X  =   5.959107e-06
+PIC.Core.CS021LBA.LBA_OUTER.LBA_30_70.delay.Y  =   5.959842e-06
+PIC.Core.CS021LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS021LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS021LBA.LBA_OUTER.LBA_10_90.delay.X  =   5.959107e-06
+PIC.Core.CS021LBA.LBA_OUTER.LBA_10_90.delay.Y  =   5.959842e-06
+PIC.Core.CS021LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS021LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS021LBA.LBA_OUTER.LBA_30_90.delay.X  =   5.959107e-06
+PIC.Core.CS021LBA.LBA_OUTER.LBA_30_90.delay.Y  =   5.959842e-06
+PIC.Core.CS021HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS021HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS021HBA0.HBA_ZERO.HBA_110_190.delay.X  =   5.959155e-06
+PIC.Core.CS021HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   5.959660e-06
+PIC.Core.CS021HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS021HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS021HBA0.HBA_ZERO.HBA_170_230.delay.X  =   5.959155e-06
+PIC.Core.CS021HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   5.959660e-06
+PIC.Core.CS021HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS021HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS021HBA0.HBA_ZERO.HBA_210_250.delay.X  =   5.959155e-06
+PIC.Core.CS021HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   5.959660e-06
+PIC.Core.CS021HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS021HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS021HBA0.HBA_DUAL.HBA_110_190.delay.X  =   5.959155e-06
+PIC.Core.CS021HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   5.959660e-06
+PIC.Core.CS021HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS021HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS021HBA0.HBA_DUAL.HBA_170_230.delay.X  =   5.959155e-06
+PIC.Core.CS021HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   5.959660e-06
+PIC.Core.CS021HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS021HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS021HBA0.HBA_DUAL.HBA_210_250.delay.X  =   5.959155e-06
+PIC.Core.CS021HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   5.959660e-06
+PIC.Core.CS021HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS021HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS021HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   5.959155e-06
+PIC.Core.CS021HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   5.959660e-06
+PIC.Core.CS021HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS021HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS021HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   5.959155e-06
+PIC.Core.CS021HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   5.959660e-06
+PIC.Core.CS021HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS021HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS021HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   5.959155e-06
+PIC.Core.CS021HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   5.959660e-06
+PIC.Core.CS021HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS021HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS021HBA1.HBA_ONE.HBA_110_190.delay.X  =   5.959058e-06
+PIC.Core.CS021HBA1.HBA_ONE.HBA_110_190.delay.Y  =   5.960023e-06
+PIC.Core.CS021HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS021HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS021HBA1.HBA_ONE.HBA_170_230.delay.X  =   5.959058e-06
+PIC.Core.CS021HBA1.HBA_ONE.HBA_170_230.delay.Y  =   5.960023e-06
+PIC.Core.CS021HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS021HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS021HBA1.HBA_ONE.HBA_210_250.delay.X  =   5.959058e-06
+PIC.Core.CS021HBA1.HBA_ONE.HBA_210_250.delay.Y  =   5.960023e-06
+PIC.Core.CS021HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS021HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS021HBA1.HBA_DUAL.HBA_110_190.delay.X  =   5.959058e-06
+PIC.Core.CS021HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   5.960023e-06
+PIC.Core.CS021HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS021HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS021HBA1.HBA_DUAL.HBA_170_230.delay.X  =   5.959058e-06
+PIC.Core.CS021HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   5.960023e-06
+PIC.Core.CS021HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS021HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS021HBA1.HBA_DUAL.HBA_210_250.delay.X  =   5.959058e-06
+PIC.Core.CS021HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   5.960023e-06
+PIC.Core.CS021HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS021HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS021HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   5.959058e-06
+PIC.Core.CS021HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   5.960023e-06
+PIC.Core.CS021HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS021HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS021HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   5.959058e-06
+PIC.Core.CS021HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   5.960023e-06
+PIC.Core.CS021HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS021HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS021HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   5.959058e-06
+PIC.Core.CS021HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   5.960023e-06
+PIC.Core.CS021HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS021HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS021HBA.HBA_JOINED.HBA_110_190.delay.X  =   5.959107e-06
+PIC.Core.CS021HBA.HBA_JOINED.HBA_110_190.delay.Y  =   5.959842e-06
+PIC.Core.CS021HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS021HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS021HBA.HBA_JOINED.HBA_170_230.delay.X  =   5.959107e-06
+PIC.Core.CS021HBA.HBA_JOINED.HBA_170_230.delay.Y  =   5.959842e-06
+PIC.Core.CS021HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS021HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS021HBA.HBA_JOINED.HBA_210_250.delay.X  =   5.959107e-06
+PIC.Core.CS021HBA.HBA_JOINED.HBA_210_250.delay.Y  =   5.959842e-06
+PIC.Core.CS024LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS024LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS024LBA.LBA_INNER.LBA_10_70.delay.X  =   4.555559e-06
+PIC.Core.CS024LBA.LBA_INNER.LBA_10_70.delay.Y  =   4.554567e-06
+PIC.Core.CS024LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS024LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS024LBA.LBA_INNER.LBA_30_70.delay.X  =   4.555559e-06
+PIC.Core.CS024LBA.LBA_INNER.LBA_30_70.delay.Y  =   4.554567e-06
+PIC.Core.CS024LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS024LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS024LBA.LBA_INNER.LBA_10_90.delay.X  =   4.555559e-06
+PIC.Core.CS024LBA.LBA_INNER.LBA_10_90.delay.Y  =   4.554567e-06
+PIC.Core.CS024LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS024LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS024LBA.LBA_INNER.LBA_30_90.delay.X  =   4.555559e-06
+PIC.Core.CS024LBA.LBA_INNER.LBA_30_90.delay.Y  =   4.554567e-06
+PIC.Core.CS024LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS024LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS024LBA.LBA_OUTER.LBA_10_70.delay.X  =   4.555559e-06
+PIC.Core.CS024LBA.LBA_OUTER.LBA_10_70.delay.Y  =   4.554567e-06
+PIC.Core.CS024LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS024LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS024LBA.LBA_OUTER.LBA_30_70.delay.X  =   4.555559e-06
+PIC.Core.CS024LBA.LBA_OUTER.LBA_30_70.delay.Y  =   4.554567e-06
+PIC.Core.CS024LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS024LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS024LBA.LBA_OUTER.LBA_10_90.delay.X  =   4.555559e-06
+PIC.Core.CS024LBA.LBA_OUTER.LBA_10_90.delay.Y  =   4.554567e-06
+PIC.Core.CS024LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS024LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS024LBA.LBA_OUTER.LBA_30_90.delay.X  =   4.555559e-06
+PIC.Core.CS024LBA.LBA_OUTER.LBA_30_90.delay.Y  =   4.554567e-06
+PIC.Core.CS024HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS024HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS024HBA0.HBA_ZERO.HBA_110_190.delay.X  =   4.555545e-06
+PIC.Core.CS024HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   4.554490e-06
+PIC.Core.CS024HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS024HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS024HBA0.HBA_ZERO.HBA_170_230.delay.X  =   4.555545e-06
+PIC.Core.CS024HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   4.554490e-06
+PIC.Core.CS024HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS024HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS024HBA0.HBA_ZERO.HBA_210_250.delay.X  =   4.555545e-06
+PIC.Core.CS024HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   4.554490e-06
+PIC.Core.CS024HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS024HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS024HBA0.HBA_DUAL.HBA_110_190.delay.X  =   4.555545e-06
+PIC.Core.CS024HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   4.554490e-06
+PIC.Core.CS024HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS024HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS024HBA0.HBA_DUAL.HBA_170_230.delay.X  =   4.555545e-06
+PIC.Core.CS024HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   4.554490e-06
+PIC.Core.CS024HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS024HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS024HBA0.HBA_DUAL.HBA_210_250.delay.X  =   4.555545e-06
+PIC.Core.CS024HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   4.554490e-06
+PIC.Core.CS024HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS024HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS024HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   4.555545e-06
+PIC.Core.CS024HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   4.554490e-06
+PIC.Core.CS024HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS024HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS024HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   4.555545e-06
+PIC.Core.CS024HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   4.554490e-06
+PIC.Core.CS024HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS024HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS024HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   4.555545e-06
+PIC.Core.CS024HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   4.554490e-06
+PIC.Core.CS024HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS024HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS024HBA1.HBA_ONE.HBA_110_190.delay.X  =   4.555573e-06
+PIC.Core.CS024HBA1.HBA_ONE.HBA_110_190.delay.Y  =   4.554644e-06
+PIC.Core.CS024HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS024HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS024HBA1.HBA_ONE.HBA_170_230.delay.X  =   4.555573e-06
+PIC.Core.CS024HBA1.HBA_ONE.HBA_170_230.delay.Y  =   4.554644e-06
+PIC.Core.CS024HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS024HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS024HBA1.HBA_ONE.HBA_210_250.delay.X  =   4.555573e-06
+PIC.Core.CS024HBA1.HBA_ONE.HBA_210_250.delay.Y  =   4.554644e-06
+PIC.Core.CS024HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS024HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS024HBA1.HBA_DUAL.HBA_110_190.delay.X  =   4.555573e-06
+PIC.Core.CS024HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   4.554644e-06
+PIC.Core.CS024HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS024HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS024HBA1.HBA_DUAL.HBA_170_230.delay.X  =   4.555573e-06
+PIC.Core.CS024HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   4.554644e-06
+PIC.Core.CS024HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS024HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS024HBA1.HBA_DUAL.HBA_210_250.delay.X  =   4.555573e-06
+PIC.Core.CS024HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   4.554644e-06
+PIC.Core.CS024HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS024HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS024HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   4.555573e-06
+PIC.Core.CS024HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   4.554644e-06
+PIC.Core.CS024HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS024HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS024HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   4.555573e-06
+PIC.Core.CS024HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   4.554644e-06
+PIC.Core.CS024HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS024HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS024HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   4.555573e-06
+PIC.Core.CS024HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   4.554644e-06
+PIC.Core.CS024HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS024HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS024HBA.HBA_JOINED.HBA_110_190.delay.X  =   4.555559e-06
+PIC.Core.CS024HBA.HBA_JOINED.HBA_110_190.delay.Y  =   4.554567e-06
+PIC.Core.CS024HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS024HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS024HBA.HBA_JOINED.HBA_170_230.delay.X  =   4.555559e-06
+PIC.Core.CS024HBA.HBA_JOINED.HBA_170_230.delay.Y  =   4.554567e-06
+PIC.Core.CS024HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS024HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS024HBA.HBA_JOINED.HBA_210_250.delay.X  =   4.555559e-06
+PIC.Core.CS024HBA.HBA_JOINED.HBA_210_250.delay.Y  =   4.554567e-06
+PIC.Core.CS026LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS026LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS026LBA.LBA_INNER.LBA_10_70.delay.X  =   1.611022e-05
+PIC.Core.CS026LBA.LBA_INNER.LBA_10_70.delay.Y  =   1.611064e-05
+PIC.Core.CS026LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS026LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS026LBA.LBA_INNER.LBA_30_70.delay.X  =   1.611022e-05
+PIC.Core.CS026LBA.LBA_INNER.LBA_30_70.delay.Y  =   1.611064e-05
+PIC.Core.CS026LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS026LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS026LBA.LBA_INNER.LBA_10_90.delay.X  =   1.611022e-05
+PIC.Core.CS026LBA.LBA_INNER.LBA_10_90.delay.Y  =   1.611064e-05
+PIC.Core.CS026LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS026LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS026LBA.LBA_INNER.LBA_30_90.delay.X  =   1.611022e-05
+PIC.Core.CS026LBA.LBA_INNER.LBA_30_90.delay.Y  =   1.611064e-05
+PIC.Core.CS026LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS026LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS026LBA.LBA_OUTER.LBA_10_70.delay.X  =   1.611022e-05
+PIC.Core.CS026LBA.LBA_OUTER.LBA_10_70.delay.Y  =   1.611064e-05
+PIC.Core.CS026LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS026LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS026LBA.LBA_OUTER.LBA_30_70.delay.X  =   1.611022e-05
+PIC.Core.CS026LBA.LBA_OUTER.LBA_30_70.delay.Y  =   1.611064e-05
+PIC.Core.CS026LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS026LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS026LBA.LBA_OUTER.LBA_10_90.delay.X  =   1.611022e-05
+PIC.Core.CS026LBA.LBA_OUTER.LBA_10_90.delay.Y  =   1.611064e-05
+PIC.Core.CS026LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS026LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS026LBA.LBA_OUTER.LBA_30_90.delay.X  =   1.611022e-05
+PIC.Core.CS026LBA.LBA_OUTER.LBA_30_90.delay.Y  =   1.611064e-05
+PIC.Core.CS026HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS026HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS026HBA0.HBA_ZERO.HBA_110_190.delay.X  =   1.611013e-05
+PIC.Core.CS026HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   1.611050e-05
+PIC.Core.CS026HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS026HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS026HBA0.HBA_ZERO.HBA_170_230.delay.X  =   1.611013e-05
+PIC.Core.CS026HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   1.611050e-05
+PIC.Core.CS026HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS026HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS026HBA0.HBA_ZERO.HBA_210_250.delay.X  =   1.611013e-05
+PIC.Core.CS026HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   1.611050e-05
+PIC.Core.CS026HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS026HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS026HBA0.HBA_DUAL.HBA_110_190.delay.X  =   1.611013e-05
+PIC.Core.CS026HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   1.611050e-05
+PIC.Core.CS026HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS026HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS026HBA0.HBA_DUAL.HBA_170_230.delay.X  =   1.611013e-05
+PIC.Core.CS026HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   1.611050e-05
+PIC.Core.CS026HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS026HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS026HBA0.HBA_DUAL.HBA_210_250.delay.X  =   1.611013e-05
+PIC.Core.CS026HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   1.611050e-05
+PIC.Core.CS026HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS026HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS026HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   1.611013e-05
+PIC.Core.CS026HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   1.611050e-05
+PIC.Core.CS026HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS026HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS026HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   1.611013e-05
+PIC.Core.CS026HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   1.611050e-05
+PIC.Core.CS026HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS026HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS026HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   1.611013e-05
+PIC.Core.CS026HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   1.611050e-05
+PIC.Core.CS026HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS026HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS026HBA1.HBA_ONE.HBA_110_190.delay.X  =   1.611031e-05
+PIC.Core.CS026HBA1.HBA_ONE.HBA_110_190.delay.Y  =   1.611078e-05
+PIC.Core.CS026HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS026HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS026HBA1.HBA_ONE.HBA_170_230.delay.X  =   1.611031e-05
+PIC.Core.CS026HBA1.HBA_ONE.HBA_170_230.delay.Y  =   1.611078e-05
+PIC.Core.CS026HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS026HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS026HBA1.HBA_ONE.HBA_210_250.delay.X  =   1.611031e-05
+PIC.Core.CS026HBA1.HBA_ONE.HBA_210_250.delay.Y  =   1.611078e-05
+PIC.Core.CS026HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS026HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS026HBA1.HBA_DUAL.HBA_110_190.delay.X  =   1.611031e-05
+PIC.Core.CS026HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   1.611078e-05
+PIC.Core.CS026HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS026HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS026HBA1.HBA_DUAL.HBA_170_230.delay.X  =   1.611031e-05
+PIC.Core.CS026HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   1.611078e-05
+PIC.Core.CS026HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS026HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS026HBA1.HBA_DUAL.HBA_210_250.delay.X  =   1.611031e-05
+PIC.Core.CS026HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   1.611078e-05
+PIC.Core.CS026HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS026HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS026HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   1.611031e-05
+PIC.Core.CS026HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   1.611078e-05
+PIC.Core.CS026HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS026HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS026HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   1.611031e-05
+PIC.Core.CS026HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   1.611078e-05
+PIC.Core.CS026HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS026HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS026HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   1.611031e-05
+PIC.Core.CS026HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   1.611078e-05
+PIC.Core.CS026HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS026HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS026HBA.HBA_JOINED.HBA_110_190.delay.X  =   1.611022e-05
+PIC.Core.CS026HBA.HBA_JOINED.HBA_110_190.delay.Y  =   1.611064e-05
+PIC.Core.CS026HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS026HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS026HBA.HBA_JOINED.HBA_170_230.delay.X  =   1.611022e-05
+PIC.Core.CS026HBA.HBA_JOINED.HBA_170_230.delay.Y  =   1.611064e-05
+PIC.Core.CS026HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS026HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS026HBA.HBA_JOINED.HBA_210_250.delay.X  =   1.611022e-05
+PIC.Core.CS026HBA.HBA_JOINED.HBA_210_250.delay.Y  =   1.611064e-05
+PIC.Core.CS028LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS028LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS028LBA.LBA_INNER.LBA_10_70.delay.X  =   1.685917e-05
+PIC.Core.CS028LBA.LBA_INNER.LBA_10_70.delay.Y  =   1.686041e-05
+PIC.Core.CS028LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS028LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS028LBA.LBA_INNER.LBA_30_70.delay.X  =   1.685917e-05
+PIC.Core.CS028LBA.LBA_INNER.LBA_30_70.delay.Y  =   1.686041e-05
+PIC.Core.CS028LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS028LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS028LBA.LBA_INNER.LBA_10_90.delay.X  =   1.685917e-05
+PIC.Core.CS028LBA.LBA_INNER.LBA_10_90.delay.Y  =   1.686041e-05
+PIC.Core.CS028LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS028LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS028LBA.LBA_INNER.LBA_30_90.delay.X  =   1.685917e-05
+PIC.Core.CS028LBA.LBA_INNER.LBA_30_90.delay.Y  =   1.686041e-05
+PIC.Core.CS028LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS028LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS028LBA.LBA_OUTER.LBA_10_70.delay.X  =   1.685917e-05
+PIC.Core.CS028LBA.LBA_OUTER.LBA_10_70.delay.Y  =   1.686041e-05
+PIC.Core.CS028LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS028LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS028LBA.LBA_OUTER.LBA_30_70.delay.X  =   1.685917e-05
+PIC.Core.CS028LBA.LBA_OUTER.LBA_30_70.delay.Y  =   1.686041e-05
+PIC.Core.CS028LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS028LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS028LBA.LBA_OUTER.LBA_10_90.delay.X  =   1.685917e-05
+PIC.Core.CS028LBA.LBA_OUTER.LBA_10_90.delay.Y  =   1.686041e-05
+PIC.Core.CS028LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS028LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS028LBA.LBA_OUTER.LBA_30_90.delay.X  =   1.685917e-05
+PIC.Core.CS028LBA.LBA_OUTER.LBA_30_90.delay.Y  =   1.686041e-05
+PIC.Core.CS028HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS028HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS028HBA0.HBA_ZERO.HBA_110_190.delay.X  =   1.685917e-05
+PIC.Core.CS028HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   1.686043e-05
+PIC.Core.CS028HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS028HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS028HBA0.HBA_ZERO.HBA_170_230.delay.X  =   1.685917e-05
+PIC.Core.CS028HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   1.686043e-05
+PIC.Core.CS028HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS028HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS028HBA0.HBA_ZERO.HBA_210_250.delay.X  =   1.685917e-05
+PIC.Core.CS028HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   1.686043e-05
+PIC.Core.CS028HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS028HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS028HBA0.HBA_DUAL.HBA_110_190.delay.X  =   1.685917e-05
+PIC.Core.CS028HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   1.686043e-05
+PIC.Core.CS028HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS028HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS028HBA0.HBA_DUAL.HBA_170_230.delay.X  =   1.685917e-05
+PIC.Core.CS028HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   1.686043e-05
+PIC.Core.CS028HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS028HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS028HBA0.HBA_DUAL.HBA_210_250.delay.X  =   1.685917e-05
+PIC.Core.CS028HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   1.686043e-05
+PIC.Core.CS028HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS028HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS028HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   1.685917e-05
+PIC.Core.CS028HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   1.686043e-05
+PIC.Core.CS028HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS028HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS028HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   1.685917e-05
+PIC.Core.CS028HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   1.686043e-05
+PIC.Core.CS028HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS028HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS028HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   1.685917e-05
+PIC.Core.CS028HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   1.686043e-05
+PIC.Core.CS028HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS028HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS028HBA1.HBA_ONE.HBA_110_190.delay.X  =   1.685917e-05
+PIC.Core.CS028HBA1.HBA_ONE.HBA_110_190.delay.Y  =   1.686040e-05
+PIC.Core.CS028HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS028HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS028HBA1.HBA_ONE.HBA_170_230.delay.X  =   1.685917e-05
+PIC.Core.CS028HBA1.HBA_ONE.HBA_170_230.delay.Y  =   1.686040e-05
+PIC.Core.CS028HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS028HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS028HBA1.HBA_ONE.HBA_210_250.delay.X  =   1.685917e-05
+PIC.Core.CS028HBA1.HBA_ONE.HBA_210_250.delay.Y  =   1.686040e-05
+PIC.Core.CS028HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS028HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS028HBA1.HBA_DUAL.HBA_110_190.delay.X  =   1.685917e-05
+PIC.Core.CS028HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   1.686040e-05
+PIC.Core.CS028HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS028HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS028HBA1.HBA_DUAL.HBA_170_230.delay.X  =   1.685917e-05
+PIC.Core.CS028HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   1.686040e-05
+PIC.Core.CS028HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS028HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS028HBA1.HBA_DUAL.HBA_210_250.delay.X  =   1.685917e-05
+PIC.Core.CS028HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   1.686040e-05
+PIC.Core.CS028HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS028HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS028HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   1.685917e-05
+PIC.Core.CS028HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   1.686040e-05
+PIC.Core.CS028HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS028HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS028HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   1.685917e-05
+PIC.Core.CS028HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   1.686040e-05
+PIC.Core.CS028HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS028HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS028HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   1.685917e-05
+PIC.Core.CS028HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   1.686040e-05
+PIC.Core.CS028HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS028HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS028HBA.HBA_JOINED.HBA_110_190.delay.X  =   1.685917e-05
+PIC.Core.CS028HBA.HBA_JOINED.HBA_110_190.delay.Y  =   1.686041e-05
+PIC.Core.CS028HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS028HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS028HBA.HBA_JOINED.HBA_170_230.delay.X  =   1.685917e-05
+PIC.Core.CS028HBA.HBA_JOINED.HBA_170_230.delay.Y  =   1.686041e-05
+PIC.Core.CS028HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS028HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS028HBA.HBA_JOINED.HBA_210_250.delay.X  =   1.685917e-05
+PIC.Core.CS028HBA.HBA_JOINED.HBA_210_250.delay.Y  =   1.686041e-05
+PIC.Core.CS030LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS030LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS030LBA.LBA_INNER.LBA_10_70.delay.X  =   9.625541e-06
+PIC.Core.CS030LBA.LBA_INNER.LBA_10_70.delay.Y  =   9.625413e-06
+PIC.Core.CS030LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS030LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS030LBA.LBA_INNER.LBA_30_70.delay.X  =   9.625541e-06
+PIC.Core.CS030LBA.LBA_INNER.LBA_30_70.delay.Y  =   9.625413e-06
+PIC.Core.CS030LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS030LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS030LBA.LBA_INNER.LBA_10_90.delay.X  =   9.625541e-06
+PIC.Core.CS030LBA.LBA_INNER.LBA_10_90.delay.Y  =   9.625413e-06
+PIC.Core.CS030LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS030LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS030LBA.LBA_INNER.LBA_30_90.delay.X  =   9.625541e-06
+PIC.Core.CS030LBA.LBA_INNER.LBA_30_90.delay.Y  =   9.625413e-06
+PIC.Core.CS030LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS030LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS030LBA.LBA_OUTER.LBA_10_70.delay.X  =   9.625541e-06
+PIC.Core.CS030LBA.LBA_OUTER.LBA_10_70.delay.Y  =   9.625413e-06
+PIC.Core.CS030LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS030LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS030LBA.LBA_OUTER.LBA_30_70.delay.X  =   9.625541e-06
+PIC.Core.CS030LBA.LBA_OUTER.LBA_30_70.delay.Y  =   9.625413e-06
+PIC.Core.CS030LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS030LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS030LBA.LBA_OUTER.LBA_10_90.delay.X  =   9.625541e-06
+PIC.Core.CS030LBA.LBA_OUTER.LBA_10_90.delay.Y  =   9.625413e-06
+PIC.Core.CS030LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS030LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS030LBA.LBA_OUTER.LBA_30_90.delay.X  =   9.625541e-06
+PIC.Core.CS030LBA.LBA_OUTER.LBA_30_90.delay.Y  =   9.625413e-06
+PIC.Core.CS030HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS030HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS030HBA0.HBA_ZERO.HBA_110_190.delay.X  =   9.625532e-06
+PIC.Core.CS030HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   9.625262e-06
+PIC.Core.CS030HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS030HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS030HBA0.HBA_ZERO.HBA_170_230.delay.X  =   9.625532e-06
+PIC.Core.CS030HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   9.625262e-06
+PIC.Core.CS030HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS030HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS030HBA0.HBA_ZERO.HBA_210_250.delay.X  =   9.625532e-06
+PIC.Core.CS030HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   9.625262e-06
+PIC.Core.CS030HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS030HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS030HBA0.HBA_DUAL.HBA_110_190.delay.X  =   9.625532e-06
+PIC.Core.CS030HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   9.625262e-06
+PIC.Core.CS030HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS030HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS030HBA0.HBA_DUAL.HBA_170_230.delay.X  =   9.625532e-06
+PIC.Core.CS030HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   9.625262e-06
+PIC.Core.CS030HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS030HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS030HBA0.HBA_DUAL.HBA_210_250.delay.X  =   9.625532e-06
+PIC.Core.CS030HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   9.625262e-06
+PIC.Core.CS030HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS030HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS030HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   9.625532e-06
+PIC.Core.CS030HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   9.625262e-06
+PIC.Core.CS030HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS030HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS030HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   9.625532e-06
+PIC.Core.CS030HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   9.625262e-06
+PIC.Core.CS030HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS030HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS030HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   9.625532e-06
+PIC.Core.CS030HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   9.625262e-06
+PIC.Core.CS030HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS030HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS030HBA1.HBA_ONE.HBA_110_190.delay.X  =   9.625551e-06
+PIC.Core.CS030HBA1.HBA_ONE.HBA_110_190.delay.Y  =   9.625565e-06
+PIC.Core.CS030HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS030HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS030HBA1.HBA_ONE.HBA_170_230.delay.X  =   9.625551e-06
+PIC.Core.CS030HBA1.HBA_ONE.HBA_170_230.delay.Y  =   9.625565e-06
+PIC.Core.CS030HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS030HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS030HBA1.HBA_ONE.HBA_210_250.delay.X  =   9.625551e-06
+PIC.Core.CS030HBA1.HBA_ONE.HBA_210_250.delay.Y  =   9.625565e-06
+PIC.Core.CS030HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS030HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS030HBA1.HBA_DUAL.HBA_110_190.delay.X  =   9.625551e-06
+PIC.Core.CS030HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   9.625565e-06
+PIC.Core.CS030HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS030HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS030HBA1.HBA_DUAL.HBA_170_230.delay.X  =   9.625551e-06
+PIC.Core.CS030HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   9.625565e-06
+PIC.Core.CS030HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS030HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS030HBA1.HBA_DUAL.HBA_210_250.delay.X  =   9.625551e-06
+PIC.Core.CS030HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   9.625565e-06
+PIC.Core.CS030HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS030HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS030HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   9.625551e-06
+PIC.Core.CS030HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   9.625565e-06
+PIC.Core.CS030HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS030HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS030HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   9.625551e-06
+PIC.Core.CS030HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   9.625565e-06
+PIC.Core.CS030HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS030HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS030HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   9.625551e-06
+PIC.Core.CS030HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   9.625565e-06
+PIC.Core.CS030HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS030HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS030HBA.HBA_JOINED.HBA_110_190.delay.X  =   9.625541e-06
+PIC.Core.CS030HBA.HBA_JOINED.HBA_110_190.delay.Y  =   9.625413e-06
+PIC.Core.CS030HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS030HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS030HBA.HBA_JOINED.HBA_170_230.delay.X  =   9.625541e-06
+PIC.Core.CS030HBA.HBA_JOINED.HBA_170_230.delay.Y  =   9.625413e-06
+PIC.Core.CS030HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS030HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS030HBA.HBA_JOINED.HBA_210_250.delay.X  =   9.625541e-06
+PIC.Core.CS030HBA.HBA_JOINED.HBA_210_250.delay.Y  =   9.625413e-06
+PIC.Core.CS031LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS031LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS031LBA.LBA_INNER.LBA_10_70.delay.X  =   6.265210e-06
+PIC.Core.CS031LBA.LBA_INNER.LBA_10_70.delay.Y  =   6.264419e-06
+PIC.Core.CS031LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS031LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS031LBA.LBA_INNER.LBA_30_70.delay.X  =   6.265210e-06
+PIC.Core.CS031LBA.LBA_INNER.LBA_30_70.delay.Y  =   6.264419e-06
+PIC.Core.CS031LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS031LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS031LBA.LBA_INNER.LBA_10_90.delay.X  =   6.265210e-06
+PIC.Core.CS031LBA.LBA_INNER.LBA_10_90.delay.Y  =   6.264419e-06
+PIC.Core.CS031LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS031LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS031LBA.LBA_INNER.LBA_30_90.delay.X  =   6.265210e-06
+PIC.Core.CS031LBA.LBA_INNER.LBA_30_90.delay.Y  =   6.264419e-06
+PIC.Core.CS031LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS031LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS031LBA.LBA_OUTER.LBA_10_70.delay.X  =   6.265210e-06
+PIC.Core.CS031LBA.LBA_OUTER.LBA_10_70.delay.Y  =   6.264419e-06
+PIC.Core.CS031LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS031LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS031LBA.LBA_OUTER.LBA_30_70.delay.X  =   6.265210e-06
+PIC.Core.CS031LBA.LBA_OUTER.LBA_30_70.delay.Y  =   6.264419e-06
+PIC.Core.CS031LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS031LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS031LBA.LBA_OUTER.LBA_10_90.delay.X  =   6.265210e-06
+PIC.Core.CS031LBA.LBA_OUTER.LBA_10_90.delay.Y  =   6.264419e-06
+PIC.Core.CS031LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS031LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS031LBA.LBA_OUTER.LBA_30_90.delay.X  =   6.265210e-06
+PIC.Core.CS031LBA.LBA_OUTER.LBA_30_90.delay.Y  =   6.264419e-06
+PIC.Core.CS031HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS031HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS031HBA0.HBA_ZERO.HBA_110_190.delay.X  =   6.265290e-06
+PIC.Core.CS031HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   6.264480e-06
+PIC.Core.CS031HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS031HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS031HBA0.HBA_ZERO.HBA_170_230.delay.X  =   6.265290e-06
+PIC.Core.CS031HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   6.264480e-06
+PIC.Core.CS031HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS031HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS031HBA0.HBA_ZERO.HBA_210_250.delay.X  =   6.265290e-06
+PIC.Core.CS031HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   6.264480e-06
+PIC.Core.CS031HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS031HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS031HBA0.HBA_DUAL.HBA_110_190.delay.X  =   6.265290e-06
+PIC.Core.CS031HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   6.264480e-06
+PIC.Core.CS031HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS031HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS031HBA0.HBA_DUAL.HBA_170_230.delay.X  =   6.265290e-06
+PIC.Core.CS031HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   6.264480e-06
+PIC.Core.CS031HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS031HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS031HBA0.HBA_DUAL.HBA_210_250.delay.X  =   6.265290e-06
+PIC.Core.CS031HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   6.264480e-06
+PIC.Core.CS031HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS031HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS031HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   6.265290e-06
+PIC.Core.CS031HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   6.264480e-06
+PIC.Core.CS031HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS031HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS031HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   6.265290e-06
+PIC.Core.CS031HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   6.264480e-06
+PIC.Core.CS031HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS031HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS031HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   6.265290e-06
+PIC.Core.CS031HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   6.264480e-06
+PIC.Core.CS031HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS031HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS031HBA1.HBA_ONE.HBA_110_190.delay.X  =   6.265130e-06
+PIC.Core.CS031HBA1.HBA_ONE.HBA_110_190.delay.Y  =   6.264357e-06
+PIC.Core.CS031HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS031HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS031HBA1.HBA_ONE.HBA_170_230.delay.X  =   6.265130e-06
+PIC.Core.CS031HBA1.HBA_ONE.HBA_170_230.delay.Y  =   6.264357e-06
+PIC.Core.CS031HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS031HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS031HBA1.HBA_ONE.HBA_210_250.delay.X  =   6.265130e-06
+PIC.Core.CS031HBA1.HBA_ONE.HBA_210_250.delay.Y  =   6.264357e-06
+PIC.Core.CS031HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS031HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS031HBA1.HBA_DUAL.HBA_110_190.delay.X  =   6.265130e-06
+PIC.Core.CS031HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   6.264357e-06
+PIC.Core.CS031HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS031HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS031HBA1.HBA_DUAL.HBA_170_230.delay.X  =   6.265130e-06
+PIC.Core.CS031HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   6.264357e-06
+PIC.Core.CS031HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS031HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS031HBA1.HBA_DUAL.HBA_210_250.delay.X  =   6.265130e-06
+PIC.Core.CS031HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   6.264357e-06
+PIC.Core.CS031HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS031HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS031HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   6.265130e-06
+PIC.Core.CS031HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   6.264357e-06
+PIC.Core.CS031HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS031HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS031HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   6.265130e-06
+PIC.Core.CS031HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   6.264357e-06
+PIC.Core.CS031HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS031HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS031HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   6.265130e-06
+PIC.Core.CS031HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   6.264357e-06
+PIC.Core.CS031HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS031HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS031HBA.HBA_JOINED.HBA_110_190.delay.X  =   6.265210e-06
+PIC.Core.CS031HBA.HBA_JOINED.HBA_110_190.delay.Y  =   6.264419e-06
+PIC.Core.CS031HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS031HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS031HBA.HBA_JOINED.HBA_170_230.delay.X  =   6.265210e-06
+PIC.Core.CS031HBA.HBA_JOINED.HBA_170_230.delay.Y  =   6.264419e-06
+PIC.Core.CS031HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS031HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS031HBA.HBA_JOINED.HBA_210_250.delay.X  =   6.265210e-06
+PIC.Core.CS031HBA.HBA_JOINED.HBA_210_250.delay.Y  =   6.264419e-06
+PIC.Core.CS032LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS032LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS032LBA.LBA_INNER.LBA_10_70.delay.X  =   8.456112e-06
+PIC.Core.CS032LBA.LBA_INNER.LBA_10_70.delay.Y  =   8.456084e-06
+PIC.Core.CS032LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS032LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS032LBA.LBA_INNER.LBA_30_70.delay.X  =   8.456112e-06
+PIC.Core.CS032LBA.LBA_INNER.LBA_30_70.delay.Y  =   8.456084e-06
+PIC.Core.CS032LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS032LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS032LBA.LBA_INNER.LBA_10_90.delay.X  =   8.456112e-06
+PIC.Core.CS032LBA.LBA_INNER.LBA_10_90.delay.Y  =   8.456084e-06
+PIC.Core.CS032LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS032LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS032LBA.LBA_INNER.LBA_30_90.delay.X  =   8.456112e-06
+PIC.Core.CS032LBA.LBA_INNER.LBA_30_90.delay.Y  =   8.456084e-06
+PIC.Core.CS032LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS032LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS032LBA.LBA_OUTER.LBA_10_70.delay.X  =   8.456112e-06
+PIC.Core.CS032LBA.LBA_OUTER.LBA_10_70.delay.Y  =   8.456084e-06
+PIC.Core.CS032LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS032LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS032LBA.LBA_OUTER.LBA_30_70.delay.X  =   8.456112e-06
+PIC.Core.CS032LBA.LBA_OUTER.LBA_30_70.delay.Y  =   8.456084e-06
+PIC.Core.CS032LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS032LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS032LBA.LBA_OUTER.LBA_10_90.delay.X  =   8.456112e-06
+PIC.Core.CS032LBA.LBA_OUTER.LBA_10_90.delay.Y  =   8.456084e-06
+PIC.Core.CS032LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS032LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS032LBA.LBA_OUTER.LBA_30_90.delay.X  =   8.456112e-06
+PIC.Core.CS032LBA.LBA_OUTER.LBA_30_90.delay.Y  =   8.456084e-06
+PIC.Core.CS032HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS032HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS032HBA0.HBA_ZERO.HBA_110_190.delay.X  =   8.456099e-06
+PIC.Core.CS032HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   8.456126e-06
+PIC.Core.CS032HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS032HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS032HBA0.HBA_ZERO.HBA_170_230.delay.X  =   8.456099e-06
+PIC.Core.CS032HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   8.456126e-06
+PIC.Core.CS032HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS032HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS032HBA0.HBA_ZERO.HBA_210_250.delay.X  =   8.456099e-06
+PIC.Core.CS032HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   8.456126e-06
+PIC.Core.CS032HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS032HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS032HBA0.HBA_DUAL.HBA_110_190.delay.X  =   8.456099e-06
+PIC.Core.CS032HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   8.456126e-06
+PIC.Core.CS032HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS032HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS032HBA0.HBA_DUAL.HBA_170_230.delay.X  =   8.456099e-06
+PIC.Core.CS032HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   8.456126e-06
+PIC.Core.CS032HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS032HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS032HBA0.HBA_DUAL.HBA_210_250.delay.X  =   8.456099e-06
+PIC.Core.CS032HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   8.456126e-06
+PIC.Core.CS032HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS032HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS032HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   8.456099e-06
+PIC.Core.CS032HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   8.456126e-06
+PIC.Core.CS032HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS032HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS032HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   8.456099e-06
+PIC.Core.CS032HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   8.456126e-06
+PIC.Core.CS032HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS032HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS032HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   8.456099e-06
+PIC.Core.CS032HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   8.456126e-06
+PIC.Core.CS032HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS032HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS032HBA1.HBA_ONE.HBA_110_190.delay.X  =   8.456126e-06
+PIC.Core.CS032HBA1.HBA_ONE.HBA_110_190.delay.Y  =   8.456042e-06
+PIC.Core.CS032HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS032HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS032HBA1.HBA_ONE.HBA_170_230.delay.X  =   8.456126e-06
+PIC.Core.CS032HBA1.HBA_ONE.HBA_170_230.delay.Y  =   8.456042e-06
+PIC.Core.CS032HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS032HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS032HBA1.HBA_ONE.HBA_210_250.delay.X  =   8.456126e-06
+PIC.Core.CS032HBA1.HBA_ONE.HBA_210_250.delay.Y  =   8.456042e-06
+PIC.Core.CS032HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS032HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS032HBA1.HBA_DUAL.HBA_110_190.delay.X  =   8.456126e-06
+PIC.Core.CS032HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   8.456042e-06
+PIC.Core.CS032HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS032HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS032HBA1.HBA_DUAL.HBA_170_230.delay.X  =   8.456126e-06
+PIC.Core.CS032HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   8.456042e-06
+PIC.Core.CS032HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS032HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS032HBA1.HBA_DUAL.HBA_210_250.delay.X  =   8.456126e-06
+PIC.Core.CS032HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   8.456042e-06
+PIC.Core.CS032HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS032HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS032HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   8.456126e-06
+PIC.Core.CS032HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   8.456042e-06
+PIC.Core.CS032HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS032HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS032HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   8.456126e-06
+PIC.Core.CS032HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   8.456042e-06
+PIC.Core.CS032HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS032HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS032HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   8.456126e-06
+PIC.Core.CS032HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   8.456042e-06
+PIC.Core.CS032HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS032HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS032HBA.HBA_JOINED.HBA_110_190.delay.X  =   8.456112e-06
+PIC.Core.CS032HBA.HBA_JOINED.HBA_110_190.delay.Y  =   8.456084e-06
+PIC.Core.CS032HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS032HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS032HBA.HBA_JOINED.HBA_170_230.delay.X  =   8.456112e-06
+PIC.Core.CS032HBA.HBA_JOINED.HBA_170_230.delay.Y  =   8.456084e-06
+PIC.Core.CS032HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS032HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS032HBA.HBA_JOINED.HBA_210_250.delay.X  =   8.456112e-06
+PIC.Core.CS032HBA.HBA_JOINED.HBA_210_250.delay.Y  =   8.456084e-06
+PIC.Core.CS101LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS101LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS101LBA.LBA_INNER.LBA_10_70.delay.X  =   1.505483e-05
+PIC.Core.CS101LBA.LBA_INNER.LBA_10_70.delay.Y  =   1.505451e-05
+PIC.Core.CS101LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS101LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS101LBA.LBA_INNER.LBA_30_70.delay.X  =   1.505483e-05
+PIC.Core.CS101LBA.LBA_INNER.LBA_30_70.delay.Y  =   1.505451e-05
+PIC.Core.CS101LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS101LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS101LBA.LBA_INNER.LBA_10_90.delay.X  =   1.505483e-05
+PIC.Core.CS101LBA.LBA_INNER.LBA_10_90.delay.Y  =   1.505451e-05
+PIC.Core.CS101LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS101LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS101LBA.LBA_INNER.LBA_30_90.delay.X  =   1.505483e-05
+PIC.Core.CS101LBA.LBA_INNER.LBA_30_90.delay.Y  =   1.505451e-05
+PIC.Core.CS101LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS101LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS101LBA.LBA_OUTER.LBA_10_70.delay.X  =   1.505483e-05
+PIC.Core.CS101LBA.LBA_OUTER.LBA_10_70.delay.Y  =   1.505451e-05
+PIC.Core.CS101LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS101LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS101LBA.LBA_OUTER.LBA_30_70.delay.X  =   1.505483e-05
+PIC.Core.CS101LBA.LBA_OUTER.LBA_30_70.delay.Y  =   1.505451e-05
+PIC.Core.CS101LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS101LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS101LBA.LBA_OUTER.LBA_10_90.delay.X  =   1.505483e-05
+PIC.Core.CS101LBA.LBA_OUTER.LBA_10_90.delay.Y  =   1.505451e-05
+PIC.Core.CS101LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS101LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS101LBA.LBA_OUTER.LBA_30_90.delay.X  =   1.505483e-05
+PIC.Core.CS101LBA.LBA_OUTER.LBA_30_90.delay.Y  =   1.505451e-05
+PIC.Core.CS101HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS101HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS101HBA0.HBA_ZERO.HBA_110_190.delay.X  =   1.505479e-05
+PIC.Core.CS101HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   1.505447e-05
+PIC.Core.CS101HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS101HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS101HBA0.HBA_ZERO.HBA_170_230.delay.X  =   1.505479e-05
+PIC.Core.CS101HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   1.505447e-05
+PIC.Core.CS101HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS101HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS101HBA0.HBA_ZERO.HBA_210_250.delay.X  =   1.505479e-05
+PIC.Core.CS101HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   1.505447e-05
+PIC.Core.CS101HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS101HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS101HBA0.HBA_DUAL.HBA_110_190.delay.X  =   1.505479e-05
+PIC.Core.CS101HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   1.505447e-05
+PIC.Core.CS101HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS101HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS101HBA0.HBA_DUAL.HBA_170_230.delay.X  =   1.505479e-05
+PIC.Core.CS101HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   1.505447e-05
+PIC.Core.CS101HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS101HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS101HBA0.HBA_DUAL.HBA_210_250.delay.X  =   1.505479e-05
+PIC.Core.CS101HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   1.505447e-05
+PIC.Core.CS101HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS101HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS101HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   1.505479e-05
+PIC.Core.CS101HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   1.505447e-05
+PIC.Core.CS101HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS101HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS101HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   1.505479e-05
+PIC.Core.CS101HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   1.505447e-05
+PIC.Core.CS101HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS101HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS101HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   1.505479e-05
+PIC.Core.CS101HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   1.505447e-05
+PIC.Core.CS101HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS101HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS101HBA1.HBA_ONE.HBA_110_190.delay.X  =   1.505488e-05
+PIC.Core.CS101HBA1.HBA_ONE.HBA_110_190.delay.Y  =   1.505454e-05
+PIC.Core.CS101HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS101HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS101HBA1.HBA_ONE.HBA_170_230.delay.X  =   1.505488e-05
+PIC.Core.CS101HBA1.HBA_ONE.HBA_170_230.delay.Y  =   1.505454e-05
+PIC.Core.CS101HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS101HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS101HBA1.HBA_ONE.HBA_210_250.delay.X  =   1.505488e-05
+PIC.Core.CS101HBA1.HBA_ONE.HBA_210_250.delay.Y  =   1.505454e-05
+PIC.Core.CS101HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS101HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS101HBA1.HBA_DUAL.HBA_110_190.delay.X  =   1.505488e-05
+PIC.Core.CS101HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   1.505454e-05
+PIC.Core.CS101HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS101HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS101HBA1.HBA_DUAL.HBA_170_230.delay.X  =   1.505488e-05
+PIC.Core.CS101HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   1.505454e-05
+PIC.Core.CS101HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS101HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS101HBA1.HBA_DUAL.HBA_210_250.delay.X  =   1.505488e-05
+PIC.Core.CS101HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   1.505454e-05
+PIC.Core.CS101HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS101HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS101HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   1.505488e-05
+PIC.Core.CS101HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   1.505454e-05
+PIC.Core.CS101HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS101HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS101HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   1.505488e-05
+PIC.Core.CS101HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   1.505454e-05
+PIC.Core.CS101HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS101HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS101HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   1.505488e-05
+PIC.Core.CS101HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   1.505454e-05
+PIC.Core.CS101HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS101HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS101HBA.HBA_JOINED.HBA_110_190.delay.X  =   1.505483e-05
+PIC.Core.CS101HBA.HBA_JOINED.HBA_110_190.delay.Y  =   1.505451e-05
+PIC.Core.CS101HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS101HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS101HBA.HBA_JOINED.HBA_170_230.delay.X  =   1.505483e-05
+PIC.Core.CS101HBA.HBA_JOINED.HBA_170_230.delay.Y  =   1.505451e-05
+PIC.Core.CS101HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS101HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS101HBA.HBA_JOINED.HBA_210_250.delay.X  =   1.505483e-05
+PIC.Core.CS101HBA.HBA_JOINED.HBA_210_250.delay.Y  =   1.505451e-05
+PIC.Core.CS103LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS103LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS103LBA.LBA_INNER.LBA_10_70.delay.X  =   3.539926e-05
+PIC.Core.CS103LBA.LBA_INNER.LBA_10_70.delay.Y  =   3.539874e-05
+PIC.Core.CS103LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS103LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS103LBA.LBA_INNER.LBA_30_70.delay.X  =   3.539926e-05
+PIC.Core.CS103LBA.LBA_INNER.LBA_30_70.delay.Y  =   3.539874e-05
+PIC.Core.CS103LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS103LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS103LBA.LBA_INNER.LBA_10_90.delay.X  =   3.539926e-05
+PIC.Core.CS103LBA.LBA_INNER.LBA_10_90.delay.Y  =   3.539874e-05
+PIC.Core.CS103LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS103LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS103LBA.LBA_INNER.LBA_30_90.delay.X  =   3.539926e-05
+PIC.Core.CS103LBA.LBA_INNER.LBA_30_90.delay.Y  =   3.539874e-05
+PIC.Core.CS103LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS103LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS103LBA.LBA_OUTER.LBA_10_70.delay.X  =   3.539926e-05
+PIC.Core.CS103LBA.LBA_OUTER.LBA_10_70.delay.Y  =   3.539874e-05
+PIC.Core.CS103LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS103LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS103LBA.LBA_OUTER.LBA_30_70.delay.X  =   3.539926e-05
+PIC.Core.CS103LBA.LBA_OUTER.LBA_30_70.delay.Y  =   3.539874e-05
+PIC.Core.CS103LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS103LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS103LBA.LBA_OUTER.LBA_10_90.delay.X  =   3.539926e-05
+PIC.Core.CS103LBA.LBA_OUTER.LBA_10_90.delay.Y  =   3.539874e-05
+PIC.Core.CS103LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS103LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS103LBA.LBA_OUTER.LBA_30_90.delay.X  =   3.539926e-05
+PIC.Core.CS103LBA.LBA_OUTER.LBA_30_90.delay.Y  =   3.539874e-05
+PIC.Core.CS103HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS103HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS103HBA0.HBA_ZERO.HBA_110_190.delay.X  =   3.539919e-05
+PIC.Core.CS103HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   3.539868e-05
+PIC.Core.CS103HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS103HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS103HBA0.HBA_ZERO.HBA_170_230.delay.X  =   3.539919e-05
+PIC.Core.CS103HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   3.539868e-05
+PIC.Core.CS103HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS103HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS103HBA0.HBA_ZERO.HBA_210_250.delay.X  =   3.539919e-05
+PIC.Core.CS103HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   3.539868e-05
+PIC.Core.CS103HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS103HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS103HBA0.HBA_DUAL.HBA_110_190.delay.X  =   3.539919e-05
+PIC.Core.CS103HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   3.539868e-05
+PIC.Core.CS103HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS103HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS103HBA0.HBA_DUAL.HBA_170_230.delay.X  =   3.539919e-05
+PIC.Core.CS103HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   3.539868e-05
+PIC.Core.CS103HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS103HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS103HBA0.HBA_DUAL.HBA_210_250.delay.X  =   3.539919e-05
+PIC.Core.CS103HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   3.539868e-05
+PIC.Core.CS103HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS103HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS103HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   3.539919e-05
+PIC.Core.CS103HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   3.539868e-05
+PIC.Core.CS103HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS103HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS103HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   3.539919e-05
+PIC.Core.CS103HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   3.539868e-05
+PIC.Core.CS103HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS103HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS103HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   3.539919e-05
+PIC.Core.CS103HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   3.539868e-05
+PIC.Core.CS103HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS103HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS103HBA1.HBA_ONE.HBA_110_190.delay.X  =   3.539934e-05
+PIC.Core.CS103HBA1.HBA_ONE.HBA_110_190.delay.Y  =   3.539880e-05
+PIC.Core.CS103HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS103HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS103HBA1.HBA_ONE.HBA_170_230.delay.X  =   3.539934e-05
+PIC.Core.CS103HBA1.HBA_ONE.HBA_170_230.delay.Y  =   3.539880e-05
+PIC.Core.CS103HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS103HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS103HBA1.HBA_ONE.HBA_210_250.delay.X  =   3.539934e-05
+PIC.Core.CS103HBA1.HBA_ONE.HBA_210_250.delay.Y  =   3.539880e-05
+PIC.Core.CS103HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS103HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS103HBA1.HBA_DUAL.HBA_110_190.delay.X  =   3.539934e-05
+PIC.Core.CS103HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   3.539880e-05
+PIC.Core.CS103HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS103HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS103HBA1.HBA_DUAL.HBA_170_230.delay.X  =   3.539934e-05
+PIC.Core.CS103HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   3.539880e-05
+PIC.Core.CS103HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS103HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS103HBA1.HBA_DUAL.HBA_210_250.delay.X  =   3.539934e-05
+PIC.Core.CS103HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   3.539880e-05
+PIC.Core.CS103HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS103HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS103HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   3.539934e-05
+PIC.Core.CS103HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   3.539880e-05
+PIC.Core.CS103HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS103HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS103HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   3.539934e-05
+PIC.Core.CS103HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   3.539880e-05
+PIC.Core.CS103HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS103HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS103HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   3.539934e-05
+PIC.Core.CS103HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   3.539880e-05
+PIC.Core.CS103HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS103HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS103HBA.HBA_JOINED.HBA_110_190.delay.X  =   3.539926e-05
+PIC.Core.CS103HBA.HBA_JOINED.HBA_110_190.delay.Y  =   3.539874e-05
+PIC.Core.CS103HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS103HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS103HBA.HBA_JOINED.HBA_170_230.delay.X  =   3.539926e-05
+PIC.Core.CS103HBA.HBA_JOINED.HBA_170_230.delay.Y  =   3.539874e-05
+PIC.Core.CS103HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS103HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS103HBA.HBA_JOINED.HBA_210_250.delay.X  =   3.539926e-05
+PIC.Core.CS103HBA.HBA_JOINED.HBA_210_250.delay.Y  =   3.539874e-05
+PIC.Core.CS201LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS201LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS201LBA.LBA_INNER.LBA_10_70.delay.X  =   1.736016e-05
+PIC.Core.CS201LBA.LBA_INNER.LBA_10_70.delay.Y  =   1.735989e-05
+PIC.Core.CS201LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS201LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS201LBA.LBA_INNER.LBA_30_70.delay.X  =   1.736016e-05
+PIC.Core.CS201LBA.LBA_INNER.LBA_30_70.delay.Y  =   1.735989e-05
+PIC.Core.CS201LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS201LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS201LBA.LBA_INNER.LBA_10_90.delay.X  =   1.736016e-05
+PIC.Core.CS201LBA.LBA_INNER.LBA_10_90.delay.Y  =   1.735989e-05
+PIC.Core.CS201LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS201LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS201LBA.LBA_INNER.LBA_30_90.delay.X  =   1.736016e-05
+PIC.Core.CS201LBA.LBA_INNER.LBA_30_90.delay.Y  =   1.735989e-05
+PIC.Core.CS201LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS201LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS201LBA.LBA_OUTER.LBA_10_70.delay.X  =   1.736016e-05
+PIC.Core.CS201LBA.LBA_OUTER.LBA_10_70.delay.Y  =   1.735989e-05
+PIC.Core.CS201LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS201LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS201LBA.LBA_OUTER.LBA_30_70.delay.X  =   1.736016e-05
+PIC.Core.CS201LBA.LBA_OUTER.LBA_30_70.delay.Y  =   1.735989e-05
+PIC.Core.CS201LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS201LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS201LBA.LBA_OUTER.LBA_10_90.delay.X  =   1.736016e-05
+PIC.Core.CS201LBA.LBA_OUTER.LBA_10_90.delay.Y  =   1.735989e-05
+PIC.Core.CS201LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS201LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS201LBA.LBA_OUTER.LBA_30_90.delay.X  =   1.736016e-05
+PIC.Core.CS201LBA.LBA_OUTER.LBA_30_90.delay.Y  =   1.735989e-05
+PIC.Core.CS201HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS201HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS201HBA0.HBA_ZERO.HBA_110_190.delay.X  =   1.736022e-05
+PIC.Core.CS201HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   1.736002e-05
+PIC.Core.CS201HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS201HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS201HBA0.HBA_ZERO.HBA_170_230.delay.X  =   1.736022e-05
+PIC.Core.CS201HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   1.736002e-05
+PIC.Core.CS201HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS201HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS201HBA0.HBA_ZERO.HBA_210_250.delay.X  =   1.736022e-05
+PIC.Core.CS201HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   1.736002e-05
+PIC.Core.CS201HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS201HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS201HBA0.HBA_DUAL.HBA_110_190.delay.X  =   1.736022e-05
+PIC.Core.CS201HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   1.736002e-05
+PIC.Core.CS201HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS201HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS201HBA0.HBA_DUAL.HBA_170_230.delay.X  =   1.736022e-05
+PIC.Core.CS201HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   1.736002e-05
+PIC.Core.CS201HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS201HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS201HBA0.HBA_DUAL.HBA_210_250.delay.X  =   1.736022e-05
+PIC.Core.CS201HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   1.736002e-05
+PIC.Core.CS201HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS201HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS201HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   1.736022e-05
+PIC.Core.CS201HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   1.736002e-05
+PIC.Core.CS201HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS201HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS201HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   1.736022e-05
+PIC.Core.CS201HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   1.736002e-05
+PIC.Core.CS201HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS201HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS201HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   1.736022e-05
+PIC.Core.CS201HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   1.736002e-05
+PIC.Core.CS201HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS201HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS201HBA1.HBA_ONE.HBA_110_190.delay.X  =   1.736010e-05
+PIC.Core.CS201HBA1.HBA_ONE.HBA_110_190.delay.Y  =   1.735976e-05
+PIC.Core.CS201HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS201HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS201HBA1.HBA_ONE.HBA_170_230.delay.X  =   1.736010e-05
+PIC.Core.CS201HBA1.HBA_ONE.HBA_170_230.delay.Y  =   1.735976e-05
+PIC.Core.CS201HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS201HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS201HBA1.HBA_ONE.HBA_210_250.delay.X  =   1.736010e-05
+PIC.Core.CS201HBA1.HBA_ONE.HBA_210_250.delay.Y  =   1.735976e-05
+PIC.Core.CS201HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS201HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS201HBA1.HBA_DUAL.HBA_110_190.delay.X  =   1.736010e-05
+PIC.Core.CS201HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   1.735976e-05
+PIC.Core.CS201HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS201HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS201HBA1.HBA_DUAL.HBA_170_230.delay.X  =   1.736010e-05
+PIC.Core.CS201HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   1.735976e-05
+PIC.Core.CS201HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS201HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS201HBA1.HBA_DUAL.HBA_210_250.delay.X  =   1.736010e-05
+PIC.Core.CS201HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   1.735976e-05
+PIC.Core.CS201HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS201HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS201HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   1.736010e-05
+PIC.Core.CS201HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   1.735976e-05
+PIC.Core.CS201HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS201HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS201HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   1.736010e-05
+PIC.Core.CS201HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   1.735976e-05
+PIC.Core.CS201HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS201HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS201HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   1.736010e-05
+PIC.Core.CS201HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   1.735976e-05
+PIC.Core.CS201HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS201HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS201HBA.HBA_JOINED.HBA_110_190.delay.X  =   1.736016e-05
+PIC.Core.CS201HBA.HBA_JOINED.HBA_110_190.delay.Y  =   1.735989e-05
+PIC.Core.CS201HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS201HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS201HBA.HBA_JOINED.HBA_170_230.delay.X  =   1.736016e-05
+PIC.Core.CS201HBA.HBA_JOINED.HBA_170_230.delay.Y  =   1.735989e-05
+PIC.Core.CS201HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS201HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS201HBA.HBA_JOINED.HBA_210_250.delay.X  =   1.736016e-05
+PIC.Core.CS201HBA.HBA_JOINED.HBA_210_250.delay.Y  =   1.735989e-05
+PIC.Core.CS301LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS301LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS301LBA.LBA_INNER.LBA_10_70.delay.X  =   7.599883e-06
+PIC.Core.CS301LBA.LBA_INNER.LBA_10_70.delay.Y  =   7.600549e-06
+PIC.Core.CS301LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS301LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS301LBA.LBA_INNER.LBA_30_70.delay.X  =   7.599883e-06
+PIC.Core.CS301LBA.LBA_INNER.LBA_30_70.delay.Y  =   7.600549e-06
+PIC.Core.CS301LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS301LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS301LBA.LBA_INNER.LBA_10_90.delay.X  =   7.599883e-06
+PIC.Core.CS301LBA.LBA_INNER.LBA_10_90.delay.Y  =   7.600549e-06
+PIC.Core.CS301LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS301LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS301LBA.LBA_INNER.LBA_30_90.delay.X  =   7.599883e-06
+PIC.Core.CS301LBA.LBA_INNER.LBA_30_90.delay.Y  =   7.600549e-06
+PIC.Core.CS301LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS301LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS301LBA.LBA_OUTER.LBA_10_70.delay.X  =   7.599883e-06
+PIC.Core.CS301LBA.LBA_OUTER.LBA_10_70.delay.Y  =   7.600549e-06
+PIC.Core.CS301LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS301LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS301LBA.LBA_OUTER.LBA_30_70.delay.X  =   7.599883e-06
+PIC.Core.CS301LBA.LBA_OUTER.LBA_30_70.delay.Y  =   7.600549e-06
+PIC.Core.CS301LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS301LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS301LBA.LBA_OUTER.LBA_10_90.delay.X  =   7.599883e-06
+PIC.Core.CS301LBA.LBA_OUTER.LBA_10_90.delay.Y  =   7.600549e-06
+PIC.Core.CS301LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS301LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS301LBA.LBA_OUTER.LBA_30_90.delay.X  =   7.599883e-06
+PIC.Core.CS301LBA.LBA_OUTER.LBA_30_90.delay.Y  =   7.600549e-06
+PIC.Core.CS301HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS301HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS301HBA0.HBA_ZERO.HBA_110_190.delay.X  =   7.599886e-06
+PIC.Core.CS301HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   7.600516e-06
+PIC.Core.CS301HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS301HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS301HBA0.HBA_ZERO.HBA_170_230.delay.X  =   7.599886e-06
+PIC.Core.CS301HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   7.600516e-06
+PIC.Core.CS301HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS301HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS301HBA0.HBA_ZERO.HBA_210_250.delay.X  =   7.599886e-06
+PIC.Core.CS301HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   7.600516e-06
+PIC.Core.CS301HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS301HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS301HBA0.HBA_DUAL.HBA_110_190.delay.X  =   7.599886e-06
+PIC.Core.CS301HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   7.600516e-06
+PIC.Core.CS301HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS301HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS301HBA0.HBA_DUAL.HBA_170_230.delay.X  =   7.599886e-06
+PIC.Core.CS301HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   7.600516e-06
+PIC.Core.CS301HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS301HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS301HBA0.HBA_DUAL.HBA_210_250.delay.X  =   7.599886e-06
+PIC.Core.CS301HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   7.600516e-06
+PIC.Core.CS301HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS301HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS301HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   7.599886e-06
+PIC.Core.CS301HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   7.600516e-06
+PIC.Core.CS301HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS301HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS301HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   7.599886e-06
+PIC.Core.CS301HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   7.600516e-06
+PIC.Core.CS301HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS301HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS301HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   7.599886e-06
+PIC.Core.CS301HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   7.600516e-06
+PIC.Core.CS301HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS301HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS301HBA1.HBA_ONE.HBA_110_190.delay.X  =   7.599879e-06
+PIC.Core.CS301HBA1.HBA_ONE.HBA_110_190.delay.Y  =   7.600581e-06
+PIC.Core.CS301HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS301HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS301HBA1.HBA_ONE.HBA_170_230.delay.X  =   7.599879e-06
+PIC.Core.CS301HBA1.HBA_ONE.HBA_170_230.delay.Y  =   7.600581e-06
+PIC.Core.CS301HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS301HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS301HBA1.HBA_ONE.HBA_210_250.delay.X  =   7.599879e-06
+PIC.Core.CS301HBA1.HBA_ONE.HBA_210_250.delay.Y  =   7.600581e-06
+PIC.Core.CS301HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS301HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS301HBA1.HBA_DUAL.HBA_110_190.delay.X  =   7.599879e-06
+PIC.Core.CS301HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   7.600581e-06
+PIC.Core.CS301HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS301HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS301HBA1.HBA_DUAL.HBA_170_230.delay.X  =   7.599879e-06
+PIC.Core.CS301HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   7.600581e-06
+PIC.Core.CS301HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS301HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS301HBA1.HBA_DUAL.HBA_210_250.delay.X  =   7.599879e-06
+PIC.Core.CS301HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   7.600581e-06
+PIC.Core.CS301HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS301HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS301HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   7.599879e-06
+PIC.Core.CS301HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   7.600581e-06
+PIC.Core.CS301HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS301HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS301HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   7.599879e-06
+PIC.Core.CS301HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   7.600581e-06
+PIC.Core.CS301HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS301HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS301HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   7.599879e-06
+PIC.Core.CS301HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   7.600581e-06
+PIC.Core.CS301HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS301HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS301HBA.HBA_JOINED.HBA_110_190.delay.X  =   7.599883e-06
+PIC.Core.CS301HBA.HBA_JOINED.HBA_110_190.delay.Y  =   7.600549e-06
+PIC.Core.CS301HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS301HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS301HBA.HBA_JOINED.HBA_170_230.delay.X  =   7.599883e-06
+PIC.Core.CS301HBA.HBA_JOINED.HBA_170_230.delay.Y  =   7.600549e-06
+PIC.Core.CS301HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS301HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS301HBA.HBA_JOINED.HBA_210_250.delay.X  =   7.599883e-06
+PIC.Core.CS301HBA.HBA_JOINED.HBA_210_250.delay.Y  =   7.600549e-06
+PIC.Core.CS302LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS302LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS302LBA.LBA_INNER.LBA_10_70.delay.X  =   1.223101e-05
+PIC.Core.CS302LBA.LBA_INNER.LBA_10_70.delay.Y  =   1.223091e-05
+PIC.Core.CS302LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS302LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS302LBA.LBA_INNER.LBA_30_70.delay.X  =   1.223101e-05
+PIC.Core.CS302LBA.LBA_INNER.LBA_30_70.delay.Y  =   1.223091e-05
+PIC.Core.CS302LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS302LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS302LBA.LBA_INNER.LBA_10_90.delay.X  =   1.223101e-05
+PIC.Core.CS302LBA.LBA_INNER.LBA_10_90.delay.Y  =   1.223091e-05
+PIC.Core.CS302LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS302LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS302LBA.LBA_INNER.LBA_30_90.delay.X  =   1.223101e-05
+PIC.Core.CS302LBA.LBA_INNER.LBA_30_90.delay.Y  =   1.223091e-05
+PIC.Core.CS302LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS302LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS302LBA.LBA_OUTER.LBA_10_70.delay.X  =   1.223101e-05
+PIC.Core.CS302LBA.LBA_OUTER.LBA_10_70.delay.Y  =   1.223091e-05
+PIC.Core.CS302LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS302LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS302LBA.LBA_OUTER.LBA_30_70.delay.X  =   1.223101e-05
+PIC.Core.CS302LBA.LBA_OUTER.LBA_30_70.delay.Y  =   1.223091e-05
+PIC.Core.CS302LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS302LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS302LBA.LBA_OUTER.LBA_10_90.delay.X  =   1.223101e-05
+PIC.Core.CS302LBA.LBA_OUTER.LBA_10_90.delay.Y  =   1.223091e-05
+PIC.Core.CS302LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS302LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS302LBA.LBA_OUTER.LBA_30_90.delay.X  =   1.223101e-05
+PIC.Core.CS302LBA.LBA_OUTER.LBA_30_90.delay.Y  =   1.223091e-05
+PIC.Core.CS302HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS302HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS302HBA0.HBA_ZERO.HBA_110_190.delay.X  =   1.223101e-05
+PIC.Core.CS302HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   1.223097e-05
+PIC.Core.CS302HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS302HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS302HBA0.HBA_ZERO.HBA_170_230.delay.X  =   1.223101e-05
+PIC.Core.CS302HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   1.223097e-05
+PIC.Core.CS302HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS302HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS302HBA0.HBA_ZERO.HBA_210_250.delay.X  =   1.223101e-05
+PIC.Core.CS302HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   1.223097e-05
+PIC.Core.CS302HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS302HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS302HBA0.HBA_DUAL.HBA_110_190.delay.X  =   1.223101e-05
+PIC.Core.CS302HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   1.223097e-05
+PIC.Core.CS302HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS302HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS302HBA0.HBA_DUAL.HBA_170_230.delay.X  =   1.223101e-05
+PIC.Core.CS302HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   1.223097e-05
+PIC.Core.CS302HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS302HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS302HBA0.HBA_DUAL.HBA_210_250.delay.X  =   1.223101e-05
+PIC.Core.CS302HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   1.223097e-05
+PIC.Core.CS302HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS302HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS302HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   1.223101e-05
+PIC.Core.CS302HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   1.223097e-05
+PIC.Core.CS302HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS302HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS302HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   1.223101e-05
+PIC.Core.CS302HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   1.223097e-05
+PIC.Core.CS302HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS302HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS302HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   1.223101e-05
+PIC.Core.CS302HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   1.223097e-05
+PIC.Core.CS302HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS302HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS302HBA1.HBA_ONE.HBA_110_190.delay.X  =   1.223100e-05
+PIC.Core.CS302HBA1.HBA_ONE.HBA_110_190.delay.Y  =   1.223084e-05
+PIC.Core.CS302HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS302HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS302HBA1.HBA_ONE.HBA_170_230.delay.X  =   1.223100e-05
+PIC.Core.CS302HBA1.HBA_ONE.HBA_170_230.delay.Y  =   1.223084e-05
+PIC.Core.CS302HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS302HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS302HBA1.HBA_ONE.HBA_210_250.delay.X  =   1.223100e-05
+PIC.Core.CS302HBA1.HBA_ONE.HBA_210_250.delay.Y  =   1.223084e-05
+PIC.Core.CS302HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS302HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS302HBA1.HBA_DUAL.HBA_110_190.delay.X  =   1.223100e-05
+PIC.Core.CS302HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   1.223084e-05
+PIC.Core.CS302HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS302HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS302HBA1.HBA_DUAL.HBA_170_230.delay.X  =   1.223100e-05
+PIC.Core.CS302HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   1.223084e-05
+PIC.Core.CS302HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS302HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS302HBA1.HBA_DUAL.HBA_210_250.delay.X  =   1.223100e-05
+PIC.Core.CS302HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   1.223084e-05
+PIC.Core.CS302HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS302HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS302HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   1.223100e-05
+PIC.Core.CS302HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   1.223084e-05
+PIC.Core.CS302HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS302HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS302HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   1.223100e-05
+PIC.Core.CS302HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   1.223084e-05
+PIC.Core.CS302HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS302HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS302HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   1.223100e-05
+PIC.Core.CS302HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   1.223084e-05
+PIC.Core.CS302HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS302HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS302HBA.HBA_JOINED.HBA_110_190.delay.X  =   1.223101e-05
+PIC.Core.CS302HBA.HBA_JOINED.HBA_110_190.delay.Y  =   1.223091e-05
+PIC.Core.CS302HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS302HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS302HBA.HBA_JOINED.HBA_170_230.delay.X  =   1.223101e-05
+PIC.Core.CS302HBA.HBA_JOINED.HBA_170_230.delay.Y  =   1.223091e-05
+PIC.Core.CS302HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS302HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS302HBA.HBA_JOINED.HBA_210_250.delay.X  =   1.223101e-05
+PIC.Core.CS302HBA.HBA_JOINED.HBA_210_250.delay.Y  =   1.223091e-05
+PIC.Core.CS401LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS401LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS401LBA.LBA_INNER.LBA_10_70.delay.X  =   7.833150e-06
+PIC.Core.CS401LBA.LBA_INNER.LBA_10_70.delay.Y  =   7.833323e-06
+PIC.Core.CS401LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS401LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS401LBA.LBA_INNER.LBA_30_70.delay.X  =   7.833150e-06
+PIC.Core.CS401LBA.LBA_INNER.LBA_30_70.delay.Y  =   7.833323e-06
+PIC.Core.CS401LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS401LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS401LBA.LBA_INNER.LBA_10_90.delay.X  =   7.833150e-06
+PIC.Core.CS401LBA.LBA_INNER.LBA_10_90.delay.Y  =   7.833323e-06
+PIC.Core.CS401LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS401LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS401LBA.LBA_INNER.LBA_30_90.delay.X  =   7.833150e-06
+PIC.Core.CS401LBA.LBA_INNER.LBA_30_90.delay.Y  =   7.833323e-06
+PIC.Core.CS401LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS401LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS401LBA.LBA_OUTER.LBA_10_70.delay.X  =   7.833150e-06
+PIC.Core.CS401LBA.LBA_OUTER.LBA_10_70.delay.Y  =   7.833323e-06
+PIC.Core.CS401LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS401LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS401LBA.LBA_OUTER.LBA_30_70.delay.X  =   7.833150e-06
+PIC.Core.CS401LBA.LBA_OUTER.LBA_30_70.delay.Y  =   7.833323e-06
+PIC.Core.CS401LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS401LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS401LBA.LBA_OUTER.LBA_10_90.delay.X  =   7.833150e-06
+PIC.Core.CS401LBA.LBA_OUTER.LBA_10_90.delay.Y  =   7.833323e-06
+PIC.Core.CS401LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS401LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS401LBA.LBA_OUTER.LBA_30_90.delay.X  =   7.833150e-06
+PIC.Core.CS401LBA.LBA_OUTER.LBA_30_90.delay.Y  =   7.833323e-06
+PIC.Core.CS401HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS401HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS401HBA0.HBA_ZERO.HBA_110_190.delay.X  =   7.833050e-06
+PIC.Core.CS401HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   7.833413e-06
+PIC.Core.CS401HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS401HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS401HBA0.HBA_ZERO.HBA_170_230.delay.X  =   7.833050e-06
+PIC.Core.CS401HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   7.833413e-06
+PIC.Core.CS401HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS401HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS401HBA0.HBA_ZERO.HBA_210_250.delay.X  =   7.833050e-06
+PIC.Core.CS401HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   7.833413e-06
+PIC.Core.CS401HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS401HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS401HBA0.HBA_DUAL.HBA_110_190.delay.X  =   7.833050e-06
+PIC.Core.CS401HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   7.833413e-06
+PIC.Core.CS401HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS401HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS401HBA0.HBA_DUAL.HBA_170_230.delay.X  =   7.833050e-06
+PIC.Core.CS401HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   7.833413e-06
+PIC.Core.CS401HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS401HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS401HBA0.HBA_DUAL.HBA_210_250.delay.X  =   7.833050e-06
+PIC.Core.CS401HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   7.833413e-06
+PIC.Core.CS401HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS401HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS401HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   7.833050e-06
+PIC.Core.CS401HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   7.833413e-06
+PIC.Core.CS401HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS401HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS401HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   7.833050e-06
+PIC.Core.CS401HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   7.833413e-06
+PIC.Core.CS401HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS401HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS401HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   7.833050e-06
+PIC.Core.CS401HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   7.833413e-06
+PIC.Core.CS401HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS401HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS401HBA1.HBA_ONE.HBA_110_190.delay.X  =   7.833250e-06
+PIC.Core.CS401HBA1.HBA_ONE.HBA_110_190.delay.Y  =   7.833232e-06
+PIC.Core.CS401HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS401HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS401HBA1.HBA_ONE.HBA_170_230.delay.X  =   7.833250e-06
+PIC.Core.CS401HBA1.HBA_ONE.HBA_170_230.delay.Y  =   7.833232e-06
+PIC.Core.CS401HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS401HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS401HBA1.HBA_ONE.HBA_210_250.delay.X  =   7.833250e-06
+PIC.Core.CS401HBA1.HBA_ONE.HBA_210_250.delay.Y  =   7.833232e-06
+PIC.Core.CS401HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS401HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS401HBA1.HBA_DUAL.HBA_110_190.delay.X  =   7.833250e-06
+PIC.Core.CS401HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   7.833232e-06
+PIC.Core.CS401HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS401HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS401HBA1.HBA_DUAL.HBA_170_230.delay.X  =   7.833250e-06
+PIC.Core.CS401HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   7.833232e-06
+PIC.Core.CS401HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS401HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS401HBA1.HBA_DUAL.HBA_210_250.delay.X  =   7.833250e-06
+PIC.Core.CS401HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   7.833232e-06
+PIC.Core.CS401HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS401HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS401HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   7.833250e-06
+PIC.Core.CS401HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   7.833232e-06
+PIC.Core.CS401HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS401HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS401HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   7.833250e-06
+PIC.Core.CS401HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   7.833232e-06
+PIC.Core.CS401HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS401HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS401HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   7.833250e-06
+PIC.Core.CS401HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   7.833232e-06
+PIC.Core.CS401HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS401HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS401HBA.HBA_JOINED.HBA_110_190.delay.X  =   7.833150e-06
+PIC.Core.CS401HBA.HBA_JOINED.HBA_110_190.delay.Y  =   7.833323e-06
+PIC.Core.CS401HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS401HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS401HBA.HBA_JOINED.HBA_170_230.delay.X  =   7.833150e-06
+PIC.Core.CS401HBA.HBA_JOINED.HBA_170_230.delay.Y  =   7.833323e-06
+PIC.Core.CS401HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS401HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS401HBA.HBA_JOINED.HBA_210_250.delay.X  =   7.833150e-06
+PIC.Core.CS401HBA.HBA_JOINED.HBA_210_250.delay.Y  =   7.833323e-06
+PIC.Core.CS501LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS501LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS501LBA.LBA_INNER.LBA_10_70.delay.X  =   1.649365e-05
+PIC.Core.CS501LBA.LBA_INNER.LBA_10_70.delay.Y  =   1.649365e-05
+PIC.Core.CS501LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS501LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS501LBA.LBA_INNER.LBA_30_70.delay.X  =   1.649365e-05
+PIC.Core.CS501LBA.LBA_INNER.LBA_30_70.delay.Y  =   1.649365e-05
+PIC.Core.CS501LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS501LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS501LBA.LBA_INNER.LBA_10_90.delay.X  =   1.649365e-05
+PIC.Core.CS501LBA.LBA_INNER.LBA_10_90.delay.Y  =   1.649365e-05
+PIC.Core.CS501LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS501LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS501LBA.LBA_INNER.LBA_30_90.delay.X  =   1.649365e-05
+PIC.Core.CS501LBA.LBA_INNER.LBA_30_90.delay.Y  =   1.649365e-05
+PIC.Core.CS501LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.CS501LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.CS501LBA.LBA_OUTER.LBA_10_70.delay.X  =   1.649365e-05
+PIC.Core.CS501LBA.LBA_OUTER.LBA_10_70.delay.Y  =   1.649365e-05
+PIC.Core.CS501LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.CS501LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.CS501LBA.LBA_OUTER.LBA_30_70.delay.X  =   1.649365e-05
+PIC.Core.CS501LBA.LBA_OUTER.LBA_30_70.delay.Y  =   1.649365e-05
+PIC.Core.CS501LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.CS501LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.CS501LBA.LBA_OUTER.LBA_10_90.delay.X  =   1.649365e-05
+PIC.Core.CS501LBA.LBA_OUTER.LBA_10_90.delay.Y  =   1.649365e-05
+PIC.Core.CS501LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.CS501LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.CS501LBA.LBA_OUTER.LBA_30_90.delay.X  =   1.649365e-05
+PIC.Core.CS501LBA.LBA_OUTER.LBA_30_90.delay.Y  =   1.649365e-05
+PIC.Core.CS501HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS501HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS501HBA0.HBA_ZERO.HBA_110_190.delay.X  =   1.649378e-05
+PIC.Core.CS501HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   1.649378e-05
+PIC.Core.CS501HBA0.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS501HBA0.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS501HBA0.HBA_ZERO.HBA_170_230.delay.X  =   1.649378e-05
+PIC.Core.CS501HBA0.HBA_ZERO.HBA_170_230.delay.Y  =   1.649378e-05
+PIC.Core.CS501HBA0.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS501HBA0.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS501HBA0.HBA_ZERO.HBA_210_250.delay.X  =   1.649378e-05
+PIC.Core.CS501HBA0.HBA_ZERO.HBA_210_250.delay.Y  =   1.649378e-05
+PIC.Core.CS501HBA0.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS501HBA0.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS501HBA0.HBA_DUAL.HBA_110_190.delay.X  =   1.649378e-05
+PIC.Core.CS501HBA0.HBA_DUAL.HBA_110_190.delay.Y  =   1.649378e-05
+PIC.Core.CS501HBA0.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS501HBA0.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS501HBA0.HBA_DUAL.HBA_170_230.delay.X  =   1.649378e-05
+PIC.Core.CS501HBA0.HBA_DUAL.HBA_170_230.delay.Y  =   1.649378e-05
+PIC.Core.CS501HBA0.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS501HBA0.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS501HBA0.HBA_DUAL.HBA_210_250.delay.X  =   1.649378e-05
+PIC.Core.CS501HBA0.HBA_DUAL.HBA_210_250.delay.Y  =   1.649378e-05
+PIC.Core.CS501HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS501HBA0.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS501HBA0.HBA_DUAL_INNER.HBA_110_190.delay.X  =   1.649378e-05
+PIC.Core.CS501HBA0.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   1.649378e-05
+PIC.Core.CS501HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS501HBA0.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS501HBA0.HBA_DUAL_INNER.HBA_170_230.delay.X  =   1.649378e-05
+PIC.Core.CS501HBA0.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   1.649378e-05
+PIC.Core.CS501HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS501HBA0.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS501HBA0.HBA_DUAL_INNER.HBA_210_250.delay.X  =   1.649378e-05
+PIC.Core.CS501HBA0.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   1.649378e-05
+PIC.Core.CS501HBA1.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS501HBA1.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS501HBA1.HBA_ONE.HBA_110_190.delay.X  =   1.649352e-05
+PIC.Core.CS501HBA1.HBA_ONE.HBA_110_190.delay.Y  =   1.649352e-05
+PIC.Core.CS501HBA1.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS501HBA1.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS501HBA1.HBA_ONE.HBA_170_230.delay.X  =   1.649352e-05
+PIC.Core.CS501HBA1.HBA_ONE.HBA_170_230.delay.Y  =   1.649352e-05
+PIC.Core.CS501HBA1.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS501HBA1.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS501HBA1.HBA_ONE.HBA_210_250.delay.X  =   1.649352e-05
+PIC.Core.CS501HBA1.HBA_ONE.HBA_210_250.delay.Y  =   1.649352e-05
+PIC.Core.CS501HBA1.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS501HBA1.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS501HBA1.HBA_DUAL.HBA_110_190.delay.X  =   1.649352e-05
+PIC.Core.CS501HBA1.HBA_DUAL.HBA_110_190.delay.Y  =   1.649352e-05
+PIC.Core.CS501HBA1.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS501HBA1.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS501HBA1.HBA_DUAL.HBA_170_230.delay.X  =   1.649352e-05
+PIC.Core.CS501HBA1.HBA_DUAL.HBA_170_230.delay.Y  =   1.649352e-05
+PIC.Core.CS501HBA1.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS501HBA1.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS501HBA1.HBA_DUAL.HBA_210_250.delay.X  =   1.649352e-05
+PIC.Core.CS501HBA1.HBA_DUAL.HBA_210_250.delay.Y  =   1.649352e-05
+PIC.Core.CS501HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS501HBA1.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS501HBA1.HBA_DUAL_INNER.HBA_110_190.delay.X  =   1.649352e-05
+PIC.Core.CS501HBA1.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   1.649352e-05
+PIC.Core.CS501HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS501HBA1.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS501HBA1.HBA_DUAL_INNER.HBA_170_230.delay.X  =   1.649352e-05
+PIC.Core.CS501HBA1.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   1.649352e-05
+PIC.Core.CS501HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS501HBA1.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS501HBA1.HBA_DUAL_INNER.HBA_210_250.delay.X  =   1.649352e-05
+PIC.Core.CS501HBA1.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   1.649352e-05
+PIC.Core.CS501HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS501HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS501HBA.HBA_JOINED.HBA_110_190.delay.X  =   1.649365e-05
+PIC.Core.CS501HBA.HBA_JOINED.HBA_110_190.delay.Y  =   1.649365e-05
+PIC.Core.CS501HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.CS501HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.CS501HBA.HBA_JOINED.HBA_170_230.delay.X  =   1.649365e-05
+PIC.Core.CS501HBA.HBA_JOINED.HBA_170_230.delay.Y  =   1.649365e-05
+PIC.Core.CS501HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.CS501HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.CS501HBA.HBA_JOINED.HBA_210_250.delay.X  =   1.649365e-05
+PIC.Core.CS501HBA.HBA_JOINED.HBA_210_250.delay.Y  =   1.649365e-05
+PIC.Core.RS106LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS106LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS106LBA.LBA_INNER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS106LBA.LBA_INNER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS106LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS106LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS106LBA.LBA_INNER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS106LBA.LBA_INNER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS106LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS106LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS106LBA.LBA_INNER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS106LBA.LBA_INNER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS106LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS106LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS106LBA.LBA_INNER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS106LBA.LBA_INNER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS106LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS106LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS106LBA.LBA_OUTER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS106LBA.LBA_OUTER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS106LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS106LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS106LBA.LBA_OUTER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS106LBA.LBA_OUTER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS106LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS106LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS106LBA.LBA_OUTER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS106LBA.LBA_OUTER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS106LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS106LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS106LBA.LBA_OUTER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS106LBA.LBA_OUTER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS106HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS106HBA.HBA_JOINED.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_JOINED.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS106HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS106HBA.HBA_JOINED.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_JOINED.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS106HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS106HBA.HBA_JOINED.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_JOINED.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ZERO.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ZERO.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ZERO.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ZERO.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ZERO.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ZERO.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ONE.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ONE.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ONE.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ONE.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ONE.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_ONE.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL_INNER.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL_INNER.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL_INNER.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS106HBA.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS205LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS205LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS205LBA.LBA_INNER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS205LBA.LBA_INNER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS205LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS205LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS205LBA.LBA_INNER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS205LBA.LBA_INNER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS205LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS205LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS205LBA.LBA_INNER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS205LBA.LBA_INNER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS205LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS205LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS205LBA.LBA_INNER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS205LBA.LBA_INNER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS205LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS205LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS205LBA.LBA_OUTER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS205LBA.LBA_OUTER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS205LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS205LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS205LBA.LBA_OUTER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS205LBA.LBA_OUTER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS205LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS205LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS205LBA.LBA_OUTER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS205LBA.LBA_OUTER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS205LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS205LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS205LBA.LBA_OUTER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS205LBA.LBA_OUTER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS205HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS205HBA.HBA_JOINED.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_JOINED.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS205HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS205HBA.HBA_JOINED.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_JOINED.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS205HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS205HBA.HBA_JOINED.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_JOINED.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ZERO.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ZERO.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ZERO.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ZERO.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ZERO.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ZERO.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ONE.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ONE.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ONE.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ONE.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ONE.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_ONE.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL_INNER.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL_INNER.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL_INNER.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS205HBA.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS208LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS208LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS208LBA.LBA_INNER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS208LBA.LBA_INNER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS208LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS208LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS208LBA.LBA_INNER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS208LBA.LBA_INNER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS208LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS208LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS208LBA.LBA_INNER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS208LBA.LBA_INNER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS208LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS208LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS208LBA.LBA_INNER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS208LBA.LBA_INNER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS208LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS208LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS208LBA.LBA_OUTER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS208LBA.LBA_OUTER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS208LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS208LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS208LBA.LBA_OUTER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS208LBA.LBA_OUTER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS208LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS208LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS208LBA.LBA_OUTER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS208LBA.LBA_OUTER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS208LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS208LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS208LBA.LBA_OUTER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS208LBA.LBA_OUTER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS208HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS208HBA.HBA_JOINED.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_JOINED.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS208HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS208HBA.HBA_JOINED.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_JOINED.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS208HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS208HBA.HBA_JOINED.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_JOINED.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ZERO.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ZERO.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ZERO.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ZERO.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ZERO.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ZERO.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ONE.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ONE.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ONE.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ONE.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ONE.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_ONE.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL_INNER.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL_INNER.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL_INNER.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS208HBA.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS210LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS210LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS210LBA.LBA_INNER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS210LBA.LBA_INNER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS210LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS210LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS210LBA.LBA_INNER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS210LBA.LBA_INNER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS210LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS210LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS210LBA.LBA_INNER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS210LBA.LBA_INNER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS210LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS210LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS210LBA.LBA_INNER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS210LBA.LBA_INNER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS210LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS210LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS210LBA.LBA_OUTER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS210LBA.LBA_OUTER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS210LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS210LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS210LBA.LBA_OUTER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS210LBA.LBA_OUTER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS210LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS210LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS210LBA.LBA_OUTER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS210LBA.LBA_OUTER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS210LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS210LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS210LBA.LBA_OUTER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS210LBA.LBA_OUTER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS210HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS210HBA.HBA_JOINED.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_JOINED.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS210HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS210HBA.HBA_JOINED.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_JOINED.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS210HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS210HBA.HBA_JOINED.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_JOINED.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ZERO.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ZERO.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ZERO.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ZERO.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ZERO.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ZERO.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ONE.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ONE.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ONE.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ONE.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ONE.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_ONE.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL_INNER.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL_INNER.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL_INNER.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS210HBA.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS305LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS305LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS305LBA.LBA_INNER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS305LBA.LBA_INNER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS305LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS305LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS305LBA.LBA_INNER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS305LBA.LBA_INNER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS305LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS305LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS305LBA.LBA_INNER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS305LBA.LBA_INNER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS305LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS305LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS305LBA.LBA_INNER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS305LBA.LBA_INNER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS305LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS305LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS305LBA.LBA_OUTER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS305LBA.LBA_OUTER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS305LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS305LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS305LBA.LBA_OUTER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS305LBA.LBA_OUTER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS305LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS305LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS305LBA.LBA_OUTER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS305LBA.LBA_OUTER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS305LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS305LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS305LBA.LBA_OUTER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS305LBA.LBA_OUTER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS305HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS305HBA.HBA_JOINED.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_JOINED.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS305HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS305HBA.HBA_JOINED.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_JOINED.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS305HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS305HBA.HBA_JOINED.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_JOINED.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ZERO.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ZERO.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ZERO.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ZERO.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ZERO.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ZERO.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ONE.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ONE.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ONE.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ONE.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ONE.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_ONE.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL_INNER.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL_INNER.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL_INNER.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS305HBA.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS306LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS306LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS306LBA.LBA_INNER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS306LBA.LBA_INNER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS306LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS306LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS306LBA.LBA_INNER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS306LBA.LBA_INNER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS306LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS306LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS306LBA.LBA_INNER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS306LBA.LBA_INNER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS306LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS306LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS306LBA.LBA_INNER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS306LBA.LBA_INNER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS306LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS306LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS306LBA.LBA_OUTER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS306LBA.LBA_OUTER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS306LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS306LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS306LBA.LBA_OUTER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS306LBA.LBA_OUTER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS306LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS306LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS306LBA.LBA_OUTER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS306LBA.LBA_OUTER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS306LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS306LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS306LBA.LBA_OUTER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS306LBA.LBA_OUTER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS306HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS306HBA.HBA_JOINED.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_JOINED.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS306HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS306HBA.HBA_JOINED.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_JOINED.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS306HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS306HBA.HBA_JOINED.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_JOINED.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ZERO.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ZERO.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ZERO.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ZERO.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ZERO.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ZERO.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ONE.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ONE.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ONE.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ONE.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ONE.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_ONE.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL_INNER.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL_INNER.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL_INNER.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS306HBA.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS307LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS307LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS307LBA.LBA_INNER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS307LBA.LBA_INNER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS307LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS307LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS307LBA.LBA_INNER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS307LBA.LBA_INNER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS307LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS307LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS307LBA.LBA_INNER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS307LBA.LBA_INNER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS307LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS307LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS307LBA.LBA_INNER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS307LBA.LBA_INNER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS307LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS307LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS307LBA.LBA_OUTER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS307LBA.LBA_OUTER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS307LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS307LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS307LBA.LBA_OUTER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS307LBA.LBA_OUTER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS307LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS307LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS307LBA.LBA_OUTER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS307LBA.LBA_OUTER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS307LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS307LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS307LBA.LBA_OUTER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS307LBA.LBA_OUTER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS307HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS307HBA.HBA_JOINED.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_JOINED.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS307HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS307HBA.HBA_JOINED.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_JOINED.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS307HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS307HBA.HBA_JOINED.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_JOINED.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ZERO.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ZERO.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ZERO.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ZERO.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ZERO.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ZERO.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ONE.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ONE.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ONE.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ONE.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ONE.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_ONE.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL_INNER.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL_INNER.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL_INNER.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS307HBA.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS310LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS310LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS310LBA.LBA_INNER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS310LBA.LBA_INNER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS310LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS310LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS310LBA.LBA_INNER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS310LBA.LBA_INNER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS310LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS310LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS310LBA.LBA_INNER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS310LBA.LBA_INNER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS310LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS310LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS310LBA.LBA_INNER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS310LBA.LBA_INNER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS310LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS310LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS310LBA.LBA_OUTER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS310LBA.LBA_OUTER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS310LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS310LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS310LBA.LBA_OUTER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS310LBA.LBA_OUTER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS310LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS310LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS310LBA.LBA_OUTER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS310LBA.LBA_OUTER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS310LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS310LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS310LBA.LBA_OUTER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS310LBA.LBA_OUTER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS310HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS310HBA.HBA_JOINED.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_JOINED.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS310HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS310HBA.HBA_JOINED.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_JOINED.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS310HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS310HBA.HBA_JOINED.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_JOINED.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ZERO.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ZERO.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ZERO.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ZERO.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ZERO.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ZERO.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ONE.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ONE.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ONE.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ONE.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ONE.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_ONE.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL_INNER.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL_INNER.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL_INNER.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS310HBA.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS406LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS406LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS406LBA.LBA_INNER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS406LBA.LBA_INNER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS406LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS406LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS406LBA.LBA_INNER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS406LBA.LBA_INNER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS406LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS406LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS406LBA.LBA_INNER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS406LBA.LBA_INNER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS406LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS406LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS406LBA.LBA_INNER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS406LBA.LBA_INNER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS406LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS406LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS406LBA.LBA_OUTER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS406LBA.LBA_OUTER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS406LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS406LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS406LBA.LBA_OUTER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS406LBA.LBA_OUTER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS406LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS406LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS406LBA.LBA_OUTER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS406LBA.LBA_OUTER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS406LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS406LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS406LBA.LBA_OUTER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS406LBA.LBA_OUTER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS406HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS406HBA.HBA_JOINED.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_JOINED.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS406HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS406HBA.HBA_JOINED.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_JOINED.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS406HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS406HBA.HBA_JOINED.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_JOINED.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ZERO.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ZERO.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ZERO.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ZERO.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ZERO.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ZERO.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ONE.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ONE.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ONE.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ONE.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ONE.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_ONE.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL_INNER.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL_INNER.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL_INNER.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS406HBA.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS407LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS407LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS407LBA.LBA_INNER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS407LBA.LBA_INNER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS407LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS407LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS407LBA.LBA_INNER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS407LBA.LBA_INNER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS407LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS407LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS407LBA.LBA_INNER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS407LBA.LBA_INNER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS407LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS407LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS407LBA.LBA_INNER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS407LBA.LBA_INNER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS407LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS407LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS407LBA.LBA_OUTER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS407LBA.LBA_OUTER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS407LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS407LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS407LBA.LBA_OUTER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS407LBA.LBA_OUTER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS407LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS407LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS407LBA.LBA_OUTER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS407LBA.LBA_OUTER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS407LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS407LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS407LBA.LBA_OUTER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS407LBA.LBA_OUTER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS407HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS407HBA.HBA_JOINED.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_JOINED.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS407HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS407HBA.HBA_JOINED.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_JOINED.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS407HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS407HBA.HBA_JOINED.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_JOINED.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ZERO.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ZERO.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ZERO.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ZERO.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ZERO.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ZERO.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ONE.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ONE.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ONE.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ONE.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ONE.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_ONE.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL_INNER.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL_INNER.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL_INNER.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS407HBA.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS409LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS409LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS409LBA.LBA_INNER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS409LBA.LBA_INNER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS409LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS409LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS409LBA.LBA_INNER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS409LBA.LBA_INNER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS409LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS409LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS409LBA.LBA_INNER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS409LBA.LBA_INNER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS409LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS409LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS409LBA.LBA_INNER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS409LBA.LBA_INNER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS409LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS409LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS409LBA.LBA_OUTER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS409LBA.LBA_OUTER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS409LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS409LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS409LBA.LBA_OUTER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS409LBA.LBA_OUTER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS409LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS409LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS409LBA.LBA_OUTER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS409LBA.LBA_OUTER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS409LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS409LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS409LBA.LBA_OUTER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS409LBA.LBA_OUTER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS409HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS409HBA.HBA_JOINED.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_JOINED.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS409HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS409HBA.HBA_JOINED.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_JOINED.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS409HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS409HBA.HBA_JOINED.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_JOINED.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ZERO.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ZERO.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ZERO.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ZERO.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ZERO.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ZERO.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ONE.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ONE.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ONE.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ONE.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ONE.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_ONE.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL_INNER.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL_INNER.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL_INNER.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS409HBA.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS503LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS503LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS503LBA.LBA_INNER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS503LBA.LBA_INNER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS503LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS503LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS503LBA.LBA_INNER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS503LBA.LBA_INNER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS503LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS503LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS503LBA.LBA_INNER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS503LBA.LBA_INNER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS503LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS503LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS503LBA.LBA_INNER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS503LBA.LBA_INNER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS503LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS503LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS503LBA.LBA_OUTER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS503LBA.LBA_OUTER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS503LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS503LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS503LBA.LBA_OUTER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS503LBA.LBA_OUTER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS503LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS503LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS503LBA.LBA_OUTER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS503LBA.LBA_OUTER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS503LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS503LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS503LBA.LBA_OUTER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS503LBA.LBA_OUTER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS503HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS503HBA.HBA_JOINED.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_JOINED.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS503HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS503HBA.HBA_JOINED.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_JOINED.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS503HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS503HBA.HBA_JOINED.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_JOINED.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ZERO.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ZERO.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ZERO.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ZERO.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ZERO.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ZERO.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ONE.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ONE.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ONE.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ONE.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ONE.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_ONE.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL_INNER.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL_INNER.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL_INNER.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS503HBA.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS508LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS508LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS508LBA.LBA_INNER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS508LBA.LBA_INNER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS508LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS508LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS508LBA.LBA_INNER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS508LBA.LBA_INNER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS508LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS508LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS508LBA.LBA_INNER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS508LBA.LBA_INNER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS508LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS508LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS508LBA.LBA_INNER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS508LBA.LBA_INNER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS508LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS508LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS508LBA.LBA_OUTER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS508LBA.LBA_OUTER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS508LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS508LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS508LBA.LBA_OUTER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS508LBA.LBA_OUTER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS508LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS508LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS508LBA.LBA_OUTER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS508LBA.LBA_OUTER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS508LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS508LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS508LBA.LBA_OUTER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS508LBA.LBA_OUTER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS508HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS508HBA.HBA_JOINED.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_JOINED.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS508HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS508HBA.HBA_JOINED.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_JOINED.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS508HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS508HBA.HBA_JOINED.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_JOINED.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ZERO.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ZERO.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ZERO.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ZERO.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ZERO.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ZERO.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ONE.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ONE.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ONE.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ONE.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ONE.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_ONE.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL_INNER.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL_INNER.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL_INNER.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS508HBA.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS509LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS509LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS509LBA.LBA_INNER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS509LBA.LBA_INNER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS509LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS509LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS509LBA.LBA_INNER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS509LBA.LBA_INNER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS509LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS509LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS509LBA.LBA_INNER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS509LBA.LBA_INNER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS509LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS509LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS509LBA.LBA_INNER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS509LBA.LBA_INNER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS509LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.RS509LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.RS509LBA.LBA_OUTER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.RS509LBA.LBA_OUTER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.RS509LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.RS509LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.RS509LBA.LBA_OUTER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.RS509LBA.LBA_OUTER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.RS509LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.RS509LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.RS509LBA.LBA_OUTER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.RS509LBA.LBA_OUTER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.RS509LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.RS509LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.RS509LBA.LBA_OUTER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.RS509LBA.LBA_OUTER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS509HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS509HBA.HBA_JOINED.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_JOINED.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS509HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS509HBA.HBA_JOINED.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_JOINED.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS509HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS509HBA.HBA_JOINED.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_JOINED.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ZERO.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ZERO.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ZERO.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ZERO.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ZERO.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ZERO.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ONE.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ONE.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ONE.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ONE.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ONE.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_ONE.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL_INNER.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL_INNER.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL_INNER.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.RS509HBA.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.DE601LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.DE601LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.DE601LBA.LBA_INNER.LBA_10_70.delay.X  =   1.100000e-06
+PIC.Core.DE601LBA.LBA_INNER.LBA_10_70.delay.Y  =   1.100000e-06
+PIC.Core.DE601LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.DE601LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.DE601LBA.LBA_INNER.LBA_30_70.delay.X  =   1.100000e-06
+PIC.Core.DE601LBA.LBA_INNER.LBA_30_70.delay.Y  =   1.100000e-06
+PIC.Core.DE601LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.DE601LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.DE601LBA.LBA_INNER.LBA_10_90.delay.X  =   1.100000e-06
+PIC.Core.DE601LBA.LBA_INNER.LBA_10_90.delay.Y  =   1.100000e-06
+PIC.Core.DE601LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.DE601LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.DE601LBA.LBA_INNER.LBA_30_90.delay.X  =   1.100000e-06
+PIC.Core.DE601LBA.LBA_INNER.LBA_30_90.delay.Y  =   1.100000e-06
+PIC.Core.DE601LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.DE601LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.DE601LBA.LBA_OUTER.LBA_10_70.delay.X  =   1.100000e-06
+PIC.Core.DE601LBA.LBA_OUTER.LBA_10_70.delay.Y  =   1.100000e-06
+PIC.Core.DE601LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.DE601LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.DE601LBA.LBA_OUTER.LBA_30_70.delay.X  =   1.100000e-06
+PIC.Core.DE601LBA.LBA_OUTER.LBA_30_70.delay.Y  =   1.100000e-06
+PIC.Core.DE601LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.DE601LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.DE601LBA.LBA_OUTER.LBA_10_90.delay.X  =   1.100000e-06
+PIC.Core.DE601LBA.LBA_OUTER.LBA_10_90.delay.Y  =   1.100000e-06
+PIC.Core.DE601LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.DE601LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.DE601LBA.LBA_OUTER.LBA_30_90.delay.X  =   1.100000e-06
+PIC.Core.DE601LBA.LBA_OUTER.LBA_30_90.delay.Y  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE601HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE601HBA.HBA_JOINED.HBA_110_190.delay.X  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_JOINED.HBA_110_190.delay.Y  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE601HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE601HBA.HBA_JOINED.HBA_170_230.delay.X  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_JOINED.HBA_170_230.delay.Y  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE601HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE601HBA.HBA_JOINED.HBA_210_250.delay.X  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_JOINED.HBA_210_250.delay.Y  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE601HBA.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE601HBA.HBA_DUAL.HBA_110_190.delay.X  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_DUAL.HBA_110_190.delay.Y  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE601HBA.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE601HBA.HBA_DUAL.HBA_170_230.delay.X  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_DUAL.HBA_170_230.delay.Y  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE601HBA.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE601HBA.HBA_DUAL.HBA_210_250.delay.X  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_DUAL.HBA_210_250.delay.Y  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE601HBA.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE601HBA.HBA_ZERO.HBA_110_190.delay.X  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_ZERO.HBA_110_190.delay.Y  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE601HBA.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE601HBA.HBA_ZERO.HBA_170_230.delay.X  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_ZERO.HBA_170_230.delay.Y  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE601HBA.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE601HBA.HBA_ZERO.HBA_210_250.delay.X  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_ZERO.HBA_210_250.delay.Y  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE601HBA.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE601HBA.HBA_ONE.HBA_110_190.delay.X  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_ONE.HBA_110_190.delay.Y  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE601HBA.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE601HBA.HBA_ONE.HBA_170_230.delay.X  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_ONE.HBA_170_230.delay.Y  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE601HBA.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE601HBA.HBA_ONE.HBA_210_250.delay.X  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_ONE.HBA_210_250.delay.Y  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE601HBA.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE601HBA.HBA_DUAL_INNER.HBA_110_190.delay.X  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE601HBA.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE601HBA.HBA_DUAL_INNER.HBA_170_230.delay.X  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE601HBA.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE601HBA.HBA_DUAL_INNER.HBA_210_250.delay.X  =   1.100000e-06
+PIC.Core.DE601HBA.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   1.100000e-06
+PIC.Core.DE602LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.DE602LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.DE602LBA.LBA_INNER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.DE602LBA.LBA_INNER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.DE602LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.DE602LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.DE602LBA.LBA_INNER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.DE602LBA.LBA_INNER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.DE602LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.DE602LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.DE602LBA.LBA_INNER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.DE602LBA.LBA_INNER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.DE602LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.DE602LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.DE602LBA.LBA_INNER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.DE602LBA.LBA_INNER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.DE602LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.DE602LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.DE602LBA.LBA_OUTER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.DE602LBA.LBA_OUTER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.DE602LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.DE602LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.DE602LBA.LBA_OUTER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.DE602LBA.LBA_OUTER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.DE602LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.DE602LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.DE602LBA.LBA_OUTER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.DE602LBA.LBA_OUTER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.DE602LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.DE602LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.DE602LBA.LBA_OUTER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.DE602LBA.LBA_OUTER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE602HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE602HBA.HBA_JOINED.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_JOINED.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE602HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE602HBA.HBA_JOINED.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_JOINED.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE602HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE602HBA.HBA_JOINED.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_JOINED.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ZERO.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ZERO.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ZERO.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ZERO.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ZERO.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ZERO.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ONE.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ONE.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ONE.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ONE.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ONE.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_ONE.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL_INNER.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL_INNER.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL_INNER.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.DE602HBA.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.DE603LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.DE603LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.DE603LBA.LBA_INNER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.DE603LBA.LBA_INNER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.DE603LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.DE603LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.DE603LBA.LBA_INNER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.DE603LBA.LBA_INNER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.DE603LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.DE603LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.DE603LBA.LBA_INNER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.DE603LBA.LBA_INNER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.DE603LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.DE603LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.DE603LBA.LBA_INNER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.DE603LBA.LBA_INNER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.DE603LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.DE603LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.DE603LBA.LBA_OUTER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.DE603LBA.LBA_OUTER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.DE603LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.DE603LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.DE603LBA.LBA_OUTER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.DE603LBA.LBA_OUTER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.DE603LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.DE603LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.DE603LBA.LBA_OUTER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.DE603LBA.LBA_OUTER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.DE603LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.DE603LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.DE603LBA.LBA_OUTER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.DE603LBA.LBA_OUTER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE603HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE603HBA.HBA_JOINED.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_JOINED.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE603HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE603HBA.HBA_JOINED.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_JOINED.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE603HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE603HBA.HBA_JOINED.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_JOINED.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ZERO.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ZERO.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ZERO.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ZERO.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ZERO.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ZERO.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ONE.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ONE.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ONE.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ONE.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ONE.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_ONE.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL_INNER.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL_INNER.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL_INNER.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.DE603HBA.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.DE604LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.DE604LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.DE604LBA.LBA_INNER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.DE604LBA.LBA_INNER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.DE604LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.DE604LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.DE604LBA.LBA_INNER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.DE604LBA.LBA_INNER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.DE604LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.DE604LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.DE604LBA.LBA_INNER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.DE604LBA.LBA_INNER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.DE604LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.DE604LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.DE604LBA.LBA_INNER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.DE604LBA.LBA_INNER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.DE604LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.DE604LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.DE604LBA.LBA_OUTER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.DE604LBA.LBA_OUTER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.DE604LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.DE604LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.DE604LBA.LBA_OUTER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.DE604LBA.LBA_OUTER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.DE604LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.DE604LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.DE604LBA.LBA_OUTER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.DE604LBA.LBA_OUTER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.DE604LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.DE604LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.DE604LBA.LBA_OUTER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.DE604LBA.LBA_OUTER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE604HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE604HBA.HBA_JOINED.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_JOINED.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE604HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE604HBA.HBA_JOINED.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_JOINED.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE604HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE604HBA.HBA_JOINED.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_JOINED.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ZERO.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ZERO.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ZERO.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ZERO.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ZERO.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ZERO.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ONE.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ONE.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ONE.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ONE.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ONE.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_ONE.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL_INNER.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL_INNER.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL_INNER.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.DE604HBA.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.DE605LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.DE605LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.DE605LBA.LBA_INNER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.DE605LBA.LBA_INNER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.DE605LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.DE605LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.DE605LBA.LBA_INNER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.DE605LBA.LBA_INNER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.DE605LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.DE605LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.DE605LBA.LBA_INNER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.DE605LBA.LBA_INNER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.DE605LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.DE605LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.DE605LBA.LBA_INNER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.DE605LBA.LBA_INNER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.DE605LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.DE605LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.DE605LBA.LBA_OUTER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.DE605LBA.LBA_OUTER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.DE605LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.DE605LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.DE605LBA.LBA_OUTER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.DE605LBA.LBA_OUTER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.DE605LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.DE605LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.DE605LBA.LBA_OUTER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.DE605LBA.LBA_OUTER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.DE605LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.DE605LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.DE605LBA.LBA_OUTER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.DE605LBA.LBA_OUTER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE605HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE605HBA.HBA_JOINED.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_JOINED.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE605HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE605HBA.HBA_JOINED.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_JOINED.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE605HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE605HBA.HBA_JOINED.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_JOINED.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ZERO.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ZERO.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ZERO.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ZERO.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ZERO.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ZERO.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ONE.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ONE.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ONE.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ONE.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ONE.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_ONE.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL_INNER.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL_INNER.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL_INNER.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.DE605HBA.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.FR606LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.FR606LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.FR606LBA.LBA_INNER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.FR606LBA.LBA_INNER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.FR606LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.FR606LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.FR606LBA.LBA_INNER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.FR606LBA.LBA_INNER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.FR606LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.FR606LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.FR606LBA.LBA_INNER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.FR606LBA.LBA_INNER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.FR606LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.FR606LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.FR606LBA.LBA_INNER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.FR606LBA.LBA_INNER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.FR606LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.FR606LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.FR606LBA.LBA_OUTER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.FR606LBA.LBA_OUTER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.FR606LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.FR606LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.FR606LBA.LBA_OUTER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.FR606LBA.LBA_OUTER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.FR606LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.FR606LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.FR606LBA.LBA_OUTER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.FR606LBA.LBA_OUTER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.FR606LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.FR606LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.FR606LBA.LBA_OUTER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.FR606LBA.LBA_OUTER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.FR606HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.FR606HBA.HBA_JOINED.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_JOINED.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.FR606HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.FR606HBA.HBA_JOINED.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_JOINED.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.FR606HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.FR606HBA.HBA_JOINED.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_JOINED.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ZERO.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ZERO.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ZERO.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ZERO.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ZERO.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ZERO.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ONE.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ONE.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ONE.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ONE.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ONE.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_ONE.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL_INNER.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL_INNER.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL_INNER.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.FR606HBA.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.SE607LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.SE607LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.SE607LBA.LBA_INNER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.SE607LBA.LBA_INNER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.SE607LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.SE607LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.SE607LBA.LBA_INNER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.SE607LBA.LBA_INNER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.SE607LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.SE607LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.SE607LBA.LBA_INNER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.SE607LBA.LBA_INNER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.SE607LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.SE607LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.SE607LBA.LBA_INNER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.SE607LBA.LBA_INNER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.SE607LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.SE607LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.SE607LBA.LBA_OUTER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.SE607LBA.LBA_OUTER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.SE607LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.SE607LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.SE607LBA.LBA_OUTER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.SE607LBA.LBA_OUTER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.SE607LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.SE607LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.SE607LBA.LBA_OUTER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.SE607LBA.LBA_OUTER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.SE607LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.SE607LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.SE607LBA.LBA_OUTER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.SE607LBA.LBA_OUTER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.SE607HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.SE607HBA.HBA_JOINED.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_JOINED.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.SE607HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.SE607HBA.HBA_JOINED.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_JOINED.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.SE607HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.SE607HBA.HBA_JOINED.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_JOINED.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ZERO.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ZERO.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ZERO.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ZERO.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ZERO.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ZERO.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ONE.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ONE.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ONE.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ONE.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ONE.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_ONE.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL_INNER.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL_INNER.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL_INNER.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.SE607HBA.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.UK608LBA.LBA_INNER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.UK608LBA.LBA_INNER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.UK608LBA.LBA_INNER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.UK608LBA.LBA_INNER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.UK608LBA.LBA_INNER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.UK608LBA.LBA_INNER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.UK608LBA.LBA_INNER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.UK608LBA.LBA_INNER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.UK608LBA.LBA_INNER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.UK608LBA.LBA_INNER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.UK608LBA.LBA_INNER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.UK608LBA.LBA_INNER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.UK608LBA.LBA_INNER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.UK608LBA.LBA_INNER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.UK608LBA.LBA_INNER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.UK608LBA.LBA_INNER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.UK608LBA.LBA_OUTER.LBA_10_70.phase0.X =   0.000000e+00
+PIC.Core.UK608LBA.LBA_OUTER.LBA_10_70.phase0.Y =   0.000000e+00
+PIC.Core.UK608LBA.LBA_OUTER.LBA_10_70.delay.X  =   0.000000e+00
+PIC.Core.UK608LBA.LBA_OUTER.LBA_10_70.delay.Y  =   0.000000e+00
+PIC.Core.UK608LBA.LBA_OUTER.LBA_30_70.phase0.X =   0.000000e+00
+PIC.Core.UK608LBA.LBA_OUTER.LBA_30_70.phase0.Y =   0.000000e+00
+PIC.Core.UK608LBA.LBA_OUTER.LBA_30_70.delay.X  =   0.000000e+00
+PIC.Core.UK608LBA.LBA_OUTER.LBA_30_70.delay.Y  =   0.000000e+00
+PIC.Core.UK608LBA.LBA_OUTER.LBA_10_90.phase0.X =   0.000000e+00
+PIC.Core.UK608LBA.LBA_OUTER.LBA_10_90.phase0.Y =   0.000000e+00
+PIC.Core.UK608LBA.LBA_OUTER.LBA_10_90.delay.X  =   0.000000e+00
+PIC.Core.UK608LBA.LBA_OUTER.LBA_10_90.delay.Y  =   0.000000e+00
+PIC.Core.UK608LBA.LBA_OUTER.LBA_30_90.phase0.X =   0.000000e+00
+PIC.Core.UK608LBA.LBA_OUTER.LBA_30_90.phase0.Y =   0.000000e+00
+PIC.Core.UK608LBA.LBA_OUTER.LBA_30_90.delay.X  =   0.000000e+00
+PIC.Core.UK608LBA.LBA_OUTER.LBA_30_90.delay.Y  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_JOINED.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.UK608HBA.HBA_JOINED.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.UK608HBA.HBA_JOINED.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_JOINED.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_JOINED.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.UK608HBA.HBA_JOINED.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.UK608HBA.HBA_JOINED.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_JOINED.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_JOINED.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.UK608HBA.HBA_JOINED.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.UK608HBA.HBA_JOINED.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_JOINED.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ZERO.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ZERO.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ZERO.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ZERO.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ZERO.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ZERO.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ZERO.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ZERO.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ZERO.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ZERO.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ONE.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ONE.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ONE.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ONE.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ONE.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ONE.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ONE.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ONE.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ONE.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ONE.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ONE.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_ONE.HBA_210_250.delay.Y  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL_INNER.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL_INNER.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL_INNER.HBA_110_190.delay.X  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL_INNER.HBA_110_190.delay.Y  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL_INNER.HBA_170_230.phase0.X =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL_INNER.HBA_170_230.phase0.Y =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL_INNER.HBA_170_230.delay.X  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL_INNER.HBA_170_230.delay.Y  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL_INNER.HBA_210_250.phase0.X =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL_INNER.HBA_210_250.phase0.Y =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL_INNER.HBA_210_250.delay.X  =   0.000000e+00
+PIC.Core.UK608HBA.HBA_DUAL_INNER.HBA_210_250.delay.Y  =   0.000000e+00
diff --git a/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.run b/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.run
new file mode 100755
index 0000000000000000000000000000000000000000..45a3b1b346755e6a050976eb330758801d5bd198
--- /dev/null
+++ b/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.run
@@ -0,0 +1,4 @@
+#!/bin/bash
+TESTNAME=`basename "${0%%.run}"`
+
+../runtest.sh "$TESTNAME"
diff --git a/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.sh b/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.sh
new file mode 100755
index 0000000000000000000000000000000000000000..a007f10647eccd9da003a7b4455e75a6b532a521
--- /dev/null
+++ b/SubSystems/Online_Cobalt/test/Correlator/tCorrelate_1sec_1st_5sb_2saps_noflagging.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+./runctest.sh "$(basename "${0%%.sh}")"
+