diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt
index 9b1969c91c365078afee00ea4fb05a012832af9d..f5a78911d25c9ab99e7b911756b0f829fd3911c2 100644
--- a/common/CMakeLists.txt
+++ b/common/CMakeLists.txt
@@ -100,6 +100,7 @@ set (COMMON_LIB_SRC_FILES
   remoteFS/RemoteFileStatus.cpp
   remoteFS/RemotePath.cpp
   remoteFS/RemotePathAndStatus.cpp
+  SmartFd.cpp
   threading/ChildProcess.cpp
   threading/Daemon.cpp
   threading/Mutex.cpp
@@ -136,6 +137,7 @@ set (COMMON_UNIT_TESTS_LIB_SRC_FILES
   log/SyslogLoggerTest.cpp
   log/StringLoggerTest.cpp
   remoteFS/RemotePathTest.cpp
+  SmartFdTest.cpp
   threading/DaemonTest.cpp
   threading/SocketPairTest.cpp
   utils/UtilsTest.cpp
diff --git a/tapeserver/castor/utils/SmartFd.cpp b/common/SmartFd.cpp
similarity index 88%
rename from tapeserver/castor/utils/SmartFd.cpp
rename to common/SmartFd.cpp
index f492622ebb973ef830b4aea65e07450853cb6117..09c1dda7470bfa53361c10354268e39a513dfd46 100644
--- a/tapeserver/castor/utils/SmartFd.cpp
+++ b/common/SmartFd.cpp
@@ -22,7 +22,7 @@
  * @author Castor Dev team, castor-dev@cern.ch
  *****************************************************************************/
 
-#include "castor/utils/SmartFd.hpp"
+#include "common/SmartFd.hpp"
 
 #include <errno.h>
 #include <unistd.h>
@@ -30,21 +30,21 @@
 //-----------------------------------------------------------------------------
 // constructor
 //-----------------------------------------------------------------------------
-castor::utils::SmartFd::SmartFd() throw():
+cta::SmartFd::SmartFd() throw():
   m_fd(-1), m_closedCallback(NULL) {
 }
 
 //-----------------------------------------------------------------------------
 // constructor
 //-----------------------------------------------------------------------------
-castor::utils::SmartFd::SmartFd(const int fd) throw():
+cta::SmartFd::SmartFd(const int fd) throw():
   m_fd(fd), m_closedCallback(NULL) {
 }
 
 //-----------------------------------------------------------------------------
 // setClosedCallback
 //-----------------------------------------------------------------------------
-void castor::utils::SmartFd::setClosedCallback(ClosedCallback closedCallback)
+void cta::SmartFd::setClosedCallback(ClosedCallback closedCallback)
   throw() {
   m_closedCallback = closedCallback;
 }
@@ -52,7 +52,7 @@ void castor::utils::SmartFd::setClosedCallback(ClosedCallback closedCallback)
 //-----------------------------------------------------------------------------
 // reset
 //-----------------------------------------------------------------------------
-void castor::utils::SmartFd::reset(const int fd = -1) throw() {
+void cta::SmartFd::reset(const int fd = -1) throw() {
   // If the new file descriptor is not the one already owned
   if(fd != m_fd) {
 
@@ -78,8 +78,7 @@ void castor::utils::SmartFd::reset(const int fd = -1) throw() {
 //-----------------------------------------------------------------------------
 // SmartFd assignment operator
 //-----------------------------------------------------------------------------
-castor::utils::SmartFd &castor::utils::SmartFd::operator=(SmartFd& obj)
-   {
+cta::SmartFd &cta::SmartFd::operator=(SmartFd& obj) {
   reset(obj.release());
   return *this;
 }
@@ -87,21 +86,21 @@ castor::utils::SmartFd &castor::utils::SmartFd::operator=(SmartFd& obj)
 //-----------------------------------------------------------------------------
 // destructor
 //-----------------------------------------------------------------------------
-castor::utils::SmartFd::~SmartFd() {
+cta::SmartFd::~SmartFd() {
   reset();
 }
 
 //-----------------------------------------------------------------------------
 // get
 //-----------------------------------------------------------------------------
-int castor::utils::SmartFd::get() const throw() {
+int cta::SmartFd::get() const throw() {
   return m_fd;
 }
 
 //-----------------------------------------------------------------------------
 // release
 //-----------------------------------------------------------------------------
-int castor::utils::SmartFd::release()  {
+int cta::SmartFd::release()  {
   // If this SmartFd does not own a file descriptor
   if(m_fd < 0) {
     cta::exception::NotAnOwner ex;
diff --git a/tapeserver/castor/utils/SmartFd.hpp b/common/SmartFd.hpp
similarity index 98%
rename from tapeserver/castor/utils/SmartFd.hpp
rename to common/SmartFd.hpp
index 189cbfabef57e98c64aec81f245a6370dd6935bc..e00d1d104b342e11bbcff6b3048d9b20a8ba7981 100644
--- a/tapeserver/castor/utils/SmartFd.hpp
+++ b/common/SmartFd.hpp
@@ -25,8 +25,7 @@
 
 #include "common/exception/NotAnOwner.hpp"
 
-namespace castor {
-namespace utils  {
+namespace cta {
 
 /**
  * A smart file descriptor that owns a basic file descriptor.  When the smart
@@ -149,6 +148,4 @@ private:
 
 }; // class SmartFd
 
-} // namespace utils
-} // namespace castor
-
+} // namespace cta
diff --git a/tapeserver/castor/utils/SmartFdTest.cpp b/common/SmartFdTest.cpp
similarity index 86%
rename from tapeserver/castor/utils/SmartFdTest.cpp
rename to common/SmartFdTest.cpp
index 6cd927eee90da6249af6b5af89841d8cd6b126e5..4dc319473337ffcfc0087490ca95a35adfe288a0 100644
--- a/tapeserver/castor/utils/SmartFdTest.cpp
+++ b/common/SmartFdTest.cpp
@@ -21,7 +21,7 @@
  * @author Castor Dev team, castor-dev@cern.ch
  *****************************************************************************/
 
-#include "castor/utils/SmartFd.hpp"
+#include "common/SmartFd.hpp"
 
 #include <gtest/gtest.h>
 #include <sys/types.h>
@@ -31,7 +31,7 @@
 
 namespace unitTests {
 
-class castor_utils_SmartFdTest : public ::testing::Test {
+class cta_SmartFdTest : public ::testing::Test {
 protected:
   static int s_fd;
   static bool s_closedCallbackWasCalled;
@@ -50,11 +50,11 @@ protected:
   }
 };
 
-int castor_utils_SmartFdTest::s_fd = -1;
-bool castor_utils_SmartFdTest::s_closedCallbackWasCalled = false;
+int cta_SmartFdTest::s_fd = -1;
+bool cta_SmartFdTest::s_closedCallbackWasCalled = false;
 
-TEST_F(castor_utils_SmartFdTest, testClosedCallback) {
-  using namespace castor::utils;
+TEST_F(cta_SmartFdTest, testClosedCallback) {
+  using namespace cta;
 
   ASSERT_EQ(-1, s_fd);
   ASSERT_FALSE(s_closedCallbackWasCalled);
diff --git a/tapeserver/castor/io/IoTest.cpp b/tapeserver/castor/io/IoTest.cpp
index 9a9504f48b040382fb00efd3743cb8c158a40246..d956b21f929e45a36ad7fe984155adec011e5c75 100644
--- a/tapeserver/castor/io/IoTest.cpp
+++ b/tapeserver/castor/io/IoTest.cpp
@@ -22,9 +22,9 @@
  *****************************************************************************/
 
 #include "castor/io/io.hpp"
-#include "castor/utils/SmartFd.hpp"
 #include "castor/io/marshall.h"
 #include "common/exception/Errnum.hpp"
+#include "common/SmartFd.hpp"
 
 #include <fcntl.h>
 #include <gtest/gtest.h>
@@ -58,7 +58,7 @@ protected:
     unlink(listenSockPath);
 
     // Create the socket
-    castor::utils::SmartFd smartListenSock(socket(PF_LOCAL, SOCK_STREAM, 0));
+    cta::SmartFd smartListenSock(socket(PF_LOCAL, SOCK_STREAM, 0));
     if(-1 == smartListenSock.get()) {
       char strErrBuf[256];
       if(0 != strerror_r(errno, strErrBuf, sizeof(strErrBuf))) {
@@ -112,11 +112,11 @@ protected:
 }; // class castor_io_IoTest
 
 TEST_F(castor_io_IoTest, connectWithTimeout) {
-  castor::utils::SmartFd smartListenSock;
+  cta::SmartFd smartListenSock;
   ASSERT_NO_THROW(smartListenSock.reset(
     createLocalListenSocket(m_listenSockPath)));
 
-  castor::utils::SmartFd smartClientConnectionSock;
+  cta::SmartFd smartClientConnectionSock;
   {
     const int             sockDomain   = PF_LOCAL;
     const int             sockType     = SOCK_STREAM;
@@ -138,7 +138,7 @@ TEST_F(castor_io_IoTest, connectWithTimeout) {
         timeout)));
   }
 
-  castor::utils::SmartFd smartServerConnectionSock;
+  cta::SmartFd smartServerConnectionSock;
   {
     const time_t acceptTimeout = 10; // Timeout is in seconds
     ASSERT_NO_THROW(smartServerConnectionSock.reset(
diff --git a/tapeserver/castor/io/io.cpp b/tapeserver/castor/io/io.cpp
index c10b8d55399780f54f0a4e32ce89d178d66f4641..93dc94b57ef70cbefa31d24f8f0e54aae8dc0d04 100644
--- a/tapeserver/castor/io/io.cpp
+++ b/tapeserver/castor/io/io.cpp
@@ -24,9 +24,9 @@
 
 #include "common/exception/InvalidArgument.hpp"
 #include "castor/io/io.hpp"
-#include "castor/utils/SmartFd.hpp"
 #include "castor/utils/utils.hpp"
 #include "common/exception/Exception.hpp"
+#include "common/SmartFd.hpp"
 #include "common/utils/utils.hpp"
 #include "common/Timer.hpp"
 #include "common/exception/Errnum.hpp"
@@ -129,7 +129,7 @@ int castor::io::createListenerSock(
   }
 
   // Create a socket
-  utils::SmartFd sock(socket(PF_INET, SOCK_STREAM, IPPROTO_TCP));
+  cta::SmartFd sock(socket(PF_INET, SOCK_STREAM, IPPROTO_TCP));
   if(sock.get() < 0) {
     cta::exception::Exception ex;
     ex.getMessage() << ": Failed to create socket: " 
@@ -909,7 +909,7 @@ int castor::io::connectWithTimeout(
   throw(cta::exception::TimeOut, cta::exception::Exception) {
 
   // Create the socket for the new connection
-  utils::SmartFd smartSock(socket(sockDomain, sockType, sockProtocol));
+  cta::SmartFd smartSock(socket(sockDomain, sockType, sockProtocol));
   if(-1 == smartSock.get()) {
     cta::exception::Exception ex;
     ex.getMessage() <<
diff --git a/tapeserver/castor/legacymsg/RmcProxyTcpIp.cpp b/tapeserver/castor/legacymsg/RmcProxyTcpIp.cpp
index efe19ae2458af618a54ecc46b5218206ce8fad17..26c68ee2ec305aa693160334f81ab615e8197c39 100644
--- a/tapeserver/castor/legacymsg/RmcProxyTcpIp.cpp
+++ b/tapeserver/castor/legacymsg/RmcProxyTcpIp.cpp
@@ -23,9 +23,9 @@
 #include "castor/legacymsg/CommonMarshal.hpp"
 #include "castor/legacymsg/RmcMarshal.hpp"
 #include "castor/legacymsg/RmcProxyTcpIp.hpp"
-#include "castor/utils/SmartFd.hpp"
 #include "castor/utils/utils.hpp"
 #include "Castor_limits.h"
+#include "common/SmartFd.hpp"
 #include "rmc_constants.h"
 
 //------------------------------------------------------------------------------
@@ -117,7 +117,7 @@ void castor::legacymsg::RmcProxyTcpIp::forceDismountTape(const std::string &vid,
 int castor::legacymsg::RmcProxyTcpIp::connectToRmc()
   const {
   const std::string rmcHost = "localhost";
-  castor::utils::SmartFd smartConnectSock;
+  cta::SmartFd smartConnectSock;
   try {
     smartConnectSock.reset(io::connectWithTimeout(rmcHost, m_rmcPort,
       m_netTimeout));
diff --git a/tapeserver/castor/legacymsg/RmcProxyTcpIp.hpp b/tapeserver/castor/legacymsg/RmcProxyTcpIp.hpp
index 4bac1c34b0226683b840844a5d749d083c54a7fc..af89a513a2060785ef5a7bddb2a5ef867f3fcd4b 100644
--- a/tapeserver/castor/legacymsg/RmcProxyTcpIp.hpp
+++ b/tapeserver/castor/legacymsg/RmcProxyTcpIp.hpp
@@ -26,8 +26,8 @@
 #include "castor/legacymsg/RmcMountMsgBody.hpp"
 #include "castor/legacymsg/RmcProxy.hpp"
 #include "castor/legacymsg/RmcUnmountMsgBody.hpp"
-#include "castor/utils/SmartFd.hpp"
 #include "castor/utils/utils.hpp"
+#include "common/SmartFd.hpp"
 #include "h/rmc_constants.h"
 
 #include <unistd.h>
@@ -240,7 +240,7 @@ protected:
   template<typename T> int rmcSendRecv(const T &rqstBody,
     std::ostringstream &rmcErrorStream) {
     // Connect to rmcd and send request
-    castor::utils::SmartFd fd(connectToRmc());
+    cta::SmartFd fd(connectToRmc());
     {
       char buf[RMC_MSGBUFSIZ];
       const size_t len = marshal(buf, rqstBody);
diff --git a/tapeserver/castor/tape/tapeserver/daemon/ProcessForkerConnectionHandler.cpp b/tapeserver/castor/tape/tapeserver/daemon/ProcessForkerConnectionHandler.cpp
index 980a82d921b76c567a51c174d4e644db09f726ae..bbbdedb45761ec6aada162304a33d8dd30300277 100644
--- a/tapeserver/castor/tape/tapeserver/daemon/ProcessForkerConnectionHandler.cpp
+++ b/tapeserver/castor/tape/tapeserver/daemon/ProcessForkerConnectionHandler.cpp
@@ -24,7 +24,7 @@
 #include "castor/tape/tapeserver/daemon/ProcessForkerConnectionHandler.hpp"
 #include "castor/tape/tapeserver/daemon/ProcessForkerUtils.hpp"
 #include "castor/tape/tapeserver/daemon/Session.hpp"
-#include "castor/utils/SmartFd.hpp"
+#include "common/SmartFd.hpp"
 
 //------------------------------------------------------------------------------
 // constructor
diff --git a/tapeserver/castor/tape/tapeserver/daemon/ProcessForkerTest.cpp b/tapeserver/castor/tape/tapeserver/daemon/ProcessForkerTest.cpp
index 651656057d3077356442e6e9f6744c85a01b4f59..696cab3050201ab64fa6cc5bc46892f7cc059ce5 100644
--- a/tapeserver/castor/tape/tapeserver/daemon/ProcessForkerTest.cpp
+++ b/tapeserver/castor/tape/tapeserver/daemon/ProcessForkerTest.cpp
@@ -24,7 +24,7 @@
 #include "castor/log/DummyLogger.hpp"
 #include "castor/tape/tapeserver/daemon/ProcessForker.hpp"
 #include "castor/tape/tapeserver/daemon/ProcessForkerProxySocket.hpp"
-#include "castor/utils/SmartFd.hpp"
+#include "common/SmartFd.hpp"
 
 #include <gtest/gtest.h>
 #include <memory>
@@ -48,13 +48,13 @@ TEST_F(castor_tape_tapeserver_daemon_ProcessForkerTest, constructor) {
 
   int cmdPair[2] = {-1, -1};
   ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, cmdPair));
-  castor::utils::SmartFd cmdSenderSocket(cmdPair[0]);
-  castor::utils::SmartFd cmdReceiverSocket(cmdPair[1]);
+  cta::SmartFd cmdSenderSocket(cmdPair[0]);
+  cta::SmartFd cmdReceiverSocket(cmdPair[1]);
 
   int reaperPair[2] = {-1, -1};
   ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, reaperPair));
-  castor::utils::SmartFd reaperSenderSocket(reaperPair[0]);
-  castor::utils::SmartFd reaperReceiverSocket(reaperPair[1]);
+  cta::SmartFd reaperSenderSocket(reaperPair[0]);
+  cta::SmartFd reaperReceiverSocket(reaperPair[1]);
 
   const std::string programName = "unittests";
   const std::string hostName = "hostName";
@@ -73,13 +73,13 @@ TEST_F(castor_tape_tapeserver_daemon_ProcessForkerTest, socketproxy) {
 
   int cmdPair[2] = {-1, -1};
   ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, cmdPair));
-  castor::utils::SmartFd cmdSenderSocket(cmdPair[0]);
-  castor::utils::SmartFd cmdReceiverSocket(cmdPair[1]);
+  cta::SmartFd cmdSenderSocket(cmdPair[0]);
+  cta::SmartFd cmdReceiverSocket(cmdPair[1]);
 
   int reaperPair[2] = {-1, -1};
   ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, reaperPair));
-  castor::utils::SmartFd reaperSenderSocket(reaperPair[0]);
-  castor::utils::SmartFd reaperReceiverSocket(reaperPair[1]);
+  cta::SmartFd reaperSenderSocket(reaperPair[0]);
+  cta::SmartFd reaperReceiverSocket(reaperPair[1]);
   
   const std::string programName = "unittests";
   const std::string hostName = "hostName";
diff --git a/tapeserver/castor/tape/tapeserver/daemon/TapeDaemon.cpp b/tapeserver/castor/tape/tapeserver/daemon/TapeDaemon.cpp
index 64014a907fe6a0c94ada18825838c41af467b7ee..d49761e8cb3de376c11e52f6dfd537a3db6739a2 100644
--- a/tapeserver/castor/tape/tapeserver/daemon/TapeDaemon.cpp
+++ b/tapeserver/castor/tape/tapeserver/daemon/TapeDaemon.cpp
@@ -39,8 +39,8 @@
 #include "castor/tape/tapeserver/daemon/TapeMessageHandler.hpp"
 #include "castor/tape/tapeserver/file/File.hpp"
 #include "castor/tape/tapeserver/TapeBridgeConstants.hpp"
-#include "castor/utils/SmartFd.hpp"
 #include "castor/utils/utils.hpp"
+#include "common/SmartFd.hpp"
 #include "rmc_constants.h"
 
 #include <algorithm>
diff --git a/tapeserver/castor/utils/CMakeLists.txt b/tapeserver/castor/utils/CMakeLists.txt
index c6ea0568226fef1a45974685a5f28381e678c434..899fab9a20d6fdd9c0cce04ff7e4938f912c2244 100644
--- a/tapeserver/castor/utils/CMakeLists.txt
+++ b/tapeserver/castor/utils/CMakeLists.txt
@@ -24,7 +24,6 @@ include_directories(${PROJECT_SOURCE_DIR}/tapeserver)
 
 set_source_files_properties(CRC.cpp PROPERTIES COMPILE_FLAGS -O2)
 set (UTILS_LIB_SRC_FILES
-  SmartFd.cpp
   SmartFILEPtr.cpp
   Timer.cpp
   CRC.cpp
@@ -50,7 +49,6 @@ install(TARGETS ctautils DESTINATION usr/${CMAKE_INSTALL_LIBDIR})
 
 add_library (ctautilsunittests SHARED
   SmartArrayPtrTest.cpp
-  SmartFdTest.cpp
   UtilsTest.cpp)
 
 install(TARGETS ctautilsunittests DESTINATION usr/${CMAKE_INSTALL_LIBDIR})