 
   # ### Compile App
   #
-  compileApp: (callback) ->
-    new KDNotificationView
-      title: 'Compiling...'
+  compileApp: (callback=->) ->
+    {
+      appName
+      vmName
+    } = @options.targetApp
+    notify "Compiling '#{appName}'..."
 
     KD.singletons.vmController.run
-      vmName    : @options.vmName
-      withArgs  : "kdc #{Settings.APP_DIR}"
+      vmName    : vmName
+      withArgs  : "kdc ~/Applications/#{appName}"
       (err, res) ->
         # Currently ignoring the response of kdc.
         callback err
 
+  # ### Load App
+  #
+  loadApp: (callback=->) ->
+    console.log "Wtf?"
+    console.log @options
+    {
+      appName
+      vmName
+    } = @options.targetApp
+    notify "Loading '#{appName}'..."
+
+    @appIndexHelper = FSHelper.createFileFromPath(
+      "[#{vmName}]~/Applications/#{appName}"
+    )
+    @appIndexHelper.exists (err, exists) =>
+      if exists
+        @previewApp callback
+      else
+        @compileApp (err) =>
+          if err? then return callback err
+          @previewApp callback
+
 
   # ### Preview App
   #
-  previewApp: ->
-    new KDNotificationView
-      title: 'Loading preview...'
+  previewApp: (callback=->) ->
+    {
+      appName
+      vmName
+    } = @options.targetApp
+    notify "Previewing '#{appName}'..."
 
-    @indexjsHelper.fetchContents (err, res) =>
-      if err? then new KDNotificationView title: err.message
+    @appIndexHelper.fetchContents (err, res) =>
+      if err? then return callback err
       console.log 'Fetched! '+ res?.length
 
       # By destroying the subviews, we ensure (or try to) that the newly


    @previewView = new KDView()


    @addSubView new KDSplitView
      type      : 'horizontal'
      resizable : false

    KD.singletons.vmController.run
      vmName    : @options.vmName
      withArgs  : "ls ~/Applications"
      (err, res) =>
        if err? then notify err.message; return
        kdAppNames = res.split('\n')[..-1]
        kdAppNameOpt = []
