Index: src/java/org/apache/lucene/search/FilteredQuery.java
===================================================================
--- src/java/org/apache/lucene/search/FilteredQuery.java	(revision 542270)
+++ src/java/org/apache/lucene/search/FilteredQuery.java	(working copy)
@@ -66,13 +66,20 @@
     final Weight weight = query.createWeight (searcher);
     final Similarity similarity = query.getSimilarity(searcher);
     return new Weight() {
-
+      private float value;
+        
       // pass these methods through to enclosed query's weight
-      public float getValue() { return weight.getValue(); }
-      public float sumOfSquaredWeights() throws IOException { return weight.sumOfSquaredWeights(); }
-      public void normalize (float v) { weight.normalize(v); }
+      public float getValue() { return value; }
+      public float sumOfSquaredWeights() throws IOException { 
+        return weight.sumOfSquaredWeights() * getBoost() * getBoost(); 
+      }
+      public void normalize (float v) { 
+        weight.normalize(v);
+        value = weight.getValue() * getBoost();
+      }
       public Explanation explain (IndexReader ir, int i) throws IOException {
         Explanation inner = weight.explain (ir, i);
+        inner.setValue(getBoost() * inner.getValue());
         Filter f = FilteredQuery.this.filter;
         BitSet matches = f.bits(ir);
         if (matches.get(i))
@@ -121,11 +128,13 @@
             return true;
            }
 
-          public float score() throws IOException { return scorer.score(); }
+          public float score() throws IOException { return getBoost() * scorer.score(); }
 
           // add an explanation about whether the document was filtered
           public Explanation explain (int i) throws IOException {
             Explanation exp = scorer.explain (i);
+            exp.setValue(getBoost() * exp.getValue());
+            
             if (bitset.get(i))
               exp.setDescription ("allowed by filter: "+exp.getDescription());
             else
Index: src/test/org/apache/lucene/search/TestFilteredQuery.java
===================================================================
--- src/test/org/apache/lucene/search/TestFilteredQuery.java	(revision 542270)
+++ src/test/org/apache/lucene/search/TestFilteredQuery.java	(working copy)
@@ -24,6 +24,7 @@
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.Term;
+import org.apache.lucene.search.BooleanClause.Occur;
 import org.apache.lucene.store.RAMDirectory;
 import java.util.BitSet;
 
@@ -116,8 +117,49 @@
     filteredquery = new FilteredQuery (new TermQuery (new Term ("field", "y")), filter);
     hits = searcher.search (filteredquery);
     assertEquals (0, hits.length());
-    QueryUtils.check(filteredquery,searcher);    
+    QueryUtils.check(filteredquery,searcher);
+    
+    // test boost
+    Filter f = new Filter() {
+      public BitSet bits (IndexReader reader) {
+        BitSet bitset = new BitSet(5);
+        bitset.set(0, 5);
+        return bitset;
+      }
+    };
+    
+    float boost = 2.5f;
+    BooleanQuery bq1 = new BooleanQuery();
+    TermQuery tq = new TermQuery (new Term ("field", "one"));
+    tq.setBoost(boost);
+    bq1.add(tq, Occur.MUST);
+    bq1.add(new TermQuery (new Term ("field", "five")), Occur.MUST);
+    
+    BooleanQuery bq2 = new BooleanQuery();
+    tq = new TermQuery (new Term ("field", "one"));
+    filteredquery = new FilteredQuery(tq, f);
+    filteredquery.setBoost(boost);
+    bq2.add(filteredquery, Occur.MUST);
+    bq2.add(new TermQuery (new Term ("field", "five")), Occur.MUST);
+    assertScoreEquals(bq1, bq2);
+    
+    assertEquals(boost, filteredquery.getBoost(), 0);
+    assertEquals(1.0f, tq.getBoost(), 0); // the boost value of the underlying query shouldn't have changed 
   }
+  
+  /**
+   * Tests whether the scores of the two queries are the same.
+   */
+  public void assertScoreEquals(Query q1, Query q2) throws Exception {
+    Hits hits1 = searcher.search (q1);
+    Hits hits2 = searcher.search (q2);
+      
+    assertEquals(hits1.length(), hits2.length());
+    
+    for (int i = 0; i < hits1.length(); i++) {
+      assertEquals(hits1.score(i), hits2.score(i), 0.0000001f);
+    }
+  }
 
   /**
    * This tests FilteredQuery's rewrite correctness
Index: src/test/org/apache/lucene/search/TestSimpleExplanations.java
===================================================================
--- src/test/org/apache/lucene/search/TestSimpleExplanations.java	(revision 542270)
+++ src/test/org/apache/lucene/search/TestSimpleExplanations.java	(working copy)
@@ -119,12 +119,6 @@
     q.setBoost(1000);
     qtest(q, new int[] {3});
   }
-  public void testFQ7() throws Exception {
-    Query q = new FilteredQuery(qp.parse("xx"),
-                                new ItemizedFilter(new int[] {1,3}));
-    q.setBoost(0);
-    qtest(q, new int[] {3});
-  }
 
   /* ConstantScoreQueries */
   
