diff --git a/src/main/java/in/twizmwaz/cardinal/module/filter/FilterModule.java b/src/main/java/in/twizmwaz/cardinal/module/filter/FilterModule.java
index e7fb3a3..66c0742 100644
--- a/src/main/java/in/twizmwaz/cardinal/module/filter/FilterModule.java
+++ b/src/main/java/in/twizmwaz/cardinal/module/filter/FilterModule.java
@@ -53,6 +53,7 @@
 import in.twizmwaz.cardinal.module.filter.type.CreatureFilter;
 import in.twizmwaz.cardinal.module.filter.type.CrouchingFilter;
 import in.twizmwaz.cardinal.module.filter.type.EntityFilter;
+import in.twizmwaz.cardinal.module.filter.type.FilterReference;
 import in.twizmwaz.cardinal.module.filter.type.FlyingFilter;
 import in.twizmwaz.cardinal.module.filter.type.HoldingFilter;
 import in.twizmwaz.cardinal.module.filter.type.LayerFilter;
@@ -83,13 +84,16 @@
 import org.jdom2.Element;
 import org.jdom2.located.Located;
 
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 import java.util.Map;
 
 @ModuleEntry(depends = {RegionModule.class, TeamModule.class})
 public class FilterModule extends AbstractModule implements Listener {
 
   private Map<Match, Map<String, Filter>> filters = Maps.newHashMap();
+  private Map<Match, List<FilterReference>> references = Maps.newHashMap();
 
   //Static filters. Can be shared across matches, because they use no arguments
   public static final Filter ALLOW = new StaticFilter(FilterState.ALLOW);
@@ -114,6 +118,7 @@ public FilterModule() {
   @Override
   public boolean loadMatch(@NonNull Match match) {
     filters.put(match, Maps.newHashMap());
+    references.put(match, new ArrayList<>());
     for (Element filtersElement : match.getMap().getDocument().getRootElement().getChildren("filters")) {
       for (Element filterElement : filtersElement.getChildren()) {
         filters.get(match).put("always", ALLOW);
@@ -125,6 +130,10 @@ public boolean loadMatch(@NonNull Match match) {
         }
       }
     }
+    for (FilterReference reference : references.get(match)) {
+      reference.load(this, match);
+    }
+    references.remove(match);
     return true;
   }
 
@@ -158,6 +167,12 @@ public Filter getFilter(@NonNull Match match, @NonNull String id) {
     return filters.get(match).get(id);
   }
 
+  public Filter getFilterReference(@NonNull Match match, @NonNull String id) {
+    FilterReference reference = new FilterReference(id);
+    references.get(match).add(reference);
+    return reference;
+  }
+
   /**
    * Parses an element for a filter.
    *
@@ -312,7 +327,7 @@ public Filter getFilter(Match match, Element element, String... alternateAttribu
         for (String alternateAttribute : alternateAttributes) {
           String filterValue = element.getAttributeValue(alternateAttribute);
           if (filterValue != null) {
-            Filter filter = getFilter(match, filterValue);
+            Filter filter = getFilterReference(match, filterValue);
             if (filter != null) {
               return checkFilter(match, id, filter);
             }
@@ -321,7 +336,7 @@ public Filter getFilter(Match match, Element element, String... alternateAttribu
 
         String filterValue = element.getAttributeValue("id");
         if (filterValue != null) {
-          Filter filter = getFilter(match, filterValue);
+          Filter filter = getFilterReference(match, filterValue);
           if (filter != null) {
             return checkFilter(match, id, filter);
           }
diff --git a/src/main/java/in/twizmwaz/cardinal/module/filter/type/FilterReference.java b/src/main/java/in/twizmwaz/cardinal/module/filter/type/FilterReference.java
new file mode 100644
index 0000000..b3ac07a
--- /dev/null
+++ b/src/main/java/in/twizmwaz/cardinal/module/filter/type/FilterReference.java
@@ -0,0 +1,33 @@
+package in.twizmwaz.cardinal.module.filter.type;
+
+import in.twizmwaz.cardinal.match.Match;
+import in.twizmwaz.cardinal.module.ModuleError;
+import in.twizmwaz.cardinal.module.filter.Filter;
+import in.twizmwaz.cardinal.module.filter.FilterModule;
+import in.twizmwaz.cardinal.module.filter.FilterState;
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor
+public class FilterReference implements Filter {
+
+  private final String id;
+  private Filter filter;
+
+  public void load(FilterModule module, Match match) {
+    filter = module.getFilter(match, id);
+    if (filter == null) {
+      module.getErrors().add(
+          new ModuleError(module, match.getMap(), new String[]{"Could not find filter for id \'" + id + "\'"}, false));
+    }
+  }
+
+  @Override
+  public FilterState evaluate(Object... objects) {
+    if (filter != null) {
+      return filter.evaluate(objects);
+    } else {
+      return FilterState.ABSTAIN;
+    }
+  }
+
+}