diff --git a/src-db/database/sourcedata/AD_REF_LIST.xml b/src-db/database/sourcedata/AD_REF_LIST.xml
index 381861c1bd2397b081cfa1f773e9483d26e00c9f..888d66a0af2e00b18cf2a0b8d199ad4d33b55473 100644
--- a/src-db/database/sourcedata/AD_REF_LIST.xml
+++ b/src-db/database/sourcedata/AD_REF_LIST.xml
@@ -47,6 +47,17 @@
 <!--0679356FA2C645C894203D274F82F5E1-->  <AD_MODULE_ID><![CDATA[AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA]]></AD_MODULE_ID>
 <!--0679356FA2C645C894203D274F82F5E1--></AD_REF_LIST>
 
+<!--0CE0D13E80394E5B9272E4A5A539F942--><AD_REF_LIST>
+<!--0CE0D13E80394E5B9272E4A5A539F942-->  <AD_REF_LIST_ID><![CDATA[0CE0D13E80394E5B9272E4A5A539F942]]></AD_REF_LIST_ID>
+<!--0CE0D13E80394E5B9272E4A5A539F942-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--0CE0D13E80394E5B9272E4A5A539F942-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--0CE0D13E80394E5B9272E4A5A539F942-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--0CE0D13E80394E5B9272E4A5A539F942-->  <VALUE><![CDATA[SAFT_RootOrgDuplicatedNIF]]></VALUE>
+<!--0CE0D13E80394E5B9272E4A5A539F942-->  <NAME><![CDATA[Root organization to verify duplicated NIF]]></NAME>
+<!--0CE0D13E80394E5B9272E4A5A539F942-->  <AD_REFERENCE_ID><![CDATA[A26BA480E2014707B47257024C3CBFF7]]></AD_REFERENCE_ID>
+<!--0CE0D13E80394E5B9272E4A5A539F942-->  <AD_MODULE_ID><![CDATA[AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA]]></AD_MODULE_ID>
+<!--0CE0D13E80394E5B9272E4A5A539F942--></AD_REF_LIST>
+
 <!--1BFDDEEC636541CDB5AE5098421C3B13--><AD_REF_LIST>
 <!--1BFDDEEC636541CDB5AE5098421C3B13-->  <AD_REF_LIST_ID><![CDATA[1BFDDEEC636541CDB5AE5098421C3B13]]></AD_REF_LIST_ID>
 <!--1BFDDEEC636541CDB5AE5098421C3B13-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
diff --git a/src/com/practicsbs/saftpt/SaftUtility.java b/src/com/practicsbs/saftpt/SaftUtility.java
index 3d2d05955f757bd1961145d537357c3f841ee7c9..c76068ab687ca150aff41398677fd936e2d28945 100644
--- a/src/com/practicsbs/saftpt/SaftUtility.java
+++ b/src/com/practicsbs/saftpt/SaftUtility.java
@@ -25,11 +25,14 @@ import org.openbravo.dal.security.OrganizationStructureProvider;
 import org.openbravo.dal.service.OBCriteria;
 import org.openbravo.dal.service.OBDal;
 import org.openbravo.database.ConnectionProvider;
+import org.openbravo.erpCommon.businessUtility.Preferences;
 import org.openbravo.erpCommon.utility.OBError;
 import org.openbravo.erpCommon.utility.OBMessageUtils;
+import org.openbravo.erpCommon.utility.PropertyException;
 import org.openbravo.erpCommon.utility.Utility;
 import org.openbravo.model.ad.system.Client;
 import org.openbravo.model.ad.utility.Sequence;
+import org.openbravo.model.common.businesspartner.BusinessPartner;
 import org.openbravo.model.common.enterprise.DocumentType;
 import org.openbravo.model.common.enterprise.Organization;
 import org.openbravo.model.common.invoice.Invoice;
@@ -45,6 +48,8 @@ public class SaftUtility {
 
   private static Logger logger = Logger.getLogger(SaftUtility.class);
 
+  private static final String ROOTORGDUPLICATEDNIF_PREFERENCE = "SAFT_RootOrgDuplicatedNIF";
+
   private static final String NIF_FORMAT = "([123568]\\d{1}|45|7[0124579]|9[0189])(\\d{7})";
   public static final String SUCCESS = "Success";
   public static final String ERROR = "Error";
@@ -463,6 +468,64 @@ public class SaftUtility {
     }
   }
 
+  /**
+   * Check if the tax id value already exists in a given set of Organizations from the result.
+   * 
+   * @param taxId
+   *          The new Tax ID to check.
+   * @param businessPartnerId
+   *          Id of the current business partner where the Tax ID is going to be set.
+   * @param rootOrg
+   *          Set of organization where it is necessary to check for duplicated Tax ID's.
+   * 
+   * 
+   * @return If the Tax ID already exists or not.
+   */
+  public static boolean isNifDuplicated(String taxId, String businessPartnerId, String rootOrgId) {
+
+    Set<String> orgTree = OBContext.getOBContext()
+        .getOrganizationStructureProvider()
+        .getChildTree(rootOrgId, true);
+
+    String contextOrgId = OBContext.getOBContext().getCurrentOrganization().getId();
+
+    if (!orgTree.contains(contextOrgId)) {
+      return false;
+    }
+
+    if (SaftUtility.isEmpty(taxId) || SaftUtility.isGenericNif(taxId) || taxId == null) {
+      return false;
+    }
+
+    // BusinessPartner with the same Tax ID:
+    OBCriteria<BusinessPartner> bpCriteria = OBDal.getInstance()
+        .createCriteria(BusinessPartner.class);
+    bpCriteria.setFilterOnReadableOrganization(false);
+    bpCriteria.add(Restrictions.eq(BusinessPartner.PROPERTY_TAXID, taxId).ignoreCase());
+    bpCriteria.add(Restrictions.ne(BusinessPartner.PROPERTY_ID, businessPartnerId));
+    bpCriteria.add(Restrictions.in(BusinessPartner.PROPERTY_ORGANIZATION + ".id",
+        (Object[]) orgTree.toArray()));
+
+    if (bpCriteria.count() > 0) {
+      return true;
+    }
+
+    return false;
+  }
+
+  public static String isPreferenceRootOrgDuplicatedNIF() {
+    String rootOrganizationID = null;
+    try {
+      rootOrganizationID = Preferences.getPreferenceValue(ROOTORGDUPLICATEDNIF_PREFERENCE, true,
+          OBContext.getOBContext().getCurrentClient(),
+          OBContext.getOBContext().getCurrentOrganization(), OBContext.getOBContext().getUser(),
+          OBContext.getOBContext().getRole(), null);
+    } catch (PropertyException pe) {
+      // Pref not defined
+    }
+    return rootOrganizationID;
+  }
+
   public static JSONObject createSuccessProcessMessage(String message, boolean retryExecution)
       throws JSONException {
     return createPickAndExecuteMessage(message, SaftUtility.getMessageFromBD("OBUIAPP_Success"),
diff --git a/src/com/practicsbs/saftpt/handler/SaftBPartnerFieldsHandler.java b/src/com/practicsbs/saftpt/handler/SaftBPartnerFieldsHandler.java
index ebc8a008f622b1c9b5e80435ecd92c520dcaec28..1d336c2d63abe28d43c97907dd81c99bd0bd2145 100644
--- a/src/com/practicsbs/saftpt/handler/SaftBPartnerFieldsHandler.java
+++ b/src/com/practicsbs/saftpt/handler/SaftBPartnerFieldsHandler.java
@@ -2,16 +2,15 @@ package com.practicsbs.saftpt.handler;
 
 import javax.enterprise.event.Observes;
 
-import org.hibernate.criterion.Restrictions;
 import org.openbravo.base.exception.OBException;
 import org.openbravo.base.model.Entity;
 import org.openbravo.base.model.ModelProvider;
 import org.openbravo.base.model.Property;
 import org.openbravo.client.kernel.event.EntityNewEvent;
 import org.openbravo.client.kernel.event.EntityUpdateEvent;
-import org.openbravo.dal.service.OBCriteria;
 import org.openbravo.dal.service.OBDal;
 import org.openbravo.model.common.businesspartner.BusinessPartner;
+import org.openbravo.model.common.enterprise.Organization;
 
 import com.practicsbs.saftpt.SaftUtility;
 import com.practicsbs.saftpt.data.Utils;
@@ -31,9 +30,13 @@ public class SaftBPartnerFieldsHandler extends SaftFieldsHandler {
     }
     BusinessPartner bPartner = (BusinessPartner) event.getTargetInstance();
 
-    // NIF Duplicated:
-    if (isNifDuplicated(bPartner)) {
-      throw new OBException(SaftUtility.getMessageFromBD("SAFT_DuplicatedNIF"));
+    String rootOrgDuplicatedNif = SaftUtility.isPreferenceRootOrgDuplicatedNIF();
+    if (rootOrgDuplicatedNif != null) {
+      Organization rootOrg = OBDal.getInstance().get(Organization.class, rootOrgDuplicatedNif);
+      // NIF Duplicated:
+      if (SaftUtility.isNifDuplicated(bPartner.getTaxID(), bPartner.getId(), rootOrg.getId())) {
+        throw new OBException(SaftUtility.getMessageFromBD("SAFT_DuplicatedNIF"));
+      }
     }
 
     // Portuguese NIF Valid:
@@ -49,9 +52,14 @@ public class SaftBPartnerFieldsHandler extends SaftFieldsHandler {
     BusinessPartner bPartner = (BusinessPartner) event.getTargetInstance();
     boolean hasNIFChanged = hasNIFChanged(bPartner, event);
 
-    // NIF Duplicated:
-    if (hasNIFChanged && isNifDuplicated(bPartner)) {
-      throw new OBException(SaftUtility.getMessageFromBD("SAFT_DuplicatedNIF"));
+    String rootOrgDuplicatedNif = SaftUtility.isPreferenceRootOrgDuplicatedNIF();
+    if (rootOrgDuplicatedNif != null) {
+      Organization rootOrg = OBDal.getInstance().get(Organization.class, rootOrgDuplicatedNif);
+      // NIF Duplicated:
+      if (hasNIFChanged
+          && SaftUtility.isNifDuplicated(bPartner.getTaxID(), bPartner.getId(), rootOrg.getId())) {
+        throw new OBException(SaftUtility.getMessageFromBD("SAFT_DuplicatedNIF"));
+      }
     }
 
     // Portuguese NIF Valid:
@@ -135,24 +143,4 @@ public class SaftBPartnerFieldsHandler extends SaftFieldsHandler {
     return true;
   }
 
-  private boolean isNifDuplicated(BusinessPartner bPartner) {
-    String taxId = bPartner.getTaxID();
-
-    if (SaftUtility.isEmpty(taxId) || SaftUtility.isGenericNif(taxId)) {
-      return false;
-    }
-
-    // BusinessPartner with the same Tax ID:
-    OBCriteria<BusinessPartner> bpCriteria = OBDal.getInstance()
-        .createCriteria(BusinessPartner.class);
-    bpCriteria.add(Restrictions.eq(BusinessPartner.PROPERTY_TAXID, bPartner.getTaxID()));
-    bpCriteria.add(Restrictions.ne(BusinessPartner.PROPERTY_ID, bPartner.getId()));
-
-    if (bpCriteria.count() > 0) {
-      return true;
-    }
-
-    return false;
-  }
-
 }
