diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..53618d72
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+*.class
+bin
+commons/target
+dist/target
+engine/target
+modules/target
+hq/target
diff --git a/modules/src/main/java/org/archive/modules/deciderules/IpAddressSetDecideRule.java b/modules/src/main/java/org/archive/modules/deciderules/IpAddressSetDecideRule.java
new file mode 100644
index 00000000..61a7a905
--- /dev/null
+++ b/modules/src/main/java/org/archive/modules/deciderules/IpAddressSetDecideRule.java
@@ -0,0 +1,87 @@
+package org.archive.modules.deciderules;
+
+import static org.archive.modules.CoreAttributeConstants.A_DNS_SERVER_IP_LABEL;
+
+import java.net.InetAddress;
+import java.util.Collections;
+import java.util.Set;
+
+import org.archive.modules.CrawlURI;
+import org.archive.modules.net.CrawlHost;
+import org.archive.modules.net.ServerCache;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ *
+ * <bean class="org.archive.modules.deciderules.IpAddressSetDecideRule">
+ * <property name="ipAddresses">
+ * <set>
+ * <value>127.0.0.1</value>
+ * <value>69.89.27.209</value>
+ * </set>
+ * </property>
+ * <property name='decision' value='REJECT' />
+ * </bean>
+ *
+ *
+ * @contributor Travis Wellman
+ */
+
+class IpAddressSetDecideRule extends PredicatedDecideRule {
+
+// private static final Logger LOGGER = Logger.getLogger(IpAddressSetDecideRule.class.getCanonicalName());
+ private static final long serialVersionUID = -3670434739183271441L;
+ private Set ipAddresses;
+
+ /**
+ * @return the addresses being matched
+ */
+ public Set getIpAddresses() {
+ return Collections.unmodifiableSet(ipAddresses);
+ }
+
+ /**
+ * @param ipAddresses the addresses to match
+ */
+ public void setIpAddresses(Set ipAddresses) {
+ this.ipAddresses = ipAddresses;
+ }
+
+ @Override
+ protected boolean evaluate(CrawlURI curi) {
+ String hostAddress = getHostAddress(curi);
+ System.out.println("hostAddress for "+ curi +" "+ hostAddress);
+ return hostAddress != null &&
+ ipAddresses.contains(hostAddress.intern());
+ }
+
+ transient protected ServerCache serverCache;
+ public ServerCache getServerCache() {
+ return this.serverCache;
+ }
+ @Autowired
+ public void setServerCache(ServerCache serverCache) {
+ this.serverCache = serverCache;
+ }
+
+ /**
+ * from WriterPoolProcessor
+ *
+ * @param curi CrawlURI
+ * @return String of IP address
+ */
+ protected String getHostAddress(CrawlURI curi) {
+ // special handling for DNS URIs: want address of DNS server
+ if (curi.getUURI().getScheme().toLowerCase().equals("dns")) {
+ return (String)curi.getData().get(A_DNS_SERVER_IP_LABEL);
+ }
+ // otherwise, host referenced in URI
+ // TODO:FIXME: have fetcher insert exact IP contacted into curi,
+ // use that rather than inferred by CrawlHost lookup
+ CrawlHost crlh = getServerCache().getHostFor(curi.getUURI());
+ if (crlh == null) { return null; }
+ InetAddress inetadd = crlh.getIP();
+ if (inetadd == null) { return null; }
+ return inetadd.getHostAddress();
+ }
+}