diff --git a/src/mem/ruby/filters/BlockBloomFilter.cc b/src/mem/ruby/filters/BlockBloomFilter.cc
index f5f7a91..a4728b7 100644
--- a/src/mem/ruby/filters/BlockBloomFilter.cc
+++ b/src/mem/ruby/filters/BlockBloomFilter.cc
@@ -38,8 +38,8 @@
 {
     fatal_if(masksLSBs.size() != masksSizes.size(),
         "Masks haven't been properly provided");
-    fatal_if(masksLSBs.size() < 2,
-        "There must be at least two masks to XOR");
+    fatal_if(masksLSBs.size() < 1,
+        "There must be at least one mask to extract an address bitfield");
 
     for (int i = 0; i < masksLSBs.size(); i++) {
         fatal_if((masksSizes[i] > sizeBits) || (masksSizes[i] <= 0),
diff --git a/src/mem/ruby/filters/BloomFilters.py b/src/mem/ruby/filters/BloomFilters.py
index de5cd7d..4103332 100644
--- a/src/mem/ruby/filters/BloomFilters.py
+++ b/src/mem/ruby/filters/BloomFilters.py
@@ -105,10 +105,3 @@
 
     # By default match this with the number of sub-filters
     threshold = 2
-
-class NonCountingBloomFilter(AbstractBloomFilter):
-    type = 'NonCountingBloomFilter'
-    cxx_class = 'NonCountingBloomFilter'
-    cxx_header = "mem/ruby/filters/NonCountingBloomFilter.hh"
-
-    skip_bits = Param.Int(2, "Offset from block number")
diff --git a/src/mem/ruby/filters/NonCountingBloomFilter.cc b/src/mem/ruby/filters/NonCountingBloomFilter.cc
deleted file mode 100644
index 6fd39a0..0000000
--- a/src/mem/ruby/filters/NonCountingBloomFilter.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "mem/ruby/filters/NonCountingBloomFilter.hh"
-
-#include "base/bitfield.hh"
-#include "params/NonCountingBloomFilter.hh"
-
-NonCountingBloomFilter::NonCountingBloomFilter(
-    const NonCountingBloomFilterParams* p)
-    : AbstractBloomFilter(p), skipBits(p->skip_bits)
-{
-}
-
-NonCountingBloomFilter::~NonCountingBloomFilter()
-{
-}
-
-void
-NonCountingBloomFilter::merge(const AbstractBloomFilter *other)
-{
-    auto* cast_other = static_cast<const NonCountingBloomFilter*>(other);
-    assert(filter.size() == cast_other->filter.size());
-    for (int i = 0; i < filter.size(); ++i){
-        filter[i] |= cast_other->filter[i];
-    }
-}
-
-void
-NonCountingBloomFilter::set(Addr addr)
-{
-    filter[hash(addr)] = 1;
-}
-
-void
-NonCountingBloomFilter::unset(Addr addr)
-{
-    filter[hash(addr)] = 0;
-}
-
-int
-NonCountingBloomFilter::getCount(Addr addr) const
-{
-    return filter[hash(addr)];
-}
-
-int
-NonCountingBloomFilter::hash(Addr addr) const
-{
-    return bits(addr, offsetBits + skipBits + sizeBits - 1, offsetBits + skipBits);
-}
-
-NonCountingBloomFilter*
-NonCountingBloomFilterParams::create()
-{
-    return new NonCountingBloomFilter(this);
-}
diff --git a/src/mem/ruby/filters/NonCountingBloomFilter.hh b/src/mem/ruby/filters/NonCountingBloomFilter.hh
deleted file mode 100644
index 614fee0..0000000
--- a/src/mem/ruby/filters/NonCountingBloomFilter.hh
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __MEM_RUBY_FILTERS_NONCOUNTINGBLOOMFILTER_HH__
-#define __MEM_RUBY_FILTERS_NONCOUNTINGBLOOMFILTER_HH__
-
-#include "mem/ruby/filters/AbstractBloomFilter.hh"
-
-struct NonCountingBloomFilterParams;
-
-class NonCountingBloomFilter : public AbstractBloomFilter
-{
-  public:
-    NonCountingBloomFilter(const NonCountingBloomFilterParams* p);
-    ~NonCountingBloomFilter();
-
-    void merge(const AbstractBloomFilter* other) override;
-    void set(Addr addr) override;
-    void unset(Addr addr) override;
-
-    int getCount(Addr addr) const override;
-
-  private:
-    int hash(Addr addr) const;
-
-    /**
-     * Bit offset from block number. Used to simulate bit selection hashing
-     * on larger than cache-line granularities, by skipping some bits.
-     */
-    int skipBits;
-};
-
-#endif // __MEM_RUBY_FILTERS_NONCOUNTINGBLOOMFILTER_HH__
diff --git a/src/mem/ruby/filters/SConscript b/src/mem/ruby/filters/SConscript
index 13ecc5e..8c7b2a2 100644
--- a/src/mem/ruby/filters/SConscript
+++ b/src/mem/ruby/filters/SConscript
@@ -41,4 +41,3 @@
 Source('LSB_CountingBloomFilter.cc')
 Source('MultiBitSelBloomFilter.cc')
 Source('MultiGrainBloomFilter.cc')
-Source('NonCountingBloomFilter.cc')
