diff --git a/phosphor-rsyslog-config/server-conf.cpp b/phosphor-rsyslog-config/server-conf.cpp
index 7aa4cba..76e310e 100644
--- a/phosphor-rsyslog-config/server-conf.cpp
+++ b/phosphor-rsyslog-config/server-conf.cpp
@@ -35,20 +35,39 @@
     return inet_pton(AF_INET6, addr.c_str(), &result) == 1;
 }
 
-std::optional<std::pair<std::string, uint32_t>> parseConfig(std::istream& ss)
+std::optional<
+    std::tuple<std::string, uint32_t, NetworkClient::TransportProtocol>>
+    parseConfig(std::istream& ss)
 {
     std::string line;
     std::getline(ss, line);
 
-    //"*.* @@<address>:<port>" or
-    //"*.* @@[<ipv6-address>:<port>"
-    constexpr auto start = 6; // Skip "*.* @@"
     std::string serverAddress;
     std::string serverPort;
+    NetworkClient::TransportProtocol serverTransportProtocol =
+        NetworkClient::TransportProtocol::TCP;
 
     // Ignore if line is commented
     if (!line.empty() && '#' != line.at(0))
     {
+        //"*.* @@<address>:<port>" or
+        //"*.* @@[<ipv6-address>:<port>"
+        auto start = line.find('@');
+        if (start == std::string::npos)
+            return {};
+
+        // Skip "*.* @@" or "*.* @"
+        if (line.at(start + 1) == '@')
+        {
+            serverTransportProtocol = NetworkClient::TransportProtocol::TCP;
+            start += 2;
+        }
+        else
+        {
+            serverTransportProtocol = NetworkClient::TransportProtocol::UDP;
+            start++;
+        }
+
         // Check if there is "[]", and make IPv6 address from it
         auto posColonLeft = line.find('[');
         auto posColonRight = line.find(']');
@@ -90,8 +109,8 @@
     }
     try
     {
-        uint32_t port = std::stoul(serverPort);
-        return std::make_pair(std::move(serverAddress), port);
+        return std::make_tuple(std::move(serverAddress), std::stoul(serverPort),
+                               serverTransportProtocol);
     }
     catch (const std::exception& ex)
     {
@@ -121,7 +140,7 @@
                                   Argument::ARGUMENT_VALUE(value.c_str()));
         }
 
-        writeConfig(value, port(), configFilePath.c_str());
+        writeConfig(value, port(), transportProtocol(), configFilePath.c_str());
         result = NetworkClient::address(value);
     }
     catch (const InvalidArgument& e)
@@ -153,7 +172,8 @@
             return serverPort;
         }
 
-        writeConfig(address(), value, configFilePath.c_str());
+        writeConfig(address(), value, transportProtocol(),
+                    configFilePath.c_str());
         result = NetworkClient::port(value);
     }
     catch (const InternalFailure& e)
@@ -169,21 +189,57 @@
     return result;
 }
 
-void Server::writeConfig(const std::string& serverAddress, uint16_t serverPort,
-                         const char* filePath)
+NetworkClient::TransportProtocol
+    Server::transportProtocol(NetworkClient::TransportProtocol value)
+{
+    TransportProtocol result{};
+
+    try
+    {
+        auto serverTransportProtocol = transportProtocol();
+        if (serverTransportProtocol == value)
+        {
+            return serverTransportProtocol;
+        }
+
+        writeConfig(address(), port(), value, configFilePath.c_str());
+        result = NetworkClient::transportProtocol(value);
+    }
+    catch (const InternalFailure& e)
+    {
+        throw;
+    }
+    catch (const std::exception& e)
+    {
+        log<level::ERR>(e.what());
+        elog<InternalFailure>();
+    }
+
+    return result;
+}
+
+void Server::writeConfig(
+    const std::string& serverAddress, uint16_t serverPort,
+    NetworkClient::TransportProtocol serverTransportProtocol,
+    const char* filePath)
 {
     std::fstream stream(filePath, std::fstream::out);
 
     if (serverPort && !serverAddress.empty())
     {
-        // write '*.* @@<remote-host>:<port>'
+        std::string type =
+            (serverTransportProtocol == NetworkClient::TransportProtocol::UDP)
+                ? "@"
+                : "@@";
+        // write '*.* @@<remote-host>:<port>' or '*.* @<remote-host>:<port>'
         if (internal::isIPv6Address(serverAddress))
         {
-            stream << "*.* @@[" << serverAddress << "]:" << serverPort;
+            stream << "*.* " << type << "[" << serverAddress
+                   << "]:" << serverPort;
         }
         else
         {
-            stream << "*.* @@" << serverAddress << ":" << serverPort;
+            stream << "*.* " << type << serverAddress << ":" << serverPort;
         }
     }
     else // this is a disable request
@@ -224,8 +280,9 @@
     auto ret = internal::parseConfig(stream);
     if (ret)
     {
-        NetworkClient::address(ret->first);
-        NetworkClient::port(ret->second);
+        NetworkClient::address(std::get<0>(*ret));
+        NetworkClient::port(std::get<1>(*ret));
+        NetworkClient::transportProtocol(std::get<2>(*ret));
     }
 }
 
diff --git a/phosphor-rsyslog-config/server-conf.hpp b/phosphor-rsyslog-config/server-conf.hpp
index 57c292c..33e92aa 100644
--- a/phosphor-rsyslog-config/server-conf.hpp
+++ b/phosphor-rsyslog-config/server-conf.hpp
@@ -64,6 +64,7 @@
 
     using NetworkClient::address;
     using NetworkClient::port;
+    using NetworkClient::transportProtocol;
 
     /** @brief Override that updates rsyslog config file as well
      *  @param[in] value - remote server address
@@ -81,15 +82,23 @@
      */
     virtual void restart();
 
+    /** @brief Set protocol for rsyslog TCP or UDP.
+     *  @param[in] value - UDP/TCP.
+     *  @returns protocol value
+     */
+    virtual TransportProtocol
+        transportProtocol(TransportProtocol protocol) override;
+
   private:
     /** @brief Update remote server address and port in
      *         rsyslog config file.
      *  @param[in] serverAddress - remote server address
      *  @param[in] serverPort - remote server port
+     *  @param[in] serverTransportProtocol - remote server protocol TCP/UDP
      *  @param[in] filePath - rsyslog config file path
      */
     void writeConfig(const std::string& serverAddress, uint16_t serverPort,
-                     const char* filePath);
+                     TransportProtocol protocol, const char* filePath);
 
     /** @brief Checks if input IP address is valid (uses getaddrinfo)
      *  @param[in] address - server address
