diff --git a/internal/common/omci/onu_mib_db.go b/internal/common/omci/onu_mib_db.go
index c8696a7..0b73519 100644
--- a/internal/common/omci/onu_mib_db.go
+++ b/internal/common/omci/onu_mib_db.go
@@ -17,6 +17,7 @@
 package omci
 
 import (
+	"bytes"
 	"encoding/binary"
 	"encoding/hex"
 	me "github.com/opencord/omci-lib-go/generated"
@@ -47,6 +48,23 @@
 	return binary.BigEndian.Uint32(e)
 }
 
+func (e EntityID) FromUint16(id uint16) EntityID {
+	buff := new(bytes.Buffer)
+	err := binary.Write(buff, binary.BigEndian, id)
+	if err != nil {
+		panic(err)
+	}
+
+	return buff.Bytes()
+}
+
+func (e EntityID) Equals(i EntityID) bool {
+	if res := bytes.Compare(e, i); res == 0 {
+		return true
+	}
+	return false
+}
+
 const (
 	cardHolderOnuType byte = 0x01 // ONU is a single piece of integrated equipment
 	ethernetUnitType  byte = 0x2f // Ethernet BASE-T
diff --git a/internal/common/omci/onu_mib_db_test.go b/internal/common/omci/onu_mib_db_test.go
index cea0daf..efb6a1b 100644
--- a/internal/common/omci/onu_mib_db_test.go
+++ b/internal/common/omci/onu_mib_db_test.go
@@ -36,6 +36,23 @@
 	assert.Equal(t, uint16(0), res)
 }
 
+func TestEntityID_FromUint16(t *testing.T) {
+	id := uint16(257)
+	e := EntityID{}.FromUint16(id)
+
+	assert.Equal(t, e.ToString(), "0101")
+	assert.Equal(t, e.ToUint16(), id)
+}
+
+func TestEntityID_Equals(t *testing.T) {
+	a := EntityID{0x01, 0x01}
+	b := EntityID{0x01, 0x01}
+	c := EntityID{0x01, 0x02}
+
+	assert.True(t, a.Equals(b))
+	assert.False(t, a.Equals(c))
+}
+
 func Test_GenerateMibDatabase(t *testing.T) {
 	const uniPortCount = 4
 	mibDb, err := GenerateMibDatabase(uniPortCount)
diff --git a/internal/common/omci/set.go b/internal/common/omci/set.go
index 73e17df..e584b52 100644
--- a/internal/common/omci/set.go
+++ b/internal/common/omci/set.go
@@ -73,3 +73,30 @@
 	return pkt, nil
 
 }
+
+func CreateSetRequest(managedEntity *me.ManagedEntity, tid uint16) ([]byte, error) {
+
+	// TODO
+	// why can't we create the SetRequest as we do for all other omci Requests (eg: MibResetRequest)?
+	// if we do the Attributes are not sent
+
+	request := &omci.SetRequest{
+		MeBasePacket: omci.MeBasePacket{
+			EntityClass:    managedEntity.GetClassID(),
+			EntityInstance: managedEntity.GetEntityID(),
+		},
+		Attributes:    managedEntity.GetAttributeValueMap(),
+		AttributeMask: 0x800, // FIXME how can we generate this based on managedEntity.AttributeValueMap?
+	}
+	omciLogger.Info(request)
+
+	pkt, err := Serialize(omci.SetRequestType, request, tid)
+
+	if err != nil {
+		omciLogger.WithFields(log.Fields{
+			"Err": err,
+		}).Fatalf("Cannot Serialize SetRequest")
+		return nil, err
+	}
+	return HexEncode(pkt)
+}
diff --git a/internal/common/omci/set_test.go b/internal/common/omci/set_test.go
new file mode 100644
index 0000000..33ed35a
--- /dev/null
+++ b/internal/common/omci/set_test.go
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package omci
+
+import (
+	"github.com/opencord/omci-lib-go"
+	me "github.com/opencord/omci-lib-go/generated"
+	"github.com/stretchr/testify/assert"
+	"testing"
+)
+
+func TestSetRequest(t *testing.T) {
+
+	meId := GenerateUniPortEntityId(1)
+
+	meParams := me.ParamData{
+		EntityID: meId.ToUint16(),
+		Attributes: me.AttributeValueMap{
+			"AdministrativeState": 1,
+		},
+	}
+	meInstance, omciError := me.NewPhysicalPathTerminationPointEthernetUni(meParams)
+	if omciError.GetError() != nil {
+		t.Fatal(omciError.GetError())
+	}
+
+	pkt, err := CreateSetRequest(meInstance, 1)
+	assert.NoError(t, err)
+
+	omciPkt, omciMsg, err := ParseOpenOltOmciPacket(pkt)
+	assert.NoError(t, err)
+	assert.Equal(t, omciMsg.MessageType, omci.SetRequestType)
+
+	msgObj, _ := ParseSetRequest(omciPkt)
+
+	assert.Equal(t, meId.ToUint16(), msgObj.EntityInstance)
+	assert.Equal(t, uint8(1), msgObj.Attributes["AdministrativeState"])
+
+}
