diff -r 5b62a9004662 src/org/openbravo/dal/core/OBContext.java
--- a/src/org/openbravo/dal/core/OBContext.java	Fri Feb 26 07:43:53 2016 +0100
+++ b/src/org/openbravo/dal/core/OBContext.java	Tue Jun 07 20:37:38 2016 +0200
@@ -469,6 +469,7 @@
   private boolean translationInstalled;
   private Warehouse warehouse;
   private List<Organization> organizationList;
+  private List<String> organizationIds;
   private String[] readableOrganizations;
   private String[] readableClients;
   private Set<String> writableOrganizations;
@@ -567,6 +568,27 @@
   }
 
   @SuppressWarnings("unchecked")
+  private List<String> getOrganizationListOnlyId(Role thisRole) {
+    if (organizationIds != null) {
+      return new ArrayList<String>(organizationIds);
+    }
+    final Query qry = SessionHandler.getInstance().createQuery(
+        "select o.id from " + Organization.class.getName() + " o, "
+            + RoleOrganization.class.getName() + " roa where o." + Organization.PROPERTY_ID
+            + "=roa." + RoleOrganization.PROPERTY_ORGANIZATION + "." + Organization.PROPERTY_ID
+            + " and roa." + RoleOrganization.PROPERTY_ROLE + "." + Organization.PROPERTY_ID + "='"
+            + thisRole.getId() + "' and roa." + RoleOrganization.PROPERTY_ACTIVE + "='Y' and o."
+            + Organization.PROPERTY_ACTIVE + "='Y'");
+    organizationIds = qry.list();
+    for (final String orgId : additionalWritableOrganizations) {
+      if (!organizationIds.contains(orgId)) {
+        organizationIds.add(orgId);
+      }
+    }
+    return new ArrayList<String>(organizationIds);
+  }
+
+  @SuppressWarnings("unchecked")
   private List<Organization> getOrganizations(Client client) {
     final Query qry = SessionHandler.getInstance().createQuery(
         "select o from " + Organization.class.getName() + " o where " + "o."
@@ -576,18 +598,37 @@
     return organizationList;
   }
 
+  @SuppressWarnings("unchecked")
+  private List<String> getOrganizationsOnlyId(Client client) {
+    final Query qry = SessionHandler.getInstance().createQuery(
+        "select o.id from " + Organization.class.getName() + " o where " + "o."
+            + Organization.PROPERTY_CLIENT + "=? and o." + Organization.PROPERTY_ACTIVE + "='Y'");
+    qry.setParameter(0, client);
+    organizationIds = qry.list();
+    return organizationIds;
+  }
+
   private void setReadableOrganizations(Role role) {
-    final List<Organization> os = getOrganizationList(role);
+    log.info("obc-setRo1: count"
+        + SessionHandler.getInstance().getSession().getStatistics().getEntityCount());
+
+    final List<String> os = getOrganizationListOnlyId(role);
+    log.info("obc-setRo2: count"
+        + SessionHandler.getInstance().getSession().getStatistics().getEntityCount());
     final Set<String> readableOrgs = new HashSet<String>();
-    for (final Organization o : os) {
-      readableOrgs.addAll(getOrganizationStructureProvider().getNaturalTree(o.getId()));
+    for (final String o : os) {
+      log.info("obc-setRoL1: count"
+          + SessionHandler.getInstance().getSession().getStatistics().getEntityCount());
+      readableOrgs.addAll(getOrganizationStructureProvider().getNaturalTree(o));
       // if zero is an organization then add them all!
-      if (o.getId().equals("0")) {
-        for (final Organization org : getOrganizations(getCurrentClient())) {
-          readableOrgs.add(org.getId());
+      if (o.equals("0")) {
+        for (final String org : getOrganizationsOnlyId(getCurrentClient())) {
+          readableOrgs.add(org);
         }
       }
     }
+    log.info("obc-setRo3: count"
+        + SessionHandler.getInstance().getSession().getStatistics().getEntityCount());
     readableOrgs.add("0");
     readableOrganizations = new String[readableOrgs.size()];
     int i = 0;
diff -r 5b62a9004662 src/org/openbravo/dal/service/OBQuery.java
--- a/src/org/openbravo/dal/service/OBQuery.java	Fri Feb 26 07:43:53 2016 +0100
+++ b/src/org/openbravo/dal/service/OBQuery.java	Tue Jun 07 20:37:38 2016 +0200
@@ -358,11 +358,18 @@
       }
     }
 
+    log.info("obq-1: count"
+        + SessionHandler.getInstance().getSession().getStatistics().getEntityCount());
+
     if (!OBContext.getOBContext().isInAdministratorMode()) {
       OBContext.getOBContext().getEntityAccessChecker().checkReadable(getEntity());
     }
+    log.info("obq-2: count"
+        + SessionHandler.getInstance().getSession().getStatistics().getEntityCount());
 
     whereClause = addOrgClientActiveFilter(whereClause, prefix);
+    log.info("obq-3: count"
+        + SessionHandler.getInstance().getSession().getStatistics().getEntityCount());
 
     final String result;
     if (alias != null) {
