diff --git a/auth_algo.cpp b/auth_algo.cpp
index b71636b..f062b0f 100644
--- a/auth_algo.cpp
+++ b/auth_algo.cpp
@@ -11,7 +11,8 @@
 namespace rakp_auth
 {
 
-std::vector<uint8_t> AlgoSHA1::generateHMAC(std::vector<uint8_t>& input) const
+std::vector<uint8_t> AlgoSHA1::generateHMAC(
+        const std::vector<uint8_t>& input) const
 {
     std::vector<uint8_t> output(SHA_DIGEST_LENGTH);
     unsigned int mdLen = 0;
@@ -26,7 +27,8 @@
     return output;
 }
 
-std::vector<uint8_t> AlgoSHA1::generateICV(std::vector<uint8_t>& input) const
+std::vector<uint8_t> AlgoSHA1::generateICV(
+        const std::vector<uint8_t>& input) const
 {
     std::vector<uint8_t> output(SHA_DIGEST_LENGTH);
     unsigned int mdLen = 0;
diff --git a/auth_algo.hpp b/auth_algo.hpp
index 2c3b0da..997e2c9 100644
--- a/auth_algo.hpp
+++ b/auth_algo.hpp
@@ -74,7 +74,7 @@
          *        needs to be set before this operation.
          */
         std::vector<uint8_t> virtual generateHMAC(
-            std::vector<uint8_t>& input) const = 0;
+            const std::vector<uint8_t>& input) const = 0;
 
         /**
          * @brief Generate the Integrity Check Value
@@ -90,7 +90,7 @@
          *        hash operation needs to be set before this operation.
          */
         std::vector<uint8_t> virtual generateICV(
-            std::vector<uint8_t>& input) const = 0;
+            const std::vector<uint8_t>& input) const = 0;
 
         // User Key is hardcoded to PASSW0RD till the IPMI User account
         // management is in place.
@@ -150,11 +150,11 @@
         AlgoSHA1(AlgoSHA1&&) = default;
         AlgoSHA1& operator=(AlgoSHA1&&) = default;
 
-        std::vector<uint8_t> generateHMAC(std::vector<uint8_t>& input) const
-        override;
+        std::vector<uint8_t> generateHMAC(
+                const std::vector<uint8_t>& input) const override;
 
-        std::vector<uint8_t> generateICV(std::vector<uint8_t>& input) const
-        override;
+        std::vector<uint8_t> generateICV(
+                const std::vector<uint8_t>& input) const override;
 };
 
 }// namespace auth
diff --git a/command/sol_cmds.cpp b/command/sol_cmds.cpp
index f475c03..fd9a610 100644
--- a/command/sol_cmds.cpp
+++ b/command/sol_cmds.cpp
@@ -18,7 +18,7 @@
     auto request = reinterpret_cast<const Payload*>(inPayload.data());
     auto solDataSize = inPayload.size() - sizeof(Payload);
 
-    Buffer charData(solDataSize);
+    std::vector<uint8_t> charData(solDataSize);
     if( solDataSize > 0)
     {
         std::copy_n(inPayload.data() + sizeof(Payload),
diff --git a/crypt_algo.cpp b/crypt_algo.cpp
index baeb606..f33bca4 100644
--- a/crypt_algo.cpp
+++ b/crypt_algo.cpp
@@ -12,12 +12,13 @@
 namespace crypt
 {
 
-Interface::Interface(const buffer& sik, const key& addKey)
+Interface::Interface(const std::vector<uint8_t>& sik, const key& addKey)
 {
     unsigned int mdLen = 0;
 
     // Generated K2 for the confidentiality algorithm with the additional key
     // keyed with SIK.
+    k2.resize(sik.size());
     if (HMAC(EVP_sha1(), sik.data(), sik.size(), addKey.data(),
              addKey.size(), k2.data(), &mdLen) == NULL)
     {
@@ -31,9 +32,10 @@
 constexpr std::array<uint8_t, AlgoAES128::AESCBC128BlockSize - 1>
         AlgoAES128::confPadBytes;
 
-buffer AlgoAES128::decryptPayload(const buffer& packet,
-                                  const size_t sessHeaderLen,
-                                  const size_t payloadLen) const
+std::vector<uint8_t> AlgoAES128::decryptPayload(
+        const std::vector<uint8_t>& packet,
+        const size_t sessHeaderLen,
+        const size_t payloadLen) const
 {
     auto plainPayload = decryptData(
             packet.data() + sessHeaderLen,
@@ -63,7 +65,8 @@
     return plainPayload;
 }
 
-buffer AlgoAES128::encryptPayload(buffer& payload) const
+std::vector<uint8_t> AlgoAES128::encryptPayload(
+        std::vector<uint8_t>& payload) const
 {
     auto payloadLen = payload.size();
 
@@ -100,7 +103,7 @@
     return encryptData(payload.data(), payload.size());
 }
 
-buffer AlgoAES128::decryptData(const uint8_t* iv,
+std::vector<uint8_t> AlgoAES128::decryptData(const uint8_t* iv,
                                const uint8_t* input,
                                const int inputLen) const
 {
@@ -136,7 +139,7 @@
      */
     EVP_CIPHER_CTX_set_padding(ctxPtr.get(), 0);
 
-    buffer output(inputLen + AESCBC128BlockSize);
+    std::vector<uint8_t> output(inputLen + AESCBC128BlockSize);
 
     int outputLen = 0;
 
@@ -159,9 +162,10 @@
     return output;
 }
 
-buffer AlgoAES128::encryptData(const uint8_t* input, const int inputLen) const
+std::vector<uint8_t> AlgoAES128::encryptData(const uint8_t* input,
+        const int inputLen) const
 {
-    buffer output(inputLen + AESCBC128BlockSize);
+    std::vector<uint8_t> output(inputLen + AESCBC128BlockSize);
 
     // Generate the initialization vector
     if (!RAND_bytes(output.data(), AESCBC128ConfHeader))
diff --git a/crypt_algo.hpp b/crypt_algo.hpp
index d1e3940..ccef7d8 100644
--- a/crypt_algo.hpp
+++ b/crypt_algo.hpp
@@ -10,7 +10,6 @@
 namespace crypt
 {
 
-using buffer = std::vector<uint8_t>;
 using key = std::array<uint8_t, SHA_DIGEST_LENGTH>;
 
 /**
@@ -47,7 +46,7 @@
          * @param[in] - Session Integrity key to generate K2
          * @param[in] - Additional keying material to generate K2
          */
-        explicit Interface(const buffer& sik, const key& addKey);
+        explicit Interface(const std::vector<uint8_t>& sik, const key& addKey);
 
         Interface() = delete;
         virtual ~Interface() = default;
@@ -65,8 +64,8 @@
          *
          * @return decrypted payload if the operation is successful
          */
-        virtual buffer decryptPayload(
-                const buffer& packet,
+        virtual std::vector<uint8_t> decryptPayload(
+                const std::vector<uint8_t>& packet,
                 const size_t sessHeaderLen,
                 const size_t payloadLen) const = 0;
 
@@ -78,7 +77,8 @@
          * @return encrypted payload if the operation is successful
          *
          */
-        virtual buffer encryptPayload(buffer& payload) const = 0;
+        virtual std::vector<uint8_t> encryptPayload(
+                std::vector<uint8_t>& payload) const = 0;
 
         /**
          * @brief Check if the Confidentiality algorithm is supported
@@ -107,7 +107,7 @@
          * generated by processing a pre-defined constant keyed by Session
          * Integrity Key (SIK) that was created during session activation.
          */
-        key k2;
+        std::vector<uint8_t> k2;
 };
 
 /**
@@ -166,7 +166,7 @@
          *
          * @param[in] - Session Integrity key
          */
-        explicit AlgoAES128(const buffer& sik) : Interface(sik, const2) {}
+        explicit AlgoAES128(const std::vector<uint8_t>& sik) : Interface(sik, const2) {}
 
         AlgoAES128() = delete;
         ~AlgoAES128() = default;
@@ -184,8 +184,8 @@
          *
          * @return decrypted payload if the operation is successful
          */
-        buffer decryptPayload(
-                const buffer& packet,
+        std::vector<uint8_t> decryptPayload(
+                const std::vector<uint8_t>& packet,
                 const size_t sessHeaderLen,
                 const size_t payloadLen) const override;
 
@@ -197,7 +197,8 @@
          * @return encrypted payload if the operation is successful
          *
          */
-        buffer encryptPayload(buffer& payload) const override;
+        std::vector<uint8_t> encryptPayload(
+                std::vector<uint8_t>& payload) const override;
 
     private:
 
@@ -210,7 +211,7 @@
          *
          * @return decrypted data if the operation is successful
          */
-        buffer decryptData(const uint8_t* iv,
+        std::vector<uint8_t> decryptData(const uint8_t* iv,
                            const uint8_t* input,
                            const int inputLen) const;
 
@@ -222,7 +223,7 @@
          *
          * @return encrypted data if the operation is successful
          */
-        buffer encryptData(const uint8_t* input,
+        std::vector<uint8_t> encryptData(const uint8_t* input,
                            const int inputLen) const;
 };
 
diff --git a/integrity_algo.cpp b/integrity_algo.cpp
index 16d0863..3a6c34d 100644
--- a/integrity_algo.cpp
+++ b/integrity_algo.cpp
@@ -9,7 +9,8 @@
 namespace integrity
 {
 
-Interface::Interface(const Buffer& sik, const Key& addKey, size_t authLength)
+Interface::Interface(const std::vector<uint8_t>& sik,
+                     const Key& addKey, size_t authLength)
 {
     unsigned int mdLen = 0;
 
@@ -25,9 +26,10 @@
     authCodeLength = authLength;
 }
 
-Buffer AlgoSHA1::generateHMAC(const uint8_t* input, const size_t len) const
+std::vector<uint8_t> AlgoSHA1::generateHMAC(const uint8_t* input,
+        const size_t len) const
 {
-    Buffer output(SHA_DIGEST_LENGTH);
+    std::vector<uint8_t> output(SHA_DIGEST_LENGTH);
     unsigned int mdLen = 0;
 
     if (HMAC(EVP_sha1(), K1.data(), K1.size(), input, len,
@@ -45,9 +47,10 @@
     return output;
 }
 
-bool AlgoSHA1::verifyIntegrityData(const Buffer& packet,
-                                   const size_t length,
-                                   Buffer::const_iterator integrityData) const
+bool AlgoSHA1::verifyIntegrityData(
+        const std::vector<uint8_t>& packet,
+        const size_t length,
+        std::vector<uint8_t>::const_iterator integrityData) const
 {
 
     auto output = generateHMAC(
@@ -59,7 +62,8 @@
     return (std::equal(output.begin(), output.end(), integrityData));
 }
 
-Buffer AlgoSHA1::generateIntegrityData(const Buffer& packet) const
+std::vector<uint8_t> AlgoSHA1::generateIntegrityData(
+        const std::vector<uint8_t>& packet) const
 {
     return generateHMAC(
             packet.data() + message::parser::RMCP_SESSION_HEADER_SIZE,
diff --git a/integrity_algo.hpp b/integrity_algo.hpp
index eb78578..0d869c7 100644
--- a/integrity_algo.hpp
+++ b/integrity_algo.hpp
@@ -10,7 +10,6 @@
 namespace integrity
 {
 
-using Buffer = std::vector<uint8_t>;
 using Key = std::array<uint8_t, SHA_DIGEST_LENGTH>;
 
 /*
@@ -66,7 +65,7 @@
          * @param[in] - Additional keying material to generate K1
          * @param[in] - AuthCode length
          */
-        explicit Interface(const Buffer& sik,
+        explicit Interface(const std::vector<uint8_t>& sik,
                            const Key& addKey,
                            size_t authLength);
 
@@ -88,9 +87,9 @@
          *         using integrity algorithm on the packet data, false otherwise
          */
         bool virtual verifyIntegrityData(
-                const Buffer& packet,
+                const std::vector<uint8_t>& packet,
                 const size_t packetLen,
-                Buffer::const_iterator integrityData) const = 0;
+                std::vector<uint8_t>::const_iterator integrityData) const = 0;
 
         /**
          * @brief Generate integrity data for the outgoing IPMI packet
@@ -100,7 +99,8 @@
          * @return authcode for the outgoing IPMI packet
          *
          */
-        Buffer virtual generateIntegrityData(const Buffer& input) const = 0;
+        std::vector<uint8_t> virtual generateIntegrityData(
+                const std::vector<uint8_t>& input) const = 0;
 
         /**
          * @brief Check if the Integrity algorithm is supported
@@ -157,7 +157,7 @@
          *
          * @param[in] - Session Integrity Key
          */
-        explicit AlgoSHA1(const Buffer& sik) :
+        explicit AlgoSHA1(const std::vector<uint8_t>& sik) :
             Interface(sik, const1, SHA1_96_AUTHCODE_LENGTH) {}
 
         AlgoSHA1() = delete;
@@ -179,9 +179,10 @@
          *         using integrity algorithm on the packet data, false otherwise
          */
         bool verifyIntegrityData(
-                const Buffer& packet,
+                const std::vector<uint8_t>& packet,
                 const size_t length,
-                Buffer::const_iterator integrityData) const override;
+                std::vector<uint8_t>::const_iterator integrityData)
+            const override;
 
         /**
          * @brief Generate integrity data for the outgoing IPMI packet
@@ -191,7 +192,8 @@
          * @return on success return the integrity data for the outgoing IPMI
          *         packet
          */
-        Buffer generateIntegrityData(const Buffer& packet) const override;
+        std::vector<uint8_t> generateIntegrityData(
+                const std::vector<uint8_t>& packet) const override;
 
     private:
         /**
@@ -203,7 +205,8 @@
          * @return on success returns the message authentication code
          *
          */
-        Buffer generateHMAC(const uint8_t* input, const size_t len) const;
+        std::vector<uint8_t> generateHMAC(const uint8_t* input,
+                const size_t len) const;
 };
 
 }// namespace integrity
diff --git a/message_handler.cpp b/message_handler.cpp
index e66e39c..beeb798 100644
--- a/message_handler.cpp
+++ b/message_handler.cpp
@@ -187,7 +187,7 @@
     session->channelPtr = channel;
 }
 
-void Handler::sendSOLPayload(const sol::Buffer& input)
+void Handler::sendSOLPayload(const std::vector<uint8_t>& input)
 {
     Message outMessage;
 
diff --git a/message_handler.hpp b/message_handler.hpp
index 11cc42a..7fb06f1 100644
--- a/message_handler.hpp
+++ b/message_handler.hpp
@@ -68,7 +68,7 @@
          *
          *  @param[in] input - SOL Payload
          */
-        void sendSOLPayload(const sol::Buffer& input);
+        void sendSOLPayload(const std::vector<uint8_t>& input);
 
         /** @brief Send the unsolicited IPMI payload to the remote console.
          *
diff --git a/socket_channel.cpp b/socket_channel.cpp
index e77c6cf..8414f51 100644
--- a/socket_channel.cpp
+++ b/socket_channel.cpp
@@ -19,12 +19,12 @@
     return std::string(tmp);
 }
 
-std::tuple<int, buffer> Channel::read()
+std::tuple<int, std::vector<uint8_t>> Channel::read()
 {
     int rc = 0;
     int readSize = 0;
     ssize_t readDataLen = 0;
-    buffer outBuffer(0);
+    std::vector<uint8_t> outBuffer(0);
 
     if (ioctl(sockfd, FIONREAD, &readSize) < 0)
     {
@@ -70,7 +70,7 @@
     return std::make_tuple(rc, std::move(outBuffer));
 }
 
-int Channel::write(buffer& inBuffer)
+int Channel::write(const std::vector<uint8_t>& inBuffer)
 {
     int rc = 0;
     auto outputPtr = inBuffer.data();
diff --git a/socket_channel.hpp b/socket_channel.hpp
index 2bc7a33..5996b62 100644
--- a/socket_channel.hpp
+++ b/socket_channel.hpp
@@ -10,7 +10,6 @@
 namespace udpsocket
 {
 
-using buffer = std::vector<uint8_t>;
 /** @class Channel
  *
  *  @brief Provides encapsulation for UDP socket operations like Read, Peek,
@@ -79,7 +78,7 @@
          *         In case of error, the return code is < 0 and vector is set
          *         to size 0.
          */
-        std::tuple<int, buffer> read();
+        std::tuple<int, std::vector<uint8_t>> read();
 
         /**
          *  @brief Write the outgoing packet
@@ -92,7 +91,7 @@
          *  @return In case of success the return code is 0 and return code is
          *          < 0 in case of failure.
          */
-        int write(buffer& inBuffer);
+        int write(const std::vector<uint8_t>& inBuffer);
 
         /**
          * @brief Returns file descriptor for the socket
diff --git a/sol/console_buffer.hpp b/sol/console_buffer.hpp
index b874be5..fe4bfe8 100644
--- a/sol/console_buffer.hpp
+++ b/sol/console_buffer.hpp
@@ -8,7 +8,6 @@
 {
 
 using ConsoleBuffer = std::deque<uint8_t>;
-using Buffer = std::vector<uint8_t>;
 
 /** @class ConsoleData
  *
@@ -47,7 +46,7 @@
          *
          *  @param[in] input - data to be written to the console buffer.
          */
-        void write(const Buffer& input)
+        void write(const std::vector<uint8_t>& input)
         {
             data.insert(data.end(), input.begin(), input.end());
         }
diff --git a/sol/sol_context.cpp b/sol/sol_context.cpp
index 08be77b..ffa6834 100644
--- a/sol/sol_context.cpp
+++ b/sol/sol_context.cpp
@@ -13,7 +13,7 @@
                                     uint8_t ackSeqNum,
                                     uint8_t count,
                                     bool status,
-                                    const Buffer& input)
+                                    const std::vector<uint8_t>& input)
 {
     uint8_t respAckSeqNum = 0;
     uint8_t acceptedCount = 0;
@@ -127,7 +127,7 @@
         std::get<eventloop::EventLoop&>(singletonPool).switchTimer
                 (payloadInstance, eventloop::Timers::ACCUMULATE, true);
 
-        Buffer outPayload(sizeof(Payload));
+        std::vector<uint8_t> outPayload(sizeof(Payload));
         auto response = reinterpret_cast<Payload*>(outPayload.data());
         response->packetSeqNum = 0;
         response->packetAckSeqNum = ackSeqNum;
@@ -204,7 +204,7 @@
     }
 }
 
-void Context::sendPayload(const Buffer& out) const
+void Context::sendPayload(const std::vector<uint8_t>& out) const
 {
     auto session = (std::get<session::Manager&>(singletonPool).getSession(
                     sessionID)).lock();
diff --git a/sol/sol_context.hpp b/sol/sol_context.hpp
index 9de88c9..dadf492 100644
--- a/sol/sol_context.hpp
+++ b/sol/sol_context.hpp
@@ -209,7 +209,7 @@
                                    uint8_t ackSeqNum,
                                    uint8_t count,
                                    bool status,
-                                   const Buffer& input);
+                                   const std::vector<uint8_t>& input);
 
         /** @brief Send the outbound SOL payload.
          *
@@ -242,7 +242,7 @@
          *  A copy of the SOL payload is kept here, so that when a retry needs
          *  to be attempted the payload is sent again.
          */
-        Buffer payloadCache;
+        std::vector<uint8_t> payloadCache;
 
         /**
          * @brief Send Response for Incoming SOL payload.
@@ -257,7 +257,7 @@
          *
          *  @param[in] out - buffer containing the SOL payload.
          */
-        void sendPayload(const Buffer& out) const;
+        void sendPayload(const std::vector<uint8_t>& out) const;
 };
 
 } // namespace sol
diff --git a/sol/sol_manager.cpp b/sol/sol_manager.cpp
index 889065f..b6cf31d 100644
--- a/sol/sol_manager.cpp
+++ b/sol/sol_manager.cpp
@@ -52,7 +52,7 @@
     }
 }
 
-int Manager::writeConsoleSocket(const Buffer& input) const
+int Manager::writeConsoleSocket(const std::vector<uint8_t>& input) const
 {
     auto inBuffer = input.data();
     auto inBufferSize = input.size();
diff --git a/sol/sol_manager.hpp b/sol/sol_manager.hpp
index a107994..4a615af 100644
--- a/sol/sol_manager.hpp
+++ b/sol/sol_manager.hpp
@@ -247,7 +247,7 @@
          *
          *  @return 0 on success and errno on failure.
          */
-        int writeConsoleSocket(const Buffer& input) const;
+        int writeConsoleSocket(const std::vector<uint8_t>& input) const;
 
     private:
         SOLPayloadMap payloadMap;
diff --git a/test/cipher.cpp b/test/cipher.cpp
index 84929d6..f10c8a0 100644
--- a/test/cipher.cpp
+++ b/test/cipher.cpp
@@ -51,7 +51,7 @@
     }
 
     mdLen = 0;
-    cipher::integrity::Buffer output(SHA_DIGEST_LENGTH);
+    std::vector<uint8_t> output(SHA_DIGEST_LENGTH);
     size_t length = packet.size() - message::parser::RMCP_SESSION_HEADER_SIZE;
 
     if (HMAC(EVP_sha1(), K1.data(), K1.size(),
@@ -102,7 +102,7 @@
     }
 
     mdLen = 0;
-    cipher::integrity::Buffer output(SHA_DIGEST_LENGTH);
+    std::vector<uint8_t> output(SHA_DIGEST_LENGTH);
     size_t length = packet.size() - message::parser::RMCP_SESSION_HEADER_SIZE;
 
     if (HMAC(EVP_sha1(), K1.data(), K1.size(),
