diff --git a/Dockerfile b/Dockerfile
index b621ec90edbce589ae82b51946b1da2cf2a88086..8f44a426deeb6b7e664fca4bcfb0a967a9fe9960 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -8,6 +8,8 @@ ENV GOPATH /srv/
 ENV SERVER_OUT "bin/server"
 ENV SERVER_PKG_BUILD ${PKG}
 
+ENV PATH "$PATH:/srv/bin/"
+
 ARG CI_JOB_TOKEN
 ARG CI_PROJECT_NAME
 ARG CI_COMMIT_REF_NAME
@@ -24,6 +26,8 @@ RUN cd /srv/src/code.vereign.com/code/$CI_PROJECT_NAME && \
     git config --global credential.helper "store --file /tmp/store" && \
     echo https://gitlab-ci-token:$CI_JOB_TOKEN@code.vereign.com > /tmp/store && cat /tmp/store && \
 	export PKG=code.vereign.com/code/$CI_PROJECT_NAME && \
+    go get -u github.com/ugorji/go/codec/codecgen && \
+	echo PATH $PATH && \
 	make && rm /tmp/store 
 
 #FROM debian:stretch 
diff --git a/Makefile b/Makefile
index d005b54a8455bc6c484a39014cb90c0ef6aefe8f..d3f20a2a11aba46c61c20b622d24adfffa4f6d06 100644
--- a/Makefile
+++ b/Makefile
@@ -11,6 +11,7 @@ all: server
 dep: ## Get the dependencies
 	dep ensure
 server: dep ## Build the binary file for server
+	go generate vendor/github.com/coreos/etcd/client/keys.go
 	@go build -ldflags="-X code.vereign.com/code/key-storage-agent/handler.version=$(VER)" -i -v -o $(SERVER_OUT) $(SERVER_PKG_BUILD)
 
 clean: ## Remove previous builds
diff --git a/config/configs.go b/config/configs.go
index a2d37733bf31f40b6cdd895593b3cb2f54abacb1..c2df7c35160cbd61d25abbc917f28f9465de1743 100644
--- a/config/configs.go
+++ b/config/configs.go
@@ -2,11 +2,16 @@ package config
 
 import (
 	"log"
+	"os"
+	"path/filepath"
+	"strings"
 
 	"code.vereign.com/code/viam-apis/authentication"
 	"github.com/spf13/viper"
 )
 
+import _ "github.com/spf13/viper/remote"
+
 var SystemAuth = &authentication.Authentication{
 	Uuid:    "undefined",
 	Session: "undefined",
@@ -27,7 +32,7 @@ var RestListenAddress string
 var DataStorageUrl string
 var CertDir string
 
-func SetConfigValues() {
+func SetConfigValues(configFile, etcdURL string) {
 	// Set Default Values For Config Variables
 
 	// Vereign API Related
@@ -66,10 +71,22 @@ func SetConfigValues() {
 	*/
 
 	// Read Config File
-	viper.SetConfigName("config")
-	viper.AddConfigPath(".")
-	if err := viper.ReadInConfig(); err != nil {
-		log.Printf("can't read config: %s, will use default values", err)
+	if configFile != "" {
+		configName := strings.Split(filepath.Base(configFile), ".")[0]
+		configDir := filepath.Dir(configFile)
+		viper.SetConfigName(configName)
+		viper.AddConfigPath(configDir)
+		if err := viper.ReadInConfig(); err != nil {
+			log.Printf("can't read config: %v, will use default values", err)
+		}
+	} else {
+		log.Printf("requesting config at "+etcdURL, "/"+os.Getenv("ENV_NAME")+"/"+os.Getenv("CI_PROJECT_NAME")+".json")
+		viper.AddRemoteProvider("etcd", etcdURL, "/"+os.Getenv("ENV_NAME")+"/"+os.Getenv("CI_PROJECT_NAME")+".json")
+		viper.SetConfigType("json")
+
+		if err := viper.ReadRemoteConfig(); err != nil {
+			log.Printf("can't read config: %v, will use default values", err)
+		}
 	}
 
 	CertificationMethod = viper.GetString("certificationMethod")
diff --git a/main.go b/main.go
index ff6754ee7753081f4d0ddcd9a86c2502743b99fe..64819c2ccf74c45e737c6fc38fe825a582a027ce 100644
--- a/main.go
+++ b/main.go
@@ -18,6 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
 package main
 
 import (
+	"flag"
 	"log"
 
 	"code.vereign.com/code/key-storage-agent/config"
@@ -26,7 +27,16 @@ import (
 
 // main start a gRPC server and waits for connection
 func main() {
-	config.SetConfigValues()
+	configFile := flag.String("config-file", "", "path to configuration file")
+	etcdURL := flag.String("etcd-url", "", "etcd URL")
+	flag.Parse()
+
+	if *configFile == "" && *etcdURL == "" {
+		log.Fatalln("Config file path or etcd URL not specified")
+		return
+	}
+
+	config.SetConfigValues(*configFile, *etcdURL)
 
 	grpcAddress := config.GrpcListenAddress
 	restAddress := config.RestListenAddress