diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/avd/AvdManager.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/avd/AvdManager.java
index 9499798..0713e74 100644
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/avd/AvdManager.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/avd/AvdManager.java
@@ -487,7 +487,11 @@
                 if (removePrevious) {
                     // AVD already exists and removePrevious is set, try to remove the
                     // directory's content first (but not the directory itself).
-                    recursiveDelete(avdFolder);
+                    try {
+                        deleteContentOf(avdFolder);
+                    } catch (SecurityException e) {
+                        log.error(e, "Failed to delete %1$s", avdFolder.getAbsolutePath());
+                    }
                 } else {
                     // AVD shouldn't already exist if removePrevious is false.
                     log.error(null,
@@ -712,8 +716,12 @@
                 log.warning("Removing previous AVD directory at %s", oldAvdInfo.getPath());
                 // Remove the old data directory
                 File dir = new File(oldAvdInfo.getPath());
-                recursiveDelete(dir);
-                dir.delete();
+                try {
+                    deleteContentOf(dir);
+                    dir.delete();
+                } catch (SecurityException e) {
+                    log.error(e, "Failed to delete %1$s", dir.getAbsolutePath());
+                }
             }
 
             return newAvdInfo;
@@ -721,14 +729,20 @@
             log.error(e, null);
         } catch (IOException e) {
             log.error(e, null);
+        } catch (SecurityException e) {
+            log.error(e, null);
         } finally {
             if (needCleanup) {
                 if (iniFile != null && iniFile.exists()) {
                     iniFile.delete();
                 }
 
-                recursiveDelete(avdFolder);
-                avdFolder.delete();
+                try {
+                    deleteContentOf(avdFolder);
+                    avdFolder.delete();
+                } catch (SecurityException e) {
+                    log.error(e, "Failed to delete %1$s", avdFolder.getAbsolutePath());
+                }
             }
         }
 
@@ -896,8 +910,7 @@
                 f = new File(path);
                 if (f.exists()) {
                     log.printf("Deleting folder %1$s\n", f.getCanonicalPath());
-                    recursiveDelete(f);
-                    if (!f.delete()) {
+                    if (deleteContentOf(f) == false || f.delete() == false) {
                         log.error(null, "Failed to delete %1$s\n", f.getCanonicalPath());
                         error = true;
                     }
@@ -918,6 +931,8 @@
             log.error(e, null);
         } catch (IOException e) {
             log.error(e, null);
+        } catch (SecurityException e) {
+            log.error(e, null);
         }
         return false;
     }
@@ -991,13 +1006,20 @@
      *
      * @throws SecurityException like {@link File#delete()} does if file/folder is not writable.
      */
-    public void recursiveDelete(File folder) {
+    private boolean deleteContentOf(File folder) throws SecurityException {
         for (File f : folder.listFiles()) {
             if (f.isDirectory()) {
-                recursiveDelete(folder);
+                if (deleteContentOf(f) == false) {
+                    return false;
+                }
             }
-            f.delete();
+            if (f.delete() == false) {
+                return false;
+            }
+
         }
+
+        return true;
     }
 
     /**
