     currentGroup     = groupsController.getCurrentGroup()
 
     #fetch = ()=>
-      # since it is not working, disabled it,
-      # to-do add isExempt control.
-      # @isExempt (exempt)=>
-      #   if exempt or @getFilter() isnt activityTypes
+      #since it is not working, disabled it,
+      #to-do add isExempt control.
+      #@isExempt (exempt)=>
+        #if exempt or @getFilter() isnt activityTypes
+
+    #if isReady
+    #then fetch
+    #else groupsController.once 'groupChanged', fetch
 
     options =
       to     : options.to or Date.now()
-      #from   : options.from
       group  :
         slug : currentGroup.slug or "koding"
         id   : currentGroup.getId()
       limit  : 20
       facets : @getActivityFilter()
 
-    @fetchActivities options, (err, cache)=>
+    @activityCallback = KD.utils.getCancellableCallback (err, activities, callback)=>
+      @activityCallback = null
       @isLoading = no
-
-      if err or cache.length is 0
+      @listenToLazyThreshold()
+
+      if err or activities.length is 0
         warn err  if err
 
         @listController.hideLazyLoader()
         @listController.showNoItemWidget()
       else
-        @extractCacheTimeStamps cache
-
-        @sanitizeCache cache, (err, cache)=>
+        callback activities
+
+    @fetchActivities options, @activityCallback
+
+  fetchActivities: (options={}, callback)->
+    if @getFeedFilter() is "Public" then @fetchPublicActivities options, callback
+    else @fetchFollowingActivities options, callback
+
+  fetchPublicActivities:(options = {}, callback)->
+    {CStatusActivity} = KD.remote.api
+    CStatusActivity.fetchPublicActivityFeed options, (err, activities)=>
+      activities.overview.reverse()  if activities.overview
+
+      callback err, activities, (acts)=>
+        @extractCacheTimeStamps acts
+
+        @sanitizeCache acts, (err, cache)=>
           @listController.hideLazyLoader()
           @listController.listActivitiesFromCache cache
 
-    #if isReady
-    #then fetch
-    #else groupsController.once 'groupChanged', fetch
-
-  fetchActivities: (options={}, callback)->
-    {CStatusActivity, CActivity} = KD.remote.api
-
-    if @getFeedFilter() is "Public"
-      CStatusActivity.fetchPublicActivityFeed options, (err, result)=>
-        result.overview.reverse()  if result.overview
-        return callback err, result
-    else
-      CActivity.fetchFolloweeContents options, callback
+  fetchFollowingActivities:(options = {}, callback)->
+    {CActivity} = KD.remote.api
+    CActivity.fetchFolloweeContents options, (err, activities) =>
+      callback err, activities, (activities)=>
+        @extractTeasersTimeStamps(activities)
+        @listController.listActivities activities
+
+  # Store first & last cache activity timestamp.
+  extractCacheTimeStamps: (cache)->
+    @lastTo   = (new Date cache.to).getTime()
+    @lastFrom = (new Date cache.from).getTime()
+
+  # Store first & last activity timestamp.
+  extractTeasersTimeStamps:(teasers)->
+    @lastTo   = teasers.first.meta.createdAt
+    @lastFrom = teasers.last.meta.createdAt
+
+  sanitizeCache:(cache, callback)->
+    activities = clearQuotes cache.activities
+
+    KD.remote.reviveFromSnapshots activities, (err, instances)->
+      for activity,i in activities
+        cache.activities[activity._id] or= {}
+        cache.activities[activity._id].teaser = instances[i]
+
+      callback null, cache
 
   activitiesArrived:(activities)->
     for activity in activities when activity.bongo_.constructorName in newActivitiesArrivedTypes

      #exempt = flags?.indexOf 'exempt'
      #exempt = (exempt? and exempt > -1) or storage.getAt 'bucket.showLowQualityContent'
      #callback exempt

  #fetchActivitiesDirectly:(options = {}, callback)->
    #KD.time "Activity fetch took - "
    #options = to : options.to or Date.now()

    #@fetchActivity options, (err, teasers)=>
      #@isLoading = no
      #@listController.hideLazyLoader()
      #KD.timeEnd "Activity fetch took"

      #if err or teasers.length is 0
        #warn "An error occured:", err  if err
        #@listController.showNoItemWidget()
      #else
        #@extractTeasersTimeStamps(teasers)
        #@listController.listActivities teasers

      #callback? err, teasers

  getNewItemsCount: (callback) ->
    callback? @listController?.activityHeader?.getNewItemsCount() or 0

  # Refreshes activity feed, used when user has been disconnected
  # for so long, backend connection is long gone.
  refresh:->
    # prevents multiple clicks to refresh from interfering
    return  if @isLoading

    @resetAll()

  #populateActivityWithTimeout:->
    #@populateActivity {},\
