diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispInfo.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispInfo.java
index 1f8f771..3ad3bd1 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispInfo.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispInfo.java
@@ -35,7 +35,7 @@
     protected final long nonce;
     protected final short keyId;
     protected final short authDataLength;
-    protected final byte[] authenticationData;
+    protected final byte[] authData;
     protected final int ttl;
     protected final byte maskLength;
     protected final LispAfiAddress eidPrefix;
@@ -54,23 +54,23 @@
     /**
      * A private constructor that protects object instantiation from external.
      *
-     * @param infoReply          info reply flag
-     * @param nonce              nonce
-     * @param keyId              key identifier
-     * @param authDataLength     authentication data length
-     * @param authenticationData authentication data
-     * @param ttl                Time-To-Live value
-     * @param maskLength         EID prefix mask length
-     * @param eidPrefix          EID prefix
+     * @param infoReply      info reply flag
+     * @param nonce          nonce
+     * @param keyId          key identifier
+     * @param authDataLength authentication data length
+     * @param authData       authentication data
+     * @param ttl            Time-To-Live value
+     * @param maskLength     EID prefix mask length
+     * @param eidPrefix      EID prefix
      */
     protected DefaultLispInfo(boolean infoReply, long nonce, short keyId, short authDataLength,
-                              byte[] authenticationData, int ttl, byte maskLength,
+                              byte[] authData, int ttl, byte maskLength,
                               LispAfiAddress eidPrefix) {
         this.infoReply = infoReply;
         this.nonce = nonce;
         this.keyId = keyId;
         this.authDataLength = authDataLength;
-        this.authenticationData = authenticationData;
+        this.authData = authData;
         this.ttl = ttl;
         this.maskLength = maskLength;
         this.eidPrefix = eidPrefix;
@@ -92,7 +92,7 @@
     }
 
     @Override
-    public boolean hasInfoReply() {
+    public boolean isInfoReply() {
         return infoReply;
     }
 
@@ -112,9 +112,9 @@
     }
 
     @Override
-    public byte[] getAuthenticationData() {
-        if (authenticationData != null && authenticationData.length != 0) {
-            return ImmutableByteSequence.copyFrom(authenticationData).asArray();
+    public byte[] getAuthData() {
+        if (authData != null && authData.length != 0) {
+            return ImmutableByteSequence.copyFrom(authData).asArray();
         } else {
             return new byte[0];
         }
@@ -156,7 +156,7 @@
         // authenticationDataLength -> 16 bits
         short authLength = byteBuf.readShort();
 
-        // authenticationData -> depends on the authenticationDataLength
+        // authData -> depends on the authenticationDataLength
         byte[] authData = new byte[authLength];
         byteBuf.readBytes(authData);
 
@@ -182,7 +182,7 @@
 
         // info reply flag
         byte infoReply = DISABLE_BIT;
-        if (message.hasInfoReply()) {
+        if (message.isInfoReply()) {
             infoReply = (byte) (ENABLE_BIT << INFO_REPLY_INDEX);
         }
 
@@ -203,7 +203,7 @@
         byteBuf.writeShort(message.getAuthDataLength());
 
         // authentication data
-        byte[] data = message.getAuthenticationData();
+        byte[] data = message.getAuthData();
         byte[] clone;
         if (data != null) {
             clone = data.clone();
@@ -212,8 +212,6 @@
 
         byteBuf.writeBytes(data);
 
-        // TODO: need to implement MAC authentication mechanism
-
         /// TTL
         byteBuf.writeInt(message.getTtl());
 
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispInfoReply.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispInfoReply.java
index 9576dee..29cd39e 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispInfoReply.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispInfoReply.java
@@ -17,41 +17,49 @@
 
 import com.google.common.base.Objects;
 import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import org.onosproject.lisp.msg.authentication.LispAuthenticationFactory;
+import org.onosproject.lisp.msg.authentication.LispAuthenticationKeyEnum;
 import org.onosproject.lisp.msg.exceptions.LispParseError;
 import org.onosproject.lisp.msg.exceptions.LispReaderException;
 import org.onosproject.lisp.msg.exceptions.LispWriterException;
 import org.onosproject.lisp.msg.types.LispAfiAddress;
 import org.onosproject.lisp.msg.types.LispNatLcafAddress;
 import org.onosproject.lisp.msg.types.LispNatLcafAddress.NatLcafAddressWriter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.Arrays;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
+import static org.onosproject.lisp.msg.authentication.LispAuthenticationKeyEnum.valueOf;
 
 /**
  * Default LISP info reply message class.
  */
 public final class DefaultLispInfoReply extends DefaultLispInfo implements LispInfoReply {
 
+    private static final Logger log = LoggerFactory.getLogger(DefaultLispInfoReply.class);
+
     private final LispNatLcafAddress natLcafAddress;
 
     /**
      * A private constructor that protects object instantiation from external.
      *
-     * @param infoReply          info reply flag
-     * @param nonce              nonce
-     * @param keyId              key identifier
-     * @param authDataLength     authentication data length
-     * @param authenticationData authentication data
-     * @param ttl                Time-To-Live value
-     * @param maskLength         EID prefix mask length
-     * @param eidPrefix          EID prefix
-     * @param natLcafAddress     NAT LCAF address
+     * @param infoReply      info reply flag
+     * @param nonce          nonce
+     * @param keyId          key identifier
+     * @param authDataLength authentication data length
+     * @param authData       authentication data
+     * @param ttl            Time-To-Live value
+     * @param maskLength     EID prefix mask length
+     * @param eidPrefix      EID prefix
+     * @param natLcafAddress NAT LCAF address
      */
     protected DefaultLispInfoReply(boolean infoReply, long nonce, short keyId, short authDataLength,
-                                 byte[] authenticationData, int ttl, byte maskLength,
-                                 LispAfiAddress eidPrefix, LispNatLcafAddress natLcafAddress) {
-        super(infoReply, nonce, keyId, authDataLength, authenticationData, ttl, maskLength, eidPrefix);
+                                   byte[] authData, int ttl, byte maskLength,
+                                   LispAfiAddress eidPrefix, LispNatLcafAddress natLcafAddress) {
+        super(infoReply, nonce, keyId, authDataLength, authData, ttl, maskLength, eidPrefix);
         this.natLcafAddress = natLcafAddress;
     }
 
@@ -67,7 +75,7 @@
                 .add("nonce", nonce)
                 .add("keyId", keyId)
                 .add("authentication data length", authDataLength)
-                .add("authentication data", authenticationData)
+                .add("authentication data", authData)
                 .add("TTL", ttl)
                 .add("EID mask length", maskLength)
                 .add("EID prefix", eidPrefix)
@@ -87,7 +95,7 @@
         return Objects.equal(nonce, that.nonce) &&
                 Objects.equal(keyId, that.keyId) &&
                 Objects.equal(authDataLength, that.authDataLength) &&
-                Arrays.equals(authenticationData, that.authenticationData) &&
+                Arrays.equals(authData, that.authData) &&
                 Objects.equal(ttl, that.ttl) &&
                 Objects.equal(maskLength, that.maskLength) &&
                 Objects.equal(eidPrefix, that.eidPrefix) &&
@@ -97,7 +105,7 @@
     @Override
     public int hashCode() {
         return Objects.hashCode(nonce, keyId, authDataLength, ttl, maskLength,
-                eidPrefix, natLcafAddress) + Arrays.hashCode(authenticationData);
+                eidPrefix, natLcafAddress) + Arrays.hashCode(authData);
     }
 
     public static final class DefaultInfoReplyBuilder implements InfoReplyBuilder {
@@ -106,7 +114,8 @@
         private long nonce;
         private short keyId;
         private short authDataLength;
-        private byte[] authenticationData = new byte[0];
+        private byte[] authData;
+        private String authKey;
         private int ttl;
         private byte maskLength;
         private LispAfiAddress eidPrefix;
@@ -143,14 +152,20 @@
         }
 
         @Override
-        public InfoReplyBuilder withAuthenticationData(byte[] authenticationData) {
+        public InfoReplyBuilder withAuthData(byte[] authenticationData) {
             if (authenticationData != null) {
-                this.authenticationData = authenticationData;
+                this.authData = authenticationData;
             }
             return this;
         }
 
         @Override
+        public InfoReplyBuilder withAuthKey(String key) {
+            this.authKey = key;
+            return this;
+        }
+
+        @Override
         public InfoReplyBuilder withTtl(int ttl) {
             this.ttl = ttl;
             return this;
@@ -177,8 +192,36 @@
 
         @Override
         public LispInfoReply build() {
+
+            // if authentication data is not specified, we will calculate it
+            if (authData == null) {
+                LispAuthenticationFactory factory = LispAuthenticationFactory.getInstance();
+
+                authDataLength = LispAuthenticationKeyEnum.valueOf(keyId).getHashLength();
+                byte[] tmpAuthData = new byte[authDataLength];
+                Arrays.fill(tmpAuthData, (byte) 0);
+                authData = tmpAuthData;
+
+                ByteBuf byteBuf = Unpooled.buffer();
+                try {
+                    new DefaultLispInfoReply(infoReply, nonce, keyId, authDataLength,
+                            authData, ttl, maskLength, eidPrefix, natLcafAddress).writeTo(byteBuf);
+                } catch (LispWriterException e) {
+                    log.warn("Failed to serialize info reply", e);
+                }
+
+                byte[] bytes = new byte[byteBuf.readableBytes()];
+                byteBuf.readBytes(bytes);
+
+                if (authKey == null) {
+                    log.warn("Must specify authentication key");
+                }
+
+                authData = factory.createAuthenticationData(valueOf(keyId), authKey, bytes);
+            }
+
             return new DefaultLispInfoReply(infoReply, nonce, keyId, authDataLength,
-                    authenticationData, ttl, maskLength, eidPrefix, natLcafAddress);
+                    authData, ttl, maskLength, eidPrefix, natLcafAddress);
         }
     }
 
@@ -193,11 +236,11 @@
             LispNatLcafAddress natLcafAddress = new LispNatLcafAddress.NatLcafAddressReader().readFrom(byteBuf);
 
             return new DefaultInfoReplyBuilder()
-                    .withInfoReply(lispInfo.hasInfoReply())
+                    .withInfoReply(lispInfo.isInfoReply())
                     .withNonce(lispInfo.getNonce())
                     .withKeyId(lispInfo.getKeyId())
                     .withAuthDataLength(lispInfo.getAuthDataLength())
-                    .withAuthenticationData(lispInfo.getAuthenticationData())
+                    .withAuthData(lispInfo.getAuthData())
                     .withTtl(lispInfo.getTtl())
                     .withMaskLength(lispInfo.getMaskLength())
                     .withEidPrefix(lispInfo.getPrefix())
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispInfoRequest.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispInfoRequest.java
index afe473f..a24fd1a 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispInfoRequest.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispInfoRequest.java
@@ -17,36 +17,44 @@
 
 import com.google.common.base.Objects;
 import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import org.onosproject.lisp.msg.authentication.LispAuthenticationFactory;
+import org.onosproject.lisp.msg.authentication.LispAuthenticationKeyEnum;
 import org.onosproject.lisp.msg.exceptions.LispParseError;
 import org.onosproject.lisp.msg.exceptions.LispReaderException;
 import org.onosproject.lisp.msg.exceptions.LispWriterException;
 import org.onosproject.lisp.msg.types.LispAfiAddress;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.Arrays;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
+import static org.onosproject.lisp.msg.authentication.LispAuthenticationKeyEnum.valueOf;
 
 /**
  * Default LISP info request message class.
  */
 public class DefaultLispInfoRequest extends DefaultLispInfo implements LispInfoRequest {
 
+    private static final Logger log = LoggerFactory.getLogger(DefaultLispInfoRequest.class);
+
     /**
      * A private constructor that protects object instantiation from external.
      *
-     * @param infoReply          info reply flag
-     * @param nonce              nonce
-     * @param keyId              key identifier
-     * @param authDataLength     authentication data length
-     * @param authenticationData authentication data
-     * @param ttl                Time-To-Live value
-     * @param maskLength         EID prefix mask length
-     * @param eidPrefix          EID prefix
+     * @param infoReply      info reply flag
+     * @param nonce          nonce
+     * @param keyId          key identifier
+     * @param authDataLength authentication data length
+     * @param authData       authentication data
+     * @param ttl            Time-To-Live value
+     * @param maskLength     EID prefix mask length
+     * @param eidPrefix      EID prefix
      */
     protected DefaultLispInfoRequest(boolean infoReply, long nonce, short keyId, short authDataLength,
-                                     byte[] authenticationData, int ttl, byte maskLength,
+                                     byte[] authData, int ttl, byte maskLength,
                                      LispAfiAddress eidPrefix) {
-        super(infoReply, nonce, keyId, authDataLength, authenticationData, ttl, maskLength, eidPrefix);
+        super(infoReply, nonce, keyId, authDataLength, authData, ttl, maskLength, eidPrefix);
     }
 
     @Override
@@ -56,7 +64,7 @@
                 .add("nonce", nonce)
                 .add("keyId", keyId)
                 .add("authentication data length", authDataLength)
-                .add("authentication data", authenticationData)
+                .add("authentication data", authData)
                 .add("TTL", ttl)
                 .add("EID mask length", maskLength)
                 .add("EID prefix", eidPrefix).toString();
@@ -75,7 +83,7 @@
         return Objects.equal(nonce, that.nonce) &&
                 Objects.equal(keyId, that.keyId) &&
                 Objects.equal(authDataLength, that.authDataLength) &&
-                Arrays.equals(authenticationData, that.authenticationData) &&
+                Arrays.equals(authData, that.authData) &&
                 Objects.equal(ttl, that.ttl) &&
                 Objects.equal(maskLength, that.maskLength) &&
                 Objects.equal(eidPrefix, that.eidPrefix);
@@ -84,7 +92,7 @@
     @Override
     public int hashCode() {
         return Objects.hashCode(nonce, keyId, authDataLength, ttl, maskLength,
-                eidPrefix) + Arrays.hashCode(authenticationData);
+                eidPrefix) + Arrays.hashCode(authData);
     }
 
     public static final class DefaultInfoRequestBuilder implements InfoRequestBuilder {
@@ -93,7 +101,8 @@
         private long nonce;
         private short keyId;
         private short authDataLength;
-        private byte[] authenticationData = new byte[0];
+        private byte[] authData;
+        private String authKey;
         private int ttl;
         private byte maskLength;
         private LispAfiAddress eidPrefix;
@@ -129,14 +138,20 @@
         }
 
         @Override
-        public InfoRequestBuilder withAuthenticationData(byte[] authenticationData) {
+        public InfoRequestBuilder withAuthData(byte[] authenticationData) {
             if (authenticationData != null) {
-                this.authenticationData = authenticationData;
+                this.authData = authenticationData;
             }
             return this;
         }
 
         @Override
+        public InfoRequestBuilder withAuthKey(String key) {
+            this.authKey = key;
+            return this;
+        }
+
+        @Override
         public InfoRequestBuilder withTtl(int ttl) {
             this.ttl = ttl;
             return this;
@@ -156,8 +171,36 @@
 
         @Override
         public LispInfoRequest build() {
+
+            // if authentication data is not specified, we will calculate it
+            if (authData == null) {
+                LispAuthenticationFactory factory = LispAuthenticationFactory.getInstance();
+
+                authDataLength = LispAuthenticationKeyEnum.valueOf(keyId).getHashLength();
+                byte[] tmpAuthData = new byte[authDataLength];
+                Arrays.fill(tmpAuthData, (byte) 0);
+                authData = tmpAuthData;
+
+                ByteBuf byteBuf = Unpooled.buffer();
+                try {
+                    new DefaultLispInfoRequest(infoReply, nonce, keyId, authDataLength,
+                            authData, ttl, maskLength, eidPrefix).writeTo(byteBuf);
+                } catch (LispWriterException e) {
+                    log.warn("Failed to serialize info request", e);
+                }
+
+                byte[] bytes = new byte[byteBuf.readableBytes()];
+                byteBuf.readBytes(bytes);
+
+                if (authKey == null) {
+                    log.warn("Must specify authentication key");
+                }
+
+                authData = factory.createAuthenticationData(valueOf(keyId), authKey, bytes);
+            }
+
             return new DefaultLispInfoRequest(infoReply, nonce, keyId,
-                    authDataLength, authenticationData, ttl, maskLength, eidPrefix);
+                    authDataLength, authData, ttl, maskLength, eidPrefix);
         }
     }
 
@@ -172,11 +215,11 @@
             LispInfo lispInfo = DefaultLispInfo.deserialize(byteBuf);
 
             return new DefaultInfoRequestBuilder()
-                    .withInfoReply(lispInfo.hasInfoReply())
+                    .withInfoReply(lispInfo.isInfoReply())
                     .withNonce(lispInfo.getNonce())
                     .withKeyId(lispInfo.getKeyId())
                     .withAuthDataLength(lispInfo.getAuthDataLength())
-                    .withAuthenticationData(lispInfo.getAuthenticationData())
+                    .withAuthData(lispInfo.getAuthData())
                     .withTtl(lispInfo.getTtl())
                     .withMaskLength(lispInfo.getMaskLength())
                     .withEidPrefix(lispInfo.getPrefix()).build();
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapNotify.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapNotify.java
index 248d118..d6a27fb 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapNotify.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapNotify.java
@@ -19,15 +19,21 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
 import org.onlab.util.ImmutableByteSequence;
+import org.onosproject.lisp.msg.authentication.LispAuthenticationFactory;
+import org.onosproject.lisp.msg.authentication.LispAuthenticationKeyEnum;
 import org.onosproject.lisp.msg.exceptions.LispParseError;
 import org.onosproject.lisp.msg.exceptions.LispReaderException;
 import org.onosproject.lisp.msg.exceptions.LispWriterException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.Arrays;
 import java.util.List;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
+import static org.onosproject.lisp.msg.authentication.LispAuthenticationKeyEnum.valueOf;
 import static org.onosproject.lisp.msg.protocols.DefaultLispMapRecord.MapRecordWriter;
 
 /**
@@ -36,13 +42,16 @@
 public final class DefaultLispMapNotify extends AbstractLispMessage
         implements LispMapNotify {
 
+    private static final Logger log = LoggerFactory.getLogger(DefaultLispMapNotify.class);
+
     private final long nonce;
     private final short keyId;
     private final short authDataLength;
-    private final byte[] authenticationData;
+    private final byte[] authData;
     private final List<LispMapRecord> mapRecords;
 
     static final NotifyWriter WRITER;
+
     static {
         WRITER = new NotifyWriter();
     }
@@ -50,17 +59,17 @@
     /**
      * A private constructor that protects object instantiation from external.
      *
-     * @param nonce              nonce
-     * @param keyId              key identifier
-     * @param authenticationData authentication data
-     * @param mapRecords         a collection of map records
+     * @param nonce      nonce
+     * @param keyId      key identifier
+     * @param authData   authentication data
+     * @param mapRecords a collection of map records
      */
     private DefaultLispMapNotify(long nonce, short keyId, short authDataLength,
-                                 byte[] authenticationData, List<LispMapRecord> mapRecords) {
+                                 byte[] authData, List<LispMapRecord> mapRecords) {
         this.nonce = nonce;
         this.keyId = keyId;
         this.authDataLength = authDataLength;
-        this.authenticationData = authenticationData;
+        this.authData = authData;
         this.mapRecords = mapRecords;
     }
 
@@ -100,9 +109,9 @@
     }
 
     @Override
-    public byte[] getAuthenticationData() {
-        if (authenticationData != null && authenticationData.length != 0) {
-            return ImmutableByteSequence.copyFrom(authenticationData).asArray();
+    public byte[] getAuthData() {
+        if (authData != null && authData.length != 0) {
+            return ImmutableByteSequence.copyFrom(authData).asArray();
         } else {
             return new byte[0];
         }
@@ -120,7 +129,7 @@
                 .add("nonce", nonce)
                 .add("keyId", keyId)
                 .add("authentication data length", authDataLength)
-                .add("authentication data", authenticationData)
+                .add("authentication data", authData)
                 .add("mapRecords", mapRecords).toString();
     }
 
@@ -136,13 +145,13 @@
         return Objects.equal(nonce, that.nonce) &&
                 Objects.equal(keyId, that.keyId) &&
                 Objects.equal(authDataLength, that.authDataLength) &&
-                Arrays.equals(authenticationData, that.authenticationData);
+                Arrays.equals(authData, that.authData);
     }
 
     @Override
     public int hashCode() {
         return Objects.hashCode(nonce, keyId, authDataLength) +
-                Arrays.hashCode(authenticationData);
+                Arrays.hashCode(authData);
     }
 
     public static final class DefaultNotifyBuilder implements NotifyBuilder {
@@ -150,7 +159,8 @@
         private long nonce;
         private short keyId;
         private short authDataLength;
-        private byte[] authenticationData;
+        private byte[] authData;
+        private String authKey;
         private List<LispMapRecord> mapRecords = Lists.newArrayList();
 
         @Override
@@ -171,17 +181,23 @@
         }
 
         @Override
+        public NotifyBuilder withAuthKey(String key) {
+            this.authKey = key;
+            return this;
+        }
+
+        @Override
         public NotifyBuilder withAuthDataLength(short authDataLength) {
             this.authDataLength = authDataLength;
             return this;
         }
 
         @Override
-        public NotifyBuilder withAuthenticationData(byte[] authenticationData) {
-            if (authenticationData != null) {
-                this.authenticationData = authenticationData;
+        public NotifyBuilder withAuthData(byte[] authData) {
+            if (authData != null) {
+                this.authData = authData;
             } else {
-                this.authenticationData = new byte[0];
+                this.authData = new byte[0];
             }
             return this;
         }
@@ -197,12 +213,34 @@
         @Override
         public LispMapNotify build() {
 
-            if (authenticationData == null) {
-                authenticationData = new byte[0];
+            // if authentication data is not specified, we will calculate it
+            if (authData == null) {
+                LispAuthenticationFactory factory = LispAuthenticationFactory.getInstance();
+
+                authDataLength = LispAuthenticationKeyEnum.valueOf(keyId).getHashLength();
+                byte[] tmpAuthData = new byte[authDataLength];
+                Arrays.fill(tmpAuthData, (byte) 0);
+                authData = tmpAuthData;
+
+                ByteBuf byteBuf = Unpooled.buffer();
+                try {
+                    new DefaultLispMapNotify(nonce, keyId, authDataLength,
+                            authData, mapRecords).writeTo(byteBuf);
+                } catch (LispWriterException e) {
+                    log.warn("Failed to serialize map notify message", e);
+                }
+
+                byte[] bytes = new byte[byteBuf.readableBytes()];
+                byteBuf.readBytes(bytes);
+
+                if (authKey == null) {
+                    log.warn("Must specify authentication key");
+                }
+
+                authData = factory.createAuthenticationData(valueOf(keyId), authKey, bytes);
             }
 
-            return new DefaultLispMapNotify(nonce, keyId, authDataLength,
-                    authenticationData, mapRecords);
+            return new DefaultLispMapNotify(nonce, keyId, authDataLength, authData, mapRecords);
         }
     }
 
@@ -235,7 +273,7 @@
             // authenticationDataLength -> 16 bits
             short authLength = byteBuf.readShort();
 
-            // authenticationData -> depends on the authenticationDataLength
+            // authData -> depends on the authenticationDataLength
             byte[] authData = new byte[authLength];
             byteBuf.readBytes(authData);
 
@@ -245,12 +283,12 @@
             }
 
             return new DefaultNotifyBuilder()
-                        .withNonce(nonce)
-                        .withKeyId(keyId)
-                        .withAuthDataLength(authLength)
-                        .withAuthenticationData(authData)
-                        .withMapRecords(mapRecords)
-                        .build();
+                    .withNonce(nonce)
+                    .withKeyId(keyId)
+                    .withAuthDataLength(authLength)
+                    .withAuthData(authData)
+                    .withMapRecords(mapRecords)
+                    .build();
         }
     }
 
@@ -283,11 +321,11 @@
             byteBuf.writeShort(message.getKeyId());
 
             // authentication data and its length
-            if (message.getAuthenticationData() == null) {
+            if (message.getAuthData() == null) {
                 byteBuf.writeShort((short) 0);
             } else {
-                byteBuf.writeShort(message.getAuthenticationData().length);
-                byteBuf.writeBytes(message.getAuthenticationData());
+                byteBuf.writeShort(message.getAuthData().length);
+                byteBuf.writeBytes(message.getAuthData());
             }
 
             // serialize map records
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRegister.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRegister.java
index a3166c1..3171d2e 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRegister.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRegister.java
@@ -19,16 +19,22 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
 import org.onlab.util.ByteOperator;
 import org.onlab.util.ImmutableByteSequence;
+import org.onosproject.lisp.msg.authentication.LispAuthenticationFactory;
+import org.onosproject.lisp.msg.authentication.LispAuthenticationKeyEnum;
 import org.onosproject.lisp.msg.exceptions.LispParseError;
 import org.onosproject.lisp.msg.exceptions.LispReaderException;
 import org.onosproject.lisp.msg.exceptions.LispWriterException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.Arrays;
 import java.util.List;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
+import static org.onosproject.lisp.msg.authentication.LispAuthenticationKeyEnum.valueOf;
 import static org.onosproject.lisp.msg.protocols.DefaultLispMapRecord.MapRecordReader;
 import static org.onosproject.lisp.msg.protocols.DefaultLispMapRecord.MapRecordWriter;
 
@@ -39,15 +45,18 @@
 public final class DefaultLispMapRegister extends AbstractLispMessage
         implements LispMapRegister {
 
+    private static final Logger log = LoggerFactory.getLogger(DefaultLispMapRegister.class);
+
     private final long nonce;
     private final short keyId;
     private final short authDataLength;
-    private final byte[] authenticationData;
+    private final byte[] authData;
     private final List<LispMapRecord> mapRecords;
     private final boolean proxyMapReply;
     private final boolean wantMapNotify;
 
     static final RegisterWriter WRITER;
+
     static {
         WRITER = new RegisterWriter();
     }
@@ -55,21 +64,21 @@
     /**
      * A private constructor that protects object instantiation from external.
      *
-     * @param nonce              nonce
-     * @param keyId              key identifier
-     * @param authDataLength     authentication data length
-     * @param authenticationData authentication data
-     * @param mapRecords         a collection of map records
-     * @param proxyMapReply      proxy map reply flag
-     * @param wantMapNotify      want map notify flag
+     * @param nonce          nonce
+     * @param keyId          key identifier
+     * @param authDataLength authentication data length
+     * @param authData       authentication data
+     * @param mapRecords     a collection of map records
+     * @param proxyMapReply  proxy map reply flag
+     * @param wantMapNotify  want map notify flag
      */
     private DefaultLispMapRegister(long nonce, short keyId, short authDataLength,
-                                   byte[] authenticationData, List<LispMapRecord> mapRecords,
+                                   byte[] authData, List<LispMapRecord> mapRecords,
                                    boolean proxyMapReply, boolean wantMapNotify) {
         this.nonce = nonce;
         this.keyId = keyId;
         this.authDataLength = authDataLength;
-        this.authenticationData = authenticationData;
+        this.authData = authData;
         this.mapRecords = mapRecords;
         this.proxyMapReply = proxyMapReply;
         this.wantMapNotify = wantMapNotify;
@@ -121,9 +130,9 @@
     }
 
     @Override
-    public byte[] getAuthenticationData() {
-        if (authenticationData != null && authenticationData.length != 0) {
-            return ImmutableByteSequence.copyFrom(authenticationData).asArray();
+    public byte[] getAuthData() {
+        if (authData != null && authData.length != 0) {
+            return ImmutableByteSequence.copyFrom(authData).asArray();
         } else {
             return new byte[0];
         }
@@ -141,7 +150,7 @@
                 .add("nonce", nonce)
                 .add("keyId", keyId)
                 .add("authentication data length", authDataLength)
-                .add("authentication data", authenticationData)
+                .add("authentication data", authData)
                 .add("mapRecords", mapRecords)
                 .add("proxyMapReply", proxyMapReply)
                 .add("wantMapNotify", wantMapNotify).toString();
@@ -160,7 +169,7 @@
         return Objects.equal(nonce, that.nonce) &&
                 Objects.equal(keyId, that.keyId) &&
                 Objects.equal(authDataLength, that.authDataLength) &&
-                Arrays.equals(authenticationData, that.authenticationData) &&
+                Arrays.equals(authData, that.authData) &&
                 Objects.equal(proxyMapReply, that.proxyMapReply) &&
                 Objects.equal(wantMapNotify, that.wantMapNotify);
     }
@@ -168,7 +177,7 @@
     @Override
     public int hashCode() {
         return Objects.hashCode(nonce, keyId, authDataLength,
-                proxyMapReply, wantMapNotify) + Arrays.hashCode(authenticationData);
+                proxyMapReply, wantMapNotify) + Arrays.hashCode(authData);
     }
 
     public static final class DefaultRegisterBuilder implements RegisterBuilder {
@@ -176,7 +185,8 @@
         private long nonce;
         private short keyId;
         private short authDataLength;
-        private byte[] authenticationData = new byte[0];
+        private byte[] authData;
+        private String authKey;
         private List<LispMapRecord> mapRecords = Lists.newArrayList();
         private boolean proxyMapReply;
         private boolean wantMapNotify;
@@ -205,6 +215,12 @@
         }
 
         @Override
+        public RegisterBuilder withAuthKey(String key) {
+            this.authKey = key;
+            return this;
+        }
+
+        @Override
         public RegisterBuilder withAuthDataLength(short authDataLength) {
             this.authDataLength = authDataLength;
             return this;
@@ -217,9 +233,9 @@
         }
 
         @Override
-        public RegisterBuilder withAuthenticationData(byte[] authenticationData) {
+        public RegisterBuilder withAuthData(byte[] authenticationData) {
             if (authenticationData != null) {
-                this.authenticationData = authenticationData;
+                this.authData = authenticationData;
             }
             return this;
         }
@@ -234,8 +250,36 @@
 
         @Override
         public LispMapRegister build() {
+
+            // if authentication data is not specified, we will calculate it
+            if (authData == null) {
+                LispAuthenticationFactory factory = LispAuthenticationFactory.getInstance();
+
+                authDataLength = LispAuthenticationKeyEnum.valueOf(keyId).getHashLength();
+                byte[] tmpAuthData = new byte[authDataLength];
+                Arrays.fill(tmpAuthData, (byte) 0);
+                authData = tmpAuthData;
+
+                ByteBuf byteBuf = Unpooled.buffer();
+                try {
+                    new DefaultLispMapRegister(nonce, keyId, authDataLength, authData,
+                            mapRecords, proxyMapReply, wantMapNotify).writeTo(byteBuf);
+                } catch (LispWriterException e) {
+                    log.warn("Failed to serialize map register message", e);
+                }
+
+                byte[] bytes = new byte[byteBuf.readableBytes()];
+                byteBuf.readBytes(bytes);
+
+                if (authKey == null) {
+                    log.warn("Must specify authentication key");
+                }
+
+                authData = factory.createAuthenticationData(valueOf(keyId), authKey, bytes);
+            }
+
             return new DefaultLispMapRegister(nonce, keyId, authDataLength,
-                    authenticationData, mapRecords, proxyMapReply, wantMapNotify);
+                    authData, mapRecords, proxyMapReply, wantMapNotify);
         }
     }
 
@@ -278,7 +322,7 @@
             // authenticationDataLength -> 16 bits
             short authLength = byteBuf.readShort();
 
-            // authenticationData -> depends on the authenticationDataLength
+            // authData -> depends on the authenticationDataLength
             byte[] authData = new byte[authLength];
             byteBuf.readBytes(authData);
 
@@ -292,7 +336,7 @@
                     .withIsWantMapNotify(wantMapNotifyFlag)
                     .withNonce(nonce)
                     .withKeyId(keyId)
-                    .withAuthenticationData(authData)
+                    .withAuthData(authData)
                     .withAuthDataLength(authLength)
                     .withMapRecords(mapRecords)
                     .build();
@@ -321,7 +365,7 @@
 
             // proxy map reply flag
             byte proxyMapReply = DISABLE_BIT;
-            if (message.isProxyMapReply())  {
+            if (message.isProxyMapReply()) {
                 proxyMapReply = (byte) (ENABLE_BIT << PROXY_MAP_REPLY_SHIFT_BIT);
             }
 
@@ -348,11 +392,11 @@
             byteBuf.writeShort(message.getKeyId());
 
             // authentication data and its length
-            if (message.getAuthenticationData() == null) {
+            if (message.getAuthData() == null) {
                 byteBuf.writeShort((short) 0);
             } else {
-                byteBuf.writeShort(message.getAuthenticationData().length);
-                byteBuf.writeBytes(message.getAuthenticationData());
+                byteBuf.writeShort(message.getAuthData().length);
+                byteBuf.writeBytes(message.getAuthData());
             }
 
             // serialize map records
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/InfoBuilder.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/InfoBuilder.java
index 0b6f381..655eb49 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/InfoBuilder.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/InfoBuilder.java
@@ -58,10 +58,18 @@
     /**
      * Sets authentication data.
      *
-     * @param authenticationData authentication data
+     * @param authData authentication data
      * @return T object
      */
-    T withAuthenticationData(byte[] authenticationData);
+    T withAuthData(byte[] authData);
+
+    /**
+     * Sets authentication key.
+     *
+     * @param key authentication key
+     * @return RegisterBuilder object
+     */
+    T withAuthKey(String key);
 
     /**
      * Sets Time-To-Live value.
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispInfo.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispInfo.java
index 1fd9b46..19fb9d0 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispInfo.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispInfo.java
@@ -27,7 +27,7 @@
      *
      * @return has info reply flag value
      */
-    boolean hasInfoReply();
+    boolean isInfoReply();
 
     /**
      * Obtains nonce value.
@@ -55,7 +55,7 @@
      *
      * @return authentication data
      */
-    byte[] getAuthenticationData();
+    byte[] getAuthData();
 
     /**
      * Obtains TTL value.
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispMapNotify.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispMapNotify.java
index 4b8abca..84d16f2 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispMapNotify.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispMapNotify.java
@@ -89,7 +89,7 @@
      *
      * @return authentication data
      */
-    byte[] getAuthenticationData();
+    byte[] getAuthData();
 
     /**
      * Obtains a collection of records.
@@ -112,7 +112,7 @@
         NotifyBuilder withNonce(long nonce);
 
         /**
-         * Sets key identitifer.
+         * Sets key identifier.
          *
          * @param keyId key identifier
          * @return NotifyBuilder object
@@ -120,6 +120,14 @@
         NotifyBuilder withKeyId(short keyId);
 
         /**
+         * Sets authentication key.
+         *
+         * @param key authentication key
+         * @return NotifyBuilder object
+         */
+        NotifyBuilder withAuthKey(String key);
+
+        /**
          * Sets authentication data length.
          *
          * @param authDataLength authentication data length
@@ -130,10 +138,10 @@
         /**
          * Sets authentication data.
          *
-         * @param authenticationData authentication data
+         * @param authData authentication data
          * @return NotifyBuilder object
          */
-        NotifyBuilder withAuthenticationData(byte[] authenticationData);
+        NotifyBuilder withAuthData(byte[] authData);
 
         /**
          * Sets a collection of map records.
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispMapRegister.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispMapRegister.java
index f5341c2..797ebd7 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispMapRegister.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispMapRegister.java
@@ -103,7 +103,7 @@
      *
      * @return authentication data
      */
-    byte[] getAuthenticationData();
+    byte[] getAuthData();
 
     /**
      * Obtains a collection of records.
@@ -142,6 +142,14 @@
         RegisterBuilder withNonce(long nonce);
 
         /**
+         * Sets authentication key.
+         *
+         * @param key authentication key
+         * @return RegisterBuilder object
+         */
+        RegisterBuilder withAuthKey(String key);
+
+        /**
          * Sets authentication data length.
          *
          * @param authDataLength authentication data length
@@ -160,10 +168,10 @@
         /**
          * Sets authentication data.
          *
-         * @param authenticationData authentication data
+         * @param authData authentication data
          * @return RegisterBuilder object
          */
-        RegisterBuilder withAuthenticationData(byte[] authenticationData);
+        RegisterBuilder withAuthData(byte[] authData);
 
         /**
          * Sets a collection of map records.
