diff --git a/config/config.go b/config/config.go
index 4f30e65..7eaaeb6 100644
--- a/config/config.go
+++ b/config/config.go
@@ -1,143 +1,143 @@
-/*
- * 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 config
-
-import (
-    "flag"
-    "fmt"
-    "github.com/opencord/voltha-go/common/log"
-    "os"
-)
-
-// Open OLT default constants
-const (
-    EtcdStoreName            = "etcd"
-    default_InstanceID       = "openOlt001"
-    default_KafkaAdapterHost = "127.0.0.1"
-    default_KafkaAdapterPort = 9092
-    default_KafkaClusterHost = "127.0.0.1"
-    default_KafkaClusterPort = 9094
-    default_KVStoreType      = EtcdStoreName
-    default_KVStoreTimeout   = 5 //in seconds
-    default_KVStoreHost      = "127.0.0.1"
-    default_KVStorePort      = 2379 // Consul = 8500; Etcd = 2379
-    default_LogLevel         = 0
-    default_Banner           = false
-    default_Topic            = "openolt"
-    default_CoreTopic        = "rwcore"
-    default_OnuNumber        = 1
-)
-
-// AdapterFlags represents the set of configurations used by the read-write adaptercore service
-type AdapterFlags struct {
-    // Command line parameters
-    InstanceID       string
-    KafkaAdapterHost string
-    KafkaAdapterPort int
-    KafkaClusterHost string
-    KafkaClusterPort int
-    KVStoreType      string
-    KVStoreTimeout   int // in seconds
-    KVStoreHost      string
-    KVStorePort      int
-    Topic            string
-    CoreTopic        string
-    LogLevel         int
-    OnuNumber        int
-    Banner           bool
-}
-
-func init() {
-    log.AddPackage(log.JSON, log.WarnLevel, nil)
-}
-
-// NewRWCoreFlags returns a new RWCore config
-func NewAdapterFlags() *AdapterFlags {
-    var adapterFlags = AdapterFlags{ // Default values
-        InstanceID:       default_InstanceID,
-        KafkaAdapterHost: default_KafkaAdapterHost,
-        KafkaAdapterPort: default_KafkaAdapterPort,
-        KafkaClusterHost: default_KafkaClusterHost,
-        KafkaClusterPort: default_KafkaClusterPort,
-        KVStoreType:      default_KVStoreType,
-        KVStoreTimeout:   default_KVStoreTimeout,
-        KVStoreHost:      default_KVStoreHost,
-        KVStorePort:      default_KVStorePort,
-        Topic:            default_Topic,
-        CoreTopic:        default_CoreTopic,
-        LogLevel:         default_LogLevel,
-        OnuNumber:        default_OnuNumber,
-        Banner:           default_Banner,
-    }
-    return &adapterFlags
-}
-
-// ParseCommandArguments parses the arguments when running read-write adaptercore service
-func (so *AdapterFlags) ParseCommandArguments() {
-
-    var help string
-
-    help = fmt.Sprintf("Kafka - Adapter messaging host")
-    flag.StringVar(&(so.KafkaAdapterHost), "kafka_adapter_host", default_KafkaAdapterHost, help)
-
-    help = fmt.Sprintf("Kafka - Adapter messaging port")
-    flag.IntVar(&(so.KafkaAdapterPort), "kafka_adapter_port", default_KafkaAdapterPort, help)
-
-    help = fmt.Sprintf("Kafka - Cluster messaging host")
-    flag.StringVar(&(so.KafkaClusterHost), "kafka_cluster_host", default_KafkaClusterHost, help)
-
-    help = fmt.Sprintf("Kafka - Cluster messaging port")
-    flag.IntVar(&(so.KafkaClusterPort), "kafka_cluster_port", default_KafkaClusterPort, help)
-
-    help = fmt.Sprintf("Open OLT topic")
-    flag.StringVar(&(so.Topic), "adapter_topic", default_Topic, help)
-
-    help = fmt.Sprintf("Core topic")
-    flag.StringVar(&(so.CoreTopic), "core_topic", default_CoreTopic, help)
-
-    help = fmt.Sprintf("KV store type")
-    flag.StringVar(&(so.KVStoreType), "kv_store_type", default_KVStoreType, help)
-
-    help = fmt.Sprintf("The default timeout when making a kv store request")
-    flag.IntVar(&(so.KVStoreTimeout), "kv_store_request_timeout", default_KVStoreTimeout, help)
-
-    help = fmt.Sprintf("KV store host")
-    flag.StringVar(&(so.KVStoreHost), "kv_store_host", default_KVStoreHost, help)
-
-    help = fmt.Sprintf("KV store port")
-    flag.IntVar(&(so.KVStorePort), "kv_store_port", default_KVStorePort, help)
-
-    help = fmt.Sprintf("Log level")
-    flag.IntVar(&(so.LogLevel), "log_level", default_LogLevel, help)
-
-    help = fmt.Sprintf("Number of ONUs")
-    flag.IntVar(&(so.OnuNumber), "onu_number", default_OnuNumber, help)
-
-    help = fmt.Sprintf("Show startup banner log lines")
-    flag.BoolVar(&so.Banner, "banner", default_Banner, help)
-
-    flag.Parse()
-
-    containerName := getContainerInfo()
-    if len(containerName) > 0 {
-        so.InstanceID = containerName
-    }
-
-}
-
-func getContainerInfo() string {
-    return os.Getenv("HOSTNAME")
-}
+/*
+ * 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 config
+
+import (
+	"flag"
+	"fmt"
+	"github.com/opencord/voltha-go/common/log"
+	"os"
+)
+
+// Open OLT default constants
+const (
+	EtcdStoreName            = "etcd"
+	default_InstanceID       = "openOlt001"
+	default_KafkaAdapterHost = "127.0.0.1"
+	default_KafkaAdapterPort = 9092
+	default_KafkaClusterHost = "127.0.0.1"
+	default_KafkaClusterPort = 9094
+	default_KVStoreType      = EtcdStoreName
+	default_KVStoreTimeout   = 5 //in seconds
+	default_KVStoreHost      = "127.0.0.1"
+	default_KVStorePort      = 2379 // Consul = 8500; Etcd = 2379
+	default_LogLevel         = 0
+	default_Banner           = false
+	default_Topic            = "openolt"
+	default_CoreTopic        = "rwcore"
+	default_OnuNumber        = 1
+)
+
+// AdapterFlags represents the set of configurations used by the read-write adaptercore service
+type AdapterFlags struct {
+	// Command line parameters
+	InstanceID       string
+	KafkaAdapterHost string
+	KafkaAdapterPort int
+	KafkaClusterHost string
+	KafkaClusterPort int
+	KVStoreType      string
+	KVStoreTimeout   int // in seconds
+	KVStoreHost      string
+	KVStorePort      int
+	Topic            string
+	CoreTopic        string
+	LogLevel         int
+	OnuNumber        int
+	Banner           bool
+}
+
+func init() {
+	log.AddPackage(log.JSON, log.WarnLevel, nil)
+}
+
+// NewRWCoreFlags returns a new RWCore config
+func NewAdapterFlags() *AdapterFlags {
+	var adapterFlags = AdapterFlags{ // Default values
+		InstanceID:       default_InstanceID,
+		KafkaAdapterHost: default_KafkaAdapterHost,
+		KafkaAdapterPort: default_KafkaAdapterPort,
+		KafkaClusterHost: default_KafkaClusterHost,
+		KafkaClusterPort: default_KafkaClusterPort,
+		KVStoreType:      default_KVStoreType,
+		KVStoreTimeout:   default_KVStoreTimeout,
+		KVStoreHost:      default_KVStoreHost,
+		KVStorePort:      default_KVStorePort,
+		Topic:            default_Topic,
+		CoreTopic:        default_CoreTopic,
+		LogLevel:         default_LogLevel,
+		OnuNumber:        default_OnuNumber,
+		Banner:           default_Banner,
+	}
+	return &adapterFlags
+}
+
+// ParseCommandArguments parses the arguments when running read-write adaptercore service
+func (so *AdapterFlags) ParseCommandArguments() {
+
+	var help string
+
+	help = fmt.Sprintf("Kafka - Adapter messaging host")
+	flag.StringVar(&(so.KafkaAdapterHost), "kafka_adapter_host", default_KafkaAdapterHost, help)
+
+	help = fmt.Sprintf("Kafka - Adapter messaging port")
+	flag.IntVar(&(so.KafkaAdapterPort), "kafka_adapter_port", default_KafkaAdapterPort, help)
+
+	help = fmt.Sprintf("Kafka - Cluster messaging host")
+	flag.StringVar(&(so.KafkaClusterHost), "kafka_cluster_host", default_KafkaClusterHost, help)
+
+	help = fmt.Sprintf("Kafka - Cluster messaging port")
+	flag.IntVar(&(so.KafkaClusterPort), "kafka_cluster_port", default_KafkaClusterPort, help)
+
+	help = fmt.Sprintf("Open OLT topic")
+	flag.StringVar(&(so.Topic), "adapter_topic", default_Topic, help)
+
+	help = fmt.Sprintf("Core topic")
+	flag.StringVar(&(so.CoreTopic), "core_topic", default_CoreTopic, help)
+
+	help = fmt.Sprintf("KV store type")
+	flag.StringVar(&(so.KVStoreType), "kv_store_type", default_KVStoreType, help)
+
+	help = fmt.Sprintf("The default timeout when making a kv store request")
+	flag.IntVar(&(so.KVStoreTimeout), "kv_store_request_timeout", default_KVStoreTimeout, help)
+
+	help = fmt.Sprintf("KV store host")
+	flag.StringVar(&(so.KVStoreHost), "kv_store_host", default_KVStoreHost, help)
+
+	help = fmt.Sprintf("KV store port")
+	flag.IntVar(&(so.KVStorePort), "kv_store_port", default_KVStorePort, help)
+
+	help = fmt.Sprintf("Log level")
+	flag.IntVar(&(so.LogLevel), "log_level", default_LogLevel, help)
+
+	help = fmt.Sprintf("Number of ONUs")
+	flag.IntVar(&(so.OnuNumber), "onu_number", default_OnuNumber, help)
+
+	help = fmt.Sprintf("Show startup banner log lines")
+	flag.BoolVar(&so.Banner, "banner", default_Banner, help)
+
+	flag.Parse()
+
+	containerName := getContainerInfo()
+	if len(containerName) > 0 {
+		so.InstanceID = containerName
+	}
+
+}
+
+func getContainerInfo() string {
+	return os.Getenv("HOSTNAME")
+}
