diff --git a/libs/gui/BitTube.cpp b/libs/gui/BitTube.cpp
index 63f594b..c023711 100644
--- a/libs/gui/BitTube.cpp
+++ b/libs/gui/BitTube.cpp
@@ -34,26 +34,14 @@
 // need. So we make it smaller.
 static const size_t DEFAULT_SOCKET_BUFFER_SIZE = 4 * 1024;
 
-BitTube::BitTube() : mSendFd(-1), mReceiveFd(-1) {
-    init(DEFAULT_SOCKET_BUFFER_SIZE, DEFAULT_SOCKET_BUFFER_SIZE);
-}
-
-BitTube::BitTube(size_t bufsize) : mSendFd(-1), mReceiveFd(-1) {
+BitTube::BitTube(size_t bufsize) {
     init(bufsize, bufsize);
 }
 
-BitTube::BitTube(const Parcel& data) : mSendFd(-1), mReceiveFd(-1) {
-    mReceiveFd = dup(data.readFileDescriptor());
-    if (mReceiveFd < 0) {
-        mReceiveFd = -errno;
-        ALOGE("BitTube(Parcel): can't dup filedescriptor (%s)", strerror(-mReceiveFd));
-    }
-}
+BitTube::BitTube(DefaultSizeType) : BitTube(DEFAULT_SOCKET_BUFFER_SIZE) {}
 
-BitTube::~BitTube() {
-    if (mSendFd >= 0) close(mSendFd);
-
-    if (mReceiveFd >= 0) close(mReceiveFd);
+BitTube::BitTube(const Parcel& data) {
+    readFromParcel(&data);
 }
 
 void BitTube::init(size_t rcvbuf, size_t sndbuf) {
@@ -67,11 +55,11 @@
         setsockopt(sockets[1], SOL_SOCKET, SO_RCVBUF, &size, sizeof(size));
         fcntl(sockets[0], F_SETFL, O_NONBLOCK);
         fcntl(sockets[1], F_SETFL, O_NONBLOCK);
-        mReceiveFd = sockets[0];
-        mSendFd = sockets[1];
+        mReceiveFd.reset(sockets[0]);
+        mSendFd.reset(sockets[1]);
     } else {
-        mReceiveFd = -errno;
-        ALOGE("BitTube: pipe creation failed (%s)", strerror(-mReceiveFd));
+        mReceiveFd.reset();
+        ALOGE("BitTube: pipe creation failed (%s)", strerror(errno));
     }
 }
 
@@ -118,11 +106,21 @@
     if (mReceiveFd < 0) return -EINVAL;
 
     status_t result = reply->writeDupFileDescriptor(mReceiveFd);
-    close(mReceiveFd);
-    mReceiveFd = -1;
+    mReceiveFd.reset();
     return result;
 }
 
+status_t BitTube::readFromParcel(const Parcel* parcel) {
+    mReceiveFd.reset(dup(parcel->readFileDescriptor()));
+    if (mReceiveFd < 0) {
+        mReceiveFd.reset();
+        int error = errno;
+        ALOGE("BitTube::readFromParcel: can't dup file descriptor (%s)", strerror(error));
+        return -error;
+    }
+    return NO_ERROR;
+}
+
 ssize_t BitTube::sendObjects(const sp<BitTube>& tube, void const* events, size_t count,
                              size_t objSize) {
     const char* vaddr = reinterpret_cast<const char*>(events);
diff --git a/libs/gui/include/private/gui/BitTube.h b/libs/gui/include/private/gui/BitTube.h
index 1a77e63..e93dc5f 100644
--- a/libs/gui/include/private/gui/BitTube.h
+++ b/libs/gui/include/private/gui/BitTube.h
@@ -20,6 +20,8 @@
 #include <sys/types.h>
 
 #include <android/log.h>
+#include <android-base/unique_fd.h>
+#include <binder/Parcelable.h>
 #include <utils/Errors.h>
 #include <utils/RefBase.h>
 
@@ -29,16 +31,22 @@
 
 namespace gui {
 
-class BitTube : public RefBase {
+class BitTube : public RefBase, public Parcelable {
 public:
-    // creates a BitTube with a default (4KB) send buffer
-    BitTube();
+    // creates an uninitialized BitTube (to unparcel into)
+    BitTube() = default;
 
     // creates a BitTube with a a specified send and receive buffer size
     explicit BitTube(size_t bufsize);
 
+    // creates a BitTube with a default (4KB) send buffer
+    struct DefaultSizeType {};
+    static constexpr DefaultSizeType DefaultSize{};
+    explicit BitTube(DefaultSizeType);
+
     explicit BitTube(const Parcel& data);
-    virtual ~BitTube();
+
+    virtual ~BitTube() = default;
 
     // check state after construction
     status_t initCheck() const;
@@ -62,8 +70,9 @@
         return recvObjects(tube, events, count, sizeof(T));
     }
 
-    // parcels this BitTube
+    // implement the Parcelable protocol. Only parcels the receive file descriptor
     status_t writeToParcel(Parcel* reply) const;
+    status_t readFromParcel(const Parcel* parcel);
 
 private:
     void init(size_t rcvbuf, size_t sndbuf);
@@ -75,8 +84,8 @@
     // the message, excess data is silently discarded.
     ssize_t read(void* vaddr, size_t size);
 
-    int mSendFd;
-    mutable int mReceiveFd;
+    base::unique_fd mSendFd;
+    mutable base::unique_fd mReceiveFd;
 
     static ssize_t sendObjects(const sp<BitTube>& tube, void const* events, size_t count,
                                size_t objSize);
