diff --git a/common/libs/fs/shared_fd.cpp b/common/libs/fs/shared_fd.cpp
index b85cf7c..f3fff8a 100644
--- a/common/libs/fs/shared_fd.cpp
+++ b/common/libs/fs/shared_fd.cpp
@@ -86,26 +86,6 @@
 
 namespace cvd {
 
-bool FileInstance::CopyFrom(FileInstance& in) {
-  std::vector<char> buffer(8192);
-  while (true) {
-    ssize_t num_read = in.Read(buffer.data(), buffer.size());
-    if (!num_read) {
-      return true;
-    }
-    if (num_read == -1) {
-      return false;
-    }
-    if (num_read > 0) {
-      if (Write(buffer.data(), num_read) != num_read) {
-        // The caller will have to log an appropriate message.
-        return false;
-      }
-    }
-  }
-  return true;
-}
-
 bool FileInstance::CopyFrom(FileInstance& in, size_t length) {
   std::vector<char> buffer(8192);
   while (length > 0) {
@@ -143,16 +123,6 @@
   fd_ = -1;
 }
 
-void FileInstance::Identify(const char* identity) {
-  std::stringstream identity_stream;
-  identity_stream << "fd=" << fd_ << " @" << this << " is " << identity;
-  identity_ = identity_stream.str();
-  std::stringstream message;
-  message << __FUNCTION__ << ": " << identity_;
-  std::string message_str = message.str();
-  Log(message_str.c_str());
-}
-
 bool FileInstance::IsSet(fd_set* in) const {
   if (IsOpen() && FD_ISSET(fd_, in)) {
     return true;
@@ -232,23 +202,6 @@
   *len = namelen + offsetof(struct sockaddr_un, sun_path) + 1;
 }
 
-SharedFD SharedFD::SocketSeqPacketServer(const char* name, mode_t mode) {
-  return SocketLocalServer(name, false, SOCK_SEQPACKET, mode);
-}
-
-SharedFD SharedFD::SocketSeqPacketClient(const char* name) {
-  return SocketLocalClient(name, false, SOCK_SEQPACKET);
-}
-
-SharedFD SharedFD::TimerFD(int clock, int flags) {
-  int fd = timerfd_create(clock, flags);
-  if (fd == -1) {
-    return SharedFD(std::shared_ptr<FileInstance>(new FileInstance(fd, errno)));
-  } else {
-    return SharedFD(std::shared_ptr<FileInstance>(new FileInstance(fd, 0)));
-  }
-}
-
 SharedFD SharedFD::Accept(const FileInstance& listener, struct sockaddr* addr,
                           socklen_t* addrlen) {
   return SharedFD(
@@ -281,11 +234,6 @@
   return std::shared_ptr<FileInstance>(new FileInstance(fd, errno));
 }
 
-SharedFD SharedFD::Epoll(int flags) {
-  int fd = epoll_create1(flags);
-  return std::shared_ptr<FileInstance>(new FileInstance(fd, errno));
-}
-
 SharedFD SharedFD::MemfdCreate(const char* name, unsigned int flags) {
   int fd = memfd_create_wrapper(name, flags);
   int error_num = errno;
diff --git a/common/libs/fs/shared_fd.h b/common/libs/fs/shared_fd.h
index 044c7cc..ef37d1f 100644
--- a/common/libs/fs/shared_fd.h
+++ b/common/libs/fs/shared_fd.h
@@ -66,26 +66,6 @@
 class FileInstance;
 
 /**
- * Describes the fields in msghdr that are honored by the *MsgAndFDs
- * calls.
- */
-struct InbandMessageHeader {
-  void* msg_name;
-  socklen_t msg_namelen;
-  struct iovec* msg_iov;
-  size_t msg_iovlen;
-  int msg_flags;
-
-  void Convert(struct msghdr* dest) const {
-    dest->msg_name = msg_name;
-    dest->msg_namelen = msg_namelen;
-    dest->msg_iov = msg_iov;
-    dest->msg_iovlen = msg_iovlen;
-    dest->msg_flags = msg_flags;
-  }
-};
-
-/**
  * Counted reference to a FileInstance.
  *
  * This is also the place where most new FileInstances are created. The creation
@@ -137,14 +117,12 @@
                          socklen_t* addrlen);
   static SharedFD Accept(const FileInstance& listener);
   static SharedFD Dup(int unmanaged_fd);
-  static SharedFD GetControlSocket(const char* name);
   // All SharedFDs have the O_CLOEXEC flag after creation. To remove use the
   // Fcntl or Dup functions.
   static SharedFD Open(const char* pathname, int flags, mode_t mode = 0);
   static SharedFD Creat(const char* pathname, mode_t mode);
   static bool Pipe(SharedFD* fd0, SharedFD* fd1);
   static SharedFD Event(int initval = 0, int flags = 0);
-  static SharedFD Epoll(int flags = 0);
   static SharedFD MemfdCreate(const char* name, unsigned int flags = 0);
   static bool SocketPair(int domain, int type, int protocol, SharedFD* fd0,
                          SharedFD* fd1);
@@ -155,12 +133,9 @@
   static SharedFD SocketLocalServer(const char* name, bool is_abstract,
                                     int in_type, mode_t mode);
   static SharedFD SocketLocalServer(int port, int type);
-  static SharedFD SocketSeqPacketServer(const char* name, mode_t mode);
-  static SharedFD SocketSeqPacketClient(const char* name);
   static SharedFD VsockServer(unsigned int port, int type);
   static SharedFD VsockServer(int type);
   static SharedFD VsockClient(unsigned int cid, unsigned int port, int type);
-  static SharedFD TimerFD(int clock, int flags);
 
   bool operator==(const SharedFD& rhs) const { return value_ == rhs.value_; }
 
@@ -231,7 +206,6 @@
   // Otherwise an error will be set either on this file or the input.
   // The non-const reference is needed to avoid binding this to a particular
   // reference type.
-  bool CopyFrom(FileInstance& in);
   bool CopyFrom(FileInstance& in, size_t length);
 
   int UNMANAGED_Dup() {
@@ -248,27 +222,6 @@
     return rval;
   }
 
-  int EpollCtl(int op, cvd::SharedFD new_fd, struct epoll_event* event) {
-    errno = 0;
-    int rval = TEMP_FAILURE_RETRY(epoll_ctl(fd_, op, new_fd->fd_, event));
-    errno_ = errno;
-    return rval;
-  }
-
-  int EpollWait(struct epoll_event* events, int maxevents, int timeout) {
-    errno = 0;
-    int rval = TEMP_FAILURE_RETRY(epoll_wait(fd_, events, maxevents, timeout));
-    errno_ = errno;
-    return rval;
-  }
-
-  int Fchown(uid_t owner, gid_t group) {
-    errno = 0;
-    int rval = TEMP_FAILURE_RETRY(fchown(fd_, owner, group));
-    errno_ = errno;
-    return rval;
-  }
-
   int Fcntl(int command, int value) {
     errno = 0;
     int rval = TEMP_FAILURE_RETRY(fcntl(fd_, command, value));
@@ -276,24 +229,8 @@
     return rval;
   }
 
-  int Fstat(struct stat* buf) {
-    errno = 0;
-    int rval = TEMP_FAILURE_RETRY(fstat(fd_, buf));
-    errno_ = errno;
-    return rval;
-  }
-
   int GetErrno() const { return errno_; }
 
-  int GetSockOpt(int level, int optname, void* optval, socklen_t* optlen) {
-    errno = 0;
-    int rval = getsockopt(fd_, level, optname, optval, optlen);
-    if (rval == -1) {
-      errno_ = errno;
-    }
-    return rval;
-  }
-
   int GetSockName(struct sockaddr* addr, socklen_t* addrlen) {
     errno = 0;
     int rval = TEMP_FAILURE_RETRY(getsockname(fd_, addr, addrlen));
@@ -310,8 +247,6 @@
     return vm_socket.svm_port;
   }
 
-  void Identify(const char* identity);
-
   int Ioctl(int request, void* val = nullptr) {
     errno = 0;
     int rval = TEMP_FAILURE_RETRY(ioctl(fd_, request, val));
@@ -340,20 +275,6 @@
     return rval;
   }
 
-  void* Mmap(void* addr, size_t length, int prot, int flags, off_t offset) {
-    errno = 0;
-    void* rval = mmap(addr, length, prot, flags, fd_, offset);
-    errno_ = errno;
-    return rval;
-  }
-
-  ssize_t Pread(void* buf, size_t count, off_t offset) {
-    errno = 0;
-    ssize_t rval = TEMP_FAILURE_RETRY(pread(fd_, buf, count, offset));
-    errno_ = errno;
-    return rval;
-  }
-
   ssize_t Recv(void* buf, size_t len, int flags) {
     errno = 0;
     ssize_t rval = TEMP_FAILURE_RETRY(recv(fd_, buf, len, flags));
@@ -361,15 +282,6 @@
     return rval;
   }
 
-  ssize_t RecvFrom(void* buf, size_t len, int flags, struct sockaddr* src_addr,
-                   socklen_t* addr_len) {
-    errno = 0;
-    ssize_t rval =
-        TEMP_FAILURE_RETRY(recvfrom(fd_, buf, len, flags, src_addr, addr_len));
-    errno_ = errno;
-    return rval;
-  }
-
   ssize_t RecvMsg(struct msghdr* msg, int flags) {
     errno = 0;
     ssize_t rval = TEMP_FAILURE_RETRY(recvmsg(fd_, msg, flags));
@@ -377,36 +289,6 @@
     return rval;
   }
 
-  template <size_t SZ>
-  ssize_t RecvMsgAndFDs(const struct InbandMessageHeader& msg_in, int flags,
-                        SharedFD (*new_fds)[SZ]) {
-    // We need to make some modifications to land the fds. Make it clear
-    // that there are no updates to the msg being passed in during this call.
-    struct msghdr msg;
-    msg_in.Convert(&msg);
-    union {
-      char buffer[CMSG_SPACE(SZ * sizeof(int))];
-      struct cmsghdr this_aligns_buffer;
-    } u;
-    msg.msg_control = u.buffer;
-    msg.msg_controllen = sizeof(u.buffer);
-
-    cmsghdr* cmsg = CMSG_FIRSTHDR(&msg);
-    cmsg->cmsg_len = CMSG_LEN(SZ * sizeof(int));
-    cmsg->cmsg_level = SOL_SOCKET;
-    cmsg->cmsg_type = SCM_RIGHTS;
-    int* fd_array = reinterpret_cast<int*>(CMSG_DATA(cmsg));
-    for (size_t i = 0; i < SZ; ++i) {
-      fd_array[i] = -1;
-    }
-    ssize_t rval = RecvMsg(&msg, flags);
-    for (size_t i = 0; i < SZ; ++i) {
-      (*new_fds)[i] =
-          std::shared_ptr<FileInstance>(new FileInstance(fd_array[i], errno));
-    }
-    return rval;
-  }
-
   ssize_t Read(void* buf, size_t count) {
     errno = 0;
     ssize_t rval = TEMP_FAILURE_RETRY(read(fd_, buf, count));
@@ -428,29 +310,6 @@
     return rval;
   }
 
-  template <size_t SZ>
-  ssize_t SendMsgAndFDs(const struct InbandMessageHeader& msg_in, int flags,
-                        const SharedFD (&fds)[SZ]) {
-    struct msghdr msg;
-    msg_in.Convert(&msg);
-    union {
-      char buffer[CMSG_SPACE(SZ * sizeof(int))];
-      struct cmsghdr this_aligns_buffer;
-    } u;
-    msg.msg_control = u.buffer;
-    msg.msg_controllen = sizeof(u.buffer);
-
-    cmsghdr* cmsg = CMSG_FIRSTHDR(&msg);
-    cmsg->cmsg_len = CMSG_LEN(SZ * sizeof(int));
-    cmsg->cmsg_level = SOL_SOCKET;
-    cmsg->cmsg_type = SCM_RIGHTS;
-    int* fd_array = reinterpret_cast<int*>(CMSG_DATA(cmsg));
-    for (size_t i = 0; i < SZ; ++i) {
-      fd_array[i] = fds[i]->fd_;
-    }
-    return SendMsg(&msg, flags);
-  }
-
   int Shutdown(int how) {
     errno = 0;
     int rval = shutdown(fd_, how);
@@ -458,15 +317,6 @@
     return rval;
   }
 
-  ssize_t SendTo(const void* buf, size_t len, int flags,
-                 const struct sockaddr* dest_addr, socklen_t addrlen) {
-    errno = 0;
-    ssize_t rval =
-        TEMP_FAILURE_RETRY(sendto(fd_, buf, len, flags, dest_addr, addrlen));
-    errno_ = errno;
-    return rval;
-  }
-
   void Set(fd_set* dest, int* max_index) const;
 
   int SetSockOpt(int level, int optname, const void* optval, socklen_t optlen) {
@@ -492,21 +342,6 @@
     return strerror_buf_;
   }
 
-  int TimerGet(struct itimerspec* curr_value) {
-    errno = 0;
-    int rval = timerfd_gettime(fd_, curr_value);
-    errno_ = errno;
-    return rval;
-  }
-
-  int TimerSet(int flags, const struct itimerspec* new_value,
-               struct itimerspec* old_value) {
-    errno = 0;
-    int rval = timerfd_settime(fd_, flags, new_value, old_value);
-    errno_ = errno;
-    return rval;
-  }
-
   ssize_t Truncate(off_t length) {
     errno = 0;
     ssize_t rval = TEMP_FAILURE_RETRY(ftruncate(fd_, length));
@@ -521,13 +356,6 @@
     return rval;
   }
 
-  ssize_t WriteV(struct iovec* iov, int iovcount) {
-    errno = 0;
-    ssize_t rval = TEMP_FAILURE_RETRY(writev(fd_, iov, iovcount));
-    errno_ = errno;
-    return rval;
-  }
-
  private:
   FileInstance(int fd, int in_errno) : fd_(fd), errno_(in_errno) {
     // Ensure every file descriptor managed by a FileInstance has the CLOEXEC
diff --git a/common/libs/fs/shared_fd_test.cpp b/common/libs/fs/shared_fd_test.cpp
index 3423619..7ca6204 100644
--- a/common/libs/fs/shared_fd_test.cpp
+++ b/common/libs/fs/shared_fd_test.cpp
@@ -23,48 +23,17 @@
 
 #include <string>
 
-using cvd::InbandMessageHeader;
 using cvd::SharedFD;
 
-char hello[] = "Hello, world!";
 char pipe_message[] = "Testing the pipe";
 
 TEST(SendFD, Basic) {
-  char dirname[] = "/tmp/sfdtestXXXXXX";
-  char* socket = mkdtemp(dirname);
-  EXPECT_TRUE(socket != NULL);
-  std::string path(dirname);
-  path += "/s";
-  SharedFD server = SharedFD::SocketSeqPacketServer(path.c_str(), 0700);
-  EXPECT_TRUE(server->IsOpen());
-  int rval = fork();
-  EXPECT_NE(-1, rval);
-  if (!rval) {
-    struct iovec iov { hello, sizeof(hello) };
-    SharedFD client = SharedFD::SocketSeqPacketClient(path.c_str());
-    InbandMessageHeader hdr{};
-    hdr.msg_iov = &iov;
-    hdr.msg_iovlen = 1;
-    SharedFD fds[2];
-    SharedFD::Pipe(fds, fds + 1);
-    ssize_t rval = client->SendMsgAndFDs(hdr, 0, fds);
-    printf("SendMsg sent %zd (%s)\n", rval, client->StrError());
-    exit(0);
-  }
-  server->Listen(2);
-  SharedFD peer = SharedFD::Accept(*server);
-  EXPECT_TRUE(peer->IsOpen());
-  char buf[80];
-  struct iovec iov { buf, sizeof(buf) };
-  InbandMessageHeader hdr{};
-  hdr.msg_iov = &iov;
-  hdr.msg_iovlen = 1;
   SharedFD fds[2];
-  peer->RecvMsgAndFDs(hdr, 0, &fds);
-  EXPECT_EQ(0, strcmp(buf, hello));
+  SharedFD::Pipe(fds, fds + 1);
   EXPECT_TRUE(fds[0]->IsOpen());
   EXPECT_TRUE(fds[1]->IsOpen());
   EXPECT_EQ(sizeof(pipe_message), fds[1]->Write(pipe_message, sizeof(pipe_message)));
+  char buf[80];
   EXPECT_EQ(sizeof(pipe_message), fds[0]->Read(buf, sizeof(buf)));
   EXPECT_EQ(0, strcmp(buf, pipe_message));
 }
diff --git a/common/libs/utils/size_utils.cpp b/common/libs/utils/size_utils.cpp
index c43bf96..0f7ed3c 100644
--- a/common/libs/utils/size_utils.cpp
+++ b/common/libs/utils/size_utils.cpp
@@ -20,19 +20,6 @@
 
 namespace cvd {
 
-uint32_t AlignToPageSize(uint32_t val) {
-  static uint32_t page_size = sysconf(_SC_PAGESIZE);
-  return ((val + (page_size - 1)) / page_size) * page_size;
-}
-
-uint32_t RoundUpToNextPowerOf2(uint32_t val) {
-  uint32_t power_of_2 = 1;
-  while (power_of_2 < val) {
-    power_of_2 *= 2;
-  }
-  return power_of_2;
-}
-
 uint32_t AlignToPowerOf2(uint32_t val, uint8_t align_log) {
   uint32_t align = 1 << align_log;
   return ((val + (align - 1)) / align) * align;
diff --git a/common/libs/utils/size_utils.h b/common/libs/utils/size_utils.h
index 1d34493..42044ec 100644
--- a/common/libs/utils/size_utils.h
+++ b/common/libs/utils/size_utils.h
@@ -19,12 +19,6 @@
 
 namespace cvd {
 
-// Returns the smallest multiple of PAGE_SIZE greater than or equal to val.
-uint32_t AlignToPageSize(uint32_t val);
-
-// Returns the smallest power of two greater than or equal to val.
-uint32_t RoundUpToNextPowerOf2(uint32_t val);
-
 // Returns the smallest multiple of 2^align_log greater than or equal to val.
 uint32_t AlignToPowerOf2(uint32_t val, uint8_t align_log);
 
