diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2ecbd8df85916509d030f6b6a8c60d2c48de187b..5bbfcf91eedd3553d94cf225c871c66c4cc28b21 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -346,16 +346,8 @@ build_ch:
       allow_failure: true
   before_script:
     - if [ "${OPENHARMONY_VERSION}" = "3.0" ]; then
-        TARBALL_URL="https://repo.huaweicloud.com/harmonyos/os/3.0/code-v3.0-LTS.tar.gz";
-      elif [ "${OPENHARMONY_VERSION}" = "3.0.1" ]; then
         TARBALL_URL="https://repo.huaweicloud.com/harmonyos/os/3.0.1/code-v3.0.1-LTS.tar.gz";
-      elif [ "${OPENHARMONY_VERSION}" = "3.0.2" ]; then
-        TARBALL_URL="https://repo.huaweicloud.com/harmonyos/os/3.0.2/code-v3.0.2-LTS.tar.gz";
-      elif [ "${OPENHARMONY_VERSION}" = "3.0.3" ]; then
-        TARBALL_URL="https://repo.huaweicloud.com/harmonyos/os/3.0.3/code-v3.0.3-LTS.tar.gz";
       elif [ "${OPENHARMONY_VERSION}" = "3.1" ]; then
-        TARBALL_URL="https://repo.huaweicloud.com/harmonyos/os/3.1-Release/code-v3.1-Release.tar.gz";
-      elif [ "${OPENHARMONY_VERSION}" = "3.1.1" ]; then
         TARBALL_URL="https://repo.huaweicloud.com/harmonyos/os/3.1.1/code-v3.1.1-Release.tar.gz";
       else
         echo "OPENHARMONY_VERSION=${OPENHARMONY_VERSION} is not supported";
diff --git a/recipes-core/fts/fts_%.bbappend b/recipes-core/fts/fts_%.bbappend
deleted file mode 100644
index 2b66eb08c6064fc7bf39fa972a4afdc2819716c2..0000000000000000000000000000000000000000
--- a/recipes-core/fts/fts_%.bbappend
+++ /dev/null
@@ -1,5 +0,0 @@
-# SPDX-FileCopyrightText: Huawei Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-FILES:${PN} += "${libdir}/*.a"
diff --git a/recipes-openharmony/openharmony/openharmony-standard_3.1.bb b/recipes-openharmony/openharmony/openharmony-standard_3.1.bb
index 3450f15ae778e2567cd113d591fc40621b5e0694..b53c5c92255f69524426a210daa94c434a51c1a9 100644
--- a/recipes-openharmony/openharmony/openharmony-standard_3.1.bb
+++ b/recipes-openharmony/openharmony/openharmony-standard_3.1.bb
@@ -20,6 +20,8 @@ DEPENDS += "ruby-native"
 DEPENDS += "hapsigner-native"
 DEPENDS += "packing-tool-native"
 
+# libfts.a is needed by //third_party/selinux:libselinux in order to
+# avoid the use of //third_party/FreeBSD.
 DEPENDS += "fts"
 
 FILESEXTRAPATHS:prepend := "${THISDIR}/openharmony-${OPENHARMONY_VERSION}:"
diff --git a/recipes-openharmony/sdk/oniro-openharmony-toolchain-integration-3.1.inc b/recipes-openharmony/sdk/oniro-openharmony-toolchain-integration-3.1.inc
index de5b33a122d64abb3549d7f3a9569c99872f7d9a..5046d27fe75e50bcf6bd665c787a2e9bc0a7df3a 100644
--- a/recipes-openharmony/sdk/oniro-openharmony-toolchain-integration-3.1.inc
+++ b/recipes-openharmony/sdk/oniro-openharmony-toolchain-integration-3.1.inc
@@ -3,6 +3,7 @@
 # SPDX-License-Identifier: Apache-2.0
 
 SRC_URI += "file://patches/ace_napi.patch;apply=no;subdir=src"
+SRC_URI += "file://patches/base_miscservices_pasteboard.patch;apply=no;subdir=src"
 SRC_URI += "file://patches/base_notification_ans_standard.patch;apply=no;subdir=src"
 SRC_URI += "file://patches/base_update_updater.patch;apply=no;subdir=src"
 SRC_URI += "file://patches/base_usb_usb_manager.patch;apply=no;subdir=src"
@@ -15,5 +16,4 @@ SRC_URI += "file://patches/foundation_graphic_standard.patch;apply=no;subdir=src
 SRC_URI += "file://patches/productdefine_common.patch;apply=no;subdir=src"
 SRC_URI += "file://patches/third_party_libevdev.patch;apply=no;subdir=src"
 SRC_URI += "file://patches/third_party_libusb.patch;apply=no;subdir=src"
-SRC_URI += "file://patches/third_party_e2fsprogs-backports-to-3.1.patch;apply=no;subdir=src"
 SRC_URI += "file://patches/third_party_selinux.patch;apply=no;subdir=src"
diff --git a/recipes-openharmony/sdk/openharmony-3.1/patches/base_miscservices_pasteboard.patch b/recipes-openharmony/sdk/openharmony-3.1/patches/base_miscservices_pasteboard.patch
new file mode 100644
index 0000000000000000000000000000000000000000..4d613f989fa9a5e368679bde4dd4124413b73db4
--- /dev/null
+++ b/recipes-openharmony/sdk/openharmony-3.1/patches/base_miscservices_pasteboard.patch
@@ -0,0 +1,61 @@
+# SPDX-FileCopyrightText: Huawei Inc.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+Patch for //base/miscservices/pasteboard git repository of OpenHarmony 3.1 codebase.
+
+This replaces NAPI_CALL() calls with NAPI_CALL_BOOL() in functions
+returning a boolean.
+
+Signed-off-by: Thierry Escande <thierry.escande@huawei.com>
+Upstream-Status: Inappropriate
+
+diff --git a/base/miscservices/pasteboard/interfaces/kits/napi/src/napi_pastedata_record.cpp b/base/miscservices/pasteboard/interfaces/kits/napi/src/napi_pastedata_record.cpp
+index 2658349..f94f446 100644
+--- a/base/miscservices/pasteboard/interfaces/kits/napi/src/napi_pastedata_record.cpp
++++ b/base/miscservices/pasteboard/interfaces/kits/napi/src/napi_pastedata_record.cpp
+@@ -37,7 +37,7 @@ PasteDataRecordNapi::~PasteDataRecordNapi()
+ bool PasteDataRecordNapi::NewInstanceByRecord(
+     napi_env env, napi_value &instance, const std::shared_ptr<MiscServices::PasteDataRecord> &record)
+ {
+-    NAPI_CALL(env, PasteDataRecordNapi::NewInstance(env, instance));
++    NAPI_CALL_BOOL(env, PasteDataRecordNapi::NewInstance(env, instance));
+     PasteDataRecordNapi *obj = nullptr;
+     napi_status status = napi_unwrap(env, instance, reinterpret_cast<void **>(&obj));
+     if ((status != napi_ok) || (obj == nullptr)) {
+@@ -50,7 +50,7 @@ bool PasteDataRecordNapi::NewInstanceByRecord(
+ 
+ bool PasteDataRecordNapi::NewHtmlTextRecordInstance(napi_env env, const std::string &text, napi_value &instance)
+ {
+-    NAPI_CALL(env, PasteDataRecordNapi::NewInstance(env, instance));
++    NAPI_CALL_BOOL(env, PasteDataRecordNapi::NewInstance(env, instance));
+     PasteDataRecordNapi *obj = nullptr;
+     napi_status status = napi_unwrap(env, instance, reinterpret_cast<void **>(&obj));
+     if ((status != napi_ok) || (obj == nullptr)) {
+@@ -63,7 +63,7 @@ bool PasteDataRecordNapi::NewHtmlTextRecordInstance(napi_env env, const std::str
+ 
+ bool PasteDataRecordNapi::NewPlainTextRecordInstance(napi_env env, const std::string &text, napi_value &instance)
+ {
+-    NAPI_CALL(env, PasteDataRecordNapi::NewInstance(env, instance));
++    NAPI_CALL_BOOL(env, PasteDataRecordNapi::NewInstance(env, instance));
+     PasteDataRecordNapi *obj = nullptr;
+     napi_status status = napi_unwrap(env, instance, reinterpret_cast<void **>(&obj));
+     if ((status != napi_ok) || (obj == nullptr)) {
+@@ -76,7 +76,7 @@ bool PasteDataRecordNapi::NewPlainTextRecordInstance(napi_env env, const std::st
+ 
+ bool PasteDataRecordNapi::NewUriRecordInstance(napi_env env, const std::string &text, napi_value &instance)
+ {
+-    NAPI_CALL(env, PasteDataRecordNapi::NewInstance(env, instance));
++    NAPI_CALL_BOOL(env, PasteDataRecordNapi::NewInstance(env, instance));
+     PasteDataRecordNapi *obj = nullptr;
+     napi_status status = napi_unwrap(env, instance, reinterpret_cast<void **>(&obj));
+     if ((status != napi_ok) || (obj == nullptr)) {
+@@ -94,7 +94,7 @@ bool PasteDataRecordNapi::NewWantRecordInstance(
+         return false;
+     }
+ 
+-    NAPI_CALL(env, PasteDataRecordNapi::NewInstance(env, instance));
++    NAPI_CALL_BOOL(env, PasteDataRecordNapi::NewInstance(env, instance));
+     PasteDataRecordNapi *obj = nullptr;
+     napi_status status = napi_unwrap(env, instance, reinterpret_cast<void **>(&obj));
+     if ((status != napi_ok) || (obj == nullptr)) {
diff --git a/recipes-openharmony/sdk/openharmony-3.1/patches/third_party_e2fsprogs-backports-to-3.1.patch b/recipes-openharmony/sdk/openharmony-3.1/patches/third_party_e2fsprogs-backports-to-3.1.patch
deleted file mode 100644
index cb41b4e5bd142d05eade448d8672967d9bdfae90..0000000000000000000000000000000000000000
--- a/recipes-openharmony/sdk/openharmony-3.1/patches/third_party_e2fsprogs-backports-to-3.1.patch
+++ /dev/null
@@ -1,78 +0,0 @@
-# SPDX-FileCopyrightText: Huawei Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-Backport of fixes included in OpenHarmony-v3.1.1 release
-
-f1f1a3471fdf - Fix CodeCheck warning.
-00663d8aab61 - static_cast size_t to int
-97aa5de11e0d - Pass parameter p by reference.
-6758af0c0da8 - Fix the crash problem caused by overflow in GetDacConfig.
-
-Signed-off-by: Esben Haabendal <esben.haabendal@huawei.com>
-Upstream-Status: Backport
-
-diff --git a/third_party/e2fsprogs/contrib/android/dac_config.cpp b/third_party/e2fsprogs/contrib/android/dac_config.cpp
-index 422e0d52280f..1c76dfd7e7d1 100644
---- a/third_party/e2fsprogs/contrib/android/dac_config.cpp
-+++ b/third_party/e2fsprogs/contrib/android/dac_config.cpp
-@@ -35,14 +35,14 @@ struct DacConfig {
-     string path;
- 
-     DacConfig() : uid(0), gid(0), mode(0), capabilities(0), path("") {}
--    DacConfig(unsigned int m, unsigned int u, unsigned int g, uint64_t c, string p) :
-+    DacConfig(unsigned int m, unsigned int u, unsigned int g, uint64_t c, const string &p) :
-         uid(u),
-         gid(g),
-         mode(m),
-         capabilities(c),
-         path(p) {}
- 
--    void SetDefault(unsigned int m, unsigned int u, unsigned int g, uint64_t c, string p)
-+    void SetDefault(unsigned int m, unsigned int u, unsigned int g, uint64_t c, const string &p)
-     {
-         this->uid = u;
-         this->gid = g;
-@@ -198,33 +198,28 @@ extern "C" {
-         return 0;
-     }
- 
--    void GetDacConfig(const char* path, int dir, char* targetOutPath,
-+    void GetDacConfig(const char* path, int dir, char*,
-             unsigned* uid, unsigned* gid, unsigned* mode,
-             uint64_t* capabilities)
-     {
--        if (path && path[0] == '/') {
--            path++;
--        }
--
--        (void)targetOutPath;
--        string str = path;
--        string str2;
-+        string str = (path != nullptr && *path == '/') ? path + 1 : path;
-         DacConfig dacConfig(00755, 0, 0, 0, "");
- 
-         if (dir == 0) {
-             dacConfig.SetDefault(00644, 0, 0, 0, "");
-         }
- 
--        if (g_configMap.count(str)) {
--            dacConfig = g_configMap[str];
-+        auto it = g_configMap.find(str);
-+        if (it != g_configMap.end()) {
-+            dacConfig = it->second;
-         } else if (dir == 0 && !str.empty()) {
--            for (auto i = str.size() - 1; i >= 0; i--) {
-+            for (int i = static_cast<int>(str.size()) - 1; i >= 0; i--) {
-                 if (str[i] == '/') {
-                     break;
-                 } else {
--                    str2 = str.substr(0, i) + "*";
--                    if (g_configMap.count(str2)) {
--                        dacConfig = g_configMap[str2];
-+                    it = g_configMap.find(str.substr(0, i) + "*");
-+                    if (it != g_configMap.end()) {
-+                        dacConfig = it->second;
-                         break;
-                     }
-                 }