diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAppDataLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAppDataLcafAddress.java
index ccb30c3..fe91471 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAppDataLcafAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAppDataLcafAddress.java
@@ -381,6 +381,7 @@
         public void writeTo(ByteBuf byteBuf, LispAppDataLcafAddress address)
                 throws LispWriterException {
 
+            int lcafIndex = byteBuf.writerIndex();
             LispLcafAddress.serializeCommon(byteBuf, address);
 
             byte[] tos = getPartialByteArray(address.getIpTos());
@@ -393,6 +394,8 @@
 
             AfiAddressWriter writer = new LispAfiAddress.AfiAddressWriter();
             writer.writeTo(byteBuf, address.getAddress());
+
+            LispLcafAddress.updateLength(lcafIndex, byteBuf);
         }
 
         /**
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispLcafAddress.java
index 073ca5a..97e4752 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispLcafAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispLcafAddress.java
@@ -53,6 +53,9 @@
 
     private static final int LCAF_AFI_CODE_BYTE_LENGTH = 2;
 
+    private static final int LENGTH_FIELD_INDEX = 7;
+    public static final int COMMON_HEADER_SIZE = 8;
+
     /**
      * Initializes LCAF address.
      *
@@ -228,12 +231,26 @@
     }
 
     /**
+     * Updates the header length field value based on the size of LISP header.
+     *
+     * @param lcafIndex the index of LCAF address, because LCAF address is
+     *                  contained inside LISP control message, so to correctly
+     *                  find the right LCAF length index, we need to know the
+     *                  absolute lcaf index inside LISP control message byte buf
+     * @param byteBuf   netty byte buffer
+     */
+    public static void updateLength(int lcafIndex, ByteBuf byteBuf) {
+        byteBuf.setByte(lcafIndex + LENGTH_FIELD_INDEX, byteBuf.writerIndex() - COMMON_HEADER_SIZE);
+    }
+
+    /**
      * Serializes common fields to byte buffer.
      *
      * @param byteBuf byte buffer
      * @param address LISP LCAF address instance
      */
     public static void serializeCommon(ByteBuf byteBuf, LispLcafAddress address) {
+
         byteBuf.writeShort(AddressFamilyIdentifierEnum.LCAF.getIanaCode());
         byteBuf.writeByte(address.getReserved1());
         byteBuf.writeByte(address.getFlag());
@@ -381,7 +398,7 @@
             }
 
             if (lcafType == TRAFFIC_ENGINEERING.getLispCode()) {
-                return new LispTeLcafAddress.TeAddressBuilder.TeLcafAddressReader().readFrom(byteBuf);
+                return new LispTeLcafAddress.TeLcafAddressReader().readFrom(byteBuf);
             }
 
             log.warn("Unsupported LCAF type, please specify a correct LCAF type");
@@ -415,7 +432,7 @@
                             (LispSourceDestLcafAddress) address);
                     break;
                 case TRAFFIC_ENGINEERING:
-                    new LispTeLcafAddress.TeAddressBuilder.TeLcafAddressWriter().writeTo(byteBuf,
+                    new LispTeLcafAddress.TeLcafAddressWriter().writeTo(byteBuf,
                             (LispTeLcafAddress) address);
                     break;
                 default:
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispListLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispListLcafAddress.java
index 170737c..eb86b65 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispListLcafAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispListLcafAddress.java
@@ -186,6 +186,7 @@
         @Override
         public void writeTo(ByteBuf byteBuf, LispListLcafAddress address) throws LispWriterException {
 
+            int lcafIndex = byteBuf.writerIndex();
             LispLcafAddress.serializeCommon(byteBuf, address);
 
             LispIpv4Address.Ipv4AddressWriter v4Writer = new LispIpv4Address.Ipv4AddressWriter();
@@ -201,6 +202,8 @@
             // IPv6 address
             byteBuf.writeShort(ipv6.getAfi().getIanaCode());
             v6Writer.writeTo(byteBuf, (LispIpv6Address) ipv6);
+
+            LispLcafAddress.updateLength(lcafIndex, byteBuf);
         }
     }
 }
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispNatLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispNatLcafAddress.java
index f9f4f2a..70f046a 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispNatLcafAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispNatLcafAddress.java
@@ -280,13 +280,14 @@
             short msUdpPortNumber = (short) byteBuf.readUnsignedShort();
             short etrUdpPortNumber = (short) byteBuf.readUnsignedShort();
 
-            LispAfiAddress globalEtrRlocAddress = new LispAfiAddress.AfiAddressReader().readFrom(byteBuf);
-            LispAfiAddress msRlocAddress = new LispAfiAddress.AfiAddressReader().readFrom(byteBuf);
-            LispAfiAddress privateEtrRlocAddress = new LispAfiAddress.AfiAddressReader().readFrom(byteBuf);
+            LispAfiAddress globalEtrRlocAddress = new AfiAddressReader().readFrom(byteBuf);
+            LispAfiAddress msRlocAddress = new AfiAddressReader().readFrom(byteBuf);
+            LispAfiAddress privateEtrRlocAddress = new AfiAddressReader().readFrom(byteBuf);
 
             List<LispAfiAddress> rtrRlocAddresses = Lists.newArrayList();
-            for (int i = 0; i < lcafAddress.getLength(); i++) {
-                rtrRlocAddresses.add(new LispAfiAddress.AfiAddressReader().readFrom(byteBuf));
+
+            while (byteBuf.readerIndex() - LispLcafAddress.COMMON_HEADER_SIZE < lcafAddress.getLength()) {
+                rtrRlocAddresses.add(new AfiAddressReader().readFrom(byteBuf));
             }
 
             return new NatAddressBuilder()
@@ -313,6 +314,7 @@
         public void writeTo(ByteBuf byteBuf, LispNatLcafAddress address)
                 throws LispWriterException {
 
+            int lcafIndex = byteBuf.writerIndex();
             LispLcafAddress.serializeCommon(byteBuf, address);
 
             byteBuf.writeShort(address.getMsUdpPortNumber());
@@ -328,6 +330,8 @@
             for (int i = 0; i < rtrRlocAddresses.size(); i++) {
                 writer.writeTo(byteBuf, rtrRlocAddresses.get(i));
             }
+
+            LispLcafAddress.updateLength(lcafIndex, byteBuf);
         }
     }
 }
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSegmentLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSegmentLcafAddress.java
index 50e4128..f6a715a 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSegmentLcafAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSegmentLcafAddress.java
@@ -228,11 +228,14 @@
         public void writeTo(ByteBuf byteBuf, LispSegmentLcafAddress address)
                 throws LispWriterException {
 
+            int lcafIndex = byteBuf.writerIndex();
             LispLcafAddress.serializeCommon(byteBuf, address);
 
             byteBuf.writeInt(address.getInstanceId());
 
             new LispAfiAddress.AfiAddressWriter().writeTo(byteBuf, address.getAddress());
+
+            LispLcafAddress.updateLength(lcafIndex, byteBuf);
         }
     }
 }
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSourceDestLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSourceDestLcafAddress.java
index 08d9205..dd21127 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSourceDestLcafAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSourceDestLcafAddress.java
@@ -300,6 +300,7 @@
         public void writeTo(ByteBuf byteBuf, LispSourceDestLcafAddress address)
                 throws LispWriterException {
 
+            int lcafIndex = byteBuf.writerIndex();
             LispLcafAddress.serializeCommon(byteBuf, address);
 
             byteBuf.writeShort(address.getReserved());
@@ -308,6 +309,8 @@
             AfiAddressWriter writer = new LispAfiAddress.AfiAddressWriter();
             writer.writeTo(byteBuf, address.getSrcPrefix());
             writer.writeTo(byteBuf, address.getDstPrefix());
+
+            LispLcafAddress.updateLength(lcafIndex, byteBuf);
         }
     }
 }
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispTeLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispTeLcafAddress.java
index 6133ea0..6a64c64 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispTeLcafAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispTeLcafAddress.java
@@ -62,8 +62,8 @@
      *
      * @param records a collection of Re-encapsulated RLOC addresses
      */
-    private LispTeLcafAddress(short length, List<LispTeRecord> records) {
-        super(LispCanonicalAddressFormatEnum.TRAFFIC_ENGINEERING, length);
+    private LispTeLcafAddress(List<LispTeRecord> records) {
+        super(LispCanonicalAddressFormatEnum.TRAFFIC_ENGINEERING);
         this.records = records;
     }
 
@@ -102,8 +102,6 @@
 
     public static final class TeAddressBuilder extends LcafAddressBuilder<TeAddressBuilder> {
         private List<LispTeRecord> records;
-        private short length;
-        private static final int SIZE_OF_AFI_RECORD = 8;
 
         /**
          * Sets a collection of TE records.
@@ -113,7 +111,6 @@
          */
         public TeAddressBuilder withTeRecords(List<LispTeRecord> records) {
             this.records = records;
-            this.length = (short) (records.size() * SIZE_OF_AFI_RECORD);
             return this;
         }
 
@@ -123,51 +120,49 @@
          * @return LispTeLcafAddress instance
          */
         public LispTeLcafAddress build() {
-            return new LispTeLcafAddress(length, records);
+            return new LispTeLcafAddress(records);
         }
+    }
+    /**
+     * TE LCAF address reader class.
+     */
+    public static class TeLcafAddressReader implements LispAddressReader<LispTeLcafAddress> {
 
-        /**
-         * TE LCAF address reader class.
-         */
-        public static class TeLcafAddressReader implements LispAddressReader<LispTeLcafAddress> {
+        @Override
+        public LispTeLcafAddress readFrom(ByteBuf byteBuf) throws LispParseError, LispReaderException {
 
-            private static final int SIZE_OF_AFI_RECORD = 8;
+            LispLcafAddress lcafAddress = LispLcafAddress.deserializeCommon(byteBuf);
 
-            @Override
-            public LispTeLcafAddress readFrom(ByteBuf byteBuf) throws LispParseError, LispReaderException {
-
-                LispLcafAddress lcafAddress = LispLcafAddress.deserializeCommon(byteBuf);
-
-                // TODO: for RTR RLOC is IPv4 only for now
-                int numOfRecords = lcafAddress.getLength() / SIZE_OF_AFI_RECORD;
-
-                List<LispTeRecord> teRecords = Lists.newArrayList();
-                for (int i = 0; i < numOfRecords; i++) {
-                    teRecords.add(new LispTeRecord.TeRecordReader().readFrom(byteBuf));
-                }
-
-                return new TeAddressBuilder()
-                            .withTeRecords(teRecords)
-                            .build();
+            List<LispTeRecord> teRecords = Lists.newArrayList();
+            while (byteBuf.readerIndex() - LispLcafAddress.COMMON_HEADER_SIZE < lcafAddress.getLength()) {
+                teRecords.add(new LispTeRecord.TeRecordReader().readFrom(byteBuf));
             }
+
+            return new TeAddressBuilder()
+                        .withTeRecords(teRecords)
+                        .build();
         }
+    }
 
-        /**
-         * TE LCAF address writer class.
-         */
-        public static class TeLcafAddressWriter implements LispAddressWriter<LispTeLcafAddress> {
+    /**
+     * TE LCAF address writer class.
+     */
+    public static class TeLcafAddressWriter implements LispAddressWriter<LispTeLcafAddress> {
 
-            @Override
-            public void writeTo(ByteBuf byteBuf, LispTeLcafAddress address) throws LispWriterException {
-                LispLcafAddress.serializeCommon(byteBuf, address);
+        @Override
+        public void writeTo(ByteBuf byteBuf, LispTeLcafAddress address) throws LispWriterException {
 
-                TeRecordWriter writer = new TeRecordWriter();
+            int lcafIndex = byteBuf.writerIndex();
+            LispLcafAddress.serializeCommon(byteBuf, address);
 
-                List<LispTeRecord> teRecords = address.getTeRecords();
-                for (int i = 0; i < teRecords.size(); i++) {
-                    writer.writeTo(byteBuf, teRecords.get(i));
-                }
+            TeRecordWriter writer = new TeRecordWriter();
+
+            List<LispTeRecord> teRecords = address.getTeRecords();
+            for (int i = 0; i < teRecords.size(); i++) {
+                writer.writeTo(byteBuf, teRecords.get(i));
             }
+
+            LispLcafAddress.updateLength(lcafIndex, byteBuf);
         }
     }
 }
diff --git a/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispInfoReplyTest.java b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispInfoReplyTest.java
index 2ab8002..7e3849a 100644
--- a/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispInfoReplyTest.java
+++ b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispInfoReplyTest.java
@@ -30,6 +30,7 @@
 import org.onosproject.lisp.msg.protocols.LispInfoReply.InfoReplyBuilder;
 import org.onosproject.lisp.msg.types.LispIpv4Address;
 import org.onosproject.lisp.msg.types.LispNatLcafAddress;
+import org.onosproject.lisp.msg.types.LispNatLcafAddress.NatAddressBuilder;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
@@ -58,14 +59,14 @@
 
         LispIpv4Address address1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.4"));
 
-        LispNatLcafAddress natLcafAddress1 = new LispNatLcafAddress.NatAddressBuilder()
-                                                        .withLength((short) 0)
-                                                        .withMsUdpPortNumber(msUdpPortNumber1)
-                                                        .withEtrUdpPortNumber(etrUdpPortNumber1)
-                                                        .withGlobalEtrRlocAddress(globalEtrRlocAddress1)
-                                                        .withMsRlocAddress(msRlocAddress1)
-                                                        .withPrivateEtrRlocAddress(privateEtrRlocAddress1)
-                                                        .build();
+        LispNatLcafAddress natLcafAddress1 = new NatAddressBuilder()
+                                                    .withLength((short) 0)
+                                                    .withMsUdpPortNumber(msUdpPortNumber1)
+                                                    .withEtrUdpPortNumber(etrUdpPortNumber1)
+                                                    .withGlobalEtrRlocAddress(globalEtrRlocAddress1)
+                                                    .withMsRlocAddress(msRlocAddress1)
+                                                    .withPrivateEtrRlocAddress(privateEtrRlocAddress1)
+                                                    .build();
 
         reply1 = builder1
                     .withNonce(1L)
@@ -97,14 +98,14 @@
 
         LispIpv4Address address2 = new LispIpv4Address(IpAddress.valueOf("192.168.2.4"));
 
-        LispNatLcafAddress natLcafAddress2 = new LispNatLcafAddress.NatAddressBuilder()
-                                                        .withLength((short) 0)
-                                                        .withMsUdpPortNumber(msUdpPortNumber2)
-                                                        .withEtrUdpPortNumber(etrUdpPortNumber2)
-                                                        .withGlobalEtrRlocAddress(globalEtrRlocAddress2)
-                                                        .withMsRlocAddress(msRlocAddress2)
-                                                        .withPrivateEtrRlocAddress(privateEtrRlocAddress2)
-                                                        .build();
+        LispNatLcafAddress natLcafAddress2 = new NatAddressBuilder()
+                                                    .withLength((short) 0)
+                                                    .withMsUdpPortNumber(msUdpPortNumber2)
+                                                    .withEtrUdpPortNumber(etrUdpPortNumber2)
+                                                    .withGlobalEtrRlocAddress(globalEtrRlocAddress2)
+                                                    .withMsRlocAddress(msRlocAddress2)
+                                                    .withPrivateEtrRlocAddress(privateEtrRlocAddress2)
+                                                    .build();
 
         reply2 = builder3
                         .withNonce(2L)
@@ -135,7 +136,7 @@
         LispIpv4Address msRlocAddress1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.2"));
         LispIpv4Address privateEtrRlocAddress1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.3"));
 
-        LispNatLcafAddress natLcafAddress = new LispNatLcafAddress.NatAddressBuilder()
+        LispNatLcafAddress natLcafAddress = new NatAddressBuilder()
                 .withLength((short) 0)
                 .withMsUdpPortNumber(msUdpPortNumber1)
                 .withEtrUdpPortNumber(etrUdpPortNumber1)
diff --git a/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/types/LispNatLcafAddressTest.java b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/types/LispNatLcafAddressTest.java
index f8584bdc..2fb6b25 100644
--- a/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/types/LispNatLcafAddressTest.java
+++ b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/types/LispNatLcafAddressTest.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.lisp.msg.types;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.testing.EqualsTester;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
@@ -28,6 +29,8 @@
 import org.onosproject.lisp.msg.types.LispNatLcafAddress.NatLcafAddressReader;
 import org.onosproject.lisp.msg.types.LispNatLcafAddress.NatLcafAddressWriter;
 
+import java.util.List;
+
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 
@@ -51,6 +54,10 @@
         LispIpv4Address msRlocAddress1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.2"));
         LispIpv4Address privateEtrRlocAddress1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.3"));
 
+        LispIpv4Address rtrRloc11 = new LispIpv4Address(IpAddress.valueOf("10.1.1.1"));
+        LispIpv4Address rtrRloc12 = new LispIpv4Address(IpAddress.valueOf("10.1.1.2"));
+        List<LispAfiAddress> rtrRlocs1 = ImmutableList.of(rtrRloc11, rtrRloc12);
+
         address1 = builder1
                         .withLength((short) 0)
                         .withMsUdpPortNumber(msUdpPortNumber1)
@@ -58,6 +65,7 @@
                         .withGlobalEtrRlocAddress(globalEtrRlocAddress1)
                         .withMsRlocAddress(msRlocAddress1)
                         .withPrivateEtrRlocAddress(privateEtrRlocAddress1)
+                        .withRtrRlocAddresses(rtrRlocs1)
                         .build();
 
         NatAddressBuilder builder2 = new NatAddressBuilder();
@@ -69,6 +77,7 @@
                         .withGlobalEtrRlocAddress(globalEtrRlocAddress1)
                         .withMsRlocAddress(msRlocAddress1)
                         .withPrivateEtrRlocAddress(privateEtrRlocAddress1)
+                        .withRtrRlocAddresses(rtrRlocs1)
                         .build();
 
         NatAddressBuilder builder3 = new NatAddressBuilder();
@@ -79,6 +88,10 @@
         LispIpv4Address msRlocAddress2 = new LispIpv4Address(IpAddress.valueOf("192.168.2.2"));
         LispIpv4Address privateEtrRlocAddress2 = new LispIpv4Address(IpAddress.valueOf("192.168.2.3"));
 
+        LispIpv4Address rtrRloc21 = new LispIpv4Address(IpAddress.valueOf("10.1.2.1"));
+        LispIpv4Address rtrRloc22 = new LispIpv4Address(IpAddress.valueOf("10.1.2.2"));
+        List<LispAfiAddress> rtrRlocs2 = ImmutableList.of(rtrRloc21, rtrRloc22);
+
         address2 = builder3
                         .withLength((short) 0)
                         .withMsUdpPortNumber(msUdpPortNumber2)
@@ -86,6 +99,7 @@
                         .withGlobalEtrRlocAddress(globalEtrRlocAddress2)
                         .withMsRlocAddress(msRlocAddress2)
                         .withPrivateEtrRlocAddress(privateEtrRlocAddress2)
+                        .withRtrRlocAddresses(rtrRlocs2)
                         .build();
     }
 
diff --git a/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/types/LispTeLcafAddressTest.java b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/types/LispTeLcafAddressTest.java
index 1b58f60..b800e6e 100644
--- a/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/types/LispTeLcafAddressTest.java
+++ b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/types/LispTeLcafAddressTest.java
@@ -26,8 +26,8 @@
 import org.onosproject.lisp.msg.exceptions.LispReaderException;
 import org.onosproject.lisp.msg.exceptions.LispWriterException;
 import org.onosproject.lisp.msg.types.LispTeLcafAddress.TeAddressBuilder;
-import org.onosproject.lisp.msg.types.LispTeLcafAddress.TeAddressBuilder.TeLcafAddressReader;
-import org.onosproject.lisp.msg.types.LispTeLcafAddress.TeAddressBuilder.TeLcafAddressWriter;
+import org.onosproject.lisp.msg.types.LispTeLcafAddress.TeLcafAddressReader;
+import org.onosproject.lisp.msg.types.LispTeLcafAddress.TeLcafAddressWriter;
 import org.onosproject.lisp.msg.types.LispTeRecord.TeRecordBuilder;
 
 import static org.hamcrest.MatcherAssert.assertThat;
