diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go
index f2b4c300e45211c84e97cc98e4a6eacfccefe171..8d0990e0682e8cb4a33a0300d1865592ccf34757 100644
--- a/pkg/chartutil/create.go
+++ b/pkg/chartutil/create.go
@@ -48,7 +48,23 @@ const defaultIgnore = `# Patterns to ignore when building packages.
 # This supports shell glob matching, relative path matching, and
 # negation (prefixed with !). Only one pattern per line.
 .DS_Store
-.git
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
 `
 
 // Create creates a new chart in a directory.
diff --git a/pkg/chartutil/load.go b/pkg/chartutil/load.go
index 296b11231c2cfcecc423e89f31534a078e0220be..911d883d2cf715796ebfa530a57d9eb96a3646fb 100644
--- a/pkg/chartutil/load.go
+++ b/pkg/chartutil/load.go
@@ -218,6 +218,11 @@ func LoadDir(dir string) (*chart.Chart, error) {
 			return err
 		}
 		if fi.IsDir() {
+			// Directory-based ignore rules should involve skipping the entire
+			// contents of that directory.
+			if rules.Ignore(n, fi) {
+				return filepath.SkipDir
+			}
 			return nil
 		}
 
diff --git a/pkg/chartutil/load_test.go b/pkg/chartutil/load_test.go
index fa94acbc339c0ebc9756ed91a5e4055332a719f5..822e8d0783db554301d39f81e9ced6315c5c8252 100644
--- a/pkg/chartutil/load_test.go
+++ b/pkg/chartutil/load_test.go
@@ -49,8 +49,9 @@ func verifyChart(t *testing.T, c *chart.Chart) {
 		t.Errorf("Expected 1 template, got %d", len(c.Templates))
 	}
 
-	if len(c.Files) != 5 {
-		t.Errorf("Expected 5 extra files, got %d", len(c.Files))
+	numfiles := 6
+	if len(c.Files) != numfiles {
+		t.Errorf("Expected %d extra files, got %d", numfiles, len(c.Files))
 		for _, n := range c.Files {
 			t.Logf("\t%s", n.TypeUrl)
 		}
diff --git a/pkg/chartutil/testdata/frobnitz-1.2.3.tgz b/pkg/chartutil/testdata/frobnitz-1.2.3.tgz
index 31c855223046ed3bba9abb2a7ca707195ad6daa4..50d1ef01484094a445c867e612e363f4f527d604 100644
Binary files a/pkg/chartutil/testdata/frobnitz-1.2.3.tgz and b/pkg/chartutil/testdata/frobnitz-1.2.3.tgz differ
diff --git a/pkg/chartutil/testdata/frobnitz/.helmignore b/pkg/chartutil/testdata/frobnitz/.helmignore
new file mode 100644
index 0000000000000000000000000000000000000000..9973a57b8035d98658162558e488aa24f7d8fa15
--- /dev/null
+++ b/pkg/chartutil/testdata/frobnitz/.helmignore
@@ -0,0 +1 @@
+ignore/
diff --git a/pkg/chartutil/testdata/frobnitz/charts/mariner-4.3.2.tgz b/pkg/chartutil/testdata/frobnitz/charts/mariner-4.3.2.tgz
index 90c7979afe88fb36ef00f6fe09041217b874323f..27bd51f654f64fa50e431c35bd69c9e7d509a5c1 100644
Binary files a/pkg/chartutil/testdata/frobnitz/charts/mariner-4.3.2.tgz and b/pkg/chartutil/testdata/frobnitz/charts/mariner-4.3.2.tgz differ
diff --git a/pkg/chartutil/testdata/frobnitz/ignore/me.txt b/pkg/chartutil/testdata/frobnitz/ignore/me.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/pkg/chartutil/testdata/genfrob.sh b/pkg/chartutil/testdata/genfrob.sh
index 38fc1b22c959826615ed5f6e244465a540d7b6d5..8f2cddec1a4da9ed6610f5d033d1835d5aaf9e13 100755
--- a/pkg/chartutil/testdata/genfrob.sh
+++ b/pkg/chartutil/testdata/genfrob.sh
@@ -9,4 +9,4 @@ tar -zcvf frobnitz/charts/mariner-4.3.2.tgz mariner
 
 # Pack the frobnitz chart.
 echo "Packing frobnitz"
-tar -zcvf frobnitz-1.2.3.tgz frobnitz
+tar --exclude=ignore/* -zcvf frobnitz-1.2.3.tgz frobnitz
diff --git a/pkg/chartutil/testdata/mariner/charts/albatross-0.1.0.tgz b/pkg/chartutil/testdata/mariner/charts/albatross-0.1.0.tgz
index 3d5b6a2420ffcdf46d8f9de74f056c4d7e47bb9e..c35e1b9701734924198f1739129a9563f75ba7cd 100644
Binary files a/pkg/chartutil/testdata/mariner/charts/albatross-0.1.0.tgz and b/pkg/chartutil/testdata/mariner/charts/albatross-0.1.0.tgz differ
diff --git a/pkg/ignore/rules.go b/pkg/ignore/rules.go
index 0251268baf899ad974821c409590e4d3385b80aa..f5b08a4eebeff7d4fd7c494175c44de06bcfa831 100644
--- a/pkg/ignore/rules.go
+++ b/pkg/ignore/rules.go
@@ -65,7 +65,6 @@ func Parse(file io.Reader) (*Rules, error) {
 	if err := s.Err(); err != nil {
 		return r, err
 	}
-
 	return r, nil
 }
 
@@ -97,8 +96,10 @@ func (r *Rules) Ignore(path string, fi os.FileInfo) bool {
 			continue
 		}
 
+		// If the rule is looking for directories, and this is not a directory,
+		// skip it.
 		if p.mustDir && !fi.IsDir() {
-			return false
+			continue
 		}
 		if p.match(path, fi) {
 			return true