diff --git a/viper.go b/viper.go
index 73bc6f3..bd41301 100644
--- a/viper.go
+++ b/viper.go
@@ -36,6 +36,8 @@
 	jww "github.com/spf13/jwalterweatherman"
 	"github.com/spf13/pflag"
 	crypt "github.com/xordataexchange/crypt/config"
+
+	// log "github.com/oliveagle/seelog"
 )
 
 var v *Viper
@@ -268,6 +270,8 @@
 			v.remoteProviders = append(v.remoteProviders, rp)
 		}
 	}
+
+	// log.Info("remoteProviders", v.remoteProviders)
 	return nil
 }
 
@@ -716,6 +720,13 @@
 	return nil
 }
 
+func ReadBufConfig(buf *bytes.Buffer) error { return v.ReadBufConfig(buf) }
+func (v *Viper) ReadBufConfig(buf *bytes.Buffer) error {
+	v.config = make(map[string]interface{})
+	v.marshalReader(buf, v.config)
+	return nil
+}
+
 // Attempts to get configuration from a remote source
 // and read it in the remote configuration registry.
 func ReadRemoteConfig() error { return v.ReadRemoteConfig() }
@@ -727,6 +738,15 @@
 	return nil
 }
 
+func WatchRemoteConfig() error { return v.WatchRemoteConfig() }
+func (v *Viper) WatchRemoteConfig() error {
+	err := v.watchKeyValueConfig()
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
 // Marshall a Reader into a map
 // Should probably be an unexported function
 func marshalReader(in io.Reader, c map[string]interface{}) { v.marshalReader(in, c) }
@@ -788,6 +808,61 @@
 	return v.kvstore, err
 }
 
+// retrieve the first found remote configuration
+func (v *Viper) watchKeyValueConfig() error {
+	// log.Info("ahahahah==========================================")
+	// log.Info("remoteProviders", v.remoteProviders)
+
+	for _, rp := range v.remoteProviders {
+		val, err := v.watchRemoteConfig(rp)
+		if err != nil {
+			continue
+		}
+		v.kvstore = val
+		return nil
+	}
+	return RemoteConfigError("No Files Found")
+}
+
+func (v *Viper) watchRemoteConfig(provider *remoteProvider) (map[string]interface{}, error) {
+	// defer log.Flush()
+	// log.Info("ahahahah==========================================")
+	var cm crypt.ConfigManager
+	var err error
+
+	if provider.secretKeyring != "" {
+		kr, err := os.Open(provider.secretKeyring)
+		defer kr.Close()
+		if err != nil {
+			return nil, err
+		}
+		if provider.provider == "etcd" {
+			cm, err = crypt.NewEtcdConfigManager([]string{provider.endpoint}, kr)
+		} else {
+			cm, err = crypt.NewConsulConfigManager([]string{provider.endpoint}, kr)
+		}
+	} else {
+		if provider.provider == "etcd" {
+			cm, err = crypt.NewStandardEtcdConfigManager([]string{provider.endpoint})
+		} else {
+			cm, err = crypt.NewStandardConsulConfigManager([]string{provider.endpoint})
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	resp := <-cm.Watch(provider.path, nil)
+	// b, err := cm.Watch(provider.path, nil)
+	err = resp.Error
+	if err != nil {
+		return nil, err
+	}
+
+	reader := bytes.NewReader(resp.Value)
+	v.marshalReader(reader, v.kvstore)
+	return v.kvstore, err
+}
+
 // Return all keys regardless where they are set
 func AllKeys() []string { return v.AllKeys() }
 func (v *Viper) AllKeys() []string {
