diff --git a/README.md b/README.md
index 7f49828..0942ad9 100644
--- a/README.md
+++ b/README.md
@@ -14,21 +14,37 @@ cd composer
 ### List of available projects
 
 ```
-* ak3918ev200_vulture
-* gk7205v200_lite_baresip
-* gk7205v300_ultimate_oko
-* gk7205v300_ultimate_oko2
-* gk7205v300_ultimate_oko3
-* hi3516ev200_lite_repairer
-* hi3518ev200_cip37210                  Moved to LTS status
-* hi3518ev200_smarthome
-* hi3536dv100_backupper
-* t31_baresip                           Moved to LTS status
-* t31_lite_gateway
-* t31_lite_hs
-* t31_vixand
-* v3s_lichee
+* ak3918ev200_vulture                   -
+* gk7205v200_lite_huahui                Partnership project
+* gk7205v200_lite_meldana               Partnership project
+* gk7205v200_lite_pusk                  Partnership project
+* gk7205v200_lite_safel                 Partnership project
+* gk7205v200_ultimate_baresip           LTS status
+* gk7205v300_ultimate_oko               Stale
+* gk7205v300_ultimate_oko2              Stale
+* gk7205v300_ultimate_oko3              Stale
+* hi3516ev200_lite_repairer             Development
+* hi3516ev300_lite_meldana              Partnership project
+* hi3518ev200_cip37210                  LTS status
+* hi3518ev200_smarthome                 Development
+* hi3536dv100_backupper                 Development
+* msc313e_lite_baresip                  -
+* ssc337_ultimate_broadband             Partnership project
+* ssc338q_lite_ask                      Partnership project
+* t31_lite_baresip                      -
+* t31_lite_convoy                       Partnership project
+* t31_lite_faceter                      Partnership project
+* t31_lite_gateway                      Stale
+* t31_lite_hs                           -
+* t31_lite_vixand2                      Development
+* t31_vixand                            Stale
+* v3s_lichee                            -
 ```
 
 
-[logo]: https://openipc.org/assets/openipc-logo-black.svg
\ No newline at end of file
+[logo]: https://openipc.org/assets/openipc-logo-black.svg
+
+
+
+
+
diff --git a/projects/Readme.md b/projects/Readme.md
deleted file mode 100644
index 9d97b83..0000000
--- a/projects/Readme.md
+++ /dev/null
@@ -1,31 +0,0 @@
-
-## Actual projects
-
-* gk7205v200_lite_meldana
-* gk7205v200_ultimate_baresip
-* hi3516ev300_lite_meldana
-* hi3518ev200_cip37210
-* ssc338q_lite_pilot
-* t31_lite_convoy
-
-
-
-## Stale projects
-
-* gk7205v300_ultimate_oko
-* gk7205v300_ultimate_oko2
-* hi3516ev200_lite_repairer
-* hi3518ev200_smarthome
-* hi3536dv100_backupper
-* msc313e_lite_baresip
-* t31_lite_baresip
-* t31_lite_gateway
-* t31_lite_hs
-* t31_vixand
-
-
-
-## Unknown status
-
-* ak3918ev200_vulture
-* v3s_lichee
diff --git a/projects/gk7205v200_lite_safel/general/overlay/etc/hostname b/projects/gk7205v200_lite_safel/general/overlay/etc/hostname
deleted file mode 100644
index 04fe921..0000000
--- a/projects/gk7205v200_lite_safel/general/overlay/etc/hostname
+++ /dev/null
@@ -1 +0,0 @@
-safel
\ No newline at end of file
diff --git a/projects/ssc337_ultimate_broadband/building.sh b/projects/ssc337_ultimate_broadband/building.sh
new file mode 100755
index 0000000..1dad2a3
--- /dev/null
+++ b/projects/ssc337_ultimate_broadband/building.sh
@@ -0,0 +1,271 @@
+#!/bin/bash
+#
+# OpenIPC.org (c)
+#
+
+#
+# Constants
+#
+
+MAX_KERNEL_SIZE=0x200000              #    2MiB,  2097152
+MAX_KERNEL_SIZE_ULTIMATE=0x300000     #    3MiB,  3145728
+MAX_KERNEL_SIZE_EXPERIMENTAL=0x3E8480 # ~3.9MiB,  4097152
+MAX_ROOTFS_SIZE=0x500000              #    5MiB,  5242880
+MAX_ROOTFS_SIZE_ULTIMATE=0xA00000     #   10MiB, 10485760
+
+_d=$(date +"%y.%m.%d")
+OPENIPC_VER=$(echo OpenIPC v${_d:0:1}.${_d:1})
+unset _d
+
+SRC_CACHE_DIR="/tmp/buildroot_dl"
+LOCK_FILE="$(pwd)/openipc.lock"
+
+#
+# Functions
+#
+
+echo_c() {
+  # 30 grey, 31 red, 32 green, 33 yellow, 34 blue, 35 magenta, 36 cyan,37 white
+  echo -e "\e[1;$1m$2\e[0m"
+}
+
+check_or_set_lock() {
+  if [ -f "$LOCK_FILE" ] && ps -ax | grep "^\s*\b$(cat "$LOCK_FILE")\b" >/dev/null; then
+    echo_c 31 "Another instance running with PID $(cat "$LOCK_FILE")."
+    exit 1
+  fi
+
+  echo_c 32 "Starting OpenIPC builder."
+  echo $$ >$LOCK_FILE
+}
+
+build_list_of_projects() {
+  FUNCS=()
+  AVAILABLE_PROJECTS=$(find br-ext-chip-*/configs/* -name "*_defconfig")
+  local p
+  for p in $AVAILABLE_PROJECTS; do
+    p=${p##*/}; p=${p//_defconfig/}
+    FUNCS+=($p)
+  done
+}
+
+select_project() {
+  if [ $# -eq 0 ]; then
+    if [ -n "$(command -v fzf)" ]; then
+      local entries=$(echo $AVAILABLE_PROJECTS | sed "s/ /\n/g" | fzf)
+      [ -z "$entries" ] && echo_c 31 "Cancelled." && drop_lock_and_exit
+      BOARD=$(echo $entries | cut -d / -f 3 | awk -F_ '{printf "%s_%s", $1, $2}')
+    elif [ -n "$(command -v whiptail)" ]; then
+      local cmd="whiptail --title \"Available projects\" --menu \"Please select a project from the list:\" --notags 20 76 12"
+      local entry
+      for entry in $AVAILABLE_PROJECTS; do
+        local project=${entry##*/}; project=${project//_defconfig/}
+        local vendor=${entry%%/*}; vendor=${vendor##*-}
+        local flavor=${project##*_}
+        local chip=${project%%_*}
+        cmd="${cmd} \"${project}\" \"${vendor^} ${chip^^} ${flavor}\""
+      done
+      BOARD=$(eval "${cmd} 3>&1 1>&2 2>&3")
+      [ $? != 0 ] && echo_c 31 "Cancelled." && drop_lock_and_exit
+    else
+      echo -ne "Usage: $0 <variant>\nVariants:"
+      local i
+      for i in "${FUNCS[@]}"; do echo -n " ${i}"; done
+      echo
+      drop_lock_and_exit
+    fi
+  else
+    BOARD=$1
+  fi
+}
+
+drop_lock_and_exit() {
+  [ -f "$LOCK_FILE" ] && rm $LOCK_FILE
+  exit 0
+}
+
+log_and_run() {
+  local command=$1
+  echo_c 35 "$command"
+  $command
+}
+
+clone() {
+  sudo apt-get update -y
+  sudo apt-get install -y automake make wget cpio file autotools-dev bc build-essential curl fzf git libtool rsync unzip libncurses-dev lzop
+  git clone --depth=1 https://github.com/OpenIPC/firmware.git
+}
+
+fresh() {
+  BR_VER=2023.02.1
+
+  if [ -d "$SRC_CACHE_DIR" ]; then
+    echo_c 36 "Found cache directory."
+  else
+    echo_c 31 "Cache directory not found."
+    echo_c 34 "Creating cache directory ..."
+    log_and_run "mkdir -p ${SRC_CACHE_DIR}"
+    echo_c 34 "Done.\n"
+  fi
+
+  if [ -d "buildroot-${BR_VER}" ]; then
+    echo_c 36 "Found existing Buildroot directory."
+
+    if [ -d "buildroot-${BR_VER}/dl" ]; then
+      echo_c 36 "Found existing Buildroot downloads directory."
+      echo_c 34 "Copying Buildroot downloads to cache directory ..."
+      log_and_run "cp -rvf buildroot-${BR_VER}/dl/* ${SRC_CACHE_DIR}"
+      echo_c 34 "Done.\n"
+    fi
+
+    echo_c 34 "Cleaning source directory."
+    echo_c 35 "make distclean"
+    make distclean
+    echo_c 34 "Done.\n"
+  else
+    echo_c 31 "Buildroot sources not found."
+  fi
+
+  echo_c 34 "Downloading Buildroot sources to cache directory ..."
+  log_and_run "curl --continue-at - --output ${SRC_CACHE_DIR}/buildroot-${BR_VER}.tar.gz https://buildroot.org/downloads/buildroot-${BR_VER}.tar.gz"
+  echo_c 34 "Done.\n"
+
+  echo_c 34 "Extracting a fresh copy of Buildroot from Buildroot sources ..."
+  log_and_run "tar xvf ${SRC_CACHE_DIR}/buildroot-${BR_VER}.tar.gz"
+  echo_c 34 "Done.\n"
+
+  echo_c 34 "Copying cached source files back to Buildroot ..."
+  log_and_run "mkdir -p buildroot-${BR_VER}/dl/"
+  log_and_run "cp -rvf ${SRC_CACHE_DIR}/* buildroot-${BR_VER}/dl/"
+  echo_c 34 "Done.\n"
+
+  # prevent to double download buildroot
+  # make prepare
+
+  echo_c 33 "Start building OpenIPC Firmware ${OPENIPC_VER} for ${SOC}."
+  echo "The start-stop times" >/tmp/openipc_buildtime.txt
+  date >>/tmp/openipc_buildtime.txt
+}
+
+should_fit() {
+  local filename=$1
+  local maxsize=$2
+  local filesize=$(stat --printf="%s" ./output/images/$filename)
+  if [[ $filesize -gt $maxsize ]]; then
+    export TG_NOTIFY="Warning: $filename is too large: $filesize vs $maxsize"
+    echo_c 31 "Warning: $filename is too large: $filesize vs $maxsize"
+    exit 1
+  fi
+}
+
+rename() {
+  if grep -q ultimate_defconfig ./output/.config || grep -q ultimate_broadband_defconfig ./output/.config || grep -q sdcard_defconfig ./output/.config; then
+    should_fit uImage $MAX_KERNEL_SIZE_ULTIMATE
+    should_fit rootfs.squashfs $MAX_ROOTFS_SIZE_ULTIMATE
+  else
+    should_fit uImage $MAX_KERNEL_SIZE
+    should_fit rootfs.squashfs $MAX_ROOTFS_SIZE
+  fi
+  mv -v ./output/images/uImage ./output/images/uImage.${SOC}
+  mv -v ./output/images/rootfs.squashfs ./output/images/rootfs.squashfs.${SOC}
+  mv -v ./output/images/rootfs.cpio ./output/images/rootfs.${SOC}.cpio
+  mv -v ./output/images/rootfs.tar ./output/images/rootfs.${SOC}.tar
+  date >>/tmp/openipc_buildtime.txt
+  echo_c 31 "\n\n$(cat /tmp/openipc_buildtime.txt)\n\n"
+}
+
+rename_initramfs() {
+  should_fit uImage $MAX_KERNEL_SIZE_EXPERIMENTAL
+  mv -v ./output/images/uImage ./output/images/uImage.initramfs.${SOC}
+  mv -v ./output/images/rootfs.cpio ./output/images/rootfs.${SOC}.cpio
+  mv -v ./output/images/rootfs.tar ./output/images/rootfs.${SOC}.tar
+  date >>/tmp/openipc_buildtime.txt
+  echo_c 31 "\n\n$(cat /tmp/openipc_buildtime.txt)\n\n"
+}
+
+autoup_rootfs() {
+  echo_c 34 "\nDownloading u-boot created by OpenIPC"
+  curl --location --output ./output/images/u-boot-${SOC}-universal.bin \
+    https://github.com/OpenIPC/firmware/releases/download/latest/u-boot-${SOC}-universal.bin
+
+  echo_c 34 "\nMaking autoupdate u-boot image"
+  ./output/host/bin/mkimage -A arm -O linux -T firmware -n "$OPENIPC_VER" \
+    -a 0x0 -e 0x50000 -d ./output/images/u-boot-${SOC}-universal.bin \
+    ./output/images/autoupdate-uboot.img
+
+  echo_c 34 "\nMaking autoupdate kernel image"
+  ./output/host/bin/mkimage -A arm -O linux -T kernel -C none -n "$OPENIPC_VER" \
+    -a 0x50000 -e 0x250000 -d ./output/images/uImage.${SOC} \
+    ./output/images/autoupdate-kernel.img
+
+  echo_c 34 "\nMaking autoupdate rootfs image"
+  ./output/host/bin/mkimage -A arm -O linux -T filesystem -n "$OPENIPC_VER" \
+    -a 0x250000 -e 0x750000 -d ./output/images/rootfs.squashfs.${SOC} \
+    ./output/images/autoupdate-rootfs.img
+}
+
+copy_function() {
+  test -n "$(declare -f "$1")" || return
+  eval "${_/$1/$2}"
+}
+
+uni_build() {
+  [ -z "$BOARD" ] && BOARD=$FUNCNAME
+
+  SOC=$(echo $BOARD | cut -d '_' -f 1)
+
+  set -e
+  if [ "$(echo $BOARD | cut -sd '_' -f 2)" == "" ]; then
+    BOARD="${BOARD}_lite"
+  fi
+
+  if [ "$BOARD" == "hi3518ev200_lite" ]; then
+    NEED_AUTOUP=1
+  fi
+
+  echo_c 33 "\n  SoC: $SOC\nBoard: $BOARD\n"
+
+  if [ "all" = "${COMMAND}" ]; then
+    fresh $(make BOARD=${BOARD})
+  fi
+
+  log_and_run "make BOARD=${BOARD} ${COMMAND}"
+
+  if [ "all" == "${COMMAND}" ]; then
+    if [ "ssc335_initramfs" == "$BOARD" ]; then
+      rename_initramfs
+    else
+      rename
+    fi
+
+    if [ ! -z "$NEED_AUTOUP" ]; then
+      autoup_rootfs
+    fi
+  fi
+}
+
+#######
+
+check_or_set_lock
+
+build_list_of_projects
+
+if [ -n "$1" ]; then
+  BOARD=$1
+else
+  select_project
+fi
+
+[ -z "$BOARD" ] && echo_c 31 "Nothing selected." && drop_lock_and_exit
+
+COMMAND=$2
+[ -z "$COMMAND" ] && COMMAND=all
+
+for i in "${FUNCS[@]}"; do
+  copy_function uni_build $i
+done
+
+echo_c 37 "Building OpenIPC for ${BOARD}"
+uni_build $BOARD $COMMAND
+
+drop_lock_and_exit