         callback()  for callback in @_fetchQueue
         @_fetchQueue = []
       else
-        apps  = []
-        stack = []
-
-        files.forEach (file)->
-          if /\.kdapp$/.test(file.name) and file.type is 'folder'
-            apps.push file
-
-        apps.forEach (app)=>
-          stack.push (cb)=>
-            manifest = FSHelper.createFileFromPath "#{app.path}/manifest.json"
-            manifest.fetchContents (err, response)->
-              # shadowing the error is intentional here
-              # to not to break the result of the stack
-              cb null, response
-
-        manifests = @constructor.manifests
-        async.parallel stack, (err, result)=>
-          result.forEach (rawManifest)->
-            if rawManifest
-              try
-                manifest = JSON.parse rawManifest
-                manifests["#{manifest.name}"] = manifest
-              catch e
-                console.warn "Manifest file is broken", e
-          @putAppsToAppStorage manifests
-          callback null, manifests  for callback in @_fetchQueue
+        apps = @filterAppsFromFileList files
+        @fetchIndividualAppsFromFS apps, (result)=>
+          for callback in @_fetchQueue
+            callback null, @constructor.manifests
           @_fetchQueue = []
     , ->
       warn msg = "Timeout reached for kite request"

        else
          callback? err, apps

  fetchAppsFromFs:(cb)->

    @_fetchQueue.push cb  if cb

    @appStorage.reset()
    @appStorage.setValue 'shortcuts', defaultShortcuts, callback

  putAppsToAppStorage:(apps, callback = noop)->
    apps or= @constructor.manifests
    @appStorage.setValue 'apps', apps, callback

    @appStorage.setValue 'apps', apps

