diff --git a/cmd/helm/repo_index.go b/cmd/helm/repo_index.go
index 1a681c6f93cba5b92cbe28f506dacc9264af0aff..ad5808946536902b3f7314209586e87907a7a327 100644
--- a/cmd/helm/repo_index.go
+++ b/cmd/helm/repo_index.go
@@ -94,5 +94,6 @@ func index(dir, url, mergeTo string) error {
 		}
 		i.Merge(i2)
 	}
+	i.SortEntries()
 	return i.WriteFile(out, 0755)
 }
diff --git a/cmd/helm/repo_index_test.go b/cmd/helm/repo_index_test.go
index ee00d546dab689054219cc7810887091a339011b..4f2a69eecf2d4b6c5c6d9d0a84b1c219b55ef5de 100644
--- a/cmd/helm/repo_index_test.go
+++ b/cmd/helm/repo_index_test.go
@@ -38,6 +38,10 @@ func TestRepoIndexCmd(t *testing.T) {
 	if err := os.Link("testdata/testcharts/compressedchart-0.1.0.tgz", comp); err != nil {
 		t.Fatal(err)
 	}
+	comp2 := filepath.Join(dir, "compressedchart-0.2.0.tgz")
+	if err := os.Link("testdata/testcharts/compressedchart-0.2.0.tgz", comp2); err != nil {
+		t.Fatal(err)
+	}
 
 	buf := bytes.NewBuffer(nil)
 	c := newRepoIndexCmd(buf)
@@ -57,16 +61,32 @@ func TestRepoIndexCmd(t *testing.T) {
 		t.Errorf("expected 1 entry, got %d: %#v", len(index.Entries), index.Entries)
 	}
 
+	vs := index.Entries["compressedchart"]
+	if len(vs) != 2 {
+		t.Errorf("expected 2 versions, got %d: %#v", len(vs), vs)
+	}
+
+	expectedVersion := "0.2.0"
+	if vs[0].Version != expectedVersion {
+		t.Errorf("expected %q, got %q", expectedVersion, vs[0].Version)
+	}
+
 	// Test with `--merge`
 
-	// Remove first chart.
+	// Remove first two charts.
 	if err := os.Remove(comp); err != nil {
 		t.Fatal(err)
 	}
-	// Add another chart.
+	if err := os.Remove(comp2); err != nil {
+		t.Fatal(err)
+	}
+	// Add a new chart and a new version of an existing chart
 	if err := os.Link("testdata/testcharts/reqtest-0.1.0.tgz", filepath.Join(dir, "reqtest-0.1.0.tgz")); err != nil {
 		t.Fatal(err)
 	}
+	if err := os.Link("testdata/testcharts/compressedchart-0.3.0.tgz", filepath.Join(dir, "compressedchart-0.3.0.tgz")); err != nil {
+		t.Fatal(err)
+	}
 
 	c.ParseFlags([]string{"--merge", destIndex})
 	if err := c.RunE(c, []string{dir}); err != nil {
@@ -79,6 +99,16 @@ func TestRepoIndexCmd(t *testing.T) {
 	}
 
 	if len(index.Entries) != 2 {
-		t.Errorf("expected 2 entry, got %d: %#v", len(index.Entries), index.Entries)
+		t.Errorf("expected 2 entries, got %d: %#v", len(index.Entries), index.Entries)
+	}
+
+	vs = index.Entries["compressedchart"]
+	if len(vs) != 3 {
+		t.Errorf("expected 3 versions, got %d: %#v", len(vs), vs)
+	}
+
+	expectedVersion = "0.3.0"
+	if vs[0].Version != expectedVersion {
+		t.Errorf("expected %q, got %q", expectedVersion, vs[0].Version)
 	}
 }
diff --git a/cmd/helm/testdata/testcharts/compressedchart-0.2.0.tgz b/cmd/helm/testdata/testcharts/compressedchart-0.2.0.tgz
new file mode 100644
index 0000000000000000000000000000000000000000..ba96a80c9c54db1f77a16b45623a9dd6ce816d76
Binary files /dev/null and b/cmd/helm/testdata/testcharts/compressedchart-0.2.0.tgz differ
diff --git a/cmd/helm/testdata/testcharts/compressedchart-0.3.0.tgz b/cmd/helm/testdata/testcharts/compressedchart-0.3.0.tgz
new file mode 100644
index 0000000000000000000000000000000000000000..89776bfa80fd8e37cb819073ce30792fbcb28fe3
Binary files /dev/null and b/cmd/helm/testdata/testcharts/compressedchart-0.3.0.tgz differ
diff --git a/pkg/repo/index.go b/pkg/repo/index.go
index 2b066d47cf50266f7b29f5dba510052939ca392c..f8c27f004520469c72bc5a417546901a018f200f 100644
--- a/pkg/repo/index.go
+++ b/pkg/repo/index.go
@@ -95,6 +95,7 @@ func NewIndexFile() *IndexFile {
 }
 
 // Add adds a file to the index
+// This can leave the index in an unsorted state
 func (i IndexFile) Add(md *chart.Metadata, filename, baseURL, digest string) {
 	u := filename
 	if baseURL != "" {
@@ -176,6 +177,8 @@ func (i IndexFile) WriteFile(dest string, mode os.FileMode) error {
 //
 // If one of the entries in the given index does _not_ already exist, it is added.
 // In all other cases, the existing record is preserved.
+//
+// This can leave the index in an unsorted state
 func (i *IndexFile) Merge(f *IndexFile) {
 	for _, cvs := range f.Entries {
 		for _, cv := range cvs {
@@ -202,7 +205,7 @@ type ChartVersion struct {
 //
 // It indexes only charts that have been packaged (*.tgz).
 //
-// It writes the results to dir/index.yaml.
+// The index returned will be in an unsorted state
 func IndexDirectory(dir, baseURL string) (*IndexFile, error) {
 	archives, err := filepath.Glob(filepath.Join(dir, "*.tgz"))
 	if err != nil {
diff --git a/pkg/repo/index_test.go b/pkg/repo/index_test.go
index 6e61b4dc25106ea704b5adf3ea2a3a0ad3cbabb3..f976012c302e6b5999b833e1892b27d579979383 100644
--- a/pkg/repo/index_test.go
+++ b/pkg/repo/index_test.go
@@ -197,12 +197,12 @@ func verifyLocalIndex(t *testing.T, i *IndexFile) {
 			Metadata: &chart.Metadata{
 				Name:        "nginx",
 				Description: "string",
-				Version:     "0.1.0",
+				Version:     "0.2.0",
 				Keywords:    []string{"popular", "web server", "proxy"},
-				Home:        "https://github.com/something",
+				Home:        "https://github.com/something/else",
 			},
 			URLs: []string{
-				"http://storage.googleapis.com/kubernetes-charts/nginx-0.1.0.tgz",
+				"http://storage.googleapis.com/kubernetes-charts/nginx-0.2.0.tgz",
 			},
 			Digest: "sha256:1234567890abcdef",
 		},
@@ -210,12 +210,12 @@ func verifyLocalIndex(t *testing.T, i *IndexFile) {
 			Metadata: &chart.Metadata{
 				Name:        "nginx",
 				Description: "string",
-				Version:     "0.2.0",
+				Version:     "0.1.0",
 				Keywords:    []string{"popular", "web server", "proxy"},
-				Home:        "https://github.com/something/else",
+				Home:        "https://github.com/something",
 			},
 			URLs: []string{
-				"http://storage.googleapis.com/kubernetes-charts/nginx-0.2.0.tgz",
+				"http://storage.googleapis.com/kubernetes-charts/nginx-0.1.0.tgz",
 			},
 			Digest: "sha256:1234567890abcdef",
 		},
diff --git a/pkg/repo/repo_test.go b/pkg/repo/repo_test.go
index 0f4589dba3e8c4f474a4c5d7e37c14291aa4b48e..704c3fe3dfe22d105f67800df1726a6bc5251bc4 100644
--- a/pkg/repo/repo_test.go
+++ b/pkg/repo/repo_test.go
@@ -133,7 +133,7 @@ func TestLoadChartRepository(t *testing.T) {
 		t.Errorf("Problem loading chart repository from %s: %v", testRepository, err)
 	}
 
-	paths := []string{filepath.Join(testRepository, "frobnitz-1.2.3.tgz"), filepath.Join(testRepository, "sprocket-1.2.0.tgz")}
+	paths := []string{filepath.Join(testRepository, "frobnitz-1.2.3.tgz"), filepath.Join(testRepository, "sprocket-1.1.0.tgz"), filepath.Join(testRepository, "sprocket-1.2.0.tgz")}
 
 	if cr.RootPath != testRepository {
 		t.Errorf("Expected %s as RootPath but got %s", testRepository, cr.RootPath)
@@ -211,6 +211,12 @@ func verifyIndex(t *testing.T, actual *IndexFile) {
 					Version: "1.2.0",
 				},
 			},
+			{
+				Metadata: &chart.Metadata{
+					Name:    "sprocket",
+					Version: "1.1.0",
+				},
+			},
 		},
 	}
 
diff --git a/pkg/repo/testdata/local-index.yaml b/pkg/repo/testdata/local-index.yaml
index ae29dfd8f55862af3518619059f0aa4edf1be807..c0682643b926a83329a3aed299daba3dc883d3b1 100644
--- a/pkg/repo/testdata/local-index.yaml
+++ b/pkg/repo/testdata/local-index.yaml
@@ -2,22 +2,22 @@ apiVersion: v1
 entries:
   nginx:
     - urls:
-        - http://storage.googleapis.com/kubernetes-charts/nginx-0.1.0.tgz
+        - http://storage.googleapis.com/kubernetes-charts/nginx-0.2.0.tgz
       name: nginx
       description: string
-      version: 0.1.0
-      home: https://github.com/something
+      version: 0.2.0
+      home: https://github.com/something/else
       digest: "sha256:1234567890abcdef"
       keywords:
         - popular
         - web server
         - proxy
     - urls:
-        - http://storage.googleapis.com/kubernetes-charts/nginx-0.2.0.tgz
+        - http://storage.googleapis.com/kubernetes-charts/nginx-0.1.0.tgz
       name: nginx
       description: string
-      version: 0.2.0
-      home: https://github.com/something/else
+      version: 0.1.0
+      home: https://github.com/something
       digest: "sha256:1234567890abcdef"
       keywords:
         - popular
diff --git a/pkg/repo/testdata/repository/sprocket-1.1.0.tgz b/pkg/repo/testdata/repository/sprocket-1.1.0.tgz
new file mode 100644
index 0000000000000000000000000000000000000000..595e9cc0397068b278d521615b97ae3319eb3623
Binary files /dev/null and b/pkg/repo/testdata/repository/sprocket-1.1.0.tgz differ