diff --git a/manifest-build.yml b/manifest-build.yml
index 9fa542870e756775d05cb039dd5143fd97161518..9be09ab60d1e5f02671373335f1525055ce7c9d8 100644
--- a/manifest-build.yml
+++ b/manifest-build.yml
@@ -30,6 +30,7 @@ variables:
   # CI/CD variable GITLAB_PRIVATE_KEY of the manifest repository. The public key has
   # been added as a deploy key in GitLab's repository settings for all contained
   # repositories.
+  - echo "${LOGPREFIX} Setup SSH"
   - eval $(ssh-agent -s)
   - echo "$GITLAB_PRIVATE_KEY" | tr -d '\r' | ssh-add -
   - mkdir -p ~/.ssh
@@ -44,6 +45,7 @@ variables:
   - chmod 644 ~/.ssh/known_hosts
 
 .repo_checkout: &repo_checkout
+  - echo "${LOGPREFIX} Perform repo checkout"
   - cd ${CI_PROJECT_DIR}
   - repo init --submodules -u ${CI_REPOSITORY_URL}
       -b refs/pipelines/${CI_PIPELINE_ID}
@@ -56,6 +58,7 @@ variables:
     SRCREVS_FILE="${CI_PROJECT_DIR}/${BUILDPATH}/${IMAGEPATH}/BUILD_SRCREVS.log"
     if [ -d "$( dirname "${SRCREVS_FILE}" )" ];then
         buildhistory-collect-srcrevs > ${SRCREVS_FILE}
+        echo "${LOGPREFIX} buildhistory-collect-srcrevs:"
         cat ${SRCREVS_FILE}
     fi
 
@@ -80,19 +83,19 @@ variables:
 
 .build_script: &build_script
   # setup build environment
-  - echo "Build configuration MACHINE=${CI_PARAM_MACHINE}
+  - echo "${LOGPREFIX} Build configuration MACHINE=${CI_PARAM_MACHINE}
       DISTRO=${CI_PARAM_DISTRO} IMAGE=${CI_PARAM_IMAGE}"
   - echo "BUILD_MACHINE=$CI_PARAM_MACHINE" > build.env
   - echo "BUILD_IMAGE=$CI_PARAM_IMAGE" >> build.env
   - echo "BUILD_DISTRO=$CI_PARAM_DISTRO" >> build.env
-  - echo "Using build dir ${BUILDPATH}"
+  - echo "${LOGPREFIX} Using build dir ${BUILDPATH}"
   - export MACHINE="${CI_PARAM_MACHINE}"
   - export DISTRO="${CI_PARAM_DISTRO}"
   - export EULA="1"
   - source ./"${SETUPSCRIPT}" "${BUILDPATH}"
   # start build
   - echo -e "section_start:`date +%s`:bitbake_run\r\e[0KBitbake Log"
-  - echo "bitbake ${CI_PARAM_IMAGE} -c ${BITBAKE_TASK}"
+  - echo "${LOGPREFIX} bitbake ${CI_PARAM_IMAGE} -c ${BITBAKE_TASK}"
   - bitbake "${CI_PARAM_IMAGE}" -c "${BITBAKE_TASK}"
   - echo -e "section_end:`date +%s`:bitbake_run\r\e[0K"
 
@@ -102,6 +105,7 @@ variables:
     SETUPSCRIPT: "setup-environment"
     INSTALLSCRIPTS: "fng-install.sh fngsystem-self-update.sh"
     BITBAKE_TASK: "build"
+    LOGPREFIX: "CI:build:"
   before_script:
     - *docker_check
     - *setup_ssh
@@ -110,7 +114,6 @@ variables:
     - *build_script
     - *collect_srcrevs
     - *dump_install_command
-
   artifacts:
     paths:
       - "${BUILDPATH}/${IMAGEPATH}/*"
@@ -118,85 +121,14 @@ variables:
     reports:
       dotenv: build.env
 
-.package:
-  variables:
-    CI_PARAM_PACKAGE_FTP: "false"
-  after_script:
-    - |-
-      # Package release files
-      [ -e build.env ] && source build.env
-      BUILDPATH="build-${BUILD_DISTRO}-${BUILD_MACHINE}"
-      [ -z "${ARTIFACTS_IMAGE_PATH}" ] && \
-        ARTIFACTS_IMAGE_PATH="${BUILDPATH}/${IMAGEBASEPATH}/${BUILD_MACHINE}"
-      [ -z "${ARTIFACTS_LICENSES_PATH}" ] && \
-        ARTIFACTS_LICENSES_PATH="${BUILDPATH}/${LICENSESPATH}"
-      [ -z "${ARTIFACTS_SDK_PATH}" ] && \
-        ARTIFACTS_SDK_PATH="${BUILDPATH}/${SDKPATH}"
-
-      if $CI_PARAM_PACKAGE_FTP; then
-          UPLOAD_PARAM="" # don't store as gitlab artifact
-          OUTDIR_BASE="/artifacts-ftp"
-      else
-          UPLOAD_PARAM="--outputdir-upload=release"
-          OUTDIR_BASE="/artifacts"
-      fi
-
-      # If we are on the master branch and a tag is set
-      # we tread it as release
-      if [ -n "$CI_COMMIT_TAG" ];then
-        outdir="${OUTDIR_BASE}-yocto/Releases"
-        [ "${BUILD_DISTRO}" = "guf-fngsystem" ] && \
-          outdir="${OUTDIR_BASE}-fngsystem"
-      else
-        outdir="${OUTDIR_BASE}-yocto/Interne_Releases"
-        [ "${BUILD_DISTRO}" = "guf-fngsystem" ] && \
-          outdir="${OUTDIR_BASE}-fngsystem/CI_Builds"
-      fi
-
-      script=".gitlab-ci/package_release.py"
-      [ ! -x "$script" ] && script=".repo/manifests/$script"
-      [ ! -x "$script" ] && echo "Failed to find package_release script"
-
-      # Image if available
-      if [ -d "${ARTIFACTS_IMAGE_PATH}" ];then
-          $script \
-              --images-dir="${ARTIFACTS_IMAGE_PATH}" \
-              --licenses-dir="${ARTIFACTS_LICENSES_PATH}" \
-              --doc-dir=. \
-              --outputdir-local=${outdir} \
-              $UPLOAD_PARAM
-      fi
-      # SDK if available
-      echo "Check for SDK to upload"
-      if [ -d "${ARTIFACTS_SDK_PATH}" ];then
-          echo "SDK path exists, call package_release.py"
-          $script \
-              --sdk-dir=${ARTIFACTS_SDK_PATH} \
-              --outputdir-local="${outdir}"
-      fi
-
-      # Generate AlphaPlan FWR articles if release tag is set
-      apscript=".gitlab-ci/alphaplan_fwr.py"
-
-      if [ -n "$CI_COMMIT_TAG" ] && \
-        [ -d "${ARTIFACTS_IMAGE_PATH}" ] && \
-        [[ "${CI_PARAM_PACKAGE_FTP}" == "false" ]];then
-        # Check if alphaplan fwr script is available
-        [ ! -x "${apscript}" ] && \
-          echo "Failed to find alphaplan_fwr script" && \
-          exit 1
-        # Call script
-        ${apscript} \
-              --images-dir="${ARTIFACTS_IMAGE_PATH}" \
-              --outputdir-local=${outdir} \
-              --outputdir-upload=release
-      fi
-
 .prepare_test:
+  variables:
+    LOGPREFIX: "CI:test:"
   before_script:
     - *setup_ssh
     - |-
       # Copy artifacts to local server for automated tests
+      echo "${LOGPREFIX} Copy files for automated tests using package_release"
       .gitlab-ci/package_release.py \
         --images-dir="${BUILDPATH}/${IMAGEPATH}" \
         --outputdir-local="${DEPLOYPATH_TEST}"
diff --git a/manifest-package.yml b/manifest-package.yml
new file mode 100644
index 0000000000000000000000000000000000000000..55b721ffc1818b58ef74cf15e844535a970b113e
--- /dev/null
+++ b/manifest-package.yml
@@ -0,0 +1,113 @@
+---
+.package:
+  variables:
+    CI_PARAM_PACKAGE_FTP: "false"
+    LOGPREFIX: "CI:package:"
+  after_script:
+    - |-
+      # Package release files
+      # TODO: At the moment this script is used for
+      # - image deployment,
+      # - sdk build,
+      # - image and sdk ftp upload
+      # - and artifact deployment for automated tests.
+      # Some usecases require individual processing, which leads to
+      # high script complexity. That should be improved.
+
+      echo "${LOGPREFIX} Assemble build variables"
+      # We need to source the build.env file which is generated by the
+      # previous build step. This is a workaround to get the environment
+      # variables in the after_script step.
+      [ -e build.env ] && source build.env
+      BUILDPATH="build-${BUILD_DISTRO}-${BUILD_MACHINE}"
+      [ -z "${ARTIFACTS_IMAGE_PATH}" ] && \
+        ARTIFACTS_IMAGE_PATH="${BUILDPATH}/${IMAGEBASEPATH}/${BUILD_MACHINE}"
+      [ -z "${ARTIFACTS_LICENSES_PATH}" ] && \
+        ARTIFACTS_LICENSES_PATH="${BUILDPATH}/${LICENSESPATH}"
+      [ -z "${ARTIFACTS_SDK_PATH}" ] && \
+        ARTIFACTS_SDK_PATH="${BUILDPATH}/${SDKPATH}"
+
+      if ${CI_PARAM_PACKAGE_FTP}; then
+          UPLOAD_PARAM="" # don't store as gitlab artifact
+          OUTDIR_BASE="/artifacts-ftp"
+      else
+          UPLOAD_PARAM="--outputdir-upload=release"
+          OUTDIR_BASE="/artifacts"
+      fi
+
+      # If we are on the master branch and a tag is set
+      # we tread it as release
+      if [ -n "${CI_COMMIT_TAG}" ];then
+        outdir="${OUTDIR_BASE}-yocto/Releases"
+        [ "${BUILD_DISTRO}" = "guf-fngsystem" ] && \
+          outdir="${OUTDIR_BASE}-fngsystem"
+      else
+        outdir="${OUTDIR_BASE}-yocto/Interne_Releases"
+        [ "${BUILD_DISTRO}" = "guf-fngsystem" ] && \
+          outdir="${OUTDIR_BASE}-fngsystem/CI_Builds"
+      fi
+
+      # Print vars for debugging purposes
+      echo "${LOGPREFIX} BUILDPATH=${BUILDPATH}"
+      echo "${LOGPREFIX} ARTIFACTS_IMAGE_PATH=${ARTIFACTS_IMAGE_PATH}"
+      echo "${LOGPREFIX} ARTIFACTS_LICENSES_PATH=${ARTIFACTS_LICENSES_PATH}"
+      echo "${LOGPREFIX} ARTIFACTS_SDK_PATH=${ARTIFACTS_SDK_PATH}"
+      echo "${LOGPREFIX} UPLOAD_PARAM=${UPLOAD_PARAM}"
+      echo "${LOGPREFIX} outdir=${outdir}"
+
+      # Check if the package_release script is available
+      script=".gitlab-ci/package_release.py"
+      # Change script path if ?
+      [ ! -x "${script}" ] && script=".repo/manifests/${script}"
+      if [ ! -x "${script}" ]; then
+            echo "${LOGPREFIX} Failed to find package_release script"
+            exit 1
+      fi
+
+      # Copy image if available
+      echo "${LOGPREFIX} Check if a image build exists"
+      if [ -d "${ARTIFACTS_IMAGE_PATH}" ];then
+          echo "${LOGPREFIX} Image dir found, execute ${script}"
+          ${script} \
+              --images-dir="${ARTIFACTS_IMAGE_PATH}" \
+              --licenses-dir="${ARTIFACTS_LICENSES_PATH}" \
+              --doc-dir=. \
+              --outputdir-local=${outdir} \
+              $UPLOAD_PARAM
+      else
+          echo "${LOGPREFIX} No image found"
+      fi
+
+      # Copy SDK if available
+      echo "${LOGPREFIX} Check if a SDK build exists"
+      if [ -d "${ARTIFACTS_SDK_PATH}" ];then
+          echo "${LOGPREFIX} SDK dir found, execute ${script}"
+          ${script} \
+              --sdk-dir=${ARTIFACTS_SDK_PATH} \
+              --outputdir-local="${outdir}"
+      else
+          echo "${LOGPREFIX} No SDK found"
+      fi
+
+      # Generate AlphaPlan FWR articles if
+      # - a release tag is set
+      # - this is an image build and
+      # - the files were deployed to local network (drive Z)
+      apscript=".gitlab-ci/alphaplan_fwr.py"
+      echo "${LOGPREFIX} Check if AlphaPlan FWR articles need to be generated"
+      if [ -n "$CI_COMMIT_TAG" ] && [ -d "${ARTIFACTS_IMAGE_PATH}" ] && \
+        [[ "${CI_PARAM_PACKAGE_FTP}" == "false" ]];then
+          echo "${LOGPREFIX} Generate AlphaPlan articles, execute ${apscript}"
+          # Check if alphaplan fwr script is available
+          if [ ! -x "${apscript}" ]; then
+              echo "${LOGPREFIX} Failed to find alphaplan_fwr script"
+              exit 1
+          fi
+          # Call script
+          ${apscript} \
+                --images-dir="${ARTIFACTS_IMAGE_PATH}" \
+                --outputdir-local=${outdir} \
+                --outputdir-upload=release
+      else
+          echo "${LOGPREFIX} No AlphaPlan FWR articles need to be generated"
+      fi
diff --git a/manifest.yml b/manifest.yml
index 477b19a4fb89f0bbd956b0a47789833839485d58..ef407841ac9a93eadeddf81f24d9332e4db5932e 100644
--- a/manifest.yml
+++ b/manifest.yml
@@ -5,6 +5,7 @@
 include:
   - local: manifest-build.yml
   - local: common.yml
+  - local: manifest-package.yml
 
 stages:
   - retrigger
@@ -229,6 +230,8 @@ build:merge_request:
       when: manual
       allow_failure: true
   script:
+    # Workaround: We need a command in the script section to be able to run the
+    # after_script section of the package step.
     - echo
   artifacts:
     paths:
@@ -250,6 +253,8 @@ build:merge_request:
       when: manual
       allow_failure: true
   script:
+    # Workaround: We need a command in the script section to be able to run the
+    # after_script section of the package step.
     - echo
   timeout: 30m