diff --git a/internal/pkg/apis/config/v3/convert.go b/internal/pkg/apis/config/v3/convert.go
new file mode 100644
index 0000000..edb6595
--- /dev/null
+++ b/internal/pkg/apis/config/v3/convert.go
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2021-present Ciena Corporation
+ *
+ * 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 (
+	"strconv"
+
+	configv1 "github.com/opencord/voltctl/internal/pkg/apis/config/v1"
+	configv2 "github.com/opencord/voltctl/internal/pkg/apis/config/v2"
+)
+
+func FromConfigV1(v1 *configv1.GlobalConfigSpec) *GlobalConfigSpec {
+	v3 := NewDefaultConfig()
+	s3 := v3.Current()
+
+	s3.Server = v1.Server
+	s3.Kafka = v1.Kafka
+	s3.KvStore = v1.KvStore
+	s3.Tls.UseTls = v1.Tls.UseTls
+	s3.Tls.CACert = v1.Tls.CACert
+	s3.Tls.Cert = v1.Tls.Cert
+	s3.Tls.Key = v1.Tls.Key
+	if v1.Tls.Verify != "" {
+		if b, err := strconv.ParseBool(v1.Tls.Verify); err == nil {
+			s3.Tls.Verify = b
+		}
+	}
+	s3.Grpc.Timeout = v1.Grpc.Timeout
+	s3.Grpc.MaxCallRecvMsgSize = v1.Grpc.MaxCallRecvMsgSize
+	s3.KvStoreConfig.Timeout = v1.KvStoreConfig.Timeout
+	s3.K8sConfig = v1.K8sConfig
+	return v3
+}
+
+func FromConfigV2(v2 *configv2.GlobalConfigSpec) *GlobalConfigSpec {
+	v3 := NewDefaultConfig()
+	s3 := v3.Current()
+
+	s3.Server = v2.Server
+	s3.Kafka = v2.Kafka
+	s3.KvStore = v2.KvStore
+	s3.Tls.UseTls = v2.Tls.UseTls
+	s3.Tls.CACert = v2.Tls.CACert
+	s3.Tls.Cert = v2.Tls.Cert
+	s3.Tls.Key = v2.Tls.Key
+	s3.Tls.Verify = v2.Tls.Verify
+	s3.Grpc.ConnectTimeout = v2.Grpc.ConnectTimeout
+	s3.Grpc.Timeout = v2.Grpc.Timeout
+	s3.Grpc.MaxCallRecvMsgSize = v2.Grpc.MaxCallRecvMsgSize
+	s3.KvStoreConfig.Timeout = v2.KvStoreConfig.Timeout
+	s3.K8sConfig = v2.K8sConfig
+	return v3
+}
diff --git a/internal/pkg/apis/config/v3/defaults.go b/internal/pkg/apis/config/v3/defaults.go
new file mode 100644
index 0000000..2fcdff2
--- /dev/null
+++ b/internal/pkg/apis/config/v3/defaults.go
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2021-present Ciena Corporation
+ *
+ * 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 (
+	"log"
+	"os"
+	"time"
+)
+
+func NewDefaultConfig() *GlobalConfigSpec {
+	return &GlobalConfigSpec{
+		ApiVersion:   "v3",
+		CurrentStack: "",
+		Stacks:       []*StackConfigSpec{NewDefaultStack("default")},
+	}
+}
+
+func NewDefaultStack(name string) *StackConfigSpec {
+	return &StackConfigSpec{
+		Name:    name,
+		Server:  "localhost:55555",
+		Kafka:   "localhost:9093",
+		KvStore: "localhost:2379",
+		Tls: TlsConfigSpec{
+			UseTls: false,
+			Verify: false,
+		},
+		Grpc: GrpcConfigSpec{
+			ConnectTimeout:     5 * time.Second,
+			Timeout:            5 * time.Minute,
+			MaxCallRecvMsgSize: "4MB",
+		},
+		KvStoreConfig: KvStoreConfigSpec{
+			Timeout: 5 * time.Second,
+		},
+	}
+}
+
+func (g *GlobalConfigSpec) StackByName(name string) *StackConfigSpec {
+	for _, stack := range g.Stacks {
+		if stack.Name == name {
+			return stack
+		}
+	}
+	return nil
+}
+
+func (g *GlobalConfigSpec) CurrentAsStack() *StackConfigSpec {
+	if g.CurrentStack == "" {
+		if len(g.Stacks) == 0 {
+			return nil
+		}
+		return g.Stacks[0]
+	}
+	return g.StackByName(g.CurrentStack)
+}
+
+func (g GlobalConfigSpec) Current() *StackConfigSpec {
+	stack := g.CurrentAsStack()
+	if stack == nil {
+		if len(g.Stacks) > 1 {
+			log.New(os.Stderr, "ERROR: ", 0).
+				Fatal("multiple stacks configured without current specified")
+		}
+		log.New(os.Stderr, "ERROR: ", 0).
+			Fatalf("current stack specified, '%s', does not exist as a configured stack",
+				g.CurrentStack)
+	}
+	return stack
+}
diff --git a/internal/pkg/apis/config/v3/types.go b/internal/pkg/apis/config/v3/types.go
new file mode 100644
index 0000000..9639baa
--- /dev/null
+++ b/internal/pkg/apis/config/v3/types.go
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2021-present Ciena Corporation
+ *
+ * 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 (
+	"time"
+)
+
+type GrpcConfigSpec struct {
+	ConnectTimeout     time.Duration `yaml:"connectTimeout"`
+	Timeout            time.Duration `yaml:"timeout"`
+	MaxCallRecvMsgSize string        `yaml:"maxCallRecvMsgSize"`
+}
+
+type KvStoreConfigSpec struct {
+	Timeout time.Duration `yaml:"timeout"`
+}
+
+type TlsConfigSpec struct {
+	UseTls bool   `yaml:"useTLS"`
+	CACert string `yaml:"caCert"`
+	Cert   string `yaml:"cert"`
+	Key    string `yaml:"key"`
+	Verify bool   `yaml:"verify"`
+}
+
+type StackConfigSpec struct {
+	Name          string            `yaml:"name"`
+	Server        string            `yaml:"server"`
+	Kafka         string            `yaml:"kafka"`
+	KvStore       string            `yaml:"kvstore"`
+	Tls           TlsConfigSpec     `yaml:"tls"`
+	Grpc          GrpcConfigSpec    `yaml:"grpc"`
+	KvStoreConfig KvStoreConfigSpec `yaml:"kvstoreconfig"`
+	K8sConfig     string            `yaml:"-"`
+}
+
+type GlobalConfigSpec struct {
+	ApiVersion   string             `yaml:"apiVersion"`
+	Stacks       []*StackConfigSpec `yaml:"stacks"`
+	CurrentStack string             `yaml:"currentStack"`
+}
