diff --git a/main.go b/main.go
index 22d7d41..befe90e 100644
--- a/main.go
+++ b/main.go
@@ -110,8 +110,11 @@
 	return writeResponse(w, status, errorTemplate, http.StatusText(status))
 }
 
+const version = 1
+
 type storePackage struct {
-	Data []byte
+	Data    []byte
+	Version int
 }
 
 type lintPackage struct {
@@ -129,9 +132,10 @@
 }
 
 type lintProblem struct {
-	Line     int
-	Text     string
-	LineText string
+	Line       int
+	Text       string
+	LineText   string
+	Confidence float64
 }
 
 func putPackage(c appengine.Context, importPath string, pkg *lintPackage) error {
@@ -141,15 +145,21 @@
 	}
 	_, err := datastore.Put(c,
 		datastore.NewKey(c, "Pacakge", importPath, 0, nil),
-		&storePackage{Data: buf.Bytes()})
+		&storePackage{Data: buf.Bytes(), Version: version})
 	return err
 }
 
 func getPackage(c appengine.Context, importPath string) (*lintPackage, error) {
 	var spkg storePackage
 	if err := datastore.Get(c, datastore.NewKey(c, "Pacakge", importPath, 0, nil), &spkg); err != nil {
+		if err == datastore.ErrNoSuchEntity {
+			err = nil
+		}
 		return nil, err
 	}
+	if spkg.Version != version {
+		return nil, nil
+	}
 	var pkg lintPackage
 	if err := gob.NewDecoder(bytes.NewReader(spkg.Data)).Decode(&pkg); err != nil {
 		return nil, err
@@ -184,9 +194,10 @@
 		} else {
 			for _, p := range problems {
 				file.Problems = append(file.Problems, &lintProblem{
-					Line:     p.Position.Line,
-					Text:     p.Text,
-					LineText: p.LineText,
+					Line:       p.Position.Line,
+					Text:       p.Text,
+					LineText:   p.LineText,
+					Confidence: p.Confidence,
 				})
 			}
 		}
@@ -202,6 +213,23 @@
 	return &pkg, nil
 }
 
+func filterByConfidence(r *http.Request, pkg *lintPackage) {
+	minConfidence, err := strconv.ParseFloat(r.FormValue("minConfidence"), 64)
+	if err != nil {
+		minConfidence = 0.8
+	}
+	for _, f := range pkg.Files {
+		j := 0
+		for i := range f.Problems {
+			if f.Problems[i].Confidence >= minConfidence {
+				f.Problems[j] = f.Problems[i]
+				j += 1
+			}
+		}
+		f.Problems = f.Problems[:j]
+	}
+}
+
 var setupOnce sync.Once
 
 func setup(r *http.Request) {
@@ -242,12 +270,13 @@
 		}
 		c := appengine.NewContext(r)
 		pkg, err := getPackage(c, importPath)
-		if err == datastore.ErrNoSuchEntity {
+		if pkg == nil && err == nil {
 			pkg, err = runLint(c, importPath)
 		}
 		if err != nil {
 			return err
 		}
+		filterByConfidence(r, pkg)
 		return writeResponse(w, 200, packageTemplate, pkg)
 	}
 }
