diff --git a/tests/kernel/pipe/pipe_api/src/main.c b/tests/kernel/pipe/pipe_api/src/main.c
index fd305e2..9ba6eae 100644
--- a/tests/kernel/pipe/pipe_api/src/main.c
+++ b/tests/kernel/pipe/pipe_api/src/main.c
@@ -25,12 +25,6 @@
 extern void test_pipe_alloc(void);
 extern void test_pipe_reader_wait(void);
 extern void test_pipe_block_writer_wait(void);
-#ifdef CONFIG_USERSPACE
-extern void test_pipe_user_thread2thread(void);
-extern void test_pipe_user_put_fail(void);
-extern void test_pipe_user_get_fail(void);
-extern void test_resource_pool_auto_free(void);
-#endif
 
 extern void test_pipe_avail_r_lt_w(void);
 extern void test_pipe_avail_w_lt_r(void);
@@ -43,7 +37,6 @@
 extern struct k_sem end_sema;
 extern struct k_stack tstack;
 extern struct k_thread tdata;
-extern struct k_mem_pool test_pool;
 
 #ifndef CONFIG_USERSPACE
 #define dummy_test(_name) \
@@ -55,7 +48,6 @@
 dummy_test(test_pipe_user_thread2thread);
 dummy_test(test_pipe_user_put_fail);
 dummy_test(test_pipe_user_get_fail);
-dummy_test(test_resource_pool_auto_free);
 #endif /* !CONFIG_USERSPACE */
 
 /*test case main entry*/
@@ -65,25 +57,16 @@
 			      &kpipe, &end_sema, &tdata, &tstack,
 			      &khalfpipe, &put_get_pipe);
 
-	z_thread_resource_pool_assign(k_current_get(), &test_pool);
-
 	ztest_test_suite(pipe_api,
 			 ztest_1cpu_unit_test(test_pipe_thread2thread),
 			 ztest_1cpu_user_unit_test(test_pipe_user_thread2thread),
 			 ztest_1cpu_user_unit_test(test_pipe_user_put_fail),
 			 ztest_user_unit_test(test_pipe_user_get_fail),
-			 ztest_unit_test(test_resource_pool_auto_free),
 			 ztest_1cpu_unit_test(test_pipe_put_fail),
 			 ztest_unit_test(test_pipe_get_fail),
-			 ztest_unit_test(test_pipe_block_put),
-			 ztest_1cpu_unit_test(test_pipe_block_put_sema),
-			 ztest_1cpu_unit_test(test_pipe_get_put),
-			 ztest_unit_test(test_half_pipe_block_put_sema),
 			 ztest_unit_test(test_half_pipe_get_put),
-			 ztest_unit_test(test_half_pipe_saturating_block_put),
 			 ztest_1cpu_unit_test(test_pipe_alloc),
 			 ztest_unit_test(test_pipe_reader_wait),
-			 ztest_1cpu_unit_test(test_pipe_block_writer_wait),
 			 ztest_unit_test(test_pipe_avail_r_lt_w),
 			 ztest_unit_test(test_pipe_avail_w_lt_r),
 			 ztest_unit_test(test_pipe_avail_r_eq_w_full),
diff --git a/tests/kernel/pipe/pipe_api/src/test_pipe_contexts.c b/tests/kernel/pipe/pipe_api/src/test_pipe_contexts.c
index f783447..1b6004d 100644
--- a/tests/kernel/pipe/pipe_api/src/test_pipe_contexts.c
+++ b/tests/kernel/pipe/pipe_api/src/test_pipe_contexts.c
@@ -10,7 +10,6 @@
 #define PIPE_LEN	(4 * 16)
 #define BYTES_TO_WRITE	16
 #define BYTES_TO_READ BYTES_TO_WRITE
-Z_MEM_POOL_DEFINE(mpool, BYTES_TO_WRITE, PIPE_LEN, 1, 4);
 
 static ZTEST_DMEM unsigned char __aligned(4) data[] =
 "abcd1234$%^&PIPEefgh5678!/?*EPIPijkl9012[]<>PEPImnop3456{}()IPEP";
@@ -31,17 +30,6 @@
 struct k_thread tdata2;
 K_SEM_DEFINE(end_sema, 0, 1);
 
-/* By design, only two blocks. We should never need more than that, one
- * to allocate the pipe object, one for its buffer. Both should be auto-
- * released when the thread exits
- */
-#ifdef CONFIG_64BIT
-#define SZ	256
-#else
-#define SZ	128
-#endif
-Z_MEM_POOL_DEFINE(test_pool, SZ, SZ, 4, 4);
-
 static void tpipe_put(struct k_pipe *ppipe, k_timeout_t timeout)
 {
 	size_t to_wt, wt_byte = 0;
@@ -56,25 +44,6 @@
 	}
 }
 
-static void tpipe_block_put(struct k_pipe *ppipe, struct k_sem *sema,
-			    k_timeout_t timeout)
-{
-	struct k_mem_block block;
-
-	for (int i = 0; i < PIPE_LEN; i += BYTES_TO_WRITE) {
-		/**TESTPOINT: pipe block put*/
-		zassert_equal(z_mem_pool_alloc(&mpool, &block, BYTES_TO_WRITE,
-					       timeout), 0, NULL);
-		memcpy(block.data, &data[i], BYTES_TO_WRITE);
-		k_pipe_block_put(ppipe, &block, BYTES_TO_WRITE, sema);
-		if (sema) {
-			k_sem_take(sema, K_FOREVER);
-			zassert_not_equal(memcmp(block.data, &data[i], BYTES_TO_WRITE), 0,
-					"block should be freed after k_pipe_block_put.");
-		}
-	}
-}
-
 static void tpipe_get(struct k_pipe *ppipe, k_timeout_t timeout)
 {
 	unsigned char rx_data[PIPE_LEN];
@@ -103,12 +72,6 @@
 	k_sem_give(&end_sema);
 }
 
-static void tThread_block_put(void *p1, void *p2, void *p3)
-{
-	tpipe_block_put((struct k_pipe *)p1, (struct k_sem *)p2, K_NO_WAIT);
-	k_sem_give(&end_sema);
-}
-
 static void tpipe_thread_thread(struct k_pipe *ppipe)
 {
 	/**TESTPOINT: thread-thread data passing via pipe*/
@@ -164,11 +127,6 @@
 	k_sem_give(&end_sema);
 }
 
-static void thread_for_block_put(void *p1, void *p2, void *p3)
-{
-	tpipe_block_put((struct k_pipe *)p1, (struct k_sem *)p2, K_FOREVER);
-}
-
 /**
  * @addtogroup kernel_pipe_tests
  * @{
@@ -248,125 +206,11 @@
 }
 #endif
 
-/**
- * @brief Test pipe put of blocks
- * @details Check if kernel support sending a kernel
- * memory block into a pipe.
- * - Using a sub thread to put blcok data to pipe
- * - Get the pipe data and verify it
- * @see k_pipe_block_put()
- */
-void test_pipe_block_put(void)
-{
-
-	/**TESTPOINT: test k_pipe_block_put without semaphore*/
-	k_tid_t tid = k_thread_create(&tdata, tstack, STACK_SIZE,
-				      tThread_block_put, &kpipe, NULL, NULL,
-				      K_PRIO_PREEMPT(0), 0, K_NO_WAIT);
-
-	k_sleep(K_MSEC(10));
-	tpipe_get(&kpipe, K_FOREVER);
-	k_sem_take(&end_sema, K_FOREVER);
-
-	k_thread_abort(tid);
-}
-
-/**
- * @brief Test pipe block put with semaphore
- *
- * @ingroup kernel_pipe_tests
- *
- * @details
- * Test Objective:
- * - Check if kernel support sending a kernel
- * memory block into a pipe.
- *
- * Testing techniques:
- * - function and block box testing,Interface testing,
- * Dynamic analysis and testing.
- *
- * Prerequisite Conditions:
- * - CONFIG_TEST_USERSPACE.
- *
- * Input Specifications:
- * - N/A
- *
- * Test Procedure:
- * -# Create a sub thread to put blcok data to pipe.
- * and check the return of k_mem_pool_alloc.
- * -# Check if the block be freed after pip put.
- * -# Get the pipe data and check if the data equals the
- * put data.
- *
- * Expected Test Result:
- * - Pipe can send a memory block into a pipe.
- *
- * Pass/Fail Criteria:
- * - Successful if check points in test procedure are all passed, otherwise failure.
- *
- * Assumptions and Constraints:
- * - N/A
- *
- * @see k_pipe_block_put()
- */
-void test_pipe_block_put_sema(void)
-{
-	struct k_sem sync_sema;
-
-	k_sem_init(&sync_sema, 0, 1);
-	/**TESTPOINT: test k_pipe_block_put with semaphore*/
-	k_tid_t tid = k_thread_create(&tdata, tstack, STACK_SIZE,
-				      tThread_block_put, &pipe, &sync_sema,
-				      NULL, K_PRIO_PREEMPT(0), 0, K_NO_WAIT);
-	k_sleep(K_MSEC(10));
-	tpipe_get(&pipe, K_FOREVER);
-	k_sem_take(&end_sema, K_FOREVER);
-
-	k_thread_abort(tid);
-}
-
-/**
- * @brief Test pipe get and put
- * @see k_pipe_put(), k_pipe_get()
- */
-void test_pipe_get_put(void)
-{
-	/**TESTPOINT: test API sequence: [get, put]*/
-	k_tid_t tid = k_thread_create(&tdata, tstack, STACK_SIZE,
-				      tThread_block_put, &kpipe, NULL, NULL,
-				      K_PRIO_PREEMPT(0), 0, K_NO_WAIT);
-
-	/*get will be executed previous to put*/
-	tpipe_get(&kpipe, K_FOREVER);
-	k_sem_take(&end_sema, K_FOREVER);
-
-	k_thread_abort(tid);
-}
-/**
- * @brief Test resource pool free
- * @see z_mem_pool_malloc()
- */
-#ifdef CONFIG_USERSPACE
-void test_resource_pool_auto_free(void)
-{
-	/* Pool has 2 blocks, both should succeed if kernel object and pipe
-	 * buffer are auto-freed when the allocating threads exit
-	 */
-	zassert_true(z_mem_pool_malloc(&test_pool, 64) != NULL, NULL);
-	zassert_true(z_mem_pool_malloc(&test_pool, 64) != NULL, NULL);
-}
-#endif
-
 static void tThread_half_pipe_put(void *p1, void *p2, void *p3)
 {
 	tpipe_put((struct k_pipe *)p1, K_FOREVER);
 }
 
-static void tThread_half_pipe_block_put(void *p1, void *p2, void *p3)
-{
-	tpipe_block_put((struct k_pipe *)p1, (struct k_sem *)p2, K_FOREVER);
-}
-
 /**
  * @brief Test get/put with smaller pipe buffer
  * @see k_pipe_put(), k_pipe_get()
@@ -386,66 +230,6 @@
 }
 
 /**
- * @brief Test get/put with saturating smaller pipe buffer
- * @see k_pipe_put(), k_pipe_get()
- */
-void test_half_pipe_saturating_block_put(void)
-{
-	int nb;
-	struct k_mem_block blocks[16];
-
-	/**TESTPOINT: thread-thread data passing via pipe*/
-	k_tid_t tid = k_thread_create(&tdata, tstack, STACK_SIZE,
-				      tThread_half_pipe_block_put, &khalfpipe,
-				      NULL, NULL, K_PRIO_PREEMPT(0), 0,
-				      K_NO_WAIT);
-
-	k_msleep(10);
-
-	/* Ensure half the mempool is still queued in the pipe */
-	for (nb = 0; nb < ARRAY_SIZE(blocks); nb++) {
-		if (z_mem_pool_alloc(&mpool, &blocks[nb],
-				     BYTES_TO_WRITE, K_NO_WAIT) != 0) {
-			break;
-		}
-	}
-
-	/* Must have allocated two blocks, and pool must be full */
-	zassert_true(nb >= 2 && nb < ARRAY_SIZE(blocks), NULL);
-
-	for (int i = 0; i < nb; i++) {
-		z_mem_pool_free(&blocks[i]);
-	}
-
-	tpipe_get(&khalfpipe, K_FOREVER);
-
-	/* clear the spawned thread avoid side effect */
-	k_thread_abort(tid);
-}
-
-/**
- * @brief Test pipe block put with semaphore and smaller pipe buffer
- * @see k_pipe_block_put()
- */
-void test_half_pipe_block_put_sema(void)
-{
-	struct k_sem sync_sema;
-
-	k_sem_init(&sync_sema, 0, 1);
-
-	/**TESTPOINT: test k_pipe_block_put with semaphore*/
-	k_tid_t tid = k_thread_create(&tdata, tstack, STACK_SIZE,
-				      tThread_half_pipe_block_put,
-				      &khalfpipe, &sync_sema, NULL,
-				      K_PRIO_PREEMPT(0), 0, K_NO_WAIT);
-
-	k_sleep(K_MSEC(10));
-	tpipe_get(&khalfpipe, K_FOREVER);
-
-	k_thread_abort(tid);
-}
-
-/**
  * @brief Test Initialization and buffer allocation of pipe,
  * with various parameters
  * @see k_pipe_alloc_init(), k_pipe_cleanup()
@@ -484,40 +268,5 @@
 }
 
 /**
- * @brief Test pending writer in pipe
- * @see k_pipe_block_put(), k_pipe_get()
- */
-void test_pipe_block_writer_wait(void)
-{
-	struct k_sem s_sema;
-	struct k_sem s_sema1;
-
-	const int main_low_prio = 10;
-
-	k_sem_init(&s_sema, 0, 1);
-	k_sem_init(&s_sema1, 0, 1);
-
-	int old_prio = k_thread_priority_get(k_current_get());
-
-	k_thread_priority_set(k_current_get(), main_low_prio);
-	/**TESTPOINT: test k_pipe_block_put with semaphore*/
-
-	k_tid_t tid = k_thread_create(&tdata, tstack, STACK_SIZE,
-					thread_for_block_put, &kpipe1, &s_sema,
-					NULL, K_PRIO_PREEMPT(main_low_prio - 1),
-					0, K_NO_WAIT);
-
-	k_tid_t tid1 = k_thread_create(&tdata1, tstack1, STACK_SIZE,
-					thread_for_block_put, &kpipe1, &s_sema1,
-					NULL, K_PRIO_PREEMPT(main_low_prio - 1),
-					0, K_NO_WAIT);
-
-	tpipe_get(&kpipe1, K_FOREVER);
-	k_thread_priority_set(k_current_get(), old_prio);
-	k_thread_abort(tid);
-	k_thread_abort(tid1);
-}
-
-/**
  * @}
  */
