diff --git a/openbis-ipad/BisKit/Classes/CISDOBIpadService.h b/openbis-ipad/BisKit/Classes/CISDOBIpadService.h
index bdabf9c25c16cb941d1cf58071d8a45bb2c9b910..22df6c18a9a305f77a57175d8650d63680dbffe5 100644
--- a/openbis-ipad/BisKit/Classes/CISDOBIpadService.h
+++ b/openbis-ipad/BisKit/Classes/CISDOBIpadService.h
@@ -41,11 +41,12 @@ enum CISOBIpadServiceErrorCode {
 @private
     // Internal State
     BOOL            _isLoggedIn;
-    NSDictionary   *_ipadReadService;
+    NSDictionary    *_ipadReadService;
 }
 
 @property(readonly) CISDOBConnection *connection;
 @property(strong, nonatomic) CISDOBClientPreferences *clientPreferences;
+@property(strong, nonatomic) NSDate *lastRootSetUpdate;
 
 //! Designated initializer.
 - (id)initWithConnection:(CISDOBConnection *)connection;
diff --git a/openbis-ipad/BisKit/Classes/CISDOBIpadService.m b/openbis-ipad/BisKit/Classes/CISDOBIpadService.m
index 3877f372bc06306a74ad5c353dad01d8f4bda7a0..65619ad5524595b7c9572e7bdcf910e371eac793 100644
--- a/openbis-ipad/BisKit/Classes/CISDOBIpadService.m
+++ b/openbis-ipad/BisKit/Classes/CISDOBIpadService.m
@@ -122,7 +122,7 @@ static id OpenBisTableRowValueAtIndex(NSArray *rowData, NSUInteger index)
     return iPadCall;
 }
 
-- (CISDOBIpadServiceCall *)createIpadServiceCallWithParameters:(NSDictionary *)parameters
+- (CISDOBIpadServiceCall *)createIpadServiceCallWithParameters:(NSDictionary *)parameters updateRootSetTime:(BOOL)updateTime
 {
     CISDOBAsyncCall *connectionCall =
         [_connection
@@ -131,18 +131,41 @@ static id OpenBisTableRowValueAtIndex(NSArray *rowData, NSUInteger index)
             parameters: parameters];
     CISDOBIpadServiceCall *iPadCall = [self iPadCallWrappingConnectionCall: connectionCall];
     
+    __weak CISDOBIpadService *weakSelf = self;
     connectionCall.success = ^(id result) {
+        if (updateTime) weakSelf.lastRootSetUpdate = [NSDate date];
         if (iPadCall.success) {
-            iPadCall.success([self rawEntitiesFromResult: result]);
+            iPadCall.success([weakSelf rawEntitiesFromResult: result]);
         }
     };
     return iPadCall;
 }
 
-- (CISDOBAsyncCall *)listRootLevelEntities;
+- (CISDOBIpadServiceCall *)createIpadServiceCallWithParameters:(NSDictionary *)parameters
+{
+    return [self createIpadServiceCallWithParameters: parameters updateRootSetTime: NO];
+}
+
+- (BOOL)shouldRefreshRootLevelEntitiesCall
 {
-    NSDictionary *parameters = [NSDictionary dictionaryWithObject: @"ROOT" forKey: @"requestKey"];
-    CISDOBIpadServiceCall *serviceCall = [self createIpadServiceCallWithParameters: parameters];
+    if (!self.lastRootSetUpdate) return YES;
+    if (!self.clientPreferences) return YES;
+    NSTimeInterval rootSetRefreshInterval = self.clientPreferences.rootSetRefreshInterval;
+    if ([[NSDate date] timeIntervalSinceDate: self.lastRootSetUpdate] < rootSetRefreshInterval) return NO;
+    return YES;
+}
+
+- (CISDOBAsyncCall *)listRootLevelEntities
+{
+    CISDOBIpadServiceCall *serviceCall;
+    // If we have recently update the root set, just do a ping call
+    if ([self shouldRefreshRootLevelEntitiesCall]) {
+        NSDictionary *parameters = [NSDictionary dictionaryWithObject: @"ROOT" forKey: @"requestKey"];
+        serviceCall = [self createIpadServiceCallWithParameters: parameters updateRootSetTime: YES];
+    } else {
+        NSDictionary *parameters = [NSDictionary dictionaryWithObject: @"PING" forKey: @"requestKey"];
+        serviceCall = [self createIpadServiceCallWithParameters: parameters updateRootSetTime: NO];
+    }
     // Make sure the timeout interval is at least 60s
     if (serviceCall.timeoutInterval < 60.) serviceCall.timeoutInterval = 60.;
     return serviceCall;
diff --git a/openbis-ipad/BisKit/Classes/CISDOBIpadServiceInternal.h b/openbis-ipad/BisKit/Classes/CISDOBIpadServiceInternal.h
index 3ce542b5806ba6c7b02f7630c49b7b25a206f6a0..eb1d4336e65a6cb877d5cdc6794098da5b6941ed 100644
--- a/openbis-ipad/BisKit/Classes/CISDOBIpadServiceInternal.h
+++ b/openbis-ipad/BisKit/Classes/CISDOBIpadServiceInternal.h
@@ -57,3 +57,10 @@
 
 @end
 
+@interface CISDOBIpadService(CISDOBIpadServiceInternal)
+
+- (BOOL)shouldRefreshRootLevelEntitiesCall;
+- (CISDOBAsyncCall *)listRootLevelEntitiesFromServer;
+
+@end
+
diff --git a/openbis-ipad/BisKit/Tests/CISDOBIpadServiceManagerTest.m b/openbis-ipad/BisKit/Tests/CISDOBIpadServiceManagerTest.m
index 5cf662506220e8051c26f4c66108c942bef09f20..0f7da007de96bcff4a514ef6815d7307df0be11b 100644
--- a/openbis-ipad/BisKit/Tests/CISDOBIpadServiceManagerTest.m
+++ b/openbis-ipad/BisKit/Tests/CISDOBIpadServiceManagerTest.m
@@ -346,6 +346,8 @@
     // The service parameters are always in the 4th position
     NSDictionary *oldServiceParams = [params objectAtIndex: 3];
     NSMutableDictionary *serviceParams = [NSMutableDictionary dictionaryWithDictionary: oldServiceParams];
+        // Force the root request, bypassing the timing checks
+    [serviceParams setObject: @"ROOT" forKey: @"requestKey"];
     [serviceParams setObject: removedEntities forKey: @"HIDE"];
     [params replaceObjectAtIndex: 3 withObject: serviceParams];
     connectionCall.params = params;
diff --git a/openbis-ipad/BisKit/Tests/CISDOBIpadServiceTest.m b/openbis-ipad/BisKit/Tests/CISDOBIpadServiceTest.m
index 1259dae0605cca23c7d5e1c3a1ccebd973106038..aa7473b00702cfd8d5ef9319945d4c9f946b2bbf 100644
--- a/openbis-ipad/BisKit/Tests/CISDOBIpadServiceTest.m
+++ b/openbis-ipad/BisKit/Tests/CISDOBIpadServiceTest.m
@@ -24,6 +24,7 @@
 #import "CISDOBIpadServiceTest.h"
 #import "CISDOBConnection.h"
 #import "CISDOBIpadService.h"
+#import "CISDOBIpadServiceInternal.h"
 #import "CISDOBAsyncCall.h"
 
 
@@ -62,12 +63,14 @@
     STAssertNotNil(_service.clientPreferences, @"The client preferences should have been initialized");
     STAssertEquals(_service.clientPreferences.rootSetRefreshInterval, 60. * 30., @"The default root refresh interval should be 30 min");
     
+    STAssertTrue([_service shouldRefreshRootLevelEntitiesCall], @"We have not yet initialized the root level entities, so we should do so now");
     call = [_service listRootLevelEntities];
     [self configureAndRunCallSynchronously: call];
     
     STAssertNotNil(_callResult, @"The iPad service should have returned some entities.");
     NSArray *rawEntities = _callResult;
     STAssertTrue([rawEntities count] > 0, @"The Pad service should have returned some entities.");
+    STAssertFalse([_service shouldRefreshRootLevelEntitiesCall], @"We have initialized the root level entities recently, no need to do it again.");
     
     for (CISDOBIpadRawEntity *rawEntity in rawEntities) {
         NSString *summaryHeader = rawEntity.summaryHeader;
diff --git a/openbis-ipad/Research/BisMac.xcodeproj/project.xcworkspace/xcuserdata/cramakri.xcuserdatad/UserInterfaceState.xcuserstate b/openbis-ipad/Research/BisMac.xcodeproj/project.xcworkspace/xcuserdata/cramakri.xcuserdatad/UserInterfaceState.xcuserstate
index 6215cc6611f18dd61b6b83b9e4bb72ca6cd2726c..7c807974912002f4222bdc1cebb6dc6c2f42123e 100644
Binary files a/openbis-ipad/Research/BisMac.xcodeproj/project.xcworkspace/xcuserdata/cramakri.xcuserdatad/UserInterfaceState.xcuserstate and b/openbis-ipad/Research/BisMac.xcodeproj/project.xcworkspace/xcuserdata/cramakri.xcuserdatad/UserInterfaceState.xcuserstate differ