diff --git a/kernel/libk/src/lib.rs b/kernel/libk/src/lib.rs
index 173b77a2..f2bfbac0 100644
--- a/kernel/libk/src/lib.rs
+++ b/kernel/libk/src/lib.rs
@@ -1,4 +1,5 @@
 #![no_std]
+#![allow(clippy::new_without_default)]
 #![feature(
     maybe_uninit_slice,
     step_trait,
diff --git a/kernel/libk/src/vfs/file/mod.rs b/kernel/libk/src/vfs/file/mod.rs
index c3778fd3..7a0a7e5f 100644
--- a/kernel/libk/src/vfs/file/mod.rs
+++ b/kernel/libk/src/vfs/file/mod.rs
@@ -114,7 +114,7 @@ impl File {
         config: TerminalOptions,
         size: TerminalSize,
     ) -> Result<(Arc<Self>, Arc<Self>), Error> {
-        let (master, slave) = PseudoTerminal::new(config, size)?;
+        let (master, slave) = PseudoTerminal::create(config, size)?;
         let master = Arc::new(master);
         let slave = Arc::new(slave);
         let (master_node, slave_node) = Node::pseudo_terminal_nodes(master.clone(), slave.clone());
diff --git a/kernel/libk/src/vfs/node/impls.rs b/kernel/libk/src/vfs/node/impls.rs
index 39505c81..305b6726 100644
--- a/kernel/libk/src/vfs/node/impls.rs
+++ b/kernel/libk/src/vfs/node/impls.rs
@@ -110,19 +110,19 @@ where
     R: ValueReadFn<T> + 'static,
 {
     /// Creates a new [ReadOnlyFnValueNode] with given read function
-    pub fn new(read: R) -> NodeRef {
-        Node::regular(
-            Self::new_impl(read),
-            NodeFlags::IN_MEMORY_PROPS | NodeFlags::IN_MEMORY_SIZE,
-        )
-    }
-
-    const fn new_impl(read: R) -> Self {
+    pub const fn new(read: R) -> Self {
         Self {
             read,
             _pd: PhantomData,
         }
     }
+
+    pub fn new_node(read: R) -> NodeRef {
+        Node::regular(
+            Self::new(read),
+            NodeFlags::IN_MEMORY_PROPS | NodeFlags::IN_MEMORY_SIZE,
+        )
+    }
 }
 
 impl<T, R> CommonImpl for ReadOnlyFnValueNode<T, R>
@@ -211,20 +211,20 @@ where
     W: ValueWriteFn<T> + 'static,
 {
     /// Creates a new [FnValueNode] with given read and write functions
-    pub fn new(read: R, write: W) -> NodeRef {
-        Node::regular(
-            Self::new_impl(read, write),
-            NodeFlags::IN_MEMORY_PROPS | NodeFlags::IN_MEMORY_SIZE,
-        )
-    }
-
-    const fn new_impl(read: R, write: W) -> Self {
+    pub fn new(read: R, write: W) -> Self {
         Self {
             read,
             write,
             _pd: PhantomData,
         }
     }
+
+    pub fn new_node(read: R, write: W) -> NodeRef {
+        Node::regular(
+            Self::new(read, write),
+            NodeFlags::IN_MEMORY_PROPS | NodeFlags::IN_MEMORY_SIZE,
+        )
+    }
 }
 
 impl<T, R, W> CommonImpl for FnValueNode<T, R, W>
@@ -314,8 +314,8 @@ where
     R: ReadFn + 'static,
 {
     /// Creates a new [ReadOnlyFnNode] with given read function
-    pub fn new(read: R) -> NodeRef {
-        Node::regular(Self { read }, NodeFlags::IN_MEMORY_PROPS)
+    pub fn new(read: R) -> Self {
+        Self { read }
     }
 }
 
@@ -389,12 +389,8 @@ where
     F: ReadLinkFn + 'static,
 {
     /// Creates a new [FnSymlink] node
-    pub fn new(read: F) -> NodeRef {
-        let data = Self { read };
-        Node::symlink(
-            data,
-            NodeFlags::IN_MEMORY_SIZE | NodeFlags::IN_MEMORY_PROPS | NodeFlags::NO_LINK_CACHE,
-        )
+    pub fn new(read: F) -> Self {
+        Self { read }
     }
 }
 
@@ -413,7 +409,16 @@ pub fn const_value_node<T>(value: T) -> NodeRef
 where
     T: ToString + Clone + Send + Sync + 'static,
 {
-    ReadOnlyFnValueNode::new(move || Ok(value.clone()))
+    ReadOnlyFnValueNode::new_node(move || Ok(value.clone()))
+}
+
+pub fn read_write_node<T, R, W>(read: R, write: W) -> NodeRef
+where
+    T: ToString + FromStr + Send + Sync + 'static,
+    R: ValueReadFn<T> + 'static,
+    W: ValueWriteFn<T> + 'static,
+{
+    FnValueNode::new_node(read, write)
 }
 
 /// Creates a read-write value node with given `value`
@@ -424,7 +429,7 @@ where
     let rd_state = Arc::new(IrqSafeSpinlock::new(value));
     let wr_state = rd_state.clone();
 
-    FnValueNode::new(
+    FnValueNode::new_node(
         move || Ok(rd_state.lock().clone()),
         move |t| {
             *wr_state.lock() = t;
@@ -435,7 +440,7 @@ where
 
 /// Creates a read-only node with given read function
 pub fn read_fn_node<R: ReadFn + 'static>(read: R) -> NodeRef {
-    ReadOnlyFnNode::new(read)
+    Node::regular(ReadOnlyFnNode::new(read), NodeFlags::IN_MEMORY_PROPS)
 }
 
 /// Creates an in-memory directory from the iterator
@@ -451,15 +456,23 @@ pub fn mdir<S: Into<String>, I: IntoIterator<Item = (S, NodeRef)>>(it: I) -> Nod
 }
 
 /// Creates a static symlink pointing to given node
-pub fn f_symlink(target: NodeRef) -> NodeRef {
+pub fn fixed_symlink(target: NodeRef) -> NodeRef {
     Node::symlink(FixedSymlink { target }, NodeFlags::IN_MEMORY_PROPS)
 }
 
+pub fn fn_symlink<R: ReadLinkFn + 'static>(read: R) -> NodeRef {
+    let data = FnSymlink::new(read);
+    Node::symlink(
+        data,
+        NodeFlags::IN_MEMORY_SIZE | NodeFlags::IN_MEMORY_PROPS | NodeFlags::NO_LINK_CACHE,
+    )
+}
+
 #[cfg(test)]
 mod tests {
     use yggdrasil_abi::io::OpenOptions;
 
-    use crate::{
+    use crate::vfs::{
         node::{
             impls::{const_value_node, value_node},
             AccessToken,
diff --git a/kernel/libk/src/vfs/pty.rs b/kernel/libk/src/vfs/pty.rs
index 350114f4..28bc4485 100644
--- a/kernel/libk/src/vfs/pty.rs
+++ b/kernel/libk/src/vfs/pty.rs
@@ -174,7 +174,7 @@ impl PtySlaveToMasterHalf {
 
 impl PseudoTerminal {
     /// Creates a pair of PTY slave/master devices
-    pub fn new(
+    pub fn create(
         config: TerminalOptions,
         size: TerminalSize,
     ) -> Result<(PseudoTerminalMaster, PseudoTerminalSlave), Error> {
@@ -223,7 +223,9 @@ impl PseudoTerminal {
                 }
 
                 return;
-            } else if byte == b'\n' {
+            }
+
+            if byte == b'\n' {
                 // TODO NL_TO_CRNL
                 if config.is_echo_newline() {
                     self.slave_to_master.handle_input(byte, &config.output);
diff --git a/kernel/src/arch/aarch64/boot/mod.rs b/kernel/src/arch/aarch64/boot/mod.rs
index 77be9ded..ec459717 100644
--- a/kernel/src/arch/aarch64/boot/mod.rs
+++ b/kernel/src/arch/aarch64/boot/mod.rs
@@ -8,7 +8,7 @@ use aarch64_cpu::{
 use kernel_arch::{absolute_address, Architecture, ArchitectureImpl};
 use kernel_arch_aarch64::CPU_COUNT;
 use kernel_fs::devfs;
-use libk::runtime;
+use libk::task::runtime;
 use libk_mm::{
     address::{IntoRaw, PhysicalAddress, Virtualize},
     phys,
diff --git a/kernel/src/arch/aarch64/exception.rs b/kernel/src/arch/aarch64/exception.rs
index f662fb0f..18cf8485 100644
--- a/kernel/src/arch/aarch64/exception.rs
+++ b/kernel/src/arch/aarch64/exception.rs
@@ -15,11 +15,10 @@ use abi::{
 };
 use kernel_arch::{task::TaskFrame, Architecture, ArchitectureImpl};
 use kernel_arch_aarch64::context::ExceptionFrame;
-use libk::device::external_interrupt_controller;
-use libk_thread::thread::Thread;
+use libk::{device::external_interrupt_controller, task::thread::Thread};
 use tock_registers::interfaces::{Readable, Writeable};
 
-use crate::{debug::LogLevel, syscall::raw_syscall_handler, task::process::ProcessManagerImpl};
+use crate::{debug::LogLevel, syscall::raw_syscall_handler};
 
 /// Initializes the exception/interrupt vectors. May be called repeatedly (though that makes no
 /// sense).
@@ -109,7 +108,7 @@ extern "C" fn __aa64_el0_sync_handler(frame: *mut ExceptionFrame) {
 
     unsafe {
         let thread = Thread::current();
-        thread.handle_pending_signals::<ProcessManagerImpl, _>(frame);
+        thread.handle_pending_signals(frame);
     }
 }
 
@@ -122,7 +121,7 @@ extern "C" fn __aa64_el0_irq_handler(frame: *mut ExceptionFrame) {
 
     unsafe {
         let thread = Thread::current();
-        thread.handle_pending_signals::<ProcessManagerImpl, _>(frame);
+        thread.handle_pending_signals(frame);
     }
 }
 
diff --git a/kernel/src/arch/aarch64/gic/mod.rs b/kernel/src/arch/aarch64/gic/mod.rs
index db543a0b..8b7636f0 100644
--- a/kernel/src/arch/aarch64/gic/mod.rs
+++ b/kernel/src/arch/aarch64/gic/mod.rs
@@ -15,7 +15,7 @@ use device_api::{
 };
 use device_tree::{device_tree_driver, dt::DevTreeIndexPropExt};
 use kernel_arch_aarch64::{GicInterface, CPU_COUNT};
-use libk::{arch::Cpu, cpu_index, device::register_external_interrupt_controller};
+use libk::{arch::Cpu, device::register_external_interrupt_controller, task::cpu_index};
 use libk_mm::{
     address::{FromRaw, IntoRaw, PhysicalAddress},
     device::{DeviceMemoryIo, RawDeviceMemoryMapping},
diff --git a/kernel/src/arch/aarch64/timer.rs b/kernel/src/arch/aarch64/timer.rs
index 9579cc7e..dce8daed 100644
--- a/kernel/src/arch/aarch64/timer.rs
+++ b/kernel/src/arch/aarch64/timer.rs
@@ -15,7 +15,7 @@ use kernel_arch::task::Scheduler;
 use libk::{
     arch::Cpu,
     device::{external_interrupt_controller, register_monotonic_timestamp_provider},
-    runtime,
+    task::runtime,
 };
 use tock_registers::interfaces::{ReadWriteable, Readable, Writeable};
 
diff --git a/kernel/src/device/serial/pl011.rs b/kernel/src/device/serial/pl011.rs
index d67ce05f..41ca48cc 100644
--- a/kernel/src/device/serial/pl011.rs
+++ b/kernel/src/device/serial/pl011.rs
@@ -9,7 +9,11 @@ use device_api::{
 use device_tree::{device_tree_driver, dt::DevTreeIndexPropExt};
 use futures_util::task::{Context, Poll};
 use kernel_fs::devfs::{self, CharDeviceType};
-use libk::{block, device::external_interrupt_controller};
+use libk::{
+    block,
+    device::external_interrupt_controller,
+    vfs::{CharDevice, FileReadiness},
+};
 use libk_mm::{
     address::{FromRaw, PhysicalAddress},
     device::DeviceMemoryIo,
@@ -20,7 +24,6 @@ use tock_registers::{
     register_bitfields, register_structs,
     registers::{ReadOnly, ReadWrite, WriteOnly},
 };
-use vfs::{CharDevice, FileReadiness};
 
 use crate::{
     debug::{self, DebugSink, LogLevel},
diff --git a/kernel/src/fs/sysfs.rs b/kernel/src/fs/sysfs.rs
index 22f4b758..9929e624 100644
--- a/kernel/src/fs/sysfs.rs
+++ b/kernel/src/fs/sysfs.rs
@@ -32,15 +32,15 @@ pub fn init() {
     let d_mem_phys = mdir([
         (
             "total_pages",
-            ReadOnlyFnValueNode::new(|| Ok(phys::stats().total_usable_pages)),
+            ReadOnlyFnValueNode::new_node(|| Ok(phys::stats().total_usable_pages)),
         ),
         (
             "free_pages",
-            ReadOnlyFnValueNode::new(|| Ok(phys::stats().free_pages)),
+            ReadOnlyFnValueNode::new_node(|| Ok(phys::stats().free_pages)),
         ),
         (
             "allocated_pages",
-            ReadOnlyFnValueNode::new(|| Ok(phys::stats().allocated_pages)),
+            ReadOnlyFnValueNode::new_node(|| Ok(phys::stats().allocated_pages)),
         ),
     ]);
     let d_mem = mdir([("phys", d_mem_phys)]);
diff --git a/kernel/src/init.rs b/kernel/src/init.rs
index b52903d5..bd0f0bb7 100644
--- a/kernel/src/init.rs
+++ b/kernel/src/init.rs
@@ -5,7 +5,8 @@ use alloc::borrow::ToOwned;
 use kernel_fs::devfs;
 use libk::task::process::Process;
 use libk::task::{runtime, thread::Thread};
-use libk::vfs::{impls::FnSymlink, IoContext, NodeRef};
+use libk::vfs::impls::fn_symlink;
+use libk::vfs::{IoContext, NodeRef};
 use memfs::MemoryFilesystem;
 
 use crate::{
@@ -32,7 +33,7 @@ pub fn kinit() -> Result<(), Error> {
 
     devfs::root().add_child(
         "tty",
-        FnSymlink::new(|| {
+        fn_symlink(|| {
             let thread = Thread::current();
             let process = thread.process();
 
diff --git a/userspace/sysutils/src/cat.rs b/userspace/sysutils/src/cat.rs
index 3e367e6d..0390a8ed 100644
--- a/userspace/sysutils/src/cat.rs
+++ b/userspace/sysutils/src/cat.rs
@@ -29,7 +29,7 @@ fn main() -> ExitCode {
 
     if args.len() == 0 {
         if let Err(error) = cat_file(&mut stdout, "-") {
-            eprintln!("{}: {}", "<stdin>", error);
+            eprintln!("<stdin>: {}", error);
             exit = ExitCode::FAILURE;
         }
     } else {