diff --git a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmManager.java b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmManager.java
index 56d193e..e290aea 100644
--- a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmManager.java
+++ b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmManager.java
@@ -75,7 +75,6 @@
 import org.slf4j.LoggerFactory;
 
 import java.net.InetSocketAddress;
-import java.util.ArrayList;
 import java.time.Duration;
 import java.util.Collection;
 import java.util.Collections;
@@ -531,24 +530,23 @@
 
     private void sendRouteUpdateToChannel(boolean isAdd, IpPrefix prefix, Channel ch) {
 
-        int netLinkLength;
-        short addrFamily;
-        IpAddress pdPushNextHop;
-
         if (!pdPushEnabled) {
             return;
         }
 
         try {
-            // Construct list of route attributes.
-            List<RouteAttribute> attributes = new ArrayList<>();
+            int raLength;
+            short addrFamily;
+            IpAddress pdPushNextHop;
+
+            // Build route attributes.
             if (prefix.isIp4()) {
                 if (pdPushNextHopIPv4 == null) {
                     log.info("Prefix not pushed because ipv4 next-hop is null.");
                     return;
                 }
                 pdPushNextHop = pdPushNextHopIPv4;
-                netLinkLength =  Ip4Address.BYTE_LENGTH + RouteAttribute.ROUTE_ATTRIBUTE_HEADER_LENGTH;
+                raLength =  Ip4Address.BYTE_LENGTH + RouteAttribute.ROUTE_ATTRIBUTE_HEADER_LENGTH;
                 addrFamily = RtNetlink.RT_ADDRESS_FAMILY_INET;
             } else {
                 if (pdPushNextHopIPv6 == null) {
@@ -556,70 +554,48 @@
                     return;
                 }
                 pdPushNextHop = pdPushNextHopIPv6;
-                netLinkLength =  Ip6Address.BYTE_LENGTH + RouteAttribute.ROUTE_ATTRIBUTE_HEADER_LENGTH;
+                raLength =  Ip6Address.BYTE_LENGTH + RouteAttribute.ROUTE_ATTRIBUTE_HEADER_LENGTH;
                 addrFamily = RtNetlink.RT_ADDRESS_FAMILY_INET6;
             }
 
-            RouteAttributeDst raDst = new RouteAttributeDst(
-                netLinkLength,
-                RouteAttribute.RTA_DST,
-                prefix.address());
-            attributes.add(raDst);
+             RouteAttributeDst raDst = RouteAttributeDst.builder()
+                .length(raLength)
+                .type(RouteAttribute.RTA_DST)
+                .dstAddress(prefix.address())
+                .build();
 
-            RouteAttributeGateway raGateway = new RouteAttributeGateway(
-                netLinkLength,
-                RouteAttribute.RTA_GATEWAY,
-                pdPushNextHop);
-            attributes.add(raGateway);
+            RouteAttributeGateway raGateway = RouteAttributeGateway.builder()
+                .length(raLength)
+                .type(RouteAttribute.RTA_GATEWAY)
+                .gateway(pdPushNextHop)
+                .build();
 
-            // Add RtNetlink header.
-            int srcLength = 0;
-            short tos = 0;
-            short table = 0;
-            short scope = 0;
-            long rtFlags = 0;
+            // Build RtNetlink.
+            RtNetlink rtNetlink = RtNetlink.builder()
+                .addressFamily(addrFamily)
+                .dstLength(prefix.prefixLength())
+                .routeAttribute(raDst)
+                .routeAttribute(raGateway)
+                .build();
+
+            // Build Netlink.
             int messageLength = raDst.length() + raGateway.length() +
-                RtNetlink.RT_NETLINK_LENGTH;
+                                RtNetlink.RT_NETLINK_LENGTH + Netlink.NETLINK_HEADER_LENGTH;
+            Netlink netLink = Netlink.builder()
+                .length(messageLength)
+                .type(isAdd ? NetlinkMessageType.RTM_NEWROUTE : NetlinkMessageType.RTM_DELROUTE)
+                .flags(Netlink.NETLINK_REQUEST | Netlink.NETLINK_CREATE)
+                .rtNetlink(rtNetlink)
+                .build();
 
-            RtNetlink rtNetlink =  new RtNetlink(
-                addrFamily,
-                prefix.prefixLength(),
-                srcLength,
-                tos,
-                table,
-                RtProtocol.ZEBRA,
-                scope,
-                FpmHeader.FPM_TYPE_NETLINK,
-                rtFlags,
-                attributes);
-
-            // Add Netlink header.
-            NetlinkMessageType nlMsgType;
-            if (isAdd) {
-                nlMsgType = NetlinkMessageType.RTM_NEWROUTE;
-            } else {
-                nlMsgType = NetlinkMessageType.RTM_DELROUTE;
-            }
-            int flags = Netlink.NETLINK_REQUEST | Netlink.NETLINK_CREATE;
-            long sequence = 0;
-            long processPortId = 0;
-            messageLength += Netlink.NETLINK_HEADER_LENGTH;
-
-            Netlink netLink = new Netlink(messageLength,
-                nlMsgType,
-                flags,
-                sequence,
-                processPortId,
-                rtNetlink);
-
+            // Build FpmHeader.
             messageLength += FpmHeader.FPM_HEADER_LENGTH;
-
-            // Add FpmHeader.
-            FpmHeader fpmMessage = new FpmHeader(
-                FpmHeader.FPM_VERSION_1,
-                FpmHeader.FPM_TYPE_NETLINK,
-                messageLength,
-                netLink);
+            FpmHeader fpmMessage = FpmHeader.builder()
+                .version(FpmHeader.FPM_VERSION_1)
+                .type(FpmHeader.FPM_TYPE_NETLINK)
+                .length(messageLength)
+                .netlink(netLink)
+                .build();
 
             // Encode message in a channel buffer and transmit.
             ch.write(fpmMessage.encode());
diff --git a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/FpmHeader.java b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/FpmHeader.java
index 607c9e1..abaaa88 100644
--- a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/FpmHeader.java
+++ b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/FpmHeader.java
@@ -63,7 +63,7 @@
      * @param length length
      * @param netlink netlink header
      */
-    public FpmHeader(short version, short type, int length, Netlink netlink) {
+    private FpmHeader(short version, short type, int length, Netlink netlink) {
         this.version = version;
         this.type = type;
         this.length = length;
@@ -169,4 +169,83 @@
         netlink.encode(cb);
         return cb;
     }
+
+    /**
+     * Returns a new FpmHeader builder.
+     *
+     * @return FpmHeader builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * FpmHeader Builder.
+     */
+    public static final class Builder {
+
+        private short version = FPM_VERSION_1;
+        private short type = FPM_TYPE_NETLINK;
+        private int length = 0;
+        private Netlink netlink = null;
+
+        /**
+        * Hide class constructor.
+        */
+        private Builder() {
+        }
+
+        /**
+         * Sets version for the FpmHeader that will be built.
+         *
+         * @param version to use for built FpmHeader
+         * @return this builder
+         */
+        public Builder version(short version) {
+            this.version = version;
+            return this;
+        }
+
+        /**
+         * Sets type for the FpmHeader that will be built.
+         *
+         * @param type to use for built FpmHeader
+         * @return this builder
+         */
+        public Builder type(short type) {
+            this.type = type;
+            return this;
+        }
+
+        /**
+         * Sets length for the FpmHeader that will be built.
+         *
+         * @param length to use for built FpmHeader
+         * @return this builder
+         */
+        public Builder length(int length) {
+            this.length = length;
+            return this;
+        }
+
+        /**
+         * Sets netlink for the FpmHeader that will be built.
+         *
+         * @param netlink to use for built FpmHeader
+         * @return this builder
+         */
+        public Builder netlink(Netlink netlink) {
+            this.netlink = netlink;
+            return this;
+        }
+
+        /**
+         * Builds the FpmHeader.
+         *
+         * @return FpmHeader reference
+         */
+        public FpmHeader build() {
+            return new FpmHeader(version, type, length, netlink);
+        }
+    }
 }
diff --git a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/Netlink.java b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/Netlink.java
index df84ed6..d7bdd26 100644
--- a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/Netlink.java
+++ b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/Netlink.java
@@ -55,7 +55,7 @@
      * @param processPortId port ID
      * @param rtNetlink netlink routing message
      */
-    public Netlink(long length, NetlinkMessageType type, int flags, long sequence,
+    private Netlink(long length, NetlinkMessageType type, int flags, long sequence,
                     long processPortId, RtNetlink rtNetlink) {
         this.length = length;
         this.type = type;
@@ -188,4 +188,106 @@
         rtNetlink.encode(cb);
     }
 
+    /**
+     * Returns a new Netlink builder.
+     *
+     * @return Netlink builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * Netlink Builder.
+     */
+    public static final class Builder {
+
+        private long length = 0;
+        private NetlinkMessageType type = NetlinkMessageType.RTM_NEWROUTE;
+        private int flags = 0;
+        private long sequence = 0;
+        private long processPortId = 0;
+        private RtNetlink rtNetlink = null;
+
+        /**
+        * Hide class constructor.
+        */
+        private Builder() {
+        }
+
+        /**
+         * Sets length for the Netlink that will be built.
+         *
+         * @param length to use for built Netlink
+         * @return this builder
+         */
+        public Builder length(long length) {
+            this.length = length;
+            return this;
+        }
+
+        /**
+         * Sets type for the Netlink that will be built.
+         *
+         * @param type to use for built Netlink
+         * @return this builder
+         */
+        public Builder type(NetlinkMessageType type) {
+            this.type = type;
+            return this;
+        }
+
+        /**
+         * Sets flags for the Netlink that will be built.
+         *
+         * @param flags to use for built Netlink
+         * @return this builder
+         */
+        public Builder flags(int flags) {
+            this.flags = flags;
+            return this;
+        }
+
+        /**
+         * Sets sequence for the Netlink that will be built.
+         *
+         * @param sequence to use for built Netlink
+         * @return this builder
+         */
+        public Builder sequence(long sequence) {
+            this.sequence = sequence;
+            return this;
+        }
+
+        /**
+         * Sets processPortId for the Netlink that will be built.
+         *
+         * @param processPortId to use for built Netlink
+         * @return this builder
+         */
+        public Builder processPortId(long processPortId) {
+            this.processPortId = processPortId;
+            return this;
+        }
+
+        /**
+         * Sets rtNetlink for the Netlink that will be built.
+         *
+         * @param rtNetlink to use for built Netlink
+         * @return this builder
+         */
+        public Builder rtNetlink(RtNetlink rtNetlink) {
+            this.rtNetlink = rtNetlink;
+            return this;
+        }
+
+        /**
+         * Builds the Netlink.
+         *
+         * @return Netlink reference
+         */
+        public Netlink build() {
+            return new Netlink(length, type, flags, sequence, processPortId, rtNetlink);
+        }
+    }
 }
diff --git a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RouteAttribute.java b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RouteAttribute.java
index 43a21c0..280c678 100644
--- a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RouteAttribute.java
+++ b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RouteAttribute.java
@@ -121,6 +121,43 @@
      *
      * @param cb channelbuffer to be filled in
      */
-    public abstract void encode(ChannelBuffer cb);
+    public void encode(ChannelBuffer cb) {
+        cb.writeShort(Short.reverseBytes((short) length()));
+        cb.writeShort(Short.reverseBytes((short) type()));
+    }
 
+    /**
+     * RouteAttribute Builder.
+     */
+    public abstract static class Builder<T extends Builder<T>> {
+
+        protected int length;
+        protected int type;
+
+        public Builder() {}
+
+        public abstract T getThis();
+
+        /**
+         * Sets length for RouteAttribute that will be built.
+         *
+         * @param length to use for built RtNetlink
+         * @return this generic builder type
+         */
+        public T length(int length) {
+            this.length = length;
+            return getThis();
+        }
+
+        /**
+         * Sets type for RouteAttribute that will be built.
+         *
+         * @param type to use for built RtNetlink
+         * @return this generic builder type
+         */
+        public T type(int type) {
+            this.type = type;
+            return getThis();
+        }
+    }
 }
diff --git a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RouteAttributeDst.java b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RouteAttributeDst.java
index 1535100..f74aabb 100644
--- a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RouteAttributeDst.java
+++ b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RouteAttributeDst.java
@@ -38,7 +38,7 @@
      * @param type type
      * @param dstAddress destination address
      */
-    public RouteAttributeDst(int length, int type, IpAddress dstAddress) {
+    private RouteAttributeDst(int length, int type, IpAddress dstAddress) {
         super(length, type);
 
         this.dstAddress = dstAddress;
@@ -91,8 +91,7 @@
     @Override
     public void encode(ChannelBuffer cb) {
 
-        cb.writeShort(Short.reverseBytes((short) length()));
-        cb.writeShort(Short.reverseBytes((short) type()));
+        super.encode(cb);
 
         ChannelBuffer buffer =  ChannelBuffers.copiedBuffer(dstAddress.toOctets());
         if (length() == Ip6Address.BYTE_LENGTH +
@@ -105,4 +104,54 @@
             throw new RuntimeException("Dst address length incorrect!");
         }
     }
+
+    /**
+     * Returns a new RouteAttributeDst builder.
+     *
+     * @return RouteAttributeDst builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * RouteAttributeDst Builder.
+     */
+    public static final class Builder extends RouteAttribute.Builder<Builder> {
+
+        private IpAddress dstAddress = null;
+
+        /**
+        * Hide class constructor.
+        */
+        private Builder() {}
+
+        /**
+         * Override abstract method.
+         */
+        @Override
+        public Builder getThis() {
+            return this;
+        }
+
+        /**
+         * Sets dstAddress for RouteAttributeDst that will be built.
+         *
+         * @param dstAddress to use for built RouteAttributeDst
+         * @return this builder
+         */
+        public Builder dstAddress(IpAddress dstAddress) {
+            this.dstAddress = dstAddress;
+            return this;
+        }
+
+        /**
+         * Builds the RouteAttributeDst.
+         *
+         * @return RouteAttributeDst reference
+         */
+        public RouteAttributeDst build() {
+            return new RouteAttributeDst(length, type, dstAddress);
+        }
+    }
 }
diff --git a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RouteAttributeGateway.java b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RouteAttributeGateway.java
index 886f52e..fef64cd 100644
--- a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RouteAttributeGateway.java
+++ b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RouteAttributeGateway.java
@@ -40,7 +40,7 @@
      * @param type type
      * @param gateway gateway address
      */
-    public RouteAttributeGateway(int length, int type, IpAddress gateway) {
+    private RouteAttributeGateway(int length, int type, IpAddress gateway) {
         super(length, type);
 
         this.gateway = gateway;
@@ -93,8 +93,7 @@
     @Override
     public void encode(ChannelBuffer cb) {
 
-        cb.writeShort(Short.reverseBytes((short) length()));
-        cb.writeShort(Short.reverseBytes((short) type()));
+        super.encode(cb);
 
         ChannelBuffer buffer =  ChannelBuffers.copiedBuffer(gateway.toOctets());
         if (length() == Ip6Address.BYTE_LENGTH +
@@ -107,4 +106,54 @@
             throw new RuntimeException("Gateway address length incorrect!");
         }
     }
+
+    /**
+     * Returns a new RouteAttributeGateway builder.
+     *
+     * @return RouteAttributeGateway builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * RouteAttributeGateway Builder.
+     */
+    public static final class Builder extends RouteAttribute.Builder<Builder> {
+
+        private IpAddress gateway = null;
+
+        /**
+        * Hide class constructor.
+        */
+        private Builder() {}
+
+        /**
+         * Override abstract method.
+         */
+        @Override
+        public Builder getThis() {
+            return this;
+        }
+
+        /**
+         * Sets gateway for RouteAttributeGateway that will be built.
+         *
+         * @param gateway to use for built RouteAttributeGateway
+         * @return this builder
+         */
+        public Builder gateway(IpAddress gateway) {
+            this.gateway = gateway;
+            return this;
+        }
+
+        /**
+         * Builds the RouteAttributeGateway.
+         *
+         * @return RouteAttributeGateway reference
+         */
+        public RouteAttributeGateway build() {
+            return new RouteAttributeGateway(length, type, gateway);
+        }
+    }
 }
diff --git a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RouteAttributeOif.java b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RouteAttributeOif.java
index 49a12e8..e6becb7 100644
--- a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RouteAttributeOif.java
+++ b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RouteAttributeOif.java
@@ -38,7 +38,7 @@
      * @param type type
      * @param outputInterface output interface
      */
-    public RouteAttributeOif(int length, int type, long outputInterface) {
+    private RouteAttributeOif(int length, int type, long outputInterface) {
         super(length, type);
 
         this.outputInterface = outputInterface;
@@ -87,8 +87,57 @@
     @Override
     public void encode(ChannelBuffer cb) {
 
-        cb.writeShort(Short.reverseBytes((short) length()));
-        cb.writeShort(Short.reverseBytes((short) type()));
+        super.encode(cb);
         cb.writeInt(Integer.reverseBytes((int) outputInterface));
     }
+
+    /**
+     * Returns a new RouteAttributeOif builder.
+     *
+     * @return RouteAttributeOif builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * RouteAttributeOif Builder.
+     */
+    public static final class Builder extends RouteAttribute.Builder<Builder> {
+
+        private long outputInterface = 0;
+
+        /**
+        * Hide class constructor.
+        */
+        private Builder() {}
+
+        /**
+         * Override abstract method.
+         */
+        @Override
+        public Builder getThis() {
+            return this;
+        }
+
+        /**
+         * Sets outputInterface for RouteAttributeOif that will be built.
+         *
+         * @param outputInterface to use for built RouteAttributeOif
+         * @return this builder
+         */
+        public Builder outputInterface(long outputInterface) {
+            this.outputInterface = outputInterface;
+            return this;
+        }
+
+        /**
+         * Builds the RouteAttributeOif.
+         *
+         * @return RouteAttributeOif reference
+         */
+        public RouteAttributeOif build() {
+            return new RouteAttributeOif(length, type, outputInterface);
+        }
+    }
 }
diff --git a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RouteAttributePriority.java b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RouteAttributePriority.java
index 2c45db0..89dad43 100644
--- a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RouteAttributePriority.java
+++ b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RouteAttributePriority.java
@@ -38,7 +38,7 @@
      * @param type type
      * @param priority priority
      */
-    public RouteAttributePriority(int length, int type, long priority) {
+    private RouteAttributePriority(int length, int type, long priority) {
         super(length, type);
 
         this.priority = priority;
@@ -87,8 +87,57 @@
     @Override
     public void encode(ChannelBuffer cb) {
 
-        cb.writeShort(Short.reverseBytes((short) length()));
-        cb.writeShort(Short.reverseBytes((short) type()));
+        super.encode(cb);
         cb.writeInt(Integer.reverseBytes((int) priority));
     }
+
+    /**
+     * Returns a new RouteAttributePriority builder.
+     *
+     * @return RouteAttributePriority builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * RouteAttributePriority Builder.
+     */
+    public static final class Builder extends RouteAttribute.Builder<Builder> {
+
+        private long priority = 0;
+
+        /**
+        * Hide class constructor.
+        */
+        private Builder() {}
+
+        /**
+         * Override abstract method.
+         */
+        @Override
+        public Builder getThis() {
+            return this;
+        }
+
+        /**
+         * Sets priority for RouteAttributePriority that will be built.
+         *
+         * @param priority to use for built RouteAttributePriority
+         * @return this builder
+         */
+        public Builder priority(long priority) {
+            this.priority = priority;
+            return this;
+        }
+
+        /**
+         * Builds the RouteAttributePriority.
+         *
+         * @return RouteAttributePriority reference
+         */
+        public RouteAttributePriority build() {
+            return new RouteAttributePriority(length, type, priority);
+        }
+    }
 }
diff --git a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RtNetlink.java b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RtNetlink.java
index adaaf62..ef2faa4 100644
--- a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RtNetlink.java
+++ b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/protocol/RtNetlink.java
@@ -67,7 +67,7 @@
      * @param flags flags
      * @param attributes list of attributes
      */
-    public RtNetlink(short addressFamily,
+    private RtNetlink(short addressFamily,
                       int dstLength,
                       int srcLength,
                       short tos,
@@ -270,4 +270,163 @@
         }
     }
 
+    /**
+     * Returns a new RtNetlink builder.
+     *
+     * @return RtNetlink builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * RtNetlink Builder.
+     */
+    public static final class Builder {
+
+        private short addressFamily = RT_ADDRESS_FAMILY_INET;
+        private int dstLength = 0;
+        private int srcLength = 0;
+        private short tos = 0;
+        private short table = 0;
+        private RtProtocol protocol = RtProtocol.ZEBRA;
+        private short scope = 0;
+        private short type = FpmHeader.FPM_TYPE_NETLINK;
+        private long flags = 0;
+        private List<RouteAttribute> attributes = new ArrayList<>();
+
+        /**
+        * Hide class constructor.
+        */
+        private Builder() {
+        }
+
+        /**
+         * Sets addressFamily for the RtNetlink that will be built.
+         *
+         * @param addressFamily to use for built RtNetlink
+         * @return this builder
+         */
+        public Builder addressFamily(short addressFamily) {
+            this.addressFamily = addressFamily;
+            return this;
+        }
+
+        /**
+         * Sets dstLength for the RtNetlink that will be built.
+         *
+         * @param dstLength to use for built RtNetlink
+         * @return this builder
+         */
+        public Builder dstLength(int dstLength) {
+            this.dstLength = dstLength;
+            return this;
+        }
+
+        /**
+         * Sets srcLength for the RtNetlink that will be built.
+         *
+         * @param srcLength to use for built RtNetlink
+         * @return this builder
+         */
+        public Builder srcLength(int srcLength) {
+            this.srcLength = srcLength;
+            return this;
+        }
+
+        /**
+         * Sets tos for the RtNetlink that will be built.
+         *
+         * @param tos to use for built RtNetlink
+         * @return this builder
+         */
+        public Builder tos(short tos) {
+            this.tos = tos;
+            return this;
+        }
+
+        /**
+         * Sets table for the RtNetlink that will be built.
+         *
+         * @param table to use for built RtNetlink
+         * @return this builder
+         */
+        public Builder table(short table) {
+            this.table = table;
+            return this;
+        }
+
+        /**
+         * Sets protocol for the RtNetlink that will be built.
+         *
+         * @param protocol to use for built RtNetlink
+         * @return this builder
+         */
+        public Builder protocol(RtProtocol protocol) {
+            this.protocol = protocol;
+            return this;
+        }
+
+        /**
+         * Sets scope for the RtNetlink that will be built.
+         *
+         * @param scope to use for built RtNetlink
+         * @return this builder
+         */
+        public Builder scope(short scope) {
+            this.scope = scope;
+            return this;
+        }
+
+        /**
+         * Sets type for the RtNetlink that will be built.
+         *
+         * @param type to use for built RtNetlink
+         * @return this builder
+         */
+        public Builder type(short type) {
+            this.type = type;
+            return this;
+        }
+
+        /**
+         * Sets flags for the RtNetlink that will be built.
+         *
+         * @param flags to use for built RtNetlink
+         * @return this builder
+         */
+        public Builder flags(long flags) {
+            this.flags = flags;
+            return this;
+        }
+
+        /**
+         * Adds attribute for the RtNetlink that will be built.
+         *
+         * @param ra to add to list of route attributes
+         * @return this builder
+         */
+        public Builder routeAttribute(RouteAttribute ra) {
+            attributes.add(ra);
+            return this;
+        }
+
+        /**
+         * Builds the RtNetlink.
+         *
+         * @return RtNetlink reference
+         */
+        public RtNetlink build() {
+            return new RtNetlink(addressFamily,
+                                 dstLength,
+                                 srcLength,
+                                 tos,
+                                 table,
+                                 protocol,
+                                 scope,
+                                 type,
+                                 flags,
+                                 attributes);
+        }
+    }
 }
