         domId, tagName, attributes, bind, load
       }).getElement()
 
+      callback null  if type is 'style'
+
   @destroyScriptElement = (type, identifier)->
     (document.getElementById "internal-#{type}-#{identifier}")?.remove()
 
   @appendHeadElements = (options, callback)->
-
     {items, identifier} = options
 
-    stack = []
-    items.forEach ({url, type}, index)->
-      stack.push (cb)->
-        KodingAppsController.appendHeadElement type, {
-          identifier : "#{identifier}-#{index}"
-          callback   : cb
-          url
-        }
-        KD.utils.defer cb  if type is 'style'
-
-    async.series stack, callback
-
+    Promise.reduce(items, (acc, {url, type}, index) =>
+      KodingAppsController.appendHeadElement type, {
+        identifier : "#{identifier}-#{index}"
+        url
+      }
+
+    , 0)
+    # .timeout(5000)
+    # .catch(warn)
+    .nodeify callback
 
   # #
   # MAKE NEW APP


    if app.style
      @appendHeadElement 'style',  \
        { url:app.style, identifier:app.identifier, callback }, yes

    if app.script
      @appendHeadElement 'script', \
        { url:app.script, identifier:app.identifier, callback }, yes

    return



        if type is 'script'
          obj.once 'viewAppended', -> callback null
        else
          callback null

        KD.utils.defer -> obj.appendToSelector 'head'

