diff --git a/app/build.gradle b/app/build.gradle
index 3a873f408c1a688feda4236366da2576bb0fc044..cd0208e483232d0fc582ce42f9acc4886e24479d 100755
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -10,8 +10,8 @@ android {
         minSdkVersion 8
         targetSdkVersion 23
 
-        versionCode 117
-        versionName "6.1c"
+        versionCode 119
+        versionName "6.1g"
     }
 
     buildTypes {
@@ -49,5 +49,5 @@ android {
     }
 }
 dependencies {
-    compile files('libs/anrwatchdog-1.3.0.jar')
+//    compile files('libs/anrwatchdog-1.3.0.jar')
 }
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 64565b3e497f219d4a4ad2cfbb586e119eaf55f9..ba66070dfb8fa407843994f5479030316e3cd4ce 100755
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -15,7 +15,6 @@
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.CAMERA" />
     <uses-permission android:name="android.permission.CALL_PHONE" />
     <uses-permission android:name="android.permission.SEND_SMS" />
     <uses-permission android:name="android.permission.READ_CONTACTS" />
diff --git a/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java b/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java
index 026e47350083c0f0b3bb22fd5134d8dabe6b6696..b66e36e926666b6e036f9bf8937d571dc308aa10 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java
@@ -23,9 +23,6 @@ import android.view.ViewGroup;
 import android.view.WindowManager;
 import android.widget.Toast;
 
-import com.github.anrwatchdog.ANRError;
-import com.github.anrwatchdog.ANRWatchDog;
-
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
@@ -150,18 +147,16 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable {
 
     private void finishOnCreate() {
 
-        new ANRWatchDog(5000)
-                .setANRListener(new ANRWatchDog.ANRListener() {
-                    @Override
-                    public void onAppNotResponding(ANRError anrError) {
-                        Tuils.log(anrError);
-                        Tuils.toFile(anrError);
-
-                        Toast.makeText(LauncherActivity.this, R.string.anr, Toast.LENGTH_LONG).show();
-                    }
-                })
-                .setReportMainThreadOnly()
-                .start();
+//        new ANRWatchDog(5000)
+//                .setANRListener(new ANRWatchDog.ANRListener() {
+//                    @Override
+//                    public void onAppNotResponding(ANRError anrError) {
+//                        Tuils.log(anrError);
+//                        Tuils.toFile(anrError);
+//                    }
+//                })
+//                .setReportMainThreadOnly()
+//                .start();
 
         Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
             @Override
@@ -392,7 +387,7 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable {
     @Override
     public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
         if(permissions.length > 0 && permissions[0].equals(Manifest.permission.READ_CONTACTS) && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
-            ContactManager.refreshContacts(main.getMainPack().contacts, this);
+            main.getMainPack().contacts.refreshContacts(this);
         }
 
         try {
diff --git a/app/src/main/java/ohi/andre/consolelauncher/MainManager.java b/app/src/main/java/ohi/andre/consolelauncher/MainManager.java
index 23df1559dddb413cd6a4c8f0bb176b7192645c90..7e9dc513038babb79b01b7457e605fc1b3987540 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/MainManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/MainManager.java
@@ -392,7 +392,6 @@ public class MainManager {
                     } catch (Exception e) {
                         out.onOutput(Tuils.getStackTrace(e));
                         Tuils.log(e);
-                        Tuils.toFile(e);
                     }
                 }
             }.start();
diff --git a/app/src/main/java/ohi/andre/consolelauncher/UIManager.java b/app/src/main/java/ohi/andre/consolelauncher/UIManager.java
index 58ab51bce65c6d642b2a1b9124b49f8aa620a7bf..1d8f4c897a3fe017b59701b6ed7168a8c9ea3ee5 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/UIManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/UIManager.java
@@ -46,6 +46,7 @@ import ohi.andre.consolelauncher.tuils.TimeManager;
 import ohi.andre.consolelauncher.tuils.Tuils;
 import ohi.andre.consolelauncher.tuils.interfaces.CommandExecuter;
 import ohi.andre.consolelauncher.tuils.interfaces.Hintable;
+import ohi.andre.consolelauncher.tuils.interfaces.OnBatteryUpdate;
 import ohi.andre.consolelauncher.tuils.interfaces.OnRedirectionListener;
 import ohi.andre.consolelauncher.tuils.interfaces.Rooter;
 import ohi.andre.consolelauncher.tuils.interfaces.SuggestionViewDecorer;
@@ -55,7 +56,6 @@ import ohi.andre.consolelauncher.tuils.stuff.TrashInterfaces;
 public class UIManager implements OnTouchListener {
 
     private final int RAM_DELAY = 3000;
-    private final int BATTERY_DELAY = 20 * 1000;
     private final int TIME_DELAY = 1000;
     private final int STORAGE_DELAY = 60 * 1000;
 
@@ -102,10 +102,10 @@ public class UIManager implements OnTouchListener {
         }
     };
 
-    private Runnable batteryRunnable = new Runnable() {
+    private OnBatteryUpdate batteryUpdate = new OnBatteryUpdate() {
         @Override
-        public void run() {
-            int percentage = Tuils.getBatteryPercentage(mContext);
+        public void update(float p) {
+            int percentage = (int) p;
 
             if(skinManager.manyColorsBattery) {
                 if(percentage > mediumPercentage) battery.setTextColor(skinManager.battery_color_high);
@@ -119,8 +119,6 @@ public class UIManager implements OnTouchListener {
 
             String cp = batteryFormat.replaceAll("%[vV]", String.valueOf(percentage)).replaceAll("%[nN]", Tuils.NEWLINE);
             battery.setText(cp);
-
-            battery.postDelayed(batteryRunnable, BATTERY_DELAY);
         }
     };
 
@@ -487,7 +485,7 @@ public class UIManager implements OnTouchListener {
         component = new ComponentName(context, PolicyReceiver.class);
 
         multipleCmdSeparator = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.multiple_cmd_separator);
-        selectFirstSuggestionEnter = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.enter_first_suggestion);
+//        selectFirstSuggestionEnter = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.enter_first_suggestion);
 
         mContext = context;
         this.info = (MainPack) info;
@@ -636,7 +634,7 @@ public class UIManager implements OnTouchListener {
             battery.setTextSize(skinManager.getTextSize());
             battery.setTypeface(skinManager.systemFont ? Typeface.DEFAULT : lucidaConsole);
 
-            battery.post(batteryRunnable);
+            Tuils.registerBatteryReceiver(context, batteryUpdate);
         } else {
             battery.setVisibility(View.GONE);
         }
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandsPreferences.java b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandsPreferences.java
index 1e500d93c328d60de7248b7d2c3f089e05d9cdd2..80f9b13193ab3b95ee451f189ce9c670f4e492ed 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandsPreferences.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandsPreferences.java
@@ -1,5 +1,7 @@
 package ohi.andre.consolelauncher.commands;
 
+import android.util.SparseArray;
+
 import java.util.HashMap;
 
 import ohi.andre.consolelauncher.managers.XMLPrefsManager;
@@ -28,12 +30,10 @@ public class CommandsPreferences {
     }
 
     public class Preference {
-        HashMap<Integer, String> prefs = new HashMap<>();
-
+        SparseArray<String> prefs = new SparseArray<>();
         public void add(String pref, int id) {
             prefs.put(id, pref);
         }
-
         public String get(int id) {
             return prefs.get(id);
         }
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/config.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/config.java
index c2bfd707c16e7f4d7c6e9c2e01f49f5d9a92565c..b67edce43906361445c5b1ada1ffcb25a179151b 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/config.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/config.java
@@ -61,6 +61,19 @@ public class config extends ParamCommand {
                 if(s.length() == 0) return "\"\"";
                 return s;
             }
+        },
+        reset {
+            @Override
+            public int[] args() {
+                return new int[] {CommandAbstraction.CONFIG_ENTRY};
+            }
+
+            @Override
+            public String exec(ExecutePack pack) {
+                XMLPrefsManager.XMLPrefsSave save = pack.get(XMLPrefsManager.XMLPrefsSave.class, 1);
+                save.parent().write(save, save.defaultValue());
+                return null;
+            }
         };
 
         static Param get(String p) {
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/notifications.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/notifications.java
index 39ee7fa1868867588f251118dc7a95027445de7a..d6c570d08a2344dcedb64f290cf99bfbc30ef904 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/notifications.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/notifications.java
@@ -1,8 +1,6 @@
 package ohi.andre.consolelauncher.commands.main.raw;
 
 import android.content.Intent;
-import android.os.Build;
-import android.provider.Settings;
 
 import java.io.File;
 
@@ -122,7 +120,7 @@ public class notifications extends ParamCommand {
             @Override
             public String exec(ExecutePack pack) {
                 try {
-                    pack.context.startActivity(new Intent(Build.VERSION.SDK_INT >= 22 ? Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS : "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"));
+                    pack.context.startActivity(new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"));
                 } catch (Exception e) {
                     return pack.context.getString(R.string.activity_not_found);
                 }
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/refresh.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/refresh.java
index 39333e5c7b2cbd6f6ab00ebd849427a9e6bb89fa..7137a12093fbd91198a221c487b439fb94747dff 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/refresh.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/refresh.java
@@ -4,7 +4,6 @@ import ohi.andre.consolelauncher.R;
 import ohi.andre.consolelauncher.commands.CommandAbstraction;
 import ohi.andre.consolelauncher.commands.ExecutePack;
 import ohi.andre.consolelauncher.commands.main.MainPack;
-import ohi.andre.consolelauncher.managers.ContactManager;
 
 public class refresh implements CommandAbstraction {
 
@@ -14,7 +13,7 @@ public class refresh implements CommandAbstraction {
         info.appsManager.fill();
         info.aliasManager.reload();
         info.player.refresh(info.context);
-        ContactManager.refreshContacts(info.contacts, info.context);
+        info.contacts.refreshContacts(info.context);
 
         return info.res.getString(R.string.output_refresh);
     }
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/AliasManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/AliasManager.java
index 3c9fb41747496054665b4dbbfe2b4237985e3efa..f77cda65eb5ef35f887acd766a176c89ff727865 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/AliasManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/AliasManager.java
@@ -28,8 +28,8 @@ public class AliasManager implements Reloadable {
     public AliasManager() {
         reload();
 
-        paramMarker = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.alias_param_marker);
-        paramSeparator = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.alias_param_separator);
+        paramMarker = Pattern.quote(XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.alias_param_marker));
+        paramSeparator = Pattern.quote(XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.alias_param_separator));
         aliasLabelFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.alias_content_format);
     }
 
@@ -76,13 +76,11 @@ public class AliasManager implements Reloadable {
     public String format(String aliasValue, String params) {
         params = params.trim();
 
-        String quoted = Pattern.quote(paramSeparator);
-
         if(params.length() == 0) return aliasValue;
-        String[] split = params.split(quoted);
+        String[] split = params.split(paramSeparator);
 
         for(String s : split) {
-            aliasValue = aliasValue.replaceFirst(quoted, s);
+            aliasValue = aliasValue.replaceFirst(paramMarker, s);
         }
 
         return aliasValue;
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/AppsManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/AppsManager.java
index 0ce46709bb7d6b3043e064bc5d613062dde8cce5..0bd0bf729780bc6b31473cd4a4ddf7db465e1d0a 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/AppsManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/AppsManager.java
@@ -9,10 +9,8 @@ import android.content.SharedPreferences;
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
-import android.os.AsyncTask;
 import android.os.Build;
 import android.support.annotation.NonNull;
 
@@ -26,10 +24,8 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.regex.Pattern;
 
 import javax.xml.parsers.DocumentBuilder;
@@ -57,7 +53,6 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
     private final String SHOW_ATTRIBUTE = "show";
 
     private Context context;
-    private PackageManager pkgManager;
     private File folder;
 
     private AppsHolder appsHolder;
@@ -123,11 +118,6 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
         public boolean is(String s) {
             return name().equals(s);
         }
-
-        @Override
-        public String hasReplaced() {
-            return null;
-        }
     }
 
     @Override
@@ -163,7 +153,6 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
         instance = this;
 
         this.context = context;
-        this.pkgManager = context.getPackageManager();
 
         this.outputable = outputable;
 
@@ -173,18 +162,15 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
         this.folder = Tuils.getFolder();
         initAppListener(context);
 
-        new AsyncTask<Void,Void,Void>() {
+        new Thread() {
             @Override
-            protected Void doInBackground(Void... params) {
-                fill();
-                return null;
-            }
+            public void run() {
+                super.run();
 
-            @Override
-            protected void onPostExecute(Void aVoid) {
+                fill();
                 s.requestUpdate();
             }
-        }.execute();
+        }.start();
     }
 
     private void initAppListener(Context c) {
@@ -200,20 +186,15 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
         List<LaunchInfo> allApps = createAppMap(context.getPackageManager());
         hiddenApps = new ArrayList<>();
 
-        Map<String, XMLPrefsManager.XMLPrefsSave> replacedValues = new HashMap<>();
-        for(XMLPrefsManager.XMLPrefsSave s : Options.values()) {
-            String r = s.hasReplaced();
-            if(r != null) replacedValues.put(r, s);
-        }
+        try {
 
-        defaultApps = new XMLPrefsManager.XMLPrefsList();
+            defaultApps = new XMLPrefsManager.XMLPrefsList();
 
-        try {
             DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
             DocumentBuilder builder = factory.newDocumentBuilder();
 
             File file = new File(folder, PATH);
-            if(!file.exists() && !file.createNewFile()) return;
+            if (!file.exists() && !file.createNewFile()) return;
 
             Document d;
             try {
@@ -226,7 +207,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
             List<AppsManager.Options> enums = new ArrayList<>(Arrays.asList(AppsManager.Options.values()));
 
             Element root = (Element) d.getElementsByTagName(NAME).item(0);
-            if(root == null) {
+            if (root == null) {
                 resetFile(file, NAME);
 
                 d = builder.parse(file);
@@ -234,57 +215,51 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
             }
 
             NodeList nodes = root.getElementsByTagName("*");
-            for(int count = 0; count < nodes.getLength(); count++) {
+            for (int count = 0; count < nodes.getLength(); count++) {
                 Node node = nodes.item(count);
 
                 String nn = node.getNodeName();
                 int nodeIndex = Tuils.find(nn, (List) enums);
-                if(nodeIndex != -1) {
+                if (nodeIndex != -1) {
                     defaultApps.add(nn, node.getAttributes().getNamedItem(VALUE_ATTRIBUTE).getNodeValue());
 
-                    for(int en = 0; en < enums.size(); en++) {
-                        if(enums.get(en).label().equals(nn)) {
+                    for (int en = 0; en < enums.size(); en++) {
+                        if (enums.get(en).label().equals(nn)) {
                             enums.remove(en);
                             break;
                         }
                     }
-                } else if(replacedValues.containsKey(nn)) {
-                    XMLPrefsManager.XMLPrefsSave s = replacedValues.remove(nn);
-
-                    Element e = (Element) node;
-                    String oldValue = e.hasAttribute(VALUE_ATTRIBUTE) ? e.getAttribute(VALUE_ATTRIBUTE) : null;
-                    root.removeChild(e);
-
-                    replacedValues.put(oldValue, s);
                 }
 //                todo support delete
                 else {
-                    if(node.getNodeType() == Node.ELEMENT_NODE) {
+                    if (node.getNodeType() == Node.ELEMENT_NODE) {
                         Element e = (Element) node;
 
                         boolean shown = !e.hasAttribute(SHOW_ATTRIBUTE) || Boolean.parseBoolean(e.getAttribute(SHOW_ATTRIBUTE));
-                        if(!shown) {
+                        if (!shown) {
                             ComponentName name = null;
 
                             String[] split = nn.split("-");
-                            if(split.length >= 2) {
+                            if (split.length >= 2) {
                                 name = new ComponentName(split[0], split[1]);
-                            } else if(split.length == 1) {
-                                if(split[0].contains("Activity")) {
-                                    for(LaunchInfo i : allApps) {
-                                        if(i.componentName.getClassName().equals(split[0])) name = i.componentName;
+                            } else if (split.length == 1) {
+                                if (split[0].contains("Activity")) {
+                                    for (LaunchInfo i : allApps) {
+                                        if (i.componentName.getClassName().equals(split[0]))
+                                            name = i.componentName;
                                     }
                                 } else {
-                                    for(LaunchInfo i : allApps) {
-                                        if(i.componentName.getPackageName().equals(split[0])) name = i.componentName;
+                                    for (LaunchInfo i : allApps) {
+                                        if (i.componentName.getPackageName().equals(split[0]))
+                                            name = i.componentName;
                                     }
                                 }
                             }
 
-                            if(name == null) continue;
+                            if (name == null) continue;
 
                             LaunchInfo removed = AppUtils.findLaunchInfoWithComponent(allApps, name);
-                            if(removed != null) {
+                            if (removed != null) {
                                 allApps.remove(removed);
                                 hiddenApps.add(removed);
                             }
@@ -293,14 +268,9 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
                 }
             }
 
-            if(enums.size() > 0) {
-                Set<Map.Entry<String, XMLPrefsManager.XMLPrefsSave>> es = replacedValues.entrySet();
-                for(XMLPrefsManager.XMLPrefsSave s : enums) {
-                    String value = null;
-                    for(Map.Entry<String, XMLPrefsManager.XMLPrefsSave> e : es) {
-                        if(e.getValue().equals(s)) value = e.getKey();
-                    }
-                    if(value == null) value = s.defaultValue();
+            if (enums.size() > 0) {
+                for (XMLPrefsManager.XMLPrefsSave s : enums) {
+                    String value = s.defaultValue();
 
                     Element em = d.createElement(s.label());
                     em.setAttribute(VALUE_ATTRIBUTE, value);
@@ -310,35 +280,38 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
                 }
                 writeTo(d, file);
             }
-        } catch (Exception e) {
-            Tuils.toFile(e);
-        }
 
-        for(Map.Entry<String, ?> entry : this.preferences.getAll().entrySet()) {
-            Object value = entry.getValue();
-            if (value instanceof Integer) {
-                ComponentName name = null;
+            for (Map.Entry<String, ?> entry : this.preferences.getAll().entrySet()) {
+                Object value = entry.getValue();
+                if (value instanceof Integer) {
+                    ComponentName name = null;
 
-                String[] split = entry.getKey().split("-");
-                if(split.length >= 2) {
-                    name = new ComponentName(split[0], split[1]);
-                } else if(split.length == 1) {
-                    if(split[0].contains("Activity")) {
-                        for(LaunchInfo i : allApps) {
-                            if(i.componentName.getClassName().equals(split[0])) name = i.componentName;
-                        }
-                    } else {
-                        for(LaunchInfo i : allApps) {
-                            if(i.componentName.getPackageName().equals(split[0])) name = i.componentName;
+                    String[] split = entry.getKey().split("-");
+                    if (split.length >= 2) {
+                        name = new ComponentName(split[0], split[1]);
+                    } else if (split.length == 1) {
+                        if (split[0].contains("Activity")) {
+                            for (LaunchInfo i : allApps) {
+                                if (i.componentName.getClassName().equals(split[0]))
+                                    name = i.componentName;
+                            }
+                        } else {
+                            for (LaunchInfo i : allApps) {
+                                if (i.componentName.getPackageName().equals(split[0]))
+                                    name = i.componentName;
+                            }
                         }
                     }
-                }
 
-                if(name == null) continue;
+                    if (name == null) continue;
 
-                LaunchInfo info = AppUtils.findLaunchInfoWithComponent(allApps, name);
-                if(info != null) info.launchedTimes = (Integer) value;
+                    LaunchInfo info = AppUtils.findLaunchInfoWithComponent(allApps, name);
+                    if (info != null) info.launchedTimes = (Integer) value;
+                }
             }
+
+        } catch (Exception e1) {
+            Tuils.toFile(e1);
         }
 
         appsHolder = new AppsHolder(allApps, defaultApps);
@@ -378,7 +351,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
             appsHolder.add(app);
 
             outputable.onOutput(context.getString(R.string.app_installed) + Tuils.SPACE + packageName);
-        } catch (NameNotFoundException e) {}
+        } catch (Exception e) {}
     }
 
     private void appUninstalled(String packageName) {
@@ -789,8 +762,10 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
             return null;
         }
 
+        private static Pattern removeSpacePattern = Pattern.compile("\\s+");
         public static LaunchInfo findLaunchInfoWithLabel(List<LaunchInfo> appList, String label) {
-            for(LaunchInfo i : appList) if(i.publicLabel.equalsIgnoreCase(label.trim())) return i;
+            label = removeSpacePattern.matcher(label).replaceAll(Tuils.EMPTYSTRING);
+            for(LaunchInfo i : appList) if(removeSpacePattern.matcher(i.publicLabel).replaceAll(Tuils.EMPTYSTRING).equalsIgnoreCase(label)) return i;
             return null;
         }
 
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/ContactManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/ContactManager.java
index 10e8aa736aa554369b8e6c0d9d26cd9adb9d53da..94c988dd669cc95c353ac632dd18e2b69de179fb 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/ContactManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/ContactManager.java
@@ -25,81 +25,95 @@ public class ContactManager {
 
     public ContactManager(Context context) {
         this.context = context;
-    }
 
-    public static void refreshContacts(ContactManager mgr, Context context) {
-        List<Contact> contacts = new ArrayList<>();
+        if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
+            refreshContacts(context);
+        }
+    }
 
+    public void refreshContacts(final Context context) {
         if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
             ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_CONTACTS}, LauncherActivity.COMMAND_SUGGESTION_REQUEST_PERMISSION);
-            mgr.contacts = contacts;
             return;
         }
 
-        Cursor phones = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
-                new String[] {ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Data.CONTACT_ID, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.Data.IS_SUPER_PRIMARY,}, null, null,
-                ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
+        new Thread() {
+            @Override
+            public void run() {
+                super.run();
 
-        if (phones != null) {
+                if(contacts == null) {
+                    contacts = new ArrayList<>();
+                } else {
+                    contacts.clear();
+                }
+                List<Contact> contacts = ContactManager.this.contacts;
 
-            int lastId = -1;
-            List<String> lastNumbers = new ArrayList<>();
-            List<String> nrml = new ArrayList<>();
-            int defaultNumber = 0;
-            String name = null, number;
-            int id, prim;
+                Cursor phones = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
+                        new String[] {ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Data.CONTACT_ID, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.Data.IS_SUPER_PRIMARY,}, null, null,
+                        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
 
-            while (phones.moveToNext()) {
-                id = phones.getInt(phones.getColumnIndex(ContactsContract.Data.CONTACT_ID));
-                number = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
+                if (phones != null) {
 
-                prim = phones.getInt(phones.getColumnIndex(ContactsContract.Data.IS_SUPER_PRIMARY));
-                if(prim > 0) {
-                    defaultNumber = lastNumbers.size();
-                }
+                    int lastId = -1;
+                    List<String> lastNumbers = new ArrayList<>();
+                    List<String> nrml = new ArrayList<>();
+                    int defaultNumber = 0;
+                    String name = null, number;
+                    int id, prim;
 
-                if(number == null || number.length() == 0) continue;
+                    while (phones.moveToNext()) {
+                        id = phones.getInt(phones.getColumnIndex(ContactsContract.Data.CONTACT_ID));
+                        number = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
 
-                if(phones.isFirst()) {
-                    lastId = id;
-                    name = phones.getString(phones.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
-                } else if(id != lastId || phones.isLast()) {
-                    lastId = id;
+                        prim = phones.getInt(phones.getColumnIndex(ContactsContract.Data.IS_SUPER_PRIMARY));
+                        if(prim > 0) {
+                            defaultNumber = lastNumbers.size();
+                        }
 
-                    contacts.add(new Contact(name, lastNumbers, defaultNumber));
+                        if(number == null || number.length() == 0) continue;
 
-                    lastNumbers = new ArrayList<>();
-                    nrml = new ArrayList<>();
-                    name = null;
-                    defaultNumber = 0;
+                        if(phones.isFirst()) {
+                            lastId = id;
+                            name = phones.getString(phones.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
+                        } else if(id != lastId || phones.isLast()) {
+                            lastId = id;
 
-                    name = phones.getString(phones.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
-                }
+                            contacts.add(new Contact(name, lastNumbers, defaultNumber));
 
-                String normalized = number.replaceAll(Tuils.SPACE, Tuils.EMPTYSTRING);
-                if(!nrml.contains(normalized)) {
-                    nrml.add(normalized);
-                    lastNumbers.add(number);
-                }
+                            lastNumbers = new ArrayList<>();
+                            nrml = new ArrayList<>();
+                            name = null;
+                            defaultNumber = 0;
 
-                if(name != null && phones.isLast()) {
-                    contacts.add(new Contact(name, lastNumbers, defaultNumber));
+                            name = phones.getString(phones.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
+                        }
+
+                        String normalized = number.replaceAll(Tuils.SPACE, Tuils.EMPTYSTRING);
+                        if(!nrml.contains(normalized)) {
+                            nrml.add(normalized);
+                            lastNumbers.add(number);
+                        }
+
+                        if(name != null && phones.isLast()) {
+                            contacts.add(new Contact(name, lastNumbers, defaultNumber));
+                        }
+                    }
+                    phones.close();
                 }
-            }
-            phones.close();
-        }
 
-        List<Contact> cp = new ArrayList<>(contacts);
-        for(int count = 0; count < cp.size(); count++) {
-            if(cp.get(count).numbers.size() == 0) contacts.remove(count--);
-        }
+                List<Contact> cp = new ArrayList<>(contacts);
+                for(int count = 0; count < cp.size(); count++) {
+                    if(cp.get(count).numbers.size() == 0) contacts.remove(count--);
+                }
 
-        mgr.contacts = contacts;
-        Collections.sort(mgr.contacts);
+                Collections.sort(contacts);
+            }
+        }.start();
     }
 
     public List<String> listNames() {
-        if(contacts == null || contacts.size() == 0) refreshContacts(this, context);
+        if(contacts == null || contacts.size() == 0) refreshContacts(context);
 
         List<String> names = new ArrayList<>();
         for(Contact c : contacts) names.add(c.name);
@@ -107,13 +121,13 @@ public class ContactManager {
     }
 
     public List<Contact> getContacts() {
-        if(contacts == null || contacts.size() == 0) refreshContacts(this, context);
+        if(contacts == null || contacts.size() == 0) refreshContacts(context);
 
         return contacts;
     }
 
     public List<String> listNamesAndNumbers() {
-        if(contacts == null || contacts.size() == 0) refreshContacts(this, context);
+        if(contacts == null || contacts.size() == 0) refreshContacts(context);
 
         List<String> c = new ArrayList<>();
 
@@ -211,7 +225,7 @@ public class ContactManager {
     }
 
     public String findNumber(String name) {
-        if(contacts == null) refreshContacts(this, context);
+        if(contacts == null) refreshContacts(context);
 
         for(int count = 0; count < contacts.size(); count++) {
             Contact c = contacts.get(count);
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/SkinManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/SkinManager.java
index c5e48fc5a2521c9155792cce7bde950d1d9e9c28..4708be10ba65f99b339d16798a6613d6a346c0a1 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/SkinManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/SkinManager.java
@@ -77,7 +77,7 @@ public class SkinManager implements Parcelable {
 
             suggDefaultText = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.default_text_color);
             suggDefaultBg = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.default_bg_color);
-            transparentSuggestions = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Suggestions.transparent);
+            transparentSuggestions = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Suggestions.transparent_suggestions);
 
             if(transparentSuggestions && suggDefaultText == bgColor) {
                 suggDefaultText = Color.GREEN;
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java
index 834cf049f6db9149c17230955c295a32f5b96425..48cea170df27c39107a02679ddf772b067c4c6b8 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java
@@ -1,7 +1,6 @@
 package ohi.andre.consolelauncher.managers;
 
 import android.graphics.Color;
-import android.util.Log;
 
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -13,10 +12,7 @@ import java.io.FileOutputStream;
 import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
 import java.util.regex.Pattern;
 
 import javax.xml.parsers.DocumentBuilder;
@@ -26,7 +22,6 @@ import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 
-import ohi.andre.consolelauncher.managers.notifications.NotificationManager;
 import ohi.andre.consolelauncher.tuils.Tuils;
 
 public class XMLPrefsManager {
@@ -40,7 +35,6 @@ public class XMLPrefsManager {
         String label();
         XmlPrefsElement parent();
         boolean is(String s);
-        String hasReplaced();
     }
 
     public enum Theme implements XMLPrefsSave {
@@ -144,11 +138,6 @@ public class XMLPrefsManager {
         public boolean is(String s) {
             return name().equals(s);
         }
-
-        @Override
-        public String hasReplaced() {
-            return null;
-        }
     }
 
     public enum Ui implements XMLPrefsSave {
@@ -318,11 +307,6 @@ public class XMLPrefsManager {
         public boolean is(String s) {
             return name().equals(s);
         }
-
-        @Override
-        public String hasReplaced() {
-            return null;
-        }
     }
 
     public enum Toolbar implements XMLPrefsSave {
@@ -332,11 +316,6 @@ public class XMLPrefsManager {
             public String defaultValue() {
                 return "true";
             }
-
-            @Override
-            public String hasReplaced() {
-                return "enabled";
-            }
         };
 
         @Override
@@ -362,13 +341,8 @@ public class XMLPrefsManager {
             public String defaultValue() {
                 return "true";
             }
-
-            @Override
-            public String hasReplaced() {
-                return "enabled";
-            }
         },
-        transparent {
+        transparent_suggestions {
             @Override
             public String defaultValue() {
                 return "false";
@@ -485,11 +459,6 @@ public class XMLPrefsManager {
         public boolean is(String s) {
             return name().equals(s);
         }
-
-        @Override
-        public String hasReplaced() {
-            return null;
-        }
     }
 
     public enum Behavior implements XMLPrefsSave {
@@ -679,12 +648,6 @@ public class XMLPrefsManager {
             public String defaultValue() {
                 return "%a --> [%v]";
             }
-        },
-        enter_first_suggestion {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
         };
 
         @Override
@@ -701,11 +664,6 @@ public class XMLPrefsManager {
         public boolean is(String s) {
             return name().equals(s);
         }
-
-        @Override
-        public String hasReplaced() {
-            return null;
-        }
     }
 
     public enum Cmd implements XMLPrefsSave {
@@ -731,11 +689,6 @@ public class XMLPrefsManager {
         public boolean is(String s) {
             return name().equals(s);
         }
-
-        @Override
-        public String hasReplaced() {
-            return null;
-        }
     }
 
     public enum XMLPrefsRoot implements XmlPrefsElement {
@@ -755,7 +708,7 @@ public class XMLPrefsManager {
         TOOLBAR("toolbar.xml", Toolbar.values()) {
             @Override
             public String[] deleted() {
-                return new String[0];
+                return new String[] {"enabled"};
             }
         },
         UI("ui.xml", Ui.values()) {
@@ -773,7 +726,7 @@ public class XMLPrefsManager {
         SUGGESTIONS("suggestions.xml", Suggestions.values()) {
             @Override
             public String[] deleted() {
-                return new String[0];
+                return new String[] {"transparent", "enabled"};
             }
         };
 
@@ -891,13 +844,8 @@ public class XMLPrefsManager {
             List<XMLPrefsSave> enums = element.enums;
             if(enums == null) continue;
 
-            Map<String, XMLPrefsManager.XMLPrefsSave> replacedValues = new HashMap<>();
-            for(XMLPrefsManager.XMLPrefsSave s : NotificationManager.Options.values()) {
-                String r = s.hasReplaced();
-                if(r != null) replacedValues.put(r, s);
-            }
-
             String[] deleted = element.deleted();
+            boolean needToWrite = false;
 
             Element root = (Element) d.getElementsByTagName(element.name()).item(0);
             if(root == null) {
@@ -917,37 +865,26 @@ public class XMLPrefsManager {
                     if(enums.get(en).label().equals(nn)) {
                         enums.remove(en);
                         break;
-                    } else if(replacedValues.containsKey(nn)) {
-                        XMLPrefsManager.XMLPrefsSave s = replacedValues.remove(nn);
-
-                        Element e = (Element) node;
-                        String oldValue = e.hasAttribute(VALUE_ATTRIBUTE) ? e.getAttribute(VALUE_ATTRIBUTE) : null;
-                        root.removeChild(e);
-
-                        replacedValues.put(oldValue, s);
                     } else if(deleted != null) {
                         int index = Tuils.find(nn, deleted);
                         if(index != -1) {
                             deleted[index] = null;
                             Element e = (Element) node;
                             root.removeChild(e);
+
+                            needToWrite = true;
                         }
                     }
                 }
             }
 
-            if(enums.size() == 0) continue;
-
-            Set<Map.Entry<String, XMLPrefsSave>> es = replacedValues.entrySet();
+            if(enums.size() == 0) {
+                if(needToWrite) writeTo(d, file);
+                continue;
+            }
 
             for(XMLPrefsSave s : enums) {
-                String value = null;
-                for(Map.Entry<String, XMLPrefsManager.XMLPrefsSave> e : es) {
-                    if(e.getValue().equals(s)) value = e.getKey();
-                }
-                if(value == null) {
-                    value = s.defaultValue();
-                }
+                String value = s.defaultValue();
 
                 Element em = d.createElement(s.label());
                 em.setAttribute(VALUE_ATTRIBUTE, value);
@@ -1088,7 +1025,8 @@ public class XMLPrefsManager {
 
             writeTo(d, file);
         } catch (Exception e) {
-            Log.e("andre", "", e);
+            Tuils.log(e);
+            Tuils.toFile(e);
             return e.toString();
         }
         return null;
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicManager.java
index 1e9a4ac7667f215d949365d9d9b23244d51819c8..0e28f8e6854306b5e49d0ee903e4de8451e01e61 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicManager.java
@@ -1,11 +1,15 @@
 package ohi.andre.consolelauncher.managers.music;
 
 import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.database.Cursor;
 import android.media.MediaPlayer;
 import android.media.MediaPlayer.OnCompletionListener;
+import android.net.Uri;
+import android.provider.MediaStore;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -45,6 +49,7 @@ public class MusicManager implements OnCompletionListener {
         try {
             this.mp = new MediaPlayer();
             this.mp.setOnCompletionListener(this);
+            this.files = new ArrayList<>();
 
             this.outputable = outputable;
 
@@ -74,13 +79,9 @@ public class MusicManager implements OnCompletionListener {
         return prepareSong(currentSongIndex);
     }
 
-    //	return a song by incomplete name
-//    public String getSong(String s) {
-//        return s;
-//    }
-
-    //	return the path by complete name
     public String getPath(String name) {
+        if(files == null) return null;
+
         int count = 0;
         File file = files.get(count);
         while(!file.getName().equals(name)) {
@@ -208,11 +209,54 @@ public class MusicManager implements OnCompletionListener {
 
     public void refresh(Context c) {
         if(fromMediastore) {
-            files = Tuils.getMediastoreSongs(c);
+            fillFromMediaStore(c, files);
         } else {
-            files = Tuils.getSongsInFolder(songsFolder);
+            fillFromDir(files, songsFolder);
         }
+    }
 
+    private static void fillFromMediaStore(final Context c, final List<File> files) {
+        files.clear();
+
+        new Thread() {
+            @Override
+            public void run() {
+                ContentResolver cr = c.getContentResolver();
+
+                Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
+                String selection = MediaStore.Audio.Media.IS_MUSIC + "!= 0";
+                String sortOrder = MediaStore.Audio.Media.TITLE + " ASC";
+                Cursor cur = cr.query(uri, null, selection, null, sortOrder);
+                int count = 0;
+
+                if(cur != null) {
+                    count = cur.getCount();
+                    if(count > 0) {
+                        while(cur.moveToNext()) {
+                            String data = cur.getString(cur.getColumnIndex(MediaStore.Audio.Media.DATA));
+                            if(data != null) {
+                                try {
+                                    files.add(new File(data));
+                                } catch (Exception e) {}
+                            }
+                        }
+                    }
+
+                    cur.close();
+                }
+            }
+        }.start();
+    }
+
+    private static void fillFromDir(final List<File> files, final File dir) {
+        files.clear();
+
+        new Thread() {
+            @Override
+            public void run() {
+                files.addAll(Tuils.getSongsInFolder(dir));
+            }
+        }.start();
     }
 
     @Override
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/notifications/NotificationManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/notifications/NotificationManager.java
index 077a74d1b752063e5343c9886e308603885d432f..ccbba647e533e0cc97ed6df9c1c3ec0e9931f102 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/notifications/NotificationManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/notifications/NotificationManager.java
@@ -2,7 +2,7 @@ package ohi.andre.consolelauncher.managers.notifications;
 
 import android.annotation.TargetApi;
 import android.os.Build;
-import android.util.Log;
+import android.util.SparseArray;
 
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -16,10 +16,7 @@ import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
 import java.util.regex.Pattern;
 
 import javax.xml.parsers.DocumentBuilder;
@@ -68,11 +65,6 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement {
             public String defaultValue() {
                 return "false";
             }
-
-            @Override
-            public String hasReplaced() {
-                return "enabled";
-            }
         },
         default_app_state {
             @Override
@@ -107,16 +99,11 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement {
         public boolean is(String s) {
             return name().equals(s);
         }
-
-        @Override
-        public String hasReplaced() {
-            return null;
-        }
     }
 
     @Override
     public String[] deleted() {
-        return new String[0];
+        return new String[] {"enabled"};
     }
 
     @Override
@@ -132,7 +119,7 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement {
     private static XMLPrefsManager.XMLPrefsList values;
     private static List<NotificatedApp> apps;
     private static List<FilterGroup> groups;
-    private static HashMap<Integer, String> applies;
+    private static SparseArray<List<String>> applies;
     private static boolean created = false;
 
     private NotificationManager() {}
@@ -145,7 +132,7 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement {
 
         apps = new ArrayList<>();
         groups = new ArrayList<>();
-        applies = new HashMap<>();
+        applies = new SparseArray<>();
         values = new XMLPrefsManager.XMLPrefsList();
 
         try {
@@ -174,35 +161,32 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement {
             }
             NodeList nodes = root.getElementsByTagName("*");
 
-            Map<String, XMLPrefsManager.XMLPrefsSave> replacedValues = new HashMap<>();
-            for(XMLPrefsManager.XMLPrefsSave s : Options.values()) {
-                String r = s.hasReplaced();
-                if(r != null) replacedValues.put(r, s);
-            }
+            String[] deleted = instance.deleted();
+            boolean needToWrite = false;
 
             Main:
             for(int count = 0; count < nodes.getLength(); count++) {
                 Node node = nodes.item(count);
 
                 String nn = node.getNodeName();
-                if(Tuils.find(nn, (List) enums) != -1) {
+                if (Tuils.find(nn, (List) enums) != -1) {
                     values.add(nn, node.getAttributes().getNamedItem(VALUE_ATTRIBUTE).getNodeValue());
 
-                    for(int en = 0; en < enums.size(); en++) {
-                        if(enums.get(en).label().equals(nn)) {
+                    for (int en = 0; en < enums.size(); en++) {
+                        if (enums.get(en).label().equals(nn)) {
                             enums.remove(en);
                             break;
                         }
                     }
-                } else if(nn.equals(FILTER_NODE)) {
-                    if(node.getNodeType() == Node.ELEMENT_NODE) {
+                } else if (nn.equals(FILTER_NODE)) {
+                    if (node.getNodeType() == Node.ELEMENT_NODE) {
                         Element e = (Element) node;
 
                         String regex = e.hasAttribute(VALUE_ATTRIBUTE) ? e.getAttribute(VALUE_ATTRIBUTE) : null;
-                        if(regex == null) continue;
+                        if (regex == null) continue;
 
                         String on = e.hasAttribute(ON_ATTRIBUTE) ? e.getAttribute(ON_ATTRIBUTE) : null;
-                        if(on == null) on = "text";
+                        if (on == null) on = "text";
 
                         int id;
                         try {
@@ -212,11 +196,11 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement {
                         }
 
                         Filter filter = Filter.getInstance(regex, on.equals("title") ? TITLE : TEXT);
-                        if(filter == null) continue;
+                        if (filter == null) continue;
 
-                        if(id != -1) {
-                            for(FilterGroup group : groups) {
-                                if(id == group.id) {
+                        if (id != -1) {
+                            for (FilterGroup group : groups) {
+                                if (id == group.id) {
                                     group.add(filter);
                                     continue Main;
                                 }
@@ -227,8 +211,8 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement {
                         group.add(filter);
                         groups.add(group);
                     }
-                } else if(nn.equals(APPLY_NODE)) {
-                    if(node.getNodeType() == Node.ELEMENT_NODE) {
+                } else if (nn.equals(APPLY_NODE)) {
+                    if (node.getNodeType() == Node.ELEMENT_NODE) {
                         Element e = (Element) node;
 
                         int id;
@@ -239,22 +223,27 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement {
                         }
 
                         String pkg = e.hasAttribute(PACKAGE_ATTRIBUTE) ? e.getAttribute(PACKAGE_ATTRIBUTE) : null;
-                        if(pkg == null) continue;
-
-                        applies.put(id, pkg);
+                        if (pkg == null) continue;
+
+                        List<String> at = applies.get(id);
+                        if(at == null) {
+                            at = new ArrayList<>();
+                            at.add(pkg);
+                            applies.put(id, at);
+                        } else at.add(pkg);
                     }
-                } else if(replacedValues.containsKey(nn)) {
-                    XMLPrefsManager.XMLPrefsSave s = replacedValues.remove(nn);
+                } else {
 
-                    Element e = (Element) node;
-                    String oldValue = e.hasAttribute(VALUE_ATTRIBUTE) ? e.getAttribute(VALUE_ATTRIBUTE) : null;
-                    root.removeChild(e);
+                    int index = deleted == null ? -1 : Tuils.find(nn, deleted);
+                    if(index != -1) {
+                        deleted[index] = null;
+                        Element e = (Element) node;
+                        root.removeChild(e);
 
-                    replacedValues.put(oldValue, s);
-                }
-//                todo support delete
-                else {
-                    if(node.getNodeType() == Node.ELEMENT_NODE) {
+                        needToWrite = true;
+                    }
+
+                    if (node.getNodeType() == Node.ELEMENT_NODE) {
                         Element e = (Element) node;
 
                         NotificatedApp app;
@@ -262,7 +251,8 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement {
                         boolean enabled = !e.hasAttribute(ENABLED_ATTRIBUTE) || Boolean.parseBoolean(e.getAttribute(ENABLED_ATTRIBUTE));
 
                         String color = null;
-                        if(enabled) color = e.hasAttribute(COLOR_ATTRIBUTE) ? e.getAttribute(COLOR_ATTRIBUTE) : null;
+                        if (enabled)
+                            color = e.hasAttribute(COLOR_ATTRIBUTE) ? e.getAttribute(COLOR_ATTRIBUTE) : null;
 
                         app = new NotificatedApp(nn, color, enabled);
                         apps.add(app);
@@ -270,14 +260,9 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement {
                 }
             }
 
-            if(enums.size() > 0) {
-                Set<Map.Entry<String, XMLPrefsManager.XMLPrefsSave>> es = replacedValues.entrySet();
-                for(XMLPrefsManager.XMLPrefsSave s : enums) {
-                    String value = null;
-                    for(Map.Entry<String, XMLPrefsManager.XMLPrefsSave> e : es) {
-                        if(e.getValue().equals(s)) value = e.getKey();
-                    }
-                    if(value == null) value = s.defaultValue();
+            if (enums.size() > 0) {
+                for (XMLPrefsManager.XMLPrefsSave s : enums) {
+                    String value = s.defaultValue();
 
                     Element em = d.createElement(s.label());
                     em.setAttribute(VALUE_ATTRIBUTE, value);
@@ -286,19 +271,25 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement {
                     values.add(s.label(), value);
                 }
 
+                writeTo(d, file);
+            } else if (needToWrite) {
                 writeTo(d, file);
             }
         } catch (Exception e) {
-            Log.e("andre", "", e);
+            Tuils.log(e);
+            Tuils.toFile(e);
         }
 
         default_app_state = XMLPrefsManager.get(boolean.class, Options.default_app_state);
         default_color = XMLPrefsManager.get(String.class, Options.default_color);
 
         Out:
-        for(Map.Entry<Integer, String> e : applies.entrySet()) {
+        for(int count = 0; count < applies.size(); count++) {
+            int id = applies.keyAt(count);
+            List<String> pkgs = applies.get(id);
+
             for(FilterGroup g : groups) {
-                if(g.applyTo(e.getKey(), e.getValue())) continue Out;
+                if(g.applyTo(id, pkgs)) continue Out;
             }
         }
     }
@@ -309,7 +300,7 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement {
 
     public static boolean match(String pkg, String text, String title) {
         for(FilterGroup group : groups) {
-            if(group.pkgs != null && !group.pkgs.contains(pkg)) continue;
+            if(group.pkgs == null || !group.pkgs.contains(pkg)) continue;
             if(group.check(title, text)) return true;
         }
         return false;
@@ -421,15 +412,23 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement {
         }
 
         public boolean check(String title, String text) {
+            boolean matchTitle = false, matchText = false;
+
             for(Filter filter : brothers) {
                 String s;
-                if(filter.on == TITLE) s = title;
-                else s = text;
+                if(filter.on == TITLE) {
+                    s = title;
+                } else {
+                    s = text;
+                }
+
+                boolean b = filter.pattern.matcher(s).find();
 
-                if(!filter.pattern.matcher(s).find()) return false;
+                if(filter.on == TITLE) matchTitle = matchTitle || b;
+                else matchText = matchText || b;
             }
 
-            return true;
+            return matchText && matchTitle;
         }
 
         public boolean applyTo(int id, String s) {
@@ -442,5 +441,16 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement {
 
             return false;
         }
+
+        public boolean applyTo(int id, List<String> ss) {
+            if(this.id == id) {
+                if(pkgs == null) pkgs = new ArrayList<>();
+
+                pkgs.addAll(ss);
+                return true;
+            }
+
+            return false;
+        }
     }
 }
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/notifications/NotificationService.java b/app/src/main/java/ohi/andre/consolelauncher/managers/notifications/NotificationService.java
index cc5ef5c3adcee671aac1dd62cd5688241935c43e..b54ffbab1690e8ec0d361ac8747d2deb5f3f5ffc 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/notifications/NotificationService.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/notifications/NotificationService.java
@@ -16,13 +16,13 @@ import android.service.notification.StatusBarNotification;
 import android.support.v4.content.LocalBroadcastManager;
 import android.text.Spannable;
 import android.text.SpannableString;
-import android.text.TextUtils;
 import android.text.style.ForegroundColorSpan;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.regex.Pattern;
 
 import ohi.andre.consolelauncher.managers.XMLPrefsManager;
 import ohi.andre.consolelauncher.tuils.TimeManager;
@@ -87,11 +87,11 @@ public class NotificationService extends NotificationListenerService {
     String format;
     int timeColor;
 
-    final String FORMAT_PKG = "%pkg";
-    final String FORMAT_TEXT = "%txt";
-    final String FORMAT_TITLE = "%ttl";
-    final String FORMAT_APPNAME = "%app";
-    final String FORMAT_NEWLINE = "%n";
+    final Pattern patternPkg = Pattern.compile("%pkg", Pattern.CASE_INSENSITIVE);
+    final Pattern patternText = Pattern.compile("%txt", Pattern.CASE_INSENSITIVE);
+    final Pattern patternTitle = Pattern.compile("%ttl", Pattern.CASE_INSENSITIVE);
+    final Pattern patternAppname = Pattern.compile("%app", Pattern.CASE_INSENSITIVE);
+    final Pattern patternNewline = Pattern.compile("%n", Pattern.CASE_INSENSITIVE);
 
     PackageManager manager;
 
@@ -160,20 +160,19 @@ public class NotificationService extends NotificationListenerService {
             color = Color.parseColor(default_color);
         }
 
-        SpannableString spanned = new SpannableString(format);
-        spanned.setSpan(new ForegroundColorSpan(color), 0, format.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+        String finalText = format;
+        finalText = patternPkg.matcher(finalText).replaceAll(pack);
+        finalText = patternAppname.matcher(finalText).replaceAll(appName);
+        finalText = patternText.matcher(finalText).replaceAll(text);
+        finalText = patternTitle.matcher(finalText).replaceAll(title);
+        finalText = patternNewline.matcher(finalText).replaceAll(Tuils.NEWLINE);
+
+        SpannableString spannableString = new SpannableString(finalText);
+        spannableString.setSpan(new ForegroundColorSpan(color), 0, finalText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
 
         CharSequence s;
         try {
-            s = TextUtils.replace(spanned,
-                    new String[] {FORMAT_PKG, FORMAT_APPNAME, FORMAT_TEXT, FORMAT_TITLE, FORMAT_NEWLINE,
-                            FORMAT_PKG.toUpperCase(), FORMAT_APPNAME.toUpperCase(), FORMAT_TEXT.toUpperCase(), FORMAT_TITLE.toUpperCase(), FORMAT_NEWLINE.toUpperCase()},
-                    new CharSequence[] {
-                            pack, appName, text, title, Tuils.NEWLINE, pack, appName, text, title, Tuils.NEWLINE
-                    }
-            );
-
-            s = TimeManager.replace(s, timeColor);
+            s = TimeManager.replace(spannableString, timeColor);
         } catch (Exception e) {
             return;
         }
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/suggestions/SuggestionsManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/suggestions/SuggestionsManager.java
index 7cb42704d0713cb24a0b9f63e7b1ab3be3800803..f55f3717dcb7b9b1fa493b3fb56af4bce05a52a1 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/suggestions/SuggestionsManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/suggestions/SuggestionsManager.java
@@ -192,7 +192,7 @@ public class SuggestionsManager {
     }
 
     private boolean needsFileSuggestion(String cmd) {
-        return cmd.equalsIgnoreCase("ls") || cmd.equalsIgnoreCase("cd") || cmd.equalsIgnoreCase("mv") || cmd.equalsIgnoreCase("cp") || cmd.equalsIgnoreCase("rm");
+        return cmd.equalsIgnoreCase("ls") || cmd.equalsIgnoreCase("cd") || cmd.equalsIgnoreCase("mv") || cmd.equalsIgnoreCase("cp") || cmd.equalsIgnoreCase("rm") || cmd.equalsIgnoreCase("cat");
     }
 
     private void suggestPermanentSuggestions(List<Suggestion> suggestions, PermanentSuggestionCommand cmd) {
diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/Tuils.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/Tuils.java
index 99a280ab6fa7e5683d31a2b0144e6d64016bbd7f..3185a36910212eaf15376a69397f6842081e59e3 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/tuils/Tuils.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/Tuils.java
@@ -4,22 +4,20 @@ import android.annotation.TargetApi;
 import android.app.ActivityManager;
 import android.app.ActivityManager.MemoryInfo;
 import android.app.admin.DevicePolicyManager;
+import android.content.BroadcastReceiver;
 import android.content.ClipData;
 import android.content.ClipboardManager;
 import android.content.ComponentName;
-import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
 import android.content.res.Resources;
-import android.database.Cursor;
 import android.net.Uri;
 import android.os.BatteryManager;
 import android.os.Build;
 import android.os.Environment;
 import android.os.StatFs;
-import android.provider.MediaStore;
 import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.DisplayMetrics;
@@ -32,7 +30,6 @@ import android.webkit.MimeTypeMap;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStreamReader;
@@ -43,6 +40,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.Enumeration;
 import java.util.List;
 import java.util.regex.Pattern;
@@ -52,6 +50,7 @@ import ohi.andre.consolelauncher.BuildConfig;
 import ohi.andre.consolelauncher.managers.SkinManager;
 import ohi.andre.consolelauncher.managers.XMLPrefsManager;
 import ohi.andre.consolelauncher.managers.music.MusicManager;
+import ohi.andre.consolelauncher.tuils.interfaces.OnBatteryUpdate;
 import ohi.andre.consolelauncher.tuils.stuff.FakeLauncherActivity;
 
 public class Tuils {
@@ -74,23 +73,28 @@ public class Tuils {
         return false;
     }
 
-    public static int getBatteryPercentage(Context context) {
-
+    public static void registerBatteryReceiver(Context context, OnBatteryUpdate listener) {
         try {
             IntentFilter iFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
-            Intent batteryStatus = context.registerReceiver(null, iFilter);
-
-            int level = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) : -1;
-            int scale = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1) : -1;
-
-            float batteryPct = level / (float) scale;
+            context.registerReceiver(batteryReceiver, iFilter);
 
-            return (int) (batteryPct * 100);
+            batteryUpdate = listener;
         } catch (Exception e) {
-            return -1;
+            Tuils.toFile(e);
         }
     }
 
+    private static OnBatteryUpdate batteryUpdate;
+    private static BroadcastReceiver batteryReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if(batteryUpdate == null) return;
+
+            int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
+            batteryUpdate.update(level);
+        }
+    };
+
     public static boolean containsExtension(String[] array, String value) {
         try {
             value = value.toLowerCase().trim();
@@ -397,17 +401,12 @@ public class Tuils {
     public static void insertHeaders(List<String> s, boolean newLine) {
         char current = 0;
         for (int count = 0; count < s.size(); count++) {
-            char c = 0;
-
-            String st = s.get(count);
-            for (int count2 = 0; count2 < st.length(); count2++) {
-                c = st.charAt(count2);
-                if (c != ' ')
-                    break;
-            }
+            String st = s.get(count).trim().toUpperCase();
+            if(st.length() < 0) continue;
 
+            char c = st.charAt(0);
             if (current != c) {
-                s.add(count, (newLine ? NEWLINE : EMPTYSTRING) + Character.toString(c).toUpperCase() + (newLine ? NEWLINE : EMPTYSTRING));
+                s.add(count, (newLine ? NEWLINE : EMPTYSTRING) + c + (newLine ? NEWLINE : EMPTYSTRING));
                 current = c;
             }
         }
@@ -454,8 +453,11 @@ public class Tuils {
 
     public static void toFile(Throwable e) {
         try {
-            e.printStackTrace(new PrintStream(new FileOutputStream(new File(Tuils.getFolder(), "crash.txt"), true)));
-        } catch (FileNotFoundException e1) {}
+            FileOutputStream out = new FileOutputStream(new File(Tuils.getFolder(), "crash.txt"), true);
+            out.write((Tuils.NEWLINE + Tuils.NEWLINE + new Date().toString() + Tuils.NEWLINE).getBytes());
+            e.printStackTrace(new PrintStream(out));
+            out.close();
+        } catch (Exception e1) {}
     }
 
     public static String toPlanString(List<String> strings, String separator) {
@@ -574,37 +576,6 @@ public class Tuils {
         return new File(internalDir, TUI_FOLDER);
     }
 
-    public static List<File> getMediastoreSongs(Context activity) {
-        ContentResolver cr = activity.getContentResolver();
-
-        List<File> paths = new ArrayList<>();
-
-        Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
-        String selection = MediaStore.Audio.Media.IS_MUSIC + "!= 0";
-        String sortOrder = MediaStore.Audio.Media.TITLE + " ASC";
-        Cursor cur = cr.query(uri, null, selection, null, sortOrder);
-        int count = 0;
-
-        if(cur != null) {
-            count = cur.getCount();
-            if(count > 0) {
-                while(cur.moveToNext()) {
-                    String data = cur.getString(cur.getColumnIndex(MediaStore.Audio.Media.DATA));
-                    if(data != null) {
-                        try {
-                            paths.add(new File(data));
-                        } catch (Exception e) {}
-                    }
-                }
-
-            }
-
-            cur.close();
-        }
-
-        return paths;
-    }
-
     public static double eval(final String str) {
         return new Object() {
             int pos = -1, ch;
@@ -721,22 +692,23 @@ public class Tuils {
     }
 
     public static int alphabeticCompare(String s1, String s2) {
-        String cmd1 = removeSpaces(s1);
-        cmd1 = cmd1.toLowerCase();
-        String cmd2 = removeSpaces(s2);
-        cmd2 = cmd2.toLowerCase();
+        String cmd1 = removeSpaces(s1).toLowerCase();
+        String cmd2 = removeSpaces(s2).toLowerCase();
 
         for (int count = 0; count < cmd1.length() && count < cmd2.length(); count++) {
-            if (cmd1.charAt(count) < cmd2.charAt(count)) {
+            char c1 = cmd1.charAt(count);
+            char c2 = cmd2.charAt(count);
+
+            if (c1 < c2) {
                 return -1;
-            } else if (cmd1.charAt(count) > cmd2.charAt(count)) {
+            } else if (c1 > c2) {
                 return 1;
             }
         }
 
-        if (cmd1.length() > cmd2.length()) {
+        if (s1.length() > s2.length()) {
             return 1;
-        } else if (cmd1.length() < cmd2.length()) {
+        } else if (s1.length() < s2.length()) {
             return -1;
         }
         return 0;
diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/OnBatteryUpdate.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/OnBatteryUpdate.java
new file mode 100644
index 0000000000000000000000000000000000000000..1dfb5f87162194e3d70da4a0474a19371c2d4a01
--- /dev/null
+++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/OnBatteryUpdate.java
@@ -0,0 +1,10 @@
+package ohi.andre.consolelauncher.tuils.interfaces;
+
+/**
+ * Created by francescoandreuzzi on 04/08/2017.
+ */
+
+public interface OnBatteryUpdate {
+
+    void update(float percentage);
+}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 1134ffe584b23cded5f5faf5ba6a582c5a7ccd22..73223638d55edf5bab82cedc8be7595dd51d3961 100755
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -10,7 +10,7 @@
     <string name="output_rate">Thank you!</string>
     <string name="start_notification">T-UI started</string>
     <string name="tui_running">T-UI is running</string>
-    <string name="anr">t-ui is having some issues. Please send to the developer your file crash.txt</string>
+    <string name="anr">t-ui is having some issues. Please send to the developer your file crash.txt in the "t-ui" folder</string>
 
     <!-- files -->
     <string name="output_error">An unknown error has occurred</string>
@@ -77,8 +77,7 @@
     <string name="output_stopped">Player stopped</string>
     <string name="output_nomusic">Player wasn\'t started</string>
     <string name="output_cantstop">Couldn\'t stop the player. Force stop t-ui from settings</string>
-    <string name="output_musicfoldererror">Music folder doesn\'t exist, or doesn\'t contain audio files.\nYou should set the right path
-        in settings.txt
+    <string name="output_musicfoldererror">Music folder doesn\'t exist, or doesn\'t contain audio files.\nYou should set the right path with "config -set songs_path"
     </string>
 
     <!-- command/args -->
@@ -142,9 +141,10 @@
     <string name="help_community">Show the t-ui community on Google+</string>
     <string name="help_config">Manage your config files.
         \nUsage:
-        \n-set [option] [value] -> set the value of a config node
+        \n-set [option] [value] -> set the value of an option
         \n-open [file] -> open a config file
         \n-get [option] -> get the value of an option
+        \n-reset [option] -> reset the value of an option
     </string>
     <string name="help_data">Toggle mobile data</string>
     <string name="help_donate">Offer a coffee to the developer (PayPal only)</string>