Index: modules/dnet-collector-plugins/trunk/src/test/java/eu/dnetlib/data/collector/plugins/doiresolver/DOIResolverIteratorTest.java
===================================================================
--- modules/dnet-collector-plugins/trunk/src/test/java/eu/dnetlib/data/collector/plugins/doiresolver/DOIResolverIteratorTest.java	(revision 59094)
+++ modules/dnet-collector-plugins/trunk/src/test/java/eu/dnetlib/data/collector/plugins/doiresolver/DOIResolverIteratorTest.java	(revision 59095)
@@ -1,5 +1,7 @@
 package eu.dnetlib.data.collector.plugins.doiresolver;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -12,28 +14,61 @@
 @RunWith(MockitoJUnitRunner.class)
 public class DOIResolverIteratorTest {
 
+    private static final Log log = LogFactory.getLog(DOIResolverIteratorTest.class);
     @Mock
     CrossrefResolver resolver;
     DOIResolverIterator it;
 
+    String dirpath;
+
     @Before
     public void setup(){
         when(resolver.resolve("1")).thenReturn("RECORD1");
         when(resolver.resolve("2")).thenReturn(null);
         when(resolver.resolve("3")).thenReturn("RECORD3");
-        String file = getClass().getResource("/eu/dnetlib/data/collector/plugins/doiresolver/doi_list.csv").getFile();
-        it = new DOIResolverIterator(file, resolver);
+        dirpath = getClass().getResource("/eu/dnetlib/data/collector/plugins/doiresolver").getPath();
+
     }
 
     @Test
     public void test(){
+        it = new DOIResolverIterator(dirpath, resolver, null);
+        int count = 0;
         while(it.hasNext()){
-            System.out.println(it.next());
+            String res = it.next();
+            log.info(res);
+            if(count == 0) Assert.assertEquals("RECORD1", res);
+            if(count == 1) Assert.assertEquals("RECORD3", res);
+            count++;
         }
+        Assert.assertEquals(2, count);
     }
 
     @Test
+    public void testIncremental(){
+        it = new DOIResolverIterator(dirpath, resolver, "2020-07-13");
+        int count = 0;
+        while(it.hasNext()){
+            String res = it.next();
+            count++;
+        }
+        Assert.assertEquals(0, count);
+    }
+
+    @Test
+    public void testIncremental2(){
+        it = new DOIResolverIterator(dirpath, resolver, "2020-01-13");
+        int count = 0;
+        while(it.hasNext()){
+            String res = it.next();
+            count++;
+        }
+        Assert.assertEquals(2, count);
+    }
+
+    @Test
     public void testCleanOk(){
+        it = new DOIResolverIterator(dirpath, resolver, null);
         String doi = "10.1234/1234";
         Assert.assertEquals(doi, it.cleanDOI(doi));
     }
@@ -40,6 +75,7 @@
 
     @Test
     public void testCleanHttp(){
+        it = new DOIResolverIterator(dirpath, resolver, null);
         String doi = "10.1234/1234";
         String doiURL = "http://dx.doi.org/"+doi;
         Assert.assertEquals(doi, it.cleanDOI(doiURL));
@@ -47,6 +83,7 @@
 
     @Test
     public void testCleanHttps(){
+        it = new DOIResolverIterator(dirpath, resolver, null);
         String doi = "10.1234/1234";
         String doiURL = "https://dx.doi.org/"+doi;
         Assert.assertEquals(doi, it.cleanDOI(doiURL));
Index: modules/dnet-collector-plugins/trunk/src/test/resources/log4j.properties
===================================================================
--- modules/dnet-collector-plugins/trunk/src/test/resources/log4j.properties	(revision 59094)
+++ modules/dnet-collector-plugins/trunk/src/test/resources/log4j.properties	(revision 59095)
@@ -11,6 +11,7 @@
 log4j.logger.eu.dnetlib.data.collector.plugins.projects.grist=DEBUG
 log4j.logger.eu.dnetlib.data.collector.plugins.projects.gtr2=DEBUG
 log4j.logger.eu.dnetlib.data.collector.plugins.doiresolver=DEBUG
+log4j.logger.eu.dnetlib.data.collector.plugins.filesystem=DEBUG
 
 
 
Index: modules/dnet-collector-plugins/trunk/src/main/java/eu/dnetlib/data/collector/plugins/doiresolver/DOIResolverIterator.java
===================================================================
--- modules/dnet-collector-plugins/trunk/src/main/java/eu/dnetlib/data/collector/plugins/doiresolver/DOIResolverIterator.java	(revision 59094)
+++ modules/dnet-collector-plugins/trunk/src/main/java/eu/dnetlib/data/collector/plugins/doiresolver/DOIResolverIterator.java	(revision 59095)
@@ -1,5 +1,6 @@
 package eu.dnetlib.data.collector.plugins.doiresolver;
 
+import eu.dnetlib.data.collector.plugins.filesystem.FileSystemIterator;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -9,6 +10,7 @@
 import java.nio.file.Paths;
 import java.util.Iterator;
 import java.util.concurrent.ArrayBlockingQueue;
+import java.util.stream.Stream;
 
 public class DOIResolverIterator implements Iterator<String> {
 
@@ -19,8 +21,9 @@
     private static final String BAD_TERMINATOR = "BAD";
     private static final String UNRESOLVED = "UNRESOLVED";
 
-    /** Path to the file that contains a list of DOIs, one per line. **/
-    private String filePath;
+    /** Path to the dir that contains the files, each a csv with a list of DOIs, one per line. **/
+    private String baseDir;
+    private String fromDate;
 
     private ArrayBlockingQueue<String> queue;
 
@@ -27,8 +30,9 @@
     private CrossrefResolver crossrefResolver;
 
 
-    public DOIResolverIterator(final String filePath, final CrossrefResolver crossrefResolver) {
-        this.filePath = filePath;
+    public DOIResolverIterator(final String baseDir, final CrossrefResolver crossrefResolver, final String fromDate) {
+        this.baseDir = baseDir;
+        this.fromDate = fromDate;
         this.queue = new ArrayBlockingQueue<>(100);
         this.crossrefResolver = crossrefResolver;
         init();
@@ -36,19 +40,31 @@
 
     private void init(){
         log.info("Init");
+
         new Thread(() -> {
-            int count = 0;
-            // put first item in the queue
-            if(queue.offer(STARTER)) {
-                // read the file, ask the resolvers, put results in a shared queue
-                //whatever exceptions, add terminator to the queue
-                try{
-                    Files.lines(Paths.get(filePath)).forEach(doi -> queue.offer(resolve(doi)));
-                } catch (IOException e) {
-                    log.error("DOI processing aborted");
-                    log.error(e);
-                    queue.offer(BAD_TERMINATOR);
+            try{
+                final FileSystemIterator fsi = new FileSystemIterator(baseDir, "csv", fromDate);
+                // put first item in the queue
+                if(queue.offer(STARTER)) {
+                    // read the file, ask the resolvers, put results in a shared queue
+                    //whatever exceptions, add terminator to the queue
+                    while (fsi.hasNext()) {
+                        String filePath = fsi.next();
+                        try (Stream<String> stream = Files.lines(Paths.get(filePath))) {
+
+                            stream.forEach(doi -> queue.offer(resolve(doi)));
+
+                        } catch (IOException e) {
+                            log.error("DOI processing aborted");
+                            log.error(e);
+                            queue.offer(BAD_TERMINATOR);
+                        }
+                    }
                 }
+            } catch (Exception e) {
+                log.error("DOI processing aborted");
+                log.error(e);
+                queue.offer(BAD_TERMINATOR);
             }
             queue.offer(TERMINATOR);
             log.info("Finished processing DOI list");
@@ -107,12 +123,12 @@
         return queue.poll();
     }
 
-    public String getFilePath() {
-        return filePath;
+    public String getBaseDir() {
+        return baseDir;
     }
 
-    public void setFilePath(String filePath) {
-        this.filePath = filePath;
+    public void setBaseDir(String baseDir) {
+        this.baseDir = baseDir;
     }
 
     public CrossrefResolver getCrossrefResolver() {
Index: modules/dnet-collector-plugins/trunk/src/main/java/eu/dnetlib/data/collector/plugins/doiresolver/DOIResolverPlugin.java
===================================================================
--- modules/dnet-collector-plugins/trunk/src/main/java/eu/dnetlib/data/collector/plugins/doiresolver/DOIResolverPlugin.java	(revision 59094)
+++ modules/dnet-collector-plugins/trunk/src/main/java/eu/dnetlib/data/collector/plugins/doiresolver/DOIResolverPlugin.java	(revision 59095)
@@ -11,8 +11,12 @@
 
     @Override
     public Iterable<String> collect(final InterfaceDescriptor interfaceDescriptor, final String fromDate, final String untilDate) throws CollectorServiceException {
-        //check baseurl not blank
-        return () -> new DOIResolverIterator(interfaceDescriptor.getBaseUrl(), crossrefResolver);
+        final String baseUrl = interfaceDescriptor.getBaseUrl();
+        if ((baseUrl == null) || baseUrl.isEmpty()) {
+            throw new CollectorServiceException("Param 'baseurl' is null or empty");
+        }
+        if (fromDate != null && !fromDate.matches("\\d{4}-\\d{2}-\\d{2}")) { throw new CollectorServiceException("Invalid date (YYYY-MM-DD): " + fromDate); }
+        return () -> new DOIResolverIterator(interfaceDescriptor.getBaseUrl(), crossrefResolver, fromDate);
     }
 
     public CrossrefResolver getCrossrefResolver() {
