diff --git a/cicd/stages/build.yml b/cicd/stages/build.yml
index 1252eb822d690d20204107abdff70b8a2d7def98..33e7a36dfff924478f44130bea1718cdc6167d7f 100644
--- a/cicd/stages/build.yml
+++ b/cicd/stages/build.yml
@@ -1,5 +1,53 @@
 # QDS_CI_BUILD_QT_VERSION_ANDROID and QDS_CI_BUILD_QT_VERSION_WASM are the tags for the docker images.
 # https://git.qt.io/design-studio/maintenance/docker-images/container_registry
+.build-components: &build-components
+  - pushd 3rdparty/qtquickdesigner-components
+  - |
+    cmake \
+    -S . \
+    -G Ninja \
+    -DCMAKE_BUILD_TYPE=Release \
+    -DCMAKE_TOOLCHAIN_FILE=${QDS_CI_JOB_QT_ANDROID_PATH}/lib/cmake/Qt6/qt.toolchain.cmake \
+    -DANDROID_SDK_ROOT=${DOCKER_ENV_ANDROID_SDK_ROOT} \
+    -DANDROID_NDK_ROOT=${DOCKER_ENV_ANDROID_NDK_ROOT} \
+    -DQT_HOST_PATH=${DOCKER_ENV_QT_PATH_LINUX_GCC_64} \
+    -DFLOWVIEW_AUTO_QMLDIR=ON \
+    -DCMAKE_INSTALL_PREFIX=${QDS_CI_JOB_QT_ANDROID_PATH}
+  - cmake --build .
+  - cmake --install .
+  - popd
+
+.build-android-apps: &build-android-apps
+  - |
+    cmake \
+    -S . \
+    -B ${QDS_CI_JOB_BUILD_PATH} \
+    -G Ninja \
+    -DCMAKE_BUILD_TYPE=Release \
+    -DCMAKE_TOOLCHAIN_FILE=${QDS_CI_JOB_QT_ANDROID_PATH}/lib/cmake/Qt6/qt.toolchain.cmake \
+    -DANDROID_SDK_ROOT=${DOCKER_ENV_ANDROID_SDK_ROOT} \
+    -DANDROID_NDK_ROOT=${DOCKER_ENV_ANDROID_NDK_ROOT} \
+    -DQT_HOST_PATH=${DOCKER_ENV_QT_PATH_LINUX_GCC_64} \
+    -DCMAKE_INSTALL_PREFIX=${QDS_CI_JOB_QT_ANDROID_PATH} \
+    -DANDROID_OPENSSL_PATH=${QDS_CI_JOB_OPENSSL_PATH} \
+    -DBUILD_EXAMPLES=OFF
+  - cmake --build ${QDS_CI_JOB_BUILD_PATH} --target aab
+
+.copy-and-sign-apks: &copy-and-sign-apks
+  - cp -r ${QDS_CI_JOB_BUILD_PATH}/src/android-build/build/outputs/apk/release/* ${QDS_CI_JOB_ARTIFACTS_PATH_APP}
+  - cp -r ${QDS_CI_JOB_BUILD_PATH}/tests/android-build/build/outputs/apk/release/* ${QDS_CI_JOB_ARTIFACTS_PATH_TEST}
+  - echo ${QDS_VAR_PASS} | ${DOCKER_ENV_ANDROID_SDK_ROOT}/build-tools/30.0.3/apksigner sign -verbose -ks ${CI_PROJECT_DIR}/cicd/android/android_release.keystore -out ${QDS_CI_JOB_ARTIFACTS_PATH_APP}/android-build-release.apk ${QDS_CI_JOB_ARTIFACTS_PATH_APP}/android-build-release-unsigned.apk
+  - echo ${QDS_VAR_PASS} | ${DOCKER_ENV_ANDROID_SDK_ROOT}/build-tools/30.0.3/apksigner sign -verbose -ks ${CI_PROJECT_DIR}/cicd/android/android_release.keystore -out ${QDS_CI_JOB_ARTIFACTS_PATH_TEST}/android-build-release.apk ${QDS_CI_JOB_ARTIFACTS_PATH_TEST}/android-build-release-unsigned.apk
+  - rm -f ${QDS_CI_JOB_ARTIFACTS_PATH_APP}/android-build-release-unsigned.apk ${QDS_CI_JOB_ARTIFACTS_PATH_TEST}/android-build-release-unsigned.apk
+
+.copy-and-sign-aab: &copy-and-sign-aab
+  - |
+    if [[ -n ${CI_COMMIT_TAG} ]];
+    then
+      cp -r ${QDS_CI_JOB_BUILD_PATH}/src/android-build/build/outputs/bundle/release/* ${QDS_CI_JOB_ARTIFACTS_PATH_APP}
+      /usr/bin/jarsigner -keystore ${CI_PROJECT_DIR}/cicd/android/android_release.keystore ${QDS_CI_JOB_ARTIFACTS_PATH_APP}/android-build-release.aab designviewer -storepass ${QDS_VAR_PASS}
+    fi
+
 build-android:
   extends: .pipeline_common
   stage: build
@@ -29,40 +77,8 @@ build-android:
     expire_in: 1 week
   script:
     - mkdir -p ${QDS_CI_JOB_ARTIFACTS_PATH_APP} ${QDS_CI_JOB_ARTIFACTS_PATH_TEST}
-    - ls -l ${QDS_CI_JOB_OPENSSL_PATH}
     - export QDS_CI_JOB_QT_ANDROID_PATH="${DOCKER_ENV_QT_PATH_WITH_VERSION}/android_${QDS_CI_JOB_TARGET_ARCH}"
-    - echo ${QDS_CI_JOB_QT_ANDROID_PATH}; ls -l ${QDS_CI_JOB_QT_ANDROID_PATH}
-    - pushd 3rdparty/qtquickdesigner-components
-    - export
-    - |
-      cmake \
-      -S . \
-      -G Ninja \
-      -DCMAKE_BUILD_TYPE=Release \
-      -DCMAKE_TOOLCHAIN_FILE=${QDS_CI_JOB_QT_ANDROID_PATH}/lib/cmake/Qt6/qt.toolchain.cmake \
-      -DANDROID_SDK_ROOT=${DOCKER_ENV_ANDROID_SDK_ROOT} \
-      -DANDROID_NDK_ROOT=${DOCKER_ENV_ANDROID_NDK_ROOT} \
-      -DQT_HOST_PATH=${DOCKER_ENV_QT_PATH_LINUX_GCC_64} \
-      -DCMAKE_INSTALL_PREFIX=${QDS_CI_JOB_QT_ANDROID_PATH}
-    - cmake --build .
-    - cmake --install .
-    - popd
-    - |
-      cmake \
-      -S . \
-      -B ${QDS_CI_JOB_BUILD_PATH} \
-      -G Ninja \
-      -DCMAKE_BUILD_TYPE=Release \
-      -DCMAKE_TOOLCHAIN_FILE=${QDS_CI_JOB_QT_ANDROID_PATH}/lib/cmake/Qt6/qt.toolchain.cmake \
-      -DANDROID_SDK_ROOT=${DOCKER_ENV_ANDROID_SDK_ROOT} \
-      -DANDROID_NDK_ROOT=${DOCKER_ENV_ANDROID_NDK_ROOT} \
-      -DQT_HOST_PATH=${DOCKER_ENV_QT_PATH_LINUX_GCC_64} \
-      -DCMAKE_INSTALL_PREFIX=${QDS_CI_JOB_QT_ANDROID_PATH} \
-      -DANDROID_OPENSSL_PATH=${QDS_CI_JOB_OPENSSL_PATH} \
-      -DBUILD_EXAMPLES=OFF
-    - cmake --build ${QDS_CI_JOB_BUILD_PATH} --target all
-    - cp -r ${QDS_CI_JOB_BUILD_PATH}/src/android-build/build/outputs/apk/release/* ${QDS_CI_JOB_ARTIFACTS_PATH_APP}
-    - cp -r ${QDS_CI_JOB_BUILD_PATH}/tests/android-build/build/outputs/apk/release/* ${QDS_CI_JOB_ARTIFACTS_PATH_TEST}
-    - echo designviewer | ${DOCKER_ENV_ANDROID_SDK_ROOT}/build-tools/30.0.3/apksigner sign -verbose -ks ${CI_PROJECT_DIR}/cicd/android/android_release.keystore -out ${QDS_CI_JOB_ARTIFACTS_PATH_APP}/android-build-release.apk ${QDS_CI_JOB_ARTIFACTS_PATH_APP}/android-build-release-unsigned.apk
-    - echo designviewer | ${DOCKER_ENV_ANDROID_SDK_ROOT}/build-tools/30.0.3/apksigner sign -verbose -ks ${CI_PROJECT_DIR}/cicd/android/android_release.keystore -out ${QDS_CI_JOB_ARTIFACTS_PATH_TEST}/android-build-release.apk ${QDS_CI_JOB_ARTIFACTS_PATH_TEST}/android-build-release-unsigned.apk
-    - rm -f ${QDS_CI_JOB_ARTIFACTS_PATH_APP}/android-build-release-unsigned.apk ${QDS_CI_JOB_ARTIFACTS_PATH_TEST}/android-build-release-unsigned.apk
+    - *build-components
+    - *build-android-apps
+    - *copy-and-sign-apks
+    - *copy-and-sign-aab
diff --git a/cicd/stages/test.yml b/cicd/stages/test.yml
index 3b2cce353ca21ca31063770b3d4994a72a88a4b9..f77b55f0bc7237c376421691f652484f5de0e6c5 100644
--- a/cicd/stages/test.yml
+++ b/cicd/stages/test.yml
@@ -39,7 +39,7 @@ test-x86_64:
       counter=0
       while [ -n "$(adb shell pidof -s io.qt.qtdesignviewer.test)" ]; do
         echo "Waiting for test to finish"
-        sleep 0.1
+        sleep 1
         counter=$((counter+1))
         if [ $counter -gt 60 ]; then
           echo "Test did not finish in time"
diff --git a/src/android/AndroidManifest.xml b/src/android/AndroidManifest.xml
index 83728774ee9431377edb941334d9f52be796695d..11e9abfa49a21398815a343164c5090cdbe2e7e0 100644
--- a/src/android/AndroidManifest.xml
+++ b/src/android/AndroidManifest.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="io.qt.qtdesignviewer"
-    android:installLocation="auto" android:versionCode="29" android:versionName="1.0.2">
+    android:installLocation="auto" android:versionCode="30" android:versionName="1.0.3">
     <!-- %%INSERT_PERMISSIONS -->
     <!-- %%INSERT_FEATURES -->
     <supports-screens android:anyDensity="true" android:largeScreens="true"
diff --git a/src/backend/importdummy.qml b/src/backend/importdummy.qml
index f0b1bc230de29f5643a4782b10cd9806d23627c3..cb75b90a43c052262c8814ef6a4cad3d2af710e6 100644
--- a/src/backend/importdummy.qml
+++ b/src/backend/importdummy.qml
@@ -29,7 +29,6 @@ import QtQuickUltralite.Extras
 import QtQuickUltralite.Layers
 
 import FlowView
-
 import Qt.labs.folderlistmodel
 
 import QtWebSockets
diff --git a/src/ui/main.qml b/src/ui/main.qml
index bd782663f6485d7ae737c616f32cf57d0750d7e5..91ed8c535874590e5903dfe618e17f91cf3f5554 100644
--- a/src/ui/main.qml
+++ b/src/ui/main.qml
@@ -219,7 +219,7 @@ Rectangle {
                     Layout.fillWidth: true
                     checkable: true
                     autoExclusive: true
-                    visible: false;
+                    visible: false
                     onClicked: {
                         stackLayout.currentIndex = 3
                         drawer.close()