Syntax highlighting
diff --git a/README.md b/README.md
index 76e1071..23702fd 100644
--- a/README.md
+++ b/README.md
@@ -63,9 +63,11 @@
 
 Examples:
 
-	viper.SetDefault("ContentDir", "content")
-	viper.SetDefault("LayoutDir", "layouts")
-	viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})
+```go
+viper.SetDefault("ContentDir", "content")
+viper.SetDefault("LayoutDir", "layouts")
+viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})
+```
 
 ### Reading Config Files
 
@@ -74,13 +76,15 @@
 supports json, toml and yaml files. Viper can search multiple paths, but
 currently a single viper only supports a single config file.
 
-	viper.SetConfigName("config") // name of config file (without extension)
-	viper.AddConfigPath("/etc/appname/")   // path to look for the config file in
-	viper.AddConfigPath("$HOME/.appname")  // call multiple times to add many search paths
-	err := viper.ReadInConfig() // Find and read the config file
-    if err != nil { // Handle errors reading the config file
-        panic(fmt.Errorf("Fatal error config file: %s \n", err))
-    }
+```go
+viper.SetConfigName("config") // name of config file (without extension)
+viper.AddConfigPath("/etc/appname/")   // path to look for the config file in
+viper.AddConfigPath("$HOME/.appname")  // call multiple times to add many search paths
+err := viper.ReadInConfig() // Find and read the config file
+if err != nil { // Handle errors reading the config file
+	panic(fmt.Errorf("Fatal error config file: %s \n", err))
+}
+```
 
 ### Reading Config from io.Reader
 
@@ -88,7 +92,7 @@
 remote K/V store. But you are not bound to them. You can also implement your own way to
 require configuration and feed it to viper.
 
-````go
+```go
 viper.SetConfigType("yaml") // or viper.SetConfigType("YAML")
 
 // any approach to require this configuration into your program. 
@@ -110,26 +114,30 @@
 viper.ReadConfig(bytes.NewBuffer(yamlExample))
 
 viper.Get("name") // this would be "steve"
-````
+```
 
 ### Setting Overrides
 
 These could be from a command line flag, or from your own application logic.
 
-    viper.Set("Verbose", true)
-    viper.Set("LogFile", LogFile)
+```go
+viper.Set("Verbose", true)
+viper.Set("LogFile", LogFile)
+```
 
 ### Registering and Using Aliases
 
 Aliases permit a single value to be referenced by multiple keys
 
-    viper.RegisterAlias("loud", "Verbose")
+```go
+viper.RegisterAlias("loud", "Verbose")
 
-    viper.Set("verbose", true) // same result as next line
-    viper.Set("loud", true)   // same result as prior line
+viper.Set("verbose", true) // same result as next line
+viper.Set("loud", true)   // same result as prior line
 
-    viper.GetBool("loud") // true
-    viper.GetBool("verbose") // true
+viper.GetBool("loud") // true
+viper.GetBool("verbose") // true
+```
 
 ### Working with Environment Variables
 
@@ -175,13 +183,14 @@
 
 #### Env example
 
-	SetEnvPrefix("spf") // will be uppercased automatically
-	BindEnv("id")
+```go
+SetEnvPrefix("spf") // will be uppercased automatically
+BindEnv("id")
 
-	os.Setenv("SPF_ID", "13") // typically done outside of the app
+os.Setenv("SPF_ID", "13") // typically done outside of the app
 
-	id := Get("id") // 13
-
+id := Get("id") // 13
+```
 
 ### Working with Flags
 
@@ -196,9 +205,10 @@
 
 Example:
 
-    serverCmd.Flags().Int("port", 1138, "Port to run Application server on")
-    viper.BindPFlag("port", serverCmd.Flags().Lookup("port"))
-
+```go
+serverCmd.Flags().Int("port", 1138, "Port to run Application server on")
+viper.BindPFlag("port", serverCmd.Flags().Lookup("port"))
+```
 
 ### Remote Key/Value Store Support
 
@@ -222,60 +232,69 @@
 `crypt` has a command-line helper that you can use to put configurations
 in your K/V store. `crypt` defaults to etcd on http://127.0.0.1:4001.
 
-	go get github.com/xordataexchange/crypt/bin/crypt
-	crypt set -plaintext /config/hugo.json /Users/hugo/settings/config.json
+```bash
+$ go get github.com/xordataexchange/crypt/bin/crypt
+$ crypt set -plaintext /config/hugo.json /Users/hugo/settings/config.json
+```
 
 Confirm that your value was set:
 
-	crypt get -plaintext /config/hugo.json
+```bash
+$ crypt get -plaintext /config/hugo.json
+```
 
 See the `crypt` documentation for examples of how to set encrypted values, or how
 to use Consul.
 
 ### Remote Key/Value Store Example - Unencrypted
 
-	viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001","/config/hugo.json")
-	viper.SetConfigType("json") // because there is no file extension in a stream of bytes
-	err := viper.ReadRemoteConfig()
+```go
+viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001","/config/hugo.json")
+viper.SetConfigType("json") // because there is no file extension in a stream of bytes
+err := viper.ReadRemoteConfig()
+```
 
 ### Remote Key/Value Store Example - Encrypted
 
-	viper.AddSecureRemoteProvider("etcd","http://127.0.0.1:4001","/config/hugo.json","/etc/secrets/mykeyring.gpg")
-	viper.SetConfigType("json") // because there is no file extension in a stream of bytes
-	err := viper.ReadRemoteConfig()
+```go
+viper.AddSecureRemoteProvider("etcd","http://127.0.0.1:4001","/config/hugo.json","/etc/secrets/mykeyring.gpg")
+viper.SetConfigType("json") // because there is no file extension in a stream of bytes
+err := viper.ReadRemoteConfig()
+```
 
 ### Watching Changes in Etcd - Unencrypted
 
-    // alternatively, you can create a new viper instance.
-    var runtime_viper = viper.New()
+```go
+// alternatively, you can create a new viper instance.
+var runtime_viper = viper.New()
 
-    runtime_viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001", "/config/hugo.yml")
-    runtime_viper.SetConfigType("yaml") // because there is no file extension in a stream of bytes
+runtime_viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001", "/config/hugo.yml")
+runtime_viper.SetConfigType("yaml") // because there is no file extension in a stream of bytes
 
-    // read from remote config the first time.
-    err := runtime_viper.ReadRemoteConfig()
+// read from remote config the first time.
+err := runtime_viper.ReadRemoteConfig()
 
-    // marshal config
-    runtime_viper.Marshal(&runtime_conf)
+// marshal config
+runtime_viper.Marshal(&runtime_conf)
 
-    // open a goroutine to wath remote changes forever
-    go func(){
-        for {
-            time.Sleep(time.Second * 5) // delay after each request
-
-            // currenlty, only tested with etcd support
-            err := runtime_viper.WatchRemoteConfig()
-            if err != nil {
-                log.Errorf("unable to read remote config: %v", err)
-                continue
-            }
-
-            // marshal new config into our runtime config struct. you can also use channel 
-            // to implement a signal to notify the system of the changes
-            runtime_viper.Marshal(&runtime_conf)
-        }
-    }()
-
+// open a goroutine to wath remote changes forever
+go func(){
+	for {
+	    time.Sleep(time.Second * 5) // delay after each request
+	
+	    // currenlty, only tested with etcd support
+	    err := runtime_viper.WatchRemoteConfig()
+	    if err != nil {
+	        log.Errorf("unable to read remote config: %v", err)
+	        continue
+	    }
+	
+	    // marshal new config into our runtime config struct. you can also use channel 
+	    // to implement a signal to notify the system of the changes
+	    runtime_viper.Marshal(&runtime_conf)
+	}
+}()
+```
 
 ## Getting Values From Viper
 
@@ -299,18 +318,18 @@
 method has been provided.
 
 Example:
-
-    viper.GetString("logfile") // case-insensitive Setting & Getting
-    if viper.GetBool("verbose") {
-        fmt.Println("verbose enabled")
-    }
-
+```go
+viper.GetString("logfile") // case-insensitive Setting & Getting
+if viper.GetBool("verbose") {
+    fmt.Println("verbose enabled")
+}
+```
 ### Accessing nested keys
 
 The accessor methods also accept formatted paths to deeply nested keys. 
 For example, if the following JSON file is loaded:
 
-```
+```json
 {
     "host": {
         "address": "localhost",
@@ -331,7 +350,8 @@
 ```
 
 Viper can access a nested field by passing a `.` delimited path of keys:
-```
+
+```go
 GetString("datastore.metric.host") // (returns "127.0.0.1")
 ```
 
@@ -348,7 +368,7 @@
 Lastly, if there exists a key that matches the delimited key path, its value will
 be returned instead. E.g. 
 
-```
+```json
 {
     "datastore.metric.host": "0.0.0.0",
     "host": {
@@ -381,18 +401,19 @@
 
 Example:
 
-	type config struct {
-		Port int
-		Name string
-	}
+```go
+type config struct {
+	Port int
+	Name string
+}
 
-	var C config
+var C config
 
-	err := Marshal(&C)
-	if err != nil {
-		t.Fatalf("unable to decode into struct, %v", err)
-	}
-
+err := Marshal(&C)
+if err != nil {
+	t.Fatalf("unable to decode into struct, %v", err)
+}
+```
 
 ## Viper or Vipers?
 
@@ -413,13 +434,15 @@
 
 Example:
 
-    x := viper.New()
-    y := viper.New()
+```go
+x := viper.New()
+y := viper.New()
 
-	x.SetDefault("ContentDir", "content")
-	y.SetDefault("ContentDir", "foobar")
+x.SetDefault("ContentDir", "content")
+y.SetDefault("ContentDir", "foobar")
 
-    ...
+//...
+```
 
 When working with multiple vipers, it is up to the user to keep track of
 the different vipers.