diff --git a/inc/dmi_common.h b/inc/dmi_common.h
new file mode 100644
index 0000000..a8a6261
--- /dev/null
+++ b/inc/dmi_common.h
@@ -0,0 +1,34 @@
+ /*
+ * Copyright 2021-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.
+ */
+
+#ifndef DMI_COMMON_H_
+#define DMI_COMMON_H_
+
+#include <iostream>
+#include <string>
+#include <memory>
+#include <vector>
+#include <grpc/grpc.h>
+#include <grpc++/server.h>
+#include <grpc++/server_builder.h>
+#include <grpc++/server_context.h>
+#include <grpcpp/grpcpp.h>
+
+using grpc::Server;
+using grpc::ServerBuilder;
+using grpc::ServerContext;
+using grpc::ServerWriter;
+using grpc::Status;
+using grpc::ResourceQuota;
+
+#endif
diff --git a/inc/dmi_events_mgmt.h b/inc/dmi_events_mgmt.h
new file mode 100644
index 0000000..6a275dd
--- /dev/null
+++ b/inc/dmi_events_mgmt.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2021-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.
+ */
+
+#ifndef DMI_HW_MGMT_H_
+#define DMI_HH_MGMT_H_
+
+#include "hw_events_mgmt_service.grpc.pb.h"
+#include "hw_events_mgmt_service.pb.h"
+#include "dmi_common.h"
+
+class HWEventsMgmtService final : public dmi::NativeEventsManagementService::Service
+{
+    public:
+        static HWEventsMgmtService& getHwEventMgmtInstance()
+        {
+            static HWEventsMgmtService HwEventInstance;
+            return HwEventInstance;
+        }
+
+        grpc::Status ListEvents(
+                ServerContext* context,
+                const dmi::HardwareID* request,
+                dmi::ListEventsResponse* response)
+        {
+            //TODO write an internal API to handle the request
+            return Status(grpc::StatusCode::UNIMPLEMENTED, "RPC not implemented");
+        }
+
+        grpc::Status UpdateEventsConfiguration(
+                ServerContext* context,
+                const dmi::EventsConfigurationRequest* request,
+                dmi::EventsConfigurationResponse* response )
+        {
+            //TODO write an internal API to handle the request
+            return Status(grpc::StatusCode::UNIMPLEMENTED, "RPC not implemented");
+        }
+
+    private:
+        HWEventsMgmtService()
+        {
+        }
+
+        ~HWEventsMgmtService()
+        {
+        }
+};
+
+#endif
diff --git a/inc/dmi_hw_mgmt.h b/inc/dmi_hw_mgmt.h
new file mode 100644
index 0000000..2ff29ab
--- /dev/null
+++ b/inc/dmi_hw_mgmt.h
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2021-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.
+ */
+
+#ifndef DMI_HW_MGMT_H_
+#define DMI_HH_MGMT_H_
+
+#include "hw_management_service.grpc.pb.h"
+#include "hw_management_service.pb.h"
+#include "dmi_common.h"
+
+using grpc::ServerWriter;
+
+grpc::Status StartManagingDevice_(
+             const dmi::ModifiableComponent* request,
+             ServerWriter<dmi::StartManagingDeviceResponse>* writer
+             );
+grpc::Status StopManagingDevice_(dmi::StopManagingDeviceResponse* response);
+grpc::Status GetManagedDevices_(dmi::ManagedDevicesResponse* response);
+grpc::Status GetPhysicalInventory_(dmi::PhysicalInventoryResponse* response);
+
+class HWMgmtService final : public dmi::NativeHWManagementService::Service
+{
+    public:
+        static HWMgmtService& getHWInstance()
+        {
+            static HWMgmtService hwinstance;
+            return hwinstance;
+        }
+
+        grpc::Status StartManagingDevice(
+                ServerContext* context,
+                const dmi::ModifiableComponent* request,
+                ServerWriter<dmi::StartManagingDeviceResponse>* writer
+                )
+        {
+            return StartManagingDevice_(request, writer);
+        }
+
+        grpc::Status StopManagingDevice(
+                ServerContext* context,
+                const dmi::StopManagingDeviceRequest* request,
+                dmi::StopManagingDeviceResponse* response
+                )
+        {
+            return StopManagingDevice_(response);
+        }
+
+        grpc::Status GetManagedDevices(
+                ServerContext* context,
+                const google::protobuf::Empty* request,
+                dmi::ManagedDevicesResponse* response
+                )
+        {
+            return GetManagedDevices_(response);
+        }
+
+        grpc::Status GetPhysicalInventory(
+                ServerContext* context,
+                const dmi::PhysicalInventoryRequest* request,
+                dmi::PhysicalInventoryResponse* response
+                )
+        {
+            return GetPhysicalInventory_(response);
+        }
+
+    private:
+        HWMgmtService()
+        {
+        }
+
+        ~HWMgmtService()
+        {
+        }
+};
+
+#endif
diff --git a/inc/dmi_metrics_mgmt.h b/inc/dmi_metrics_mgmt.h
new file mode 100644
index 0000000..a60e21d
--- /dev/null
+++ b/inc/dmi_metrics_mgmt.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2021-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.
+ */
+
+#ifndef DMI_HW_MGMT_H_
+#define DMI_HH_MGMT_H_
+
+#include "hw_metrics_mgmt_service.grpc.pb.h"
+#include "hw_metrics_mgmt_service.pb.h"
+#include "dmi_common.h"
+
+using grpc::ServerWriter;
+
+
+class HWMetricsMgmtService final : public dmi::NativeMetricsManagementService::Service
+{
+    public:
+        static HWMetricsMgmtService& getHwMetricMgmtInstance()
+        {
+            static HWMetricsMgmtService HwMetrictInstance;
+            return HwMetrictInstance;
+        }
+
+        grpc::Status ListMetrics(
+                ServerContext* context,
+                const dmi::HardwareID* request,
+                dmi::ListMetricsResponse* response )
+        {
+            //TODO write an internal API to handle the request
+            return Status(grpc::StatusCode::UNIMPLEMENTED, "RPC not implemented");
+        }
+
+        grpc::Status UpdateMetricsConfiguration(
+                ServerContext* context,
+                const dmi::MetricsConfigurationRequest* request,
+                dmi::MetricsConfigurationResponse* response )
+        {
+            //TODO write an internal API to handle the request
+            return Status(grpc::StatusCode::UNIMPLEMENTED, "RPC not implemented");
+        }
+
+        grpc::Status GetMetric(
+                ServerContext* context,
+                const dmi::GetMetricRequest* request,
+                dmi::GetMetricResponse* response )
+        {
+            //TODO write an internal API to handle the request
+            return Status(grpc::StatusCode::UNIMPLEMENTED, "RPC not implemented");
+        }
+
+    private:
+        HWMetricsMgmtService()
+        {
+        }
+
+        ~HWMetricsMgmtService()
+        {
+        }
+};
+
+#endif
diff --git a/inc/dmi_phycomp_factory.h b/inc/dmi_phycomp_factory.h
new file mode 100644
index 0000000..e3711eb
--- /dev/null
+++ b/inc/dmi_phycomp_factory.h
@@ -0,0 +1,224 @@
+/*
+ * Copyright 2021-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.
+ */
+
+
+#ifndef DMI_PHYCOMP_FACTORY_H_
+#define DMI_PHYCOMP_FACTORY_H_
+
+#include "hw_management_service.grpc.pb.h"
+#include "hw_management_service.pb.h"
+#include <iostream>
+#include <string>
+/*
+ * PhyComponent
+ * PhyComponent implement the same interface so that the classes can refer
+ * to the interface not the concrete Component
+ */
+class PhyComponent
+{
+    public:
+        dmi::Component comp;
+        uint8_t comp_number;
+
+        /*Interfaces where each subclasses implements thier specific details*/
+        virtual uint8_t UpdateComp(uint8_t comp_number) = 0;
+        virtual uint8_t SetModifiableCompFields(dmi::ModifiableComponent mod_fields) = 0;
+
+        virtual ~PhyComponent() {}
+};
+
+
+/*
+ * Concrete Component
+ * define Component to be created
+ */
+class FanComp : public PhyComponent
+{
+	public:
+  	FanComp()
+  	{
+        /*Fill the default/common parameters here*/
+		this->comp.set_class_( dmi::ComponentType::COMPONENT_TYPE_FAN);
+		this->comp.set_is_fru( 1 );
+  	}
+
+	uint8_t UpdateComp(uint8_t comp_number);
+	uint8_t SetModifiableCompFields(dmi::ModifiableComponent mod_fields);
+	~FanComp() {}
+};
+
+
+
+/*
+ * Concrete Component
+ * define Component to be created
+ */
+class DiskComp : public PhyComponent
+{
+    public:
+        DiskComp()
+        {
+            this->comp.set_class_( dmi::ComponentType::COMPONENT_TYPE_STORAGE);
+            this->comp.set_is_fru( 0 );
+        }
+
+        uint8_t UpdateComp(uint8_t comp_number);
+        uint8_t SetModifiableCompFields(dmi::ModifiableComponent mod_fields);
+        ~DiskComp() {}
+};
+
+
+/*
+ * Concrete Component
+ * define Component to be created
+ */
+class ContainerComp : public PhyComponent
+{
+    public:
+        ContainerComp()
+        {
+            this->comp.set_class_( dmi::ComponentType::COMPONENT_TYPE_CONTAINER);
+            this->comp.set_is_fru( 0 );
+            //set the container attribute
+        }
+
+        uint8_t UpdateComp(uint8_t comp_number);
+        uint8_t SetModifiableCompFields(dmi::ModifiableComponent mod_fields);
+        ~ContainerComp() {}
+};
+
+
+
+/*
+ * Concrete Component
+ * define Component to be created
+ */
+class PortComp : public PhyComponent
+{
+    public:
+        PortComp()
+        {
+            this->comp.set_class_( dmi::ComponentType::COMPONENT_TYPE_PORT );
+            this->comp.set_is_fru( 0 );
+        }
+
+        uint8_t UpdateComp(uint8_t comp_number);
+        uint8_t SetModifiableCompFields(dmi::ModifiableComponent mod_fields);
+        ~PortComp() {}
+};
+
+
+/*
+ * Concrete Component
+ * define Component to be created
+ */
+class CPUComp : public PhyComponent
+{
+    public:
+        CPUComp()
+        {
+            this->comp.set_class_( dmi::ComponentType::COMPONENT_TYPE_CPU );
+            this->comp.set_is_fru( 0 );
+        }
+
+        uint8_t UpdateComp(uint8_t comp_number);
+        uint8_t SetModifiableCompFields(dmi::ModifiableComponent mod_fields);
+        ~CPUComp() {}
+};
+
+/*
+ * Concrete Component
+ * define Component to be created
+ */
+class TransceiverComp : public PhyComponent
+{
+    public:
+        TransceiverComp()
+        {
+            this->comp.set_class_( dmi::ComponentType::COMPONENT_TYPE_TRANSCEIVER );
+            this->comp.set_is_fru ( 1 );
+        }
+
+        uint8_t UpdateComp(uint8_t comp_number);
+        uint8_t SetModifiableCompFields(dmi::ModifiableComponent mod_fields);
+        ~TransceiverComp() {}
+};
+
+
+/*
+ * Creator
+ * contains the implementation for all of the methods
+ * to manipulate products except for the factory method
+ */
+class Creator
+{
+    public:
+
+        virtual PhyComponent* CreateFanCompInst()         = 0;
+        virtual PhyComponent* CreateDiskCompInst()        = 0;
+        virtual PhyComponent* CreateContainerCompInst()   = 0;
+        virtual PhyComponent* CreatePortCompInst()        = 0;
+        virtual PhyComponent* CreateCPUCompInst()         = 0;
+        virtual PhyComponent* CreateTransceiverCompInst() = 0;
+        virtual void removeComponent( PhyComponent *comp ) = 0;
+        virtual ~Creator() {}
+};
+
+/*
+ * Concrete Creator
+ * implements factory method that is responsible for creating
+ * one or more concrete products ie. it is class that has
+ * the knowledge of how to create the products
+ */
+class ConcreteComp : public Creator
+{
+    public:
+        ~ConcreteComp() {}
+
+        PhyComponent* CreateFanCompInst()
+        {
+            return new FanComp();
+        }
+
+        PhyComponent* CreateDiskCompInst()
+        {
+            return new DiskComp();
+        }
+
+        PhyComponent* CreateContainerCompInst()
+        {
+            return new ContainerComp();
+        }
+
+        PhyComponent* CreatePortCompInst()
+        {
+            return new PortComp();
+        }
+
+        PhyComponent* CreateCPUCompInst()
+        {
+            return new CPUComp();
+        }
+
+        PhyComponent* CreateTransceiverCompInst()
+        {
+            return new TransceiverComp();
+        }
+
+        void removeComponent( PhyComponent *comp )
+        {
+            delete comp;
+        }
+};
+#endif
+
diff --git a/inc/dmi_server.h b/inc/dmi_server.h
new file mode 100644
index 0000000..5e79bb0
--- /dev/null
+++ b/inc/dmi_server.h
@@ -0,0 +1,21 @@
+ /*
+ * Copyright 2021-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.
+ */
+
+
+#ifndef DMI_SERVER_H_
+#define DMI_SERVER_H_
+
+extern void RunGrpcServer();
+
+#endif
+
diff --git a/inc/dmi_sw_mgmt.h b/inc/dmi_sw_mgmt.h
new file mode 100644
index 0000000..b699157
--- /dev/null
+++ b/inc/dmi_sw_mgmt.h
@@ -0,0 +1,96 @@
+ /*
+ * Copyright 2021-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.
+ */
+
+#ifndef DMI_SW_MGMT_H_
+#define DMI_SW_MGMT_H_
+
+#include "sw_management_service.grpc.pb.h"
+#include "sw_management_service.pb.h"
+#include "dmi_common.h"
+
+using grpc::ServerWriter;
+
+grpc::Status GetSoftwareVersion_(const dmi::HardwareID* request,
+             dmi::GetSoftwareVersionInformationResponse* response);
+
+class SWMgmtService final : public dmi::NativeSoftwareManagementService::Service
+{
+    public:
+        static SWMgmtService& getSWInstance()
+        {
+            static SWMgmtService swinstance;
+            return swinstance;
+        }
+
+        grpc::Status GetSoftwareVersion(
+                ServerContext* context,
+                const dmi::HardwareID* request,
+                dmi::GetSoftwareVersionInformationResponse* response )
+        {
+            return GetSoftwareVersion_(request, response);
+        }
+
+        grpc::Status DownloadImage(
+                ServerContext* context,
+                const dmi::DownloadImageRequest* request,
+                ServerWriter<dmi::ImageStatus>* writer )
+        {
+            //TODO write an internal API to handle the request
+            return Status(grpc::StatusCode::UNIMPLEMENTED, "RPC not implemented");
+        }
+
+        grpc::Status ActivateImage(
+                ServerContext* context,
+                const dmi::HardwareID* request,
+                ServerWriter<dmi::ImageStatus>* writer )
+        {
+            //TODO write an internal API to handle the request
+            return Status(grpc::StatusCode::UNIMPLEMENTED, "RPC not implemented");
+        }
+
+        grpc::Status RevertToStandbyImage(
+                ServerContext* context,
+                const dmi::HardwareID* request,
+                ServerWriter<dmi::ImageStatus>* writer )
+        {
+            //TODO write an internal API to handle the request
+            return Status(grpc::StatusCode::UNIMPLEMENTED, "RPC not implemented");
+        }
+
+        grpc::Status UpdateStartupConfiguration(
+                ServerContext* context,
+                const dmi::ConfigRequest* request,
+                ServerWriter<dmi::ConfigResponse>* writer )
+        {
+            //TODO write an internal API to handle the request
+            return Status(grpc::StatusCode::UNIMPLEMENTED, "RPC not implemented");
+        }
+
+        grpc::Status GetStartupConfigurationInfo(
+                ServerContext* context,
+                const dmi::StartupConfigInfoRequest* request,
+                dmi::StartupConfigInfoResponse* response )
+        {
+            //TODO write an internal API to handle the request
+            return Status(grpc::StatusCode::UNIMPLEMENTED, "RPC not implemented");
+        }
+    private:
+        SWMgmtService()
+        {
+        }
+
+        ~SWMgmtService()
+        {
+        }
+};
+#endif
diff --git a/inc/dmi_utils.h b/inc/dmi_utils.h
new file mode 100644
index 0000000..e806ca9
--- /dev/null
+++ b/inc/dmi_utils.h
@@ -0,0 +1,12 @@
+ /*
+ * Copyright 2021-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.
+ */
