diff --git a/internal/bbsim/devices/onu.go b/internal/bbsim/devices/onu.go
index 11ace9f..e40c854 100644
--- a/internal/bbsim/devices/onu.go
+++ b/internal/bbsim/devices/onu.go
@@ -126,6 +126,7 @@
 	CommittedImageEntityId        uint16
 	StandbyImageVersion           string
 	ActiveImageVersion            string
+	InDownloadImageVersion        string
 	CommittedImageVersion         string
 	OmciResponseRate              uint8
 	OmciMsgCounter                uint8
@@ -1016,7 +1017,7 @@
 			}).Trace("received-download-section-request")
 			//Extracting the first 14 bytes to use as a version for this image.
 			if o.ImageSoftwareReceivedSections == 0 {
-				o.StandbyImageVersion = string(msgObj.SectionData[0:14])
+				o.InDownloadImageVersion = string(msgObj.SectionData[0:14])
 			}
 			o.ImageSectionData = append(o.ImageSectionData, msgObj.SectionData...)
 			o.ImageSoftwareReceivedSections++
@@ -1057,58 +1058,8 @@
 			o.ImageSoftwareReceivedSections++
 		}
 	case omci.EndSoftwareDownloadRequestType:
+		success := o.handleEndSoftwareDownloadRequest(msg)
 
-		// In the startSoftwareDownload we get the image size and the window size.
-		// We calculate how many DownloadSection we should receive and validate
-		// that we got the correct amount when we receive this message
-		success := true
-		if o.ImageSoftwareExpectedSections != o.ImageSoftwareReceivedSections {
-			onuLogger.WithFields(log.Fields{
-				"OnuId":            o.ID,
-				"IntfId":           o.PonPortID,
-				"OnuSn":            o.Sn(),
-				"ExpectedSections": o.ImageSoftwareExpectedSections,
-				"ReceivedSections": o.ImageSoftwareReceivedSections,
-			}).Errorf("onu-did-not-receive-all-image-sections")
-			success = false
-		}
-		if success {
-			// Validate Image Crc.
-			msgObj, err := omcilib.ParseEndSoftwareDownloadRequest(msg.OmciPkt)
-			if err != nil {
-				onuLogger.WithFields(log.Fields{
-					"OmciMsgType":  msg.OmciMsg.MessageType,
-					"TransCorrId":  msg.OmciMsg.TransactionID,
-					"Err":          errResp.Error(),
-					"IntfId":       o.PonPortID,
-					"SerialNumber": o.Sn(),
-				}).Error("error-while-processing-end-software-download-request")
-			}
-			computedCRC := crc32a.Checksum(o.ImageSectionData[:int(msgObj.ImageSize)])
-			//Convert the crc to network byte order
-			var byteSlice []byte = make([]byte, 4)
-			binary.LittleEndian.PutUint32(byteSlice, uint32(computedCRC))
-			computedCRC = binary.BigEndian.Uint32(byteSlice)
-
-			onuLogger.WithFields(log.Fields{
-				"OnuId":         o.ID,
-				"IntfId":        o.PonPortID,
-				"OnuSn":         o.Sn(),
-				"ReceivedCRC":   msgObj.CRC32,
-				"CalculatedCRC": computedCRC,
-			}).Debug("onu-image-crc-validation-params")
-
-			if msgObj.CRC32 != computedCRC {
-				onuLogger.WithFields(log.Fields{
-					"OnuId":         o.ID,
-					"IntfId":        o.PonPortID,
-					"OnuSn":         o.Sn(),
-					"ReceivedCRC":   msgObj.CRC32,
-					"CalculatedCRC": computedCRC,
-				}).Errorf("onu-image-crc-validation-falied")
-				success = false
-			}
-		}
 		if success {
 			if responsePkt, errResp = omcilib.CreateEndSoftwareDownloadResponse(msg.OmciPkt, msg.OmciMsg, me.Success); errResp == nil {
 				o.MibDataSync++
@@ -1127,7 +1078,7 @@
 					"Err":          errResp.Error(),
 					"IntfId":       o.PonPortID,
 					"SerialNumber": o.Sn(),
-				}).Error("error-while-processing-end-software-download-request")
+				}).Error("error-while-responding-to-end-software-download-request")
 			}
 		} else {
 			if responsePkt, errResp = omcilib.CreateEndSoftwareDownloadResponse(msg.OmciPkt, msg.OmciMsg, me.ProcessingError); errResp == nil {
@@ -1424,6 +1375,81 @@
 	return nil
 }
 
+// returns true if the request is successful, false otherwise
+func (o *Onu) handleEndSoftwareDownloadRequest(msg bbsim.OmciMessage) bool {
+	msgObj, err := omcilib.ParseEndSoftwareDownloadRequest(msg.OmciPkt)
+	if err != nil {
+		onuLogger.WithFields(log.Fields{
+			"OmciMsgType":  msg.OmciMsg.MessageType,
+			"TransCorrId":  msg.OmciMsg.TransactionID,
+			"Err":          err.Error(),
+			"IntfId":       o.PonPortID,
+			"SerialNumber": o.Sn(),
+		}).Error("error-while-processing-end-software-download-request")
+		return false
+	}
+
+	onuLogger.WithFields(log.Fields{
+		"OnuId":  o.ID,
+		"IntfId": o.PonPortID,
+		"OnuSn":  o.Sn(),
+		"msgObj": msgObj,
+	}).Trace("EndSoftwareDownloadRequest received message")
+
+	// if the image download is ongoing and we receive a message with
+	// ImageSize = 0 and Crc = 4294967295 (0xFFFFFFFF) respond with success
+	if o.ImageSoftwareReceivedSections > 0 &&
+		msgObj.ImageSize == 0 &&
+		msgObj.CRC32 == 4294967295 {
+		o.ImageSoftwareReceivedSections = 0
+		// NOTE potentially we may want to add a ONU state to reflect
+		// the software download abort
+		return true
+	}
+
+	// In the startSoftwareDownload we get the image size and the window size.
+	// We calculate how many DownloadSection we should receive and validate
+	// that we got the correct amount when we receive this message
+	// If the received sections are different from the expected sections
+	// respond with failure
+	if o.ImageSoftwareExpectedSections != o.ImageSoftwareReceivedSections {
+		onuLogger.WithFields(log.Fields{
+			"OnuId":            o.ID,
+			"IntfId":           o.PonPortID,
+			"OnuSn":            o.Sn(),
+			"ExpectedSections": o.ImageSoftwareExpectedSections,
+			"ReceivedSections": o.ImageSoftwareReceivedSections,
+		}).Errorf("onu-did-not-receive-all-image-sections")
+		return false
+	}
+
+	// check the received CRC vs the computed CRC
+	computedCRC := crc32a.Checksum(o.ImageSectionData[:int(msgObj.ImageSize)])
+	//Convert the crc to network byte order
+	var byteSlice = make([]byte, 4)
+	binary.LittleEndian.PutUint32(byteSlice, computedCRC)
+	computedCRC = binary.BigEndian.Uint32(byteSlice)
+	if msgObj.CRC32 != computedCRC {
+		onuLogger.WithFields(log.Fields{
+			"OnuId":         o.ID,
+			"IntfId":        o.PonPortID,
+			"OnuSn":         o.Sn(),
+			"ReceivedCRC":   msgObj.CRC32,
+			"CalculatedCRC": computedCRC,
+		}).Errorf("onu-image-crc-validation-failed")
+		return false
+	}
+
+	o.StandbyImageVersion = o.InDownloadImageVersion
+	onuLogger.WithFields(log.Fields{
+		"OnuId":          o.ID,
+		"IntfId":         o.PonPortID,
+		"OnuSn":          o.Sn(),
+		"StandbyVersion": o.StandbyImageVersion,
+	}).Debug("onu-image-version-updated")
+	return true
+}
+
 // BBR methods
 
 func sendOmciMsg(pktBytes []byte, intfId uint32, onuId uint32, sn *openolt.SerialNumber, msgType string, client openolt.OpenoltClient) {
diff --git a/internal/bbsim/devices/onu_omci_test.go b/internal/bbsim/devices/onu_omci_test.go
index 9f2444f..2c2b489 100644
--- a/internal/bbsim/devices/onu_omci_test.go
+++ b/internal/bbsim/devices/onu_omci_test.go
@@ -24,6 +24,7 @@
 	me "github.com/opencord/omci-lib-go/v2/generated"
 	"github.com/opencord/voltha-protos/v5/go/openolt"
 	"gotest.tools/assert"
+	"strconv"
 	"testing"
 )
 
@@ -128,13 +129,15 @@
 	return omciPkt
 }
 
-func makeOmciEndSoftwareDownloadRequest(t *testing.T) []byte {
+func makeOmciEndSoftwareDownloadRequest(t *testing.T, imageSize uint32, imageCrc uint32) []byte {
 	omciReq := &omci.EndSoftwareDownloadRequest{
 		MeBasePacket: omci.MeBasePacket{
 			EntityClass: me.SoftwareImageClassID,
 		},
 		NumberOfInstances: 1,
 		ImageInstances:    []uint16{0},
+		ImageSize:         imageSize,
+		CRC32:             imageCrc,
 	}
 	omciPkt, err := omcilib.Serialize(omci.EndSoftwareDownloadRequestType, omciReq, 66)
 	if err != nil {
@@ -250,9 +253,11 @@
 	assert.Equal(t, onu.MibDataSync, uint8(4))
 
 	// End software download
-	onu.ImageSoftwareReceivedSections = 1 // we fake that we have received the one download section we expect
+	onu.ImageSoftwareExpectedSections = 31
+	onu.ImageSoftwareReceivedSections = 31 // we fake that we have received all the download section we expect
+	onu.ImageSectionData = []byte{111, 114, 116, 116, 105, 116, 111, 114, 32, 113, 117, 105, 115, 46, 32, 86, 105, 118, 97, 109, 117, 115, 32, 110, 101, 99, 32, 108, 105, 98, 101}
 	onu.InternalState.SetState(OnuStateImageDownloadInProgress)
-	err = onu.handleOmciRequest(makeOmciMessage(t, onu, makeOmciEndSoftwareDownloadRequest(t)), stream)
+	err = onu.handleOmciRequest(makeOmciMessage(t, onu, makeOmciEndSoftwareDownloadRequest(t, 31, 1523894119)), stream)
 	assert.NilError(t, err)
 	assert.Equal(t, onu.MibDataSync, uint8(5))
 
@@ -361,3 +366,37 @@
 		assert.Equal(t, stream.CallCount, int(onu.OmciResponseRate))
 	}
 }
+
+func Test_EndSoftwareDownloadRequestHandling(t *testing.T) {
+	onu := createTestOnu()
+
+	// test EndSoftwareDownloadRequest in case of abort
+	onu.ImageSoftwareReceivedSections = 2
+	imageCrc, _ := strconv.ParseInt("FFFFFFFF", 16, 64)
+	msg := makeOmciMessage(t, onu, makeOmciEndSoftwareDownloadRequest(t, 0, uint32(imageCrc)))
+	res := onu.handleEndSoftwareDownloadRequest(msg)
+	assert.Equal(t, res, true)
+	assert.Equal(t, onu.ImageSoftwareReceivedSections, 0)
+
+	// test EndSoftwareDownloadRequest if we received less sections than expected
+	onu.ImageSoftwareExpectedSections = 2
+	onu.ImageSoftwareReceivedSections = 1
+	msg = makeOmciMessage(t, onu, makeOmciEndSoftwareDownloadRequest(t, 2, 2))
+	res = onu.handleEndSoftwareDownloadRequest(msg)
+	assert.Equal(t, res, false)
+
+	// test CRC Mismatch
+	onu.ImageSectionData = []byte{111, 114, 116, 116, 105, 116, 111, 114, 32, 113, 117, 105, 115, 46, 32, 86, 105, 118, 97, 109, 117, 115, 32, 110, 101, 99, 32, 108, 105, 98, 101}
+	onu.ImageSoftwareExpectedSections = 2
+	onu.ImageSoftwareReceivedSections = 2
+	msg = makeOmciMessage(t, onu, makeOmciEndSoftwareDownloadRequest(t, 31, 12))
+	res = onu.handleEndSoftwareDownloadRequest(msg)
+	assert.Equal(t, res, false)
+
+	// if it's a valid case then set the StandbyImageVersion
+	onu.InDownloadImageVersion = "DownloadedImage"
+	msg = makeOmciMessage(t, onu, makeOmciEndSoftwareDownloadRequest(t, 31, 1523894119))
+	res = onu.handleEndSoftwareDownloadRequest(msg)
+	assert.Equal(t, res, true)
+	assert.Equal(t, onu.StandbyImageVersion, "DownloadedImage")
+}
