diff --git a/cmd/main.go b/cmd/main.go
new file mode 100644
index 0000000..d683ab4
--- /dev/null
+++ b/cmd/main.go
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2020-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 main holds functions for init
+package main
+
+import (
+	"context"
+
+	"github.com/opencord/opendevice-manager/pkg/config"
+	"github.com/opencord/opendevice-manager/pkg/nbi"
+
+	"github.com/opencord/opendevice-manager/pkg/db"
+	"github.com/opencord/opendevice-manager/pkg/msgbus"
+
+	"fmt"
+	"os"
+	"os/signal"
+	"syscall"
+
+	"github.com/opencord/voltha-lib-go/v4/pkg/log"
+)
+
+// logger represents the log object
+var logger log.CLogger
+
+// init function for the package
+func init() {
+	logger = config.Initlog()
+}
+
+func printBanner() {
+	fmt.Println("╔═╗╔═╗╔═╗╔╗╔  ╔╦╗╔═╗╦  ╦╦╔═╗╔═╗  ╔╦╗╔═╗╔╗╔╔═╗╔═╗╔═╗╦═╗")
+	fmt.Println("║ ║╠═╝║╣ ║║║   ║║║╣ ╚╗╔╝║║  ║╣   ║║║╠═╣║║║╠═╣║ ╦║╣ ╠╦╝")
+	fmt.Println("╚═╝╩  ╚═╝╝╚╝  ═╩╝╚═╝ ╚╝ ╩╚═╝╚═╝  ╩ ╩╩ ╩╝╚╝╩ ╩╚═╝╚═╝╩╚═")
+}
+
+func exitBanner() {
+	fmt.Println("╔═╗╦  ╔═╗╔═╗╦╔╗╔╔═╗")
+	fmt.Println("║  ║  ║ ║╚═╗║║║║║ ╦")
+	fmt.Println("╚═╝╩═╝╚═╝╚═╝╩╝╚╝╚═╝ooo")
+}
+
+func waitForExit(ctx context.Context) int {
+	signalChannel := make(chan os.Signal, 1)
+	signal.Notify(signalChannel,
+		syscall.SIGHUP,
+		syscall.SIGINT,
+		syscall.SIGTERM,
+		syscall.SIGQUIT)
+
+	s := <-signalChannel
+	switch s {
+	case syscall.SIGHUP,
+		syscall.SIGINT,
+		syscall.SIGTERM,
+		syscall.SIGQUIT:
+		logger.Infow(ctx, "closing-signal-received", log.Fields{"signal": s})
+		return 0
+	default:
+		logger.Infow(ctx, "unexpected-signal-received", log.Fields{"signal": s})
+		return 1
+	}
+}
+
+func main() {
+	printBanner()
+	coreFlags := config.NewCoreFlags()
+	coreFlags.ParseEnv()
+	core := config.NewCoreConfig()
+	ctx := config.GetNewContextFromGlobalContxt("main-service")
+	startServices(ctx, coreFlags, core)
+}
+
+func startServices(ctx context.Context, coreFlags *config.CoreFlags, core *config.Core) {
+
+	logger.Infow(ctx, "starting-core-services", log.Fields{"core-flags": coreFlags})
+
+	defer close(core.Stopped)
+
+	defer core.Cancel()
+
+	// setup kv client
+	logger.Debugw(ctx, "create-kv-client", log.Fields{"kvstore": config.KVStore})
+
+	kvClient, err := db.NewKVClient(ctx, config.KVStore, coreFlags.DbEndPoint, coreFlags.DbTimeout)
+
+	if err != nil {
+		logger.Fatal(ctx, log.Fields{"err": err})
+	}
+
+	defer db.StopKVClient(log.WithSpanFromContext(context.Background(), ctx), kvClient)
+
+	err = msgbus.InitMsgbusProducer(ctx)
+
+	if err != nil {
+		logger.Fatal(ctx, log.Fields{"err": err})
+	}
+
+	defer nbi.DeInitConnectMap(ctx)
+
+	defer msgbus.Close(ctx)
+
+	go nbi.StartGrpcServer(ctx)
+
+	defer nbi.StopGrpcServer(ctx)
+
+	waitForExit(core.Ctx)
+	exitBanner()
+}
