diff --git a/src/main/java/fr/osug/doi/DataciteSyncPipeline.java b/src/main/java/fr/osug/doi/DataciteSyncPipeline.java
index 3192ae149e2b6cc77016a4937569064746e2b6f1..a80000fe6b81777723247dc29adce6ed547e7819 100644
--- a/src/main/java/fr/osug/doi/DataciteSyncPipeline.java
+++ b/src/main/java/fr/osug/doi/DataciteSyncPipeline.java
@@ -10,6 +10,7 @@ import fr.osug.doi.service.DoiService;
 import fr.osug.util.FileUtils;
 import java.io.File;
 import java.io.IOException;
+import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 import org.slf4j.Logger;
@@ -38,13 +39,19 @@ public final class DataciteSyncPipeline extends AbstractPipeline<PipelineCommonD
 
     @Override
     public void doExecute() throws IOException {
-        logger.info("doStaging: {}", doStaging);
-        logger.info("doPublic:  {}", doPublic);
+        final Collection<ProjectConfig> projectConfigs = pipeData.getProjectConfigs();
 
-        prepare();
+        if (projectConfigs.isEmpty()) {
+            logger.info("publishDatacite: skipping (no project defined)");
+        } else {
+            logger.info("doStaging: {}", doStaging);
+            logger.info("doPublic:  {}", doPublic);
 
-        for (ProjectConfig projectConfig : pipeData.getProjectConfigs()) {
-            publishDatacite(projectConfig);
+            prepare();
+
+            for (ProjectConfig projectConfig : projectConfigs) {
+                publishDatacite(projectConfig);
+            }
         }
     }
 
diff --git a/src/main/java/fr/osug/doi/GeneratePipeline.java b/src/main/java/fr/osug/doi/GeneratePipeline.java
index cb5ecb1a3b6a6855e5e7baeee2e7b6a04333a496..8695b2eb79ba6434eac4d655020122ed51cb02d2 100644
--- a/src/main/java/fr/osug/doi/GeneratePipeline.java
+++ b/src/main/java/fr/osug/doi/GeneratePipeline.java
@@ -99,7 +99,7 @@ public final class GeneratePipeline extends AbstractPipeline<PipelineCommonData>
             if (p == null) {
                 logger.warn("Unknown Project [{}]", projectName);
             } else {
-                pipeData.getProjectConfig(p.getName());
+                pipeData.getProjectConfigAll(p.getName());
             }
         }
 
@@ -109,7 +109,7 @@ public final class GeneratePipeline extends AbstractPipeline<PipelineCommonData>
     @Override
     public void doExecute() throws IOException {
         // 1 - Landing pages for selected project(s):
-        for (ProjectConfig projectConfig : pipeData.getProjectConfigs()) {
+        for (ProjectConfig projectConfig : pipeData.getProjectConfigsAll()) {
             generateLandingPages(projectConfig);
         }
         // 2 - Update index pages:
diff --git a/src/main/java/fr/osug/doi/GenerateRedirectPipeline.java b/src/main/java/fr/osug/doi/GenerateRedirectPipeline.java
index d618e21759a5cf64fcb94066357fb5982d47fbdb..15b7a1fad254b663c452ca319b18693eb6fbfbf2 100644
--- a/src/main/java/fr/osug/doi/GenerateRedirectPipeline.java
+++ b/src/main/java/fr/osug/doi/GenerateRedirectPipeline.java
@@ -152,7 +152,7 @@ public final class GenerateRedirectPipeline extends AbstractPipeline<PipelineCom
         for (Project p : projects) {
             final String projectName = p.getName();
 
-            final ProjectConfig projectConfig = pipeData.getProjectConfig(projectName);
+            final ProjectConfig projectConfig = pipeData.getProjectConfigAll(projectName);
 
             if (projectConfig.getPropertyBoolean(ProjectConfig.CONF_KEY_GENERATE_EMBEDDED)) {
                 // // [public/staging]/PROJECT/embed/DOI_SUFFIX[.html]
diff --git a/src/main/java/fr/osug/doi/PipelineCommonData.java b/src/main/java/fr/osug/doi/PipelineCommonData.java
index 8a244dc85972c0b0b552124446ac1805249fd5e5..032ccbfa66b1daeb6a8e0f4f772f788b78c5253d 100644
--- a/src/main/java/fr/osug/doi/PipelineCommonData.java
+++ b/src/main/java/fr/osug/doi/PipelineCommonData.java
@@ -25,6 +25,8 @@ public class PipelineCommonData {
     final StringBuilder buffer = new StringBuilder(BUFFER_SIZE);
     /** project config instances keyed by project name */
     private final Map<String, ProjectConfig> projectConfigs = new LinkedHashMap<String, ProjectConfig>();
+    /** all project config instances keyed by project name (dynamically filled) */
+    private final Map<String, ProjectConfig> projectConfigsAll = new LinkedHashMap<String, ProjectConfig>();
     /** optional doi pattern */
     private String doiPattern = null;
 
@@ -34,17 +36,26 @@ public class PipelineCommonData {
 
     public void addProjectConfig(final ProjectConfig projectConfig) {
         projectConfigs.put(projectConfig.getProjectName(), projectConfig);
+        addProjectConfigAll(projectConfig);
     }
-
+    
     public Collection<ProjectConfig> getProjectConfigs() {
         return projectConfigs.values();
     }
 
-    public ProjectConfig getProjectConfig(final String projectName) throws IOException {
-        ProjectConfig projectConfig = projectConfigs.get(projectName);
+    public void addProjectConfigAll(final ProjectConfig projectConfig) {
+        projectConfigsAll.put(projectConfig.getProjectName(), projectConfig);
+    }
+
+    public Collection<ProjectConfig> getProjectConfigsAll() {
+        return projectConfigsAll.values();
+    }
+    
+    public ProjectConfig getProjectConfigAll(final String projectName) throws IOException {
+        ProjectConfig projectConfig = projectConfigsAll.get(projectName);
         if (projectConfig == null) {
             projectConfig = new ProjectConfig(pathConfig, projectName);
-            addProjectConfig(projectConfig);
+            addProjectConfigAll(projectConfig);
         }
         return projectConfig;
     }
diff --git a/src/main/java/fr/osug/doi/PublishPipeline.java b/src/main/java/fr/osug/doi/PublishPipeline.java
index 1093922fff2d45fd4cd9c78018c9d1a444c476c9..b75b0d955614305945a34121cd781a633455ddf3 100644
--- a/src/main/java/fr/osug/doi/PublishPipeline.java
+++ b/src/main/java/fr/osug/doi/PublishPipeline.java
@@ -46,7 +46,7 @@ public class PublishPipeline extends AbstractPipeline<PipelineCommonData> {
     private void publish(final ProjectConfig projectConfig, final String doiPattern) throws IOException {
         logger.info("publish ...");
 
-        final String pattern = convertPattern(doiPattern);
+        final String pattern = DoiService.convertPattern(doiPattern);
         logger.debug("pattern: {}", pattern);
 
         final String projectName = projectConfig.getProjectName();
@@ -122,16 +122,6 @@ public class PublishPipeline extends AbstractPipeline<PipelineCommonData> {
         return changed;
     }
 
-    private static String convertPattern(final String doiPattern) {
-        String pattern;
-        // escape '%' and '_'
-        pattern = doiPattern.replaceAll("_", "\\_");
-        pattern = pattern.replaceAll("%", "\\%");
-
-        // '<pattern>%' 
-        return pattern + "%";
-    }
-
     private static String replacePrefix(final String metadata, final String prefix) {
         return metadata.replaceAll(Const.DOI_PREFIX_TEST, prefix);
     }
diff --git a/src/main/java/fr/osug/doi/RemovePipeline.java b/src/main/java/fr/osug/doi/RemovePipeline.java
index 397bf124e73315fe491b81abbb5aa57c2086b2d1..4a709055a18a2e6e01b489bda5ebed08b3ceeef0 100644
--- a/src/main/java/fr/osug/doi/RemovePipeline.java
+++ b/src/main/java/fr/osug/doi/RemovePipeline.java
@@ -40,7 +40,7 @@ public final class RemovePipeline extends AbstractPipeline<PipelineCommonData> {
     private void remove(final ProjectConfig projectConfig, final String doiPattern) throws IOException {
         logger.info("remove ...");
 
-        final String pattern = convertPattern(doiPattern);
+        final String pattern = DoiService.convertPattern(doiPattern);
         logger.debug("pattern: {}", pattern);
 
         final String projectName = projectConfig.getProjectName();
@@ -142,15 +142,4 @@ public final class RemovePipeline extends AbstractPipeline<PipelineCommonData> {
             file.delete();
         }
     }
-
-// TODO: refactor
-    private static String convertPattern(final String doiPattern) {
-        String pattern;
-        // escape '%' and '_'
-        pattern = doiPattern.replaceAll("_", "\\_");
-        pattern = pattern.replaceAll("%", "\\%");
-
-        // '<pattern>%' 
-        return pattern + "%";
-    }
 }