diff --git a/internal/common/omci/alarms.go b/internal/common/omci/alarms.go
index aaa2fdd..5d8144b 100644
--- a/internal/common/omci/alarms.go
+++ b/internal/common/omci/alarms.go
@@ -16,32 +16,168 @@
 
 package omci
 
+import (
+	"errors"
+	"fmt"
+	"github.com/google/gopacket"
+	"github.com/opencord/omci-lib-go"
+	me "github.com/opencord/omci-lib-go/generated"
+	log "github.com/sirupsen/logrus"
+)
+
+type OnuAlarmInfo struct {
+	SequenceNo  uint8
+	AlarmBitMap [28]byte
+}
+type OnuAlarmInfoMapKey struct {
+	MeInstance uint16
+	MeClassID  me.ClassID
+}
+
 // CreateUniStatusAlarm will generate an Alarm packet to report that the Link is UP or DOWN
 // as a consequence of a SetRequest on PhysicalPathTerminationPointEthernetUniClassID
-func CreateUniStatusAlarm(adminState uint8, entityId uint16) []byte {
+func CreateUniStatusAlarm(raiseAlarm bool, entityId uint16, sequenceNo uint8) ([]byte, [28]byte) {
+	notif := &omci.AlarmNotificationMsg{
+		MeBasePacket: omci.MeBasePacket{
+			EntityClass:    me.PhysicalPathTerminationPointEthernetUniClassID,
+			EntityInstance: entityId,
+		},
+		AlarmSequenceNumber: byte(sequenceNo),
+	}
+	if raiseAlarm {
+		//PPTP class has only 0th bit alarm for UNI LOS
+		if err := notif.ActivateAlarm(0); err != nil {
+			omciLogger.WithFields(log.Fields{
+				"Err": err,
+			}).Error("Cannot Create AlarmNotificationMsg")
+			return nil, [28]byte{}
+		}
+	} else {
+		if err := notif.ClearAlarm(0); err != nil {
+			omciLogger.WithFields(log.Fields{
+				"Err": err,
+			}).Error("Cannot Create AlarmNotificationMsg")
+			return nil, [28]byte{}
+		}
+	}
+	pkt, err := Serialize(omci.AlarmNotificationType, notif, 0)
+	if err != nil {
+		omciLogger.WithFields(log.Fields{
+			"Err": err,
+		}).Error("Cannot Serialize AlarmNotificationMsg")
+		return nil, [28]byte{}
+	}
+	return pkt, notif.AlarmBitmap
+}
 
-	// TODO generate using omci-lib-go
-	linkMsgDown := []byte{
-		0x00, 0x00, 0x10, 0x0a, 0x00, 0x0b, 0x01, 0x01,
-		0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
+func CreateGetAllAlarmsResponse(tid uint16, onuAlarmDetails map[OnuAlarmInfoMapKey]OnuAlarmInfo) ([]byte, error) {
+	var alarmEntityClass me.ClassID
+	var meInstance uint16
+	var noOfCommands uint16 = 0
+	alarmEntityClass = me.PhysicalPathTerminationPointEthernetUniClassID //Currently doing for PPTP classID
+	meInstance = 257
+	key := OnuAlarmInfoMapKey{
+		MeInstance: meInstance,
+		MeClassID:  alarmEntityClass,
+	}
+	if _, ok := onuAlarmDetails[key]; ok {
+		noOfCommands = 1
+	}
+	numberOfCommands := uint16(noOfCommands)
 
-	linkMsgUp := []byte{
-		0x00, 0x00, 0x10, 0x0a, 0x00, 0x0b, 0x01, 0x01,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
+	request := &omci.GetAllAlarmsResponse{
+		MeBasePacket: omci.MeBasePacket{
+			EntityClass: me.OnuDataClassID,
+		},
+		NumberOfCommands: numberOfCommands,
+	}
+	pkt, err := Serialize(omci.GetAllAlarmsResponseType, request, tid)
+	if err != nil {
+		omciLogger.WithFields(log.Fields{
+			"Err": err,
+		}).Error("Cannot Serialize GetAllAlarmsResponse")
+		return nil, err
+	}
+	return pkt, nil
+}
+func ParseGetAllAlarmsNextRequest(omciPkt gopacket.Packet) (*omci.GetAllAlarmsNextRequest, error) {
+	msgLayer := omciPkt.Layer(omci.LayerTypeGetAllAlarmsNextRequest)
+	if msgLayer == nil {
+		err := "omci Msg layer could not be detected for LayerTypeGetAllAlarmsNextRequest"
+		omciLogger.Error(err)
+		return nil, errors.New(err)
+	}
+	msgObj, msgOk := msgLayer.(*omci.GetAllAlarmsNextRequest)
+	if !msgOk {
+		err := "omci Msg layer could not be assigned for GetAllAlarmsNextRequest"
+		omciLogger.Error(err)
+		return nil, errors.New(err)
+	}
+	return msgObj, nil
+}
 
-	if adminState == 0 {
-		return linkMsgUp
-	} else if adminState == 1 {
-		return linkMsgDown
+func CreateGetAllAlarmsNextResponse(omciPkt gopacket.Packet, omciMsg *omci.OMCI, onuAlarmDetails map[OnuAlarmInfoMapKey]OnuAlarmInfo) ([]byte, error) {
+
+	msgObj, err := ParseGetAllAlarmsNextRequest(omciPkt)
+	if err != nil {
+		err := "omci Msg layer could not be assigned for LayerTypeGetRequest"
+		omciLogger.Error(err)
+		return nil, errors.New(err)
 	}
 
-	return nil
+	omciLogger.WithFields(log.Fields{
+		"EntityClass":           msgObj.EntityClass,
+		"EntityInstance":        msgObj.EntityInstance,
+		"CommandSequenceNumber": msgObj.CommandSequenceNumber,
+	}).Trace("received-omci-get-all-alarms-next-request")
+
+	var alarmEntityClass me.ClassID
+	var meInstance uint16
+	var alarmBitMap [28]byte
+
+	switch msgObj.CommandSequenceNumber {
+	case 0:
+		alarmEntityClass = me.PhysicalPathTerminationPointEthernetUniClassID
+		meInstance = 257
+		//Checking if the alarm is raised in the bitmap, we will send clear just to generate missed clear alarm and
+		// vice versa.
+		key := OnuAlarmInfoMapKey{
+			MeInstance: meInstance,
+			MeClassID:  alarmEntityClass,
+		}
+		if alarmInfo, ok := onuAlarmDetails[key]; ok {
+			alarmBitMap = alarmInfo.AlarmBitMap
+		} else {
+			return nil, fmt.Errorf("alarm-info-for-me-not-present-in-alarm-info-map")
+		}
+	default:
+		omciLogger.Warn("unsupported-CommandSequenceNumber-in-get-all-alarm-next", msgObj.CommandSequenceNumber)
+		return nil, fmt.Errorf("unspported-command-sequence-number-in-get-all-alarms-next")
+	}
+
+	response := &omci.GetAllAlarmsNextResponse{
+		MeBasePacket: omci.MeBasePacket{
+			EntityClass: me.OnuDataClassID,
+		},
+		AlarmEntityClass:    alarmEntityClass,
+		AlarmEntityInstance: meInstance,
+		AlarmBitMap:         alarmBitMap,
+	}
+
+	omciLogger.WithFields(log.Fields{
+		"AlarmEntityClass":    alarmEntityClass,
+		"AlarmEntityInstance": meInstance,
+		"AlarmBitMap":         alarmBitMap,
+	}).Trace("created-omci-getAllAlarmsNext-response")
+
+	pkt, err := Serialize(omci.GetAllAlarmsNextResponseType, response, omciMsg.TransactionID)
+
+	if err != nil {
+		omciLogger.WithFields(log.Fields{
+			"Err": err,
+		}).Fatalf("Cannot Serialize GetAllAlarmsNextRequest")
+		return nil, err
+	}
+
+	return pkt, nil
 }
