diff --git a/app/build.gradle b/app/build.gradle
index ee26b31e702bc837dcbc9eaaf836aeed054d2ae8..cd8655d9023c478d40a96b02c367d871c8e56c51 100755
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -11,8 +11,8 @@ android {
         minSdkVersion 9
         targetSdkVersion 23
 
-        versionCode 136
-        versionName "6.3j"
+        versionCode 137
+        versionName "6.3k"
     }
 
     buildTypes {
@@ -48,8 +48,12 @@ android {
                     output.outputFile.name.replace("app-release.apk", "${x}/${variant.applicationId}_${variant.versionName}_${new Date().format("dd-MM_hh.mm.ss")}.apk"))
         }
     }
+
+    configurations {
+        all*.exclude group: 'com.google.firebase', module: 'firebase-core'
+        all*.exclude group: 'com.google.firebase', module: 'firebase-iid'
+    }
 }
 dependencies {
-    compile files('libs/anrwatchdog-1.3.0.jar')
     compile 'com.google.firebase:firebase-database:9.0.0'
 }
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index 414c980e5d8c251f319f13848beb6a0917ede715..2cc184a18730ee2a96aa79e9302fe029e1f7cfc5 100755
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -5,6 +5,8 @@
 -keep public class ohi.andre.consolelauncher.managers.notifications.NotificationService
 -keep public class ohi.andre.consolelauncher.tuils.KeeperService
 
+-keep public class ohi.andre.consolelauncher.managers.options.**
+
 -dontwarn ohi.andre.consolelauncher.commands.main.raw.**
 
 -dontwarn javax.annotation.**
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 5937f1abe5a1c1fe899813f874a322b6ff5ccdb0..8c33c70bd23da8abcfec4094536b4b3df14a9bc0 100755
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -69,6 +69,13 @@
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
         android:theme="@style/Custom.Solid">
+
+        <meta-data
+            android:name="firebase_analytics_collection_deactivated"
+            android:value="true" />
+        <meta-data android:name="firebase_crash_collection_enabled"
+            android:value="false" />
+
         <activity
             android:name=".LauncherActivity"
             android:configChanges="keyboardHidden|orientation|screenSize|keyboard|navigation"
diff --git a/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java b/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java
index 735bd325dec883bc6fea8ce281f12e941ebe9e8a..e282eabf73a875c8cb3102f1c58dc74056ee83c7 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java
@@ -22,9 +22,6 @@ import android.view.Window;
 import android.view.WindowManager;
 import android.widget.Toast;
 
-import com.github.anrwatchdog.ANRError;
-import com.github.anrwatchdog.ANRWatchDog;
-
 import java.util.LinkedList;
 import java.util.Queue;
 
@@ -32,11 +29,15 @@ import ohi.andre.consolelauncher.commands.main.MainPack;
 import ohi.andre.consolelauncher.commands.tuixt.TuixtActivity;
 import ohi.andre.consolelauncher.managers.ContactManager;
 import ohi.andre.consolelauncher.managers.TerminalManager;
-import ohi.andre.consolelauncher.managers.XMLPrefsManager;
 import ohi.andre.consolelauncher.managers.notifications.NotificationManager;
 import ohi.andre.consolelauncher.managers.notifications.NotificationMonitorService;
 import ohi.andre.consolelauncher.managers.notifications.NotificationService;
 import ohi.andre.consolelauncher.managers.suggestions.SuggestionsManager;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.options.Behavior;
+import ohi.andre.consolelauncher.managers.xml.options.Notifications;
+import ohi.andre.consolelauncher.managers.xml.options.Theme;
+import ohi.andre.consolelauncher.managers.xml.options.Ui;
 import ohi.andre.consolelauncher.tuils.Assist;
 import ohi.andre.consolelauncher.tuils.InputOutputReceiver;
 import ohi.andre.consolelauncher.tuils.KeeperService;
@@ -66,6 +67,13 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable {
 
     private boolean openKeyboardOnStart, canApplyTheme;
 
+    private Runnable stopActivity = new Runnable() {
+        @Override
+        public void run() {
+            finish();
+        }
+    };
+
     private CommandExecuter ex = new CommandExecuter() {
 
         @Override
@@ -126,6 +134,7 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable {
 
         boolean charged = false;
         Handler handler = new Handler();
+
         Runnable r = new Runnable() {
             @Override
             public void run() {
@@ -188,6 +197,11 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable {
                 }
             }
         }
+
+        @Override
+        public void dispose() {
+            handler.removeCallbacksAndMessages(null);
+        }
     };
 
     private Suggester sugg = new Suggester() {
@@ -220,24 +234,12 @@ 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);
-                    }
-                })
-                .setReportMainThreadOnly()
-                .start();
-
-        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
-            @Override
-            public void uncaughtException(Thread t, Throwable e) {
-                Tuils.log(e);
-                Tuils.toFile(e);
-            }
-        });
+//        Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
+//            @Override
+//            public void uncaughtException(Thread t, Throwable e) {
+//                Tuils.toFile(e);
+//            }
+//        });
 
         IntentFilter filter = new IntentFilter();
         filter.addAction(InputOutputReceiver.ACTION_CMD);
@@ -255,16 +257,16 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable {
             return;
         }
 
-        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && !XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.ignore_bar_color)) {
+        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && !XMLPrefsManager.getBoolean(Ui.ignore_bar_color)) {
             Window window = getWindow();
 
             window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
             window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
-            window.setStatusBarColor(XMLPrefsManager.getColor(XMLPrefsManager.Theme.statusbar_color));
-            window.setNavigationBarColor(XMLPrefsManager.getColor(XMLPrefsManager.Theme.navigationbar_color));
+            window.setStatusBarColor(XMLPrefsManager.getColor(Theme.statusbar_color));
+            window.setNavigationBarColor(XMLPrefsManager.getColor(Theme.navigationbar_color));
         }
 
-        boolean showNotification = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.tui_notification);
+        boolean showNotification = XMLPrefsManager.getBoolean(Behavior.tui_notification);
         Intent keeperIntent = new Intent(this, KeeperService.class);
         if (showNotification) {
             startService(keeperIntent);
@@ -274,9 +276,9 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable {
             } catch (Exception e) {}
         }
 
-        boolean fullscreen = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.fullscreen);
+        boolean fullscreen = XMLPrefsManager.getBoolean(Ui.fullscreen);
 
-        boolean useSystemWP = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.system_wallpaper);
+        boolean useSystemWP = XMLPrefsManager.getBoolean(Ui.system_wallpaper);
         if (useSystemWP) {
             if(fullscreen) {
                 setTheme(R.style.Custom_SystemWP_Fullscreen);
@@ -298,32 +300,37 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable {
         }
 
 
-        boolean notifications = XMLPrefsManager.get(boolean.class, NotificationManager.Options.show_notifications) ||
-                XMLPrefsManager.get(String.class, NotificationManager.Options.show_notifications).equalsIgnoreCase("enabled");
+        boolean notifications = XMLPrefsManager.getBoolean(Notifications.show_notifications) ||
+                XMLPrefsManager.get(Notifications.show_notifications).equalsIgnoreCase("enabled");
 
         if(notifications) {
-            ComponentName thisComponent = new ComponentName(this, NotificationService.class);
-            PackageManager pm = getPackageManager();
-            pm.setComponentEnabledSetting(thisComponent, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
-
-            if(!Tuils.hasNotificationAccess(this)) {
-                Intent i = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
-                if(i.resolveActivity(getPackageManager()) == null) {
-                    Toast.makeText(this, R.string.no_notification_access, Toast.LENGTH_LONG).show();
-                } else {
-                    startActivity(i);
+            try {
+                ComponentName thisComponent = new ComponentName(this, NotificationService.class);
+                PackageManager pm = getPackageManager();
+                pm.setComponentEnabledSetting(thisComponent, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
+
+                if(!Tuils.hasNotificationAccess(this)) {
+                    Intent i = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
+                    if(i.resolveActivity(getPackageManager()) == null) {
+                        Toast.makeText(this, R.string.no_notification_access, Toast.LENGTH_LONG).show();
+                    } else {
+                        startActivity(i);
+                    }
                 }
-            }
 
-            Intent monitor = new Intent(this, NotificationMonitorService.class);
-            startService(monitor);
+                Intent monitor = new Intent(this, NotificationMonitorService.class);
+                startService(monitor);
 
-            Intent timeColorIntent = new Intent(this, NotificationService.class);
-            timeColorIntent.putExtra(XMLPrefsManager.Theme.time_color.label(), XMLPrefsManager.getColor(XMLPrefsManager.Theme.time_color));
-            startService(timeColorIntent);
+                Intent timeColorIntent = new Intent(this, NotificationService.class);
+                timeColorIntent.putExtra(Theme.time_color.label(), XMLPrefsManager.getColor(Theme.time_color));
+                startService(timeColorIntent);
+            } catch (NoClassDefFoundError er) {
+                Intent intent = new Intent(InputOutputReceiver.ACTION_OUTPUT);
+                intent.putExtra(InputOutputReceiver.TEXT, getString(R.string.output_notification_error) + Tuils.SPACE + er.toString());
+            }
         }
 
-        openKeyboardOnStart = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.auto_show_keyboard);
+        openKeyboardOnStart = XMLPrefsManager.getBoolean(Behavior.auto_show_keyboard);
         if (!openKeyboardOnStart) {
             this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
         }
@@ -392,9 +399,10 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable {
 
         overridePendingTransition(0,0);
 
-        if(main != null) {
-            main.destroy();
-        }
+        if(main != null) main.destroy();
+        if(ui != null) ui.dispose();
+
+        out.dispose();
 
         System.exit(0);
     }
@@ -418,18 +426,18 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable {
 
     @Override
     public void reload() {
-        runOnUiThread(new Runnable() {
+        new Thread() {
             @Override
             public void run() {
-                Handler h = new Handler();
-                h.postDelayed(new Runnable() {
-                    @Override
-                    public void run() {
-                        finish();
-                    }
-                }, 1000);
+                super.run();
+
+                try {
+                    sleep(1000);
+                } catch (InterruptedException e) {}
+
+                runOnUiThread(stopActivity);
             }
-        });
+        }.start();
     }
 
     @Override
@@ -509,12 +517,18 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable {
                     while(count < permissions.length && count < grantResults.length) {
                         if(grantResults[count] == PackageManager.PERMISSION_DENIED) {
                             Toast.makeText(this, R.string.permissions_toast, Toast.LENGTH_LONG).show();
-                            new Handler().postDelayed(new Runnable() {
+                            new Thread() {
                                 @Override
                                 public void run() {
-                                    finish();
+                                    super.run();
+
+                                    try {
+                                        sleep(2000);
+                                    } catch (InterruptedException e) {}
+
+                                    runOnUiThread(stopActivity);
                                 }
-                            }, 2000);
+                            }.start();
                             return;
                         }
                         count++;
diff --git a/app/src/main/java/ohi/andre/consolelauncher/MainManager.java b/app/src/main/java/ohi/andre/consolelauncher/MainManager.java
index 4363a30c7888dfb3fb6a85dd48bd7aad06253f8c..8a890cf53cda416bd6c9fd9f203254b440e2395f 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/MainManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/MainManager.java
@@ -20,9 +20,12 @@ import ohi.andre.consolelauncher.commands.specific.RedirectCommand;
 import ohi.andre.consolelauncher.managers.AliasManager;
 import ohi.andre.consolelauncher.managers.AppsManager;
 import ohi.andre.consolelauncher.managers.ContactManager;
+import ohi.andre.consolelauncher.managers.RssManager;
 import ohi.andre.consolelauncher.managers.TerminalManager;
-import ohi.andre.consolelauncher.managers.XMLPrefsManager;
 import ohi.andre.consolelauncher.managers.music.MusicManager2;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.options.Behavior;
+import ohi.andre.consolelauncher.managers.xml.options.Theme;
 import ohi.andre.consolelauncher.tuils.Compare;
 import ohi.andre.consolelauncher.tuils.StoppableThread;
 import ohi.andre.consolelauncher.tuils.TimeManager;
@@ -116,11 +119,11 @@ public class MainManager {
         in = i;
         out = o;
 
-        showAliasValue = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.show_alias_content);
-        showAppHistory = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.show_launch_history);
-        aliasContentColor = XMLPrefsManager.getColor(XMLPrefsManager.Theme.alias_content_color);
+        showAliasValue = XMLPrefsManager.getBoolean(Behavior.show_alias_content);
+        showAppHistory = XMLPrefsManager.getBoolean(Behavior.show_launch_history);
+        aliasContentColor = XMLPrefsManager.getColor(Theme.alias_content_color);
 
-        multipleCmdSeparator = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.multiple_cmd_separator);
+        multipleCmdSeparator = XMLPrefsManager.get(Behavior.multiple_cmd_separator);
 
         CommandGroup group = new CommandGroup(mContext, COMMANDS_PKG);
 
@@ -129,7 +132,7 @@ public class MainManager {
             cont = new ContactManager(mContext);
         } catch (NullPointerException e) {}
 
-        MusicManager2 music = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.enable_music) ? new MusicManager2(mContext) : null;
+        MusicManager2 music = XMLPrefsManager.getBoolean(Behavior.enable_music) ? new MusicManager2(mContext) : null;
 
         AppsManager appsMgr = new AppsManager(c, sugg);
         AliasManager aliasManager = new AliasManager(mContext);
@@ -137,7 +140,9 @@ public class MainManager {
         ShellHolder shellHolder = new ShellHolder(out);
         interactive = shellHolder.build();
 
-        mainPack = new MainPack(mContext, group, aliasManager, appsMgr, music, cont, c, executer, redirectator, shellHolder);
+        RssManager rss = new RssManager(mContext);
+
+        mainPack = new MainPack(mContext, group, aliasManager, appsMgr, music, cont, c, executer, redirectator, shellHolder, rss);
     }
 
 //    command manager
@@ -354,9 +359,9 @@ public class MainManager {
 
             if(showAppHistory) {
                 if(appFormat == null) {
-                    appFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.app_launch_format);
-                    timeColor = XMLPrefsManager.getColor(XMLPrefsManager.Theme.time_color);
-                    outputColor = XMLPrefsManager.getColor(XMLPrefsManager.Theme.output_color);
+                    appFormat = XMLPrefsManager.get(Behavior.app_launch_format);
+                    timeColor = XMLPrefsManager.getColor(Theme.time_color);
+                    outputColor = XMLPrefsManager.getColor(Theme.output_color);
                 }
 
                 String a = new String(appFormat);
diff --git a/app/src/main/java/ohi/andre/consolelauncher/UIManager.java b/app/src/main/java/ohi/andre/consolelauncher/UIManager.java
index 4921455d7a2567542ffa10376ce80a2e9031e651..8f9e4b9c301e3f3c383d3b6f4f92f18d18bb60ab 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/UIManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/UIManager.java
@@ -3,10 +3,15 @@ package ohi.andre.consolelauncher;
 import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.admin.DevicePolicyManager;
+import android.bluetooth.BluetoothAdapter;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.graphics.Typeface;
+import android.content.IntentFilter;
+import android.net.ConnectivityManager;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.BatteryManager;
 import android.os.Build;
 import android.os.Handler;
 import android.text.Editable;
@@ -29,7 +34,9 @@ import android.widget.ImageButton;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
+import java.lang.reflect.Method;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -39,10 +46,16 @@ import ohi.andre.consolelauncher.commands.main.MainPack;
 import ohi.andre.consolelauncher.commands.specific.RedirectCommand;
 import ohi.andre.consolelauncher.managers.MessagesManager;
 import ohi.andre.consolelauncher.managers.TerminalManager;
-import ohi.andre.consolelauncher.managers.XMLPrefsManager;
 import ohi.andre.consolelauncher.managers.suggestions.SuggestionRunnable;
 import ohi.andre.consolelauncher.managers.suggestions.SuggestionsManager;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.options.Behavior;
+import ohi.andre.consolelauncher.managers.xml.options.Suggestions;
+import ohi.andre.consolelauncher.managers.xml.options.Theme;
+import ohi.andre.consolelauncher.managers.xml.options.Toolbar;
+import ohi.andre.consolelauncher.managers.xml.options.Ui;
 import ohi.andre.consolelauncher.tuils.AllowEqualsSequence;
+import ohi.andre.consolelauncher.tuils.NetworkUtils;
 import ohi.andre.consolelauncher.tuils.StoppableThread;
 import ohi.andre.consolelauncher.tuils.TimeManager;
 import ohi.andre.consolelauncher.tuils.Tuils;
@@ -57,6 +70,19 @@ import ohi.andre.consolelauncher.tuils.stuff.TrashInterfaces;
 
 public class UIManager implements OnTouchListener {
 
+    private enum Label {
+        ram,
+        device,
+        time,
+        battery,
+        storage,
+        network;
+
+        static Label last() {
+            return network;
+        }
+    }
+
     private final int RAM_DELAY = 3000;
     private final int TIME_DELAY = 1000;
     private final int STORAGE_DELAY = 60 * 1000;
@@ -72,10 +98,6 @@ public class UIManager implements OnTouchListener {
     private CommandExecuter trigger;
     private TerminalManager mTerminalAdapter;
 
-    private TextView[] ts;
-    private CharSequence deviceText, ramText, storageText, batteryText, timeText;
-    private int deviceIndex, ramIndex, storageIndex, batteryIndex, timeIndex;
-
     int mediumPercentage, lowPercentage;
     String batteryFormat;
 //    boolean batteryCharging;
@@ -100,22 +122,48 @@ public class UIManager implements OnTouchListener {
         }
     };
 
-    int batterySize, ramSize, storageSize, timeSize;
+    private TextView[] labelViews = new TextView[Label.last().ordinal() + 1];
+    private int[] labelSizes = new int[Label.last().ordinal() + 1];
+    private CharSequence[] labelTexts = new CharSequence[Label.last().ordinal() + 1];
+    private float[] labelIndexes = new float[Label.last().ordinal() + 1];
 
     private OnBatteryUpdate batteryUpdate = new OnBatteryUpdate() {
 
+//        %(charging:not charging)
+
+        final Pattern optionalCharging = Pattern.compile("%\\(([^\\/]*)\\/([^)]*)\\)", Pattern.CASE_INSENSITIVE);
+        final Pattern newline = Pattern.compile("%n", Pattern.LITERAL | Pattern.CASE_INSENSITIVE);
+        final Pattern value = Pattern.compile("%v", Pattern.LITERAL | Pattern.CASE_INSENSITIVE);
+
         boolean manyStatus, loaded;
         int colorHigh, colorMedium, colorLow;
 
+        boolean charging;
+        float last = -1;
+
         @Override
         public void update(float p) {
+            if(batteryFormat == null) {
+                batteryFormat = XMLPrefsManager.get(Behavior.battery_format);
+
+                Intent intent = mContext.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+                if(intent == null) charging = false;
+                else {
+                    int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
+                    charging = plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB;
+                }
+            }
+
+            if(p == -1) p = last;
+            last = p;
+
             if(!loaded) {
                 loaded = true;
 
-                manyStatus = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.enable_battery_status);
-                colorHigh = XMLPrefsManager.getColor(XMLPrefsManager.Theme.battery_color_high);
-                colorMedium = XMLPrefsManager.getColor(XMLPrefsManager.Theme.battery_color_medium);
-                colorLow = XMLPrefsManager.getColor(XMLPrefsManager.Theme.battery_color_low);
+                manyStatus = XMLPrefsManager.getBoolean(Ui.enable_battery_status);
+                colorHigh = XMLPrefsManager.getColor(Theme.battery_color_high);
+                colorMedium = XMLPrefsManager.getColor(Theme.battery_color_medium);
+                colorLow = XMLPrefsManager.getColor(Theme.battery_color_low);
             }
 
             int percentage = (int) p;
@@ -130,11 +178,32 @@ public class UIManager implements OnTouchListener {
                 color = colorHigh;
             }
 
-            if(batteryFormat == null) batteryFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.battery_format);
+            String cp = batteryFormat;
+
+            Matcher m = optionalCharging.matcher(cp);
+            while (m.find()) {
+                cp = cp.replace(m.group(0), m.groupCount() == 2 ? m.group(charging ? 1 : 2) : Tuils.EMPTYSTRING);
+            }
+
+            cp = value.matcher(cp).replaceAll(String.valueOf(percentage));
+            cp = newline.matcher(cp).replaceAll(Tuils.NEWLINE);
+
+            int i = Label.battery.ordinal();
 
-            String cp = batteryFormat.replaceAll("%[vV]", String.valueOf(percentage)).replaceAll("%[nN]", Tuils.NEWLINE);
-            batteryText = Tuils.span(mContext, cp, color, batterySize);
-            UIManager.this.update(batteryIndex);
+            labelTexts[i] = Tuils.span(mContext, cp, color, labelSizes[i]);
+            UIManager.this.update(labelIndexes[i]);
+        }
+
+        @Override
+        public void onCharging() {
+            charging = true;
+            update(-1);
+        }
+
+        @Override
+        public void onNotCharging() {
+            charging = false;
+            update(-1);
         }
     };
 
@@ -153,8 +222,8 @@ public class UIManager implements OnTouchListener {
         @Override
         public void run() {
             if(storageFormat == null) {
-                storageFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.storage_format);
-                color = XMLPrefsManager.getColor(XMLPrefsManager.Theme.storage_color);
+                storageFormat = XMLPrefsManager.get(Behavior.storage_format);
+                color = XMLPrefsManager.getColor(Theme.storage_color);
             }
 
             if(storagePatterns == null) {
@@ -234,9 +303,11 @@ public class UIManager implements OnTouchListener {
             copy = storagePatterns.get(25).matcher(copy).replaceAll(Matcher.quoteReplacement(String.valueOf(Tuils.formatSize((long) eav, Tuils.GIGA))));
             copy = storagePatterns.get(26).matcher(copy).replaceAll(Matcher.quoteReplacement(String.valueOf(Tuils.formatSize((long) etot, Tuils.GIGA))));
 
-            storageText = Tuils.span(mContext, copy, color, storageSize);
-            update(storageIndex);
-            ts[storageIndex].postDelayed(this, STORAGE_DELAY);
+            int i = Label.storage.ordinal();
+
+            labelTexts[i] = Tuils.span(mContext, copy, color, labelSizes[i]);
+            update(labelIndexes[i]);
+            labelViews[(int) labelIndexes[i]].postDelayed(this, STORAGE_DELAY);
         }
     };
 
@@ -249,12 +320,14 @@ public class UIManager implements OnTouchListener {
         public void run() {
             if(!active) {
                 active = true;
-                color = XMLPrefsManager.getColor(XMLPrefsManager.Theme.time_color);
+                color = XMLPrefsManager.getColor(Theme.time_color);
             }
 
-            timeText = TimeManager.replace(mContext, timeSize, "%t0", color);
-            update(timeIndex);
-            ts[timeIndex].postDelayed(this, TIME_DELAY);
+            int i = Label.time.ordinal();
+
+            labelTexts[i] = TimeManager.replace(mContext, labelSizes[i], "%t0", color);
+            update(labelIndexes[i]);
+            labelViews[(int) labelIndexes[i]].postDelayed(this, TIME_DELAY);
         }
     };
 
@@ -274,9 +347,9 @@ public class UIManager implements OnTouchListener {
         @Override
         public void run() {
             if(ramFormat == null) {
-                ramFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.ram_format);
+                ramFormat = XMLPrefsManager.get(Behavior.ram_format);
 
-                color = XMLPrefsManager.getColor(XMLPrefsManager.Theme.ram_color);
+                color = XMLPrefsManager.getColor(Theme.ram_color);
             }
 
             if(ramPatterns == null) {
@@ -318,36 +391,213 @@ public class UIManager implements OnTouchListener {
 
             copy = ramPatterns.get(11).matcher(copy).replaceAll(Matcher.quoteReplacement(Tuils.NEWLINE));
 
-            ramText = Tuils.span(mContext, copy, color, ramSize);
-            update(ramIndex);
-            ts[ramIndex].postDelayed(this, RAM_DELAY);
+            int i = Label.ram.ordinal();
+
+            labelTexts[i] = Tuils.span(mContext, copy, color, labelSizes[i]);
+            update(labelIndexes[i]);
+            labelViews[(int) labelIndexes[i]].postDelayed(this, RAM_DELAY);
         }
     };
 
-    private void update(int index) {
-        CharSequence sequence = Tuils.EMPTYSTRING;
+    private Runnable networkRunnable = new Runnable() {
+
+//        %() -> wifi
+//        %[] -> data
+//        %{} -> bluetooth
+
+        final String zero = "0";
+        final String one = "1";
+        final String on = "on";
+        final String off = "off";
+        final String ON = on.toUpperCase();
+        final String OFF = off.toUpperCase();
+        final String _true = "true";
+        final String _false = "false";
+        final String TRUE = _true.toUpperCase();
+        final String FALSE = _false.toUpperCase();
+
+        final Pattern w0 = Pattern.compile("%w0", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
+        final Pattern w1 = Pattern.compile("%w1", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
+        final Pattern w2 = Pattern.compile("%w2", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
+        final Pattern w3 = Pattern.compile("%w3", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
+        final Pattern w4 = Pattern.compile("%w4", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
+        final Pattern wn = Pattern.compile("%wn", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
+        final Pattern d0 = Pattern.compile("%d0", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
+        final Pattern d1 = Pattern.compile("%d1", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
+        final Pattern d2 = Pattern.compile("%d2", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
+        final Pattern d3 = Pattern.compile("%d3", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
+        final Pattern d4 = Pattern.compile("%d4", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
+        final Pattern b0 = Pattern.compile("%b0", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
+        final Pattern b1 = Pattern.compile("%b1", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
+        final Pattern b2 = Pattern.compile("%b2", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
+        final Pattern b3 = Pattern.compile("%b3", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
+        final Pattern b4 = Pattern.compile("%b4", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
+        final Pattern nl = Pattern.compile("%n", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
+        final Pattern ip4 = Pattern.compile("%ip4", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
+        final Pattern ip6 = Pattern.compile("%ip6", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
+
+        final Pattern optionalWifi = Pattern.compile("%\\(([^/]*)/([^)]*)\\)", Pattern.CASE_INSENSITIVE);
+        final Pattern optionalData = Pattern.compile("%\\[([^/]*)/([^\\]]*)\\]", Pattern.CASE_INSENSITIVE);
+        final Pattern optionalBluetooth = Pattern.compile("%\\{([^/]*)/([^}]*)\\}", Pattern.CASE_INSENSITIVE);
+
+        String format;
+        int color;
 
-        if(deviceIndex == index && deviceText != null) {
-            sequence = deviceText;
-        }
+        WifiManager wifiManager;
+        BluetoothAdapter mBluetoothAdapter;
+
+        ConnectivityManager connectivityManager;
+
+        Class cmClass;
+        Method method;
+
+        int maxDepth;
+        int updateTime;
+
+        @Override
+        public void run() {
+            if(format == null) {
+                format = XMLPrefsManager.get(Behavior.network_info_format);
+                color = XMLPrefsManager.getColor(Theme.network_info_color);
+                maxDepth = XMLPrefsManager.getInt(Behavior.max_optional_depth_network_info);
+
+                updateTime = XMLPrefsManager.getInt(Behavior.network_info_update_ms);
+                if(updateTime < 1000) updateTime = Integer.parseInt(Behavior.network_info_update_ms.defaultValue());
+
+                connectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
+                wifiManager = (WifiManager) mContext.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
+                mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+
+                try {
+                    cmClass = Class.forName(connectivityManager.getClass().getName());
+                    method = cmClass.getDeclaredMethod("getMobileDataEnabled");
+                    method.setAccessible(true);
+                } catch (Exception e) {
+                    cmClass = null;
+                    method = null;
+                }
+            }
 
-        if(batteryIndex == index && batteryText != null) {
-            sequence = TextUtils.concat(sequence, batteryText);
+//            mobile data
+            boolean mobileOn = false;
+            try {
+                mobileOn = method != null && connectivityManager != null && (Boolean) method.invoke(connectivityManager);
+            } catch (Exception e) {}
+
+//            wifi
+            boolean wifiOn = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected();
+            String wifiName = null;
+            if(wifiOn) {
+                WifiInfo connectionInfo = wifiManager.getConnectionInfo();
+                if (connectionInfo != null) {
+                    wifiName = connectionInfo.getSSID();
+                }
+            }
+
+//            bluetooth
+            boolean bluetoothOn = mBluetoothAdapter != null && mBluetoothAdapter.isEnabled();
+
+            String copy = format;
+
+            if(maxDepth > 0) {
+                copy = apply(1, copy, new boolean[] {wifiOn, mobileOn, bluetoothOn}, optionalWifi, optionalData, optionalBluetooth);
+                copy = apply(1, copy, new boolean[] {mobileOn, wifiOn, bluetoothOn}, optionalData, optionalWifi, optionalBluetooth);
+                copy = apply(1, copy, new boolean[] {bluetoothOn, wifiOn, mobileOn}, optionalBluetooth, optionalWifi, optionalData);
+            }
+
+            copy = w0.matcher(copy).replaceAll(wifiOn ? one : zero);
+            copy = w1.matcher(copy).replaceAll(wifiOn ? on : off);
+            copy = w2.matcher(copy).replaceAll(wifiOn ? ON : OFF);
+            copy = w3.matcher(copy).replaceAll(wifiOn ? _true : _false);
+            copy = w4.matcher(copy).replaceAll(wifiOn ? TRUE : FALSE);
+            copy = wn.matcher(copy).replaceAll(wifiName != null ? wifiName.replaceAll("\"", Tuils.EMPTYSTRING) : "null");
+            copy = d0.matcher(copy).replaceAll(mobileOn ? one : zero);
+            copy = d1.matcher(copy).replaceAll(mobileOn ? on : off);
+            copy = d2.matcher(copy).replaceAll(mobileOn ? ON : OFF);
+            copy = d3.matcher(copy).replaceAll(mobileOn ? _true : _false);
+            copy = d4.matcher(copy).replaceAll(mobileOn ? TRUE : FALSE);
+            copy = b0.matcher(copy).replaceAll(bluetoothOn ? one : zero);
+            copy = b1.matcher(copy).replaceAll(bluetoothOn ? on : off);
+            copy = b2.matcher(copy).replaceAll(bluetoothOn ? ON : OFF);
+            copy = b3.matcher(copy).replaceAll(bluetoothOn ? _true : _false);
+            copy = b4.matcher(copy).replaceAll(bluetoothOn ? TRUE : FALSE);
+            copy = ip4.matcher(copy).replaceAll(NetworkUtils.getIPAddress(true));
+            copy = ip6.matcher(copy).replaceAll(NetworkUtils.getIPAddress(false));
+            copy = nl.matcher(copy).replaceAll(Tuils.NEWLINE);
+
+            int i = Label.network.ordinal();
+
+            labelTexts[i] = Tuils.span(mContext, copy, color, labelSizes[i]);
+            update(labelIndexes[i]);
+            labelViews[i].postDelayed(this, updateTime);
         }
 
-        if(storageIndex == index && storageText != null) {
-            sequence = TextUtils.concat(sequence, storageText);
+        private String apply(int depth, String s, boolean[] on, Pattern... ps) {
+
+            if(ps.length == 0) return s;
+
+            Matcher m = ps[0].matcher(s);
+            while (m.find()) {
+                if(m.groupCount() < 2) {
+                    s = s.replace(m.group(0), Tuils.EMPTYSTRING);
+                    continue;
+                }
+
+                String g1 = m.group(1);
+                String g2 = m.group(2);
+
+                if(depth < maxDepth) {
+                    for(int c = 0; c < ps.length - 1; c++) {
+
+                        boolean[] subOn = new boolean[on.length - 1];
+                        subOn[0] = on[c+1];
+
+                        Pattern[] subPs = new Pattern[ps.length - 1];
+                        subPs[0] = ps[c+1];
+
+                        for(int j = 1, k = 1; j < subOn.length; j++, k++) {
+                            if(k == c+1) {
+                                j--;
+                                continue;
+                            }
+
+                            subOn[j] = on[k];
+                            subPs[j] = ps[k];
+                        }
+
+                        g1 = apply(depth + 1, g1, subOn, subPs);
+                        g2 = apply(depth + 1, g2, subOn, subPs);
+                    }
+                }
+
+                s = s.replace(m.group(0), on[0] ? g1 : g2);
+            }
+
+            return s;
         }
+    };
 
-        if(ramIndex == index && ramText != null) {
-            sequence = TextUtils.concat(sequence, ramText);
+    private void update(float line) {
+        int base = (int) line;
+
+        List<Float> indexs = new ArrayList<>();
+        for(int count = 0; count < Label.values().length; count++) {
+            if((int) labelIndexes[count] == base && labelTexts[count] != null) indexs.add(labelIndexes[count]);
         }
+//        now I'm sorting the labels on the same line for decimals (2.1, 2.0, ...)
+        Collections.sort(indexs);
+
+        CharSequence sequence = Tuils.EMPTYSTRING;
+
+        for(int c = 0; c < indexs.size(); c++) {
+            float i = indexs.get(c);
 
-        if(timeIndex == index && timeText != null) {
-            sequence = TextUtils.concat(sequence, timeText);
+            for(int a = 0; a < Label.values().length; a++) {
+                if(i == labelIndexes[a] && labelTexts[a] != null) sequence = TextUtils.concat(sequence, labelTexts[a]);
+            }
         }
 
-        ts[index].setText(sequence);
+        labelViews[base].setText(sequence);
     }
 
     private boolean showSuggestions;
@@ -401,7 +651,7 @@ public class UIManager implements OnTouchListener {
                 if(multipleCmdSeparator.length() > 0) {
                     String[] split = input.split(multipleCmdSeparator);
                     if(split.length == 0) return;
-                    if(split.length == 1) mTerminalAdapter.setInput(text + Tuils.SPACE);
+                    if(split.length == 1) mTerminalAdapter.setInput(text + (suggestion.type == SuggestionsManager.Suggestion.TYPE_FILE ? Tuils.EMPTYSTRING : Tuils.SPACE));
                     else {
                         split[split.length - 1] = Tuils.EMPTYSTRING;
 
@@ -410,10 +660,10 @@ public class UIManager implements OnTouchListener {
                             beforeInputs = beforeInputs + split[count] + multipleCmdSeparator;
                         }
 
-                        mTerminalAdapter.setInput(beforeInputs + text + Tuils.SPACE);
+                        mTerminalAdapter.setInput(beforeInputs + text + (suggestion.type == SuggestionsManager.Suggestion.TYPE_FILE ? Tuils.EMPTYSTRING : Tuils.SPACE));
                     }
                 } else {
-                    mTerminalAdapter.setInput(text + Tuils.SPACE);
+                    mTerminalAdapter.setInput(text + (suggestion.type == SuggestionsManager.Suggestion.TYPE_FILE ? Tuils.EMPTYSTRING : Tuils.SPACE));
                 }
             }
 
@@ -545,7 +795,7 @@ public class UIManager implements OnTouchListener {
         policy = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
         component = new ComponentName(context, PolicyReceiver.class);
 
-        multipleCmdSeparator = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.multiple_cmd_separator);
+        multipleCmdSeparator = XMLPrefsManager.get(Behavior.multiple_cmd_separator);
 //        selectFirstSuggestionEnter = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.enter_first_suggestion);
 
         mContext = context;
@@ -553,18 +803,16 @@ public class UIManager implements OnTouchListener {
 
         trigger = tri;
 
-        final Typeface lucidaConsole = Typeface.createFromAsset(context.getAssets(), "lucida_console.ttf");
-
         imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
 
-        if (!XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.system_wallpaper) || !canApplyTheme) {
-            rootView.setBackgroundColor(XMLPrefsManager.getColor(XMLPrefsManager.Theme.bg_color));
+        if (!XMLPrefsManager.getBoolean(Ui.system_wallpaper) || !canApplyTheme) {
+            rootView.setBackgroundColor(XMLPrefsManager.getColor(Theme.bg_color));
         } else {
-            rootView.setBackgroundColor(XMLPrefsManager.getColor(XMLPrefsManager.Theme.overlay_color));
+            rootView.setBackgroundColor(XMLPrefsManager.getColor(Theme.overlay_color));
         }
 
 //        scrolllllll
-        if(XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.auto_scroll)) {
+        if(XMLPrefsManager.getBoolean(Behavior.auto_scroll)) {
             rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                 @Override
                 public void onGlobalLayout() {
@@ -577,89 +825,86 @@ public class UIManager implements OnTouchListener {
         }
 
         int rightMM, leftMM, topMM, bottomMM;
-        rightMM = XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.right_margin_mm);
-        leftMM = XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.left_margin_mm);
-        topMM = XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.top_margin_mm);
-        bottomMM = XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.bottom_margin_mm);
+        rightMM = XMLPrefsManager.getInt(Ui.right_margin_mm);
+        leftMM = XMLPrefsManager.getInt(Ui.left_margin_mm);
+        topMM = XMLPrefsManager.getInt(Ui.top_margin_mm);
+        bottomMM = XMLPrefsManager.getInt(Ui.bottom_margin_mm);
 
-        timeSize = XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.time_size);
-        ramSize = XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.ram_size);
-        batterySize = XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.battery_size);
-        storageSize = XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.storage_size);
+        labelSizes[Label.time.ordinal()] = XMLPrefsManager.getInt(Ui.time_size);
+        labelSizes[Label.ram.ordinal()] = XMLPrefsManager.getInt(Ui.ram_size);
+        labelSizes[Label.battery.ordinal()] = XMLPrefsManager.getInt(Ui.battery_size);
+        labelSizes[Label.storage.ordinal()] = XMLPrefsManager.getInt(Ui.storage_size);
+        labelSizes[Label.network.ordinal()] = XMLPrefsManager.getInt(Ui.network_size);
 
         DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
         rootView.setPadding(Tuils.mmToPx(metrics, leftMM), Tuils.mmToPx(metrics, topMM), Tuils.mmToPx(metrics, rightMM), Tuils.mmToPx(metrics, bottomMM));
 
-//        batt, ram, ...
-        ts = new TextView[] {
+        labelViews = new TextView[] {
                 (TextView) rootView.findViewById(R.id.tv0),
                 (TextView) rootView.findViewById(R.id.tv1),
                 (TextView) rootView.findViewById(R.id.tv2),
                 (TextView) rootView.findViewById(R.id.tv3),
-                (TextView) rootView.findViewById(R.id.tv4)
+                (TextView) rootView.findViewById(R.id.tv4),
+                (TextView) rootView.findViewById(R.id.tv5)
         };
 
-        boolean showRam = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_ram);
-        boolean showStorage = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_storage_info);
-        boolean showDevice = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_device_name);
-        boolean showTime = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_time);
-        boolean showBattery = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_battery);
-
-        int rIndex = showRam ? XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.ram_index) : Integer.MAX_VALUE;
-        int dIndex = showDevice ? XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.device_index) : Integer.MAX_VALUE;
-        int bIndex = showBattery ? XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.battery_index) : Integer.MAX_VALUE;
-        int tIndex = showTime ? XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.time_index) : Integer.MAX_VALUE;
-        int sIndex = showStorage ? XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.storage_index) : Integer.MAX_VALUE;
-
-        final int RAM = 1;
-        final int DEVICE = 2;
-        final int TIME = 3;
-        final int BATTERY = 4;
-        final int STORAGE = 5;
+        boolean showRam = XMLPrefsManager.getBoolean(Ui.show_ram);
+        boolean showStorage = XMLPrefsManager.getBoolean(Ui.show_storage_info);
+        boolean showDevice = XMLPrefsManager.getBoolean(Ui.show_device_name);
+        boolean showTime = XMLPrefsManager.getBoolean(Ui.show_time);
+        boolean showBattery = XMLPrefsManager.getBoolean(Ui.show_battery);
+        boolean showNetwork = XMLPrefsManager.getBoolean(Ui.show_network_info);
+
+        float rIndex = showRam ? XMLPrefsManager.getFloat(Ui.ram_index) : Integer.MAX_VALUE;
+        float dIndex = showDevice ? XMLPrefsManager.getFloat(Ui.device_index) : Integer.MAX_VALUE;
+        float bIndex = showBattery ? XMLPrefsManager.getFloat(Ui.battery_index) : Integer.MAX_VALUE;
+        float tIndex = showTime ? XMLPrefsManager.getFloat(Ui.time_index) : Integer.MAX_VALUE;
+        float sIndex = showStorage ? XMLPrefsManager.getFloat(Ui.storage_index) : Integer.MAX_VALUE;
+        float nIndex = showNetwork ? XMLPrefsManager.getFloat(Ui.network_index) : Integer.MAX_VALUE;
+
+        int[] pos = {
+                XMLPrefsManager.getInt(Ui.status_line0_position),
+                XMLPrefsManager.getInt(Ui.status_line1_position),
+                XMLPrefsManager.getInt(Ui.status_line2_position),
+                XMLPrefsManager.getInt(Ui.status_line3_position),
+                XMLPrefsManager.getInt(Ui.status_line4_position),
+                XMLPrefsManager.getInt(Ui.status_line5_position)
+        };
 
-        final Typeface t = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.system_font) ? Typeface.DEFAULT : lucidaConsole;
+        AllowEqualsSequence sequence = new AllowEqualsSequence(new float[] {rIndex, dIndex, bIndex, tIndex, sIndex, nIndex},
+                new Object[] {Label.ram, Label.device, Label.battery, Label.time, Label.storage, Label.network});
 
-        AllowEqualsSequence sequence = new AllowEqualsSequence(new int[] {rIndex, dIndex, bIndex, tIndex, sIndex}, new Integer[] {RAM, DEVICE, BATTERY, TIME, STORAGE});
-        for(int count = 0; count < ts.length; count++) {
+        for(int count = 0; count < labelViews.length; count++) {
             Object[] os = sequence.get(count);
 
-            for(Object o : os) {
-                int i = (Integer) o;
-
-                switch (i) {
-                    case RAM:
-                        this.ramIndex = count;
-                        break;
-                    case DEVICE:
-                        this.deviceIndex = count;
-                        break;
-                    case BATTERY:
-                        this.batteryIndex = count;
-                        break;
-                    case STORAGE:
-                        this.storageIndex = count;
-                        break;
-                    case TIME:
-                        this.timeIndex = count;
-                        break;
-                }
+//            views on the same line
+            for(int j = 0; j < os.length; j++) {
+//                i is the object gave to the constructor
+                int i = ((Label) os[j]).ordinal();
+//                v is the adjusted index (2.0, 2.1, 2.2, ...)
+                float v = (float) count + ((float) j * 0.1f);
+
+                labelIndexes[i] = v;
             }
 
             if(count >= sequence.getMinKey() && count <= sequence.getMaxKey() && os.length > 0) {
-                ts[count].setTypeface(t);
+                labelViews[count].setTypeface(Tuils.getTypeface(context));
+
+                int p = pos[count];
+                if(p >= 0) labelViews[count].setGravity(p == 0 ? Gravity.CENTER_HORIZONTAL : Gravity.RIGHT);
             } else {
-                ts[count].setVisibility(View.GONE);
+                labelViews[count].setVisibility(View.GONE);
             }
         }
 
         if (showRam) {
             memory = new ActivityManager.MemoryInfo();
             activityManager = (ActivityManager) context.getSystemService(Activity.ACTIVITY_SERVICE);
-            ts[this.ramIndex].post(ramRunnable);
+            labelViews[Label.ram.ordinal()].post(ramRunnable);
         }
 
         if(showStorage) {
-            ts[this.storageIndex].post(storageRunnable);
+            labelViews[Label.storage.ordinal()].post(storageRunnable);
         }
 
         if (showDevice) {
@@ -667,10 +912,10 @@ public class UIManager implements OnTouchListener {
             Pattern DV = Pattern.compile("%d", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
             Pattern NEWLINE = Pattern.compile("%n", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
 
-            String deviceFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.device_format);
+            String deviceFormat = XMLPrefsManager.get(Behavior.device_format);
 
-            String username = XMLPrefsManager.get(XMLPrefsManager.Ui.username);
-            String deviceName = XMLPrefsManager.get(XMLPrefsManager.Ui.deviceName);
+            String username = XMLPrefsManager.get(Ui.username);
+            String deviceName = XMLPrefsManager.get(Ui.deviceName);
             if (deviceName == null || deviceName.length() == 0) {
                 deviceName = Build.DEVICE;
             }
@@ -679,17 +924,17 @@ public class UIManager implements OnTouchListener {
             deviceFormat = DV.matcher(deviceFormat).replaceAll(Matcher.quoteReplacement(deviceName));
             deviceFormat = NEWLINE.matcher(deviceFormat).replaceAll(Matcher.quoteReplacement(Tuils.NEWLINE));
 
-            deviceText = Tuils.span(mContext, deviceFormat, XMLPrefsManager.getColor(XMLPrefsManager.Theme.device_color), XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.device_size));
-            update(this.deviceIndex);
+            labelTexts[Label.device.ordinal()] = Tuils.span(mContext, deviceFormat, XMLPrefsManager.getColor(Theme.device_color), XMLPrefsManager.getInt(Ui.device_size));
+            update(labelIndexes[Label.device.ordinal()]);
         }
 
         if(showTime) {
-            ts[this.timeIndex].post(timeRunnable);
+            labelViews[Label.time.ordinal()].post(timeRunnable);
         }
 
         if(showBattery) {
-            mediumPercentage = XMLPrefsManager.get(int.class, XMLPrefsManager.Behavior.battery_medium);
-            lowPercentage = XMLPrefsManager.get(int.class, XMLPrefsManager.Behavior.battery_low);
+            mediumPercentage = XMLPrefsManager.getInt(Behavior.battery_medium);
+            lowPercentage = XMLPrefsManager.getInt(Behavior.battery_low);
 
             Tuils.registerBatteryReceiver(context, batteryUpdate);
         } else {
@@ -697,7 +942,11 @@ public class UIManager implements OnTouchListener {
         }
 //        batt, ram, ...
 
-        final boolean inputBottom = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.input_bottom);
+        if(showNetwork) {
+            labelViews[Label.network.ordinal()].post(networkRunnable);
+        }
+
+        final boolean inputBottom = XMLPrefsManager.getBoolean(Ui.input_bottom);
         int layoutId = inputBottom ? R.layout.input_down_layout : R.layout.input_up_layout;
 
         LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
@@ -714,14 +963,14 @@ public class UIManager implements OnTouchListener {
         TextView prefixView = (TextView) inputOutputView.findViewById(R.id.prefix_view);
 
         ImageButton submitView = (ImageButton) inputOutputView.findViewById(R.id.submit_tv);
-        boolean showSubmit = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_enter_button);
+        boolean showSubmit = XMLPrefsManager.getBoolean(Ui.show_enter_button);
         if (!showSubmit) {
             submitView.setVisibility(View.GONE);
             submitView = null;
         }
 
 //        toolbar
-        boolean showToolbar = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Toolbar.show_toolbar);
+        boolean showToolbar = XMLPrefsManager.getBoolean(Toolbar.show_toolbar);
         ImageButton backView = null;
         ImageButton nextView = null;
         ImageButton deleteView = null;
@@ -736,7 +985,7 @@ public class UIManager implements OnTouchListener {
             pasteView = (ImageButton) inputOutputView.findViewById(R.id.paste_view);
         }
 
-        if (XMLPrefsManager.get(boolean.class, XMLPrefsManager.Suggestions.show_suggestions)) {
+        if (XMLPrefsManager.getBoolean(Suggestions.show_suggestions)) {
             showSuggestions = true;
 
             HorizontalScrollView sv = (HorizontalScrollView) rootView.findViewById(R.id.suggestions_container);
@@ -769,8 +1018,8 @@ public class UIManager implements OnTouchListener {
                     textView.setLongClickable(false);
                     textView.setClickable(true);
 
-                    textView.setTypeface(t);
-                    textView.setTextSize(XMLPrefsManager.get(int.class, XMLPrefsManager.Suggestions.suggestions_size));
+                    textView.setTypeface(Tuils.getTypeface(context));
+                    textView.setTextSize(XMLPrefsManager.getInt(Suggestions.suggestions_size));
 
                     textView.setPadding(PADDING, PADDING, PADDING, PADDING);
 
@@ -787,8 +1036,8 @@ public class UIManager implements OnTouchListener {
             this.clickListener = null;
         }
 
-        lockOnDbTap = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.double_tap_lock);
-        doubleTapCmd = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.double_tap_cmd);
+        lockOnDbTap = XMLPrefsManager.getBoolean(Behavior.double_tap_lock);
+        doubleTapCmd = XMLPrefsManager.get(Behavior.double_tap_cmd);
         if(!lockOnDbTap && doubleTapCmd == null) {
             policy = null;
             component = null;
@@ -798,7 +1047,7 @@ public class UIManager implements OnTouchListener {
         mTerminalAdapter = new TerminalManager(terminalView, inputView, prefixView, submitView, backView, nextView, deleteView, pasteView, context, mainPack);
         mTerminalAdapter.setInputListener(inputListener);
 
-        if(XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.show_hints)) {
+        if(XMLPrefsManager.getBoolean(Behavior.show_hints)) {
             MessagesManager messagesManager = new MessagesManager(context,
                     new MessagesManager.Message(context.getString(R.string.hint_alias)),
                     new MessagesManager.Message(context.getString(R.string.hint_appgroups)),
@@ -822,6 +1071,10 @@ public class UIManager implements OnTouchListener {
         }
     }
 
+    public void dispose() {
+        handler.removeCallbacksAndMessages(null);
+    }
+
     public void openKeyboard() {
         mTerminalAdapter.requestInputFocus();
         imm.showSoftInput(mTerminalAdapter.getInputView(), InputMethodManager.SHOW_IMPLICIT);
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/Command.java b/app/src/main/java/ohi/andre/consolelauncher/commands/Command.java
index b208ef03573157c62d96a25d29f71ff855ee10e6..e104cc4f82edca057ee7b8fe0a35ebe08f9fee9f 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/Command.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/Command.java
@@ -29,11 +29,14 @@ public class Command {
                 return cmd.onNotArgEnough(info, 0);
             }
 
-            int[] args = info.get(Param.class, 0).args();
-            if(args == null || !(mArgs[0] instanceof Param)) return resources.getString(R.string.output_invalid_param) + Tuils.SPACE + mArgs[0];
-
             Param param = (Param) mArgs[0];
 
+            int[] args = param.args();
+            if(args == null || mArgs[0] instanceof String) {
+                if(((String) mArgs[0]).length() == 0) cmd.onNotArgEnough(info, 0);
+                else return resources.getString(R.string.output_invalid_param) + Tuils.SPACE + mArgs[0];
+            }
+
             if(indexNotFound != -1) {
                 param.onArgNotFound(info, indexNotFound);
             }
@@ -64,7 +67,8 @@ public class Command {
 
         int[] args;
         if (useParamArgs) {
-            args = ((Param) mArgs[0]).args();
+            if(!(mArgs[0] instanceof Param)) args = null;
+            else args = ((Param) mArgs[0]).args();
         } else {
             args = cmd.argType();
         }
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandAbstraction.java b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandAbstraction.java
index 5fa17a3d50017370e135f723a1e369e9b2a6667a..1f4f9c616977adf37f5c0de8ec26155f73725576 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandAbstraction.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandAbstraction.java
@@ -23,6 +23,7 @@ public interface CommandAbstraction {
     int NO_SPACE_STRING = 27;
     int APP_GROUP = 28;
     int APP_INSIDE_GROUP = 29;
+    int LONG = 30;
 
     String exec(ExecutePack pack) throws Exception;
 
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandTuils.java b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandTuils.java
index e0e0dd6aeeb4bde146d1ccf25f6f4980f10e6b34..9bec0aa42b87ddd9e4b7617f2d952065beb5144d 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandTuils.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandTuils.java
@@ -16,9 +16,11 @@ import ohi.andre.consolelauncher.managers.AppsManager;
 import ohi.andre.consolelauncher.managers.ContactManager;
 import ohi.andre.consolelauncher.managers.FileManager;
 import ohi.andre.consolelauncher.managers.FileManager.DirInfo;
-import ohi.andre.consolelauncher.managers.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
 import ohi.andre.consolelauncher.managers.music.MusicManager2;
 import ohi.andre.consolelauncher.managers.notifications.NotificationManager;
+import ohi.andre.consolelauncher.managers.xml.options.Apps;
+import ohi.andre.consolelauncher.managers.xml.options.Notifications;
 import ohi.andre.consolelauncher.tuils.SimpleMutableEntry;
 import ohi.andre.consolelauncher.tuils.Tuils;
 
@@ -56,8 +58,12 @@ public class CommandTuils {
             if(cmd instanceof ParamCommand) {
                 ArgInfo arg = param((MainPack) info, (ParamCommand) cmd, input);
                 if(arg == null || !arg.found) {
+                    command.indexNotFound = 0;
+                    args.add(input);
+                    command.nArgs = 1;
+                    command.mArgs = args.toArray(new Object[args.size()]);
                     return command;
-                }
+                } else
 
                 input = arg.residualString;
                 Param p = (Param) arg.arg;
@@ -167,6 +173,8 @@ public class CommandTuils {
             return noSpaceString(input);
         } else if(type == CommandAbstraction.APP_INSIDE_GROUP) {
             return activityName(input, ((MainPack) info).appsManager);
+        } else if(type == CommandAbstraction.LONG) {
+            return numberLong(input);
         }
 
         return null;
@@ -175,6 +183,22 @@ public class CommandTuils {
 
 //	args extractors {
 
+    private static ArgInfo numberLong(String input) {
+        String[] split = input.split(Tuils.SPACE);
+
+        try {
+            long l = Long.parseLong(split[0]);
+
+            StringBuilder builder = new StringBuilder();
+            for(int c = 1; c < split.length; c++) {
+                builder.append(split[c]).append(Tuils.SPACE);
+            }
+            return new ArgInfo(l, builder.toString().trim(), true, 1);
+        } catch (Exception e) {
+            return new ArgInfo(null, input, false, 0);
+        }
+    }
+
     private static ArgInfo color(String input) {
         input = input.trim();
 
@@ -382,7 +406,7 @@ public class CommandTuils {
     private static ArgInfo contactNumber(String input, ContactManager contacts) {
         String number;
 
-        if (Tuils.isNumber(input))
+        if (Tuils.isPhoneNumber(input))
             number = input;
         else
             number = contacts.findNumber(input);
@@ -403,8 +427,8 @@ public class CommandTuils {
             for(XMLPrefsManager.XMLPrefsRoot element : XMLPrefsManager.XMLPrefsRoot.values()) {
                 xmlPrefsEntrys.addAll(element.copy);
             }
-            Collections.addAll(xmlPrefsEntrys, AppsManager.Options.values());
-            Collections.addAll(xmlPrefsEntrys, NotificationManager.Options.values());
+            Collections.addAll(xmlPrefsEntrys, Apps.values());
+            Collections.addAll(xmlPrefsEntrys, Notifications.values());
         }
 
         String candidate = index == -1 ? input : input.substring(0,index);
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 80f9b13193ab3b95ee451f189ce9c670f4e492ed..6d5b429c01090667f04f03d718a79cb479417731 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandsPreferences.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandsPreferences.java
@@ -4,7 +4,8 @@ import android.util.SparseArray;
 
 import java.util.HashMap;
 
-import ohi.andre.consolelauncher.managers.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.options.Cmd;
 
 /**
  * Created by francescoandreuzzi on 06/01/2017.
@@ -21,7 +22,7 @@ public class CommandsPreferences {
 
 //        search
         Preference searchP = new Preference();
-        searchP.add(XMLPrefsManager.get(String.class, XMLPrefsManager.Cmd.default_search), DEFAULT_PARAM);
+        searchP.add(XMLPrefsManager.get(Cmd.default_search), DEFAULT_PARAM);
         preferenceHashMap.put("search", searchP);
     }
 
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/ExecutePack.java b/app/src/main/java/ohi/andre/consolelauncher/commands/ExecutePack.java
index da4db50bcbf7732be7fb461a282436f3870a7546..27ae035d77b5bdd925226e7a4b0249ff526f6558 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/ExecutePack.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/ExecutePack.java
@@ -2,6 +2,11 @@ package ohi.andre.consolelauncher.commands;
 
 import android.content.Context;
 
+import java.util.ArrayList;
+
+import ohi.andre.consolelauncher.managers.AppsManager;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+
 @SuppressWarnings("deprecation")
 public abstract class ExecutePack {
 
@@ -9,17 +14,49 @@ public abstract class ExecutePack {
     public Context context;
     public CommandGroup commandGroup;
 
+    public int currentIndex = 0;
+
     public ExecutePack(CommandGroup group) {
         this.commandGroup = group;
     }
 
     @SuppressWarnings("unchecked")
+    public <T> T get(Class<T> c) {
+        return (T) get();
+    }
+
     public <T> T get(Class<T> c, int index) {
-        if (index >= this.args.length) {
-            return null;
-        }
+        if(index < args.length) return (T) args[index];
+        return null;
+    }
+
+    public Object get() {
+        if(currentIndex < args.length) return args[currentIndex++];
+        return null;
+    }
+
+    public String getString() {
+        return (String) get();
+    }
+
+    public int getInt() {
+        return (int) get();
+    }
+
+    public boolean getBoolean() {
+        return (boolean) get();
+    }
+
+    public ArrayList getList() {
+        return (ArrayList) get();
+    }
+
+    public XMLPrefsManager.XMLPrefsSave getPrefsSave() {
+        return (XMLPrefsManager.XMLPrefsSave) get();
+    }
 
-        return (T) (this.args[index]);
+    public AppsManager.LaunchInfo getLaunchInfo() {
+        return (AppsManager.LaunchInfo) get();
     }
 
     public void set(Object[] args) {
@@ -28,5 +65,6 @@ public abstract class ExecutePack {
 
     public void clear() {
         args = null;
+        currentIndex = 0;
     }
 }
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/MainPack.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/MainPack.java
index 6d32798b87a903b28d1c7a778d9027deac469cf8..e24703281dc3a9dc51f17130a5f587f7c5c93ca9 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/MainPack.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/MainPack.java
@@ -15,9 +15,11 @@ import ohi.andre.consolelauncher.commands.ExecutePack;
 import ohi.andre.consolelauncher.managers.AliasManager;
 import ohi.andre.consolelauncher.managers.AppsManager;
 import ohi.andre.consolelauncher.managers.ContactManager;
-import ohi.andre.consolelauncher.managers.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.RssManager;
 import ohi.andre.consolelauncher.managers.flashlight.TorchManager;
 import ohi.andre.consolelauncher.managers.music.MusicManager2;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.options.Behavior;
 import ohi.andre.consolelauncher.tuils.interfaces.CommandExecuter;
 import ohi.andre.consolelauncher.tuils.interfaces.Redirectator;
 import ohi.andre.consolelauncher.tuils.interfaces.Reloadable;
@@ -77,14 +79,18 @@ public class MainPack extends ExecutePack {
 
     public ShellHolder shellHolder;
 
+    public RssManager rssManager;
+
     public MainPack(Context context, CommandGroup commandGroup, AliasManager alMgr, AppsManager appmgr, MusicManager2 p,
-                    ContactManager c, Reloadable r, CommandExecuter executeCommand, Redirectator redirectator, ShellHolder shellHolder) {
+                    ContactManager c, Reloadable r, CommandExecuter executeCommand, Redirectator redirectator, ShellHolder shellHolder, RssManager rssManager) {
         super(commandGroup);
 
-        this.currentDirectory = XMLPrefsManager.get(File.class, XMLPrefsManager.Behavior.home_path);
+        this.currentDirectory = XMLPrefsManager.get(File.class, Behavior.home_path);
 
         this.shellHolder = shellHolder;
 
+        this.rssManager = rssManager;
+
         this.res = context.getResources();
 
         this.executer = executeCommand;
@@ -140,5 +146,6 @@ public class MainPack extends ExecutePack {
     public void destroy() {
         if(player != null) player.destroy();
         appsManager.onDestroy();
+        if(rssManager != null) rssManager.dispose();
     }
 }
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/alias.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/alias.java
index 277e8986f36ae1a47b3dfcd535ecffd8d7bbe89d..f467f9c45540d9edd6023754130815d6b5b571c7 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/alias.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/alias.java
@@ -21,7 +21,7 @@ public class alias extends ParamCommand {
         add {
             @Override
             public String exec(ExecutePack pack) {
-                ArrayList<String> args = pack.get(ArrayList.class, 1);
+                ArrayList<String> args = pack.getList();
                 if(args.size() < 2) return pack.context.getString(R.string.output_lessarg);
 
                 if( ((MainPack) pack).aliasManager.add(args.remove(0), Tuils.toPlanString(args, Tuils.SPACE)) ) {
@@ -39,7 +39,7 @@ public class alias extends ParamCommand {
         rm {
             @Override
             public String exec(ExecutePack pack) {
-                ArrayList<String> args = pack.get(ArrayList.class, 1);
+                ArrayList<String> args = pack.getList();
                 if(args.size() < 1) return pack.context.getString(R.string.output_lessarg);
                 if(((MainPack) pack).aliasManager.remove(args.get(0))) return null;
                 else return pack.context.getString(R.string.output_aliasnotfound) + Tuils.SPACE + args.get(0);
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/apps.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/apps.java
index 96f7baeed75bf3b41b9c5a7b5942aaefe7454c82..f7600e9f6d6d1adadea5288e6d6caff8c10ea89b 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/apps.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/apps.java
@@ -14,7 +14,8 @@ import ohi.andre.consolelauncher.commands.ExecutePack;
 import ohi.andre.consolelauncher.commands.main.MainPack;
 import ohi.andre.consolelauncher.commands.specific.ParamCommand;
 import ohi.andre.consolelauncher.managers.AppsManager;
-import ohi.andre.consolelauncher.managers.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.options.Apps;
 import ohi.andre.consolelauncher.tuils.Tuils;
 
 public class apps extends ParamCommand {
@@ -51,7 +52,7 @@ public class apps extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                AppsManager.LaunchInfo i = pack.get(AppsManager.LaunchInfo.class, 1);
+                AppsManager.LaunchInfo i = pack.getLaunchInfo();
                 ((MainPack) pack).appsManager.showActivity(i);
                 return null;
             }
@@ -64,7 +65,7 @@ public class apps extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                AppsManager.LaunchInfo i = pack.get(AppsManager.LaunchInfo.class, 1);
+                AppsManager.LaunchInfo i = pack.getLaunchInfo();
                 ((MainPack) pack).appsManager.hideActivity(i);
                 return null;
             }
@@ -78,7 +79,7 @@ public class apps extends ParamCommand {
             @Override
             public String exec(ExecutePack pack) {
                 try {
-                    AppsManager.LaunchInfo i = pack.get(AppsManager.LaunchInfo.class, 1);
+                    AppsManager.LaunchInfo i = pack.getLaunchInfo();
 
                     PackageInfo info = pack.context.getPackageManager().getPackageInfo(i.componentName.getPackageName(), PackageManager.GET_PERMISSIONS | PackageManager.GET_ACTIVITIES | PackageManager.GET_SERVICES | PackageManager.GET_RECEIVERS);
                     return AppsManager.AppUtils.format(i, info);
@@ -95,7 +96,7 @@ public class apps extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                openPlaystore(pack.context, pack.get(AppsManager.LaunchInfo.class, 1).componentName.getPackageName());
+                openPlaystore(pack.context, pack.getLaunchInfo().componentName.getPackageName());
                 return null;
             }
         },
@@ -107,9 +108,9 @@ public class apps extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                int index = pack.get(int.class, 1);
+                int index = pack.getInt();
 
-                Object o = pack.get(Object.class, 2);
+                Object o = pack.get();
 
                 String marker;
                 if(o instanceof AppsManager.LaunchInfo) {
@@ -120,7 +121,7 @@ public class apps extends ParamCommand {
                 }
 
                 try {
-                    XMLPrefsManager.XMLPrefsSave save = AppsManager.Options.valueOf("default_app_n" + index);
+                    XMLPrefsManager.XMLPrefsSave save = Apps.valueOf("default_app_n" + index);
                     save.parent().write(save, marker);
                     return null;
                 } catch (Exception e) {
@@ -145,7 +146,7 @@ public class apps extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                openSettings(pack.context, pack.get(AppsManager.LaunchInfo.class, 1).componentName.getPackageName());
+                openSettings(pack.context, pack.getLaunchInfo().componentName.getPackageName());
                 return null;
             }
         },
@@ -157,7 +158,7 @@ public class apps extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                Intent intent = ((MainPack) pack).appsManager.getIntent(pack.get(AppsManager.LaunchInfo.class, 1));
+                Intent intent = ((MainPack) pack).appsManager.getIntent(pack.getLaunchInfo());
                 pack.context.startActivity(intent);
 
                 return null;
@@ -175,6 +176,86 @@ public class apps extends ParamCommand {
                 return null;
             }
         },
+//        services {
+//            @Override
+//            public int[] args() {
+//                return new int[] {CommandAbstraction.VISIBLE_PACKAGE};
+//            }
+//
+//            @Override
+//            public String exec(ExecutePack pack) {
+//                AppsManager.LaunchInfo info = pack.get(AppsManager.LaunchInfo.class, 1);
+//
+//                List<String> services = new ArrayList<>();
+//
+//                ActivityManager activityManager = (ActivityManager) pack.context.getSystemService(Context.ACTIVITY_SERVICE);
+//                for(ActivityManager.RunningServiceInfo i : activityManager.getRunningServices(Integer.MAX_VALUE)) {
+//                    ComponentName name = i.service;
+//
+//                    if(info.equals(name.getPackageName())) {
+//                        services.add(name.getClassName().replace(name.getPackageName(), Tuils.EMPTYSTRING));
+//                    }
+//                }
+//
+//                if(services.size() == 0) return "[]";
+//                Collections.sort(services);
+//                return Tuils.toPlanString(services, Tuils.NEWLINE);
+//            }
+//
+//            @Override
+//            public String onNotArgEnough(ExecutePack pack, int n) {
+//
+//                List<SimpleMutableEntry<String, ArrayList<String>>> services = new ArrayList<>();
+//
+//                ActivityManager activityManager = (ActivityManager) pack.context.getSystemService(Context.ACTIVITY_SERVICE);
+//                Tuils.log(activityManager.getRunningServices(Integer.MAX_VALUE).toString());
+//                for(ActivityManager.RunningServiceInfo i : activityManager.getRunningServices(Integer.MAX_VALUE)) {
+//
+//                    boolean check = false;
+//                    for(SimpleMutableEntry<String, ArrayList<String>> s : services) {
+//                        if(s.getKey().equals(i.service.getPackageName())) {
+//                            s.getValue().add(i.service.getClassName().replace(i.service.getPackageName(), Tuils.EMPTYSTRING));
+//
+//                            check = true;
+//                            break;
+//                        }
+//                    }
+//
+//                    if(!check) {
+//                        SimpleMutableEntry<String,ArrayList<String>> s = new SimpleMutableEntry<>(i.service.getPackageName(), new ArrayList<String>());
+//                        s.getValue().add(i.service.getClassName().replace(i.service.getPackageName(), Tuils.EMPTYSTRING));
+//                        services.add(s);
+//                    }
+//                }
+//
+//                if(services.size() == 0) return "[]";
+//                Collections.sort(services, new Comparator<SimpleMutableEntry<String, ArrayList<String>>>() {
+//                    @Override
+//                    public int compare(SimpleMutableEntry<String, ArrayList<String>> o1, SimpleMutableEntry<String, ArrayList<String>> o2) {
+//                        return o1.getKey().compareTo(o2.getKey());
+//                    }
+//                });
+//
+//                PackageManager manager = pack.context.getPackageManager();
+//                StringBuilder b = new StringBuilder();
+//                for(SimpleMutableEntry<String, ArrayList<String>> s : services) {
+//                    String appName = null;
+//                    try {
+//                        appName = manager.getApplicationInfo(s.getKey(), 0).loadLabel(manager).toString();
+//                    } catch (PackageManager.NameNotFoundException e) {}
+//
+//                    if(appName != null) b.append(appName).append(Tuils.SPACE).append("(").append(s.getKey()).append(")");
+//                    else b.append(s.getKey());
+//                    b.append(Tuils.NEWLINE);
+//
+//                    for(String st : s.getValue()) {
+//                        b.append(" - ").append(st).append(Tuils.NEWLINE);
+//                    }
+//                    b.append(Tuils.NEWLINE);
+//                }
+//                return b.toString().trim();
+//            }
+//        },
         reset {
             @Override
             public int[] args() {
@@ -183,7 +264,7 @@ public class apps extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                AppsManager.LaunchInfo app = pack.get(AppsManager.LaunchInfo.class, 1);
+                AppsManager.LaunchInfo app = pack.getLaunchInfo();
                 app.launchedTimes = 0;
                 ((MainPack) pack).appsManager.writeLaunchTimes(app);
 
@@ -198,7 +279,7 @@ public class apps extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                String name = pack.get(String.class, 1);
+                String name = pack.getString();
                 return ((MainPack) pack).appsManager.createGroup(name);
             }
         },
@@ -210,7 +291,7 @@ public class apps extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                String name = pack.get(String.class, 1);
+                String name = pack.getString();
                 return ((MainPack) pack).appsManager.removeGroup(name);
             }
         },
@@ -222,15 +303,15 @@ public class apps extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                String name = pack.get(String.class, 1);
-                String color = pack.get(String.class, 2);
+                String name = pack.getString();
+                String color = pack.getString();
                 return ((MainPack) pack).appsManager.groupBgColor(name, color);
             }
 
             @Override
             public String onNotArgEnough(ExecutePack pack, int n) {
                 if(n == 2) {
-                    String name = pack.get(String.class, 1);
+                    String name = pack.getString();
                     return ((MainPack) pack).appsManager.groupBgColor(name, Tuils.EMPTYSTRING);
                 }
                 return super.onNotArgEnough(pack, n);
@@ -249,15 +330,15 @@ public class apps extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                String name = pack.get(String.class, 1);
-                String color = pack.get(String.class, 2);
+                String name = pack.getString();
+                String color = pack.getString();
                 return ((MainPack) pack).appsManager.groupForeColor(name, color);
             }
 
             @Override
             public String onNotArgEnough(ExecutePack pack, int n) {
                 if(n == 2) {
-                    String name = pack.get(String.class, 1);
+                    String name = pack.getString();
                     return ((MainPack) pack).appsManager.groupForeColor(name, Tuils.EMPTYSTRING);
                 }
                 return super.onNotArgEnough(pack, n);
@@ -276,7 +357,7 @@ public class apps extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                String name = pack.get(String.class, 1);
+                String name = pack.getString();
                 return ((MainPack) pack).appsManager.listGroup(name);
             }
 
@@ -293,8 +374,8 @@ public class apps extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                String name = pack.get(String.class, 1);
-                AppsManager.LaunchInfo app = pack.get(AppsManager.LaunchInfo.class, 2);
+                String name = pack.getString();
+                AppsManager.LaunchInfo app = pack.getLaunchInfo();
                 return ((MainPack) pack).appsManager.addAppToGroup(name, app);
             }
         },
@@ -306,8 +387,8 @@ public class apps extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                String name = pack.get(String.class, 1);
-                AppsManager.LaunchInfo app = pack.get(AppsManager.LaunchInfo.class, 2);
+                String name = pack.getString();
+                AppsManager.LaunchInfo app = pack.getLaunchInfo();
                 return ((MainPack) pack).appsManager.removeAppFromGroup(name, app);
             }
         },
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/bluetooth.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/bluetooth.java
index 7b53c49fe691aa77beceb577fc7e17ff7dea62c0..dbf60b7801e86d36ee31c9225c10366cc93081f5 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/bluetooth.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/bluetooth.java
@@ -14,7 +14,7 @@ public class bluetooth implements CommandAbstraction {
     public String exec(ExecutePack pack) {
         MainPack info = (MainPack) pack;
         BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
-        if(adapter.getState() == BluetoothAdapter.STATE_ON) {
+        if(adapter.isEnabled()) {
             adapter.disable();
             return info.context.getString(R.string.output_bluetooth) + Tuils.SPACE + "false";
         } else {
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/calc.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/calc.java
index f524cdd2e96f95391bceb420c77d0282b22d5761..12b4875f098bf6843c71378fcf8bfc66e3d6150a 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/calc.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/calc.java
@@ -16,7 +16,7 @@ public class calc extends PermanentSuggestionCommand {
     @Override
     public String exec(ExecutePack pack) throws Exception {
         try {
-            return String.valueOf(Tuils.eval(pack.get(String.class, 0)));
+            return String.valueOf(Tuils.eval(pack.getString()));
         } catch (Exception e) {
             return e.toString();
         }
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/call.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/call.java
index 50e5d3d38c93fc099a873295f580db83a2ccff7f..dd89f05ed9c31f667a9b96871111cdf09e090dee 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/call.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/call.java
@@ -27,7 +27,7 @@ public class call implements CommandAbstraction {
             return info.context.getString(R.string.output_waitingpermission);
         }
 
-        String number = info.get(String.class, 0);
+        String number = info.getString();
         String s = Tuils.EMPTYSTRING;
         for(char c : number.toCharArray()) {
             if(c == '#') s += Uri.encode("#");
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/cntcts.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/cntcts.java
index a5354bbea74c9032270e6c84146225b41509d621..70f544e3a489b627c0018c11870dee8b5ec773e0 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/cntcts.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/cntcts.java
@@ -63,7 +63,7 @@ public class cntcts extends ParamCommand {
                     return pack.context.getString(R.string.output_waitingpermission);
                 }
 
-                ((MainPack) pack).contacts.delete(pack.get(String.class, 1));
+                ((MainPack) pack).contacts.delete(pack.getString());
                 return null;
             }
 
@@ -81,7 +81,7 @@ public class cntcts extends ParamCommand {
             @Override
             public String exec(ExecutePack pack) {
                 Intent editIntent = new Intent(Intent.ACTION_EDIT);
-                editIntent.setDataAndType(((MainPack) pack).contacts.fromPhone(pack.get(String.class, 1)), ContactsContract.Contacts.CONTENT_ITEM_TYPE);
+                editIntent.setDataAndType(((MainPack) pack).contacts.fromPhone(pack.getString()), ContactsContract.Contacts.CONTENT_ITEM_TYPE);
                 pack.context.startActivity(editIntent);
 
                 return null;
@@ -100,7 +100,7 @@ public class cntcts extends ParamCommand {
         l {
             @Override
             public String exec(ExecutePack pack) {
-                String[] about = ((MainPack) pack).contacts.about(pack.get(String.class, 1));
+                String[] about = ((MainPack) pack).contacts.about(pack.getString());
                 StringBuilder builder = new StringBuilder();
 
                 builder.append(about[ContactManager.NAME]).append(Tuils.NEWLINE);
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 7949a5e2b3668e11d334e8631622620975e2942e..3e8fbd676156105929ac72136c17fee7208683ae 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
@@ -10,8 +10,10 @@ import ohi.andre.consolelauncher.commands.ExecutePack;
 import ohi.andre.consolelauncher.commands.main.MainPack;
 import ohi.andre.consolelauncher.commands.specific.ParamCommand;
 import ohi.andre.consolelauncher.managers.AppsManager;
-import ohi.andre.consolelauncher.managers.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
 import ohi.andre.consolelauncher.managers.notifications.NotificationManager;
+import ohi.andre.consolelauncher.managers.xml.options.Apps;
+import ohi.andre.consolelauncher.managers.xml.options.Notifications;
 import ohi.andre.consolelauncher.tuils.Tuils;
 
 /**
@@ -30,8 +32,8 @@ public class config extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                XMLPrefsManager.XMLPrefsSave save = pack.get(XMLPrefsManager.XMLPrefsSave.class, 1);
-                save.parent().write(save, pack.get(String.class, 2));
+                XMLPrefsManager.XMLPrefsSave save = pack.getPrefsSave();
+                save.parent().write(save, pack.getString());
 
                 if(save.label().startsWith("default_app_n")) {
                     return pack.context.getString(R.string.output_usedefapp);
@@ -53,7 +55,7 @@ public class config extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                File file = new File(Tuils.getFolder(), pack.get(String.class, 1));
+                File file = new File(Tuils.getFolder(), pack.getString());
                 pack.context.startActivity(Tuils.openFile(file));
                 return null;
             }
@@ -63,6 +65,26 @@ public class config extends ParamCommand {
                 return pack.context.getString(R.string.output_filenotfound);
             }
         },
+        append {
+            @Override
+            public int[] args() {
+                return new int[] {CommandAbstraction.CONFIG_ENTRY, CommandAbstraction.PLAIN_TEXT};
+            }
+
+            @Override
+            public String exec(ExecutePack pack) {
+                XMLPrefsManager.XMLPrefsSave save = pack.getPrefsSave();
+                save.parent().write(save, XMLPrefsManager.get(save) + pack.getString());
+
+                return null;
+            }
+
+            @Override
+            public String onNotArgEnough(ExecutePack pack, int n) {
+                pack.args = new Object[] {pack.args[0], pack.args[1], Tuils.EMPTYSTRING};
+                return set.exec(pack);
+            }
+        },
         get {
             @Override
             public int[] args() {
@@ -71,7 +93,7 @@ public class config extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                XMLPrefsManager.XMLPrefsSave save = pack.get(XMLPrefsManager.XMLPrefsSave.class, 1);
+                XMLPrefsManager.XMLPrefsSave save = pack.getPrefsSave();
                 String s = XMLPrefsManager.get(String.class, save);
                 if(s.length() == 0) return "\"\"";
                 return s;
@@ -85,7 +107,7 @@ public class config extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                File file = new File(Tuils.getFolder(), pack.get(String.class, 1));
+                File file = new File(Tuils.getFolder(), pack.getString());
                 String name = file.getName();
 
                 for(XMLPrefsManager.XMLPrefsRoot r : XMLPrefsManager.XMLPrefsRoot.values()) {
@@ -111,11 +133,11 @@ public class config extends ParamCommand {
                     }
                 }
                 ss.add(AppsManager.PATH);
-                for(XMLPrefsManager.XMLPrefsSave save : AppsManager.Options.values()) {
+                for(XMLPrefsManager.XMLPrefsSave save : Apps.values()) {
                     ss.add(Tuils.DOUBLE_SPACE + save.label());
                 }
                 ss.add(NotificationManager.PATH);
-                for(XMLPrefsManager.XMLPrefsSave save : NotificationManager.Options.values()) {
+                for(XMLPrefsManager.XMLPrefsSave save : Notifications.values()) {
                     ss.add(Tuils.DOUBLE_SPACE + save.label());
                 }
 
@@ -135,7 +157,7 @@ public class config extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                XMLPrefsManager.XMLPrefsSave save = pack.get(XMLPrefsManager.XMLPrefsSave.class, 1);
+                XMLPrefsManager.XMLPrefsSave save = pack.getPrefsSave();
                 save.parent().write(save, save.defaultValue());
                 return null;
             }
@@ -148,14 +170,32 @@ public class config extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                File file = pack.get(File.class, 1);
+                File file = pack.get(File.class);
+
+                if(!file.getName().endsWith(".xml")) {
+//                    is font
+                    File font = new File(Tuils.getFolder(), Tuils.FONT_PATH);
+                    if(font.exists()) {
+                        File[] files = font.listFiles();
+                        if(files.length > 0) Tuils.insertOld(files[0]);
+                        Tuils.deleteContent(font);
+                    } else {
+                        font.mkdir();
+                    }
 
-                File old = new File(Tuils.getFolder(), file.getName());
-                Tuils.insertOld(old);
+                    File dest = new File(font, file.getName());
+                    file.renameTo(dest);
 
-                file.renameTo(new File(Tuils.getFolder(), file.getName()));
+                    return "Path: " + dest.getAbsolutePath();
+                } else {
+                    File old = new File(Tuils.getFolder(), file.getName());
+                    Tuils.insertOld(old);
 
-                return null;
+                    File dest = new File(Tuils.getFolder(), file.getName());
+                    file.renameTo(dest);
+
+                    return "Path: " + dest.getAbsolutePath();
+                }
             }
         },
         tutorial {
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/devutils.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/devutils.java
index 4c143cd7d82b4a60616fc209f9cfe7863e99f815..1360647fb43c89da86000bbd5bb94f08b4cd9f2a 100644
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/devutils.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/devutils.java
@@ -23,7 +23,7 @@ public class devutils extends ParamCommand {
         notify {
             @Override
             public String exec(ExecutePack pack) {
-                List<String> text = pack.get(List.class, 1);
+                List<String> text = pack.getList();
 
                 String title, txt = null;
                 if(text.size() == 0) return null;
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/help.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/help.java
index 21f5be37895597a27b32829d18ecf7a7efe5e81e..5644336242fa44e50d3444a9ac1acbfeb77f3507 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/help.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/help.java
@@ -17,7 +17,7 @@ public class help implements CommandAbstraction {
     @Override
     public String exec(ExecutePack pack) throws Exception {
         MainPack info = (MainPack) pack;
-        CommandAbstraction cmd = info.get(CommandAbstraction.class, 0);
+        CommandAbstraction cmd = info.get(CommandAbstraction.class);
         int res = cmd == null ? R.string.output_commandnotfound : cmd.helpRes();
         return info.res.getString(res);
     }
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/music.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/music.java
index e402c36b8331954e604ff0c7b0e3a73a07cf59aa..077e65b2d5d6465ceabae7795cab9810b41fbbc3 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/music.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/music.java
@@ -8,19 +8,19 @@ import ohi.andre.consolelauncher.commands.specific.ParamCommand;
 import ohi.andre.consolelauncher.managers.music.MusicManager2;
 import ohi.andre.consolelauncher.managers.music.Song;
 import ohi.andre.consolelauncher.tuils.Tuils;
+import ohi.andre.consolelauncher.tuils.libsuperuser.Shell;
 
 public class music extends ParamCommand {
 
     private enum Param implements ohi.andre.consolelauncher.commands.main.Param {
         next {
-            @Override
-            public int[] args() {
-                return new int[0];
-            }
 
             @Override
             public String exec(ExecutePack pack) {
-                if(((MainPack) pack).player == null) return pack.context.getString(R.string.output_musicdisabled);
+                if(((MainPack) pack).player == null) {
+                    execute("NEXT");
+                    return null;
+                }
 
                 String title = ((MainPack) pack).player.playNext();
                 if(title != null) return pack.context.getString(R.string.output_playing) + Tuils.SPACE + title;
@@ -28,14 +28,13 @@ public class music extends ParamCommand {
             }
         },
         previous {
-            @Override
-            public int[] args() {
-                return new int[0];
-            }
 
             @Override
             public String exec(ExecutePack pack) {
-                if(((MainPack) pack).player == null) return pack.context.getString(R.string.output_musicdisabled);
+                if(((MainPack) pack).player == null) {
+                    execute("PREVIOUS");
+                    return null;
+                }
 
                 String title = ((MainPack) pack).player.playPrev();
                 if(title != null) return pack.context.getString(R.string.output_playing) + Tuils.SPACE + title;
@@ -43,10 +42,6 @@ public class music extends ParamCommand {
             }
         },
         ls {
-            @Override
-            public int[] args() {
-                return new int[0];
-            }
 
             @Override
             public String exec(ExecutePack pack) {
@@ -56,14 +51,13 @@ public class music extends ParamCommand {
             }
         },
         play {
-            @Override
-            public int[] args() {
-                return new int[0];
-            }
 
             @Override
             public String exec(ExecutePack pack) {
-                if(((MainPack) pack).player == null) return pack.context.getString(R.string.output_musicdisabled);
+                if(((MainPack) pack).player == null) {
+                    execute("PLAY_PAUSE");
+                    return null;
+                }
 
                 String title = ((MainPack) pack).player.play();
                 if(title == null) return null;
@@ -71,14 +65,13 @@ public class music extends ParamCommand {
             }
         },
         stop {
-            @Override
-            public int[] args() {
-                return new int[0];
-            }
 
             @Override
             public String exec(ExecutePack pack) {
-                if(((MainPack) pack).player == null) return pack.context.getString(R.string.output_musicdisabled);
+                if(((MainPack) pack).player == null) {
+                    execute("CLOSE");
+                    return null;
+                }
 
                 ((MainPack) pack).player.stop();
                 return null;
@@ -94,7 +87,7 @@ public class music extends ParamCommand {
             public String exec(ExecutePack pack) {
                 if(((MainPack) pack).player == null) return pack.context.getString(R.string.output_musicdisabled);
 
-                String s = pack.get(String.class, 1);
+                String s = pack.getString();
                 ((MainPack) pack).player.select(s);
                 return null;
             }
@@ -105,10 +98,6 @@ public class music extends ParamCommand {
             }
         },
         info {
-            @Override
-            public int[] args() {
-                return new int[0];
-            }
 
             @Override
             public String exec(ExecutePack pack) {
@@ -151,7 +140,7 @@ public class music extends ParamCommand {
             public String exec(ExecutePack pack) {
                 if(((MainPack) pack).player == null) return pack.context.getString(R.string.output_musicdisabled);
 
-                ((MainPack) pack).player.seekTo(pack.get(int.class, 1) * 1000);
+                ((MainPack) pack).player.seekTo(pack.getInt() * 1000);
                 return null;
             }
 
@@ -195,6 +184,15 @@ public class music extends ParamCommand {
         public String onNotArgEnough(ExecutePack pack, int n) {
             return pack.context.getString(R.string.help_music);
         }
+
+        @Override
+        public int[] args() {
+            return new int[0];
+        }
+    }
+
+    private static void execute(String code) {
+        Shell.SH.run("input keyevent KEYCODE_MEDIA_" + code);
     }
 
     @Override
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 a3ab9701d87d1ab5f7876451b8821fd8f24a0666..683132af77d622593ff453d402edd0c22f372bc9 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
@@ -9,7 +9,6 @@ import ohi.andre.consolelauncher.commands.CommandAbstraction;
 import ohi.andre.consolelauncher.commands.ExecutePack;
 import ohi.andre.consolelauncher.commands.main.MainPack;
 import ohi.andre.consolelauncher.commands.specific.ParamCommand;
-import ohi.andre.consolelauncher.managers.AppsManager;
 import ohi.andre.consolelauncher.managers.notifications.NotificationManager;
 import ohi.andre.consolelauncher.tuils.Tuils;
 
@@ -24,7 +23,7 @@ public class notifications extends ParamCommand {
         inc {
             @Override
             public String exec(ExecutePack pack) {
-                NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.get(AppsManager.LaunchInfo.class, 1).componentName.getPackageName(), null, true));
+                NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.getLaunchInfo().componentName.getPackageName(), null, true));
                 return null;
             }
 
@@ -41,7 +40,7 @@ public class notifications extends ParamCommand {
         exc {
             @Override
             public String exec(ExecutePack pack) {
-                NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.get(AppsManager.LaunchInfo.class, 1).componentName.getPackageName(), null, false));
+                NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.getLaunchInfo().componentName.getPackageName(), null, false));
                 return null;
             }
 
@@ -59,7 +58,9 @@ public class notifications extends ParamCommand {
             @Override
             public String exec(ExecutePack pack) {
                 try {
-                    NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.get(AppsManager.LaunchInfo.class, 2).componentName.getPackageName(), pack.get(String.class, 1), true));
+                    String s = pack.getString();
+
+                    NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.getLaunchInfo().componentName.getPackageName(), s, true));
                 } catch (Exception e) {}
                 return null;
             }
@@ -81,8 +82,8 @@ public class notifications extends ParamCommand {
         title_filter {
             @Override
             public String exec(ExecutePack pack) {
-                int id = pack.get(int.class, 1);
-                NotificationManager.excludeRegex(pack.get(String.class, 2), "title", id);
+                int id = pack.getInt();
+                NotificationManager.excludeRegex(pack.getString(), "title", id);
                 return null;
             }
 
@@ -99,8 +100,8 @@ public class notifications extends ParamCommand {
         text_filter {
             @Override
             public String exec(ExecutePack pack) {
-                int id = pack.get(int.class, 1);
-                NotificationManager.excludeRegex(pack.get(String.class, 2), "text", id);
+                int id = pack.getInt();
+                NotificationManager.excludeRegex(pack.getString(), "text", id);
                 return null;
             }
 
@@ -122,8 +123,8 @@ public class notifications extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                int id = pack.get(int.class, 1);
-                NotificationManager.applyFilter(id, pack.get(AppsManager.LaunchInfo.class, 2).componentName.getPackageName());
+                int id = pack.getInt();
+                NotificationManager.applyFilter(id, pack.getLaunchInfo().componentName.getPackageName());
                 return null;
             }
 
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/open.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/open.java
index 860d2092062b72562f7e94651442476f4e011586..1b330d19e7b5a969f9406178ce71e19135ced5ee 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/open.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/open.java
@@ -14,7 +14,7 @@ public class open implements CommandAbstraction {
     @Override
     public String exec(ExecutePack pack) {
         MainPack info = (MainPack) pack;
-        File file = info.get(File.class, 0);
+        File file = info.get(File.class);
 
         int result = FileManager.openFile(info.context, file);
 
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 8f7d63c284489440a4d5536feb030b1cf56073dc..da1883467a218b183d19862e5bc6c5fcc8a6beec 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
@@ -14,6 +14,7 @@ public class refresh implements CommandAbstraction {
         info.aliasManager.reload();
         if(info.player != null) info.player.refresh();
         info.contacts.refreshContacts(info.context);
+        info.rssManager.refresh();
 
         return info.res.getString(R.string.output_refresh);
     }
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/regex.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/regex.java
new file mode 100644
index 0000000000000000000000000000000000000000..1440638fe01c6374799130cbbbbbca979d2735c8
--- /dev/null
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/regex.java
@@ -0,0 +1,138 @@
+package ohi.andre.consolelauncher.commands.main.raw;
+
+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.commands.specific.ParamCommand;
+import ohi.andre.consolelauncher.managers.RegexManager;
+import ohi.andre.consolelauncher.tuils.Tuils;
+
+/**
+ * Created by francescoandreuzzi on 04/10/2017.
+ */
+
+public class regex extends ParamCommand {
+
+    private enum Param implements ohi.andre.consolelauncher.commands.main.Param {
+
+        add {
+            @Override
+            public String exec(ExecutePack pack) {
+                String output = RegexManager.add(pack.getInt(), pack.getString());
+                if(output == null) return null;
+                if(output.length() == 0) return pack.context.getString(R.string.regex_exists);
+                else return output;
+            }
+
+            @Override
+            public int[] args() {
+                return new int[] {CommandAbstraction.INT, CommandAbstraction.PLAIN_TEXT};
+            }
+        },
+        rm {
+            @Override
+            public String exec(ExecutePack pack) {
+                String output = RegexManager.rm(pack.getInt());
+                if(output == null) return null;
+                if(output.length() == 0) return pack.context.getString(R.string.regex_not_found);
+                return output;
+            }
+
+            @Override
+            public int[] args() {
+                return new int[] {CommandAbstraction.INT};
+            }
+        },
+        get {
+            @Override
+            public String exec(ExecutePack pack) {
+                RegexManager.Regex r = RegexManager.get(pack.getInt());
+                if(r == null) return pack.context.getString(R.string.id_notfound);
+
+                return r.value;
+            }
+
+            @Override
+            public int[] args() {
+                return new int[] {CommandAbstraction.INT};
+            }
+        },
+        test {
+            @Override
+            public String exec(ExecutePack pack) {
+                CharSequence s = RegexManager.test(pack.getInt(), pack.getString());
+                if(s.length() == 0) return pack.context.getString(R.string.id_notfound);
+
+                Tuils.sendOutput(pack.context, s);
+                return null;
+            }
+
+            @Override
+            public int[] args() {
+                return new int[] {CommandAbstraction.INT, CommandAbstraction.PLAIN_TEXT};
+            }
+        };
+
+        @Override
+        public String onArgNotFound(ExecutePack pack, int index) {
+            return pack.context.getString(R.string.invalid_integer);
+        }
+
+        @Override
+        public String onNotArgEnough(ExecutePack pack, int n) {
+            return pack.context.getString(R.string.help_regex);
+        }
+
+        @Override
+        public String label() {
+            return Tuils.MINUS + name();
+        }
+
+        static Param get(String p) {
+            p = p.toLowerCase();
+            Param[] ps = values();
+            for (Param p1 : ps)
+                if (p.endsWith(p1.label()))
+                    return p1;
+            return null;
+        }
+
+        static String[] labels() {
+            Param[] ps = values();
+            String[] ss = new String[ps.length];
+
+            for (int count = 0; count < ps.length; count++) {
+                ss[count] = ps[count].label();
+            }
+
+            return ss;
+        }
+
+    }
+
+    @Override
+    protected ohi.andre.consolelauncher.commands.main.Param paramForString(MainPack pack, String param) {
+        return Param.get(param);
+    }
+
+    @Override
+    protected String doThings(ExecutePack pack) {
+        return null;
+    }
+
+    @Override
+    public int priority() {
+        return 2;
+    }
+
+    @Override
+    public int helpRes() {
+        return R.string.help_regex;
+    }
+
+    @Override
+    public String[] params() {
+        return Param.labels();
+    }
+}
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/rss.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/rss.java
new file mode 100644
index 0000000000000000000000000000000000000000..dadca042cb8b9aefedfa1eec67aa880bacbb3ebc
--- /dev/null
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/rss.java
@@ -0,0 +1,323 @@
+package ohi.andre.consolelauncher.commands.main.raw;
+
+import java.io.File;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+
+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.commands.specific.ParamCommand;
+import ohi.andre.consolelauncher.managers.RssManager;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.options.Rss;
+import ohi.andre.consolelauncher.tuils.TimeManager;
+import ohi.andre.consolelauncher.tuils.Tuils;
+
+/**
+ * Created by francescoandreuzzi on 30/09/2017.
+ */
+
+public class rss extends ParamCommand {
+
+    private enum Param implements ohi.andre.consolelauncher.commands.main.Param {
+
+        add {
+            @Override
+            public String exec(ExecutePack pack) {
+                int id = pack.getInt();
+                long tm = pack.get(long.class);
+                String url = pack.getString();
+
+                return ((MainPack) pack).rssManager.add(id, tm, url);
+            }
+
+            @Override
+            public int[] args() {
+                return new int[] {CommandAbstraction.INT, CommandAbstraction.LONG, CommandAbstraction.PLAIN_TEXT};
+            }
+        },
+        rm {
+            @Override
+            public String exec(ExecutePack pack) {
+                int id = pack.getInt();
+
+                return ((MainPack) pack).rssManager.rm(id);
+            }
+
+            @Override
+            public int[] args() {
+                return new int[] {CommandAbstraction.INT};
+            }
+
+
+        },
+        ls {
+            @Override
+            public String exec(ExecutePack pack) {
+                return ((MainPack) pack).rssManager.list();
+            }
+
+            @Override
+            public int[] args() {
+                return new int[0];
+            }
+        },
+        l {
+            @Override
+            public String exec(ExecutePack pack) {
+                int id = pack.getInt();
+                ((MainPack) pack).rssManager.l(id);
+                return null;
+            }
+
+            @Override
+            public int[] args() {
+                return new int[] {CommandAbstraction.INT};
+            }
+        },
+        show {
+            @Override
+            public String exec(ExecutePack pack) {
+                int id = pack.getInt();
+                boolean show = pack.getBoolean();
+
+                return ((MainPack) pack).rssManager.setShow(id, show);
+            }
+
+            @Override
+            public int[] args() {
+                return new int[] {CommandAbstraction.INT, CommandAbstraction.BOOLEAN};
+            }
+        },
+        time {
+            @Override
+            public String exec(ExecutePack pack) {
+                int id = pack.getInt();
+                long tm = pack.get(long.class);
+
+                return ((MainPack) pack).rssManager.setTime(id, tm);
+            }
+
+            @Override
+            public int[] args() {
+                return new int[] {CommandAbstraction.INT, CommandAbstraction.LONG};
+            }
+        },
+        format {
+            @Override
+            public int[] args() {
+                return new int[] {CommandAbstraction.INT, CommandAbstraction.PLAIN_TEXT};
+            }
+
+            @Override
+            public String exec(ExecutePack pack) {
+                int id = pack.getInt();
+                String s = pack.getString();
+
+                return ((MainPack) pack).rssManager.setFormat(id, s);
+            }
+        },
+        color {
+            @Override
+            public int[] args() {
+                return new int[] {CommandAbstraction.INT, CommandAbstraction.COLOR};
+            }
+
+            @Override
+            public String exec(ExecutePack pack) {
+                int id = pack.getInt();
+                String c = pack.getString();
+
+                return ((MainPack) pack).rssManager.setColor(id, c);
+            }
+
+            @Override
+            public String onArgNotFound(ExecutePack pack, int index) {
+                if(index == 2) return pack.context.getString(R.string.output_invalidcolor);
+                return super.onArgNotFound(pack, index);
+            }
+        },
+        last_check {
+            @Override
+            public int[] args() {
+                return new int[] {CommandAbstraction.INT};
+            }
+
+            @Override
+            public String exec(ExecutePack pack) {
+                String output = XMLPrefsManager.attrValue(new File(Tuils.getFolder(), RssManager.PATH), RssManager.NAME,
+                        RssManager.RSS_LABEL, new String[] {RssManager.ID_ATTRIBUTE}, new String[] {String.valueOf(pack.getInt())},
+                        RssManager.LASTCHECKED_ATTRIBUTE);
+                if(output == null || output.length() == 0) return pack.context.getString(R.string.id_notfound);
+
+                try {
+                    DateFormat defaultRSSDateFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z");
+                    return TimeManager.replace(XMLPrefsManager.get(Rss.rss_time_format), defaultRSSDateFormat.parse(output).getTime(),
+                            Integer.MAX_VALUE).toString();
+                } catch (Exception e) {
+                    return pack.context.getString(R.string.output_error);
+                }
+            }
+        },
+        frc {
+            @Override
+            public int[] args() {
+                return new int[] {CommandAbstraction.INT};
+            }
+
+            @Override
+            public String exec(ExecutePack pack) {
+                return null;
+            }
+        },
+        info {
+            @Override
+            public int[] args() {
+                return new int[] {CommandAbstraction.INT};
+            }
+
+            @Override
+            public String exec(ExecutePack pack) {
+                return null;
+            }
+        },
+        include_if_matches {
+            @Override
+            public int[] args() {
+                return new int[] {CommandAbstraction.INT, CommandAbstraction.PLAIN_TEXT};
+            }
+
+            @Override
+            public String exec(ExecutePack pack) {
+                int id = pack.getInt();
+                String r = pack.getString();
+
+                return ((MainPack) pack).rssManager.setIncludeIfMatches(id, r);
+            }
+        },
+        exclude_if_matches {
+            @Override
+            public int[] args() {
+                return new int[] {CommandAbstraction.INT, CommandAbstraction.PLAIN_TEXT};
+            }
+
+            @Override
+            public String exec(ExecutePack pack) {
+                int id = pack.getInt();
+                String r = pack.getString();
+
+                return ((MainPack) pack).rssManager.setExcludeIfMatches(id, r);
+            }
+        },
+        wifi_only {
+            @Override
+            public int[] args() {
+                return new int[] {CommandAbstraction.INT, CommandAbstraction.BOOLEAN};
+            }
+
+            @Override
+            public String exec(ExecutePack pack) {
+                int id = pack.getInt();
+                boolean w = pack.getBoolean();
+
+                return ((MainPack) pack).rssManager.setWifiOnly(id, w);
+            }
+        },
+        add_format {
+            @Override
+            public String exec(ExecutePack pack) {
+                return ((MainPack) pack).rssManager.addFormat(pack.getInt(), pack.getString());
+            }
+
+            @Override
+            public int[] args() {
+                return new int[] {CommandAbstraction.INT, CommandAbstraction.PLAIN_TEXT};
+            }
+        },
+        rm_format {
+            @Override
+            public String exec(ExecutePack pack) {
+                return ((MainPack) pack).rssManager.removeFormat(pack.getInt());
+            }
+
+            @Override
+            public int[] args() {
+                return new int[] {CommandAbstraction.INT};
+            }
+        },
+        file {
+            @Override
+            public String exec(ExecutePack pack) {
+                pack.context.startActivity(Tuils.openFile(new File(Tuils.getFolder(), RssManager.PATH)));
+                return null;
+            }
+
+            @Override
+            public int[] args() {
+                return new int[0];
+            }
+        };
+
+        @Override
+        public String label() {
+            return Tuils.MINUS + name();
+        }
+
+        static Param get(String p) {
+            p = p.toLowerCase();
+            Param[] ps = values();
+            for (Param p1 : ps)
+                if (p.endsWith(p1.label()))
+                    return p1;
+            return null;
+        }
+
+        static String[] labels() {
+            Param[] ps = values();
+            String[] ss = new String[ps.length];
+
+            for (int count = 0; count < ps.length; count++) {
+                ss[count] = ps[count].label();
+            }
+
+            return ss;
+        }
+
+        @Override
+        public String onNotArgEnough(ExecutePack pack, int n) {
+            return pack.context.getString(R.string.help_rss);
+        }
+
+        @Override
+        public String onArgNotFound(ExecutePack pack, int index) {
+            return pack.context.getString(R.string.invalid_integer);
+        }
+    }
+
+    @Override
+    protected ohi.andre.consolelauncher.commands.main.Param paramForString(MainPack pack, String param) {
+        return Param.get(param);
+    }
+
+    @Override
+    protected String doThings(ExecutePack pack) {
+        return null;
+    }
+
+    @Override
+    public int priority() {
+        return 3;
+    }
+
+    @Override
+    public int helpRes() {
+        return R.string.help_rss;
+    }
+
+    @Override
+    public String[] params() {
+        return Param.labels();
+    }
+}
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/search.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/search.java
index f56dac250fb7e53d735a65a7ba8dd2e6bd1ac9b1..d695816c798da59edb0a9c179f4f0ef88a5c212b 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/search.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/search.java
@@ -4,7 +4,6 @@ import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import ohi.andre.consolelauncher.R;
@@ -27,7 +26,7 @@ public class search extends ParamCommand {
         ps {
             @Override
             public String exec(ExecutePack pack) {
-                List<String> args = pack.get(ArrayList.class, 1);
+                List<String> args = pack.getList();
                 return playstore(args, pack.context);
             }
         },
@@ -42,28 +41,28 @@ public class search extends ParamCommand {
         gg {
             @Override
             public String exec(ExecutePack pack) {
-                List<String> args = pack.get(ArrayList.class, 1);
+                List<String> args = pack.getList();
                 return google(args, pack.context);
             }
         },
         yt {
             @Override
             public String exec(ExecutePack pack) {
-                List<String> args = pack.get(ArrayList.class, 1);
+                List<String> args = pack.getList();
                 return youTube(args, pack.context);
             }
         },
         u {
             @Override
             public String exec(ExecutePack pack) {
-                List<String> args = pack.get(ArrayList.class, 1);
+                List<String> args = pack.getList();
                 return url(Tuils.toPlanString(args, Tuils.SPACE), pack.context);
             }
         },
         dd {
             @Override
             public String exec(ExecutePack pack) {
-                List<String> args = pack.get(ArrayList.class, 1);
+                List<String> args = pack.getList();
                 return duckDuck(args, pack.context);
             }
         };
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/share.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/share.java
index c4dc50846374b51ba2bb9097b6c50b28faf3ab2f..a80432e33c3c9f57cb562232df88f0fb51d99d3a 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/share.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/share.java
@@ -15,7 +15,7 @@ public class share implements CommandAbstraction {
     @Override
     public String exec(ExecutePack pack) {
         MainPack info = (MainPack) pack;
-        File f = info.get(File.class, 0);
+        File f = info.get(File.class);
         if (f.isDirectory())
             return info.res.getString(R.string.output_isdirectory);
 
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/sms.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/sms.java
index 5f2da41414319d399775c044985a3979c030ba25..2f8fe265f3b3fd6b50df61a15d7b20686c17650e 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/sms.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/sms.java
@@ -29,7 +29,7 @@ public class sms extends RedirectCommand {
             return info.context.getString(R.string.output_waitingpermission);
         }
 
-        beforeObjects.add(pack.get(String.class, 0));
+        beforeObjects.add(pack.getString());
 
         if(afterObjects.size() == 0) {
             info.redirectator.prepareRedirection(this);
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/status.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/status.java
index 1fbf0e59595a69cae5b6242c051135677e989309..613167b2f08add0275b7ca136c28267200ab2a23 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/status.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/status.java
@@ -5,8 +5,8 @@ import android.content.Intent;
 import android.content.IntentFilter;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
-import android.os.Build;
-import android.provider.Settings;
+
+import java.lang.reflect.Method;
 
 import ohi.andre.consolelauncher.R;
 import ohi.andre.consolelauncher.commands.CommandAbstraction;
@@ -24,6 +24,7 @@ public class status implements CommandAbstraction {
     @Override
     public String exec(ExecutePack pack) {
         MainPack info = (MainPack) pack;
+
         ConnectivityManager connManager = (ConnectivityManager) info.context.getSystemService(Context.CONNECTIVITY_SERVICE);
         NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
         boolean wifiConnected = mWifi.isConnected();
@@ -37,20 +38,21 @@ public class status implements CommandAbstraction {
         }
         level *= 100;
 
-        boolean connected = false;
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-                connected = Settings.Global.getInt(info.context.getContentResolver(), "mobile_data", 0) == 1;
-            }
-        } else {
-            ConnectivityManager cm = (ConnectivityManager) info.context.getSystemService(Context.CONNECTIVITY_SERVICE);
-            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
-            boolean isMobile = activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE;
-        }
+        boolean mobileOn = false;
+        Class cmClass;
+        Method method;
+        try {
+            cmClass = Class.forName(connManager.getClass().getName());
+            method = cmClass.getDeclaredMethod("getMobileDataEnabled");
+            method.setAccessible(true);
+
+            mobileOn = (Boolean) method.invoke(connManager);
+        } catch (Exception e) {}
+
 
         return info.res.getString(R.string.battery_charge) + Tuils.SPACE + (int) level + PERCENTAGE + Tuils.NEWLINE +
                 info.res.getString(R.string.wifi) + Tuils.SPACE + wifiConnected + Tuils.NEWLINE +
-                info.res.getString(R.string.mobile_data) + Tuils.SPACE + connected;
+                info.res.getString(R.string.mobile_data) + Tuils.SPACE + mobileOn;
     }
 
     @Override
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/theme.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/theme.java
index a1248c4c79f51751ad07ce4bb3a2e00897f59508..de9a3fa7c8ed8a56747d60019c3c9fe20903df78 100644
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/theme.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/theme.java
@@ -26,17 +26,12 @@ public class theme extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                String theme = pack.get(String.class, 1);
+                String theme = pack.getString();
                 ThemesManager.apply(pack.context, theme);
                 return null;
             }
         },
         view {
-            @Override
-            public int[] args() {
-                return new int[0];
-            }
-
             @Override
             public String exec(ExecutePack pack) {
                 pack.context.startActivity(Tuils.webPage("http://tui-launcher.surge.sh/"));
@@ -44,11 +39,6 @@ public class theme extends ParamCommand {
             }
         },
         create {
-            @Override
-            public int[] args() {
-                return new int[0];
-            }
-
             @Override
             public String exec(ExecutePack pack) {
                 pack.context.startActivity(Tuils.webPage("http://tui-launcher.surge.sh/create"));
@@ -56,11 +46,6 @@ public class theme extends ParamCommand {
             }
         },
         ls {
-            @Override
-            public int[] args() {
-                return new int[0];
-            }
-
             @Override
             public String exec(ExecutePack pack) {
                 ThemesManager.ls(pack.context);
@@ -68,11 +53,6 @@ public class theme extends ParamCommand {
             }
         },
         old {
-            @Override
-            public int[] args() {
-                return new int[0];
-            }
-
             @Override
             public String exec(ExecutePack pack) {
                 File theme = Tuils.getOld("theme.xml");
@@ -93,11 +73,6 @@ public class theme extends ParamCommand {
             }
         },
         tutorial {
-            @Override
-            public int[] args() {
-                return new int[0];
-            }
-
             @Override
             public String exec(ExecutePack pack) {
                 pack.context.startActivity(Tuils.webPage("https://github.com/Andre1299/TUI-ConsoleLauncher/wiki/Themes"));
@@ -139,6 +114,11 @@ public class theme extends ParamCommand {
         public String onArgNotFound(ExecutePack pack, int index) {
             return null;
         }
+
+        @Override
+        public int[] args() {
+            return new int[0];
+        }
     }
 
     @Override
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/time.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/time.java
index 2f5277d3f53c342f97fd3c7ac6c236b78976f73d..8d94335d8452cf0b73fd2a7eb733b781fae74542 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/time.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/time.java
@@ -11,7 +11,7 @@ import ohi.andre.consolelauncher.tuils.TimeManager;
 public class time implements CommandAbstraction {
     @Override
     public String exec(ExecutePack pack) {
-        int index = pack.get(int.class, 0);
+        int index = pack.getInt();
         return TimeManager.replace("%t" + index).toString();
     }
 
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tuixt.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tuixt.java
index 1bf4339a9aef1b2e944ddeb54478223d0ee2f0bf..fc3eb0218d07d16f68c1dd87bfe03e3b74139ebd 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tuixt.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tuixt.java
@@ -24,7 +24,7 @@ public class tuixt implements CommandAbstraction {
     @Override
     public String exec(ExecutePack pack) {
         MainPack info = (MainPack) pack;
-        File file = info.get(File.class, 0);
+        File file = info.get(File.class);
         if(file.isDirectory()) {
             return info.res.getString(R.string.output_isdirectory);
         }
@@ -61,7 +61,7 @@ public class tuixt implements CommandAbstraction {
     public String onArgNotFound(ExecutePack pack, int index) {
         MainPack info = (MainPack) pack;
 
-        String path = info.get(String.class, 0);
+        String path = info.getString();
         if(path == null || path.length() == 0) {
             return onNotArgEnough(info, info.args.length);
         }
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/uninstall.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/uninstall.java
index 23b25e6453d20b0f5ebb1e38c3e61d72524da29a..e1c9543073f50b788b07ea1c30223ca3fdb6787f 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/uninstall.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/uninstall.java
@@ -7,7 +7,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.AppsManager;
 import ohi.andre.consolelauncher.tuils.Tuils;
 
 public class uninstall implements CommandAbstraction {
@@ -16,7 +15,7 @@ public class uninstall implements CommandAbstraction {
     public String exec(ExecutePack pack) {
         MainPack info = (MainPack) pack;
 
-        String packageName = info.get(AppsManager.LaunchInfo.class, 0).componentName.getPackageName();
+        String packageName = info.getLaunchInfo().componentName.getPackageName();
 
         Uri packageURI = Uri.parse("package:" + packageName);
         Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/vibrate.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/vibrate.java
index e1f513ca1dac945ff80e08ea5de768093c7cbe8c..a3c6e5120f664bc2011ab531540850ed032b06ff 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/vibrate.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/vibrate.java
@@ -7,6 +7,7 @@ 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.tuils.Tuils;
 
 /**
  * Created by francescoandreuzzi on 29/04/2017.
@@ -14,22 +15,46 @@ import ohi.andre.consolelauncher.commands.main.MainPack;
 
 public class vibrate implements CommandAbstraction {
 
-
     @Override
     public String exec(ExecutePack pack) throws Exception {
-        String text = (String) pack.args[0];
-
+        String text = pack.getString().trim();
         Context context = ((MainPack) pack).context;
 
-        int ms;
-        try {
-            ms = Integer.parseInt(text);
-
-            ((Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE)).vibrate(ms);
-        } catch (NumberFormatException e) {
-            return context.getString(R.string.output_numberformat);
-        } catch (Exception e) {
-            return e.toString();
+        char separator = Tuils.firstNonDigit(text);
+
+        if(separator == 0) {
+            int ms;
+            try {
+                ms = Integer.parseInt(text);
+                ((Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE)).vibrate(ms);
+                return null;
+            } catch (NumberFormatException e) {
+                return context.getString(R.string.invalid_integer);
+            } catch (Exception e) {
+                return e.toString();
+            }
+        } else {
+            if(separator == ' ') {
+                char s2 = Tuils.firstNonDigit(Tuils.removeSpaces(text));
+                if(s2 != 0) {
+                    text = Tuils.removeSpaces(text);
+                    separator = s2;
+                }
+            }
+
+            text = text.trim();
+            String[] split = text.split(separator + Tuils.EMPTYSTRING);
+            long pattern[] = new long[split.length];
+
+            for(int c = 0; c < split.length; c++) {
+                try {
+                    pattern[c] = Long.parseLong(split[c]);
+                } catch (Exception e) {
+                    pattern[c] = 0;
+                }
+            }
+
+            ((Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE)).vibrate(pattern, -1);
         }
 
         return null;
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/specific/ParamCommand.java b/app/src/main/java/ohi/andre/consolelauncher/commands/specific/ParamCommand.java
index a2028956637351233ec7dd8f22e13b4a6c8d684d..ef77f6e4d33092ef8db0b46f8356f2f5b9fbd8a0 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/specific/ParamCommand.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/specific/ParamCommand.java
@@ -30,8 +30,10 @@ public abstract class ParamCommand implements CommandAbstraction {
         String o = doThings(pack);
         if(o != null) return o;
 
-        Param param = pack.get(Param.class, 0);
-        if(param == null) return pack.context.getString(R.string.output_invalid_param) + Tuils.SPACE + pack.get(String.class, 0);
+        Param param = pack.get(Param.class);
+        if(param == null) {
+            return pack.context.getString(R.string.output_invalid_param) + Tuils.SPACE + pack.get(String.class, 0);
+        }
         return param.exec(pack);
     }
 
@@ -56,6 +58,13 @@ public abstract class ParamCommand implements CommandAbstraction {
 
     @Override
     public String onArgNotFound(ExecutePack pack, int indexNotFound) {
+        if(indexNotFound == 0) {
+            String param = pack.get(String.class, 0);
+            if(param.length() == 0) return pack.context.getString(helpRes());
+
+            return pack.context.getString(R.string.output_invalid_param) + Tuils.SPACE + param;
+        }
+
         return pack.context.getString(helpRes());
     }
 
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/tuixt/TuixtActivity.java b/app/src/main/java/ohi/andre/consolelauncher/commands/tuixt/TuixtActivity.java
index 9aeacbf078a49059bd34d795dd65f1eb29e1b59c..092c5f17911b909f7c01ba3fc6efa4814f434eaa 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/tuixt/TuixtActivity.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/tuixt/TuixtActivity.java
@@ -3,8 +3,8 @@ package ohi.andre.consolelauncher.commands.tuixt;
 import android.app.Activity;
 import android.content.Intent;
 import android.content.SharedPreferences;
-import android.graphics.Typeface;
 import android.net.Uri;
+import android.os.Build;
 import android.os.Bundle;
 import android.support.annotation.Nullable;
 import android.text.InputType;
@@ -14,6 +14,8 @@ import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
 import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
 import android.view.inputmethod.EditorInfo;
 import android.widget.EditText;
 import android.widget.ImageButton;
@@ -29,8 +31,9 @@ import ohi.andre.consolelauncher.R;
 import ohi.andre.consolelauncher.commands.Command;
 import ohi.andre.consolelauncher.commands.CommandGroup;
 import ohi.andre.consolelauncher.commands.CommandTuils;
-import ohi.andre.consolelauncher.managers.FileManager;
-import ohi.andre.consolelauncher.managers.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.options.Theme;
+import ohi.andre.consolelauncher.managers.xml.options.Ui;
 import ohi.andre.consolelauncher.tuils.Tuils;
 
 /**
@@ -59,7 +62,6 @@ public class TuixtActivity extends Activity {
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        final Typeface lucidaConsole = Typeface.createFromAsset(getAssets(), "lucida_console.ttf");
         final LinearLayout rootView = new LinearLayout(this);
 
         final Intent intent = getIntent();
@@ -81,13 +83,23 @@ public class TuixtActivity extends Activity {
             finish();
         }
 
-        if (!XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.system_wallpaper)) {
-            rootView.setBackgroundColor(XMLPrefsManager.getColor(XMLPrefsManager.Theme.bg_color));
+        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && !XMLPrefsManager.getBoolean(Ui.ignore_bar_color)) {
+            Window window = getWindow();
+
+            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+            window.setStatusBarColor(XMLPrefsManager.getColor(Theme.statusbar_color));
+            window.setNavigationBarColor(XMLPrefsManager.getColor(Theme.navigationbar_color));
+        }
+
+        if (!XMLPrefsManager.getBoolean(Ui.system_wallpaper)) {
+            rootView.setBackgroundColor(XMLPrefsManager.getColor(Theme.bg_color));
         } else {
             setTheme(R.style.Custom_SystemWP);
+            rootView.setBackgroundColor(XMLPrefsManager.getColor(Theme.overlay_color));
         }
 
-        final boolean inputBottom = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.input_bottom);
+        final boolean inputBottom = XMLPrefsManager.getBoolean(Ui.input_bottom);
         int layoutId = inputBottom ? R.layout.tuixt_view_input_down : R.layout.tuixt_view_input_up;
 
         LayoutInflater inflater = getLayoutInflater();
@@ -101,26 +113,25 @@ public class TuixtActivity extends Activity {
         TextView prefixView = (TextView) inputOutputView.findViewById(R.id.prefix_view);
 
         ImageButton submitView = (ImageButton) inputOutputView.findViewById(R.id.submit_tv);
-        boolean showSubmit = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_enter_button);
+        boolean showSubmit = XMLPrefsManager.getBoolean(Ui.show_enter_button);
         if (!showSubmit) {
             submitView.setVisibility(View.GONE);
             submitView = null;
         }
 
-        String prefix = XMLPrefsManager.get(XMLPrefsManager.Ui.input_prefix);
+        String prefix = XMLPrefsManager.get(Ui.input_prefix);
 
-        Typeface t = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.system_font) ? Typeface.DEFAULT : lucidaConsole;
-        int ioSize = XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.input_output_size);
-        int outputColor = XMLPrefsManager.getColor(XMLPrefsManager.Theme.output_color);
-        int inputColor = XMLPrefsManager.getColor(XMLPrefsManager.Theme.input_color);
+        int ioSize = XMLPrefsManager.getInt(Ui.input_output_size);
+        int outputColor = XMLPrefsManager.getColor(Theme.output_color);
+        int inputColor = XMLPrefsManager.getColor(Theme.input_color);
 
-        prefixView.setTypeface(t);
+        prefixView.setTypeface(Tuils.getTypeface(this));
         prefixView.setTextColor(inputColor);
         prefixView.setTextSize(ioSize);
         prefixView.setText(prefix.endsWith(Tuils.SPACE) ? prefix : prefix + Tuils.SPACE);
 
         if (submitView != null) {
-            submitView.setColorFilter(XMLPrefsManager.getColor(XMLPrefsManager.Theme.enter_color));
+            submitView.setColorFilter(XMLPrefsManager.getColor(Theme.enter_color));
             submitView.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
@@ -129,7 +140,7 @@ public class TuixtActivity extends Activity {
             });
         }
 
-        fileView.setTypeface(t);
+        fileView.setTypeface(Tuils.getTypeface(this));
         fileView.setTextSize(ioSize);
         fileView.setTextColor(outputColor);
         fileView.setOnTouchListener(new View.OnTouchListener() {
@@ -144,13 +155,13 @@ public class TuixtActivity extends Activity {
             }
         });
 
-        outputView.setTypeface(t);
+        outputView.setTypeface(Tuils.getTypeface(this));
         outputView.setTextSize(ioSize);
         outputView.setTextColor(outputColor);
         outputView.setMovementMethod(new ScrollingMovementMethod());
         outputView.setVisibility(View.GONE);
 
-        inputView.setTypeface(t);
+        inputView.setTypeface(Tuils.getTypeface(this));
         inputView.setTextSize(ioSize);
         inputView.setTextColor(inputColor);
         inputView.setHint(Tuils.getHint(path));
@@ -223,6 +234,16 @@ public class TuixtActivity extends Activity {
                     intent.putExtra(ERROR_KEY, e.toString());
                     setResult(1, intent);
                     finish();
+                } catch (Error er) {
+                    runOnUiThread(new Runnable() {
+                        @Override
+                        public void run() {
+                            System.gc();
+
+                            fileView.setText(Tuils.EMPTYSTRING);
+                            Toast.makeText(TuixtActivity.this, R.string.tuixt_error, Toast.LENGTH_LONG).show();
+                        }
+                    });
                 }
             }
         }.start();
@@ -248,8 +269,6 @@ public class TuixtActivity extends Activity {
     @Override
     protected void onStop() {
         super.onStop();
-
-        FileManager.writeOn(pack.editFile, fileView.getText().toString());
         this.finish();
     }
 
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/tuixt/raw/help.java b/app/src/main/java/ohi/andre/consolelauncher/commands/tuixt/raw/help.java
index 2548e5b36d423290a0119be30d3b1197abe6f90d..57a6ae5bfa53c551ee81558214a55bd8ab9bedf2 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/tuixt/raw/help.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/tuixt/raw/help.java
@@ -22,7 +22,7 @@ public class help implements CommandAbstraction {
     public String exec(ExecutePack info) throws Exception {
         TuixtPack pack = (TuixtPack) info;
 
-        CommandAbstraction cmd = info.get(CommandAbstraction.class, 0);
+        CommandAbstraction cmd = info.get(CommandAbstraction.class);
         int res = cmd == null ? R.string.output_commandnotfound : cmd.helpRes();
         return pack.resources.getString(res);
     }
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 14758b9c3468c915c2c358d663a3f669d28b7b5e..a16e414963b2092bc6b853a67f2a00e5c8d8ad38 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/AliasManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/AliasManager.java
@@ -15,10 +15,13 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import ohi.andre.consolelauncher.R;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.options.Behavior;
 import ohi.andre.consolelauncher.tuils.Tuils;
 import ohi.andre.consolelauncher.tuils.interfaces.Reloadable;
 
@@ -36,9 +39,9 @@ public class AliasManager implements Reloadable {
 
         reload();
 
-        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);
+        paramMarker = Pattern.quote(XMLPrefsManager.get(Behavior.alias_param_marker));
+        paramSeparator = Pattern.quote(XMLPrefsManager.get(Behavior.alias_param_separator));
+        aliasLabelFormat = XMLPrefsManager.get(Behavior.alias_content_format);
     }
 
     public String printAliases() {
@@ -207,7 +210,12 @@ public class AliasManager implements Reloadable {
     }
 
     public List<String> getAliases() {
-        if(aliases == null) return new ArrayList<>(0);
-        return new ArrayList<>(aliases.keySet());
+        List<String> aliasKeys = new ArrayList<>(0);
+        if(aliases == null) return aliasKeys;
+
+        Set<String> keys = aliases.keySet();
+        for(String s : keys) aliasKeys.add(s);
+
+        return aliasKeys;
     }
 }
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 50786189b0561f401ecc06e54d631848bec7f03a..b6bdbe74d879c5ec0e39998a6fb183245aaf7c91 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/AppsManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/AppsManager.java
@@ -32,15 +32,20 @@ import java.util.regex.Pattern;
 import ohi.andre.consolelauncher.MainManager;
 import ohi.andre.consolelauncher.R;
 import ohi.andre.consolelauncher.commands.main.MainPack;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.options.Apps;
+import ohi.andre.consolelauncher.managers.xml.options.Behavior;
+import ohi.andre.consolelauncher.managers.xml.options.Theme;
+import ohi.andre.consolelauncher.managers.xml.options.Ui;
 import ohi.andre.consolelauncher.tuils.Compare;
 import ohi.andre.consolelauncher.tuils.TimeManager;
 import ohi.andre.consolelauncher.tuils.Tuils;
 import ohi.andre.consolelauncher.tuils.interfaces.Suggester;
 
-import static ohi.andre.consolelauncher.managers.XMLPrefsManager.VALUE_ATTRIBUTE;
-import static ohi.andre.consolelauncher.managers.XMLPrefsManager.resetFile;
-import static ohi.andre.consolelauncher.managers.XMLPrefsManager.set;
-import static ohi.andre.consolelauncher.managers.XMLPrefsManager.writeTo;
+import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.VALUE_ATTRIBUTE;
+import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.resetFile;
+import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.set;
+import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.writeTo;
 
 public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
 
@@ -66,7 +71,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
     private SharedPreferences preferences;
     private SharedPreferences.Editor editor;
 
-    private static XMLPrefsManager.XmlPrefsElement instance = null;
+    public static XMLPrefsManager.XmlPrefsElement instance = null;
 
     private XMLPrefsManager.XMLPrefsList defaultApps;
 
@@ -76,58 +81,6 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
     private String appInstalledFormat, appUninstalledFormat;
     int appInstalledColor, appUninstalledColor;
 
-    public enum Options implements XMLPrefsManager.XMLPrefsSave {
-
-        default_app_n1 {
-            @Override
-            public String defaultValue() {
-                return MOST_USED;
-            }
-        },
-        default_app_n2 {
-            @Override
-            public String defaultValue() {
-                return MOST_USED;
-            }
-        },
-        default_app_n3 {
-            @Override
-            public String defaultValue() {
-                return "com.android.vending";
-            }
-        },
-        default_app_n4 {
-            @Override
-            public String defaultValue() {
-                return NULL;
-            }
-        },
-        default_app_n5 {
-            @Override
-            public String defaultValue() {
-                return NULL;
-            }
-        };
-
-        public static final String MOST_USED = "most_used";
-        public static final String NULL = "null";
-
-        @Override
-        public String label() {
-            return name();
-        }
-
-        @Override
-        public XMLPrefsManager.XmlPrefsElement parent() {
-            return instance;
-        }
-
-        @Override
-        public boolean is(String s) {
-            return name().equals(s);
-        }
-    }
-
     @Override
     public String[] deleted() {
         return new String[0];
@@ -162,16 +115,16 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
 
         this.context = context;
 
-        appInstalledFormat = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_app_installed) ? XMLPrefsManager.get(XMLPrefsManager.Behavior.app_installed_format) : null;
-        appUninstalledFormat = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_app_uninstalled) ? XMLPrefsManager.get(XMLPrefsManager.Behavior.app_uninstalled_format) : null;
+        appInstalledFormat = XMLPrefsManager.getBoolean(Ui.show_app_installed) ? XMLPrefsManager.get(Behavior.app_installed_format) : null;
+        appUninstalledFormat = XMLPrefsManager.getBoolean(Ui.show_app_uninstalled) ? XMLPrefsManager.get(Behavior.app_uninstalled_format) : null;
 
         if(appInstalledFormat != null || appUninstalledFormat != null) {
             pp = Pattern.compile("%p", Pattern.CASE_INSENSITIVE);
             pl = Pattern.compile("%l", Pattern.CASE_INSENSITIVE);
             pn = Pattern.compile("%n", Pattern.CASE_INSENSITIVE);
 
-            appInstalledColor = XMLPrefsManager.getColor(XMLPrefsManager.Theme.app_installed_color);
-            appUninstalledColor = XMLPrefsManager.getColor(XMLPrefsManager.Theme.app_uninstalled_color);
+            appInstalledColor = XMLPrefsManager.getColor(Theme.app_installed_color);
+            appUninstalledColor = XMLPrefsManager.getColor(Theme.app_uninstalled_color);
         } else {
             pp = null;
             pl = null;
@@ -232,7 +185,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
             Document d = (Document) o[0];
             Element root = (Element) o[1];
 
-            List<AppsManager.Options> enums = new ArrayList<>(Arrays.asList(AppsManager.Options.values()));
+            List<Apps> enums = new ArrayList<>(Arrays.asList(Apps.values()));
             NodeList nodes = root.getElementsByTagName("*");
 
             for (int count = 0; count < nodes.getLength(); count++) {
@@ -474,6 +427,10 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
         }
 
         for(LaunchInfo i : infos) appsHolder.remove(i);
+
+//        for(Group g : groups) {
+//            removeAppFromGroup(g.getName(), packageName);
+//        }
     }
 
     public LaunchInfo findLaunchInfoWithLabel(String label, int type) {
@@ -484,7 +441,12 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
             appList = hiddenApps;
         }
 
-        return AppUtils.findLaunchInfoWithLabel(appList, label);
+        LaunchInfo i = AppUtils.findLaunchInfoWithLabel(appList, label);
+        if(i != null) return i;
+
+        List<LaunchInfo> is = AppUtils.findLaunchInfosWithPackage(label, appList);
+        if(is == null || is.size() == 0) return null;
+        return is.get(0);
     }
 
     public void writeLaunchTimes(LaunchInfo info) {
@@ -628,23 +590,66 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
         if(!app.isInside(apps)) return null;
 
         String temp = apps.replaceAll(app.write(), Tuils.EMPTYSTRING);
-        if(temp.length() < apps.length()) apps = temp;
-        else apps = apps.replaceAll(app.componentName.getPackageName(), Tuils.EMPTYSTRING);
-
-        apps = apps.replaceAll(APPS_SEPARATOR + APPS_SEPARATOR, APPS_SEPARATOR);
-        if(apps.startsWith(APPS_SEPARATOR)) apps = apps.substring(1);
-        if(apps.endsWith(APPS_SEPARATOR)) apps = apps.substring(0, apps.length() - 1);
+        if(temp.length() < apps.length()) {
+            apps = temp;
+            apps = apps.replaceAll(APPS_SEPARATOR + APPS_SEPARATOR, APPS_SEPARATOR);
+            if(apps.startsWith(APPS_SEPARATOR)) apps = apps.substring(1);
+            if(apps.endsWith(APPS_SEPARATOR)) apps = apps.substring(0, apps.length() - 1);
 
-        e.setAttribute(APPS_ATTRIBUTE, apps);
+            e.setAttribute(APPS_ATTRIBUTE, apps);
 
-        XMLPrefsManager.writeTo(d, file);
+            XMLPrefsManager.writeTo(d, file);
 
-        int index = Tuils.find(group, groups);
-        if(index != -1) groups.get(index).remove(app);
+            int index = Tuils.find(group, groups);
+            if(index != -1) groups.get(index).remove(app);
+        }
 
         return null;
     }
 
+//    public String removeAppFromGroup(String group, String app) {
+//        Object[] o;
+//        try {
+//            o = XMLPrefsManager.buildDocument(file, NAME);
+//        } catch (Exception e) {
+//            return e.toString();
+//        }
+//
+//        Document d = (Document) o[0];
+//        Element root = (Element) o[1];
+//
+//        Node node = XMLPrefsManager.findNode(root, group);
+//        if(node == null) return context.getString(R.string.output_groupnotfound);
+//
+//        Element e = (Element) node;
+//
+//        String apps = e.getAttribute(APPS_ATTRIBUTE);
+//        if(apps == null) return null;
+//
+//        if(!apps.contains(app)) return null;
+//
+//        String temp = Pattern.compile(app.replaceAll(".", "\\.") + "(" + LaunchInfo.COMPONENT_SEPARATOR + "[^\\" + APPS_SEPARATOR + "]+)?").matcher(apps).replaceAll(Tuils.EMPTYSTRING);
+//        if(temp.length() < apps.length()) {
+//            apps = temp;
+//
+//            apps = apps.replaceAll(APPS_SEPARATOR + APPS_SEPARATOR, APPS_SEPARATOR);
+//            if(apps.startsWith(APPS_SEPARATOR)) apps = apps.substring(1);
+//            if(apps.endsWith(APPS_SEPARATOR)) apps = apps.substring(0, apps.length() - 1);
+//
+//            e.setAttribute(APPS_ATTRIBUTE, apps);
+//
+//            XMLPrefsManager.writeTo(d, file);
+//
+//            int index = Tuils.find(group, groups);
+//            if(index != -1) {
+//                Group g = groups.get(index);
+//                g.remove(app);
+//            }
+//        }
+//
+//        return null;
+//    }
+
     public String listGroup(String group) {
         Object[] o;
         try {
@@ -772,6 +777,13 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
             apps.remove(info);
         }
 
+        public void remove(String app) {
+            List<LaunchInfo> cp = new ArrayList<>(apps);
+            for(LaunchInfo i : cp) {
+                if(i.componentName.getPackageName().equals(app)) apps.remove(i);
+            }
+        }
+
         public boolean contains(LaunchInfo info) {
             return apps.contains(info);
         }
@@ -832,6 +844,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
 
             return false;
         }
+
     }
 
     public static class LaunchInfo implements Compare.Stringable {
@@ -935,11 +948,11 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
                 suggested = new ArrayList<>();
 
                 final String PREFIX = "default_app_n";
-                for(int count = 0; count < Options.values().length; count++) {
-                    String vl = values.get(Options.valueOf(PREFIX + (count + 1))).value;
+                for(int count = 0; count < Apps.values().length; count++) {
+                    String vl = values.get(Apps.valueOf(PREFIX + (count + 1))).value;
 
-                    if(vl.equals(Options.NULL)) continue;
-                    if(vl.equals(Options.MOST_USED)) suggested.add(new SuggestedApp(MOST_USED, count + 1));
+                    if(vl.equals(Apps.NULL)) continue;
+                    if(vl.equals(Apps.MOST_USED)) suggested.add(new SuggestedApp(MOST_USED, count + 1));
                     else {
                         ComponentName name = null;
 
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/MessagesManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/MessagesManager.java
index b883180525fbb57b1445135db2d81b9277596883..7da2018c9151ac93094912da256c763c58994e8c 100644
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/MessagesManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/MessagesManager.java
@@ -6,6 +6,8 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
 
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.options.Theme;
 import ohi.andre.consolelauncher.tuils.Tuils;
 
 /**
@@ -37,7 +39,7 @@ public class MessagesManager {
         count = 0;
         random = new Random();
 
-        color = XMLPrefsManager.getColor(XMLPrefsManager.Theme.hint_color);
+        color = XMLPrefsManager.getColor(Theme.hint_color);
     }
 
     public void onCmd() {
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/RegexManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/RegexManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..646ace63e6282795064e885fbd3b92eed93cac78
--- /dev/null
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/RegexManager.java
@@ -0,0 +1,200 @@
+package ohi.andre.consolelauncher.managers;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.text.SpannableString;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import ohi.andre.consolelauncher.R;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.options.Theme;
+import ohi.andre.consolelauncher.tuils.Tuils;
+
+/**
+ * Created by francescoandreuzzi on 04/10/2017.
+ */
+
+public class RegexManager {
+
+    private static final String PATH = "regex.xml", ROOT = "REGEX";
+    private static final String REGEX_LABEL = "regex", ID_ATTRIBUTE = "id";
+
+    private static List<Regex> regexes;
+
+    private RegexManager() {}
+
+    private static boolean available = false;
+    public static void create(Context context) {
+        if(available) return;
+        available = true;
+
+        if(regexes != null) regexes.clear();
+        else regexes = new ArrayList<>();
+
+        try {
+            File file = new File(Tuils.getFolder(), PATH);
+            if(!file.exists()) {
+                file.createNewFile();
+                XMLPrefsManager.resetFile(file, ROOT);
+            }
+
+            Object[] o = XMLPrefsManager.buildDocument(file, ROOT);
+
+            Element el = (Element) o[1];
+
+            List<Integer> busyIds = new ArrayList<>();
+
+            NodeList nodeList = el.getElementsByTagName(REGEX_LABEL);
+
+            Out:
+            for(int c = 0; c < nodeList.getLength(); c++) {
+                Element e = (Element) nodeList.item(c);
+
+                if(!e.hasAttribute(XMLPrefsManager.VALUE_ATTRIBUTE)) continue;
+                String value = e.getAttribute(XMLPrefsManager.VALUE_ATTRIBUTE);
+
+                int id;
+                try {
+                    id = Integer.parseInt(e.getAttribute(ID_ATTRIBUTE));
+                } catch (Exception exc) {
+                    continue;
+                }
+
+                for(int j = 0; j < busyIds.size(); j++) {
+                    if((int) busyIds.get(j) == id) continue Out;
+                }
+
+                busyIds.add(id);
+
+                if(value != null && value.length() > 0) {
+                    regexes.add(new Regex(value, id));
+                }
+            }
+        } catch (Exception e) {
+            Tuils.sendOutput(Color.RED, context, context.getString(R.string.output_xmlproblem1) + Tuils.SPACE + PATH + context.getString(R.string.output_xmlproblem2) +
+                    Tuils.NEWLINE + context.getString(R.string.output_errorlabel) + e.toString());
+            return;
+        }
+    }
+
+    public static Regex get(int id) {
+        if(!available) return null;
+
+        for(Regex r : regexes) {
+            if(r.id == id) return r;
+        }
+
+        return null;
+    }
+
+    private static void rmFromList(int id) {
+        Iterator<Regex> iterator = regexes.iterator();
+        while (iterator.hasNext()) {
+            Regex r = iterator.next();
+            if(r.id == id) {
+                iterator.remove();
+            }
+        }
+    }
+
+//    null: all good
+//    "": used id
+    public static String add(int id, String value) {
+        for(int c = 0; c < regexes.size(); c++) {
+            if(regexes.get(c).id == id) return Tuils.EMPTYSTRING;
+        }
+
+        regexes.add(new Regex(value, id));
+
+        File file = new File(Tuils.getFolder(), PATH);
+
+        return XMLPrefsManager.add(file, ROOT, REGEX_LABEL, new String[] {ID_ATTRIBUTE, XMLPrefsManager.VALUE_ATTRIBUTE}, new String[] {String.valueOf(id), value});
+    }
+
+//    null: all good
+//    "": not found
+    public static String rm(int id) {
+        try {
+            File file = new File(Tuils.getFolder(), PATH);
+
+            Object[] o = XMLPrefsManager.buildDocument(file, ROOT);
+
+            Document d = (Document) o[0];
+            Element el = (Element) o[1];
+
+            boolean needToWrite = false;
+
+            NodeList nodeList = el.getElementsByTagName(REGEX_LABEL);
+            for(int c = 0; c < nodeList.getLength(); c++) {
+                Element e = (Element) nodeList.item(c);
+
+                int cId = Integer.MAX_VALUE;
+                try {
+                    id = Integer.parseInt(e.getAttribute(ID_ATTRIBUTE));
+                } catch (Exception exc) {
+                    continue;
+                }
+
+                if(cId == id) {
+                    needToWrite = true;
+                    el.removeChild(e);
+                }
+            }
+
+            if(needToWrite) {
+                XMLPrefsManager.writeTo(d, file);
+                rmFromList(id);
+                return null;
+            }
+            else return Tuils.EMPTYSTRING;
+        } catch (Exception e) {
+            return e.toString();
+        }
+    }
+
+    public static CharSequence test(int id, String test) {
+        Regex regex = get(id);
+        if(regex == null) return Tuils.EMPTYSTRING;
+
+        String r = regex.value;
+
+        Pattern p = Pattern.compile(r);
+        Matcher m = p.matcher(test);
+
+        int color = XMLPrefsManager.getColor(Theme.mark_color);
+        int outputColor = XMLPrefsManager.getColor(Theme.output_color);
+
+        if(m.matches()) {
+            return Tuils.span(color, outputColor, test);
+        }
+
+        int last = 0;
+        SpannableString s = Tuils.span(test, outputColor);
+        while(m.find()) {
+            String g0 = m.group(0);
+            last = Tuils.span(color, s, g0, last);
+        }
+
+        return s;
+    }
+
+    public static class Regex {
+        public String value;
+        public int id;
+
+        public Regex(String value, int id) {
+            this.value = value;
+            this.id = id;
+        }
+    }
+}
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/RssManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/RssManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..000076a3d7225301cb545f8dd3e467caa163016a
--- /dev/null
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/RssManager.java
@@ -0,0 +1,897 @@
+package ohi.andre.consolelauncher.managers;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Color;
+import android.net.ConnectivityManager;
+import android.os.Handler;
+import android.os.Message;
+import android.text.TextUtils;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import ohi.andre.consolelauncher.R;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.tuils.InputOutputReceiver;
+import ohi.andre.consolelauncher.tuils.TimeManager;
+import ohi.andre.consolelauncher.tuils.Tuils;
+
+import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.VALUE_ATTRIBUTE;
+import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.set;
+import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.writeTo;
+
+/**
+ * Created by francescoandreuzzi on 01/10/2017.
+ */
+
+public class RssManager implements XMLPrefsManager.XmlPrefsElement {
+
+//    header:
+//    last-modified
+//    etag
+//    last_checked_client
+
+    private final String RSS_FOLDER = "rss";
+
+    public static final String TIME_ATTRIBUTE  = "time", SHOW_ATTRIBUTE = "show", URL_ATTRIBUTE = "url", LASTCHECKED_ATTRIBUTE = "lastChecked", LASTMODIFIED_ATTRIBUTE = "lastModified", ETAG_ATTRIBUTE = "etag",
+                            LAST_SHOWN_ITEM_ATTRIBUTE = "lastShownItem", ID_ATTRIBUTE = "id", FORMAT_ATTRIBUTE = "format", INCLUDE_ATTRIBUTE = "includeIfMatches", EXCLUDE_ATTRIBUTE = "excludeIfMatches",
+                                COLOR_ATTRIBUTE = "color", WIFIONLY_ATTRIBUTE = "wifiOnly", COMMAND_ATTRIBUTE = "updateCommand";
+
+    public static final String RSS_LABEL = "rss", FORMAT_LABEL = "format";
+
+    private final String SEPARATOR = " - ";
+    private final String ID_LABEL = "ID: ", TIME_LABEL = "update time: ", SHOW_LABEL = "show: ", URL_LABEL = "url: ";
+
+    private final String LAST_MODIFIED_FIELD = "Last-Modified", ETAG_FIELD = "ETag", IF_MODIFIED_SINCE_FIELD = "If-Modified-Since", IF_NONE_MATCH_FIELD = "If-None-Match", GET_LABEL = "GET";
+
+    private final String PUBDATE_CHILD = "pubDate";
+
+    private DateFormat defaultRSSDateFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z");
+
+    private static XMLPrefsManager.XMLPrefsList values;
+
+    public static final String PATH = "rss.xml";
+    public static final String NAME = "RSS";
+
+    public static XMLPrefsManager.XmlPrefsElement instance = null;
+
+    @Override
+    public String[] deleted() {
+        return new String[] {};
+    }
+
+    @Override
+    public XMLPrefsManager.XMLPrefsList getValues() {
+        return values;
+    }
+
+    @Override
+    public void write(XMLPrefsManager.XMLPrefsSave save, String value) {
+        set(new File(Tuils.getFolder(), PATH), NAME, save.label(), new String[] {VALUE_ATTRIBUTE}, new String[] {value});
+    }
+
+    private int defaultColor;
+    private String defaultFormat, timeFormat;
+    private boolean includeRssDefault;
+
+    private Context context;
+    private Handler handler;
+
+    private File root, rssFile;
+
+    private List<Rss> feeds;
+    private List<Format> formats;
+
+//    those will obscure the tag and its content
+    private Pattern[] hideTagPatterns;
+
+    private ConnectivityManager connectivityManager;
+
+    public RssManager(Context context) {
+        instance = this;
+        this.context = context;
+
+        connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+
+        RegexManager.create(context);
+
+        root = new File(Tuils.getFolder(), RSS_FOLDER);
+        rssFile = new File(Tuils.getFolder(), PATH);
+
+        prepare();
+
+        values = new XMLPrefsManager.XMLPrefsList();
+
+        refresh();
+    }
+
+    public void refresh() {
+        if(handler != null) {
+            handler.removeCallbacksAndMessages(null);
+            handler = null;
+        }
+
+        handler = new Handler() {
+            @Override
+            public void handleMessage(Message msg) {
+                super.handleMessage(msg);
+
+                
+            }
+        };
+
+        if(feeds != null) feeds.clear();
+        else feeds = new ArrayList<>();
+
+        if(formats != null) formats.clear();
+        else formats = new ArrayList<>();
+
+        new Thread() {
+            @Override
+            public void run() {
+                super.run();
+
+                try {
+                    Object[] o = XMLPrefsManager.buildDocument(rssFile, NAME);
+
+                    Document document = (Document) o[0];
+                    Element rootElement = (Element) o[1];
+
+                    NodeList nodes = rootElement.getElementsByTagName("*");
+
+                    List<ohi.andre.consolelauncher.managers.xml.options.Rss> enums = new ArrayList<>(Arrays.asList(ohi.andre.consolelauncher.managers.xml.options.Rss.values()));
+
+                    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) {
+//                              is an enum value
+                            values.add(nn, node.getAttributes().getNamedItem(VALUE_ATTRIBUTE).getNodeValue());
+
+                            for (int en = 0; en < enums.size(); en++) {
+                                if (enums.get(en).label().equals(nn)) {
+                                    enums.remove(en);
+                                    break;
+                                }
+                            }
+                        } else {
+//                             deleted
+                            int index = deleted == null ? -1 : Tuils.find(nn, deleted);
+                            if(index != -1) {
+                                deleted[index] = null;
+                                Element e = (Element) node;
+                                rootElement.removeChild(e);
+
+                                needToWrite = true;
+                            }
+
+                            else {
+                                String name = node.getNodeName();
+                                if (name.equals(RSS_LABEL)) {
+                                    Element t = (Element) node;
+
+                                    int id;
+                                    try {
+                                        id = Integer.parseInt(t.getAttribute(ID_ATTRIBUTE));
+                                    } catch (Exception exc) {
+                                        continue Main;
+                                    }
+
+                                    String url = t.getAttribute(URL_ATTRIBUTE);
+                                    long updateTime = Long.parseLong(t.getAttribute(TIME_ATTRIBUTE));
+                                    boolean show = Boolean.parseBoolean(t.getAttribute(SHOW_ATTRIBUTE));
+
+                                    long lastChecked = t.hasAttribute(LASTCHECKED_ATTRIBUTE) ? Long.parseLong(t.getAttribute(LASTCHECKED_ATTRIBUTE)) : -1;
+                                    long lastShown = t.hasAttribute(LAST_SHOWN_ITEM_ATTRIBUTE) ? Long.parseLong(t.getAttribute(LAST_SHOWN_ITEM_ATTRIBUTE)) : -1;
+                                    String lastModified = t.hasAttribute(LASTMODIFIED_ATTRIBUTE) ? t.getAttribute(LASTMODIFIED_ATTRIBUTE) : null;
+                                    String etag = t.hasAttribute(ETAG_ATTRIBUTE) ? t.getAttribute(ETAG_ATTRIBUTE) : null;
+
+                                    String format = t.hasAttribute(FORMAT_ATTRIBUTE) ? t.getAttribute(FORMAT_ATTRIBUTE) : null;
+                                    String includeIfMatches = t.hasAttribute(INCLUDE_ATTRIBUTE) ? t.getAttribute(INCLUDE_ATTRIBUTE) : null;
+                                    String excludeIfMatches = t.hasAttribute(EXCLUDE_ATTRIBUTE) ? t.getAttribute(EXCLUDE_ATTRIBUTE) : null;
+                                    int color;
+                                    try {
+                                        color = Color.parseColor(t.getAttribute(COLOR_ATTRIBUTE));
+                                    } catch (Exception exc) {
+                                        color = Integer.MAX_VALUE;
+                                    }
+
+                                    boolean wifiOnly;
+                                    try {
+                                        wifiOnly = Boolean.parseBoolean(t.getAttribute(WIFIONLY_ATTRIBUTE));
+                                    } catch (Exception e) {
+                                        wifiOnly = false;
+                                    }
+
+                                    String updateCommand = t.hasAttribute(COMMAND_ATTRIBUTE) ? t.getAttribute(COMMAND_ATTRIBUTE) : null;
+
+                                    final Rss r = new Rss(url, updateTime, lastChecked, lastShown, id, show, lastModified, etag, format, includeIfMatches, excludeIfMatches, color, wifiOnly, updateCommand);
+                                    feeds.add(r);
+                                } else if(name.equals(FORMAT_LABEL)) {
+                                        Element e = (Element) node;
+
+                                        int id;
+                                        try {
+                                            id = Integer.parseInt(e.getAttribute(ID_ATTRIBUTE));
+                                        } catch (Exception exc) {
+                                            id = -1;
+                                        }
+
+                                        if(id == -1) continue;
+
+                                        String format = e.getAttribute(XMLPrefsManager.VALUE_ATTRIBUTE);
+
+                                        Format i = new Format(format, id);
+                                        formats.add(i);
+                                    }
+                                }
+                            }
+                        }
+
+                    if (enums.size() > 0) {
+                        for (XMLPrefsManager.XMLPrefsSave s : enums) {
+                            String value = s.defaultValue();
+
+                            Element em = document.createElement(s.label());
+                            em.setAttribute(VALUE_ATTRIBUTE, value);
+                            rootElement.appendChild(em);
+
+                            values.add(s.label(), value);
+                        }
+
+                        writeTo(document, rssFile);
+                    } else if (needToWrite) {
+                        writeTo(document, rssFile);
+                    }
+                } catch (Exception e) {
+                    Tuils.log(e);
+                    Tuils.toFile(e);
+                }
+
+                defaultFormat = XMLPrefsManager.get(ohi.andre.consolelauncher.managers.xml.options.Rss.rss_default_format);
+                defaultColor = XMLPrefsManager.getColor(ohi.andre.consolelauncher.managers.xml.options.Rss.rss_default_color);
+                includeRssDefault = XMLPrefsManager.getBoolean(ohi.andre.consolelauncher.managers.xml.options.Rss.include_rss_default);
+                timeFormat = XMLPrefsManager.get(ohi.andre.consolelauncher.managers.xml.options.Rss.rss_time_format);
+
+                String hiddenTags = XMLPrefsManager.get(ohi.andre.consolelauncher.managers.xml.options.Rss.rss_hidden_tags).replaceAll(Tuils.SPACE, Tuils.EMPTYSTRING);
+                String[] split = null;
+                for(int c = 0; c < hiddenTags.length(); c++) {
+                    char ch = hiddenTags.charAt(c);
+                    if(Character.isLetter(ch)) continue;
+                    split = hiddenTags.split(ch + Tuils.EMPTYSTRING);
+                }
+                if(split == null) {
+                    split = new String[] {hiddenTags};
+                }
+
+                hideTagPatterns = new Pattern[split.length * 2];
+                for(int c = 0, j = 0; c < split.length; c++, j += 2) {
+                    hideTagPatterns[j] = Pattern.compile("<" + split[c] + "[^>]*>[^<]*<\\/" + split[c] + ">");
+                    hideTagPatterns[j + 1] = Pattern.compile("<" + split[c] + "[^>]*\\/>");
+                }
+
+                for(Rss rss : feeds) {
+                    rss.updateFormat();
+                    rss.updateIncludeIfMatches();
+                    rss.updateExcludeIfMatches();
+
+                    if(rss.color == Integer.MAX_VALUE) rss.color = defaultColor;
+
+                    queue(rss);
+                }
+            }
+        }.start();
+    }
+
+    public void dispose() {
+        handler.removeCallbacksAndMessages(null);
+    }
+
+    public String add(int id, long timeInSeconds, String url) {
+        String output = XMLPrefsManager.add(rssFile, NAME, RSS_LABEL, new String[] {ID_ATTRIBUTE, TIME_ATTRIBUTE, SHOW_ATTRIBUTE, URL_ATTRIBUTE},
+                new String[] {String.valueOf(id), String.valueOf(timeInSeconds * 1000), String.valueOf(true), url});
+
+        if(output == null) {
+            try {
+                Rss r = new Rss(url, timeInSeconds * 1000, id, true);
+
+                r.lastShownItem = System.currentTimeMillis();
+                r.format = defaultFormat;
+
+                updateRss(r, true);
+                feeds.add(r);
+
+                queue(r);
+            } catch (Exception e) {
+                Tuils.log(e);
+                return e.toString();
+            }
+
+            return null;
+        } else return output;
+    }
+
+    public String addFormat(int id, String value) {
+        String output = XMLPrefsManager.add(rssFile, NAME, FORMAT_LABEL, new String[] {ID_ATTRIBUTE, XMLPrefsManager.VALUE_ATTRIBUTE}, new String[] {String.valueOf(id), value});
+        if(output == null) {
+            formats.add(new Format(value, id));
+            return null;
+        } else return output;
+    }
+
+    public String removeFormat(int id) {
+        String output = XMLPrefsManager.removeNode(rssFile, NAME, FORMAT_LABEL, new String[] {ID_ATTRIBUTE}, new String[] {String.valueOf(id)});;
+        if(output == null) {
+            return null;
+        } else {
+            if (output.length() > 0) return output;
+            return context.getString(R.string.id_notfound);
+        }
+    }
+
+    public String rm(int id) {
+        String output = XMLPrefsManager.removeNode(rssFile, NAME, RSS_LABEL, new String[] {ID_ATTRIBUTE}, new String[] {String.valueOf(id)});
+        if(output == null) {
+            File rss = new File(root, RSS_LABEL + id + ".xml");
+            if(rss.exists()) rss.delete();
+
+            removeId(id);
+            handler.sendEmptyMessage(id);
+
+            return null;
+        }
+        else {
+            if(output.length() > 0) return output;
+            else return context.getString(R.string.rss_not_found);
+        }
+    }
+
+    public String list() {
+        StringBuilder builder = new StringBuilder();
+        for(Rss r : feeds) {
+            builder.append(ID_LABEL).append(":").append(Tuils.SPACE).append(r.id).append(Tuils.NEWLINE).append(r.url).append(Tuils.NEWLINE);
+        }
+
+        return builder.toString().trim();
+    }
+
+    public void l(int id) {
+        for(Rss feed : feeds) {
+            if(feed.id == id) {
+                try {
+                    parse(feed, false);
+                } catch (Exception e) {
+                    Tuils.log(e);
+                    Tuils.toFile(e);
+                }
+                break;
+            }
+        }
+    }
+
+    public String setShow(int id, boolean show) {
+        String output = XMLPrefsManager.set(rssFile, NAME, RSS_LABEL, new String[] {ID_ATTRIBUTE}, new String[] {String.valueOf(id)}, new String[] {SHOW_ATTRIBUTE}, new String[] {String.valueOf(show)}, false);
+        if(output == null) {
+            Rss r = findId(id);
+            if(r != null) r.show = show;
+            return null;
+        }
+        else {
+            if (output.length() > 0) return output;
+            return context.getString(R.string.rss_not_found);
+        }
+    }
+
+    public String setTime(int id, long timeSeconds) {
+        String output = XMLPrefsManager.set(rssFile, NAME, RSS_LABEL, new String[] {ID_ATTRIBUTE}, new String[] {String.valueOf(id)}, new String[] {TIME_ATTRIBUTE}, new String[] {String.valueOf(timeSeconds)}, false);
+        if(output == null) {
+            Rss r = findId(id);
+            if(r != null) r.updateTimeSeconds = timeSeconds;
+            return null;
+        }
+        else {
+            if (output.length() > 0) return output;
+            return context.getString(R.string.rss_not_found);
+        }
+    }
+
+    public String setFormat(int id, String format) {
+        String output = XMLPrefsManager.set(rssFile, NAME, RSS_LABEL, new String[] {ID_ATTRIBUTE}, new String[] {String.valueOf(id)}, new String[] {FORMAT_ATTRIBUTE}, new String[] {format}, false);
+        if(output == null) {
+            Rss r = findId(id);
+            if(r != null) r.setFormat(format);
+            return null;
+        }
+        else {
+            if (output.length() > 0) return output;
+            return context.getString(R.string.rss_not_found);
+        }
+    }
+
+    public String setColor(int id, String color) {
+        String output = XMLPrefsManager.set(rssFile, NAME, RSS_LABEL, new String[] {ID_ATTRIBUTE}, new String[] {String.valueOf(id)}, new String[] {COLOR_ATTRIBUTE}, new String[] {color}, false);
+        if(output == null) {
+            Rss r = findId(id);
+            if(r != null) r.color = Color.parseColor(color);
+            return null;
+        }
+        else {
+            if (output.length() > 0) return output;
+            return context.getString(R.string.rss_not_found);
+        }
+    }
+
+    public String setIncludeIfMatches(int id, String regex) {
+        String output = XMLPrefsManager.set(rssFile, NAME, RSS_LABEL, new String[] {ID_ATTRIBUTE}, new String[] {String.valueOf(id)}, new String[] {INCLUDE_ATTRIBUTE}, new String[] {regex}, false);
+        if(output == null) {
+            Rss r = findId(id);
+            if(r != null) r.setIncludeIfMatches(regex);
+            return null;
+        }
+        else {
+            if (output.length() > 0) return output;
+            return context.getString(R.string.rss_not_found);
+        }
+    }
+
+    public String setExcludeIfMatches(int id, String regex) {
+        String output = XMLPrefsManager.set(rssFile, NAME, RSS_LABEL, new String[] {ID_ATTRIBUTE}, new String[] {String.valueOf(id)}, new String[] {EXCLUDE_ATTRIBUTE}, new String[] {regex}, false);
+        if(output == null) {
+            Rss r = findId(id);
+            if(r != null) r.setExcludeIfMatches(regex);
+            return null;
+        }
+        else {
+            if (output.length() > 0) return output;
+            return context.getString(R.string.rss_not_found);
+        }
+    }
+
+    public String setWifiOnly(int id, boolean wifiOnly) {
+        String output = XMLPrefsManager.set(rssFile, NAME, RSS_LABEL, new String[] {ID_ATTRIBUTE}, new String[] {String.valueOf(id)}, new String[] {WIFIONLY_ATTRIBUTE}, new String[] {String.valueOf(wifiOnly)},
+                false);
+        if(output == null) {
+            Rss r = findId(id);
+            if(r != null) r.wifiOnly = wifiOnly;
+            return null;
+        }
+        else {
+            if (output.length() > 0) return output;
+            return context.getString(R.string.rss_not_found);
+        }
+    }
+
+//    base methods
+
+    private void queue(final Rss rss) {
+        Runnable rn = new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    updateRss(rss, false);
+                    queue(rss);
+                } catch (Exception e1) {
+                    Tuils.log(e1);
+                }
+            }
+        };
+
+        long delay;
+        if(rss.lastCheckedClient == -1) delay = 0;
+        else delay = rss.updateTimeSeconds - (System.currentTimeMillis() - rss.lastCheckedClient);
+
+        if(delay <= 0) rn.run();
+        else {
+            handler.postDelayed(rn, delay);
+        }
+    }
+
+    final String quotes = "\"";
+
+    private void updateRss(final Rss feed, final boolean firstTime) {
+        if(feed.wifiOnly && !connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected()) {
+
+            feed.lastCheckedClient = System.currentTimeMillis();
+            feed.updateFile();
+
+            return;
+        }
+
+        final Object o = new Object();
+
+        new Thread() {
+            @Override
+            public void run() {
+                super.run();
+
+                try {
+                    URL uObj = new URL(feed.url);
+                    HttpURLConnection urlConnection = (HttpURLConnection) uObj.openConnection();
+                    urlConnection.setRequestMethod(GET_LABEL);
+
+                    if(!firstTime) {
+                        urlConnection.setRequestProperty(IF_MODIFIED_SINCE_FIELD, feed.lMod);
+                        urlConnection.setRequestProperty(IF_NONE_MATCH_FIELD, quotes + feed.etag + quotes);
+                    }
+
+                    urlConnection.connect();
+
+                    if(firstTime || urlConnection.getResponseCode() != 304) {
+                        Tuils.download(new BufferedInputStream(uObj.openStream()), new File(root, RSS_LABEL + feed.id + ".xml"));
+
+                        feed.lMod = urlConnection.getHeaderField(LAST_MODIFIED_FIELD);
+                        feed.etag = urlConnection.getHeaderField(ETAG_FIELD);
+                        if(feed.etag != null) feed.etag = feed.etag.replaceAll("\"", Tuils.EMPTYSTRING);
+
+                        if(parse(feed, true) && feed.updateCommand != null) {
+                            Intent intent = new Intent(InputOutputReceiver.ACTION_CMD);
+                            intent.putExtra(InputOutputReceiver.SHOW_CONTENT, false);
+                            intent.putExtra(InputOutputReceiver.TEXT, feed.updateCommand);
+                            context.sendBroadcast(intent);
+                        }
+                    } else {
+//                        not modified
+                    }
+
+                    feed.lastCheckedClient = System.currentTimeMillis();
+                    feed.updateFile();
+
+                } catch (Exception e) {
+                    Tuils.log(e);
+                    Tuils.toFile(e);
+                }
+
+                synchronized (o) {
+                    o.notify();
+                }
+            }
+        }.start();
+
+        synchronized (o) {
+            try {
+                o.wait();
+            } catch (InterruptedException e) {
+                Tuils.log(e);
+                Tuils.toFile(e);
+            }
+        }
+    }
+
+    private boolean parse(Rss feed, boolean time) throws Exception {
+        Tuils.log("parse");
+
+        boolean updated = false;
+
+        File rssFile = new File(root, RSS_LABEL + feed.id + ".xml");
+        if(!rssFile.exists()) return updated;
+
+        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
+        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
+        Document doc = dBuilder.parse(rssFile);
+
+        doc.getDocumentElement().normalize();
+
+        long lastShown = feed.lastShownItem;
+
+        NodeList list = doc.getElementsByTagName("item");
+        for(int c = list.getLength(); c >= 0; c--) {
+            Tuils.log("index: " + c);
+
+            Element element = (Element) list.item(c);
+            if(element == null) {
+                continue;
+            }
+
+            if(time) {
+                Tuils.log("timing");
+                NodeList l = element.getElementsByTagName(PUBDATE_CHILD);
+                if(l.getLength() == 0) continue;
+
+                String date = l.item(0).getTextContent();
+                Date d = defaultRSSDateFormat.parse(date);
+
+                long timeLong = d.getTime();
+                if(c == 0) {
+                    feed.lastShownItem = d.getTime();
+                    feed.updateTime();
+                }
+
+                Tuils.log("pubDate: " + timeLong);
+                Tuils.log("lastShown: " + lastShown);
+
+                if(lastShown < timeLong) {
+                    updated = true;
+
+                    Tuils.log("showing");
+                    showItem(feed, element);
+                }
+            } else {
+                updated = true;
+
+                Tuils.log("not timing");
+                showItem(feed, element);
+            }
+        }
+
+        return updated;
+    }
+
+    private final Pattern formatPattern = Pattern.compile("%(?:\\[(\\d+)\\])?(?:\\[([^]]+)\\])?([^\\s]+)");
+    private final Pattern removeTags = Pattern.compile("<[^>]+>");
+    private final String THREE_DOTS = "...";
+
+//    called when a new element is detected, it could be triggered many times again in some milliseconds
+    private void showItem(Rss feed, Element item) {
+        String cp = feed.format != null ? feed.format : defaultFormat;
+
+        CharSequence s = Tuils.span(cp, feed.color);
+
+        Matcher m = formatPattern.matcher(cp);
+        while(m.find()) {
+            if(m.groupCount() == 3) {
+                String length = m.group(1);
+                String color = m.group(2);
+                String tag = m.group(3);
+
+                String value;
+                int cl = feed.color;
+
+                NodeList ls = item.getElementsByTagName(tag);
+                if(ls.getLength() == 0) value = Tuils.EMPTYSTRING;
+                else {
+                    value = ls.item(0).getTextContent();
+
+                    if(value.equals(PUBDATE_CHILD)) {
+                        Date d;
+                        try {
+                            d = defaultRSSDateFormat.parse(value);
+                        } catch (ParseException e) {
+                            continue;
+                        }
+
+                        long timeLong = d.getTime();
+                        value = TimeManager.replace(timeFormat, timeLong, Integer.MAX_VALUE).toString();
+
+                    } else {
+                        for(Pattern p : hideTagPatterns) {
+                            value = p.matcher(value).replaceAll(Tuils.EMPTYSTRING);
+                        }
+
+                        value = removeTags.matcher(value).replaceAll(Tuils.EMPTYSTRING);
+
+                        try {
+                            int l = Integer.parseInt(length);
+                            value = value.substring(0, l);
+                            value = value.concat(THREE_DOTS);
+                        } catch (Exception e) {}
+
+                    }
+
+                    try {
+                        cl = Color.parseColor(color);
+                    } catch (Exception e) {
+                        cl = feed.color;
+                    }
+
+                }
+
+                CharSequence replace;
+                if(cl != feed.color && value.length() > 0) {
+                    replace = Tuils.span(value, cl);
+                } else {
+                    replace = value;
+                }
+
+                s = TextUtils.replace(s, new String[] {m.group(0)}, new CharSequence[] {replace});
+            }
+
+        }
+
+        if(includeRssDefault) {
+            if(feed.excludeIfMatches != null && feed.excludeIfMatches.length() > 0) {
+                Pattern p = Pattern.compile(feed.excludeIfMatches);
+                if (p.matcher(s.toString()).find()) {
+                    return;
+                }
+            }
+        } else {
+            if(feed.includeIfMatches != null && feed.includeIfMatches.length() > 0) {
+                Pattern p = Pattern.compile(feed.includeIfMatches);
+                if (!p.matcher(s.toString()).find()) {
+                    return;
+                }
+            }
+        }
+
+        Tuils.sendOutput(context, s);
+    }
+
+    private class Rss {
+        String url;
+        long updateTimeSeconds, lastCheckedClient, lastShownItem;
+        int id;
+        boolean show;
+        String lMod, etag;
+
+        String format;
+        String includeIfMatches, excludeIfMatches;
+        String updateCommand;
+
+        int color;
+
+        boolean wifiOnly;
+
+        public Rss(String url, long updateTimeSeconds, int id, boolean show) {
+            this(url, updateTimeSeconds, -1, -1, id, show, null, null, null, null, null, Integer.MAX_VALUE, false, null);
+        }
+
+        public Rss(String url, long updateTimeSeconds, long lastCheckedClient, long lastShownItem, int id, boolean show, String lMod, String etag, String format,
+                   String includeIfMatches, String excludeIfMatches, int color, boolean wifiOnly, String updateCommand) {
+            this.url = url;
+            this.updateTimeSeconds = updateTimeSeconds;
+            this.lastShownItem = lastShownItem;
+            this.lastCheckedClient = lastCheckedClient;
+            this.id = id;
+            this.show = show;
+            this.lMod = lMod;
+            this.etag = etag;
+
+            this.format = format;
+            this.includeIfMatches = includeIfMatches;
+            this.excludeIfMatches = excludeIfMatches;
+
+            this.color = color;
+
+            this.wifiOnly = wifiOnly;
+
+            this.updateCommand = updateCommand;
+        }
+
+        private void updateFile() {
+            XMLPrefsManager.set(rssFile, NAME, RSS_LABEL, new String[] {ID_ATTRIBUTE}, new String[] {String.valueOf(id)},
+                    new String[] {LASTCHECKED_ATTRIBUTE, LASTMODIFIED_ATTRIBUTE, ETAG_ATTRIBUTE}, new String[] {String.valueOf(lastCheckedClient), lMod, etag},
+                    false);
+        }
+
+        @Override
+        public String toString() {
+            return new StringBuilder().append(ID_LABEL).append(id).append(SEPARATOR).append(TIME_LABEL).append(updateTimeSeconds).append(SEPARATOR).append(SHOW_LABEL).append(show).append(Tuils.NEWLINE)
+                    .append(URL_LABEL).append(url).toString();
+        }
+
+        public void setFormat(String format) {
+            this.format = format;
+            updateFormat();
+        }
+
+        public void setIncludeIfMatches(String includeIfMatches) {
+            this.includeIfMatches = includeIfMatches;
+            updateIncludeIfMatches();
+        }
+
+        public void setExcludeIfMatches(String excludeIfMatches) {
+            this.excludeIfMatches = excludeIfMatches;
+            updateExcludeIfMatches();
+        }
+
+        public void updateFormat() {
+            if(format != null) {
+                try {
+                    int id = Integer.parseInt(format);
+                    for(Format i : formats) {
+                        if(id == i.id) format = i.value;
+                    }
+                } catch (Exception exc) {
+//                  the format is personalized --> it can't be casted to int
+                }
+            }
+        }
+
+        public void updateIncludeIfMatches() {
+            if(includeIfMatches != null) {
+                try {
+                    int id = Integer.parseInt(includeIfMatches);
+                    includeIfMatches = RegexManager.get(id).value;
+                } catch (Exception exc) {}
+            }
+        }
+
+        public void updateExcludeIfMatches() {
+            if(excludeIfMatches != null) {
+                try {
+                    int id = Integer.parseInt(excludeIfMatches);
+                    excludeIfMatches = RegexManager.get(id).value;
+                } catch (Exception exc) {}
+            }
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if(obj instanceof Rss) return id == ((Rss) obj).id;
+            if(obj instanceof Integer) return id == (int) obj;
+            return false;
+        }
+
+        public void updateTime() {
+            Tuils.log("updating time: " + XMLPrefsManager.set(rssFile, NAME, RSS_LABEL, new String[] {ID_ATTRIBUTE}, new String[] {String.valueOf(id)}, new String[] {LAST_SHOWN_ITEM_ATTRIBUTE},
+                    new String[] {String.valueOf(lastShownItem)}, false));
+        }
+    }
+
+    private static class Format {
+        String value;
+        int id;
+
+        public Format(String value, int id) {
+            this.value = value;
+            this.id = id;
+        }
+    }
+
+//    utils
+    private void removeId(int id) {
+        for(int c = 0; c < feeds.size(); c++) {
+            if(feeds.get(c).id == id) {
+                feeds.remove(c);
+                return;
+            }
+        }
+    }
+
+    private Rss findId(int id) {
+        for(int c = 0; c < feeds.size(); c++) {
+            Rss r = feeds.get(c);
+            if(r.id == id) {
+                return r;
+            }
+        }
+
+        return null;
+    }
+
+    private boolean prepare() {
+        boolean check = true;
+        if(!root.isDirectory()) {
+            check = false;
+            root.mkdir();
+        }
+        if(!rssFile.exists()) {
+            try {
+                rssFile.createNewFile();
+                XMLPrefsManager.resetFile(rssFile, NAME);
+                check = false;
+
+                return check && root.list().length > 1;
+            } catch (Exception e) {
+                return false;
+            }
+        }
+
+        return check;
+    }
+}
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/TerminalManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/TerminalManager.java
index 04e876c32d95f44da9cebc9b4525668fb11a8e46..86025ada89fd94e6266d204b3b7f9def1ed349c0 100644
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/TerminalManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/TerminalManager.java
@@ -2,8 +2,8 @@ package ohi.andre.consolelauncher.managers;
 
 import android.app.Activity;
 import android.content.Context;
-import android.graphics.Typeface;
 import android.os.IBinder;
+import android.text.InputFilter;
 import android.text.InputType;
 import android.text.Layout;
 import android.text.SpannableString;
@@ -26,6 +26,10 @@ import java.util.List;
 import ohi.andre.consolelauncher.UIManager;
 import ohi.andre.consolelauncher.commands.main.MainPack;
 import ohi.andre.consolelauncher.commands.main.raw.clear;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.options.Behavior;
+import ohi.andre.consolelauncher.managers.xml.options.Theme;
+import ohi.andre.consolelauncher.managers.xml.options.Ui;
 import ohi.andre.consolelauncher.tuils.TimeManager;
 import ohi.andre.consolelauncher.tuils.Tuils;
 import ohi.andre.consolelauncher.tuils.interfaces.Rooter;
@@ -53,6 +57,7 @@ public class TerminalManager {
     public static final int CATEGORY_OUTPUT = 11;
     public static final int CATEGORY_NOTIFICATION = 12;
     public static final int CATEGORY_GENERAL = 13;
+    public static final int CATEGORY_RSS = 14;
 
     private long lastEnter;
 
@@ -84,7 +89,7 @@ public class TerminalManager {
 
     private MainPack mainPack;
 
-    private boolean defaultHint = true;
+    private boolean defaultHint = true, autoLowerFirstChar;
 
     private int clearCmdsCount= 0;
 
@@ -110,31 +115,30 @@ public class TerminalManager {
 
         this.mContext = context;
 
-        final Typeface lucidaConsole = Typeface.createFromAsset(context.getAssets(), "lucida_console.ttf");
-
         this.mainPack = mainPack;
 
-        this.clearAfterMs = XMLPrefsManager.get(int.class, XMLPrefsManager.Behavior.clear_after_seconds) * 1000;
-        this.clearAfterCmds = XMLPrefsManager.get(int.class, XMLPrefsManager.Behavior.clear_after_cmds);
-        this.maxLines = XMLPrefsManager.get(int.class, XMLPrefsManager.Behavior.max_lines);
+        this.autoLowerFirstChar = XMLPrefsManager.getBoolean(Behavior.autolower_firstchar);
+
+        this.clearAfterMs = XMLPrefsManager.getInt(Behavior.clear_after_seconds) * 1000;
+        this.clearAfterCmds = XMLPrefsManager.getInt(Behavior.clear_after_cmds);
+        this.maxLines = XMLPrefsManager.getInt(Behavior.max_lines);
 
-        inputFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.input_format);
-        outputFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.output_format);
+        inputFormat = XMLPrefsManager.get(Behavior.input_format);
+        outputFormat = XMLPrefsManager.get(Behavior.output_format);
 
-        prefix = XMLPrefsManager.get(XMLPrefsManager.Ui.input_prefix);
-        suPrefix = XMLPrefsManager.get(String.class, XMLPrefsManager.Ui.input_root_prefix);
+        prefix = XMLPrefsManager.get(Ui.input_prefix);
+        suPrefix = XMLPrefsManager.get(Ui.input_root_prefix);
 
-        int ioSize = XMLPrefsManager.get(int.class, XMLPrefsManager.Ui.input_output_size);
+        int ioSize = XMLPrefsManager.getInt(Ui.input_output_size);
 
-        Typeface t = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.system_font) ? Typeface.DEFAULT : lucidaConsole;
-        prefixView.setTypeface(t);
-        prefixView.setTextColor(XMLPrefsManager.getColor(XMLPrefsManager.Theme.input_color));
+        prefixView.setTypeface(Tuils.getTypeface(context));
+        prefixView.setTextColor(XMLPrefsManager.getColor(Theme.input_color));
         prefixView.setTextSize(ioSize);
         prefixView.setText(prefix.endsWith(Tuils.SPACE) ? prefix : prefix + Tuils.SPACE);
         this.mPrefix = prefixView;
 
         if (submitView != null) {
-            submitView.setColorFilter(XMLPrefsManager.getColor(XMLPrefsManager.Theme.enter_color));
+            submitView.setColorFilter(XMLPrefsManager.getColor(Theme.enter_color));
             submitView.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
@@ -144,8 +148,8 @@ public class TerminalManager {
         }
 
         if (backView != null) {
-            ((View) backView.getParent()).setBackgroundColor(XMLPrefsManager.getColor(XMLPrefsManager.Theme.toolbar_bg));
-            backView.setColorFilter(XMLPrefsManager.getColor(XMLPrefsManager.Theme.toolbar_color));
+            ((View) backView.getParent()).setBackgroundColor(XMLPrefsManager.getColor(Theme.toolbar_bg));
+            backView.setColorFilter(XMLPrefsManager.getColor(Theme.toolbar_color));
             backView.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
@@ -155,7 +159,7 @@ public class TerminalManager {
         }
 
         if (nextView != null) {
-            nextView.setColorFilter(XMLPrefsManager.getColor(XMLPrefsManager.Theme.toolbar_color));
+            nextView.setColorFilter(XMLPrefsManager.getColor(Theme.toolbar_color));
             nextView.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
@@ -165,7 +169,7 @@ public class TerminalManager {
         }
 
         if (pasteView != null) {
-            pasteView.setColorFilter(XMLPrefsManager.getColor(XMLPrefsManager.Theme.toolbar_color));
+            pasteView.setColorFilter(XMLPrefsManager.getColor(Theme.toolbar_color));
             pasteView.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
@@ -178,7 +182,7 @@ public class TerminalManager {
         }
 
         if (deleteView != null) {
-            deleteView.setColorFilter(XMLPrefsManager.getColor(XMLPrefsManager.Theme.toolbar_color));
+            deleteView.setColorFilter(XMLPrefsManager.getColor(Theme.toolbar_color));
             deleteView.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
@@ -188,7 +192,7 @@ public class TerminalManager {
         }
 
         this.mTerminalView = terminalView;
-        this.mTerminalView.setTypeface(t);
+        this.mTerminalView.setTypeface(Tuils.getTypeface(context));
         this.mTerminalView.setTextSize(ioSize);
         this.mTerminalView.setFocusable(false);
         setupScroller();
@@ -232,8 +236,8 @@ public class TerminalManager {
 
         this.mInputView = inputView;
         this.mInputView.setTextSize(ioSize);
-        this.mInputView.setTextColor(XMLPrefsManager.getColor(XMLPrefsManager.Theme.input_color));
-        this.mInputView.setTypeface(t);
+        this.mInputView.setTextColor(XMLPrefsManager.getColor(Theme.input_color));
+        this.mInputView.setTypeface(Tuils.getTypeface(context));
         this.mInputView.setHint(Tuils.getHint(mainPack.currentDirectory.getAbsolutePath()));
         this.mInputView.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
         this.mInputView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@@ -265,6 +269,20 @@ public class TerminalManager {
                 return true;
             }
         });
+        if(autoLowerFirstChar) {
+            this.mInputView.setFilters(new InputFilter[] {new InputFilter() {
+                @Override
+                public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
+                    if (dstart == 0 && dend == 0 && start == 0 && end == 1) {
+                        if(source.length() > 0) {
+                            return TextUtils.concat(source.toString().toLowerCase().charAt(0) + Tuils.EMPTYSTRING, source.subSequence(1,source.length()));
+                        }
+                    }
+
+                    return source;
+                }
+            }});
+        }
     }
 
     private void setupNewInput() {
@@ -330,7 +348,7 @@ public class TerminalManager {
         }
 
         if(color == Integer.MAX_VALUE) {
-            color = XMLPrefsManager.getColor(XMLPrefsManager.Theme.output_color);
+            color = XMLPrefsManager.getColor(Theme.output_color);
         }
 
         SpannableString si = new SpannableString(output);
@@ -398,9 +416,9 @@ public class TerminalManager {
 
                 boolean su = t.toString().startsWith("su ") || suMode;
 
-                SpannableString si = Tuils.span(inputFormat, XMLPrefsManager.getColor(XMLPrefsManager.Theme.input_color));
+                SpannableString si = Tuils.span(inputFormat, XMLPrefsManager.getColor(Theme.input_color));
 
-                s = TimeManager.replace(si,XMLPrefsManager.getColor(XMLPrefsManager.Theme.time_color));
+                s = TimeManager.replace(si,XMLPrefsManager.getColor(Theme.time_color));
                 s = TextUtils.replace(s,
                         new String[] {FORMAT_INPUT, FORMAT_PREFIX, FORMAT_NEWLINE,
                                 FORMAT_INPUT.toUpperCase(), FORMAT_PREFIX.toUpperCase(), FORMAT_NEWLINE.toUpperCase()},
@@ -410,14 +428,14 @@ public class TerminalManager {
             case CATEGORY_OUTPUT:
                 t = t.toString().trim();
 
-                SpannableString so = Tuils.span(outputFormat, XMLPrefsManager.getColor(XMLPrefsManager.Theme.output_color));
+                SpannableString so = Tuils.span(outputFormat, XMLPrefsManager.getColor(Theme.output_color));
 
                 s = TextUtils.replace(so,
                         new String[] {FORMAT_OUTPUT, FORMAT_NEWLINE, FORMAT_OUTPUT.toUpperCase(), FORMAT_NEWLINE.toUpperCase()},
                         new CharSequence[] {t, Tuils.NEWLINE, t, Tuils.NEWLINE});
 
                 break;
-            case CATEGORY_NOTIFICATION: case CATEGORY_GENERAL:
+            case CATEGORY_NOTIFICATION: case CATEGORY_GENERAL:case CATEGORY_RSS:
                 s = t;
                 break;
             default:
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/ThemesManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/ThemesManager.java
index 409b59d373d176e5a4d90a437ab598cd0c3b3a9a..63f32231e1dc6f2c0ea148b25a3b3f50b945b394 100644
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/ThemesManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/ThemesManager.java
@@ -19,6 +19,7 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import ohi.andre.consolelauncher.R;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
 import ohi.andre.consolelauncher.tuils.Tuils;
 
 /**
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java
deleted file mode 100755
index 2eecd7c8b405a43276d306ccb6edcddeca1b7e52..0000000000000000000000000000000000000000
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java
+++ /dev/null
@@ -1,1416 +0,0 @@
-package ohi.andre.consolelauncher.managers;
-
-import android.content.Context;
-import android.graphics.Color;
-import android.os.Build;
-import android.os.Environment;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.regex.Pattern;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-import ohi.andre.consolelauncher.R;
-import ohi.andre.consolelauncher.tuils.Tuils;
-
-public class XMLPrefsManager {
-
-    public static final String XML_DEFAULT = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
-    public static final String VALUE_ATTRIBUTE = "value";
-
-    private static DocumentBuilderFactory factory;
-    private static DocumentBuilder builder;
-
-    static {
-        factory = DocumentBuilderFactory.newInstance();
-        try {
-            builder = factory.newDocumentBuilder();
-        } catch (ParserConfigurationException e) {}
-    }
-
-    public interface XMLPrefsSave {
-        String defaultValue();
-        String label();
-        XmlPrefsElement parent();
-        boolean is(String s);
-    }
-
-    public enum Theme implements XMLPrefsSave {
-
-        input_color {
-            @Override
-            public String defaultValue() {
-                return "#ff00ff00";
-            }
-        },
-        output_color {
-            @Override
-            public String defaultValue() {
-                return "#ffffffff";
-            }
-        },
-        bg_color {
-            @Override
-            public String defaultValue() {
-                return "#ff000000";
-            }
-        },
-        device_color {
-            @Override
-            public String defaultValue() {
-                return "#ffff9800";
-            }
-        },
-        battery_color_high {
-            @Override
-            public String defaultValue() {
-                return "#4CAF50";
-            }
-        },
-        battery_color_medium {
-            @Override
-            public String defaultValue() {
-                return "#FFEB3B";
-            }
-        },
-        battery_color_low {
-            @Override
-            public String defaultValue() {
-                return "#FF5722";
-            }
-        },
-        time_color {
-            @Override
-            public String defaultValue() {
-                return "#03A9F4";
-            }
-        },
-        storage_color {
-            @Override
-            public String defaultValue() {
-                return "#9C27B0";
-            }
-        },
-        ram_color {
-            @Override
-            public String defaultValue() {
-                return "#fff44336";
-            }
-        },
-        toolbar_bg {
-            @Override
-            public String defaultValue() {
-                return "#00000000";
-            }
-        },
-        toolbar_color {
-            @Override
-            public String defaultValue() {
-                return "#ffff0000";
-            }
-        },
-        enter_color {
-            @Override
-            public String defaultValue() {
-                return "#ffffffff";
-            }
-        },
-        overlay_color {
-            @Override
-            public String defaultValue() {
-                return "#80000000";
-            }
-        },
-        alias_content_color {
-            @Override
-            public String defaultValue() {
-                return "#1DE9B6";
-            }
-        },
-        statusbar_color {
-            @Override
-            public String defaultValue() {
-                return "#000000";
-            }
-        },
-        navigationbar_color {
-            @Override
-            public String defaultValue() {
-                return "#000000";
-            }
-        },
-        app_installed_color {
-            @Override
-            public String defaultValue() {
-                return "#FF7043";
-            }
-        },
-        app_uninstalled_color {
-            @Override
-            public String defaultValue() {
-                return "#FF7043";
-            }
-        },
-        hint_color {
-            @Override
-            public String defaultValue() {
-                return "#4CAF50";
-            }
-        };
-
-        @Override
-        public XmlPrefsElement parent() {
-            return XMLPrefsRoot.THEME;
-        }
-
-        @Override
-        public String label() {
-            return name();
-        }
-
-        @Override
-        public boolean is(String s) {
-            return name().equals(s);
-        }
-    }
-
-    public enum Ui implements XMLPrefsSave {
-
-        show_enter_button {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        system_font {
-            @Override
-            public String defaultValue() {
-                return "false";
-            }
-        },
-        ram_size {
-            @Override
-            public String defaultValue() {
-                return "13";
-            }
-        },
-        battery_size {
-            @Override
-            public String defaultValue() {
-                return "13";
-            }
-        },
-        device_size {
-            @Override
-            public String defaultValue() {
-                return "13";
-            }
-        },
-        time_size {
-            @Override
-            public String defaultValue() {
-                return "13";
-            }
-        },
-        storage_size {
-            @Override
-            public String defaultValue() {
-                return "13";
-            }
-        },
-        input_output_size {
-            @Override
-            public String defaultValue() {
-                return "13";
-            }
-        },
-        input_bottom {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        show_ram {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        show_device_name {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        show_battery {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        show_storage_info {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        enable_battery_status {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        show_time {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        username {
-            @Override
-            public String defaultValue() {
-                return "user";
-            }
-        },
-        deviceName {
-            @Override
-            public String defaultValue() {
-                return Build.DEVICE;
-            }
-        },
-        system_wallpaper {
-            @Override
-            public String defaultValue() {
-                return "false";
-            }
-        },
-        fullscreen {
-            @Override
-            public String defaultValue() {
-                return "false";
-            }
-        },
-        device_index {
-            @Override
-            public String defaultValue() {
-                return "0";
-            }
-        },
-        ram_index {
-            @Override
-            public String defaultValue() {
-                return "1";
-            }
-        },
-        battery_index {
-            @Override
-            public String defaultValue() {
-                return "2";
-            }
-        },
-        time_index {
-            @Override
-            public String defaultValue() {
-                return "3";
-            }
-        },
-        storage_index {
-            @Override
-            public String defaultValue() {
-                return "4";
-            }
-        },
-        input_prefix {
-            @Override
-            public String defaultValue() {
-                return "$";
-            }
-        },
-        input_root_prefix {
-            @Override
-            public String defaultValue() {
-                return "#";
-            }
-        },
-        left_margin_mm {
-            @Override
-            public String defaultValue() {
-                return "0";
-            }
-        },
-        right_margin_mm {
-            @Override
-            public String defaultValue() {
-                return "0";
-            }
-        },
-        top_margin_mm {
-            @Override
-            public String defaultValue() {
-                return "0";
-            }
-        },
-        bottom_margin_mm {
-            @Override
-            public String defaultValue() {
-                return "0";
-            }
-        },
-        ignore_bar_color {
-            @Override
-            public String defaultValue() {
-                return "false";
-            }
-        },
-        show_app_installed {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        show_app_uninstalled {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        show_session_info {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        };
-
-        @Override
-        public XmlPrefsElement parent() {
-            return XMLPrefsRoot.UI;
-        }
-
-        @Override
-        public String label() {
-            return name();
-        }
-
-        @Override
-        public boolean is(String s) {
-            return name().equals(s);
-        }
-    }
-
-    public enum Toolbar implements XMLPrefsSave {
-
-        show_toolbar {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        };
-
-        @Override
-        public XmlPrefsElement parent() {
-            return XMLPrefsRoot.TOOLBAR;
-        }
-
-        @Override
-        public String label() {
-            return name();
-        }
-
-        @Override
-        public boolean is(String s) {
-            return name().equals(s);
-        }
-    }
-
-    public enum Suggestions implements XMLPrefsSave {
-
-        show_suggestions {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        transparent_suggestions {
-            @Override
-            public String defaultValue() {
-                return "false";
-            }
-        },
-        default_text_color {
-            @Override
-            public String defaultValue() {
-                return "#000000";
-            }
-        },
-        default_bg_color {
-            @Override
-            public String defaultValue() {
-                return "#ffffff";
-            }
-        },
-        apps_text_color {
-            @Override
-            public String defaultValue() {
-                return "";
-            }
-        },
-        apps_bg_color {
-            @Override
-            public String defaultValue() {
-                return "#00897B";
-            }
-        },
-        alias_text_color {
-            @Override
-            public String defaultValue() {
-                return "";
-            }
-        },
-        alias_bg_color {
-            @Override
-            public String defaultValue() {
-                return "#FF5722";
-            }
-        },
-        cmd_text_color {
-            @Override
-            public String defaultValue() {
-                return "";
-            }
-        },
-        cmd_bg_color {
-            @Override
-            public String defaultValue() {
-                return "#76FF03";
-            }
-        },
-        song_text_color {
-            @Override
-            public String defaultValue() {
-                return "";
-            }
-        },
-        song_bg_color {
-            @Override
-            public String defaultValue() {
-                return "#EEFF41";
-            }
-        },
-        contact_text_color {
-            @Override
-            public String defaultValue() {
-                return "";
-            }
-        },
-        contact_bg_color {
-            @Override
-            public String defaultValue() {
-                return "#64FFDA";
-            }
-        },
-        file_text_color {
-            @Override
-            public String defaultValue() {
-                return "";
-            }
-        },
-        file_bg_color {
-            @Override
-            public String defaultValue() {
-                return "#03A9F4";
-            }
-        },
-        suggest_alias_default {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        suggest_appgp_default {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        click_to_launch {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        suggestions_size {
-            @Override
-            public String defaultValue() {
-                return "12";
-            }
-        };
-
-        @Override
-        public XmlPrefsElement parent() {
-            return XMLPrefsRoot.SUGGESTIONS;
-        }
-
-        @Override
-        public String label() {
-            return name();
-        }
-
-        @Override
-        public boolean is(String s) {
-            return name().equals(s);
-        }
-    }
-
-    public enum Behavior implements XMLPrefsSave {
-
-        double_tap_lock {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        double_tap_cmd {
-            @Override
-            public String defaultValue() {
-                return "";
-            }
-        },
-        random_play {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        songs_folder {
-            @Override
-            public String defaultValue() {
-                return "";
-            }
-        },
-        songs_from_mediastore {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        tui_notification {
-            @Override
-            public String defaultValue() {
-                return "false";
-            }
-        },
-        auto_show_keyboard {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        auto_scroll {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        show_hints {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        show_alias_content {
-            @Override
-            public String defaultValue() {
-                return "false";
-            }
-        },
-        show_launch_history {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        clear_after_cmds {
-            @Override
-            public String defaultValue() {
-                return "-1";
-            }
-        },
-        clear_after_seconds {
-            @Override
-            public String defaultValue() {
-                return "-1";
-            }
-        },
-        max_lines {
-            @Override
-            public String defaultValue() {
-                return "-1";
-            }
-        },
-        time_format {
-            @Override
-            public String defaultValue() {
-                return "%m/%d/%y %H.%M";
-            }
-        },
-        battery_medium {
-            @Override
-            public String defaultValue() {
-                return "50";
-            }
-        },
-        battery_low {
-            @Override
-            public String defaultValue() {
-                return "15";
-            }
-        },
-        device_format {
-            @Override
-            public String defaultValue() {
-                return "%d: %u";
-            }
-        },
-        ram_format {
-            @Override
-            public String defaultValue() {
-                return "Available RAM: %avgb GB of %totgb GB (%av%%)";
-            }
-        },
-        battery_format {
-            @Override
-            public String defaultValue() {
-                return "%v%";
-            }
-        },
-        storage_format {
-            @Override
-            public String defaultValue() {
-                return "Internal Storage: %iavgb GB / %itotgb GB (%iav%%)";
-            }
-        },
-        input_format {
-            @Override
-            public String defaultValue() {
-                return "[%t] %p %i";
-            }
-        },
-        output_format {
-            @Override
-            public String defaultValue() {
-                return "%o";
-            }
-        },
-        session_info_format {
-            @Override
-            public String defaultValue() {
-                return "%u@%d:%p";
-            }
-        },
-        enable_app_launch {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        app_launch_format {
-            @Override
-            public String defaultValue() {
-                return "--> %a";
-            }
-        },
-        time_format_separator {
-            @Override
-            public String defaultValue() {
-                return "@";
-            }
-        },
-        alias_param_marker {
-            @Override
-            public String defaultValue() {
-                return "%";
-            }
-        },
-        alias_param_separator {
-            @Override
-            public String defaultValue() {
-                return ",";
-            }
-        },
-        multiple_cmd_separator {
-            @Override
-            public String defaultValue() {
-                return ";";
-            }
-        },
-        alias_content_format {
-            @Override
-            public String defaultValue() {
-                return "%a --> [%v]";
-            }
-        },
-        external_storage_path {
-            @Override
-            public String defaultValue() {
-                String path = System.getenv("SECONDARY_STORAGE");
-                if(path == null) return Tuils.EMPTYSTRING;
-
-                File file = new File(path);
-                if(file != null && file.exists()) return file.getAbsolutePath();
-
-                return Tuils.EMPTYSTRING;
-            }
-        },
-        home_path {
-            @Override
-            public String defaultValue() {
-                return Environment.getExternalStorageDirectory().getAbsolutePath();
-            }
-        },
-        app_installed_format {
-            @Override
-            public String defaultValue() {
-                return "App installed: %p";
-            }
-        },
-        app_uninstalled_format {
-            @Override
-            public String defaultValue() {
-                return "App uninstalled: %p";
-            }
-        },
-        enable_music {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        };
-
-        @Override
-        public XmlPrefsElement parent() {
-            return XMLPrefsRoot.BEHAVIOR;
-        }
-
-        @Override
-        public String label() {
-            return name();
-        }
-
-        @Override
-        public boolean is(String s) {
-            return name().equals(s);
-        }
-    }
-
-    public enum Cmd implements XMLPrefsSave {
-
-        default_search {
-            @Override
-            public String defaultValue() {
-                return "-gg";
-            }
-        };
-
-        @Override
-        public XmlPrefsElement parent() {
-            return XMLPrefsRoot.CMD;
-        }
-
-        @Override
-        public String label() {
-            return name();
-        }
-
-        @Override
-        public boolean is(String s) {
-            return name().equals(s);
-        }
-    }
-
-    public enum XMLPrefsRoot implements XmlPrefsElement {
-
-        THEME("theme.xml", Theme.values()) {
-            @Override
-            public String[] deleted() {
-                return new String[0];
-            }
-        },
-        CMD("cmd.xml", Cmd.values()) {
-            @Override
-            public String[] deleted() {
-                return new String[] {"time_format"};
-            }
-        },
-        TOOLBAR("toolbar.xml", Toolbar.values()) {
-            @Override
-            public String[] deleted() {
-                return new String[] {"enabled"};
-            }
-        },
-        UI("ui.xml", Ui.values()) {
-            @Override
-            public String[] deleted() {
-                return new String[] {"show_timestamp_before_cmd", "linux_like", "show_username_ssninfo", "show_ssninfo", "show_path_ssninfo", "show_devicename_ssninfo", "show_alias_suggestions", "transparent_bars"};
-            }
-        },
-        BEHAVIOR("behavior.xml", Behavior.values()) {
-            @Override
-            public String[] deleted() {
-                return new String[] {"double_tap_closes", "donation_message"};
-            }
-        },
-        SUGGESTIONS("suggestions.xml", Suggestions.values()) {
-            @Override
-            public String[] deleted() {
-                return new String[] {"transparent", "enabled"};
-            }
-        };
-
-//        notifications
-//        apps
-//        alias
-
-        public String path;
-        XMLPrefsList values;
-        List<XMLPrefsSave> enums;
-        public List<XMLPrefsSave> copy;
-
-        XMLPrefsRoot(String path, XMLPrefsSave[] en) {
-            this.path = path;
-            this.values = new XMLPrefsList();
-
-            if(en == null) return;
-            this.enums = new ArrayList<>(Arrays.asList(en));
-            this.copy = new ArrayList<>(enums);
-        }
-
-        @Override
-        public void write(XMLPrefsSave save, String value) {
-            set(new File(Tuils.getFolder(), path), name(), save.label(), new String[] {VALUE_ATTRIBUTE}, new String[] {value});
-        }
-
-        public XMLPrefsList getValues() {
-            return values;
-        }
-    }
-
-    public interface XmlPrefsElement {
-        XMLPrefsList getValues();
-        void write(XMLPrefsSave save, String value);
-        String[] deleted();
-    }
-
-    public static class XMLPrefsEntry {
-
-        public String key, value;
-
-        public XMLPrefsEntry(String key, String value) {
-            this.key = key;
-            this.value = value;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if(obj instanceof XMLPrefsEntry) return this == obj;
-            else if(obj instanceof XMLPrefsSave) return this.key.equals(((XMLPrefsSave) obj).label());
-            return obj.equals(key);
-        }
-
-        @Override
-        public String toString() {
-            return key + " --> " + value;
-        }
-    }
-
-    public static class XMLPrefsList {
-
-        public List<XMLPrefsEntry> list = new ArrayList<>();
-
-        public void add(XMLPrefsEntry entry) {
-            list.add(entry);
-        }
-
-        public void add(String key, String value) {
-            list.add(new XMLPrefsEntry(key, value));
-        }
-
-        public XMLPrefsEntry get(Object o) {
-            if(o instanceof Integer) return at((Integer) o);
-
-            for(XMLPrefsEntry e : list) if(e.equals(o)) return e;
-            return null;
-        }
-
-        public XMLPrefsEntry at(int index) {
-            return list.get(index);
-        }
-
-        public int size() {
-            return list.size();
-        }
-
-        public List<String> values() {
-            List<String> vs = new ArrayList<>();
-            for(XMLPrefsEntry entry : list) vs.add(entry.key + "=" + entry.value);
-            return vs;
-        }
-    }
-
-    private XMLPrefsManager() {}
-
-    static boolean called = false;
-    public static void create(Context context) throws Exception {
-        if(called) return;
-        called = true;
-
-        File folder = Tuils.getFolder();
-
-        for(XMLPrefsRoot element : XMLPrefsRoot.values()) {
-            File file = new File(folder, element.path);
-            if(!file.exists()) {
-                resetFile(file, element.name());
-            }
-
-            Object[] o;
-            try {
-                o = buildDocument(file, element.name());
-            } catch (Exception e) {
-                Tuils.sendOutput(Color.RED, context, context.getString(R.string.output_xmlproblem1) + Tuils.SPACE + element.path + context.getString(R.string.output_xmlproblem2) +
-                        Tuils.NEWLINE + context.getString(R.string.output_errorlabel) + e.toString());
-                continue;
-            }
-
-            Document d = (Document) o[0];
-            Element root = (Element) o[1];
-
-            List<XMLPrefsSave> enums = element.enums;
-            if(enums == null) continue;
-
-            String[] deleted = element.deleted();
-            boolean needToWrite = false;
-
-            if(root == null) {
-                resetFile(file, element.name());
-                d = builder.parse(file);
-                root = (Element) d.getElementsByTagName(element.name()).item(0);
-            }
-            NodeList nodes = root.getElementsByTagName("*");
-
-            for(int count = 0; count < nodes.getLength(); count++) {
-                Node node = nodes.item(count);
-
-                String nn = node.getNodeName();
-                element.values.add(nn, node.getAttributes().getNamedItem(VALUE_ATTRIBUTE).getNodeValue());
-
-                for(int en = 0; en < enums.size(); en++) {
-                    if(enums.get(en).label().equals(nn)) {
-                        enums.remove(en);
-                        break;
-                    } 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) {
-                if(needToWrite) writeTo(d, file);
-                continue;
-            }
-
-            for(XMLPrefsSave s : enums) {
-                String value = s.defaultValue();
-
-                Element em = d.createElement(s.label());
-                em.setAttribute(VALUE_ATTRIBUTE, value);
-                root.appendChild(em);
-
-                element.values.add(s.label(), value);
-            }
-
-            writeTo(d, file);
-        }
-    }
-
-    public static Object transform(String s, Class<?> c) throws Exception {
-        if(s == null) throw new UnsupportedOperationException();
-
-        if(c == int.class) return Integer.parseInt(s);
-        if(c == Color.class) return Color.parseColor(s);
-        if(c == boolean.class) return Boolean.parseBoolean(s);
-        if(c == String.class) return s;
-        if(c == File.class) {
-            if(s.length() == 0) return null;
-
-            File file = new File(s);
-            if(!file.exists()) throw new UnsupportedOperationException();
-
-            return file;
-        }
-
-        return Tuils.getDefaultValue(c);
-    }
-
-    static final Pattern p1 = Pattern.compile(">");
-//    static final Pattern p2 = Pattern.compile("</");
-    static final Pattern p3 = Pattern.compile("\n\n");
-    static final String p1s = ">" + Tuils.NEWLINE;
-//    static final String p2s = "\n</";
-    static final String p3s = Tuils.NEWLINE;
-
-    public static String fixNewlines(String s) {
-        s = p1.matcher(s).replaceAll(p1s);
-//        s = p2.matcher(s).replaceAll(p2s);
-        s = p3.matcher(s).replaceAll(p3s);
-        return s;
-    }
-
-//    [0] = document
-//    [1] = root
-    public static Object[] buildDocument(File file, String root) throws Exception {
-        Document d = builder.parse(file);
-        Element r = (Element) d.getElementsByTagName(root).item(0);
-
-        return new Object[] {d, r};
-    }
-
-    public static void writeTo(Document d, File f) {
-        try {
-            TransformerFactory transformerFactory = TransformerFactory.newInstance();
-            Transformer transformer = transformerFactory.newTransformer();
-
-            DOMSource source = new DOMSource(d);
-            StringWriter writer = new StringWriter();
-            StreamResult result = new StreamResult(writer);
-            transformer.transform(source, result);
-
-            String s = fixNewlines(writer.toString());
-
-            FileOutputStream stream = new FileOutputStream(f);
-            stream.write(s.getBytes());
-
-            stream.flush();
-            stream.close();
-        } catch (Exception e) {}
-    }
-
-    public static String add(File file, String rootName, String elementName, String[] attributeNames, String[] attributeValues) {
-        try {
-            Object[] o;
-            try {
-                o = buildDocument(file, rootName);
-            } catch (Exception e) {
-                return e.toString();
-            }
-
-            Document d = (Document) o[0];
-            Element root = (Element) o[1];
-
-            Element element = d.createElement(elementName);
-            for(int c = 0; c < attributeNames.length; c++) {
-                if(attributeValues[c] == null) continue;
-                element.setAttribute(attributeNames[c], attributeValues[c]);
-            }
-            root.appendChild(element);
-
-            writeTo(d, file);
-        } catch (Exception e) {
-            return e.toString();
-        }
-        return null;
-    }
-
-    public static String set(File file, String rootName, String elementName, String[] attributeNames, String[] attributeValues) {
-        String[][] values = new String[1][attributeValues.length];
-        values[0] = attributeValues;
-
-        return setMany(file, rootName, new String[] {elementName}, attributeNames, values);
-    }
-
-    public static String setMany(File file, String rootName, String elementNames[], String[] attributeNames, String[][] attributeValues) {
-        try {
-            Object[] o;
-            try {
-                o = buildDocument(file, rootName);
-            } catch (Exception e) {
-                return e.toString();
-            }
-
-            Document d = (Document) o[0];
-            Element root = (Element) o[1];
-
-            NodeList nodes = root.getElementsByTagName("*");
-
-            for(int count = 0; count < nodes.getLength(); count++) {
-                Node node = nodes.item(count);
-
-                int index = Tuils.find(node.getNodeName(), elementNames);
-                if(index != -1) {
-                    Element e = (Element) node;
-
-                    for(int c = 0; c < attributeNames.length; c++) {
-                        if(attributeValues[index][c] == null) continue;
-                        e.setAttribute(attributeNames[c], attributeValues[index][c]);
-                    }
-
-                    writeTo(d, file);
-                    return null;
-                }
-            }
-
-//            it wasn't found
-            for(int count = 0; count < elementNames.length; count++) {
-                Element element = d.createElement(elementNames[count]);
-                for(int c = 0; c < attributeNames.length; c++) {
-                    if(attributeValues[count][c] == null) continue;
-                    element.setAttribute(attributeNames[c], attributeValues[count][c]);
-                }
-                root.appendChild(element);
-            }
-
-            writeTo(d, file);
-        } catch (Exception e) {
-            Tuils.log(e);
-            Tuils.toFile(e);
-            return e.toString();
-        }
-        return null;
-    }
-
-    public static String removeNode(File file, String rootName, String nodeName) {
-        try {
-            Object[] o;
-            try {
-                o = buildDocument(file, rootName);
-            } catch (Exception e) {
-                return e.toString();
-            }
-
-            Document d = (Document) o[0];
-            Element root = (Element) o[1];
-
-            Node node = findNode(root, nodeName);
-
-            if(node == null) return Tuils.EMPTYSTRING;
-
-            root.removeChild(node);
-            writeTo(d, file);
-            return null;
-        } catch (Exception e) {
-            return e.toString();
-        }
-    }
-
-    public static Node findNode(File file, String rootName, String nodeName) {
-        try {
-            Object[] o;
-            try {
-                o = buildDocument(file, rootName);
-            } catch (Exception e) {
-                return null;
-            }
-
-            Element root = (Element) o[1];
-
-            findNode(root, nodeName);
-        } catch (Exception e) {
-            return null;
-        }
-
-        return null;
-    }
-
-    public static Node findNode(Element root, String nodeName) {
-        NodeList nodes = root.getElementsByTagName("*");
-
-        for(int count = 0; count < nodes.getLength(); count++) {
-            Node node = nodes.item(count);
-
-            if(node.getNodeName().equalsIgnoreCase(nodeName)) {
-                return node;
-            }
-        }
-
-        return null;
-    }
-
-    public static String[] getAttrValues(File file, String rootName, String nodeName, String[] attrNames) {
-        try {
-            Object[] o;
-            try {
-                o = buildDocument(file, rootName);
-            } catch (Exception e) {
-                return null;
-            }
-
-            Element root = (Element) o[1];
-
-            NodeList nodes = root.getElementsByTagName("*");
-
-            for(int count = 0; count < nodes.getLength(); count++) {
-                Node node = nodes.item(count);
-
-                if(node.getNodeName().equals(nodeName)) {
-                    Element e = (Element) node;
-
-                    String[] values = new String[attrNames.length];
-                    for(int c = 0; c < attrNames.length; c++) values[count] = e.getAttribute(attrNames[c]);
-
-                    return values;
-                }
-            }
-        } catch (Exception e) {}
-
-        return null;
-    }
-
-    public static <T> T get(Class<T> c, XMLPrefsManager.XMLPrefsSave prefsSave) {
-        if(prefsSave != null) {
-            try {
-                return (T) transform(prefsSave.parent().getValues().get(prefsSave).value, c);
-            } catch (Exception e) {
-
-                try {
-                    return (T) transform(prefsSave.defaultValue(), c);
-                } catch (Exception e1) {
-                    return Tuils.getDefaultValue(c);
-                }
-            }
-        }
-
-//        this won't ever happen, I think
-        return null;
-    }
-
-    public static String get(XMLPrefsManager.XMLPrefsSave prefsSave) {
-        return get(String.class, prefsSave);
-    }
-
-    public static int getColor(XMLPrefsManager.XMLPrefsSave prefsSave) {
-        try {
-            return (int) transform(prefsSave.parent().getValues().get(prefsSave).value, Color.class);
-        } catch (Exception e) {
-            String def = prefsSave.defaultValue();
-            if(def == null || def.length() == 0) {
-                return Integer.MAX_VALUE;
-            }
-
-            try {
-                return (int) transform(def, Color.class);
-            } catch (Exception e1) {
-                return Integer.MAX_VALUE;
-            }
-        }
-    }
-
-    public static boolean resetFile(File f, String name) {
-        try {
-            FileOutputStream stream = new FileOutputStream(f);
-            stream.write(XML_DEFAULT.getBytes());
-            stream.write(("<" + name + ">\n").getBytes());
-            stream.write(("</" + name + ">\n").getBytes());
-            stream.flush();
-            stream.close();
-            return true;
-        } catch (Exception e) {
-            return false;
-        }
-    }
-
-//    private static HashMap<XMLPrefsSave, String> getOld(BufferedReader reader) {
-//        HashMap<XMLPrefsSave, String> map = new HashMap<>();
-//
-//        String line;
-//        try {
-//            while((line = reader.readLine()) != null) {
-//                String[] split = line.split("=");
-//                if(split.length != 2) continue;
-//
-//                String name = split[0].trim();
-//                String value = split[1];
-//
-//                XMLPrefsSave s = getCorresponding(name);
-//                if(s == null) continue;
-//
-//                map.put(s, value);
-//            }
-//        } catch (IOException e) {
-//            return null;
-//        }
-//
-//        return map;
-//    }
-
-//    static final SimpleMutableEntry[] OLD = {
-//            new SimpleMutableEntry("deviceColor", Theme.device_color),
-//            new SimpleMutableEntry("inputColor", Theme.input_color),
-//            new SimpleMutableEntry("outputColor", Theme.output_color),
-//            new SimpleMutableEntry("backgroundColor", Theme.bg_color),
-//            new SimpleMutableEntry("useSystemFont", Ui.system_font),
-//            new SimpleMutableEntry("fontSize", Ui.font_size),
-//            new SimpleMutableEntry("ramColor", Theme.ram_color),
-//            new SimpleMutableEntry("inputFieldBottom", Ui.input_bottom),
-//            new SimpleMutableEntry("username", Ui.username),
-//            new SimpleMutableEntry("showSubmit", Ui.show_enter_button),
-//            new SimpleMutableEntry("deviceName", Ui.deviceName),
-//            new SimpleMutableEntry("showRam", Ui.show_ram),
-//            new SimpleMutableEntry("showDevice", Ui.show_device_name),
-//            new SimpleMutableEntry("showToolbar", Toolbar.show_toolbar),
-//
-//            new SimpleMutableEntry("suggestionTextColor", Suggestions.default_text_color),
-//            new SimpleMutableEntry("transparentSuggestions", Suggestions.transparent),
-//            new SimpleMutableEntry("aliasSuggestionBg", Suggestions.alias_bg_color),
-//            new SimpleMutableEntry("appSuggestionBg", Suggestions.apps_bg_color),
-//            new SimpleMutableEntry("commandSuggestionsBg", Suggestions.cmd_bg_color),
-//            new SimpleMutableEntry("songSuggestionBg", Suggestions.song_bg_color),
-//            new SimpleMutableEntry("contactSuggestionBg", Suggestions.contact_bg_color),
-//            new SimpleMutableEntry("fileSuggestionBg", Suggestions.file_bg_color),
-//            new SimpleMutableEntry("defaultSuggestionBg", Suggestions.default_bg_color),
-//
-//            new SimpleMutableEntry("useSystemWallpaper", Ui.system_wallpaper),
-//            new SimpleMutableEntry("fullscreen", Ui.fullscreen),
-//            new SimpleMutableEntry("keepAliveWithNotification", Behavior.tui_notification),
-//            new SimpleMutableEntry("openKeyboardOnStart", Behavior.auto_show_keyboard),
-//
-//            new SimpleMutableEntry("fromMediastore", Behavior.songs_from_mediastore),
-//            new SimpleMutableEntry("playRandom", Behavior.random_play),
-//            new SimpleMutableEntry("songsFolder", Behavior.songs_folder),
-//
-//            new SimpleMutableEntry("closeOnDbTap", Behavior.double_tap_closes),
-//            new SimpleMutableEntry("showSuggestions", Suggestions.show_suggestions),
-//            new SimpleMutableEntry("showDonationMessage", Behavior.donation_message),
-//            new SimpleMutableEntry("showAliasValue", Behavior.show_alias_content),
-//            new SimpleMutableEntry("showAppsHistory", Behavior.show_launch_history),
-//
-//            new SimpleMutableEntry("defaultSearch", Cmd.default_search)
-//    };
-//
-//    private static XMLPrefsSave getCorresponding(String old) {
-//        for(SimpleMutableEntry<String, XMLPrefsSave> s : OLD) {
-//            if(old.equals(s.getKey())) return s.getValue();
-//        }
-//        return null;
-//    }
-}
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicManager2.java b/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicManager2.java
index fc26322110029d095a0b262d8a8fa0d20bc5b85a..ff934720036a95ac5aae66ce7baf43f00f621378 100644
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicManager2.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicManager2.java
@@ -16,7 +16,8 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
-import ohi.andre.consolelauncher.managers.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.options.Behavior;
 import ohi.andre.consolelauncher.tuils.Tuils;
 
 /**
@@ -152,7 +153,7 @@ public class MusicManager2 implements MediaController.MediaPlayerControl {
                     if(songs == null) songs = new ArrayList<>();
                     else songs.clear();
 
-                    if(XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.songs_from_mediastore)) {
+                    if(XMLPrefsManager.getBoolean(Behavior.songs_from_mediastore)) {
                         ContentResolver musicResolver = mContext.getContentResolver();
                         Uri musicUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                         Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);
@@ -168,7 +169,7 @@ public class MusicManager2 implements MediaController.MediaPlayerControl {
                         }
                         musicCursor.close();
                     } else {
-                        String path = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.songs_folder);
+                        String path = XMLPrefsManager.get(Behavior.songs_folder);
                         if(path.length() > 0) {
                             File dir = new File(path);
                             if(dir.isDirectory()) songs.addAll(Tuils.getSongsInFolder(dir));
@@ -192,7 +193,7 @@ public class MusicManager2 implements MediaController.MediaPlayerControl {
         public void onServiceConnected(ComponentName name, IBinder service) {
             MusicService.MusicBinder binder = (MusicService.MusicBinder)service;
             musicSrv = binder.getService();
-            musicSrv.setShuffle(XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.random_play));
+            musicSrv.setShuffle(XMLPrefsManager.getBoolean(Behavior.random_play));
 
             if(songs == null || loader.isAlive()) {
                 synchronized (songs) {
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicService.java b/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicService.java
index e5769a61b207a7af3eff12c905f86592f6f1ae12..9c9eefbb33e98150911202239ff966d5e9e20626 100644
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicService.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicService.java
@@ -31,8 +31,6 @@ public class MusicService extends Service implements
 
     public static final int NOTIFY_ID=100001;
 
-    public static final String SONGTITLE_KEY = "songTitle";
-
     private MediaPlayer player;
     private List<Song> songs;
     private int songPosn;
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 80bda6240f7c591c75e1e06de9d9bda750509149..7d09624178dc3f74e030163089592d7fd1c21191 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
@@ -12,9 +12,6 @@ import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
 import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -22,14 +19,15 @@ import java.util.List;
 import java.util.regex.Pattern;
 
 import ohi.andre.consolelauncher.R;
-import ohi.andre.consolelauncher.managers.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.options.Notifications;
 import ohi.andre.consolelauncher.tuils.Tuils;
 
-import static ohi.andre.consolelauncher.managers.XMLPrefsManager.VALUE_ATTRIBUTE;
-import static ohi.andre.consolelauncher.managers.XMLPrefsManager.resetFile;
-import static ohi.andre.consolelauncher.managers.XMLPrefsManager.set;
-import static ohi.andre.consolelauncher.managers.XMLPrefsManager.setMany;
-import static ohi.andre.consolelauncher.managers.XMLPrefsManager.writeTo;
+import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.VALUE_ATTRIBUTE;
+import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.resetFile;
+import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.set;
+import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.setMany;
+import static ohi.andre.consolelauncher.managers.xml.XMLPrefsManager.writeTo;
 
 /**
  * Created by francescoandreuzzi on 29/04/2017.
@@ -53,54 +51,11 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement {
     public static final String PATH = "notifications.xml";
     private static final String NAME = "NOTIFICATIONS";
 
-    private static XMLPrefsManager.XmlPrefsElement instance = null;
+    public static XMLPrefsManager.XmlPrefsElement instance = null;
 
     public static boolean default_app_state;
     public static String default_color;
 
-    public enum Options implements XMLPrefsManager.XMLPrefsSave {
-
-        show_notifications {
-            @Override
-            public String defaultValue() {
-                return "false";
-            }
-        },
-        app_notification_enabled_default {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        default_notification_color {
-            @Override
-            public String defaultValue() {
-                return "#00FF00";
-            }
-        },
-        notification_format {
-            @Override
-            public String defaultValue() {
-                return "[%t] %pkg: %ttl --- %txt";
-            }
-        };
-
-        @Override
-        public XMLPrefsManager.XmlPrefsElement parent() {
-            return instance;
-        }
-
-        @Override
-        public String label() {
-            return name();
-        }
-
-        @Override
-        public boolean is(String s) {
-            return name().equals(s);
-        }
-    }
-
     @Override
     public String[] deleted() {
         return new String[] {"enabled", "default_color", "default_app_state"};
@@ -120,17 +75,14 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement {
     private static List<NotificatedApp> apps;
     private static List<FilterGroup> groups;
     private static SparseArray<List<String>> applies;
-    private static boolean created = false;
 
     private NotificationManager() {}
 
     public static void create(Context context) {
 
-        if(created) {
+        if(instance != null) {
             return;
         }
-        created = true;
-
         instance = new NotificationManager();
 
         apps = new ArrayList<>();
@@ -156,7 +108,7 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement {
             Document d = (Document) o[0];
             Element root = (Element) o[1];
 
-            List<Options> enums = new ArrayList<>(Arrays.asList(Options.values()));
+            List<Notifications> enums = new ArrayList<>(Arrays.asList(Notifications.values()));
             NodeList nodes = root.getElementsByTagName("*");
 
             String[] deleted = instance.deleted();
@@ -278,8 +230,8 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement {
             Tuils.toFile(e);
         }
 
-        default_app_state = XMLPrefsManager.get(boolean.class, Options.app_notification_enabled_default);
-        default_color = XMLPrefsManager.get(String.class, Options.default_notification_color);
+        default_app_state = XMLPrefsManager.getBoolean(Notifications.app_notification_enabled_default);
+        default_color = XMLPrefsManager.get(Notifications.default_notification_color);
 
         Out:
         for(int count = 0; count < applies.size(); count++) {
@@ -314,14 +266,10 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement {
 
     public static String getFormat() {
         try {
-            return values.get(Options.notification_format).value;
+            return values.get(Notifications.notification_format).value;
         } catch (Exception e) {
-
-            try {
-                e.printStackTrace(new PrintStream(new FileOutputStream(new File(Tuils.getFolder(), "crash.txt"), true)));
-            } catch (FileNotFoundException e1) {}
-
-            return Options.notification_format.defaultValue();
+            Tuils.toFile(e);
+            return Notifications.notification_format.defaultValue();
         }
     }
 
@@ -356,6 +304,7 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement {
         int index = Tuils.find(pkg, apps);
         if(index == -1) return null;
         return apps.get(index);
+
     }
 
     public static class NotificatedApp {
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 d36b2958b2b327d9a15ef016b3c3c07566f48f6c..ec316badba7590aef3d6740bf9d08b1004f1887e 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
@@ -26,7 +26,9 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import ohi.andre.consolelauncher.managers.TerminalManager;
-import ohi.andre.consolelauncher.managers.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.options.Notifications;
+import ohi.andre.consolelauncher.managers.xml.options.Theme;
 import ohi.andre.consolelauncher.tuils.TimeManager;
 import ohi.andre.consolelauncher.tuils.Tuils;
 
@@ -50,8 +52,8 @@ public class NotificationService extends NotificationListenerService {
 
         manager = getPackageManager();
         format = NotificationManager.getFormat();
-        enabled = XMLPrefsManager.get(boolean.class, NotificationManager.Options.show_notifications) ||
-                XMLPrefsManager.get(String.class, NotificationManager.Options.show_notifications).equalsIgnoreCase("enabled");
+        enabled = XMLPrefsManager.getBoolean(Notifications.show_notifications) ||
+                XMLPrefsManager.get(Notifications.show_notifications).equalsIgnoreCase("enabled");
 
         if(NotificationManager.apps() == 0) {
             NotificationManager.notificationsChangeFor(new ArrayList<>(Arrays.asList(
@@ -86,9 +88,9 @@ public class NotificationService extends NotificationListenerService {
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
         if(intent != null) {
-            timeColor = intent.getIntExtra(XMLPrefsManager.Theme.time_color.label(), Color.parseColor(XMLPrefsManager.Theme.time_color.defaultValue()));
+            timeColor = intent.getIntExtra(Theme.time_color.label(), Color.parseColor(Theme.time_color.defaultValue()));
         } else {
-            timeColor = Color.parseColor(XMLPrefsManager.Theme.time_color.defaultValue());
+            timeColor = Color.parseColor(Theme.time_color.defaultValue());
         }
 
         return START_STICKY;
@@ -97,6 +99,7 @@ public class NotificationService extends NotificationListenerService {
     @Override
     public void onDestroy() {
         super.onDestroy();
+        handler.removeCallbacksAndMessages(null);
     }
 
     String format;
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/suggestions/SuggestionRunnable.java b/app/src/main/java/ohi/andre/consolelauncher/managers/suggestions/SuggestionRunnable.java
index 3efc0a5a9978f5f08ef5ee111d9467fbb7b2ed0c..a57965d414dba5b43d3d570fd37e96e0e01fc7bf 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/suggestions/SuggestionRunnable.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/suggestions/SuggestionRunnable.java
@@ -26,7 +26,8 @@ import android.widget.TextView;
 
 import ohi.andre.consolelauncher.R;
 import ohi.andre.consolelauncher.managers.AppsManager;
-import ohi.andre.consolelauncher.managers.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.options.Suggestions;
 
 public class SuggestionRunnable implements Runnable {
 
@@ -206,15 +207,15 @@ public class SuggestionRunnable implements Runnable {
         if(!bgLoad) {
             bgLoad = true;
 
-            transparentSuggestions = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Suggestions.transparent_suggestions);
+            transparentSuggestions = XMLPrefsManager.getBoolean(Suggestions.transparent_suggestions);
             if(!transparentSuggestions) {
-                suggAppBg = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.apps_bg_color);
-                suggAliasBg = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.alias_bg_color);
-                suggCmdBg = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.cmd_bg_color);
-                suggContactBg = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.contact_bg_color);
-                suggFileBg = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.file_bg_color);
-                suggSongBg = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.song_bg_color);
-                suggDefaultBg = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.default_bg_color);
+                suggAppBg = XMLPrefsManager.getColor(Suggestions.apps_bg_color);
+                suggAliasBg = XMLPrefsManager.getColor(Suggestions.alias_bg_color);
+                suggCmdBg = XMLPrefsManager.getColor(Suggestions.cmd_bg_color);
+                suggContactBg = XMLPrefsManager.getColor(Suggestions.contact_bg_color);
+                suggFileBg = XMLPrefsManager.getColor(Suggestions.file_bg_color);
+                suggSongBg = XMLPrefsManager.getColor(Suggestions.song_bg_color);
+                suggDefaultBg = XMLPrefsManager.getColor(Suggestions.default_bg_color);
             }
         }
 
@@ -244,13 +245,13 @@ public class SuggestionRunnable implements Runnable {
         if(!textLoad) {
             textLoad = true;
 
-            suggAppText = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.apps_text_color);
-            suggAliasText = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.alias_text_color);
-            suggCmdText = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.cmd_text_color);
-            suggContactText = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.contact_text_color);
-            suggDefaultText = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.default_text_color);
-            suggFileText = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.file_text_color);
-            suggSongText = XMLPrefsManager.getColor(XMLPrefsManager.Suggestions.song_text_color);
+            suggAppText = XMLPrefsManager.getColor(Suggestions.apps_text_color);
+            suggAliasText = XMLPrefsManager.getColor(Suggestions.alias_text_color);
+            suggCmdText = XMLPrefsManager.getColor(Suggestions.cmd_text_color);
+            suggContactText = XMLPrefsManager.getColor(Suggestions.contact_text_color);
+            suggDefaultText = XMLPrefsManager.getColor(Suggestions.default_text_color);
+            suggFileText = XMLPrefsManager.getColor(Suggestions.file_text_color);
+            suggSongText = XMLPrefsManager.getColor(Suggestions.song_text_color);
         }
 
         int chosen;
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 c332d0ab604e0e649481ace9240235734aedf8a9..6729e7ad095d4642ed189b6de244a42c032c6eba 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
@@ -17,9 +17,12 @@ import ohi.andre.consolelauncher.managers.AliasManager;
 import ohi.andre.consolelauncher.managers.AppsManager;
 import ohi.andre.consolelauncher.managers.ContactManager;
 import ohi.andre.consolelauncher.managers.FileManager;
-import ohi.andre.consolelauncher.managers.XMLPrefsManager;
 import ohi.andre.consolelauncher.managers.music.Song;
 import ohi.andre.consolelauncher.managers.notifications.NotificationManager;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.options.Apps;
+import ohi.andre.consolelauncher.managers.xml.options.Notifications;
+import ohi.andre.consolelauncher.managers.xml.options.Suggestions;
 import ohi.andre.consolelauncher.tuils.Compare;
 import ohi.andre.consolelauncher.tuils.SimpleMutableEntry;
 import ohi.andre.consolelauncher.tuils.Tuils;
@@ -44,10 +47,10 @@ public class SuggestionsManager {
     public Suggestion[] getSuggestions(MainPack info, String before, String lastWord) {
 
         if(!set) {
-            showAliasDefault = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Suggestions.suggest_alias_default);
-            showAppsGpDefault = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Suggestions.suggest_appgp_default);
+            showAliasDefault = XMLPrefsManager.getBoolean(Suggestions.suggest_alias_default);
+            showAppsGpDefault = XMLPrefsManager.getBoolean(Suggestions.suggest_appgp_default);
             set = true;
-            clickToLaunch = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Suggestions.click_to_launch);
+            clickToLaunch = XMLPrefsManager.getBoolean(Suggestions.click_to_launch);
         }
 
         List<Suggestion> suggestionList = new ArrayList<>();
@@ -93,7 +96,8 @@ public class SuggestionsManager {
                         suggestPermanentSuggestions(suggestionList, (PermanentSuggestionCommand) cmd.cmd);
                     }
 
-                    if (cmd.mArgs != null && cmd.mArgs.length > 0 && cmd.cmd instanceof ParamCommand && cmd.nArgs >= 1 && ((Param) cmd.mArgs[0]).args().length + 1 == cmd.nArgs) {
+                    if (cmd.mArgs != null && cmd.mArgs.length > 0 && cmd.cmd instanceof ParamCommand && cmd.nArgs >= 1 && cmd.mArgs[0] instanceof Param &&
+                            ((Param) cmd.mArgs[0]).args().length + 1 == cmd.nArgs) {
                         return new Suggestion[0];
                     }
 
@@ -104,7 +108,7 @@ public class SuggestionsManager {
 //                        suggestArgs(info, cmd.cmd instanceof ParamCommand ? ((ParamCommand) cmd.cmd).argsForParam((String) cmd.mArgs[0])[cmd.nArgs - 1] : cmd.cmd.argType()[cmd.nArgs], suggestionList, lastWord, before);
 //                    }
 
-                    if(cmd.cmd instanceof ParamCommand && (cmd.mArgs == null || cmd.mArgs.length == 0)) {
+                    if(cmd.cmd instanceof ParamCommand && (cmd.mArgs == null || cmd.mArgs.length == 0 || cmd.mArgs[0] instanceof String)) {
                         suggestParams(info, suggestionList, (ParamCommand) cmd.cmd, before, null);
                     }
                     else suggestArgs(info, cmd.nextArg(), suggestionList, before);
@@ -152,7 +156,7 @@ public class SuggestionsManager {
 //                        lastWord = before.substring(index) + lastWord;
 //                    }
 
-                    if(cmd.cmd instanceof ParamCommand && (cmd.mArgs == null || cmd.mArgs.length == 0)) {
+                    if(cmd.cmd instanceof ParamCommand && (cmd.mArgs == null || cmd.mArgs.length == 0 || cmd.mArgs[0] instanceof String)) {
                         suggestParams(info, suggestionList, (ParamCommand) cmd.cmd, before, lastWord);
                     } else suggestArgs(info, cmd.nextArg(), suggestionList, lastWord, before);
                 } else {
@@ -516,8 +520,8 @@ public class SuggestionsManager {
 
             for(XMLPrefsManager.XMLPrefsRoot element : XMLPrefsManager.XMLPrefsRoot.values()) xmlPrefsEntrys.addAll(element.copy);
 
-            Collections.addAll(xmlPrefsEntrys, AppsManager.Options.values());
-            Collections.addAll(xmlPrefsEntrys, NotificationManager.Options.values());
+            Collections.addAll(xmlPrefsEntrys, Apps.values());
+            Collections.addAll(xmlPrefsEntrys, Notifications.values());
         }
 
         if(prev == null || prev.length() == 0) {
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/xml/XMLPrefsManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/XMLPrefsManager.java
new file mode 100755
index 0000000000000000000000000000000000000000..c493900369f1581d5a8dc5874f733fb260b5ea38
--- /dev/null
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/XMLPrefsManager.java
@@ -0,0 +1,693 @@
+package ohi.andre.consolelauncher.managers.xml;
+
+import android.content.Context;
+import android.graphics.Color;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import ohi.andre.consolelauncher.R;
+import ohi.andre.consolelauncher.managers.xml.options.*;
+import ohi.andre.consolelauncher.tuils.Tuils;
+
+public class XMLPrefsManager {
+
+    public static final String XML_DEFAULT = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+    public static final String VALUE_ATTRIBUTE = "value";
+
+    private static DocumentBuilderFactory factory;
+    private static DocumentBuilder builder;
+
+    static {
+        factory = DocumentBuilderFactory.newInstance();
+        try {
+            builder = factory.newDocumentBuilder();
+        } catch (ParserConfigurationException e) {}
+    }
+
+    public interface XMLPrefsSave {
+        String defaultValue();
+        String label();
+        XmlPrefsElement parent();
+        boolean is(String s);
+    }
+
+    public enum XMLPrefsRoot implements XmlPrefsElement {
+
+        THEME("theme.xml", Theme.values()) {
+            @Override
+            public String[] deleted() {
+                return new String[0];
+            }
+        },
+        CMD("cmd.xml", Cmd.values()) {
+            @Override
+            public String[] deleted() {
+                return new String[] {"time_format"};
+            }
+        },
+        TOOLBAR("toolbar.xml", Toolbar.values()) {
+            @Override
+            public String[] deleted() {
+                return new String[] {"enabled"};
+            }
+        },
+        UI("ui.xml", Ui.values()) {
+            @Override
+            public String[] deleted() {
+                return new String[] {"show_timestamp_before_cmd", "linux_like", "show_username_ssninfo", "show_ssninfo", "show_path_ssninfo", "show_devicename_ssninfo", "show_alias_suggestions", "transparent_bars"};
+            }
+        },
+        BEHAVIOR("behavior.xml", Behavior.values()) {
+            @Override
+            public String[] deleted() {
+                return new String[] {"double_tap_closes", "donation_message"};
+            }
+        },
+        SUGGESTIONS("suggestions.xml", Suggestions.values()) {
+            @Override
+            public String[] deleted() {
+                return new String[] {"transparent", "enabled"};
+            }
+        };
+
+//        notifications
+//        apps
+//        alias
+
+        public String path;
+        XMLPrefsList values;
+        List<XMLPrefsSave> enums;
+        public List<XMLPrefsSave> copy;
+
+        XMLPrefsRoot(String path, XMLPrefsSave[] en) {
+            this.path = path;
+            this.values = new XMLPrefsList();
+
+            if(en == null) return;
+            this.enums = new ArrayList<>(Arrays.asList(en));
+            this.copy = new ArrayList<>(enums);
+        }
+
+        @Override
+        public void write(XMLPrefsSave save, String value) {
+            set(new File(Tuils.getFolder(), path), name(), save.label(), new String[] {VALUE_ATTRIBUTE}, new String[] {value});
+        }
+
+        public XMLPrefsList getValues() {
+            return values;
+        }
+    }
+
+    public interface XmlPrefsElement {
+        XMLPrefsList getValues();
+        void write(XMLPrefsSave save, String value);
+        String[] deleted();
+    }
+
+    public static class XMLPrefsEntry {
+
+        public String key, value;
+
+        public XMLPrefsEntry(String key, String value) {
+            this.key = key;
+            this.value = value;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if(obj instanceof XMLPrefsEntry) return this == obj;
+            else if(obj instanceof XMLPrefsSave) return this.key.equals(((XMLPrefsSave) obj).label());
+            return obj.equals(key);
+        }
+
+        @Override
+        public String toString() {
+            return key + " --> " + value;
+        }
+    }
+
+    public static class XMLPrefsList {
+
+        public List<XMLPrefsEntry> list = new ArrayList<>();
+
+        public void add(XMLPrefsEntry entry) {
+            list.add(entry);
+        }
+
+        public void add(String key, String value) {
+            list.add(new XMLPrefsEntry(key, value));
+        }
+
+        public XMLPrefsEntry get(Object o) {
+            if(o instanceof Integer) return at((Integer) o);
+
+            for(XMLPrefsEntry e : list) if(e.equals(o)) return e;
+            return null;
+        }
+
+        public XMLPrefsEntry at(int index) {
+            return list.get(index);
+        }
+
+        public int size() {
+            return list.size();
+        }
+
+        public List<String> values() {
+            List<String> vs = new ArrayList<>();
+            for(XMLPrefsEntry entry : list) vs.add(entry.key + "=" + entry.value);
+            return vs;
+        }
+    }
+
+    private XMLPrefsManager() {}
+
+    static boolean called = false;
+    public static void create(Context context) throws Exception {
+        if(called) return;
+        called = true;
+
+        File folder = Tuils.getFolder();
+
+        for(XMLPrefsRoot element : XMLPrefsRoot.values()) {
+            File file = new File(folder, element.path);
+            if(!file.exists()) {
+                resetFile(file, element.name());
+            }
+
+            Object[] o;
+            try {
+                o = buildDocument(file, element.name());
+            } catch (Exception e) {
+                Tuils.sendOutput(Color.RED, context, context.getString(R.string.output_xmlproblem1) + Tuils.SPACE + element.path + context.getString(R.string.output_xmlproblem2) +
+                        Tuils.NEWLINE + context.getString(R.string.output_errorlabel) + e.toString());
+                continue;
+            }
+
+            Document d = (Document) o[0];
+            Element root = (Element) o[1];
+
+            List<XMLPrefsSave> enums = element.enums;
+            if(enums == null) continue;
+
+            String[] deleted = element.deleted();
+            boolean needToWrite = false;
+
+            if(root == null) {
+                resetFile(file, element.name());
+                d = builder.parse(file);
+                root = (Element) d.getElementsByTagName(element.name()).item(0);
+            }
+            NodeList nodes = root.getElementsByTagName("*");
+
+            for(int count = 0; count < nodes.getLength(); count++) {
+                Node node = nodes.item(count);
+
+                String nn = node.getNodeName();
+                element.values.add(nn, node.getAttributes().getNamedItem(VALUE_ATTRIBUTE).getNodeValue());
+
+                for(int en = 0; en < enums.size(); en++) {
+                    if(enums.get(en).label().equals(nn)) {
+                        enums.remove(en);
+                        break;
+                    } 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) {
+                if(needToWrite) writeTo(d, file);
+                continue;
+            }
+
+            for(XMLPrefsSave s : enums) {
+                String value = s.defaultValue();
+
+                Element em = d.createElement(s.label());
+                em.setAttribute(VALUE_ATTRIBUTE, value);
+                root.appendChild(em);
+
+                element.values.add(s.label(), value);
+            }
+
+            writeTo(d, file);
+        }
+    }
+
+    public static Object transform(String s, Class<?> c) throws Exception {
+        if(s == null) throw new UnsupportedOperationException();
+
+        if(c == int.class) return Integer.parseInt(s);
+        if(c == Color.class) return Color.parseColor(s);
+        if(c == boolean.class) return Boolean.parseBoolean(s);
+        if(c == String.class) return s;
+        if(c == float.class) return Float.parseFloat(s);
+        if(c == double.class) return Double.parseDouble(s);
+        if(c == File.class) {
+            if(s.length() == 0) return null;
+
+            File file = new File(s);
+            if(!file.exists()) throw new UnsupportedOperationException();
+
+            return file;
+        }
+
+        return Tuils.getDefaultValue(c);
+    }
+
+    static final Pattern p1 = Pattern.compile(">");
+//    static final Pattern p2 = Pattern.compile("</");
+    static final Pattern p3 = Pattern.compile("\n\n");
+    static final String p1s = ">" + Tuils.NEWLINE;
+//    static final String p2s = "\n</";
+    static final String p3s = Tuils.NEWLINE;
+
+    public static String fixNewlines(String s) {
+        s = p1.matcher(s).replaceAll(p1s);
+//        s = p2.matcher(s).replaceAll(p2s);
+        s = p3.matcher(s).replaceAll(p3s);
+        return s;
+    }
+
+//    [0] = document
+//    [1] = root
+    public static Object[] buildDocument(File file, String root) throws Exception {
+        Document d = builder.parse(file);
+        Element r = (Element) d.getElementsByTagName(root).item(0);
+
+        return new Object[] {d, r};
+    }
+
+    public static void writeTo(Document d, File f) {
+        try {
+            TransformerFactory transformerFactory = TransformerFactory.newInstance();
+            Transformer transformer = transformerFactory.newTransformer();
+
+            DOMSource source = new DOMSource(d);
+            StringWriter writer = new StringWriter();
+            StreamResult result = new StreamResult(writer);
+            transformer.transform(source, result);
+
+            String s = fixNewlines(writer.toString());
+
+            FileOutputStream stream = new FileOutputStream(f);
+            stream.write(s.getBytes());
+
+            stream.flush();
+            stream.close();
+        } catch (Exception e) {}
+    }
+
+//    this will only add, it won't check if there's already one
+    public static String add(File file, String rootName, String elementName, String[] attributeNames, String[] attributeValues) {
+        try {
+            Object[] o;
+            try {
+                o = buildDocument(file, rootName);
+            } catch (Exception e) {
+                Tuils.log(e);
+                return e.toString();
+            }
+
+            Document d = (Document) o[0];
+            Element root = (Element) o[1];
+
+            Element element = d.createElement(elementName);
+            for(int c = 0; c < attributeNames.length; c++) {
+                if(attributeValues[c] == null) continue;
+                element.setAttribute(attributeNames[c], attributeValues[c]);
+            }
+            root.appendChild(element);
+
+            writeTo(d, file);
+        } catch (Exception e) {
+            Tuils.log(e);
+            return e.toString();
+        }
+        return null;
+    }
+
+    public static String set(File file, String rootName, String elementName, String[] attributeNames, String[] attributeValues) {
+        return set(file, rootName, elementName, null, null, attributeNames, attributeValues, true);
+    }
+
+    public static String set(File file, String rootName, String elementName, String[] thatHasThose, String[] forValues, String[] attributeNames, String[] attributeValues, boolean addIfNotFound) {
+        String[][] values = new String[1][attributeValues.length];
+        values[0] = attributeValues;
+
+        return setMany(file, rootName, new String[] {elementName}, thatHasThose, forValues, attributeNames, values, addIfNotFound);
+    }
+
+    public static String setMany(File file, String rootName, String elementNames[], String[] attributeNames, String[][] attributeValues) {
+        return setMany(file, rootName, elementNames, null, null, attributeNames, attributeValues, true);
+    }
+
+    public static String setMany(File file, String rootName, String elementNames[], String[] thatHasThose, String[] forValues, String[] attributeNames, String[][] attributeValues, boolean addIfNotFound) {
+        try {
+            Object[] o;
+            try {
+                o = buildDocument(file, rootName);
+            } catch (Exception e) {
+                return e.toString();
+            }
+
+            Document d = (Document) o[0];
+            Element root = (Element) o[1];
+
+            Main:
+            for(int c = 0; c < elementNames.length; c++) {
+                NodeList nodes = root.getElementsByTagName(elementNames[c]);
+
+                Nodes:
+                for(int j = 0; j < nodes.getLength(); j++) {
+                    Node n = nodes.item(j);
+                    if(n.getNodeType() == Node.ELEMENT_NODE) {
+                        Element e = (Element) n;
+
+                        if(checkAttributes(e, thatHasThose, forValues)) continue Nodes;
+
+                        for(int a = 0; a < attributeNames.length; a++) {
+                            e.setAttribute(attributeNames[a], attributeValues[c][a]);
+                        }
+
+                        elementNames[c] = null;
+                        continue Main;
+                    }
+                }
+            }
+
+            boolean notFoundSomething = false;
+
+//            not found
+            for(int count = 0; count < elementNames.length; count++) {
+                if(elementNames[count] == null || elementNames[count].length() == 0) continue;
+
+                notFoundSomething = true;
+
+                if(!addIfNotFound) continue;
+
+                Element element = d.createElement(elementNames[count]);
+                for(int c = 0; c < attributeNames.length; c++) {
+                    if(attributeValues[count][c] == null) continue;
+                    element.setAttribute(attributeNames[c], attributeValues[count][c]);
+                }
+                root.appendChild(element);
+            }
+
+            writeTo(d, file);
+
+            if(notFoundSomething) return Tuils.EMPTYSTRING;
+        } catch (Exception e) {
+            Tuils.log(e);
+            Tuils.toFile(e);
+            return e.toString();
+        }
+        return null;
+    }
+
+//    return "" if node not found, null if all good
+    public static String removeNode(File file, String rootName, String nodeName) {
+        return removeNode(file, rootName, nodeName, null, null);
+    }
+
+    public static String removeNode(File file, String rootName, String nodeName, String[] thatHasThose, String[] forValues) {
+        try {
+            Object[] o;
+            try {
+                o = buildDocument(file, rootName);
+            } catch (Exception e) {
+                return e.toString();
+            }
+
+            Document d = (Document) o[0];
+            Element root = (Element) o[1];
+
+            NodeList nodeList = root.getElementsByTagName(nodeName);
+            if(nodeList == null || nodeList.getLength() == 0) return Tuils.EMPTYSTRING;
+
+            for(int c = 0; c < nodeList.getLength(); c++) {
+                Node n = nodeList.item(c);
+
+                if (n.getNodeType() == Node.ELEMENT_NODE && !checkAttributes((Element) n, thatHasThose, forValues))
+                    continue;
+
+                root.removeChild(n);
+                writeTo(d, file);
+                return null;
+            }
+        } catch (Exception e) {
+            return e.toString();
+        }
+
+        return Tuils.EMPTYSTRING;
+    }
+
+    public static Node findNode(File file, String rootName, String nodeName) {
+        try {
+            Object[] o;
+            try {
+                o = buildDocument(file, rootName);
+            } catch (Exception e) {
+                return null;
+            }
+
+            Element root = (Element) o[1];
+
+            findNode(root, nodeName);
+        } catch (Exception e) {
+            return null;
+        }
+
+        return null;
+    }
+
+    public static Node findNode(Element root, String nodeName) {
+        NodeList nodes = root.getElementsByTagName(nodeName);
+        if(nodes.getLength() == 0) return null;
+        return nodes.item(0);
+    }
+
+    public static String attrValue(File file, String rootName, String nodeName, String attrName) {
+        return attrValue(file, rootName, nodeName, null, null, attrName);
+    }
+
+    public static String attrValue(File file, String rootName, String nodeName, String[] thatHasThose, String[] forValues, String attrName) {
+        String[] vs = attrValues(file, rootName, nodeName, thatHasThose, forValues, new String[] {attrName});
+        if(vs != null && vs.length > 0) return vs[0];
+        return null;
+    }
+
+    public static String[] attrValues(File file, String rootName, String nodeName, String[] attrNames) {
+        return attrValues(file, rootName, nodeName, null, null, attrNames);
+    }
+
+    public static String[] attrValues(File file, String rootName, String nodeName, String[] thatHasThose, String[] forValues, String[] attrNames) {
+        try {
+            Object[] o;
+            try {
+                o = buildDocument(file, rootName);
+            } catch (Exception e) {
+                return null;
+            }
+
+            Element root = (Element) o[1];
+            NodeList nodes = root.getElementsByTagName(nodeName);
+
+            for(int count = 0; count < nodes.getLength(); count++) {
+                Node node = nodes.item(count);
+                Element e = (Element) node;
+
+                if(!checkAttributes(e, thatHasThose, forValues)) continue;
+
+                String[] values = new String[attrNames.length];
+                for(int c = 0; c < attrNames.length; c++) values[count] = e.getAttribute(attrNames[c]);
+
+                return values;
+            }
+        } catch (Exception e) {}
+
+        return null;
+    }
+
+    private static boolean checkAttributes(Element e, String[] thatHasThose, String[] forValues) {
+        if(thatHasThose != null && forValues != null && thatHasThose.length == forValues.length) {
+            for(int a = 0; a < thatHasThose.length; a++) {
+                if(!e.hasAttribute(thatHasThose[a]) || !forValues[a].equals(e.getAttribute(thatHasThose[a]))) return false;
+            }
+        }
+        return true;
+    }
+
+    public static float getFloat(XMLPrefsManager.XMLPrefsSave prefsSave) {
+        return get(float.class, prefsSave);
+    }
+
+    public static double getDouble(XMLPrefsManager.XMLPrefsSave prefsSave) {
+        return get(double.class, prefsSave);
+    }
+
+    public static int getInt(XMLPrefsManager.XMLPrefsSave prefsSave) {
+        return get(int.class, prefsSave);
+    }
+
+    public static boolean getBoolean(XMLPrefsManager.XMLPrefsSave prefsSave) {
+        return get(boolean.class, prefsSave);
+    }
+
+    public static int getColor(XMLPrefsManager.XMLPrefsSave prefsSave) {
+        if(prefsSave.parent() == null) return Integer.MAX_VALUE;
+
+        try {
+            return (int) transform(prefsSave.parent().getValues().get(prefsSave).value, Color.class);
+        } catch (Exception e) {
+            String def = prefsSave.defaultValue();
+            if(def == null || def.length() == 0) {
+                return Integer.MAX_VALUE;
+            }
+
+            try {
+                return (int) transform(def, Color.class);
+            } catch (Exception e1) {
+                return Integer.MAX_VALUE;
+            }
+        }
+    }
+
+    public static String getString(XMLPrefsSave prefsSave) {
+        return get(prefsSave);
+    }
+
+    public static <T> T get(Class<T> c, XMLPrefsManager.XMLPrefsSave prefsSave) {
+        try {
+            return (T) transform(prefsSave.parent().getValues().get(prefsSave).value, c);
+        } catch (Exception e) {
+            Tuils.log(e);
+            try {
+                return (T) transform(prefsSave.defaultValue(), c);
+            } catch (Exception e1) {
+                Tuils.log(e1);
+                return Tuils.getDefaultValue(c);
+            }
+        }
+    }
+
+    public static String get(XMLPrefsManager.XMLPrefsSave prefsSave) {
+        return get(String.class, prefsSave);
+    }
+
+    public static boolean resetFile(File f, String name) {
+        try {
+            FileOutputStream stream = new FileOutputStream(f);
+            stream.write(XML_DEFAULT.getBytes());
+            stream.write(("<" + name + ">\n").getBytes());
+            stream.write(("</" + name + ">\n").getBytes());
+            stream.flush();
+            stream.close();
+            return true;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+//    private static HashMap<XMLPrefsSave, String> getOld(BufferedReader reader) {
+//        HashMap<XMLPrefsSave, String> map = new HashMap<>();
+//
+//        String line;
+//        try {
+//            while((line = reader.readLine()) != null) {
+//                String[] split = line.split("=");
+//                if(split.length != 2) continue;
+//
+//                String name = split[0].trim();
+//                String value = split[1];
+//
+//                XMLPrefsSave s = getCorresponding(name);
+//                if(s == null) continue;
+//
+//                map.put(s, value);
+//            }
+//        } catch (IOException e) {
+//            return null;
+//        }
+//
+//        return map;
+//    }
+
+//    static final SimpleMutableEntry[] OLD = {
+//            new SimpleMutableEntry("deviceColor", Theme.device_color),
+//            new SimpleMutableEntry("inputColor", Theme.input_color),
+//            new SimpleMutableEntry("outputColor", Theme.output_color),
+//            new SimpleMutableEntry("backgroundColor", Theme.bg_color),
+//            new SimpleMutableEntry("useSystemFont", Ui.system_font),
+//            new SimpleMutableEntry("fontSize", Ui.font_size),
+//            new SimpleMutableEntry("ramColor", Theme.ram_color),
+//            new SimpleMutableEntry("inputFieldBottom", Ui.input_bottom),
+//            new SimpleMutableEntry("username", Ui.username),
+//            new SimpleMutableEntry("showSubmit", Ui.show_enter_button),
+//            new SimpleMutableEntry("deviceName", Ui.deviceName),
+//            new SimpleMutableEntry("showRam", Ui.show_ram),
+//            new SimpleMutableEntry("showDevice", Ui.show_device_name),
+//            new SimpleMutableEntry("showToolbar", Toolbar.show_toolbar),
+//
+//            new SimpleMutableEntry("suggestionTextColor", Suggestions.default_text_color),
+//            new SimpleMutableEntry("transparentSuggestions", Suggestions.transparent),
+//            new SimpleMutableEntry("aliasSuggestionBg", Suggestions.alias_bg_color),
+//            new SimpleMutableEntry("appSuggestionBg", Suggestions.apps_bg_color),
+//            new SimpleMutableEntry("commandSuggestionsBg", Suggestions.cmd_bg_color),
+//            new SimpleMutableEntry("songSuggestionBg", Suggestions.song_bg_color),
+//            new SimpleMutableEntry("contactSuggestionBg", Suggestions.contact_bg_color),
+//            new SimpleMutableEntry("fileSuggestionBg", Suggestions.file_bg_color),
+//            new SimpleMutableEntry("defaultSuggestionBg", Suggestions.default_bg_color),
+//
+//            new SimpleMutableEntry("useSystemWallpaper", Ui.system_wallpaper),
+//            new SimpleMutableEntry("fullscreen", Ui.fullscreen),
+//            new SimpleMutableEntry("keepAliveWithNotification", Behavior.tui_notification),
+//            new SimpleMutableEntry("openKeyboardOnStart", Behavior.auto_show_keyboard),
+//
+//            new SimpleMutableEntry("fromMediastore", Behavior.songs_from_mediastore),
+//            new SimpleMutableEntry("playRandom", Behavior.random_play),
+//            new SimpleMutableEntry("songsFolder", Behavior.songs_folder),
+//
+//            new SimpleMutableEntry("closeOnDbTap", Behavior.double_tap_closes),
+//            new SimpleMutableEntry("showSuggestions", Suggestions.show_suggestions),
+//            new SimpleMutableEntry("showDonationMessage", Behavior.donation_message),
+//            new SimpleMutableEntry("showAliasValue", Behavior.show_alias_content),
+//            new SimpleMutableEntry("showAppsHistory", Behavior.show_launch_history),
+//
+//            new SimpleMutableEntry("defaultSearch", Cmd.default_search)
+//    };
+//
+//    private static XMLPrefsSave getCorresponding(String old) {
+//        for(SimpleMutableEntry<String, XMLPrefsSave> s : OLD) {
+//            if(old.equals(s.getKey())) return s.getValue();
+//        }
+//        return null;
+//    }
+}
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Apps.java b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Apps.java
new file mode 100644
index 0000000000000000000000000000000000000000..d775371c2cb39844b530f3df7fac6551a118f0b8
--- /dev/null
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Apps.java
@@ -0,0 +1,60 @@
+package ohi.andre.consolelauncher.managers.xml.options;
+
+import ohi.andre.consolelauncher.managers.AppsManager;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+
+/**
+ * Created by francescoandreuzzi on 24/09/2017.
+ */
+
+public enum Apps implements XMLPrefsManager.XMLPrefsSave {
+
+    default_app_n1 {
+        @Override
+        public String defaultValue() {
+            return MOST_USED;
+        }
+    },
+    default_app_n2 {
+        @Override
+        public String defaultValue() {
+            return MOST_USED;
+        }
+    },
+    default_app_n3 {
+        @Override
+        public String defaultValue() {
+            return "com.android.vending";
+        }
+    },
+    default_app_n4 {
+        @Override
+        public String defaultValue() {
+            return NULL;
+        }
+    },
+    default_app_n5 {
+        @Override
+        public String defaultValue() {
+            return NULL;
+        }
+    };
+
+    public static final String MOST_USED = "most_used";
+    public static final String NULL = "null";
+
+    @Override
+    public String label() {
+        return name();
+    }
+
+    @Override
+    public XMLPrefsManager.XmlPrefsElement parent() {
+        return AppsManager.instance;
+    }
+
+    @Override
+    public boolean is(String s) {
+        return name().equals(s);
+    }
+}
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Behavior.java b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Behavior.java
new file mode 100644
index 0000000000000000000000000000000000000000..ae2e396c029657d7054b2382159b7821e035ba8d
--- /dev/null
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Behavior.java
@@ -0,0 +1,277 @@
+package ohi.andre.consolelauncher.managers.xml.options;
+
+import android.os.Environment;
+
+import java.io.File;
+
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.tuils.Tuils;
+
+/**
+ * Created by francescoandreuzzi on 24/09/2017.
+ */
+
+public enum Behavior implements XMLPrefsManager.XMLPrefsSave {
+
+    double_tap_lock {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    double_tap_cmd {
+        @Override
+        public String defaultValue() {
+            return "";
+        }
+    },
+    random_play {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    songs_folder {
+        @Override
+        public String defaultValue() {
+            return "";
+        }
+    },
+    songs_from_mediastore {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    tui_notification {
+        @Override
+        public String defaultValue() {
+            return "false";
+        }
+    },
+    auto_show_keyboard {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    auto_scroll {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    show_hints {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    show_alias_content {
+        @Override
+        public String defaultValue() {
+            return "false";
+        }
+    },
+    show_launch_history {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    clear_after_cmds {
+        @Override
+        public String defaultValue() {
+            return "-1";
+        }
+    },
+    clear_after_seconds {
+        @Override
+        public String defaultValue() {
+            return "-1";
+        }
+    },
+    max_lines {
+        @Override
+        public String defaultValue() {
+            return "-1";
+        }
+    },
+    time_format {
+        @Override
+        public String defaultValue() {
+            return "%m/%d/%y %H.%M";
+        }
+    },
+    battery_medium {
+        @Override
+        public String defaultValue() {
+            return "50";
+        }
+    },
+    battery_low {
+        @Override
+        public String defaultValue() {
+            return "15";
+        }
+    },
+    device_format {
+        @Override
+        public String defaultValue() {
+            return "%d: %u";
+        }
+    },
+    ram_format {
+        @Override
+        public String defaultValue() {
+            return "Available RAM: %avgb GB of %totgb GB (%av%%)";
+        }
+    },
+    battery_format {
+        @Override
+        public String defaultValue() {
+            return "%(Charging: /)%v%";
+        }
+    },
+    storage_format {
+        @Override
+        public String defaultValue() {
+            return "Internal Storage: %iavgb GB / %itotgb GB (%iav%%)";
+        }
+    },
+    network_info_format {
+        @Override
+        public String defaultValue() {
+            return "%(WiFi - %wn/%[Mobile Data: %d3/No Internet access])";
+        }
+    },
+    input_format {
+        @Override
+        public String defaultValue() {
+            return "[%t] %p %i";
+        }
+    },
+    output_format {
+        @Override
+        public String defaultValue() {
+            return "%o";
+        }
+    },
+    session_info_format {
+        @Override
+        public String defaultValue() {
+            return "%u@%d:%p";
+        }
+    },
+    enable_app_launch {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    app_launch_format {
+        @Override
+        public String defaultValue() {
+            return "--> %a";
+        }
+    },
+    time_format_separator {
+        @Override
+        public String defaultValue() {
+            return "@";
+        }
+    },
+    alias_param_marker {
+        @Override
+        public String defaultValue() {
+            return "%";
+        }
+    },
+    alias_param_separator {
+        @Override
+        public String defaultValue() {
+            return ",";
+        }
+    },
+    multiple_cmd_separator {
+        @Override
+        public String defaultValue() {
+            return ";";
+        }
+    },
+    alias_content_format {
+        @Override
+        public String defaultValue() {
+            return "%a --> [%v]";
+        }
+    },
+    external_storage_path {
+        @Override
+        public String defaultValue() {
+            String path = System.getenv("SECONDARY_STORAGE");
+            if(path == null) return Tuils.EMPTYSTRING;
+
+            File file = new File(path);
+            if(file != null && file.exists()) return file.getAbsolutePath();
+
+            return Tuils.EMPTYSTRING;
+        }
+    },
+    home_path {
+        @Override
+        public String defaultValue() {
+            return Environment.getExternalStorageDirectory().getAbsolutePath();
+        }
+    },
+    app_installed_format {
+        @Override
+        public String defaultValue() {
+            return "App installed: %p";
+        }
+    },
+    app_uninstalled_format {
+        @Override
+        public String defaultValue() {
+            return "App uninstalled: %p";
+        }
+    },
+    enable_music {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    autolower_firstchar {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    max_optional_depth_network_info {
+        @Override
+        public String defaultValue() {
+            return "2";
+        }
+    },
+    network_info_update_ms {
+        @Override
+        public String defaultValue() {
+            return "3500";
+        }
+    };
+
+    @Override
+    public XMLPrefsManager.XmlPrefsElement parent() {
+        return XMLPrefsManager.XMLPrefsRoot.BEHAVIOR;
+    }
+
+    @Override
+    public String label() {
+        return name();
+    }
+
+    @Override
+    public boolean is(String s) {
+        return name().equals(s);
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Cmd.java b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Cmd.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a75bb22e61aaf5648351f6caf651915e71d96ad
--- /dev/null
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Cmd.java
@@ -0,0 +1,32 @@
+package ohi.andre.consolelauncher.managers.xml.options;
+
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+
+/**
+ * Created by francescoandreuzzi on 24/09/2017.
+ */
+
+public enum Cmd implements XMLPrefsManager.XMLPrefsSave {
+
+    default_search {
+        @Override
+        public String defaultValue() {
+            return "-gg";
+        }
+    };
+
+    @Override
+    public XMLPrefsManager.XmlPrefsElement parent() {
+        return XMLPrefsManager.XMLPrefsRoot.CMD;
+    }
+
+    @Override
+    public String label() {
+        return name();
+    }
+
+    @Override
+    public boolean is(String s) {
+        return name().equals(s);
+    }
+}
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Notifications.java b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Notifications.java
new file mode 100644
index 0000000000000000000000000000000000000000..ea3fd931044fb62439626d4ed8b3076bca8162a4
--- /dev/null
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Notifications.java
@@ -0,0 +1,51 @@
+package ohi.andre.consolelauncher.managers.xml.options;
+
+import ohi.andre.consolelauncher.managers.notifications.NotificationManager;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+
+/**
+ * Created by francescoandreuzzi on 24/09/2017.
+ */
+
+public enum Notifications implements XMLPrefsManager.XMLPrefsSave {
+
+    show_notifications {
+        @Override
+        public String defaultValue() {
+            return "false";
+        }
+    },
+    app_notification_enabled_default {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    default_notification_color {
+        @Override
+        public String defaultValue() {
+            return "#00FF00";
+        }
+    },
+    notification_format {
+        @Override
+        public String defaultValue() {
+            return "[%t] %pkg: %ttl --- %txt";
+        }
+    };
+
+    @Override
+    public XMLPrefsManager.XmlPrefsElement parent() {
+        return NotificationManager.instance;
+    }
+
+    @Override
+    public String label() {
+        return name();
+    }
+
+    @Override
+    public boolean is(String s) {
+        return name().equals(s);
+    }
+}
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Rss.java b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Rss.java
new file mode 100644
index 0000000000000000000000000000000000000000..894d1d0b5996351e7053349d048b54f481d712a3
--- /dev/null
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Rss.java
@@ -0,0 +1,57 @@
+package ohi.andre.consolelauncher.managers.xml.options;
+
+import ohi.andre.consolelauncher.managers.RssManager;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+
+/**
+ * Created by francescoandreuzzi on 03/10/2017.
+ */
+
+public enum Rss implements XMLPrefsManager.XMLPrefsSave {
+
+    rss_default_color {
+        @Override
+        public String defaultValue() {
+            return "#f44336";
+        }
+    },
+    rss_default_format {
+        @Override
+        public String defaultValue() {
+            return "%[50]title --- %[100]description";
+        }
+    },
+    include_rss_default {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    rss_hidden_tags {
+        @Override
+        public String defaultValue() {
+            return "img";
+        }
+    },
+    rss_time_format {
+        @Override
+        public String defaultValue() {
+            return "%t0";
+        }
+    };
+
+    @Override
+    public XMLPrefsManager.XmlPrefsElement parent() {
+        return RssManager.instance;
+    }
+
+    @Override
+    public String label() {
+        return name();
+    }
+
+    @Override
+    public boolean is(String s) {
+        return name().equals(s);
+    }
+}
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Suggestions.java b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Suggestions.java
new file mode 100644
index 0000000000000000000000000000000000000000..62fff83e33eb25c2c08d6b61316b46cf00b65d4e
--- /dev/null
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Suggestions.java
@@ -0,0 +1,146 @@
+package ohi.andre.consolelauncher.managers.xml.options;
+
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+
+/**
+ * Created by francescoandreuzzi on 24/09/2017.
+ */
+
+public enum Suggestions implements XMLPrefsManager.XMLPrefsSave {
+
+    show_suggestions {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    transparent_suggestions {
+        @Override
+        public String defaultValue() {
+            return "false";
+        }
+    },
+    default_text_color {
+        @Override
+        public String defaultValue() {
+            return "#000000";
+        }
+    },
+    default_bg_color {
+        @Override
+        public String defaultValue() {
+            return "#ffffff";
+        }
+    },
+    apps_text_color {
+        @Override
+        public String defaultValue() {
+            return "";
+        }
+    },
+    apps_bg_color {
+        @Override
+        public String defaultValue() {
+            return "#00897B";
+        }
+    },
+    alias_text_color {
+        @Override
+        public String defaultValue() {
+            return "";
+        }
+    },
+    alias_bg_color {
+        @Override
+        public String defaultValue() {
+            return "#FF5722";
+        }
+    },
+    cmd_text_color {
+        @Override
+        public String defaultValue() {
+            return "";
+        }
+    },
+    cmd_bg_color {
+        @Override
+        public String defaultValue() {
+            return "#76FF03";
+        }
+    },
+    song_text_color {
+        @Override
+        public String defaultValue() {
+            return "";
+        }
+    },
+    song_bg_color {
+        @Override
+        public String defaultValue() {
+            return "#EEFF41";
+        }
+    },
+    contact_text_color {
+        @Override
+        public String defaultValue() {
+            return "";
+        }
+    },
+    contact_bg_color {
+        @Override
+        public String defaultValue() {
+            return "#64FFDA";
+        }
+    },
+    file_text_color {
+        @Override
+        public String defaultValue() {
+            return "";
+        }
+    },
+    file_bg_color {
+        @Override
+        public String defaultValue() {
+            return "#03A9F4";
+        }
+    },
+    suggest_alias_default {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    suggest_appgp_default {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    click_to_launch {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    suggestions_size {
+        @Override
+        public String defaultValue() {
+            return "12";
+        }
+    };
+
+    @Override
+    public XMLPrefsManager.XmlPrefsElement parent() {
+        return XMLPrefsManager.XMLPrefsRoot.SUGGESTIONS;
+    }
+
+    @Override
+    public String label() {
+        return name();
+    }
+
+    @Override
+    public boolean is(String s) {
+        return name().equals(s);
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Theme.java b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Theme.java
new file mode 100644
index 0000000000000000000000000000000000000000..31f138de80dbd9d35197b78333b972d9311df1ab
--- /dev/null
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Theme.java
@@ -0,0 +1,164 @@
+package ohi.andre.consolelauncher.managers.xml.options;
+
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+
+/**
+ * Created by francescoandreuzzi on 24/09/2017.
+ */
+
+public enum Theme implements XMLPrefsManager.XMLPrefsSave {
+
+    input_color {
+        @Override
+        public String defaultValue() {
+            return "#ff00ff00";
+        }
+    },
+    output_color {
+        @Override
+        public String defaultValue() {
+            return "#ffffffff";
+        }
+    },
+    bg_color {
+        @Override
+        public String defaultValue() {
+            return "#ff000000";
+        }
+    },
+    device_color {
+        @Override
+        public String defaultValue() {
+            return "#ffff9800";
+        }
+    },
+    battery_color_high {
+        @Override
+        public String defaultValue() {
+            return "#4CAF50";
+        }
+    },
+    battery_color_medium {
+        @Override
+        public String defaultValue() {
+            return "#FFEB3B";
+        }
+    },
+    battery_color_low {
+        @Override
+        public String defaultValue() {
+            return "#FF5722";
+        }
+    },
+    time_color {
+        @Override
+        public String defaultValue() {
+            return "#03A9F4";
+        }
+    },
+    storage_color {
+        @Override
+        public String defaultValue() {
+            return "#9C27B0";
+        }
+    },
+    ram_color {
+        @Override
+        public String defaultValue() {
+            return "#fff44336";
+        }
+    },
+    network_info_color {
+        @Override
+        public String defaultValue() {
+            return "#FFCA28";
+        }
+    },
+    toolbar_bg {
+        @Override
+        public String defaultValue() {
+            return "#00000000";
+        }
+    },
+    toolbar_color {
+        @Override
+        public String defaultValue() {
+            return "#ffff0000";
+        }
+    },
+    enter_color {
+        @Override
+        public String defaultValue() {
+            return "#ffffffff";
+        }
+    },
+    overlay_color {
+        @Override
+        public String defaultValue() {
+            return "#80000000";
+        }
+    },
+    alias_content_color {
+        @Override
+        public String defaultValue() {
+            return "#1DE9B6";
+        }
+    },
+    statusbar_color {
+        @Override
+        public String defaultValue() {
+            return "#000000";
+        }
+    },
+    navigationbar_color {
+        @Override
+        public String defaultValue() {
+            return "#000000";
+        }
+    },
+    app_installed_color {
+        @Override
+        public String defaultValue() {
+            return "#FF7043";
+        }
+    },
+    app_uninstalled_color {
+        @Override
+        public String defaultValue() {
+            return "#FF7043";
+        }
+    },
+    hint_color {
+        @Override
+        public String defaultValue() {
+            return "#4CAF50";
+        }
+    },
+    rss_color {
+        @Override
+        public String defaultValue() {
+            return null;
+        }
+    },
+    mark_color {
+        @Override
+        public String defaultValue() {
+            return "#CDDC39";
+        }
+    };
+
+    @Override
+    public XMLPrefsManager.XmlPrefsElement parent() {
+        return XMLPrefsManager.XMLPrefsRoot.THEME;
+    }
+
+    @Override
+    public String label() {
+        return name();
+    }
+
+    @Override
+    public boolean is(String s) {
+        return name().equals(s);
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Toolbar.java b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Toolbar.java
new file mode 100644
index 0000000000000000000000000000000000000000..c5bc862cb222c153f6ab3c6a423fbd4479861ff7
--- /dev/null
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Toolbar.java
@@ -0,0 +1,32 @@
+package ohi.andre.consolelauncher.managers.xml.options;
+
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+
+/**
+ * Created by francescoandreuzzi on 24/09/2017.
+ */
+
+public enum Toolbar implements XMLPrefsManager.XMLPrefsSave {
+
+    show_toolbar {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    };
+
+    @Override
+    public XMLPrefsManager.XmlPrefsElement parent() {
+        return XMLPrefsManager.XMLPrefsRoot.TOOLBAR;
+    }
+
+    @Override
+    public String label() {
+        return name();
+    }
+
+    @Override
+    public boolean is(String s) {
+        return name().equals(s);
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Ui.java b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Ui.java
new file mode 100644
index 0000000000000000000000000000000000000000..18c78bdbbf394949aec48dfd74f773991076be7f
--- /dev/null
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/xml/options/Ui.java
@@ -0,0 +1,286 @@
+package ohi.andre.consolelauncher.managers.xml.options;
+
+import android.os.Build;
+
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+
+/**
+ * Created by francescoandreuzzi on 24/09/2017.
+ */
+
+public enum Ui implements XMLPrefsManager.XMLPrefsSave {
+
+    show_enter_button {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    system_font {
+        @Override
+        public String defaultValue() {
+            return "false";
+        }
+    },
+    ram_size {
+        @Override
+        public String defaultValue() {
+            return "13";
+        }
+    },
+    battery_size {
+        @Override
+        public String defaultValue() {
+            return "13";
+        }
+    },
+    device_size {
+        @Override
+        public String defaultValue() {
+            return "13";
+        }
+    },
+    time_size {
+        @Override
+        public String defaultValue() {
+            return "13";
+        }
+    },
+    storage_size {
+        @Override
+        public String defaultValue() {
+            return "13";
+        }
+    },
+    network_size {
+        @Override
+        public String defaultValue() {
+            return "13";
+        }
+    },
+    input_output_size {
+        @Override
+        public String defaultValue() {
+            return "13";
+        }
+    },
+    input_bottom {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    show_ram {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    show_device_name {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    show_battery {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    show_network_info {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    show_storage_info {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    enable_battery_status {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    show_time {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    username {
+        @Override
+        public String defaultValue() {
+            return "user";
+        }
+    },
+    deviceName {
+        @Override
+        public String defaultValue() {
+            return Build.DEVICE;
+        }
+    },
+    system_wallpaper {
+        @Override
+        public String defaultValue() {
+            return "false";
+        }
+    },
+    fullscreen {
+        @Override
+        public String defaultValue() {
+            return "false";
+        }
+    },
+    device_index {
+        @Override
+        public String defaultValue() {
+            return "0";
+        }
+    },
+    ram_index {
+        @Override
+        public String defaultValue() {
+            return "1";
+        }
+    },
+    battery_index {
+        @Override
+        public String defaultValue() {
+            return "2";
+        }
+    },
+    time_index {
+        @Override
+        public String defaultValue() {
+            return "3";
+        }
+    },
+    storage_index {
+        @Override
+        public String defaultValue() {
+            return "4";
+        }
+    },
+    network_index {
+        @Override
+        public String defaultValue() {
+            return "5";
+        }
+    },
+    status_line0_position {
+        @Override
+        public String defaultValue() {
+            return "-1";
+        }
+    },
+    status_line1_position {
+        @Override
+        public String defaultValue() {
+            return "-1";
+        }
+    },
+    status_line2_position {
+        @Override
+        public String defaultValue() {
+            return "-1";
+        }
+    },
+    status_line3_position {
+        @Override
+        public String defaultValue() {
+            return "-1";
+        }
+    },
+    status_line4_position {
+        @Override
+        public String defaultValue() {
+            return "-1";
+        }
+    },
+    status_line5_position {
+        @Override
+        public String defaultValue() {
+            return "-1";
+        }
+    },
+    input_prefix {
+        @Override
+        public String defaultValue() {
+            return "$";
+        }
+    },
+    input_root_prefix {
+        @Override
+        public String defaultValue() {
+            return "#";
+        }
+    },
+    left_margin_mm {
+        @Override
+        public String defaultValue() {
+            return "0";
+        }
+    },
+    right_margin_mm {
+        @Override
+        public String defaultValue() {
+            return "0";
+        }
+    },
+    top_margin_mm {
+        @Override
+        public String defaultValue() {
+            return "0";
+        }
+    },
+    bottom_margin_mm {
+        @Override
+        public String defaultValue() {
+            return "0";
+        }
+    },
+    ignore_bar_color {
+        @Override
+        public String defaultValue() {
+            return "false";
+        }
+    },
+    show_app_installed {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    show_app_uninstalled {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    },
+    show_session_info {
+        @Override
+        public String defaultValue() {
+            return "true";
+        }
+    };
+
+    @Override
+    public XMLPrefsManager.XmlPrefsElement parent() {
+        return XMLPrefsManager.XMLPrefsRoot.UI;
+    }
+
+    @Override
+    public String label() {
+        return name();
+    }
+
+    @Override
+    public boolean is(String s) {
+        return name().equals(s);
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/AllowEqualsSequence.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/AllowEqualsSequence.java
index 5f2e1cb3591a6b4f7b5bc33683036a0ffcb808c9..34c551b76fd7001df44ee1e8d627ef0bc73aecdd 100644
--- a/app/src/main/java/ohi/andre/consolelauncher/tuils/AllowEqualsSequence.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/AllowEqualsSequence.java
@@ -14,12 +14,12 @@ public class AllowEqualsSequence {
 
     List<Entry> sequence;
 
-    public AllowEqualsSequence(int[] keys, Object[] values) {
+    public AllowEqualsSequence(float[] values, Object[] objs) {
         this.sequence = new ArrayList<>();
 
-        for (int count = 0; count < keys.length; count++) {
-            if(keys[count] == Integer.MAX_VALUE) continue;
-            sequence.add(new Entry(keys[count], values[count]));
+        for (int count = 0; count < values.length; count++) {
+            if(values[count] == Integer.MAX_VALUE) continue;
+            sequence.add(new Entry(values[count], objs[count]));
         }
         Collections.sort(this.sequence);
 
@@ -27,19 +27,18 @@ public class AllowEqualsSequence {
         for(int count = 0; count < sequence.size(); count++) {
             Entry entry = sequence.get(count);
 
-            int key = entry.key;
-            if(key != last) {
-                counter++;
-            }
+            int i = (int) entry.value;
+            if(i != last) counter++;
+
             entry.key = counter;
-            last = key;
+            last = counter;
         }
     }
 
     public Object[] get(int key) {
         List<Object> o = new ArrayList<>();
         for(Entry entry : sequence) {
-            if(entry.key == key) o.add(entry.value);
+            if(entry.key == key) o.add(entry.obj);
             else if(o.size() > 0) break;
         }
 
@@ -61,22 +60,29 @@ public class AllowEqualsSequence {
     }
 
     private class Entry implements Comparable<Entry> {
+
+        float value;
+        Object obj;
+
         int key;
-        Object value;
 
-        public Entry(int key, Object value) {
-            this.key = key;
+        public Entry(float value, Object obj) {
             this.value = value;
+            this.obj = obj;
         }
 
         @Override
         public int compareTo(@NonNull Entry o) {
-            return this.key - o.key;
+            float result = value - o.value;
+
+            if(result == 0) return 0;
+            if(result < 0) return -1;
+            return 1;
         }
 
         @Override
         public String toString() {
-            return key + ": " + value.toString();
+            return value + ": " + obj.toString();
         }
     }
 }
diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/InputOutputReceiver.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/InputOutputReceiver.java
index 4f21af22623438913f0d6f2d2d30021b6d323883..925cfdc5d55735ac61dbf5e216d57c41ec7dee3b 100644
--- a/app/src/main/java/ohi/andre/consolelauncher/tuils/InputOutputReceiver.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/InputOutputReceiver.java
@@ -27,6 +27,7 @@ public class InputOutputReceiver extends BroadcastReceiver {
     public static final String TEXT = "ohi.andre.consolelauncher.text";
     public static final String TYPE = "ohi.andre.consolelauncher.type";
     public static final String COLOR = "ohi.andre.consolelauncher.color";
+    public static final String SHOW_CONTENT = "ohi.andre.consolelauncher.show_content";
 
     CommandExecuter executer;
     Outputable outputable;
@@ -45,17 +46,16 @@ public class InputOutputReceiver extends BroadcastReceiver {
             if(text == null) return;
 
             if(intent.getAction().equals(ACTION_CMD)) {
-                executer.exec(text.toString());
+                executer.exec(text.toString(), intent.getBooleanExtra(SHOW_CONTENT, true));
             } else {
                 int color = intent.getIntExtra(COLOR, Integer.MAX_VALUE);
 
                 if(color != Integer.MAX_VALUE) {
                     outputable.onOutput(color, text);
-                }
-                else {
+                } else {
                     int type = intent.getIntExtra(TYPE, -1);
                     if(type != -1) outputable.onOutput(text, type);
-                    else outputable.onOutput(text, TerminalManager.CATEGORY_OUTPUT);
+                    else outputable.onOutput(text, TerminalManager.CATEGORY_GENERAL);
                 }
             }
         } else {
diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/NetworkUtils.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/NetworkUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..00246ae4ef2da400477adec96723e381ff871a38
--- /dev/null
+++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/NetworkUtils.java
@@ -0,0 +1,128 @@
+package ohi.andre.consolelauncher.tuils;
+
+/**
+ * Created by francescoandreuzzi on 28/09/2017.
+ */
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+
+public class NetworkUtils {
+
+    /**
+     * Convert byte array to hex string
+     * @param bytes
+     * @return
+     */
+    public static String bytesToHex(byte[] bytes) {
+        StringBuilder sbuf = new StringBuilder();
+        for(int idx=0; idx < bytes.length; idx++) {
+            int intVal = bytes[idx] & 0xff;
+            if (intVal < 0x10) sbuf.append("0");
+            sbuf.append(Integer.toHexString(intVal).toUpperCase());
+        }
+        return sbuf.toString();
+    }
+
+    /**
+     * Get utf8 byte array.
+     * @param str
+     * @return  array of NULL if error was found
+     */
+    public static byte[] getUTF8Bytes(String str) {
+        try { return str.getBytes("UTF-8"); } catch (Exception ex) { return null; }
+    }
+
+    /**
+     * Load UTF8withBOM or any ansi text file.
+     * @param filename
+     * @return
+     * @throws java.io.IOException
+     */
+    public static String loadFileAsString(String filename) throws java.io.IOException {
+        final int BUFLEN=1024;
+        BufferedInputStream is = new BufferedInputStream(new FileInputStream(filename), BUFLEN);
+        try {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream(BUFLEN);
+            byte[] bytes = new byte[BUFLEN];
+            boolean isUTF8=false;
+            int read,count=0;
+            while((read=is.read(bytes)) != -1) {
+                if (count==0 && bytes[0]==(byte)0xEF && bytes[1]==(byte)0xBB && bytes[2]==(byte)0xBF ) {
+                    isUTF8=true;
+                    baos.write(bytes, 3, read-3); // drop UTF8 bom marker
+                } else {
+                    baos.write(bytes, 0, read);
+                }
+                count+=read;
+            }
+            return isUTF8 ? new String(baos.toByteArray(), "UTF-8") : new String(baos.toByteArray());
+        } finally {
+            try{ is.close(); } catch(Exception ex){}
+        }
+    }
+
+    /**
+     * Returns MAC address of the given interface name.
+     * @param interfaceName eth0, wlan0 or NULL=use first interface
+     * @return  mac address or empty string
+     */
+    public static String getMACAddress(String interfaceName) {
+        try {
+            List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
+            for (NetworkInterface intf : interfaces) {
+                if (interfaceName != null) {
+                    if (!intf.getName().equalsIgnoreCase(interfaceName)) continue;
+                }
+                byte[] mac = intf.getHardwareAddress();
+                if (mac==null) return "";
+                StringBuilder buf = new StringBuilder();
+                for (int idx=0; idx<mac.length; idx++)
+                    buf.append(String.format("%02X:", mac[idx]));
+                if (buf.length()>0) buf.deleteCharAt(buf.length()-1);
+                return buf.toString();
+            }
+        } catch (Exception ex) { } // for now eat exceptions
+        return "";
+        /*try {
+            // this is so Linux hack
+            return loadFileAsString("/sys/class/net/" +interfaceName + "/address").toUpperCase().trim();
+        } catch (IOException ex) {
+            return null;
+        }*/
+    }
+
+    /**
+     * Get IP address from first non-localhost interface
+     * @param ipv4  true=return ipv4, false=return ipv6
+     * @return  address or empty string
+     */
+    public static String getIPAddress(boolean useIPv4) {
+        try {
+            List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
+            for (NetworkInterface intf : interfaces) {
+                List<InetAddress> addrs = Collections.list(intf.getInetAddresses());
+                for (InetAddress addr : addrs) {
+                    if (!addr.isLoopbackAddress()) {
+                        String sAddr = addr.getHostAddress();
+                        //boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr);
+                        boolean isIPv4 = sAddr.indexOf(':')<0;
+
+                        if (useIPv4) {
+                            if (isIPv4)
+                                return sAddr;
+                        } else {
+                            if (!isIPv4) {
+                                int delim = sAddr.indexOf('%'); // drop ip6 zone suffix
+                                return delim<0 ? sAddr.toUpperCase() : sAddr.substring(0, delim).toUpperCase();
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (Exception ex) { } // for now eat exceptions
+        return "";
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/TimeManager.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/TimeManager.java
index 8aec73189bcff0e220827388102c71df5d55d12d..854139936e02445c0185fdd9eca331e5cde9ad9f 100644
--- a/app/src/main/java/ohi/andre/consolelauncher/tuils/TimeManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/TimeManager.java
@@ -12,7 +12,8 @@ import java.util.Arrays;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import ohi.andre.consolelauncher.managers.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.options.Behavior;
 
 /**
  * Created by francescoandreuzzi on 26/07/2017.
@@ -26,8 +27,8 @@ public class TimeManager {
     static Pattern extractor = Pattern.compile("%t([0-9]+)", Pattern.CASE_INSENSITIVE);
 
     public static void create() {
-        String format = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.time_format);
-        String separator = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.time_format_separator);
+        String format = XMLPrefsManager.get(Behavior.time_format);
+        String separator = XMLPrefsManager.get(Behavior.time_format_separator);
 
         time = new Time();
 
@@ -93,12 +94,15 @@ public class TimeManager {
 
         String tf = time.format(t);
 
-        SpannableString spannableString = null;
+        SpannableString spannableString = new SpannableString(tf);
         if(color != Integer.MAX_VALUE) {
-            spannableString = new SpannableString(tf);
-            spannableString.setSpan(new ForegroundColorSpan(color), 0, tf.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+            spannableString.setSpan(new ForegroundColorSpan(color), 0, tf.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
         }
-        cs = TextUtils.replace(cs, new String[] {"%t"}, new CharSequence[] {spannableString != null ? spannableString : tf});
+        if(size != Integer.MAX_VALUE && context != null) {
+            spannableString.setSpan(new AbsoluteSizeSpan(Tuils.convertSpToPixels(size, context)), 0, tf.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        }
+
+        cs = TextUtils.replace(cs, new String[] {"%t"}, new CharSequence[] {spannableString});
 
         return cs;
     }
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 0d13ed7ac809d22acd007c7b93e85b1b34222ed7..4836734666f5b5a5cb0ee3d3e74ecd90c936c856 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/tuils/Tuils.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/Tuils.java
@@ -13,6 +13,7 @@ import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
 import android.content.res.Resources;
+import android.graphics.Typeface;
 import android.net.Uri;
 import android.os.BatteryManager;
 import android.os.Build;
@@ -24,6 +25,7 @@ import android.text.SpannableString;
 import android.text.Spanned;
 import android.text.TextUtils;
 import android.text.style.AbsoluteSizeSpan;
+import android.text.style.BackgroundColorSpan;
 import android.text.style.ForegroundColorSpan;
 import android.util.DisplayMetrics;
 import android.util.Log;
@@ -37,7 +39,9 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.io.OutputStream;
 import java.io.PrintStream;
 import java.io.PrintWriter;
 import java.io.StringWriter;
@@ -54,10 +58,13 @@ import java.util.regex.Pattern;
 
 import dalvik.system.DexFile;
 import ohi.andre.consolelauncher.BuildConfig;
-import ohi.andre.consolelauncher.managers.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.TerminalManager;
 import ohi.andre.consolelauncher.managers.music.MusicManager2;
 import ohi.andre.consolelauncher.managers.music.Song;
 import ohi.andre.consolelauncher.managers.notifications.NotificationService;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.options.Behavior;
+import ohi.andre.consolelauncher.managers.xml.options.Ui;
 import ohi.andre.consolelauncher.tuils.interfaces.OnBatteryUpdate;
 import ohi.andre.consolelauncher.tuils.stuff.FakeLauncherActivity;
 
@@ -72,6 +79,44 @@ public class Tuils {
     private static final String TUI_FOLDER = "t-ui";
     public static final String MINUS = "-";
 
+    public static final String FONT_PATH = "font";
+    private static Typeface globalTypeface = null;
+    public static Typeface getTypeface(Context context) {
+        if(globalTypeface == null) {
+            try {
+                XMLPrefsManager.create(context);
+            } catch (Exception e) {
+                return null;
+            }
+
+            boolean systemFont = XMLPrefsManager.getBoolean(Ui.system_font);
+            if(systemFont) globalTypeface = Typeface.DEFAULT;
+            else {
+                File tui = Tuils.getFolder();
+
+                File font = null;
+                for(File f : tui.listFiles()) {
+                    if(f.getName().startsWith(FONT_PATH)) {
+                        font = f;
+                        break;
+                    }
+                }
+
+                if(font != null) {
+                    try {
+                        globalTypeface = Typeface.createFromFile(font);
+                        if(globalTypeface == null) throw new UnsupportedOperationException();
+                    } catch (Exception e) {
+                        globalTypeface = null;
+                    }
+                }
+            }
+
+            if(globalTypeface == null) globalTypeface = systemFont ? Typeface.DEFAULT : Typeface.createFromAsset(context.getAssets(), "lucida_console.ttf");
+        }
+        return globalTypeface;
+    }
+
     public static boolean notificationServiceIsRunning(Context context) {
         ComponentName collectorComponent = new ComponentName(context, NotificationService.class);
         ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
@@ -104,6 +149,9 @@ public class Tuils {
     public static void registerBatteryReceiver(Context context, OnBatteryUpdate listener) {
         try {
             IntentFilter iFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
+            iFilter.addAction(Intent.ACTION_POWER_CONNECTED);
+            iFilter.addAction(Intent.ACTION_POWER_DISCONNECTED);
+
             context.registerReceiver(batteryReceiver, iFilter);
 
             batteryUpdate = listener;
@@ -118,8 +166,18 @@ public class Tuils {
         public void onReceive(Context context, Intent intent) {
             if(batteryUpdate == null) return;
 
-            int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
-            batteryUpdate.update(level);
+            switch (intent.getAction()) {
+                case Intent.ACTION_BATTERY_CHANGED:
+                    int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
+                    batteryUpdate.update(level);
+                    break;
+                case Intent.ACTION_POWER_CONNECTED:
+                    batteryUpdate.onCharging();
+                    break;
+                case Intent.ACTION_POWER_DISCONNECTED:
+                    batteryUpdate.onNotCharging();
+                    break;
+            }
         }
     };
 
@@ -160,6 +218,34 @@ public class Tuils {
         return songs;
     }
 
+    public static void download(InputStream in, File file) throws Exception {
+        OutputStream out = new FileOutputStream(file, false);
+
+        byte data[] = new byte[1024];
+
+        int count;
+        while ((count = in.read(data)) != -1) {
+            out.write(data, 0, count);
+        }
+
+        out.flush();
+        out.close();
+        in.close();
+    }
+
+    public static void write(File file, String separator, String... ss) throws Exception {
+        FileOutputStream headerStream = new FileOutputStream(file, false);
+
+        for(int c = 0; c < ss.length - 1; c++) {
+            headerStream.write(ss[c].getBytes());
+            headerStream.write(separator.getBytes());
+        }
+        headerStream.write(ss[ss.length - 1].getBytes());
+
+        headerStream.flush();
+        headerStream.close();
+    }
+
     public static float dpToPx(Context context, float valueInDp) {
         DisplayMetrics metrics = context.getResources().getDisplayMetrics();
         return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics);
@@ -225,7 +311,7 @@ public class Tuils {
 
     public static double getAvailableExternalMemorySize(int unit) {
         try {
-            return getAvailableSpace(XMLPrefsManager.get(File.class, XMLPrefsManager.Behavior.external_storage_path), unit);
+            return getAvailableSpace(XMLPrefsManager.get(File.class, Behavior.external_storage_path), unit);
         } catch (Exception e) {
             return -1;
         }
@@ -233,7 +319,7 @@ public class Tuils {
 
     public static double getTotalExternalMemorySize(int unit) {
         try {
-            return getTotaleSpace(XMLPrefsManager.get(File.class, XMLPrefsManager.Behavior.external_storage_path), unit);
+            return getTotaleSpace(XMLPrefsManager.get(File.class, Behavior.external_storage_path), unit);
         } catch (Exception e) {
             return -1;
         }
@@ -302,11 +388,30 @@ public class Tuils {
         return spannableString;
     }
 
+    public static SpannableString span(int bgColor, int foreColor, String text) {
+        SpannableString spannableString = new SpannableString(text);
+        spannableString.setSpan(new BackgroundColorSpan(bgColor), 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        spannableString.setSpan(new ForegroundColorSpan(foreColor), 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        return spannableString;
+    }
+
+    public static int span(int bgColor, SpannableString text, String section, int fromIndex) {
+        int index = text.toString().indexOf(section, fromIndex);
+        if(index == -1) return index;
+
+        text.setSpan(new BackgroundColorSpan(bgColor), index, index + section.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+
+        return index + section.length();
+    }
+
     public static int convertSpToPixels(float sp, Context context) {
         return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, context.getResources().getDisplayMetrics());
     }
 
     public static void delete(File dir) {
+        File[] files = dir.listFiles();
+        if(files == null) return;
+
         for(File f : dir.listFiles()) {
             if(f.isDirectory()) delete(f);
             f.delete();
@@ -314,6 +419,16 @@ public class Tuils {
         dir.delete();
     }
 
+    public static void deleteContent(File dir) {
+        File[] files = dir.listFiles();
+        if(files == null) return;
+
+        for(File f : dir.listFiles()) {
+            if(f.isDirectory()) delete(f);
+            f.delete();
+        }
+    }
+
     public static boolean insertOld(File oldFile) {
         if(oldFile == null || !oldFile.exists()) return false;
 
@@ -369,7 +484,7 @@ public class Tuils {
     }
 
     public static void sendOutput(int color, Context context, CharSequence s) {
-        sendOutput(color, context, s, -1);
+        sendOutput(color, context, s, TerminalManager.CATEGORY_GENERAL);
     }
 
     public static void sendOutput(Context context, CharSequence s, int type) {
@@ -448,7 +563,7 @@ public class Tuils {
     }
 
     private static String getNicePath(String filePath) {
-        String home = XMLPrefsManager.get(File.class, XMLPrefsManager.Behavior.home_path).getAbsolutePath();
+        String home = XMLPrefsManager.get(File.class, Behavior.home_path).getAbsolutePath();
 
         if(filePath.equals(home)) {
             return "~";
@@ -495,17 +610,17 @@ public class Tuils {
     static Pattern pu = Pattern.compile("%u", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
     static Pattern pp = Pattern.compile("%p", Pattern.CASE_INSENSITIVE | Pattern.LITERAL);
     public static String getHint(String currentPath) {
-        if(!XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_session_info)) return null;
+        if(!XMLPrefsManager.getBoolean(Ui.show_session_info)) return null;
 
-        String format = XMLPrefsManager.get(XMLPrefsManager.Behavior.session_info_format);
+        String format = XMLPrefsManager.get(Behavior.session_info_format);
         if(format.length() == 0) return null;
 
-        String deviceName = XMLPrefsManager.get(XMLPrefsManager.Ui.deviceName);
+        String deviceName = XMLPrefsManager.get(Ui.deviceName);
         if(deviceName == null || deviceName.length() == 0) {
             deviceName = Build.DEVICE;
         }
 
-        String username = XMLPrefsManager.get(XMLPrefsManager.Ui.username);
+        String username = XMLPrefsManager.get(Ui.username);
         if(username == null) username = Tuils.EMPTYSTRING;
 
         format = pd.matcher(format).replaceAll(Matcher.quoteReplacement(deviceName));
@@ -677,7 +792,7 @@ public class Tuils {
         return true;
     }
 
-    public static boolean isNumber(String s) {
+    public static boolean isPhoneNumber(String s) {
         if(s == null) {
             return false;
         }
@@ -692,6 +807,23 @@ public class Tuils {
         return true;
     }
 
+//    return -1 if only digit
+    public static char firstNonDigit(String s) {
+        if(s == null) {
+            return 0;
+        }
+
+        char[] chars = s.toCharArray();
+
+        for (char c : chars) {
+            if (!Character.isDigit(c)) {
+                return c;
+            }
+        }
+
+        return 0;
+    }
+
     public static Intent openFile(File url) {
         Uri u = Uri.fromFile(url);
         Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
@@ -817,25 +949,22 @@ public class Tuils {
         return Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
     }
 
-    private static final int FILEUPDATE_DELAY = 300;
+    private static final int FILEUPDATE_DELAY = 75;
     private static File folder = null;
     public static File getFolder() {
         if(folder != null) return folder;
 
-        final File tuiFolder = Tuils.getTuiFolder();
-
         while (true) {
-            if (tuiFolder != null && (tuiFolder.isDirectory() || tuiFolder.mkdir())) {
-                break;
+            File tuiFolder = Tuils.getTuiFolder();
+            if(tuiFolder != null && ((tuiFolder.exists() && tuiFolder.isDirectory()) || tuiFolder.mkdir())) {
+                folder = tuiFolder;
+                return folder;
             }
 
             try {
                 Thread.sleep(FILEUPDATE_DELAY);
             } catch (InterruptedException e) {}
         }
-
-        folder = tuiFolder;
-        return folder;
     }
 
     public static int alphabeticCompare(String s1, String s2) {
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
index 1dfb5f87162194e3d70da4a0474a19371c2d4a01..ce6380abcff602f53462cc29d0aadbc481429854 100644
--- a/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/OnBatteryUpdate.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/OnBatteryUpdate.java
@@ -7,4 +7,6 @@ package ohi.andre.consolelauncher.tuils.interfaces;
 public interface OnBatteryUpdate {
 
     void update(float percentage);
+    void onCharging();
+    void onNotCharging();
 }
diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/Outputable.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/Outputable.java
index dd41e2af3383b394eab94e5aad1203a2378f770e..1742d62dceb4f7f1708f95695bda17e9ac7079b3 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/Outputable.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/Outputable.java
@@ -7,4 +7,5 @@ public interface Outputable {
     void onOutput(CharSequence output, int category);
     void onOutput(int color, CharSequence output);
     void onOutput(CharSequence output);
+    void dispose();
 }
diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/libsuperuser/ShellHolder.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/libsuperuser/ShellHolder.java
index ef8b1dcf44f1f03117956fbc2f4c1129889db3bf..215332861a39d2edd87517f6344a0a0404689f76 100644
--- a/app/src/main/java/ohi/andre/consolelauncher/tuils/libsuperuser/ShellHolder.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/libsuperuser/ShellHolder.java
@@ -2,7 +2,8 @@ package ohi.andre.consolelauncher.tuils.libsuperuser;
 
 import java.io.File;
 
-import ohi.andre.consolelauncher.managers.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.XMLPrefsManager;
+import ohi.andre.consolelauncher.managers.xml.options.Behavior;
 import ohi.andre.consolelauncher.tuils.interfaces.Outputable;
 
 /**
@@ -32,7 +33,7 @@ public class ShellHolder {
                     }
                 })
                 .open();
-        interactive.addCommand("cd " + XMLPrefsManager.get(File.class, XMLPrefsManager.Behavior.home_path));
+        interactive.addCommand("cd " + XMLPrefsManager.get(File.class, Behavior.home_path));
         return interactive;
     }
 }
diff --git a/app/src/main/res/layout/about_device_view.xml b/app/src/main/res/layout/about_device_view.xml
index 3d440497637d2178d1f594f26934fc67897e0ec4..feec5874d14c8d8512206cf9929d47bdb1e82625 100755
--- a/app/src/main/res/layout/about_device_view.xml
+++ b/app/src/main/res/layout/about_device_view.xml
@@ -24,4 +24,8 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content" />
 
+    <TextView android:id="@+id/tv5"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+
 </LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 67ee18d107c9a7c2b8546ba4b33d85cabe5d07cc..2241b0b9bb5baf8bd1ccc198b98f8c1ac4715d3a 100755
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -8,13 +8,17 @@
     <string name="output_about">Francesco Andreuzzi (Italy)\n\t-> Programmer
         \n\nLuke Winward (USA)\n\t-> Idea and design
         \n\nAlexander King (Australia)\n\t-> t-ui theme website and db management</string>
-    <string name="output_refresh">Refresh: apps, alias, music, contacts</string>
+    <string name="output_refresh">Refresh: apps, alias, music, contacts, rss feeds</string>
     <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 in the "t-ui" folder</string>
     <string name="admin_permission">Lock the screen on double tap</string>
 
+    <!-- regex -->
+    <string name="regex_not_found">Couldn\'t find a Regex with this ID</string>
+    <string name="regex_exists">An other Regex is already using this ID</string>
+
     <!-- theme -->
     <string name="theme_not_found">Theme not found</string>
     <string name="theme_invalid">Invalid theme</string>
@@ -70,7 +74,6 @@
     <string name="output_nopermissions">You didn\'t grant the permission</string>
     <string name="output_waitingpermission">Waiting permission</string>
     <string name="output_problemcamera">There was a problem while connecting to your device camera</string>
-    <string name="output_numberformat">Wrong number format</string>
     <string name="output_invalidarg">Invalid argument</string>
     <string name="output_lessarg">Less arguments than expected</string>
     <string name="invalid_integer">Invalid integer</string>
@@ -82,6 +85,13 @@
     <string name="output_groupnotfound">Group not found</string>
     <string name="output_groupexists">This group already exists</string>
     <string name="output_groupspace">Spaces are not allowed inside group names</string>
+    <string name="output_notification_error">The notification service couldn\'t be started:</string>
+
+    <!-- rss -->
+    <string name="rss_not_found">Invalid ID: no RSS feed found</string>
+    <string name="id_already">This ID has already been used</string>
+    <string name="id_notfound">Invalid ID</string>
+
 
     <!-- alias -->
     <string name="output_aliasnotfound">Alias not found:</string>
@@ -92,14 +102,14 @@
 
     <!-- tuixt -->
     <string name="help_tuixt_help">Print the list of commands, or info about a command
-        \nUsage:
+        \n\nUsage:
         \nhelp [command]
         \n\nExample:
-        \nhelp exit
+        \n$ help exit
     </string>
     <string name="help_tuixt_exit">Exit from tuixt</string>
     <string name="help_tuixt_save">Save changes</string>
-    <string name="tuixt_back_pressed">You pressed back key</string>
+    <string name="tuixt_back_pressed">You pressed the back key</string>
     <string name="tuixt_saved">Saved</string>
     <string name="tuixt_reading">Reading</string>
     <string name="tuixt_label">TUIXT</string>
@@ -118,7 +128,7 @@
     <string name="output_musicdisabled">enable_music is false!</string>
 
     <!-- command/args -->
-    <string name="output_commandnotfound">Command not found.\nTry to use \">>help\" or \">>tutorial\"</string>
+    <string name="output_commandnotfound">Command not found.\nTry to use \"$ help\" or \"$ tutorial\"</string>
     <string name="output_invalid_param">Invalid option:</string>
 
     <!-- flash -->
@@ -127,7 +137,7 @@
     <string name="output_flashlightnotavailable">Your device doesn\'t support flashlight</string>
 
     <!-- status -->
-    <string name="battery_charge">Battery charge:</string>
+    <string name="battery_charge">Battery:</string>
     <string name="mobile_data">Mobile data:</string>
     <string name="wifi">WiFi:</string>
 
@@ -139,16 +149,12 @@
 
 
     <string name="help_airplane">Toggle airplane mode</string>
-    <string name="help_alias">Manage your aliases
-        \n\nUsage:
-        \n-add [aliasName] [alias content] -> add a new alias
+    <string name="help_alias">-add [aliasName] [alias content] -> add a new alias
         \n-rm [aliasName] -> remove an existing alias
         \n-ls -> list your aliases
         \n-file -> open alias.xml
     </string>
-    <string name="help_apps">Manage your apps
-        \n\nUsage:
-        \n-ls -> list your apps
+    <string name="help_apps">-ls -> list your apps
         \n-lsh -> list your hidden apps
         \n-show [appName] -> re-show an hidden app
         \n-hide [appName] -> hide an app
@@ -158,7 +164,7 @@
         \n-default_app [index] [appName or most_used or null] -> set the default_app at the specified index
         \n-frc [appName] -> force t-ui to launch an app
         \n-file -> open apps.xml
-        \n-refresh [appName] -> refresh the \"launched_times\" value of the given app to 0
+        \n-reset [appName] -> reset the \"launched_times\" value of the given app to 0
         \n-mkgp [groupName] -> create a new group with the given name
         \n-rmgp [groupName] -> delete the group with the given name
         \n-gpcolor [groupName] [color] -> set the color for the given group
@@ -170,36 +176,36 @@
     <string name="help_clear">Clear the screen</string>
     <string name="help_calc" formatted="false">Perform basic operations (+ - * / % ^ sqrt)
         \nExample:
-        \n\n>>calc 4+2-5
+        \n\n$ calc 4+2-5
         \n1
-        \n\n>>calc 2 ^ (2*2)
+        \n\n$ calc 2 ^ (2*2)
         \n16
-        \n\n>>calc sqrt25
+        \n\n$ calc sqrt25
         \n5
     </string>
-    <string name="help_call">Make a call
-        \nUsage: call [number] OR [contactName]
+    <string name="help_call">Call someone
+        \n\nUsage:
+        \n$ call [number] OR [contactName]
     </string>
-    <string name="help_config">Usage:
-        \n-set [option] [value] -> set the value of an option
+    <string name="help_config">-set [option] [value] -> set the value of an option
+        \n-append [option] [value] -> append the given string to the value of the selected option
         \n-file [file] -> open a config file
         \n-get [option] -> get the value of an option
         \n-reset [option] -> reset the value of an option
         \n-apply [file] -> move a file to the t-ui directory
+        \n-tutorial -> open the tutorial page
     </string>
     <string name="help_data">Toggle mobile data</string>
-    <string name="help_devutils">Usage:
-        \nnotify [title] [text]</string>
+    <string name="help_devutils">There\'s nothing interesting there</string>
     <string name="help_donate">Offer a coffee to the developer (PayPal only)</string>
     <string name="help_flash">Toggle the flashlight</string>
-    <string name="help_help">Print a list of the available commands, or info about a command
-        \nUsage:
-        \n>>help [command]
+    <string name="help_help">Print the available commands, or info about a command
+        \n\nUsage:
+        \n$ help [command]
     </string>
-    <string name="help_music">Usage:
-        \n-next -> play the next song in the queue
-        \n-previous -> play the previous song in the queue
-        \n-play -> play/pause
+    <string name="help_music">-next -> play the next song
+        \n-previous -> play the previous song
+        \n-play -> play/pause the player
         \n-stop -> stop the player
         \n-ls -> list your tracks
         \n-select [song] -> play the selected song
@@ -207,23 +213,21 @@
         \n-seekto [seconds] -> seek to the selected part of the current song</string>
     <string name="help_rate">Leave a feedback on the Play Store page</string>
     <string name="help_refresh">Refresh apps, alias, music, contacts</string>
+    <string name="help_regex">-add [ID] [regex] -> add a new regex with the given ID
+        \n-rm [ID] -> remove the regex with the given ID
+        \n-test [ID] [string] -> test the corresponding regex over the given string</string>
     <string name="help_restart">Restart t-ui and load modified values</string>
-    <string name="help_search">Search something somewhere
-        \n\nUsage:
-        \n-gg [search this...] -> Google Search
+    <string name="help_search">-gg [search this...] -> Google Search
         \n-ps [search this...] -> Google Play Store
         \n-file [search this...] -> Files
         \n-yt [search this...] -> YouTube
         \n-dd [search this...] -> DuckDuck Go
     </string>
-    <string name="help_share">Share a file
-        \nUsage:
-        \n>>share [pathToFile]
+    <string name="help_share">$ share [pathToFile]
     </string>
     <string name="help_shellcommands">Print the commands in /system/bin and /system/xbin</string>
     <string name="help_status">Get info about battery charge, wifi status and mobile data</string>
-    <string name="help_theme">Usage:
-        \n-apply [theme] -> apply the selected theme (case sensitive). require internet connection. may take some seconds
+    <string name="help_theme">-apply [theme] -> apply the selected theme (case sensitive). require internet connection. may take some seconds
         \n-view -> view the available themes
         \n-create -> create a new theme
         \n-old -> re-apply the theme that was replaced by the current one</string>
@@ -231,12 +235,10 @@
         \n\nUsage:
         \n$ time [index] (index means the index of the desired time_format</string>
     <string name="help_tuixt">Open the text editor.
-        \nUsage:
-        \n>>tuixt [textFile]
+        \n\nUsage:
+        \n$ tuixt [textFile]
     </string>
-    <string name="help_tui">
-        Usage:
-        \n-rm -> remove t-ui
+    <string name="help_tui">-rm -> uninstall t-ui
         \n-about -> show info about the developer and the current version</string>
         \n-reset -> removes the t-ui folder and resets default settings (restart required)
         \n-twitter -> show t-ui Twitter page
@@ -245,24 +247,26 @@
         \n-folder -> print the path of the t-ui folder
     <string name="help_tutorial">Open the tutorial page on GitHub</string>
     <string name="help_uninstall">Uninstall an application
-        \nUsage:
-        \n>>uninstall [appName]
+        \n\nUsage:
+        \n$ uninstall [appName]
     </string>
     <string name="help_wifi">Toggle wifi</string>
     <string name="help_sms">Send an SMS.
-        \nUsage:
-        \n>>sms [contactName] OR [number]
-        \n>>[text]
+        \n\nUsage:
+        \n$ sms [contactName] OR [number]
+        \n$ [text]
     </string>
-    <string name="help_vibrate">Vibrate your device.
-        \nUsage:
-        \n>>vibrate [milliseconds]</string>
-    <string name="help_beep">Emit a beep.
-        \nUsage:
-        \n>>beep</string>
-    <string name="help_notifications">Manage your notifications.
+    <string name="help_vibrate">Make your device vibrate.
         \n\nUsage:
-        \n-inc [appName] -> include an application
+        \n$ vibrate [milliseconds]
+        \n$ vibrate [pattern: wait, vibrate, wait, vibrate, wait, ...]
+        \n\nExample:
+        \n$ vibrate 300
+        \n$ vibrate 0,300,500,300</string>
+    <string name="help_beep">Emit a \"beep\".
+        \n\nUsage:
+        \n$ beep</string>
+    <string name="help_notifications">-inc [appName] -> include an application
         \n-exc [appName] -> exclude an application
         \n-clr [color] [appName] -> set the color to be used for the application
         \n-file -> open notifications.xml
@@ -270,21 +274,36 @@
         \n-text_filter [ID] [regex] -> set a filter over notifications text with a given ID
         \n-apply_filter [ID] [appName] -> apply a filter (or a group of filters) to a single application
         \n-access -> show the system settings page dedicated to the Notification Access</string>
-    <string name="help_location">Show the current location</string>
-    <string name="help_cntcts">Manage your contacts.
-        \n\nUsage:
-        \n-ls -> list your contacts
+    <string name="help_location">Show your current location</string>
+    <string name="help_cntcts">-ls -> list your contacts
         \n-l [contactName] -> show details about a contact
         \n-add -> create a new contact
         \n-edit [contactName] -> edit an existing contact
         \n-rm [contactName] -> remove a contact</string>
-    <string name="help_exit">Close T-UI and reset launcher preferences</string>
+    <string name="help_exit">Close T-UI and reset the default launcher</string>
+    <string name="help_rss">-add [ID] [update_time_in_seconds] [url] -> add a new RSS feed. t-ui will try to get new contents every [update_time_in_seconds] seconds
+        \n-rm [ID] -> remove this RSS feed
+        \n-ls -> list your RSS feeds
+        \n-l [ID] -> show the whole content of the corresponding RSS feed
+        \n-show [ID] [boolean] -> toggle the [show] property of the given saved RSS feed
+        \n-time [ID] [update_time_in_seconds] -> set the update time of the corresponding RSS feed
+        \n-format [ID] [format] -> set the format of the corresponding RSS feed ([format] can be both a string or the ID of an existing format)
+        \n-color [ID] [color] -> set the base color of the corresponding RSS feed
+        \n-wifi_only [ID] [boolean] -> if [boolean] is true, the corresponding feed will be updated only if your device is connected to a WiFi network
+        \n-last_check [ID] -> show the last time t-ui checked this RSS feed
+        \n-frc [ID] -> update the corresponding RSS feed and eventually show new updates
+        \n-info [ID] -> show info about the corresponding RSS feed settings
+        \n-include_if_matches [ID] [regex] -> if the given regex matches on an RSS feed item, it will be shown ([regex] can be both a string or the ID of a regex saved inside regex.xml)
+        \n-exclude_if_matches [ID] [regex] -> if the given regex matches on an RSS feed item, it won\'t be shown ([regex] can be both a string or the ID of a regex saved inside regex.xml)
+        \n-add_format [ID] [format] -> create a new format that you will be able to use for more than one RSS feed
+        \n-rm_format [ID] [format] -> remove an existing format
+        \n-file -> open the file RSS.xml</string>
 
     <!-- linux -->
     <string name="help_ctrlc">Interrupt the current shell process and create a new one</string>
     <string name="help_open">Open a file
         \nUsage:
-        \n>>open [pathToFile]
+        \n$ open [pathToFile]
     </string>
 
 </resources>