diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/ResultDataSetUploader.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/ResultDataSetUploader.java
index f1dab90537912830a7cb38ee7efb55c6db4d58e2..6fd8124b255111c2814e3237da66b3fb1f82f0cb 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/ResultDataSetUploader.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/ResultDataSetUploader.java
@@ -48,12 +48,15 @@ import ch.systemsx.cisd.openbis.etlserver.phosphonetx.dto.Sequence;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Group;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.GroupIdentifier;
+import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.ProbabilityToFDRCalculator;
 
 /**
  * @author Franz-Josef Elmer
  */
 class ResultDataSetUploader extends AbstractHandler
 {
+    private static final double MAX_FALSE_DISCOVERY_RATE = 0.1;
+
     static final String PARAMETER_TYPE_ABUNDANCE = "abundance";
 
     private final Connection connection;
@@ -214,7 +217,7 @@ class ResultDataSetUploader extends AbstractHandler
         Long databaseID = dataSet.getDatabaseID();
         AbundanceHandler abundanceHandler =
                 new AbundanceHandler(openbisService, dao, groupIdentifier, experiment);
-        createProbabilityToFDRMapping(dataSetID, summary);
+        ProbabilityToFDRCalculator calculator = createProbabilityToFDRMapping(dataSetID, summary);
         List<ProteinGroup> proteinGroups = summary.getProteinGroups();
         for (ProteinGroup proteinGroup : proteinGroups)
         {
@@ -225,7 +228,10 @@ class ResultDataSetUploader extends AbstractHandler
                 Protein protein = proteins.get(0);
                 try
                 {
-                    addProtein(protein, dataSetID, databaseID, abundanceHandler);
+                    if (calculator.calculateFDR(protein.getProbability()) <= MAX_FALSE_DISCOVERY_RATE)
+                    {
+                        addProtein(protein, dataSetID, databaseID, abundanceHandler);
+                    }
                 } catch (Exception e)
                 {
                     logException(e, "protein", protein.getName());
@@ -354,8 +360,9 @@ class ResultDataSetUploader extends AbstractHandler
         return null;
     }
 
-    private void createProbabilityToFDRMapping(long dataSetID, ProteinSummary summary)
+    private ProbabilityToFDRCalculator createProbabilityToFDRMapping(long dataSetID, ProteinSummary summary)
     {
+        ProbabilityToFDRCalculator calculator = new ProbabilityToFDRCalculator();
         Object[] s = summary.getSummaryHeader().getProgramDetails().getSummary();
         if (s != null)
         {
@@ -369,9 +376,10 @@ class ResultDataSetUploader extends AbstractHandler
                     {
                         double probability = proteinSummaryDataFilter.getMinProbability();
                         double fdr = proteinSummaryDataFilter.getFalsePositiveErrorRate();
+                        calculator.add(probability, fdr);
                         dao.createProbabilityToFDRMapping(dataSetID, probability, fdr);
                     }
-                    return;
+                    return calculator;
                 }
             }
         }
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/server/business/ErrorModel.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/server/business/ErrorModel.java
index f56b067d2a5c5790ea1ff38cd26b6519bb143a47..8e0db8c265559f615adf2de9049d657fd69bb51f 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/server/business/ErrorModel.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/server/business/ErrorModel.java
@@ -16,16 +16,14 @@
 
 package ch.systemsx.cisd.openbis.plugin.phosphonetx.server.business;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 import net.lemnik.eodsql.DataSet;
 
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.server.dataaccess.IPhosphoNetXDAOFactory;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.server.dataaccess.IProteinQueryDAO;
+import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.ProbabilityToFDRCalculator;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.dto.IdentifiedProtein;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.dto.ProbabilityFDRMapping;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.dto.ProteinReferenceWithProbability;
@@ -35,63 +33,6 @@ import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.dto.ProteinReferenceWi
  */
 class ErrorModel
 {
-    private static final class ProbabilityToFDRCalculator
-    {
-        private static final class MappingEntry implements Comparable<MappingEntry>
-        {
-            private final double probability;
-
-            private final double fdr;
-
-            MappingEntry(double probability, double fdr)
-            {
-                this.probability = probability;
-                this.fdr = fdr;
-            }
-
-            public int compareTo(MappingEntry that)
-            {
-                return probability < that.probability ? -1 : (probability > that.probability ? 1
-                        : 0);
-            }
-
-            @Override
-            public String toString()
-            {
-                return probability + " = " + fdr;
-            }
-        }
-
-        private final List<MappingEntry> mappingEntries = new ArrayList<MappingEntry>();
-
-        void add(double probability, double falseDiscoveryRate)
-        {
-            mappingEntries.add(new MappingEntry(probability, falseDiscoveryRate));
-        }
-
-        void init()
-        {
-            Collections.sort(mappingEntries);
-        }
-
-        double calculateFDR(double probability)
-        {
-            int index = Collections.binarySearch(mappingEntries, new MappingEntry(probability, 0));
-            if (index >= 0)
-            {
-                return mappingEntries.get(index).fdr;
-            }
-            // calculate by linear interpolation
-            int index1 = -index - 1;
-            int index0 = index1 - 1;
-            assert index0 >= 0;
-            MappingEntry m0 = mappingEntries.get(index0);
-            MappingEntry m1 = mappingEntries.get(index1);
-            double scale = (m1.fdr - m0.fdr) / (m1.probability - m0.probability);
-            return m0.fdr + scale * (probability - m0.probability);
-        }
-    }
-
     private final Map<Long, ProbabilityToFDRCalculator> calculators =
             new HashMap<Long, ProbabilityToFDRCalculator>();
 
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/shared/ProbabilityToFDRCalculator.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/shared/ProbabilityToFDRCalculator.java
new file mode 100644
index 0000000000000000000000000000000000000000..c443ae58ae2754f332fdaa69ee8b13264deec49c
--- /dev/null
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/shared/ProbabilityToFDRCalculator.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2009 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.plugin.phosphonetx.shared;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+
+public final class ProbabilityToFDRCalculator
+{
+    private static final class MappingEntry implements Comparable<ProbabilityToFDRCalculator.MappingEntry>
+    {
+        private final double probability;
+
+        private final double fdr;
+
+        MappingEntry(double probability, double fdr)
+        {
+            this.probability = probability;
+            this.fdr = fdr;
+        }
+
+        public int compareTo(ProbabilityToFDRCalculator.MappingEntry that)
+        {
+            return probability < that.probability ? -1 : (probability > that.probability ? 1
+                    : 0);
+        }
+
+        @Override
+        public String toString()
+        {
+            return probability + " = " + fdr;
+        }
+    }
+
+    private final List<ProbabilityToFDRCalculator.MappingEntry> mappingEntries = new ArrayList<ProbabilityToFDRCalculator.MappingEntry>();
+
+    public void add(double probability, double falseDiscoveryRate)
+    {
+        mappingEntries.add(new MappingEntry(probability, falseDiscoveryRate));
+    }
+
+    public void init()
+    {
+        Collections.sort(mappingEntries);
+    }
+
+    public double calculateFDR(double probability)
+    {
+        int index = Collections.binarySearch(mappingEntries, new MappingEntry(probability, 0));
+        if (index >= 0)
+        {
+            return mappingEntries.get(index).fdr;
+        }
+        // calculate by linear interpolation
+        int index1 = -index - 1;
+        int index0 = index1 - 1;
+        assert index0 >= 0;
+        ProbabilityToFDRCalculator.MappingEntry m0 = mappingEntries.get(index0);
+        ProbabilityToFDRCalculator.MappingEntry m1 = mappingEntries.get(index1);
+        double scale = (m1.fdr - m0.fdr) / (m1.probability - m0.probability);
+        return m0.fdr + scale * (probability - m0.probability);
+    }
+}
\ No newline at end of file