ReadBufConfig
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 {