diff --git a/lib/uthread/include/uthread.h b/lib/uthread/include/uthread.h
index beae0fc..2498070 100644
--- a/lib/uthread/include/uthread.h
+++ b/lib/uthread/include/uthread.h
@@ -92,18 +92,4 @@
 {
 	return (uthread_t *)tls_get(TLS_ENTRY_UTHREAD);
 }
-
-#if UTHREAD_WITH_MEMORY_MAPPING_SUPPORT
-/* Translate virtual address to physical address */
-status_t uthread_virt_to_phys(uthread_t *ut, vaddr_t vaddr, paddr_t *paddr);
-
-/* Grant pages from current context into target uthread */
-status_t uthread_grant_pages(uthread_t *ut_target, ext_vaddr_t vaddr_src,
-		size_t size, u_int flags, vaddr_t *vaddr_target, bool ns_src,
-		uint64_t *ns_page_list);
-
-/* Revoke mappings from a previous grant */
-status_t uthread_revoke_pages(uthread_t *ut, vaddr_t vaddr, size_t size);
-#endif
-
 #endif /* __UTHREAD_H */
diff --git a/lib/uthread/uthread.c b/lib/uthread/uthread.c
index 162a943..441c07c 100644
--- a/lib/uthread/uthread.c
+++ b/lib/uthread/uthread.c
@@ -32,14 +32,6 @@
 
 #include <kernel/mutex.h>
 
-#if UTHREAD_WITH_MEMORY_MAPPING_SUPPORT
-#include <lib/sm.h>
-
-#ifndef USER_PAGE_SIZE
-#define USER_PAGE_SIZE PAGE_SIZE
-#endif
-#endif
-
 #define LOCAL_TRACE 0
 
 static int uthread_startup(void *arg)
@@ -155,175 +147,3 @@
 	}
 	return true;
 }
-
-#if UTHREAD_WITH_MEMORY_MAPPING_SUPPORT
-
-static status_t uthread_translate_ns_pte(paddr_t *pfn_list, uint32_t npages,
-                                         uint *arch_mmu_flags,
-                                         uint64_t *ns_pte_list)
-{
-	u_int pg;
-	status_t err = ERR_NOT_VALID;
-	uint first_arch_mmu_flags = ~0;
-
-	for (pg = 0; pg < npages; pg++) {
-		ns_addr_t paddr;
-		uint page_arch_mmu_flags;
-		struct ns_page_info ns_page_info = { .attr = ns_pte_list[pg] };
-
-		err = sm_decode_ns_memory_attr(&ns_page_info, &paddr,
-		                               &page_arch_mmu_flags);
-		if (err) {
-			TRACEF("sm_decode_ns_memory_attr 0x%llx failed: %d\n",
-			       ns_page_info.attr, err);
-			return err;
-		}
-		LTRACEF("ns_pte_list[%d] 0x%llx -> paddr 0x%llx, attr 0x%x\n",
-		        pg, ns_page_info.attr, paddr, page_arch_mmu_flags);
-		if (pg == 0) {
-			first_arch_mmu_flags = page_arch_mmu_flags;
-		} else if (first_arch_mmu_flags != page_arch_mmu_flags) {
-			TRACEF("arch_mmu_flags for 0x%llx, 0x%x does not match first page, 0x%x\n",
-			       ns_page_info.attr, page_arch_mmu_flags, first_arch_mmu_flags);
-			return ERR_INVALID_ARGS;
-		}
-		pfn_list[pg] = paddr;
-	}
-	*arch_mmu_flags = first_arch_mmu_flags;
-	return 0;
-}
-
-static status_t uthread_get_page_list(paddr_t *pages, uint npages,
-                                      uint *arch_mmu_flags_p,
-                                      vmm_aspace_t *aspace, vaddr_t src)
-{
-	status_t err;
-	uint i;
-	uint arch_mmu_flags;
-	uint arch_mmu_flags_prev;
-
-	for (i = 0; i < npages; i++, src += USER_PAGE_SIZE) {
-		err = arch_mmu_query(&aspace->arch_aspace, src,
-		                     &pages[i], &arch_mmu_flags);
-		if (err) {
-			TRACEF("arch_mmu_query failed for 0x%lx\n", src);
-			return err;
-		}
-		if (i && arch_mmu_flags != arch_mmu_flags_prev) {
-			TRACEF("arch_mmu_flags for 0x%lx, 0x%x does not match prev page, 0x%x\n",
-			       src, arch_mmu_flags, arch_mmu_flags_prev);
-			return ERR_INVALID_ARGS;
-		}
-		arch_mmu_flags_prev = arch_mmu_flags;
-	}
-	*arch_mmu_flags_p = arch_mmu_flags;
-	return 0;
-}
-
-status_t uthread_grant_pages(uthread_t *ut_target, ext_vaddr_t vaddr_src,
-		size_t size, u_int flags, vaddr_t *vaddr_target, bool ns_src,
-		uint64_t *ns_page_list)
-{
-	u_int npages;
-	paddr_t *pfn_list;
-	status_t err;
-	u_int offset;
-	uint arch_mmu_flags;
-	uint arch_mmu_flags_src;
-
-	if (size == 0) {
-		*vaddr_target = 0;
-		return 0;
-	}
-
-	offset = vaddr_src & (PAGE_SIZE -1);
-	vaddr_src = ROUNDDOWN(vaddr_src, PAGE_SIZE);
-	size = ROUNDUP((size + offset), PAGE_SIZE);
-	npages = size / PAGE_SIZE;
-
-	pfn_list = malloc(npages * sizeof(paddr_t));
-	if (!pfn_list) {
-		return ERR_NO_MEMORY;
-	}
-
-	arch_mmu_flags = ARCH_MMU_FLAG_PERM_USER | ARCH_MMU_FLAG_PERM_NO_EXECUTE;
-	if (!(flags & UTM_W)) {
-		arch_mmu_flags |= ARCH_MMU_FLAG_PERM_RO;
-	}
-
-	uthread_t *ut_src = ns_src ? NULL : uthread_get_current();
-
-	if (ns_src) {
-		if (!ns_page_list) {
-			err = ERR_INVALID_ARGS;
-			goto err_out;
-		}
-
-		err = uthread_translate_ns_pte(pfn_list, npages,
-		                               &arch_mmu_flags_src,
-		                               ns_page_list);
-		if (err) {
-			goto err_out;
-		}
-		assert(arch_mmu_flags_src & ARCH_MMU_FLAG_NS);
-	} else {
-		/* ns_page_list should only be passes for NS src -> secure target
-		 * mappings
-		 */
-		ASSERT(!ns_page_list);
-
-		/* Only a vaddr_t sized vaddr_src is supported
-		 * for secure src -> secure target mappings.
-		 */
-		ASSERT(vaddr_src == (vaddr_t)vaddr_src);
-
-		err = uthread_get_page_list(pfn_list, npages, &arch_mmu_flags_src,
-		                            ut_src->aspace, vaddr_src);
-		if (err) {
-			goto err_out;
-		}
-	}
-	if ((arch_mmu_flags_src & ARCH_MMU_FLAG_PERM_RO) &&
-	    !(arch_mmu_flags & ARCH_MMU_FLAG_PERM_RO)) {
-		TRACEF("Making a writable mapping to read-only page\n");
-		err = ERR_INVALID_ARGS;
-		goto err_out;
-	}
-	if (arch_mmu_flags_src & ARCH_MMU_FLAG_NS) {
-		arch_mmu_flags |= ARCH_MMU_FLAG_NS;
-	}
-	arch_mmu_flags |= arch_mmu_flags_src & ARCH_MMU_FLAG_CACHE_MASK;
-
-
-	err = vmm_alloc_physical_etc(ut_target->aspace, "copy", size,
-	                             (void **)vaddr_target,
-	                             PAGE_SIZE_SHIFT, pfn_list, npages,
-	                             0, arch_mmu_flags);
-
-	LTRACEF("va 0x%lx, pa 0x%lx..., size %zd, arch_mmu_flags 0x%x, err %d\n",
-	        *vaddr_target, pfn_list[0], size, arch_mmu_flags, err);
-
-	/* Add back the offset after translation and mapping */
-	*vaddr_target += offset;
-
-err_free_pfn_list:
-err_out:
-	free(pfn_list);
-	return err;
-}
-
-status_t uthread_revoke_pages(uthread_t *ut, vaddr_t vaddr, size_t size)
-{
-	u_int offset = vaddr & (PAGE_SIZE - 1);
-
-	if (size == 0)
-		return 0;
-
-	vaddr = ROUNDDOWN(vaddr, PAGE_SIZE);
-	size  = ROUNDUP(size + offset, PAGE_SIZE);
-
-	LTRACEF("va %lx, size %zd\n", vaddr, size);
-
-	return vmm_free_region_etc(ut->aspace, vaddr, size, 0);
-}
-#endif
