diff --git a/app/build.gradle b/app/build.gradle
index 4198e72e17d3b1c0c2d15e3addc3d44656741e87..3c3f43a1553b3f33979f663a23c044d5b199ab16 100755
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -10,8 +10,8 @@ android {
         minSdkVersion 8
         targetSdkVersion 23
 
-        versionCode 104
-        versionName "6.0b"
+        versionCode 108
+        versionName "6.0d"
     }
 
     buildTypes {
@@ -21,6 +21,11 @@ android {
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
             zipAlignEnabled true
         }
+        debug {
+            minifyEnabled false
+            shrinkResources false
+            zipAlignEnabled true
+        }
     }
 
     compileOptions {
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index 0f65de5ee6d73bdbd805a2062f4e4e67530d5c2d..414c980e5d8c251f319f13848beb6a0917ede715 100755
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -2,11 +2,10 @@
 -keep public abstract class ohi.andre.consolelauncher.commands.main.generals.* { public *; }
 -keep public class ohi.andre.consolelauncher.commands.tuixt.raw.* { public *; }
 
--dontwarn ohi.andre.consolelauncher.commands.main.raw.**
+-keep public class ohi.andre.consolelauncher.managers.notifications.NotificationService
+-keep public class ohi.andre.consolelauncher.tuils.KeeperService
 
--keepclassmembers class * extends com.stephentuso.welcome.WelcomeActivity {
-    public static java.lang.String welcomeKey();
-}
+-dontwarn ohi.andre.consolelauncher.commands.main.raw.**
 
 -dontwarn javax.annotation.**
 -dontwarn javax.inject.**
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index a95b27fc49e2e88212bc05a16dad22ba6b4bde00..caefc4f77430f1e641ae43c47a422ba334241191 100755
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -29,8 +29,9 @@
     <uses-permission android:name="android.permission.VIBRATE" />
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
 
-
+    <permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
     <permission
         android:name="android.permission.FLASHLIGHT"
         android:description="@string/help_flash"
@@ -71,7 +72,7 @@
             android:name=".LauncherActivity"
             android:configChanges="keyboardHidden|orientation|screenSize|keyboard|navigation"
 
-            android:launchMode="singleInstance"
+            android:launchMode="singleTask"
             android:clearTaskOnLaunch="true"
             android:stateNotNeeded="true"
             android:resumeWhilePausing="true"
@@ -175,6 +176,14 @@
                     android:host="*"
                     android:pathPattern=".*\\.cfg"
                     android:scheme="file" />
+                <data
+                    android:host="*"
+                    android:pathPattern=".*\\.txt"
+                    android:scheme="file" />
+                <data
+                    android:host="*"
+                    android:pathPattern=".*\\.xml"
+                    android:scheme="file" />
             </intent-filter>
 
         </activity>
diff --git a/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java b/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java
index 90e91360e0ef12a6dfa21ffccefad9872706e0cf..83208301da35d7af1b2603e707cfdf970b908b10 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/LauncherActivity.java
@@ -1,9 +1,7 @@
 package ohi.andre.consolelauncher;
 
 import android.Manifest;
-import android.app.admin.DevicePolicyManager;
 import android.content.BroadcastReceiver;
-import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
@@ -18,7 +16,6 @@ import android.support.v4.app.ActivityCompat;
 import android.support.v4.content.ContextCompat;
 import android.support.v4.content.LocalBroadcastManager;
 import android.support.v7.app.AppCompatActivity;
-import android.util.Log;
 import android.view.ContextMenu;
 import android.view.KeyEvent;
 import android.view.MenuItem;
@@ -30,7 +27,6 @@ import android.widget.Toast;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
-import java.io.IOException;
 import java.io.PrintStream;
 
 import ohi.andre.consolelauncher.commands.main.MainPack;
@@ -43,13 +39,13 @@ import ohi.andre.consolelauncher.managers.notifications.NotificationService;
 import ohi.andre.consolelauncher.managers.suggestions.SuggestionsManager;
 import ohi.andre.consolelauncher.tuils.Assist;
 import ohi.andre.consolelauncher.tuils.KeeperService;
-import ohi.andre.consolelauncher.tuils.StoppableThread;
+import ohi.andre.consolelauncher.tuils.TimeManager;
 import ohi.andre.consolelauncher.tuils.Tuils;
 import ohi.andre.consolelauncher.tuils.interfaces.CommandExecuter;
 import ohi.andre.consolelauncher.tuils.interfaces.Inputable;
 import ohi.andre.consolelauncher.tuils.interfaces.Outputable;
 import ohi.andre.consolelauncher.tuils.interfaces.Reloadable;
-import ohi.andre.consolelauncher.tuils.stuff.PolicyReceiver;
+import ohi.andre.consolelauncher.tuils.interfaces.Suggester;
 
 public class LauncherActivity extends AppCompatActivity implements Reloadable {
 
@@ -70,11 +66,7 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable {
 
         @Override
         public String exec(String input, String alias) {
-            try {
-                main.onCommand(input, alias);
-            } catch (NullPointerException e) {
-                e.printStackTrace();
-            }
+            if(main != null) main.onCommand(input, alias);
             return null;
         }
     };
@@ -83,11 +75,7 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable {
 
         @Override
         public void in(String s) {
-            try {
-                ui.setInput(s);
-            } catch (NullPointerException e) {
-                e.printStackTrace();
-            }
+            if(ui != null) ui.setInput(s);
         }
 
         @Override
@@ -114,16 +102,24 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable {
     private Outputable out = new Outputable() {
 
         @Override
-        public void onOutput(String output) {
-            try {
-                ui.setOutput(output, TerminalManager.CATEGORY_OUTPUT);
-            } catch (NullPointerException e) {
-                e.printStackTrace();
-            }
+        public void onOutput(CharSequence output) {
+            if(ui != null) ui.setOutput(output, TerminalManager.CATEGORY_OUTPUT);
+        }
+
+        @Override
+        public void onOutput(CharSequence output, int category) {
+            if(ui != null) ui.setOutput(output, category);
+        }
+    };
+
+    private Suggester sugg = new Suggester() {
+        @Override
+        public void requestUpdate() {
+            if(ui != null) ui.requestSuggestion(Tuils.EMPTYSTRING);
         }
     };
 
-    static final boolean DEBUG = false;
+    static final boolean DEBUG = BuildConfig.BUILD_TYPE.startsWith("debug");
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -149,61 +145,26 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable {
 
     private void finishOnCreate() {
 
-        Thread logger = null;
-        if(DEBUG) {
-            Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
-                @Override
-                public void uncaughtException(Thread t, Throwable e) {
-                    try {
-                        e.printStackTrace(new PrintStream(new FileOutputStream(new File(Tuils.getFolder(), "crash.txt"), true)));
-                    } catch (FileNotFoundException e1) {}
-                }
-            });
-
-            final Thread c = Thread.currentThread();
-            logger = new StoppableThread() {
-
-                FileOutputStream stream;
-                final String newline = "###" + Tuils.NEWLINE;
-
-                @Override
-                public void run() {
-
-                    if(stream == null) {
-                        try {
-                            stream = new FileOutputStream(new File(Tuils.getFolder(), "hang.txt"));
-                        } catch (FileNotFoundException e) {
-                            return;
-                        }
-                    }
-
-                    if(Thread.currentThread().isInterrupted()) return;
-
-                    StackTraceElement[] stack = c.getStackTrace();
-                    for(StackTraceElement s : stack) {
-                        if(s.getClassName().startsWith("ohi.andre.consolelauncher"))
-                            try {
-                                stream.write( (s.getClassName() + " -> " + s.getMethodName() + ": " + s.getLineNumber() + Tuils.NEWLINE).getBytes());
-                            } catch (IOException e) {}
-                    }
-                    try {
-                        stream.write(newline.getBytes());
-                    } catch (IOException e) {}
-
-                    if(Thread.currentThread().isInterrupted()) return;
-
-                    run();
-                }
-            };
-            logger.start();
-        }
+        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
+            @Override
+            public void uncaughtException(Thread t, Throwable e) {
+                Tuils.log(e);
+                try {
+                    e.printStackTrace(new PrintStream(new FileOutputStream(new File(Tuils.getFolder(), "crash.txt"), true)));
+                } catch (FileNotFoundException e1) {}
+            }
+        });
 
         try {
             XMLPrefsManager.create();
+            TimeManager.create();
         } catch (Exception e) {
-            Log.e("andre", "", e);
-//            this.startActivity(new Intent(this, LauncherActivity.class));
-//            this.finish();
+            Tuils.log(Tuils.getStackTrace(e));
+
+            try {
+                e.printStackTrace(new PrintStream(new FileOutputStream(new File(Tuils.getFolder(), "crash.txt"), true)));
+            } catch (FileNotFoundException e1) {}
+
             return;
         }
 
@@ -215,9 +176,6 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable {
             stopService(keeperIntent);
         }
 
-        DevicePolicyManager policy = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
-        ComponentName component = new ComponentName(this, PolicyReceiver.class);
-
         fullscreen = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.fullscreen);
 
         boolean useSystemWP = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.system_wallpaper);
@@ -252,8 +210,8 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable {
         setContentView(R.layout.base_view);
 
         ViewGroup mainView = (ViewGroup) findViewById(R.id.mainview);
-        main = new MainManager(this, in, out, policy, component);
-        ui = new UIManager(main.getMainPack(), this, mainView, ex, policy, component, main.getMainPack());
+        main = new MainManager(this, in, out, sugg);
+        ui = new UIManager(main.getMainPack(), this, mainView, ex, main.getMainPack());
         main.setRedirectionListener(ui.buildRedirectionListener());
 
         in.in(Tuils.EMPTYSTRING);
@@ -273,20 +231,20 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable {
         }
 
         System.gc();
-
-        if(logger != null) {
-            logger.interrupt();
-            logger = null;
-        }
     }
 
     @Override
     protected void onStart() {
         super.onStart();
 
-        if (ui != null) {
-            ui.onStart(openKeyboardOnStart);
-        }
+        if (ui != null) ui.onStart(openKeyboardOnStart);
+    }
+
+    @Override
+    protected void onRestart() {
+        super.onRestart();
+
+        sugg.requestUpdate();
     }
 
     @Override
@@ -303,8 +261,10 @@ public class LauncherActivity extends AppCompatActivity implements Reloadable {
     protected void onDestroy() {
         super.onDestroy();
 
-        stopService(new Intent(this, KeeperService.class));
-        stopService(new Intent(this, NotificationService.class));
+        try {
+            stopService(new Intent(this, KeeperService.class));
+            stopService(new Intent(this, NotificationService.class));
+        } catch (NoClassDefFoundError e) {}
         LocalBroadcastManager.getInstance(this).unregisterReceiver(onNotice);
 
         overridePendingTransition(0,0);
diff --git a/app/src/main/java/ohi/andre/consolelauncher/MainManager.java b/app/src/main/java/ohi/andre/consolelauncher/MainManager.java
index f8a6bfae005036d666ec42bce281e8eae94351e7..1a69a4d007e759eb6c486f83bf2d5d919de5efa0 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/MainManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/MainManager.java
@@ -1,13 +1,14 @@
 package ohi.andre.consolelauncher;
 
-import android.app.admin.DevicePolicyManager;
-import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.os.Handler;
-import android.os.Looper;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.style.ForegroundColorSpan;
 import android.util.Log;
 
+import java.util.regex.Pattern;
+
 import ohi.andre.consolelauncher.commands.Command;
 import ohi.andre.consolelauncher.commands.CommandGroup;
 import ohi.andre.consolelauncher.commands.CommandTuils;
@@ -17,16 +18,19 @@ 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.MusicManager;
+import ohi.andre.consolelauncher.managers.ShellManager;
+import ohi.andre.consolelauncher.managers.TerminalManager;
 import ohi.andre.consolelauncher.managers.XMLPrefsManager;
-import ohi.andre.consolelauncher.tuils.ShellUtils;
+import ohi.andre.consolelauncher.managers.music.MusicManager;
 import ohi.andre.consolelauncher.tuils.StoppableThread;
+import ohi.andre.consolelauncher.tuils.TimeManager;
 import ohi.andre.consolelauncher.tuils.Tuils;
 import ohi.andre.consolelauncher.tuils.interfaces.CommandExecuter;
 import ohi.andre.consolelauncher.tuils.interfaces.Inputable;
 import ohi.andre.consolelauncher.tuils.interfaces.OnRedirectionListener;
 import ohi.andre.consolelauncher.tuils.interfaces.Outputable;
 import ohi.andre.consolelauncher.tuils.interfaces.Redirectator;
+import ohi.andre.consolelauncher.tuils.interfaces.Suggester;
 
 /*Copyright Francesco Andreuzzi
 
@@ -84,6 +88,7 @@ public class MainManager {
             new SystemCommandTrigger()
     };
     private MainPack mainPack;
+    private ShellManager shell;
 
     private Context mContext;
 
@@ -93,28 +98,7 @@ public class MainManager {
     private boolean showAliasValue;
     private boolean showAppHistory;
 
-    private Handler handler = new Handler();
-
-    private Thread thread;
-    private boolean busy = false;
-    private boolean ctrlced = false;
-    private void busy() {
-        busy = true;
-
-//        i do this because i don't want to change the hint every single time (users would complain)
-        handler.postDelayed(new Runnable() {
-            @Override
-            public void run() {
-                if(busy) in.changeHint(mContext.getString(R.string.busy_hint));
-            }
-        }, 650);
-    }
-    private void notBusy() {
-        busy = false;
-        in.resetHint();
-    }
-
-    protected MainManager(LauncherActivity c, Inputable i, Outputable o, DevicePolicyManager devicePolicyManager, ComponentName componentName) {
+    protected MainManager(LauncherActivity c, Inputable i, Outputable o, Suggester sugg) {
         mContext = c;
 
         in = i;
@@ -140,27 +124,16 @@ public class MainManager {
 
         MusicManager music = new MusicManager(mContext, out);
 
-        AppsManager appsMgr = new AppsManager(c, out);
+        AppsManager appsMgr = new AppsManager(c, out, sugg);
         AliasManager aliasManager = new AliasManager();
 
-        mainPack = new MainPack(mContext, group, aliasManager, appsMgr, music, cont, devicePolicyManager, componentName, c, executer, out, redirectator);
+        shell = new ShellManager(out);
+
+        mainPack = new MainPack(mContext, group, aliasManager, appsMgr, music, cont, c, executer, out, redirectator, shell);
     }
 
 //    command manager
     public void onCommand(String input, String alias) {
-        if(busy) {
-            if(input.equalsIgnoreCase("ctrlc")) {
-                thread.interrupt();
-
-                ctrlced = true;
-
-                notBusy();
-                return;
-            }
-
-            out.onOutput(mContext.getString(R.string.busy));
-            return;
-        }
 
         input = Tuils.removeUnncesarySpaces(input);
 
@@ -200,7 +173,6 @@ public class MainManager {
         redirectator.cleanup();
     }
 
-    //    dispose
     public void dispose() {
         mainPack.dispose();
     }
@@ -231,52 +203,17 @@ public class MainManager {
         }
     }
 
-    //    this must be the last trigger
     private class SystemCommandTrigger implements CmdTrigger {
 
-        final int COMMAND_NOTFOUND = 127;
-
         @Override
         public boolean trigger(final ExecutePack info, final String input) throws Exception {
-
-//            this is the last trigger, it has to say "command not found"
-
-            final String cmd = input;
-            final boolean useSU = false;
-
-            thread = new StoppableThread() {
+            new Thread() {
                 @Override
                 public void run() {
-                    super.run();
-
-                    busy();
-
-                    if(Thread.interrupted()) return;
-                    ShellUtils.CommandResult result = ShellUtils.execCommand(new String[] {cmd}, useSU, mainPack.currentDirectory.getAbsolutePath(), out);
-                    if(Thread.interrupted()) return;
-
-                    if(ctrlced) {
-                        ctrlced = false;
-                        return;
-                    }
-
-                    if (result == null || result.result == COMMAND_NOTFOUND || result.result == -1) {
-                        out.onOutput(mContext.getString(R.string.output_commandnotfound));
-                    } else {
-                        String output = result.toString();
-                        if(output != null) {
-                            output = output.trim();
-                            if(output.length() == 0 && result.result > 0) {
-                                output = mainPack.res.getString(R.string.output_commandexitvalue) + Tuils.SPACE + result.result;
-                            }
-                        }
-                        out.onOutput(output);
-                    }
-
-                    notBusy();
-                }
-            };
-            thread.start();
+                    shell.cmd(input, true);
+                    ((MainPack) info).currentDirectory = shell.currentDir();
+                };
+            }.start();
 
             return true;
         }
@@ -284,24 +221,48 @@ public class MainManager {
 
     private class AppTrigger implements CmdTrigger {
 
+        String appFormat;
+        int timeColor;
+        int outputColor;
+
+        Pattern pa = Pattern.compile("%a", Pattern.CASE_INSENSITIVE);
+        Pattern pp = Pattern.compile("%p", Pattern.CASE_INSENSITIVE);
+        Pattern pl = Pattern.compile("%l", Pattern.CASE_INSENSITIVE);
+        Pattern pn = Pattern.compile("%n", Pattern.CASE_INSENSITIVE);
+
         @Override
         public boolean trigger(ExecutePack info, String input) {
-            String packageName = mainPack.appsManager.findPackage(input, AppsManager.SHOWN_APPS);
-            if (packageName == null) {
+            AppsManager.LaunchInfo i = mainPack.appsManager.findLaunchInfoWithLabel(input, AppsManager.SHOWN_APPS);
+            if (i == null) {
                 return false;
             }
 
-            Intent intent = mainPack.appsManager.getIntent(packageName);
+            Intent intent = mainPack.appsManager.getIntent(i);
             if (intent == null) {
                 return false;
             }
 
-            if(showAppHistory) out.onOutput("-->" + Tuils.SPACE + intent.getComponent().getClassName());
+            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);
+                }
+
+                String a = new String(appFormat);
+                a = pa.matcher(a).replaceAll(intent.getComponent().getClassName());
+                a = pp.matcher(a).replaceAll(intent.getComponent().getPackageName());
+                a = pl.matcher(a).replaceAll(i.publicLabel);
+                a = pn.matcher(a).replaceAll(Tuils.NEWLINE);
 
-//            if(intent.getBooleanExtra("forResult", false)) ((Activity) mContext).startActivityForResult(intent, 0);
-//            else
-                mContext.startActivity(intent);
+                SpannableString text = new SpannableString(a);
+                text.setSpan(new ForegroundColorSpan(outputColor), 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+                CharSequence s = TimeManager.replace(text, timeColor);
+
+                out.onOutput(s, TerminalManager.CATEGORY_GENERAL);
+            }
 
+            mContext.startActivity(intent);
             return true;
         }
     }
@@ -312,15 +273,12 @@ public class MainManager {
         public boolean trigger(final ExecutePack info, final String input) throws Exception {
 
             final boolean[] returnValue = new boolean[1];
-            thread = new StoppableThread() {
+
+            new StoppableThread() {
                 @Override
                 public void run() {
                     super.run();
 
-                    busy();
-
-                    Looper.prepare();
-
                     mainPack.lastCommand = input;
 
                     try {
@@ -331,12 +289,10 @@ public class MainManager {
                             returnValue.notify();
                         }
 
-                        if (returnValue[0]) {
-                            if(Thread.interrupted()) return;
+                        if (command != null) {
                             String output = command.exec(mContext.getResources(), info);
-                            if(Thread.interrupted()) return;
 
-                            if(output != null && !ctrlced) {
+                            if(output != null) {
                                 out.onOutput(output);
                             }
                         }
@@ -344,12 +300,8 @@ public class MainManager {
                         out.onOutput(e.toString());
                         Log.e("andre", "", e);
                     }
-
-                    notBusy();
                 }
-            };
-
-            thread.start();
+            }.start();
 
             synchronized (returnValue) {
                 returnValue.wait();
diff --git a/app/src/main/java/ohi/andre/consolelauncher/UIManager.java b/app/src/main/java/ohi/andre/consolelauncher/UIManager.java
index 38d3974e04ac997be1cf62fdef06639fe2d9b919..e231bdda47ae84a9ab7841601dbaa8d46c87ec8d 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/UIManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/UIManager.java
@@ -5,11 +5,11 @@ import android.app.ActivityManager;
 import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.Intent;
 import android.graphics.Typeface;
 import android.os.Handler;
 import android.text.Editable;
 import android.text.TextWatcher;
-import android.text.format.Time;
 import android.view.GestureDetector;
 import android.view.GestureDetector.OnDoubleTapListener;
 import android.view.Gravity;
@@ -41,17 +41,18 @@ import ohi.andre.consolelauncher.managers.suggestions.SuggestionRunnable;
 import ohi.andre.consolelauncher.managers.suggestions.SuggestionsManager;
 import ohi.andre.consolelauncher.tuils.Sequence;
 import ohi.andre.consolelauncher.tuils.StoppableThread;
+import ohi.andre.consolelauncher.tuils.TimeManager;
 import ohi.andre.consolelauncher.tuils.Tuils;
 import ohi.andre.consolelauncher.tuils.interfaces.CommandExecuter;
 import ohi.andre.consolelauncher.tuils.interfaces.OnRedirectionListener;
 import ohi.andre.consolelauncher.tuils.interfaces.SuggestionViewDecorer;
+import ohi.andre.consolelauncher.tuils.stuff.PolicyReceiver;
 import ohi.andre.consolelauncher.tuils.stuff.TrashInterfaces;
 
 public class UIManager implements OnTouchListener {
 
     private final int RAM_DELAY = 3000;
     private final int BATTERY_DELAY = 20 * 1000;
-//    private final int BATTERY_CHARGING_DELAY = 300;
     private final int TIME_DELAY = 1000;
     private final int STORAGE_DELAY = 60 * 1000;
 
@@ -100,27 +101,6 @@ public class UIManager implements OnTouchListener {
         }
     };
 
-//    private Runnable batteryChargingRunnable = new Runnable() {
-//
-//        int[] colors;
-//        int index = 0;
-//
-//        @Override
-//        public void run() {
-//            if(colors == null) {
-//                colors = new int[3];
-//                colors[0] = XMLPrefsManager.getColor(XMLPrefsManager.Theme.battery_color_high);
-//                colors[1] = XMLPrefsManager.getColor(XMLPrefsManager.Theme.battery_color_medium);
-//                colors[2] = XMLPrefsManager.getColor(XMLPrefsManager.Theme.battery_color_low);
-//            }
-//
-//            battery.setTextColor(colors[index++]);
-//            if(index >= colors.length) index = 0;
-//
-//            battery.postDelayed(this, BATTERY_CHARGING_DELAY);
-//        }
-//    };
-
     private final String INT_AV = "%iav";
     private final String INT_TOT = "%itot";
     private final String EXT_AV = "%eav";
@@ -163,6 +143,11 @@ public class UIManager implements OnTouchListener {
                 storagePatterns.add(Pattern.compile(EXT_TOT + "b", Pattern.CASE_INSENSITIVE));
 
                 storagePatterns.add(Pattern.compile("%n", Pattern.CASE_INSENSITIVE));
+
+                storagePatterns.add(Pattern.compile(INT_AV, Pattern.CASE_INSENSITIVE));
+                storagePatterns.add(Pattern.compile(INT_TOT, Pattern.CASE_INSENSITIVE));
+                storagePatterns.add(Pattern.compile(EXT_AV, Pattern.CASE_INSENSITIVE));
+                storagePatterns.add(Pattern.compile(EXT_TOT, Pattern.CASE_INSENSITIVE));
             }
 
             double iav = Tuils.getAvailableInternalMemorySize(Tuils.BYTE);
@@ -200,19 +185,20 @@ public class UIManager implements OnTouchListener {
 
             copy = storagePatterns.get(22).matcher(copy).replaceAll(Tuils.NEWLINE);
 
+            copy = storagePatterns.get(23).matcher(copy).replaceAll(String.valueOf(Tuils.formatSize((long) iav, Tuils.GIGA)));
+            copy = storagePatterns.get(24).matcher(copy).replaceAll(String.valueOf(Tuils.formatSize((long) itot, Tuils.GIGA)));
+            copy = storagePatterns.get(25).matcher(copy).replaceAll(String.valueOf(Tuils.formatSize((long) eav, Tuils.GIGA)));
+            copy = storagePatterns.get(26).matcher(copy).replaceAll(String.valueOf(Tuils.formatSize((long) etot, Tuils.GIGA)));
+
             storage.setText(copy);
             storage.postDelayed(this, STORAGE_DELAY);
         }
     };
 
-    private String timeFormat;
     private Runnable timeRunnable = new Runnable() {
         @Override
         public void run() {
-            Time t = new Time();
-            t.setToNow();
-
-            time.setText(t.format(timeFormat));
+            time.setText(TimeManager.replace("%t0"));
             time.postDelayed(this, TIME_DELAY);
         }
     };
@@ -297,113 +283,17 @@ public class UIManager implements OnTouchListener {
 
     protected TextWatcher textWatcher = new TextWatcher() {
 
-//        int nOfSpace = -1;
-//        String originalText;
-
-        boolean call = true;
-
         @Override
         public void beforeTextChanged(CharSequence s, int start, int count, int after) {
         }
 
         @Override
         public void onTextChanged(CharSequence s, int st, int b, int c) {
-            if (suggestionsView == null || suggestionsManager == null || !showSuggestions || !call) {
-                return;
-            }
-
-//            if(st == s.length() - 1 && b == 0 && c == 1 && s.subSequence(st, s.length()).toString().equals(Tuils.SPACE) && !navigatingWithSpace) {
-//                nOfSpace++;
-//                originalText = s.toString();
-//            } else if(!navigatingWithSpace) {
-//                nOfSpace = -1;
-//                originalText = null;
-//                navigatingWithSpace = false;
-//            }
-//
-//            if(nOfSpace == suggestionsView.getChildCount() + 1) {
-//                nOfSpace = -2;
-//                navigatingWithSpace = false;
-//            }
-//
-//            if(nOfSpace >= 0) {
-//                if(nOfSpace == 1 && suggestionsView.getChildCount() == 1) {
-//                    nOfSpace = -1;
-//                    originalText = null;
-//                    navigatingWithSpace = false;
-//                } else {
-//                    for(int count = 0; count < suggestionsView.getChildCount(); count++) {
-//                        SuggestionsManager.Suggestion suggestion = (SuggestionsManager.Suggestion) suggestionsView.getChildAt(count).getTag(R.id.suggestion_id);
-//                        if(originalText.trim().endsWith(suggestion.text)) {
-//                            nOfSpace = -1;
-//                            originalText = null;
-//                            navigatingWithSpace = false;
-//                            break;
-//                        }
-//                        if(count == suggestionsView.getChildCount() - 1) return;
-//                    }
-//                }
-//            }
-
-            String text = s.toString();
-            int lastSpace = text.lastIndexOf(Tuils.SPACE);
-
-            String lastWord = text.substring(lastSpace != -1 ? lastSpace + 1 : 0);
-            String before = text.substring(0, lastSpace != -1 ? lastSpace + 1 : 0);
-
-            requestSuggestion(before, lastWord);
+            requestSuggestion(s.toString());
         }
 
         @Override
-        public void afterTextChanged(Editable s) {
-//            if(nOfSpace == -2) {
-//                s.replace(0,s.length(),originalText);
-//                originalText = null;
-//                return;
-//            }
-//
-//            if(nOfSpace > 0 && s.length() > 0 && call) {
-//                if(nOfSpace == 1) {
-//                    call = false;
-//                    s.replace(s.length() - 1, s.length(), Tuils.EMPTYSTRING);
-//                    call = true;
-//                }
-//
-//                navigatingWithSpace = true;
-//
-//                call = false;
-//                s.replace(s.length() - 1, s.length(), Tuils.EMPTYSTRING);
-//                call = true;
-//
-////                int count = suggestionsView.getChildCount();
-//                int index = nOfSpace - 1;
-////                if(nOfSpace <= count) {
-////                    index = nOfSpace - 1;
-////                }
-////                else {
-////                    index = nOfSpace % (count + 1) - 1;
-////                }
-//
-//                call = false;
-//                if(index != -1) {
-//                    View view = suggestionsView.getChildAt(index);
-//                    SuggestionsManager.Suggestion suggestion = (SuggestionsManager.Suggestion) view.getTag(R.id.suggestion_id);
-//
-//                    String text = suggestion.getText() + Tuils.SPACE;
-//
-//                    if(originalText.length() < s.length() && suggestion.type == SuggestionsManager.Suggestion.TYPE_PERMANENT) {
-//                        s.replace(originalText.length(), s.length(), text);
-//                    }  else {
-//                        s.replace(0, s.length(), text);
-//                    }
-//                } else {
-//                    Log.e("andre", "4");
-//                    s.replace(0, s.length(), originalText);
-//                    navigatingWithSpace = false;
-//                }
-//                call = true;
-//            }
-        }
+        public void afterTextChanged(Editable s) {}
     };
 
     private View.OnClickListener clickListener = new View.OnClickListener() {
@@ -427,6 +317,19 @@ public class UIManager implements OnTouchListener {
         }
     };
 
+    public void requestSuggestion(String text) {
+        if (suggestionsView == null || suggestionsManager == null || !showSuggestions) {
+            return;
+        }
+
+        int lastSpace = text.lastIndexOf(Tuils.SPACE);
+
+        String lastWord = text.substring(lastSpace != -1 ? lastSpace + 1 : 0);
+        String before = text.substring(0, lastSpace != -1 ? lastSpace + 1 : 0);
+
+        requestSuggestion(before, lastWord);
+    }
+
     private void requestSuggestion(final String before, final String lastWord) {
 
         if (suggestionViewParams == null) {
@@ -435,7 +338,6 @@ public class UIManager implements OnTouchListener {
             suggestionViewParams.gravity = Gravity.CENTER_VERTICAL;
         }
 
-
         if(suggestionRunnable == null) {
             suggestionRunnable = new SuggestionRunnable(skinManager, suggestionsView, suggestionViewParams, (HorizontalScrollView) suggestionsView.getParent());
         }
@@ -520,13 +422,10 @@ public class UIManager implements OnTouchListener {
         lastSuggestionThread.start();
     }
 
-    protected UIManager(ExecutePack info, final Context context, final ViewGroup rootView, final CommandExecuter tri, DevicePolicyManager mgr, ComponentName name,
-                        MainPack mainPack) {
-
-        rootView.setOnTouchListener(this);
+    protected UIManager(ExecutePack info, final Context context, final ViewGroup rootView, final CommandExecuter tri, MainPack mainPack) {
 
-        policy = mgr;
-        component = name;
+        policy = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
+        component = new ComponentName(context, PolicyReceiver.class);
 
         mContext = context;
         this.info = (MainPack) info;
@@ -633,8 +532,8 @@ public class UIManager implements OnTouchListener {
 
             String deviceFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.device_format);
 
-            deviceFormat = USERNAME.matcher(deviceFormat).replaceAll(skinManager.username);
-            deviceFormat = DV.matcher(deviceFormat).replaceAll(skinManager.deviceName);
+            deviceFormat = USERNAME.matcher(deviceFormat).replaceAll(skinManager.username != null ? skinManager.username : "null");
+            deviceFormat = DV.matcher(deviceFormat).replaceAll(skinManager.deviceName != null ? skinManager.deviceName : "null");
             deviceFormat = NEWLINE.matcher(deviceFormat).replaceAll(Tuils.NEWLINE);
 
             device.setText(deviceFormat);
@@ -647,8 +546,6 @@ public class UIManager implements OnTouchListener {
 
         boolean showTime = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_time);
         if(showTime) {
-            timeFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.time_format);
-
             time.setTextColor(skinManager.time_color);
             time.setTextSize(skinManager.getTextSize());
             time.setTypeface(skinManager.systemFont ? Typeface.DEFAULT : lucidaConsole);
@@ -663,15 +560,6 @@ public class UIManager implements OnTouchListener {
             mediumPercentage = XMLPrefsManager.get(int.class, XMLPrefsManager.Behavior.battery_medium);
             lowPercentage = XMLPrefsManager.get(int.class, XMLPrefsManager.Behavior.battery_low);
 
-//            batteryCharging = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.battery_charging_animation);
-//            if(batteryCharging) {
-//                IntentFilter filter = new IntentFilter();
-//                filter.addAction(Intent.ACTION_POWER_CONNECTED);
-//                filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
-//
-//                LocalBroadcastManager.getInstance(context).registerReceiver(new PowerConnectionReceiver(), filter);
-//            }
-
             if(mediumPercentage < lowPercentage) skinManager.manyColorsBattery = false;
 
             battery.setTextSize(skinManager.getTextSize());
@@ -691,7 +579,7 @@ public class UIManager implements OnTouchListener {
 
         terminalView = (TextView) inputOutputView.findViewById(R.id.terminal_view);
         terminalView.setOnTouchListener(this);
-        ((View) terminalView.getParent()).setOnTouchListener(this);
+        ((View) terminalView.getParent().getParent()).setOnTouchListener(this);
 
         final EditText inputView = (EditText) inputOutputView.findViewById(R.id.input_view);
         inputView.setOnTouchListener(this);
@@ -865,7 +753,7 @@ public class UIManager implements OnTouchListener {
 
             @Override
             public boolean onDoubleTapEvent(MotionEvent e) {
-                return false;
+                return true;
             }
 
             @Override
@@ -881,7 +769,8 @@ public class UIManager implements OnTouchListener {
                     boolean admin = policy.isAdminActive(component);
 
                     if (!admin) {
-                        Tuils.requestAdmin((Activity) mContext, component, mContext.getString(R.string.adminrequest_label));
+                        Intent i = Tuils.requestAdmin(component);
+                        mContext.startActivity(i);
                     } else {
                         policy.lockNow();
                     }
@@ -893,7 +782,8 @@ public class UIManager implements OnTouchListener {
     }
 
     protected boolean verifyDoubleTap(MotionEvent event) {
-        return det != null && det.onTouchEvent(event);
+        boolean b = det.onTouchEvent(event);
+        return det != null && b;
     }
 
     //	 on pause
@@ -903,8 +793,9 @@ public class UIManager implements OnTouchListener {
 
     @Override
     public boolean onTouch(View v, MotionEvent event) {
-        if (verifyDoubleTap(event))
+        if (verifyDoubleTap(event)) {
             return true;
+        }
 
         if (event.getAction() != MotionEvent.ACTION_DOWN)
             return v.onTouchEvent(event);
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 881f48ca34a30b7582171581644c223f4bf3666c..977ed0376be9944af6b38795a2b13563c58c45df 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/Command.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/Command.java
@@ -1,9 +1,9 @@
 package ohi.andre.consolelauncher.commands;
 
 import android.content.res.Resources;
-import android.util.Log;
 
 import ohi.andre.consolelauncher.R;
+import ohi.andre.consolelauncher.commands.main.Param;
 import ohi.andre.consolelauncher.commands.specific.ParamCommand;
 import ohi.andre.consolelauncher.tuils.Tuils;
 
@@ -18,17 +18,33 @@ public class Command {
     public String exec(Resources resources, ExecutePack info) throws Exception {
         info.set(mArgs);
 
-        if(cmd instanceof ParamCommand && mArgs != null && (mArgs.length == 0 || ((ParamCommand) cmd).argsForParam((String) mArgs[0]) == null)) {
-            return info.context.getString(R.string.output_invalid_param) + Tuils.SPACE + mArgs[0];
-        }
         if (indexNotFound != -1) {
             return cmd.onArgNotFound(info, indexNotFound);
         }
-        if (nArgs < cmd.minArgs() || (mArgs == null && cmd.minArgs() > 0) ||
-                (cmd instanceof ParamCommand && mArgs != null && mArgs.length > 0 && ((ParamCommand) cmd).argsForParam((String) mArgs[0]) != null &&
-                        ((ParamCommand) cmd).argsForParam((String) mArgs[0]).length + 1 > nArgs)) {
+
+        if(cmd instanceof ParamCommand) {
+            ParamCommand pCmd = (ParamCommand) cmd;
+
+            if(mArgs == null || mArgs.length == 0) {
+                return cmd.onNotArgEnough(info, 0);
+            }
+
+            int[] args = info.get(Param.class, 0).args();
+            if(args == null) return resources.getString(R.string.output_invalid_param) + Tuils.SPACE + mArgs[0];
+
+            if(pCmd.supportDefaultParam()) {
+                if(args.length + 1 > nArgs + 1) {
+                    return cmd.onNotArgEnough(info, nArgs);
+                }
+            } else {
+                if(args.length + 1 > nArgs) {
+                    return cmd.onNotArgEnough(info, nArgs);
+                }
+            }
+        } else if (nArgs < cmd.minArgs() || (mArgs == null && cmd.minArgs() > 0)) {
             return cmd.onNotArgEnough(info, nArgs);
         }
+
         if (cmd.maxArgs() != CommandAbstraction.UNDEFINIED && nArgs > cmd.maxArgs()) {
             return resources.getString(R.string.output_toomanyargs);
         }
@@ -45,12 +61,12 @@ public class Command {
 
         int[] args;
         if (useParamArgs) {
-            args = ((ParamCommand) cmd).argsForParam((String) mArgs[0]);
+            args = ((Param) mArgs[0]).args();
         } else {
             args = cmd.argType();
         }
 
-        if (args == null) {
+        if (args == null || args.length == 0) {
             return 0;
         }
 
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 6474c0cce6131c3c92c49266abf2c12451eb1cdd..69dfc94edd0539251f0e988deabcff97e212b5a1 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandAbstraction.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandAbstraction.java
@@ -21,7 +21,7 @@ public interface CommandAbstraction {
     int CONFIG_FILE = 22;
     int CONFIG_ENTRY = 23;
     int INT = 24;
-    int REGEX = 25;
+    int DEFAULT_APP = 25;
 
     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 9e19bf9b26bb5d4c8ab4e623ed395ca635f31adf..afabfdb364ce5864809c78948c46fbc17bc054b9 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/CommandTuils.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/CommandTuils.java
@@ -9,14 +9,16 @@ import java.util.Arrays;
 import java.util.List;
 
 import ohi.andre.consolelauncher.commands.main.MainPack;
+import ohi.andre.consolelauncher.commands.main.Param;
 import ohi.andre.consolelauncher.commands.specific.ParamCommand;
 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.MusicManager;
+import ohi.andre.consolelauncher.managers.music.MusicManager;
 import ohi.andre.consolelauncher.managers.XMLPrefsManager;
 import ohi.andre.consolelauncher.managers.notifications.NotificationManager;
+import ohi.andre.consolelauncher.tuils.SimpleMutableEntry;
 import ohi.andre.consolelauncher.tuils.Tuils;
 
 @SuppressLint("DefaultLocale")
@@ -64,17 +66,17 @@ public class CommandTuils {
 
         try {
             if(cmd instanceof ParamCommand) {
-                ArgInfo arg = param(input);
+                ArgInfo arg = param((MainPack) info, (ParamCommand) cmd, input);
                 if(arg == null || !arg.found) {
                     return command;
                 }
 
                 input = arg.residualString;
-                String param = (String) arg.arg;
-                types = ((ParamCommand) cmd).argsForParam(param);
+                Param p = (Param) arg.arg;
+                types = p.args();
 
                 nArgs++;
-                args.add(param);
+                args.add(p);
             } else {
                 types = cmd.argType();
             }
@@ -130,39 +132,31 @@ public class CommandTuils {
         if (type == CommandAbstraction.FILE && info instanceof MainPack) {
             MainPack pack = (MainPack) info;
             return file(input, pack.currentDirectory);
-        }
-        else if (type == CommandAbstraction.CONTACTNUMBER && info instanceof MainPack) {
+        } else if (type == CommandAbstraction.CONTACTNUMBER && info instanceof MainPack) {
             MainPack pack = (MainPack) info;
             return contactNumber(input, pack.contacts);
-        }
-        else if (type == CommandAbstraction.PLAIN_TEXT) {
+        } else if (type == CommandAbstraction.PLAIN_TEXT) {
             return plainText(input);
-        }
-        else if (type == CommandAbstraction.VISIBLE_PACKAGE && info instanceof MainPack) {
+        } else if (type == CommandAbstraction.VISIBLE_PACKAGE && info instanceof MainPack) {
             MainPack pack = (MainPack) info;
-            return packageName(input, pack.appsManager);
+            return activityName(input, pack.appsManager);
         } else if (type == CommandAbstraction.HIDDEN_PACKAGE && info instanceof MainPack) {
             MainPack pack = (MainPack) info;
             return hiddenPackage(input, pack.appsManager);
-        }
-        else if (type == CommandAbstraction.TEXTLIST) {
+        } else if (type == CommandAbstraction.TEXTLIST) {
             return textList(input);
-        }
-        else if (type == CommandAbstraction.SONG && info instanceof MainPack) {
+        } else if (type == CommandAbstraction.SONG && info instanceof MainPack) {
             MainPack pack = (MainPack) info;
             return song(input, pack.player);
-        }
-        else if (type == CommandAbstraction.FILE_LIST && info instanceof MainPack) {
+        } else if (type == CommandAbstraction.FILE_LIST && info instanceof MainPack) {
             MainPack pack = (MainPack) info;
 
             if (suggestion)
                 return file(input, pack.currentDirectory);
             else
                 return fileList(input, pack.currentDirectory);
-        } else if (type == CommandAbstraction.COMMAND)
+        } else if (type == CommandAbstraction.COMMAND) {
             return command(input, info.commandGroup);
-        else if (type == CommandAbstraction.PARAM) {
-            return param(input);
         } else if(type == CommandAbstraction.BOOLEAN) {
             return bln(input);
         } else if(type == CommandAbstraction.COLOR) {
@@ -173,6 +167,8 @@ public class CommandTuils {
             return configFile(input);
         } else if(type == CommandAbstraction.INT) {
             return integer(input);
+        } else if(type == CommandAbstraction.DEFAULT_APP) {
+            return defaultApp(input, ((MainPack) info).appsManager);
         }
 
         return null;
@@ -330,7 +326,9 @@ public class CommandTuils {
         }
     }
 
-    private static ArgInfo param(String input) {
+    private static ArgInfo param(MainPack pack, ParamCommand cmd, String input) {
+        if(input == null || input.trim().length() == 0) return null;
+
         int indexOfFirstSpace = input.indexOf(Tuils.SPACE);
         if (indexOfFirstSpace == -1) {
             indexOfFirstSpace = input.length();
@@ -339,17 +337,30 @@ public class CommandTuils {
         String param = input.substring(0, indexOfFirstSpace).trim();
         if(param.length() > 0 && !param.startsWith("-")) param = "-".concat(param);
 
-        return new ArgInfo(param.length() > 0 ? param : null, input.substring(indexOfFirstSpace), param.length() > 0, param.length() > 0 ? 1 : 0);
+        SimpleMutableEntry<Boolean, Param> sm = cmd.getParam(pack, param);
+        Param p = sm.getValue();
+        boolean df = sm.getKey();
+
+        return new ArgInfo(p, df ? input : input.substring(indexOfFirstSpace), p != null, p != null ? 1 : 0);
     }
 
-    private static ArgInfo packageName(String input, AppsManager apps) {
-        String packageName = apps.findPackage(input, AppsManager.SHOWN_APPS);
-        return new ArgInfo(packageName, null, packageName != null, 1);
+    private static ArgInfo activityName(String input, AppsManager apps) {
+        AppsManager.LaunchInfo info = apps.findLaunchInfoWithLabel(input, AppsManager.SHOWN_APPS);
+        return new ArgInfo(info, null, info != null, info != null ? 1 : 0);
     }
 
     private static ArgInfo hiddenPackage(String input, AppsManager apps) {
-        String packageName = apps.findPackage(input, AppsManager.HIDDEN_APPS);
-        return new ArgInfo(packageName, null, packageName != null, 1);
+        AppsManager.LaunchInfo info = apps.findLaunchInfoWithLabel(input, AppsManager.HIDDEN_APPS);
+        return new ArgInfo(info, null, info != null, info != null ? 1 : 0);
+    }
+
+    private static ArgInfo defaultApp(String input, AppsManager apps) {
+        AppsManager.LaunchInfo info = apps.findLaunchInfoWithLabel(input, AppsManager.SHOWN_APPS);
+        if(info == null) {
+            return new ArgInfo(input, null, true, 1);
+        } else {
+            return new ArgInfo(info, null, true, 1);
+        }
     }
 
     private static ArgInfo contactNumber(String input, ContactManager contacts) {
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 ba92eae11524e7143528ae78acb018e5fcdfe357..da4db50bcbf7732be7fb461a282436f3870a7546 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/ExecutePack.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/ExecutePack.java
@@ -6,21 +6,18 @@ import android.content.Context;
 public abstract class ExecutePack {
 
     public Object[] args;
-
     public Context context;
-
     public CommandGroup commandGroup;
 
-
     public ExecutePack(CommandGroup group) {
         this.commandGroup = group;
     }
 
-
     @SuppressWarnings("unchecked")
     public <T> T get(Class<T> c, int index) {
-        if (index >= this.args.length)
+        if (index >= this.args.length) {
             return null;
+        }
 
         return (T) (this.args[index]);
     }
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 496ef0bd836828e8d1b01d077e00903a8a91cda2..f89f0aac194f39c4a5f9bbc4eaf1c2808b0b7c45 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
@@ -1,7 +1,5 @@
 package ohi.andre.consolelauncher.commands.main;
 
-import android.app.admin.DevicePolicyManager;
-import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.content.res.Resources;
@@ -22,10 +20,10 @@ import ohi.andre.consolelauncher.commands.main.raw.flash;
 import ohi.andre.consolelauncher.managers.AliasManager;
 import ohi.andre.consolelauncher.managers.AppsManager;
 import ohi.andre.consolelauncher.managers.ContactManager;
-import ohi.andre.consolelauncher.managers.MusicManager;
+import ohi.andre.consolelauncher.managers.ShellManager;
 import ohi.andre.consolelauncher.managers.SkinManager;
 import ohi.andre.consolelauncher.managers.XMLPrefsManager;
-import ohi.andre.consolelauncher.tuils.Tuils;
+import ohi.andre.consolelauncher.managers.music.MusicManager;
 import ohi.andre.consolelauncher.tuils.interfaces.CommandExecuter;
 import ohi.andre.consolelauncher.tuils.interfaces.Outputable;
 import ohi.andre.consolelauncher.tuils.interfaces.Redirectator;
@@ -42,6 +40,8 @@ public class MainPack extends ExecutePack {
     //	current directory
     public File currentDirectory;
 
+    public ShellManager shellManager;
+
     public SkinManager skinManager;
 
     //	resources references
@@ -73,10 +73,6 @@ public class MainPack extends ExecutePack {
     public AliasManager aliasManager;
     public AppsManager appsManager;
 
-    //	admin
-    public DevicePolicyManager policy;
-    public ComponentName component;
-
     //	reload field
     public Reloadable reloadable;
 
@@ -94,10 +90,12 @@ public class MainPack extends ExecutePack {
     public Redirectator redirectator;
 
     public MainPack(Context context, CommandGroup commandGroup, AliasManager alMgr, AppsManager appmgr, MusicManager p,
-                    ContactManager c, DevicePolicyManager devicePolicyManager, ComponentName componentName,
-                    Reloadable r, CommandExecuter executeCommand, Outputable outputable, Redirectator redirectator) {
+                    ContactManager c, Reloadable r, CommandExecuter executeCommand, Outputable outputable, Redirectator redirectator, ShellManager shellManager) {
         super(commandGroup);
 
+        this.shellManager = shellManager;
+        this.currentDirectory = shellManager.currentDir();
+
         this.outputable = outputable;
 
         this.res = context.getResources();
@@ -106,7 +104,6 @@ public class MainPack extends ExecutePack {
 
         this.context = context;
 
-        this.currentDirectory = new File(Tuils.getInternalDirectoryPath());
         this.aliasManager = alMgr;
         this.appsManager = appmgr;
 
@@ -117,9 +114,6 @@ public class MainPack extends ExecutePack {
         this.player = p;
         this.contacts = c;
 
-        this.policy = devicePolicyManager;
-        this.component = componentName;
-
         this.reloadable = r;
 
         this.redirectator = redirectator;
@@ -166,11 +160,13 @@ public class MainPack extends ExecutePack {
     public void destroy() {
         player.destroy(this.context);
         appsManager.onDestroy();
+        shellManager.destroy();
     }
 
     @Override
     public void clear() {
         super.clear();
+
         setSu(false);
     }
 }
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 69ad88d7c3eb40a1578a1cffa9f2e35810093a6f..a3855aa982722643e0c4bc09f8cda94526a69233 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
@@ -2,7 +2,6 @@ package ohi.andre.consolelauncher.commands.main.raw;
 
 import java.io.File;
 import java.util.ArrayList;
-import java.util.List;
 
 import ohi.andre.consolelauncher.R;
 import ohi.andre.consolelauncher.commands.CommandAbstraction;
@@ -10,7 +9,6 @@ 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.AliasManager;
-import ohi.andre.consolelauncher.managers.XMLPrefsManager;
 import ohi.andre.consolelauncher.tuils.Tuils;
 
 /**
@@ -109,7 +107,7 @@ public class alias extends ParamCommand {
     }
 
     @Override
-    protected ohi.andre.consolelauncher.commands.main.Param paramForString(String param) {
+    protected ohi.andre.consolelauncher.commands.main.Param paramForString(MainPack pack, String param) {
         return Param.get(param);
     }
 
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 153d06cb95235a54b8668ce80ddaca13c38897c1..7eb3ad7cce7d5c59a4d31507c2e1c1f30fa7404f 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,6 +14,7 @@ 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.tuils.Tuils;
 
 public class apps extends ParamCommand {
@@ -39,7 +40,8 @@ public class apps extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                ((MainPack) pack).appsManager.unhideApp(pack.get(String.class, 1));
+                AppsManager.LaunchInfo i = pack.get(AppsManager.LaunchInfo.class, 1);
+                ((MainPack) pack).appsManager.showActivity(i);
                 return null;
             }
         },
@@ -51,7 +53,8 @@ public class apps extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                ((MainPack) pack).appsManager.hideApp(pack.get(String.class, 1));
+                AppsManager.LaunchInfo i = pack.get(AppsManager.LaunchInfo.class, 1);
+                ((MainPack) pack).appsManager.hideActivity(i);
                 return null;
             }
         },
@@ -64,8 +67,9 @@ public class apps extends ParamCommand {
             @Override
             public String exec(ExecutePack pack) {
                 try {
-                    PackageInfo info = pack.context.getPackageManager().getPackageInfo(pack.get(String.class, 1), PackageManager.GET_PERMISSIONS | PackageManager.GET_ACTIVITIES |
-                            PackageManager.GET_SERVICES | PackageManager.GET_RECEIVERS);
+                    AppsManager.LaunchInfo i = pack.get(AppsManager.LaunchInfo.class, 1);
+
+                    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(info);
                 } catch (PackageManager.NameNotFoundException e) {
                     return e.toString();
@@ -80,10 +84,39 @@ public class apps extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                openPlaystore(pack.context, pack.get(String.class, 1));
+                openPlaystore(pack.context, pack.get(AppsManager.LaunchInfo.class, 1).componentName.getPackageName());
                 return null;
             }
         },
+        default_app {
+            @Override
+            public int[] args() {
+                return new int[] {CommandAbstraction.INT, CommandAbstraction.DEFAULT_APP};
+            }
+
+            @Override
+            public String exec(ExecutePack pack) {
+                int index = pack.get(int.class, 1);
+
+                Object o = pack.get(Object.class, 2);
+
+                String marker;
+                if(o instanceof AppsManager.LaunchInfo) {
+                    AppsManager.LaunchInfo i = (AppsManager.LaunchInfo) o;
+                    marker = i.componentName.getPackageName() + "-" + i.componentName.getClassName();
+                } else {
+                    marker = (String) o;
+                }
+
+                try {
+                    XMLPrefsManager.XMLPrefsSave save = AppsManager.Options.valueOf("default_app_n" + index);
+                    save.parent().write(save, marker);
+                    return null;
+                } catch (Exception e) {
+                    return pack.context.getString(R.string.invalid_integer);
+                }
+            }
+        },
         st {
             @Override
             public int[] args() {
@@ -92,7 +125,7 @@ public class apps extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                openSettings(pack.context, pack.get(String.class, 1));
+                openSettings(pack.context, pack.get(AppsManager.LaunchInfo.class, 1).componentName.getPackageName());
                 return null;
             }
         },
@@ -104,7 +137,7 @@ public class apps extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                Intent intent = ((MainPack) pack).appsManager.getIntent(pack.get(String.class, 1));
+                Intent intent = ((MainPack) pack).appsManager.getIntent(pack.get(AppsManager.LaunchInfo.class, 1));
                 pack.context.startActivity(intent);
 
                 return null;
@@ -150,7 +183,7 @@ public class apps extends ParamCommand {
     }
 
     @Override
-    protected ohi.andre.consolelauncher.commands.main.Param paramForString(String param) {
+    protected ohi.andre.consolelauncher.commands.main.Param paramForString(MainPack pack, String param) {
         return Param.get(param);
     }
 
@@ -183,7 +216,7 @@ public class apps extends ParamCommand {
 
     @Override
     public int maxArgs() {
-        return 2;
+        return 3;
     }
 
     @Override
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/cd.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/cd.java
deleted file mode 100755
index 3c9a9442bf8f5ad0141bfb82a8612a7c16f33ae9..0000000000000000000000000000000000000000
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/cd.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package ohi.andre.consolelauncher.commands.main.raw;
-
-import java.io.File;
-
-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;
-
-public class cd implements CommandAbstraction {
-
-    @Override
-    public String exec(ExecutePack pack) {
-        MainPack info = (MainPack) pack;
-        File folder = info.get(File.class, 0);
-        if (!folder.isDirectory()) {
-            if (!folder.isFile())
-                return info.res.getString(R.string.output_filenotfound);
-            return info.res.getString(R.string.output_isfile);
-        }
-
-        info.currentDirectory = folder;
-
-        return Tuils.EMPTYSTRING;
-    }
-
-    @Override
-    public int helpRes() {
-        return R.string.help_cd;
-    }
-
-    @Override
-    public int minArgs() {
-        return 1;
-    }
-
-    @Override
-    public int maxArgs() {
-        return 1;
-    }
-
-    @Override
-    public int[] argType() {
-        return new int[]{CommandAbstraction.FILE};
-    }
-
-    @Override
-    public int priority() {
-        return 4;
-    }
-
-    @Override
-    public String onNotArgEnough(ExecutePack info, int nArgs) {
-        MainPack pack = (MainPack) info;
-        return pack.res.getString(helpRes());
-    }
-
-    @Override
-    public String onArgNotFound(ExecutePack pack, int index) {
-        MainPack info = (MainPack) pack;
-        return info.res.getString(R.string.output_filenotfound);
-    }
-
-}
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 37ab53247e3d9213535d11d93009863929a13cc7..13d53559fa81b389272a12c01651696bbd07a627 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
@@ -134,7 +134,7 @@ public class cntcts extends ParamCommand {
     }
 
     @Override
-    protected ohi.andre.consolelauncher.commands.main.Param paramForString(String param) {
+    protected ohi.andre.consolelauncher.commands.main.Param paramForString(MainPack pack, String param) {
         return Param.get(param);
     }
 
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 d17e6a6eb659f972d47e593b53311e7b903b6098..47a7e690f851266050020f42af783eeaf1117224 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
@@ -5,6 +5,7 @@ import java.io.File;
 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.XMLPrefsManager;
 import ohi.andre.consolelauncher.tuils.Tuils;
@@ -27,6 +28,10 @@ public class config extends ParamCommand {
             public String exec(ExecutePack pack) {
                 XMLPrefsManager.XMLPrefsSave save = pack.get(XMLPrefsManager.XMLPrefsSave.class, 1);
                 save.parent().write(save, pack.get(String.class, 2));
+
+                if(save.label().startsWith("default_app_n")) {
+                    return pack.context.getString(R.string.output_usedefapp);
+                }
                 return null;
             }
         },
@@ -86,7 +91,7 @@ public class config extends ParamCommand {
     }
 
     @Override
-    protected ohi.andre.consolelauncher.commands.main.Param paramForString(String param) {
+    protected ohi.andre.consolelauncher.commands.main.Param paramForString(MainPack pack, String param) {
         return Param.get(param);
     }
 
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/ctrlc.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/ctrlc.java
new file mode 100644
index 0000000000000000000000000000000000000000..f8bd9ac29ce139a457bf0d1c316ba9f643c6a31d
--- /dev/null
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/ctrlc.java
@@ -0,0 +1,54 @@
+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;
+
+/**
+ * Created by francescoandreuzzi on 26/07/2017.
+ */
+
+public class ctrlc implements CommandAbstraction {
+
+    @Override
+    public String exec(ExecutePack pack) throws Exception {
+        ((MainPack) pack).shellManager.reset();
+        return null;
+    }
+
+    @Override
+    public int minArgs() {
+        return 0;
+    }
+
+    @Override
+    public int maxArgs() {
+        return 0;
+    }
+
+    @Override
+    public int[] argType() {
+        return new int[0];
+    }
+
+    @Override
+    public int priority() {
+        return 3;
+    }
+
+    @Override
+    public int helpRes() {
+        return R.string.help_ctrlc;
+    }
+
+    @Override
+    public String onArgNotFound(ExecutePack pack, int indexNotFound) {
+        return null;
+    }
+
+    @Override
+    public String onNotArgEnough(ExecutePack pack, int nArgs) {
+        return null;
+    }
+}
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 a9058c6a668d162d6633f9f8cdf0ae57d3c0b74e..39ee7fa1868867588f251118dc7a95027445de7a 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
@@ -11,6 +11,7 @@ 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;
 
@@ -25,7 +26,7 @@ public class notifications extends ParamCommand {
         inc {
             @Override
             public String exec(ExecutePack pack) {
-                NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.get(String.class, 1), null, true));
+                NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.get(AppsManager.LaunchInfo.class, 1).componentName.getPackageName(), null, true));
                 return null;
             }
 
@@ -37,7 +38,7 @@ public class notifications extends ParamCommand {
         exc {
             @Override
             public String exec(ExecutePack pack) {
-                NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.get(String.class, 1), null, false));
+                NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.get(AppsManager.LaunchInfo.class, 1).componentName.getPackageName(), null, false));
                 return null;
             }
 
@@ -51,7 +52,7 @@ public class notifications extends ParamCommand {
             public String exec(ExecutePack pack) {
                 if(pack.args.length < 3) return ((MainPack) pack).context.getString(R.string.help_notifications);
                 try {
-                    NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.get(String.class, 2), pack.get(String.class, 1), true));
+                    NotificationManager.notificationsChangeFor(new NotificationManager.NotificatedApp(pack.get(AppsManager.LaunchInfo.class, 2).componentName.getPackageName(), pack.get(String.class, 1), true));
                 } catch (Exception e) {}
                 return null;
             }
@@ -74,7 +75,7 @@ public class notifications extends ParamCommand {
                 return new int[] {CommandAbstraction.INT, CommandAbstraction.PLAIN_TEXT};
             }
         },
-        text_filer {
+        text_filter {
             @Override
             public String exec(ExecutePack pack) {
                 int id = pack.get(int.class, 1);
@@ -96,7 +97,7 @@ public class notifications extends ParamCommand {
             @Override
             public String exec(ExecutePack pack) {
                 int id = pack.get(int.class, 1);
-                NotificationManager.applyFilter(id, pack.get(String.class, 2));
+                NotificationManager.applyFilter(id, pack.get(AppsManager.LaunchInfo.class, 2).componentName.getPackageName());
                 return null;
             }
         },
@@ -120,7 +121,11 @@ public class notifications extends ParamCommand {
 
             @Override
             public String exec(ExecutePack pack) {
-                pack.context.startActivity(new Intent(Build.VERSION.SDK_INT >= 22 ? Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS : "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"));
+                try {
+                    pack.context.startActivity(new Intent(Build.VERSION.SDK_INT >= 22 ? Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS : "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"));
+                } catch (Exception e) {
+                    return pack.context.getString(R.string.activity_not_found);
+                }
                 return null;
             }
         };
@@ -152,7 +157,7 @@ public class notifications extends ParamCommand {
     }
 
     @Override
-    protected ohi.andre.consolelauncher.commands.main.Param paramForString(String param) {
+    protected ohi.andre.consolelauncher.commands.main.Param paramForString(MainPack pack, String param) {
         return Param.get(param);
     }
 
@@ -189,7 +194,7 @@ public class notifications extends ParamCommand {
     @Override
     public String onArgNotFound(ExecutePack pack, int index) {
         String arg = pack.get(String.class, 0).toLowerCase();
-        if(index == 1 && (arg.equals(Param.title_filter.label()) || arg.equals(Param.text_filer.label()) || arg.equals(Param.apply_filter.label()))) {
+        if(index == 1 && (arg.equals(Param.title_filter.label()) || arg.equals(Param.text_filter.label()) || arg.equals(Param.apply_filter.label()))) {
             return ((MainPack) pack).context.getString(R.string.invalid_integer);
         }
         return ((MainPack) pack).context.getString(R.string.output_appnotfound);
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 9971ee260e6a4daa7a31a762f73ffb7fcd4d3a20..39333e5c7b2cbd6f6ab00ebd849427a9e6bb89fa 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
@@ -12,7 +12,6 @@ public class refresh implements CommandAbstraction {
     public String exec(ExecutePack pack) {
         MainPack info = (MainPack) pack;
         info.appsManager.fill();
-//        info.preferencesManager.refresh(XMLPrefsManager.ALIAS);
         info.aliasManager.reload();
         info.player.refresh(info.context);
         ContactManager.refreshContacts(info.contacts, info.context);
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 996115af9051033de4ed29d4d7bb387d1beabbb6..556b86344a9515b66d64b39956a54a30c7dd0dce 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
@@ -7,16 +7,13 @@ import android.net.Uri;
 
 import java.io.File;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 import ohi.andre.comparestring.Compare;
 import ohi.andre.consolelauncher.R;
 import ohi.andre.consolelauncher.commands.CommandAbstraction;
-import ohi.andre.consolelauncher.commands.CommandsPreferences;
 import ohi.andre.consolelauncher.commands.ExecutePack;
 import ohi.andre.consolelauncher.commands.main.MainPack;
-import ohi.andre.consolelauncher.commands.main.Param;
 import ohi.andre.consolelauncher.commands.specific.ParamCommand;
 import ohi.andre.consolelauncher.managers.FileManager;
 import ohi.andre.consolelauncher.tuils.Tuils;
@@ -110,10 +107,15 @@ public class search extends ParamCommand {
     }
 
     @Override
-    protected ohi.andre.consolelauncher.commands.main.Param paramForString(String param) {
+    protected ohi.andre.consolelauncher.commands.main.Param paramForString(MainPack pack, String param) {
         return Param.get(param);
     }
 
+    @Override
+    public boolean supportDefaultParam() {
+        return true;
+    }
+
     @Override
     protected String doThings(ExecutePack pack) {
         return null;
@@ -230,7 +232,7 @@ public class search extends ParamCommand {
 
     @Override
     public int minArgs() {
-        return 1;
+        return 0;
     }
 
     @Override
@@ -245,21 +247,12 @@ public class search extends ParamCommand {
 
     @Override
     public String onNotArgEnough(ExecutePack pack, int nArgs) {
-        MainPack info = (MainPack) pack;
-        return info.res.getString(R.string.output_nothing_found);
+        return pack.context.getString(helpRes());
     }
 
     @Override
     public String onArgNotFound(ExecutePack pack, int index) {
 //        use default param
-
-        MainPack info = (MainPack) pack;
-        List<String> toSearch = Arrays.asList((String[]) info.args);
-        String param = info.cmdPrefs.forCommand(getClass().getSimpleName()).get(CommandsPreferences.DEFAULT_PARAM);
-        Param p = Param.get(param);
-        if(p != null) {
-            return p.exec(pack);
-        }
         return pack.context.getString(helpRes());
     }
 }
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 06640bd6a9bf146a38b289f262fa8f598f82256b..13a51a9ffb92473b6b4549865574de0ba5fc7865 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
@@ -98,9 +98,13 @@ public class sms extends RedirectCommand {
             SmsManager smsManager = SmsManager.getDefault();
             smsManager.sendTextMessage(number, null, message, null, null);
 
+            cleanup();
+
             return info.res.getString(R.string.output_smssent);
         } catch (Exception ex) {
-            return info.res.getString(R.string.output_error);
+            cleanup();
+
+            return ex.toString();
         }
     }
 
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 45eff343f4e10e176b695237f652903a1fadd6f9..c9ab9552aacbb6916f01d9a43e2b510d6e327124 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
@@ -1,11 +1,9 @@
 package ohi.andre.consolelauncher.commands.main.raw;
 
-import android.text.format.Time;
-
 import ohi.andre.consolelauncher.R;
 import ohi.andre.consolelauncher.commands.CommandAbstraction;
 import ohi.andre.consolelauncher.commands.ExecutePack;
-import ohi.andre.consolelauncher.managers.XMLPrefsManager;
+import ohi.andre.consolelauncher.tuils.TimeManager;
 
 /**
  * Created by andre on 03/12/15.
@@ -13,29 +11,28 @@ import ohi.andre.consolelauncher.managers.XMLPrefsManager;
 public class time implements CommandAbstraction {
     @Override
     public String exec(ExecutePack pack) {
-        Time time = new Time();
-        time.setToNow();
-        return time.format(XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.time_format));
+        int index = pack.get(int.class, 0);
+        return TimeManager.replace("%t" + index).toString();
     }
 
     @Override
     public int minArgs() {
-        return 0;
+        return 1;
     }
 
     @Override
     public int maxArgs() {
-        return 0;
+        return 1;
     }
 
     @Override
     public int priority() {
-        return 1;
+        return 4;
     }
 
     @Override
     public int[] argType() {
-        return new int[0];
+        return new int[] {CommandAbstraction.INT};
     }
 
     @Override
@@ -45,11 +42,11 @@ public class time implements CommandAbstraction {
 
     @Override
     public String onArgNotFound(ExecutePack info, int index) {
-        return null;
+        return info.context.getString(R.string.invalid_integer);
     }
 
     @Override
     public String onNotArgEnough(ExecutePack info, int nArgs) {
-        return null;
+        return TimeManager.replace("%t0").toString();
     }
 }
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tui.java b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tui.java
index 9d009cdfb2980ace035c6e77ab243df7a5ce1830..e572ae0bc93afb91433ad2436c7018e5383f048a 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tui.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/commands/main/raw/tui.java
@@ -1,5 +1,8 @@
 package ohi.andre.consolelauncher.commands.main.raw;
 
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
 
@@ -10,6 +13,7 @@ import ohi.andre.consolelauncher.commands.main.MainPack;
 import ohi.andre.consolelauncher.commands.specific.ParamCommand;
 import ohi.andre.consolelauncher.managers.FileManager;
 import ohi.andre.consolelauncher.tuils.Tuils;
+import ohi.andre.consolelauncher.tuils.stuff.PolicyReceiver;
 
 /**
  * Created by francescoandreuzzi on 10/06/2017.
@@ -23,7 +27,10 @@ public class tui extends ParamCommand {
             @Override
             public String exec(ExecutePack pack) {
                 MainPack info = (MainPack) pack;
-                info.policy.removeActiveAdmin(info.component);
+
+                DevicePolicyManager policy = (DevicePolicyManager) info.context.getSystemService(Context.DEVICE_POLICY_SERVICE);
+                ComponentName name = new ComponentName(info.context, PolicyReceiver.class);
+                policy.removeActiveAdmin(name);
 
                 Uri packageURI = Uri.parse("package:" + BuildConfig.APPLICATION_ID);
                 Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
@@ -104,7 +111,7 @@ public class tui extends ParamCommand {
     }
 
     @Override
-    protected ohi.andre.consolelauncher.commands.main.Param paramForString(String param) {
+    protected ohi.andre.consolelauncher.commands.main.Param paramForString(MainPack pack, String param) {
         return Param.get(param);
     }
 
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 a22bc473790deaf8753f0dc89eb8fac622318e1e..881377f4d6b583dcd3dd9ca745c686c0d4a2f6de 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,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.managers.AppsManager;
 import ohi.andre.consolelauncher.tuils.ShellUtils;
 import ohi.andre.consolelauncher.tuils.Tuils;
 
@@ -15,12 +16,12 @@ public class uninstall implements CommandAbstraction {
     @Override
     public String exec(ExecutePack pack) {
         MainPack info = (MainPack) pack;
-        String packageName = info.get(String.class, 0);
+
+        String packageName = info.get(AppsManager.LaunchInfo.class, 0).componentName.getPackageName();
         if (info.getSu()) {
             try {
                 return ShellUtils.execCommand("su pm uninstall " + packageName, true, null).toString();
-            } catch (Exception e) {
-            }
+            } catch (Exception e) {}
         }
 
         Uri packageURI = Uri.parse("package:" + packageName);
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 c28e051528efe8a405bc3a0342ea3c3da7dca397..c87cc1ab070ac384f184ff85be6f68d80368e77b 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
@@ -2,8 +2,11 @@ package ohi.andre.consolelauncher.commands.specific;
 
 import ohi.andre.consolelauncher.R;
 import ohi.andre.consolelauncher.commands.CommandAbstraction;
+import ohi.andre.consolelauncher.commands.CommandsPreferences;
 import ohi.andre.consolelauncher.commands.ExecutePack;
+import ohi.andre.consolelauncher.commands.main.MainPack;
 import ohi.andre.consolelauncher.commands.main.Param;
+import ohi.andre.consolelauncher.tuils.SimpleMutableEntry;
 import ohi.andre.consolelauncher.tuils.Tuils;
 
 /**
@@ -22,22 +25,29 @@ public abstract class ParamCommand implements CommandAbstraction {
         String o = doThings(pack);
         if(o != null) return o;
 
-        Param param = paramForString(pack.get(String.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, 0);
+        if(param == null) return pack.context.getString(R.string.output_invalid_param) + Tuils.SPACE + pack.get(String.class, 0);
         return param.exec(pack);
     }
 
-    public final int[] argsForParam(String param) {
-        try {
-            return paramForString(param).args();
-        } catch (NullPointerException e) {
-            return null;
+    public SimpleMutableEntry<Boolean, Param> getParam(MainPack pack, String param) {
+        Param p = paramForString(pack, param);
+        if(p == null && supportDefaultParam()) {
+            return new SimpleMutableEntry<>(true, paramForString(pack, defaultParam(pack)));
         }
+        return new SimpleMutableEntry<>(false, p);
+    }
+
+    public String defaultParam(MainPack pack) {
+        String def = pack.cmdPrefs.forCommand(getClass().getSimpleName()).get(CommandsPreferences.DEFAULT_PARAM);
+        if(!def.startsWith("-")) def = "-" + def;
+        return def;
     }
 
     public abstract String[] params();
-    protected abstract Param paramForString(String param);
+    protected abstract Param paramForString(MainPack pack, String param);
     protected abstract String doThings(ExecutePack pack);
+    public boolean supportDefaultParam() {
+        return false;
+    }
 }
diff --git a/app/src/main/java/ohi/andre/consolelauncher/commands/specific/RedirectCommand.java b/app/src/main/java/ohi/andre/consolelauncher/commands/specific/RedirectCommand.java
old mode 100755
new mode 100644
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 4ddea527b023da3641cb00dba717d04d33bac643..7a8280bdb7ec79c214ff8476e4b87a2dc0662885 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/AppsManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/AppsManager.java
@@ -1,21 +1,20 @@
 package ohi.andre.consolelauncher.managers;
 
 import android.content.BroadcastReceiver;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.SharedPreferences;
 import android.content.pm.ActivityInfo;
-import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
+import android.os.AsyncTask;
 import android.os.Build;
-import android.os.Handler;
 import android.support.annotation.NonNull;
-import android.text.format.Time;
 
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -31,14 +30,17 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.regex.Pattern;
 
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 
 import ohi.andre.comparestring.Compare;
 import ohi.andre.consolelauncher.R;
+import ohi.andre.consolelauncher.tuils.TimeManager;
 import ohi.andre.consolelauncher.tuils.Tuils;
 import ohi.andre.consolelauncher.tuils.interfaces.Outputable;
+import ohi.andre.consolelauncher.tuils.interfaces.Suggester;
 
 import static ohi.andre.consolelauncher.managers.XMLPrefsManager.VALUE_ATTRIBUTE;
 import static ohi.andre.consolelauncher.managers.XMLPrefsManager.resetFile;
@@ -58,6 +60,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
     private final String SHOW_ATTRIBUTE = "show";
 
     private Context context;
+    private PackageManager pkgManager;
     private File folder;
 
     private AppsHolder appsHolder;
@@ -71,6 +74,8 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
 
     private static XMLPrefsManager.XmlPrefsElement instance = null;
 
+    private XMLPrefsManager.XMLPrefsList defaultApps;
+
     public enum Options implements XMLPrefsManager.XMLPrefsSave {
 
         default_app_n1 {
@@ -104,8 +109,8 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
             }
         };
 
-        static final String MOST_USED = "most_used";
-        static final String NULL = "null";
+        public static final String MOST_USED = "most_used";
+        public static final String NULL = "null";
 
         @Override
         public String label() {
@@ -140,7 +145,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
 
     @Override
     public XMLPrefsManager.XMLPrefsList getValues() {
-        return null;
+        return defaultApps;
     }
 
     private BroadcastReceiver appsBroadcast = new BroadcastReceiver() {
@@ -148,27 +153,41 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
         public void onReceive(Context context, Intent intent) {
             String action = intent.getAction();
             String data = intent.getData().getSchemeSpecificPart();
-            if (action.equals(Intent.ACTION_PACKAGE_ADDED))
-                add(data);
-            else
-                remove(data);
+            if (action.equals(Intent.ACTION_PACKAGE_ADDED)) {
+                appInstalled(data);
+            }
+            else {
+                appUninstalled(data);
+            }
         }
     };
 
-    public AppsManager(Context context, Outputable outputable) {
+    public AppsManager(Context context, Outputable outputable, final Suggester s) {
         instance = this;
 
         this.context = context;
+        this.pkgManager = context.getPackageManager();
+
         this.outputable = outputable;
 
         this.preferences = context.getSharedPreferences(PREFS, 0);
         this.editor = preferences.edit();
 
         this.folder = Tuils.getFolder();
+        initAppListener(context);
 
-        fill();
+        new AsyncTask<Void,Void,Void>() {
+            @Override
+            protected Void doInBackground(Void... params) {
+                fill();
+                return null;
+            }
 
-        initAppListener(context);
+            @Override
+            protected void onPostExecute(Void aVoid) {
+                s.requestUpdate();
+            }
+        }.execute();
     }
 
     private void initAppListener(Context c) {
@@ -181,18 +200,17 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
     }
 
     public void fill() {
-        Map<String, LaunchInfo> map = createAppMap(context.getPackageManager());
-        List<LaunchInfo> shownApps = new ArrayList<>();
+        List<LaunchInfo> allApps = createAppMap(context.getPackageManager());
         hiddenApps = new ArrayList<>();
 
-        XMLPrefsManager.XMLPrefsList values = new XMLPrefsManager.XMLPrefsList();
-
         Map<String, XMLPrefsManager.XMLPrefsSave> replacedValues = new HashMap<>();
         for(XMLPrefsManager.XMLPrefsSave s : Options.values()) {
             String r = s.hasReplaced();
             if(r != null) replacedValues.put(r, s);
         }
 
+        defaultApps = new XMLPrefsManager.XMLPrefsList();
+
         try {
             DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
             DocumentBuilder builder = factory.newDocumentBuilder();
@@ -225,7 +243,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
                 String nn = node.getNodeName();
                 int nodeIndex = Tuils.find(nn, (List) enums);
                 if(nodeIndex != -1) {
-                    values.add(nn, node.getAttributes().getNamedItem(VALUE_ATTRIBUTE).getNodeValue());
+                    defaultApps.add(nn, node.getAttributes().getNamedItem(VALUE_ATTRIBUTE).getNodeValue());
 
                     for(int en = 0; en < enums.size(); en++) {
                         if(enums.get(en).label().equals(nn)) {
@@ -249,7 +267,30 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
 
                         boolean shown = !e.hasAttribute(SHOW_ATTRIBUTE) || Boolean.parseBoolean(e.getAttribute(SHOW_ATTRIBUTE));
                         if(!shown) {
-                            hiddenApps.add(map.remove(nn));
+                            ComponentName name = null;
+
+                            String[] split = nn.split("-");
+                            if(split.length >= 2) {
+                                name = new ComponentName(split[0], split[1]);
+                            } else if(split.length == 1) {
+                                if(split[0].contains("Activity")) {
+                                    for(LaunchInfo i : allApps) {
+                                        if(i.componentName.getClassName().equals(split[0])) name = i.componentName;
+                                    }
+                                } else {
+                                    for(LaunchInfo i : allApps) {
+                                        if(i.componentName.getPackageName().equals(split[0])) name = i.componentName;
+                                    }
+                                }
+                            }
+
+                            if(name == null) continue;
+
+                            LaunchInfo removed = AppUtils.findLaunchInfoWithComponent(allApps, name);
+                            if(removed != null) {
+                                allApps.remove(removed);
+                                hiddenApps.add(removed);
+                            }
                         }
                     }
                 }
@@ -268,75 +309,87 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
                     em.setAttribute(VALUE_ATTRIBUTE, value);
                     root.appendChild(em);
 
-                    values.add(s.label(), value);
+                    defaultApps.add(s.label(), value);
                 }
                 writeTo(d, file);
             }
-        } catch (Exception e) {}
+        } catch (Exception e) {
+            Tuils.write(Tuils.getStackTrace(e));
+        }
 
         for(Map.Entry<String, ?> entry : this.preferences.getAll().entrySet()) {
-            if (entry.getValue() instanceof Integer) {
-                LaunchInfo info = map.get(entry.getKey());
-                if(info != null) info.launchedTimes = (Integer) entry.getValue();
-            }
-        }
+            Object value = entry.getValue();
+            if (value instanceof Integer) {
+                ComponentName name = null;
+
+                String[] split = entry.getKey().split("-");
+                if(split.length >= 2) {
+                    name = new ComponentName(split[0], split[1]);
+                } else if(split.length == 1) {
+                    if(split[0].contains("Activity")) {
+                        for(LaunchInfo i : allApps) {
+                            if(i.componentName.getClassName().equals(split[0])) name = i.componentName;
+                        }
+                    } else {
+                        for(LaunchInfo i : allApps) {
+                            if(i.componentName.getPackageName().equals(split[0])) name = i.componentName;
+                        }
+                    }
+                }
 
-        for (Map.Entry<String, LaunchInfo> stringLaunchInfoEntry : map.entrySet()) {
-            LaunchInfo app = stringLaunchInfoEntry.getValue();
-            shownApps.add(app);
+                if(name == null) continue;
+
+                LaunchInfo info = AppUtils.findLaunchInfoWithComponent(allApps, name);
+                if(info != null) info.launchedTimes = (Integer) value;
+            }
         }
 
-        appsHolder = new AppsHolder(shownApps, values);
+        appsHolder = new AppsHolder(allApps, defaultApps);
         AppUtils.checkEquality(hiddenApps);
     }
 
-    private Map<String, LaunchInfo> createAppMap(PackageManager mgr) {
-        Map<String, LaunchInfo> map = new HashMap<>();
+    private List<LaunchInfo> createAppMap(PackageManager mgr) {
+        List<LaunchInfo> infos = new ArrayList<>();
 
-        Intent i = new Intent(Intent.ACTION_MAIN, null);
+        Intent i = new Intent(Intent.ACTION_MAIN);
         i.addCategory(Intent.CATEGORY_LAUNCHER);
-        List<ResolveInfo> infos = mgr.queryIntentActivities(i, 0);
 
-        for (ResolveInfo info : infos) {
-            LaunchInfo app = new LaunchInfo(info.activityInfo.packageName, info.loadLabel(mgr).toString());
-            map.put(info.activityInfo.packageName, app);
+        List<ResolveInfo> main;
+        try {
+            main = mgr.queryIntentActivities(i, 0);
+        } catch (Exception e) {
+            return infos;
         }
 
-//        Intent dialerIntent = new Intent(Intent.ACTION_DIAL);
-//        ComponentName dialer = dialerIntent.resolveActivity(mgr);
-//
-//        Intent contactsIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
-//        ComponentName contacts = contactsIntent.resolveActivity(mgr);
-//
-//        if(dialer != null && contacts != null && dialer.getPackageName().equals(contacts.getPackageName())) {
-//            map.remove(dialer.getPackageName());
-//
-//            map.put(dialer.getPackageName() + ".1", new LaunchInfo(dialer.getPackageName(), dialer.getClassName(), "Dialer"));
-//            map.put(contacts.getPackageName() + ".2", new LaunchInfo(contacts.getPackageName(), contacts.getClassName(), "Contacts"));
-//        }
+        for (ResolveInfo ri : main) infos.add(new LaunchInfo(ri.activityInfo.packageName, ri.activityInfo.name, ri.loadLabel(mgr).toString()));
 
-        return map;
+        return infos;
     }
 
-    private void add(String packageName) {
+    private void appInstalled(String packageName) {
         try {
             PackageManager manager = context.getPackageManager();
-            ApplicationInfo info = manager.getApplicationInfo(packageName, 0);
-            LaunchInfo app = new LaunchInfo(packageName, info.loadLabel(manager).toString(), 0);
+
+            Intent i = manager.getLaunchIntentForPackage(packageName);
+            if(i == null) return;
+
+            ComponentName name = i.getComponent();
+            String activity = name.getClassName();
+            String label = manager.getActivityInfo(name, 0).loadLabel(manager).toString();
+
+            LaunchInfo app = new LaunchInfo(packageName, activity, label);
             appsHolder.add(app);
+
             outputable.onOutput(context.getString(R.string.app_installed) + Tuils.SPACE + packageName);
         } catch (NameNotFoundException e) {}
     }
 
-    private void remove(String packageName) {
-        LaunchInfo info = AppUtils.findLaunchInfo(packageName, appsHolder.getApps());
-        if(info != null) {
-            appsHolder.remove(info);
-            appsHolder.update(true);
-        }
+    private void appUninstalled(String packageName) {
+        List<LaunchInfo> infos = AppUtils.findLaunchInfosWithPackage(packageName, appsHolder.getApps());
+        for(LaunchInfo i : infos) appsHolder.remove(i);
     }
 
-    public String findPackage(String name, int type) {
+    public LaunchInfo findLaunchInfoWithLabel(String label, int type) {
         List<LaunchInfo> appList;
         if(type == SHOWN_APPS) {
             appList = appsHolder.getApps();
@@ -344,60 +397,29 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
             appList = hiddenApps;
         }
 
-        return findPackage(appList, name);
+        return AppUtils.findLaunchInfoWithLabel(appList, label);
     }
 
-    public String findPackage(List<LaunchInfo> appList, String name) {
-        name = Compare.removeSpaces(name);
-        for(LaunchInfo info : appList) {
-            if(name.equalsIgnoreCase(Compare.removeSpaces(info.publicLabel))) {
-                return info.packageName;
-            }
-        }
-
-        return null;
-    }
-
-    public Intent getIntent(String packageName) {
-        LaunchInfo info = AppUtils.findLaunchInfo(packageName, appsHolder.getApps());
-        if(info == null) {
-            return null;
-        }
-
+    public Intent getIntent(LaunchInfo info) {
         info.launchedTimes++;
         appsHolder.requestSuggestionUpdate(info);
 
-        editor.putInt(packageName, info.launchedTimes);
+        editor.putInt(info.componentName.getPackageName() + "-" + info.componentName.getClassName(), info.launchedTimes);
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
             editor.apply();
         } else {
             editor.commit();
         }
 
-//        if(info.activityName == null)
-            return context.getPackageManager().getLaunchIntentForPackage(packageName);
-//        else {
-//            Intent i = new Intent();
-//            i.setClassName(info.packageName, info.activityName);
-//            i.putExtra("forResult", true);
-//            return i;
-//        }
-    }
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.setComponent(info.componentName);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 
-    public String getAppName(String packageName) {
-        for(LaunchInfo info : appsHolder.getApps()) {
-            if(info.packageName.equals(packageName)) return info.publicLabel;
-        }
-        return "null";
+        return intent;
     }
 
-    public String hideApp(String packageName) {
-        LaunchInfo info = AppUtils.findLaunchInfo(packageName, appsHolder.getApps());
-        if(info == null) {
-            return null;
-        }
-
-        set(new File(folder, PATH), NAME, info.packageName, new String[] {SHOW_ATTRIBUTE}, new String[] {false + Tuils.EMPTYSTRING});
+    public String hideActivity(LaunchInfo info) {
+        set(new File(folder, PATH), NAME, info.componentName.getPackageName() + "-" + info.componentName.getClassName(), new String[] {SHOW_ATTRIBUTE}, new String[] {false + Tuils.EMPTYSTRING});
 
         appsHolder.remove(info);
         appsHolder.update(true);
@@ -407,13 +429,8 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
         return info.publicLabel;
     }
 
-    public String unhideApp(String packageName) {
-        LaunchInfo info = AppUtils.findLaunchInfo(packageName, hiddenApps);
-        if(info == null) {
-            return null;
-        }
-
-        set(new File(folder, PATH), NAME, info.packageName, new String[] {SHOW_ATTRIBUTE}, new String[] {true + Tuils.EMPTYSTRING});
+    public String showActivity(LaunchInfo info) {
+        set(new File(folder, PATH), NAME, info.componentName.getPackageName() + "-" + info.componentName.getClassName(), new String[] {SHOW_ATTRIBUTE}, new String[] {true + Tuils.EMPTYSTRING});
 
         hiddenApps.remove(info);
         appsHolder.add(info);
@@ -423,11 +440,13 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
     }
 
     public List<String> getAppLabels() {
-        return appsHolder.getAppLabels();
+        if(appsHolder != null) {
+            return appsHolder.getAppLabels();
+        } return new ArrayList<>();
     }
 
     public List<String> getHiddenAppsLabels() {
-        return AppUtils.labelList(hiddenApps);
+        return AppUtils.labelList(hiddenApps, true);
     }
 
     public String[] getSuggestedApps() {
@@ -436,7 +455,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
     }
 
     public String printApps(int type) {
-        List<String> labels = type == SHOWN_APPS ? appsHolder.appLabels : AppUtils.labelList(hiddenApps);
+        List<String> labels = type == SHOWN_APPS ? appsHolder.appLabels : AppUtils.labelList(hiddenApps, true);
         return AppUtils.printApps(labels);
     }
 
@@ -450,25 +469,15 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
 
     public static class LaunchInfo {
 
-        public String packageName;
-        public String activityName;
-        public String publicLabel;
-        public int launchedTimes;
+        public ComponentName componentName;
 
-        public LaunchInfo(String packageName, String publicLabel, int launchedTimes) {
-            this.packageName = packageName;
-            this.publicLabel = publicLabel;
-            this.launchedTimes = launchedTimes;
-        }
+        public String publicLabel;
+        public int launchedTimes = 0;
 
-        public LaunchInfo(String packageName, String publicLabel) {
-            this.packageName = packageName;
-            this.publicLabel = publicLabel;
-        }
+        public LaunchInfo(String packageName, String activityName, String label) {
+            this.componentName = new ComponentName(packageName, activityName);
 
-        public LaunchInfo(String packageName, String activityName, String publicLabel) {
-            this(packageName, publicLabel);
-            this.activityName = activityName;
+            this.publicLabel = label;
         }
 
         @Override
@@ -479,19 +488,25 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
 
             if(o instanceof LaunchInfo) {
                 LaunchInfo i = (LaunchInfo) o;
-                return (this.packageName == null && i.packageName == null) || (this.packageName != null && i.packageName != null && this.packageName.equals(i.packageName));
-            } else if(o instanceof String) return this.packageName != null && this.packageName.equals(o);
+                try {
+                    return this.componentName.equals(i.componentName);
+                } catch (Exception e) {
+                    return false;
+                }
+            }
+            else if(o instanceof ComponentName) {
+                return this.componentName.equals(o);
+            }
+            else if(o instanceof String) {
+                return this.componentName.getClassName().equals(o);
+            }
+
             return false;
         }
 
         @Override
         public String toString() {
-            return packageName + " - " + publicLabel + ", n=" + launchedTimes;
-        }
-
-        @Override
-        public int hashCode() {
-            return packageName.hashCode();
+            return componentName.getPackageName() + " - " + componentName.getClassName() + " --> " + publicLabel + ", n=" + launchedTimes;
         }
     }
 
@@ -509,7 +524,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
             private List<SuggestedApp> suggested;
             private int lastWriteable = -1;
 
-            public SuggestedAppMgr(XMLPrefsManager.XMLPrefsList values) {
+            public SuggestedAppMgr(XMLPrefsManager.XMLPrefsList values, List<LaunchInfo> apps) {
                 suggested = new ArrayList<>();
 
                 final String PREFIX = "default_app_n";
@@ -517,17 +532,36 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
                     String vl = values.get(Options.valueOf(PREFIX + (count + 1))).value;
 
                     if(vl.equals(Options.NULL)) continue;
-                    if(vl.equals(Options.MOST_USED)) suggested.add(new SuggestedApp(MOST_USED));
+                    if(vl.equals(Options.MOST_USED)) suggested.add(new SuggestedApp(MOST_USED, count + 1));
                     else {
-                        LaunchInfo info = AppUtils.findLaunchInfo(vl, infos);
+                        ComponentName name = null;
+
+                        String[] split = vl.split("-");
+                        if(split.length >= 2) {
+                            name = new ComponentName(split[0], split[1]);
+                        } else if(split.length == 1) {
+                            if(split[0].contains("Activity")) {
+                                for(LaunchInfo i : apps) {
+                                    if(i.componentName.getClassName().equals(split[0])) name = i.componentName;
+                                }
+                            } else {
+                                for(LaunchInfo i : apps) {
+                                    if(i.componentName.getPackageName().equals(split[0])) name = i.componentName;
+                                }
+                            }
+                        }
+
+                        if(name == null) continue;
+
+                        LaunchInfo info = AppUtils.findLaunchInfoWithComponent(infos, name);
                         if(info == null) continue;
-                        suggested.add(new SuggestedApp(info, USER_DEFINIED));
+                        suggested.add(new SuggestedApp(info, USER_DEFINIED, count + 1));
                     }
                 }
 
                 sort();
 
-                handler.postDelayed(runnable, 1000 * 60 * 5);
+//                handler.postDelayed(runnable, 1000 * 60 * 5);
             }
 
             public int size() {
@@ -553,123 +587,83 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
                 suggested.get(index).change(info);
             }
 
-            public int indexOf(LaunchInfo info) {
-                return suggested.indexOf(info);
-            }
-
             public void attemptInsertSuggestion(LaunchInfo info) {
-//                Log.e("andre", "attempt: " + info.toString());
-
                 if (info.launchedTimes == 0 || lastWriteable == -1) {
                     return;
                 }
 
-//                Log.e("andre", String.valueOf(lastWriteable));
-
-                int i = Tuils.find(info, suggested);
-                if(i == -1) {
-                    int index = indexOf(info);
-                    if (index == -1) {
-                        for (int count = 0; count <= lastWriteable; count++) {
-//                            Log.e("andre", "loop: " + count);
-
-                            SuggestedApp app = get(count);
-//                            Log.e("andre", app.toString());
-
-                            if (app.app == null || info.launchedTimes > app.app.launchedTimes) {
-//                                Log.e("andre", "yes");
-                                SuggestedApp s = suggested.get(count);
+                int index = Tuils.find(info, suggested);
+                if (index == -1) {
+                    for (int count = 0; count <= lastWriteable; count++) {
+                        SuggestedApp app = get(count);
 
-//                                Log.e("andre", "before it was: " + s.toString());
-//                                Log.e("andre", suggested.toString());
+                        if (app.app == null || info.launchedTimes > app.app.launchedTimes) {
+                            SuggestedApp s = suggested.get(count);
 
-                                LaunchInfo before = s.app;
-                                s.change(info);
+                            LaunchInfo before = s.app;
+                            s.change(info);
 
-//                                Log.e("andre", suggested.toString());
-
-                                if(before != null) {
-//                                    Log.e("andre", "rec");
-                                    attemptInsertSuggestion(before);
-                                }
-
-                                break;
+                            if(before != null) {
+                                attemptInsertSuggestion(before);
                             }
+
+                            break;
                         }
                     }
                 }
-//                else {
-//                    Log.e("andre", "index == -1");
-//                    Log.e("andre", suggested.toString());
-//                }
                 sort();
-//                Log.e("andre", suggested.toString());
             }
 
-//            public void updateSuggestion(LaunchInfo info) {
-//                int index = indexOf(info);
-//
-//                if(index == -1) {
-//                    attemptInsertSuggestion(info);
-//                } else if(index == 0) {
-//                    return;
-//                } else {
-//                    for(int count = 0; count < index; count++) {
-//                        if(get(count).type == NULL ) {
-//                            if(count == lastNull()) {
-//                                suggestedApps[count] = info;
-//                                return;
-//                            }
-//                        } else if(suggestedApps[count].launchedTimes < info.launchedTimes) {
-//
-//                            System.arraycopy(suggestedApps, count, suggestedApps, count + 1, index - count);
-//                            suggestedApps[count] = info;
-//
-//                            return;
-//                        }
-//                    }
-//                }
-//            }
-
             public List<String> labels() {
                 List<LaunchInfo> list = new ArrayList<>();
-                for(int count = 0; count < suggested.size(); count++) {
-                    SuggestedApp app = suggested.get(count);
-                    if(app.type != NULL && app.app != null) list.add(app.app);
-                }
-                return AppUtils.labelList(list);
-            }
 
-            private Handler handler = new Handler();
-            private Runnable runnable = new Runnable() {
-                @Override
-                public void run() {
-                    if(duplicates()) {
-                        fillSuggestions();
+                List<SuggestedApp> cp = new ArrayList<>(suggested);
+                Collections.sort(cp, new Comparator<SuggestedApp>() {
+                    @Override
+                    public int compare(SuggestedApp o1, SuggestedApp o2) {
+                        return o1.index - o2.index;
                     }
-                    handler.postDelayed(runnable, 1000 * 60 * 2);
-                }
+                });
 
-                private boolean duplicates() {
-                    for (int count =0; count < size(); count++)
-                        for (int count2 = count+1 ; count2 < size(); count2++)
-                            if (count != count2 && get(count) == get(count2))
-                                return true;
-                    return false;
+                for(int count = 0; count < cp.size(); count++) {
+                    SuggestedApp app = cp.get(count);
+                    if(app.type != NULL && app.app != null) list.add(app.app);
                 }
-            };
+                return AppUtils.labelList(list, false);
+            }
+
+//            private Handler handler = new Handler();
+//            private Runnable runnable = new Runnable() {
+//                @Override
+//                public void run() {
+//                    if(duplicates()) {
+//                        fillSuggestions();
+//                    }
+//                    handler.postDelayed(runnable, 1000 * 60 * 2);
+//                }
+//
+//                private boolean duplicates() {
+//                    for (int count =0; count < size(); count++)
+//                        for (int count2 = count+1 ; count2 < size(); count2++)
+//                            if (count != count2 && get(count) == get(count2))
+//                                return true;
+//                    return false;
+//                }
+//            };
 
             private class SuggestedApp implements Comparable {
                 int type;
                 LaunchInfo app;
+                int index;
 
-                public SuggestedApp(int type) {
-                    this(null, type);
+                public SuggestedApp(int type, int index) {
+                    this(null, type, index);
                 }
 
-                public SuggestedApp(LaunchInfo info, int type) {
+                public SuggestedApp(LaunchInfo info, int type, int index) {
                     this.app = info;
                     this.type = type;
+                    this.index = index;
                 }
 
                 public SuggestedApp change(LaunchInfo info) {
@@ -710,20 +704,6 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
                     }
                     return this.app.launchedTimes - other.app.launchedTimes;
                 }
-
-                @Override
-                public String toString() {
-                    switch (type) {
-                        case USER_DEFINIED:
-                            return "userdef " + (app != null ? app.packageName : "");
-                        case MOST_USED:
-                            return "most used " + (app != null ? app.packageName : "");
-                        case NULL:
-                            return "null";
-                    }
-
-                    return null;
-                }
             }
         }
 
@@ -741,7 +721,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
         }
 
         public void add(LaunchInfo info) {
-            if(! infos.contains(info) ) {
+            if(!infos.contains(info) ) {
                 infos.add(info);
                 update(false);
             }
@@ -759,11 +739,11 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
         }
 
         private void fillLabels() {
-            appLabels = AppUtils.labelList(infos);
+            appLabels = AppUtils.labelList(infos, true);
         }
 
         private void fillSuggestions() {
-            suggestedAppMgr = new SuggestedAppMgr(values);
+            suggestedAppMgr = new SuggestedAppMgr(values, getApps());
             for(LaunchInfo info : infos) {
                 suggestedAppMgr.attemptInsertSuggestion(info);
             }
@@ -773,15 +753,6 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
             suggestedAppMgr.attemptInsertSuggestion(info);
         }
 
-//        private int lastNull() {
-//            for(int count = suggestedApps.length - 1; count >= 0; count--) {
-//                if(suggestedApps[count] == null) {
-//                    return count;
-//                }
-//            }
-//            return -1;
-//        }
-
         private void update(boolean refreshSuggestions) {
             AppUtils.checkEquality(infos);
             sort();
@@ -807,6 +778,28 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
 
     public static class AppUtils {
 
+        public static LaunchInfo findLaunchInfoWithComponent(List<LaunchInfo> appList, ComponentName name) {
+            if(name == null) return null;
+
+            for(LaunchInfo i : appList) {
+                if(i.equals(name)) return i;
+            }
+
+            return null;
+        }
+
+        public static LaunchInfo findLaunchInfoWithLabel(List<LaunchInfo> appList, String label) {
+            for(LaunchInfo i : appList) if(i.publicLabel.equalsIgnoreCase(label.trim())) return i;
+            return null;
+        }
+
+        private static List<LaunchInfo> findLaunchInfosWithPackage(String packageName, List<LaunchInfo> infos) {
+            List<LaunchInfo> result = new ArrayList<>();
+            for(LaunchInfo info : infos) if (info.componentName.getPackageName().equals(packageName)) result.add(info);
+
+            return result;
+        }
+
         public static void checkEquality(List<LaunchInfo> list) {
 
             for (LaunchInfo info : list) {
@@ -827,12 +820,35 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
                     }
 
                     if (info.publicLabel.toLowerCase().replace(Tuils.SPACE, Tuils.EMPTYSTRING).equals(info2.publicLabel.toLowerCase().replace(Tuils.SPACE, Tuils.EMPTYSTRING))) {
-                        list.set(count, new LaunchInfo(info2.packageName, getNewLabel(info2.publicLabel, info2.packageName), info2.launchedTimes));
+//                        there are two activities in the same app loadlabel gives the same result
+                        if(info.componentName.getPackageName().equals(info2.componentName.getPackageName())) {
+                            info.publicLabel = insertActivityName(info.publicLabel, info.componentName.getClassName());
+                            info2.publicLabel = insertActivityName(info2.publicLabel, info2.componentName.getClassName());
+                        }
+                        else {
+                            info2.publicLabel = getNewLabel(info2.publicLabel, info2.componentName.getClassName());
+                        }
                     }
                 }
             }
         }
 
+        static Pattern activityPattern = Pattern.compile("activity", Pattern.CASE_INSENSITIVE);
+        public static String insertActivityName(String oldLabel, String activityName) {
+            String name;
+
+            int lastDot = activityName.lastIndexOf(".");
+            if(lastDot == -1) {
+                name = activityName;
+            } else {
+                name = activityName.substring(lastDot + 1);
+            }
+
+            name = activityPattern.matcher(name).replaceAll(Tuils.EMPTYSTRING);
+            name = name.substring(0,1).toUpperCase() + name.substring(1);
+            return oldLabel + Tuils.SPACE + "-" + Tuils.SPACE + name;
+        }
+
         public static String getNewLabel(String oldLabel, String packageName) {
             try {
 
@@ -872,9 +888,7 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
             builder.append("vrs: ").append(info.versionCode).append(" - ").append(info.versionName).append(Tuils.NEWLINE).append(Tuils.NEWLINE);
 
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
-                Time time = new Time();
-                time.set(info.firstInstallTime);
-                builder.append("Install: ").append(time.format(XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.time_format))).append(Tuils.NEWLINE).append(Tuils.NEWLINE);
+                builder.append("Install: ").append(TimeManager.replace("%t0", info.firstInstallTime, SkinManager.COLOR_NOT_SET)).append(Tuils.NEWLINE).append(Tuils.NEWLINE);
             }
 
             ActivityInfo[] a = info.activities;
@@ -908,15 +922,6 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
             return builder.toString();
         }
 
-        protected static LaunchInfo findLaunchInfo(String packageName, List<LaunchInfo> infos) {
-            for(LaunchInfo info : infos) {
-                if(info.packageName.equals(packageName)) {
-                    return info;
-                }
-            }
-            return null;
-        }
-
         public static String printApps(List<String> apps) {
             if(apps.size() == 0) {
                 return apps.toString();
@@ -936,12 +941,12 @@ public class AppsManager implements XMLPrefsManager.XmlPrefsElement {
             return Tuils.toPlanString(list);
         }
 
-        public static List<String> labelList(List<LaunchInfo> infos) {
+        public static List<String> labelList(List<LaunchInfo> infos, boolean sort) {
             List<String> labels = new ArrayList<>();
             for (LaunchInfo info : infos) {
                 labels.add(info.publicLabel);
             }
-            Collections.sort(labels);
+            if(sort) Collections.sort(labels);
             return labels;
         }
     }
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/ContactManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/ContactManager.java
index 73455dd9907f7d904780b018e239765dd1550fad..978deb1e361b2d62e6c1d99602925bd156a06dba 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/ContactManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/ContactManager.java
@@ -28,8 +28,6 @@ public class ContactManager {
 
     public ContactManager(Context context) {
         this.context = context;
-
-        refreshContacts(this, context);
     }
 
     public static void refreshContacts(ContactManager mgr, Context context) {
@@ -37,6 +35,7 @@ public class ContactManager {
 
         if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
             ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_CONTACTS}, LauncherActivity.COMMAND_SUGGESTION_REQUEST_PERMISSION);
+            mgr.contacts = contacts;
             return;
         }
 
@@ -103,16 +102,22 @@ public class ContactManager {
     }
 
     public List<String> listNames() {
+        if(contacts == null || contacts.size() == 0) refreshContacts(this, context);
+
         List<String> names = new ArrayList<>();
         for(Contact c : contacts) names.add(c.name);
         return names;
     }
 
     public List<Contact> getContacts() {
+        if(contacts == null || contacts.size() == 0) refreshContacts(this, context);
+
         return contacts;
     }
 
     public List<String> listNamesAndNumbers() {
+        if(contacts == null || contacts.size() == 0) refreshContacts(this, context);
+
         List<String> c = new ArrayList<>();
 
         for(int count = 0; count < contacts.size(); count++) {
@@ -209,6 +214,8 @@ public class ContactManager {
     }
 
     public String findNumber(String name, int minRate) {
+        if(contacts == null) refreshContacts(this, context);
+
         String mostSuitable = Compare.similarString(listNames(), name, minRate, USE_SCROLL_COMPARE);
         if(mostSuitable == null) return null;
 
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/ShellManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/ShellManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..2636bc14ed0ee8894212d5c4511e7ca5dfe16281
--- /dev/null
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/ShellManager.java
@@ -0,0 +1,259 @@
+package ohi.andre.consolelauncher.managers;
+
+import android.os.Environment;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import ohi.andre.consolelauncher.tuils.StoppableThread;
+import ohi.andre.consolelauncher.tuils.Tuils;
+import ohi.andre.consolelauncher.tuils.interfaces.Outputable;
+
+/**
+ * Created by francescoandreuzzi on 25/07/2017.
+ */
+
+public class ShellManager {
+
+    Process p;
+    Thread t;
+
+    File file;
+
+    InputStream output;
+    InputStream error;
+    OutputStream cmdStream;
+
+    Outputable outputable;
+
+    public ShellManager(Outputable outputable) {
+        this.outputable = outputable;
+
+        init(Environment.getExternalStorageDirectory());
+    }
+
+    private void init(File f) {
+        try {
+            p = Runtime.getRuntime().exec("/system/bin/sh");
+        } catch (IOException e) {
+            p = null;
+            return;
+        }
+
+        this.file = f;
+
+        output = p.getInputStream();
+        error = p.getErrorStream();
+        cmdStream = p.getOutputStream();
+
+        new Thread() {
+            @Override
+            public void run() {
+                super.run();
+
+                cd(file);
+            }
+        }.start();
+    }
+
+    public String cmd(final String cmd, final boolean write) {
+
+        if(t != null && t.isAlive()) {
+            try {
+                synchronized (t) {
+                    t.wait();
+                }
+            } catch (InterruptedException e) {}
+        }
+
+        try {
+            cmdStream.write((cmd + Tuils.NEWLINE).getBytes());
+            cmdStream.write(("echo EOF" + Tuils.NEWLINE).getBytes());
+        } catch (IOException e) {
+            return null;
+        }
+
+        final String[] outputMsg = {Tuils.EMPTYSTRING};
+
+        t = new StoppableThread() {
+            String line = Tuils.EMPTYSTRING;
+            String errorMsg = Tuils.EMPTYSTRING;
+
+            @Override
+            public void run() {
+                super.run();
+
+                do {
+                    if(Thread.currentThread().isInterrupted()) return;
+
+                    int n = 0;
+                    try {
+                        n = output.read();
+                    } catch (IOException e) {}
+
+                    if(n == -1) continue;
+
+                    char c = (char) n;
+                    if(c == '\n') {
+                        if(line.equals("EOF")) break;
+                        else {
+                            if(write) outputable.onOutput(line);
+                            outputMsg[0] = outputMsg[0] + Tuils.EMPTYSTRING + line;
+                            line = Tuils.EMPTYSTRING;
+                        }
+                    } else {
+                        line = line + c;
+                    }
+                } while (true);
+
+                if(write) {
+                    try {
+                        int available = error.available();
+                        for (int i = 0; i < available; i++) errorMsg = errorMsg + (char) error.read();
+                    } catch (IOException e) {}
+
+                    if(Thread.currentThread().isInterrupted()) return;
+
+                    outputable.onOutput(errorMsg);
+                }
+
+
+                if(cmd.startsWith("cd ")) {
+                    line = Tuils.EMPTYSTRING;
+
+//                    update the current dir
+                    try {
+                        cmdStream.write(("pwd" + Tuils.NEWLINE).getBytes());
+                    } catch (IOException e) {}
+
+                    do {
+                        int n = 0;
+                        try {
+                            n = output.read();
+                        } catch (IOException e) {}
+
+                        if(n == -1) continue;
+                        char c = (char) n;
+
+                        if(c == '\n') {
+                            file = new File(line);
+                            break;
+                        } else {
+                            line = line + c;
+                        }
+                    } while (true);
+                }
+
+                synchronized (outputMsg) {
+                    outputMsg.notify();
+                }
+
+                synchronized (this) {
+                    this.notify();
+                }
+            }
+        };
+
+        t.start();
+
+        try {
+            synchronized (outputMsg) {
+                outputMsg.wait();
+            }
+        } catch (InterruptedException e) {}
+
+        return outputMsg[0];
+    }
+
+    public void cd(File file) {
+        cmd("cd" + Tuils.SPACE + file.getAbsolutePath(), false);
+    }
+
+    public File currentDir() {
+        return file == null ? Environment.getExternalStorageDirectory() : file;
+    }
+
+    public void reset() {
+
+        if(this.p != null) {
+            p.destroy();
+            p = null;
+
+            try {
+                output.close();
+                error.close();
+                cmdStream.close();
+            } catch (IOException e) {}
+
+            output = null;
+            error = null;
+            cmdStream = null;
+        }
+
+        if(this.t != null) {
+            t.interrupt();
+            t = null;
+        }
+
+        init(this.file);
+    }
+
+    public void destroy() {
+        if(t != null) t.interrupt();
+        if(p != null) {
+            p.destroy();
+
+            try {
+                output.close();
+                error.close();
+                cmdStream.close();
+            } catch (IOException e) {}
+        }
+    }
+
+//    public boolean sendSigint() {
+//
+//        if(t != null) {
+//            t.interrupt();
+//
+//            int pid = getPid();
+//            if(pid != 0) {
+//
+//                try {
+//                    p.destroy();
+//                    Runtime.getRuntime().exec("kill -SIGINT" + Tuils.SPACE + pid);
+//                } catch (IOException e) {}
+//            }
+//
+//            try {
+//                int av = output.available();
+//                for(int i = 0; i < av; i++) {
+//                    output.read();
+//                }
+//            } catch (IOException e) {}
+//
+//            try {
+//                int av = error.available();
+//                for(int i = 0; i < av; i++) {
+//                    error.read();
+//                }
+//            } catch (IOException e) {}
+//
+//            return true;
+//        }
+//        return false;
+//    }
+//
+//    public int getPid() {
+//        String s = p.toString();
+//        String sPid = s.replaceAll("Process", Tuils.EMPTYSTRING).replace("[", Tuils.EMPTYSTRING).replace("]", Tuils.EMPTYSTRING).replaceAll("pid=", Tuils.EMPTYSTRING);
+//
+//        try {
+//            return Integer.parseInt(sPid);
+//        } catch (Exception e) {
+//            return 0;
+//        }
+//    }
+}
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/SkinManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/SkinManager.java
index d1c65d6df402b7f04bcdf1ca1f4c3702d4e11169..153aeffecfa94d9a7475172aba926f3bef385905 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/SkinManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/SkinManager.java
@@ -30,8 +30,7 @@ public class SkinManager implements Parcelable {
 
     public boolean useSystemWp, showSuggestions, systemFont, inputBottom, showSubmit, manyColorsBattery;
 
-    public String username = null, prefix;
-    public boolean showUsernameAndDeviceWhenEmpty = true, showUsername = false, showDeviceInSessionInfo = false, showPath = true;
+    public String username = null, prefix = null, ssnInfoFormat = null;
 
     private int suggDefaultText, suggDefaultBg, suggAliasText, suggAliasBg, suggSongText, suggSongBg, suggContactText, suggContactBg, suggAppText, suggAppBg, suggCmdText, suggCmdBg, suggFileText, suggFileBg;
     private boolean transparentSuggestions;
@@ -75,13 +74,8 @@ public class SkinManager implements Parcelable {
         }
 
         username = XMLPrefsManager.get(String.class, XMLPrefsManager.Ui.username);
-        showUsernameAndDeviceWhenEmpty = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_ssninfo);
-        if(showUsernameAndDeviceWhenEmpty) {
-            showUsername = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_username_ssninfo);
 
-            showDeviceInSessionInfo = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_devicename_ssninfo);
-            showPath = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Ui.show_path_ssninfo);
-        }
+        ssnInfoFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.session_info_format);
 
         showSuggestions = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Suggestions.show_suggestions);
         if (showSuggestions) {
@@ -137,10 +131,7 @@ public class SkinManager implements Parcelable {
         showSubmit = in.readByte() != 0;
         manyColorsBattery = in.readByte() != 0;
         username = in.readString();
-        showUsernameAndDeviceWhenEmpty = in.readByte() != 0;
-        showUsername = in.readByte() != 0;
-        showDeviceInSessionInfo = in.readByte() != 0;
-        showPath = in.readByte() != 0;
+        ssnInfoFormat = in.readString();
         suggDefaultText = in.readInt();
         suggDefaultBg = in.readInt();
         suggAliasText = in.readInt();
@@ -262,10 +253,7 @@ public class SkinManager implements Parcelable {
         dest.writeByte((byte) (showSubmit ? 1 : 0));
         dest.writeByte((byte) (manyColorsBattery ? 1 : 0));
         dest.writeString(username);
-        dest.writeByte((byte) (showUsernameAndDeviceWhenEmpty ? 1 : 0));
-        dest.writeByte((byte) (showUsername ? 1 : 0));
-        dest.writeByte((byte) (showDeviceInSessionInfo ? 1 : 0));
-        dest.writeByte((byte) (showPath ? 1 : 0));
+        dest.writeString(ssnInfoFormat);
         dest.writeInt(suggDefaultText);
         dest.writeInt(suggDefaultBg);
         dest.writeInt(suggAliasText);
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 af1a5231f87742bce7f44e4c1eb6de97a1059907..80bf0b843dd4ad02dcbdfb361cfe6a39c683f254 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/TerminalMAnager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/TerminalMAnager.java
@@ -8,10 +8,8 @@ import android.text.Layout;
 import android.text.SpannableString;
 import android.text.Spanned;
 import android.text.TextUtils;
-import android.text.format.Time;
 import android.text.method.ScrollingMovementMethod;
 import android.text.style.ForegroundColorSpan;
-import android.util.Log;
 import android.view.KeyEvent;
 import android.view.View;
 import android.view.ViewTreeObserver;
@@ -27,6 +25,7 @@ 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.tuils.TimeManager;
 import ohi.andre.consolelauncher.tuils.Tuils;
 
 /*Copyright Francesco Andreuzzi
@@ -51,6 +50,7 @@ public class TerminalManager {
     public static final int CATEGORY_INPUT = 10;
     public static final int CATEGORY_OUTPUT = 11;
     public static final int CATEGORY_NOTIFICATION = 12;
+    public static final int CATEGORY_GENERAL = 13;
 
     private long lastEnter;
 
@@ -95,9 +95,6 @@ public class TerminalManager {
         }
     };
 
-    private String timeFormat;
-    private Time time;
-
     private String inputFormat;
     private String outputFormat;
 
@@ -115,9 +112,6 @@ public class TerminalManager {
         this.clearAfterCmds = XMLPrefsManager.get(int.class, XMLPrefsManager.Behavior.clear_after_cmds);
         this.maxLines = XMLPrefsManager.get(int.class, XMLPrefsManager.Behavior.max_lines);
 
-        timeFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.time_format);
-        time = new Time();
-
         inputFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.input_format);
         outputFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.output_format);
 
@@ -270,7 +264,7 @@ public class TerminalManager {
     private void setupNewInput() {
         mInputView.setText(Tuils.EMPTYSTRING);
 
-        if(defaultHint && mSkinManager.showPath) {
+        if(defaultHint) {
             mInputView.setHint(Tuils.getHint(mSkinManager, mainPack.currentDirectory.getAbsolutePath()));
         }
 
@@ -354,7 +348,6 @@ public class TerminalManager {
     final String FORMAT_INPUT = "%i";
     final String FORMAT_OUTPUT = "%o";
     final String FORMAT_PREFIX = "%p";
-    final String FORMAT_TIME = "%t";
     final String FORMAT_NEWLINE = "%n";
 
     private void writeToView(final CharSequence text, final int type) {
@@ -362,16 +355,14 @@ public class TerminalManager {
             @Override
             public void run() {
 
-                mTerminalView.append(TextUtils.concat(Tuils.NEWLINE, getFinalText(text, type)));
+                CharSequence s = getFinalText(text, type);
+                mTerminalView.append(TextUtils.concat(Tuils.NEWLINE, s));
                 scrollToEnd();
             }
         });
     }
+
     private CharSequence getFinalText(CharSequence t, int type) {
-        time.setToNow();
-        String tm = time.format(timeFormat);
-        SpannableString st = new SpannableString(tm);
-        st.setSpan(new ForegroundColorSpan(mSkinManager.time_color), 0, tm.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
 
         CharSequence s;
         switch (type) {
@@ -383,10 +374,11 @@ public class TerminalManager {
                 SpannableString si = new SpannableString(inputFormat);
                 si.setSpan(new ForegroundColorSpan(mSkinManager.inputColor), 0, inputFormat.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
 
-                s = TextUtils.replace(si,
-                        new String[] {FORMAT_INPUT, FORMAT_PREFIX, FORMAT_TIME, FORMAT_NEWLINE,
-                                FORMAT_INPUT.toUpperCase(), FORMAT_PREFIX.toUpperCase(), FORMAT_TIME.toUpperCase(), FORMAT_NEWLINE.toUpperCase()},
-                        new CharSequence[] {t, su ? suPrefix : prefix, st, Tuils.NEWLINE, t, su ? suPrefix : prefix, st, Tuils.NEWLINE});
+                s = TimeManager.replace(si, mSkinManager.time_color);
+                s = TextUtils.replace(s,
+                        new String[] {FORMAT_INPUT, FORMAT_PREFIX, FORMAT_NEWLINE,
+                                FORMAT_INPUT.toUpperCase(), FORMAT_PREFIX.toUpperCase(), FORMAT_NEWLINE.toUpperCase()},
+                        new CharSequence[] {t, su ? suPrefix : prefix, Tuils.NEWLINE, t, su ? suPrefix : prefix, Tuils.NEWLINE});
 
                 break;
             case CATEGORY_OUTPUT:
@@ -396,11 +388,11 @@ public class TerminalManager {
                 so.setSpan(new ForegroundColorSpan(mSkinManager.outputColor), 0, outputFormat.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
 
                 s = TextUtils.replace(so,
-                        new String[] {FORMAT_OUTPUT, FORMAT_TIME, FORMAT_NEWLINE, FORMAT_OUTPUT.toUpperCase(), FORMAT_TIME.toUpperCase(), FORMAT_NEWLINE.toUpperCase()},
-                        new CharSequence[] {t, st, Tuils.NEWLINE, t, st, Tuils.NEWLINE});
+                        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_NOTIFICATION: case CATEGORY_GENERAL:
                 s = t;
                 break;
             default:
diff --git a/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java
index d944a1401a79bf20d13b8b866f2c0fb36c2e8cde..ce03da4b451f9cfcf0902908977650ec3e41110f 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/XMLPrefsManager.java
@@ -1,17 +1,15 @@
 package ohi.andre.consolelauncher.managers;
 
 import android.graphics.Color;
+import android.util.Log;
 
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
-import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.IOException;
 import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -29,7 +27,6 @@ import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 
 import ohi.andre.consolelauncher.managers.notifications.NotificationManager;
-import ohi.andre.consolelauncher.tuils.SimpleMutableEntry;
 import ohi.andre.consolelauncher.tuils.Tuils;
 
 public class XMLPrefsManager {
@@ -156,30 +153,6 @@ public class XMLPrefsManager {
 
     public enum Ui implements XMLPrefsSave {
 
-        show_username_ssninfo {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        show_ssninfo {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        show_path_ssninfo {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
-        show_devicename_ssninfo {
-            @Override
-            public String defaultValue() {
-                return "true";
-            }
-        },
         show_enter_button {
             @Override
             public String defaultValue() {
@@ -551,7 +524,7 @@ public class XMLPrefsManager {
                 return "true";
             }
         },
-        show_alias_suggestions {
+        suggest_alias_default {
             @Override
             public String defaultValue() {
                 return "true";
@@ -614,7 +587,7 @@ public class XMLPrefsManager {
         storage_format {
             @Override
             public String defaultValue() {
-                return "Internal Storage: %iavmb MB of %itotmb MB (%iav%%)";
+                return "Internal Storage: %iavgb GB / %itotgb GB (%iav%%)";
             }
         },
         input_format {
@@ -628,6 +601,30 @@ public class XMLPrefsManager {
             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 "@";
+            }
         };
 
         @Override
@@ -704,7 +701,7 @@ public class XMLPrefsManager {
         UI("ui.xml", Ui.values()) {
             @Override
             public String[] deleted() {
-                return new String[] {"show_timestamp_before_cmd", "linux_like"};
+                return new String[] {"show_timestamp_before_cmd", "linux_like", "show_username_ssninfo", "show_ssninfo", "show_path_ssninfo", "show_devicename_ssninfo", "show_alias_suggestions"};
             }
         },
         BEHAVIOR("behavior.xml", Behavior.values()) {
@@ -818,14 +815,14 @@ public class XMLPrefsManager {
         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
         DocumentBuilder builder = factory.newDocumentBuilder();
 
-        BufferedReader oldStream = null;
-        HashMap<XMLPrefsSave, String> oldValues = null;
-
-        File old = new File(folder, "settings.txt");
-        if(old.exists()) {
-            oldStream = new BufferedReader(new FileReader(old));
-            oldValues = getOld(oldStream);
-        }
+//        BufferedReader oldStream = null;
+//        HashMap<XMLPrefsSave, String> oldValues = null;
+//
+//        File old = new File(folder, "settings.txt");
+//        if(old.exists()) {
+//            oldStream = new BufferedReader(new FileReader(old));
+//            oldValues = getOld(oldStream);
+//        }
 
         for(XMLPrefsRoot element : XMLPrefsRoot.values()) {
             File file = new File(folder, element.path);
@@ -899,18 +896,18 @@ public class XMLPrefsManager {
                 }
                 if(value == null) {
 
-                    if(oldValues != null) {
-                        for(Map.Entry<XMLPrefsSave, String> sm : oldValues.entrySet()) {
-                            if(sm.getKey().equals(s)) {
-                                value = sm.getValue();
-                            }
-                        }
-                    }
+//                    if(oldValues != null) {
+//                        for(Map.Entry<XMLPrefsSave, String> sm : oldValues.entrySet()) {
+//                            if(sm.getKey().equals(s)) {
+//                                value = sm.getValue();
+//                            }
+//                        }
+//                    }
 
-                    if(value == null) value = s.defaultValue();
+//                    if(value == null)
+                        value = s.defaultValue();
                 }
 
-
                 Element em = d.createElement(s.label());
                 em.setAttribute(VALUE_ATTRIBUTE, value);
                 root.appendChild(em);
@@ -921,7 +918,7 @@ public class XMLPrefsManager {
             writeTo(d, file);
         }
 
-        if(old.exists()) old.delete();
+//        if(old.exists()) old.delete();
     }
 
     public static Object transform(String s, Class<?> c) {
@@ -1052,6 +1049,7 @@ public class XMLPrefsManager {
 
             writeTo(d, file);
         } catch (Exception e) {
+            Log.e("andre", "", e);
             return e.toString();
         }
         return null;
@@ -1155,82 +1153,78 @@ public class XMLPrefsManager {
         }
     }
 
-    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("showUsername", Ui.show_username_ssninfo),
-            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("showSessionInfoWhenInputEmpty", Ui.show_ssninfo),
-            new SimpleMutableEntry("showPathInSessionInfo", Ui.show_path_ssninfo),
-            new SimpleMutableEntry("showDeviceNameInSessionInfo", Ui.show_devicename_ssninfo),
-
-            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;
-    }
+//    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/MusicManager.java b/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicManager.java
similarity index 98%
rename from app/src/main/java/ohi/andre/consolelauncher/managers/MusicManager.java
rename to app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicManager.java
index 17397176686b5de6c3eb6bfa319f802fabe40a14..316e0a8f678c85f7e2a906c449d33ebb29e7e94f 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/managers/MusicManager.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/managers/music/MusicManager.java
@@ -1,4 +1,4 @@
-package ohi.andre.consolelauncher.managers;
+package ohi.andre.consolelauncher.managers.music;
 
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -13,6 +13,7 @@ import java.util.Collections;
 import java.util.List;
 
 import ohi.andre.comparestring.Compare;
+import ohi.andre.consolelauncher.managers.XMLPrefsManager;
 import ohi.andre.consolelauncher.tuils.Tuils;
 import ohi.andre.consolelauncher.tuils.broadcast.HeadsetBroadcast;
 import ohi.andre.consolelauncher.tuils.interfaces.Outputable;
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 d3d0f85af139a80c6104d745d369101f9078d1fe..077a74d1b752063e5343c9886e308603885d432f 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
@@ -10,6 +10,9 @@ 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;
@@ -313,7 +316,16 @@ public class NotificationManager implements XMLPrefsManager.XmlPrefsElement {
     }
 
     public static String getFormat() {
-        return values.get(Options.notification_format).value;
+        try {
+            return values.get(Options.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();
+        }
     }
 
     public static void notificationsChangeFor(List<NotificatedApp> apps) {
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 f41300ad89fe4f14429b244dae22c68566e8fa29..cc5ef5c3adcee671aac1dd62cd5688241935c43e 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
@@ -17,9 +17,7 @@ import android.support.v4.content.LocalBroadcastManager;
 import android.text.Spannable;
 import android.text.SpannableString;
 import android.text.TextUtils;
-import android.text.format.Time;
 import android.text.style.ForegroundColorSpan;
-import android.util.Log;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -27,6 +25,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 import ohi.andre.consolelauncher.managers.XMLPrefsManager;
+import ohi.andre.consolelauncher.tuils.TimeManager;
 import ohi.andre.consolelauncher.tuils.Tuils;
 
 import static ohi.andre.consolelauncher.managers.notifications.NotificationManager.NotificatedApp;
@@ -45,8 +44,6 @@ public class NotificationService extends NotificationListenerService {
     public void onCreate() {
         super.onCreate();
 
-        Log.e("andre", "hello");
-
         NotificationManager.create();
 
         if(NotificationManager.apps() == 0) {
@@ -85,17 +82,12 @@ public class NotificationService extends NotificationListenerService {
     @Override
     public void onDestroy() {
         super.onDestroy();
-
-        Log.e("andre", "destroying notif");
     }
 
-    Time time;
-    String timeFormat;
     String format;
     int timeColor;
 
     final String FORMAT_PKG = "%pkg";
-    final String FORMAT_DATE = "%t";
     final String FORMAT_TEXT = "%txt";
     final String FORMAT_TITLE = "%ttl";
     final String FORMAT_APPNAME = "%app";
@@ -114,9 +106,7 @@ public class NotificationService extends NotificationListenerService {
             return;
         }
 
-        if(time == null) {
-            time = new Time();
-            timeFormat = XMLPrefsManager.get(String.class, XMLPrefsManager.Behavior.time_format);
+        if(format == null) {
             manager = getPackageManager();
             format = NotificationManager.getFormat();
             timeColor = XMLPrefsManager.getColor(XMLPrefsManager.Theme.time_color);
@@ -173,20 +163,17 @@ public class NotificationService extends NotificationListenerService {
         SpannableString spanned = new SpannableString(format);
         spanned.setSpan(new ForegroundColorSpan(color), 0, format.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
 
-        time.setToNow();
-        String t = this.time.format(timeFormat);
-        SpannableString spannedTime = new SpannableString(t);
-        spannedTime.setSpan(new ForegroundColorSpan(timeColor), 0, t.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-
         CharSequence s;
         try {
             s = TextUtils.replace(spanned,
-                    new String[] {FORMAT_PKG, FORMAT_APPNAME, FORMAT_DATE, FORMAT_TEXT, FORMAT_TITLE, FORMAT_NEWLINE,
-                            FORMAT_PKG.toUpperCase(), FORMAT_APPNAME.toUpperCase(), FORMAT_DATE.toUpperCase(), FORMAT_TEXT.toUpperCase(), FORMAT_TITLE.toUpperCase(), FORMAT_NEWLINE.toUpperCase()},
+                    new String[] {FORMAT_PKG, FORMAT_APPNAME, FORMAT_TEXT, FORMAT_TITLE, FORMAT_NEWLINE,
+                            FORMAT_PKG.toUpperCase(), FORMAT_APPNAME.toUpperCase(), FORMAT_TEXT.toUpperCase(), FORMAT_TITLE.toUpperCase(), FORMAT_NEWLINE.toUpperCase()},
                     new CharSequence[] {
-                            pack, appName, spannedTime, text, title, Tuils.NEWLINE, pack, appName, spannedTime, text, title, Tuils.NEWLINE
+                            pack, appName, text, title, Tuils.NEWLINE, pack, appName, text, title, Tuils.NEWLINE
                     }
             );
+
+            s = TimeManager.replace(s, timeColor);
         } catch (Exception e) {
             return;
         }
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 25e715115c8593a3461a1d07356e97f6ff515882..b12ecdd5748412b98ad3cf82d8be70b45ac139d2 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
@@ -124,7 +124,8 @@ public class SuggestionRunnable implements Runnable {
                         ((Activity) toAdd[space].getContext()).unregisterForContextMenu(toAdd[space]);
                     }
                 } else {
-                    throw new UnsupportedOperationException("no views enough");
+//                    throw new UnsupportedOperationException("no views enough");
+                    break;
                 }
             }
         }
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 6fcc3252ce6a0592254c71e4fc427785c78901cc..9b740f438a9b0baae14fa495260f89b2f96315e2 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
@@ -11,13 +11,14 @@ import ohi.andre.consolelauncher.commands.Command;
 import ohi.andre.consolelauncher.commands.CommandAbstraction;
 import ohi.andre.consolelauncher.commands.CommandTuils;
 import ohi.andre.consolelauncher.commands.main.MainPack;
+import ohi.andre.consolelauncher.commands.main.Param;
 import ohi.andre.consolelauncher.commands.specific.ParamCommand;
 import ohi.andre.consolelauncher.commands.specific.PermanentSuggestionCommand;
 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.MusicManager;
+import ohi.andre.consolelauncher.managers.music.MusicManager;
 import ohi.andre.consolelauncher.managers.XMLPrefsManager;
 import ohi.andre.consolelauncher.managers.notifications.NotificationManager;
 import ohi.andre.consolelauncher.tuils.Tuils;
@@ -44,12 +45,12 @@ public class SuggestionsManager {
 
     private final int FIRST_INTERVAL = 7;
 
-    private boolean showAlias, showAliasWasSet = false;
+    private boolean showAliasDefault, showAliasWasSet = false;
 
     public Suggestion[] getSuggestions(MainPack info, String before, String lastWord) {
 
         if(!showAliasWasSet) {
-            showAlias = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.show_alias_suggestions);
+            showAliasDefault = XMLPrefsManager.get(boolean.class, XMLPrefsManager.Behavior.suggest_alias_default);
             showAliasWasSet = true;
         }
 
@@ -75,7 +76,7 @@ public class SuggestionsManager {
                     }
                 }
 
-                if(showAlias) suggestAlias(info.aliasManager, suggestionList, lastWord);
+                if(showAliasDefault) suggestAlias(info.aliasManager, suggestionList, lastWord);
 
                 return suggestionList.toArray(new Suggestion[suggestionList.size()]);
             }
@@ -93,9 +94,7 @@ public class SuggestionsManager {
                         suggestPermanentSuggestions(suggestionList, (PermanentSuggestionCommand) cmd.cmd);
                     }
 
-                    if (cmd.nArgs == cmd.cmd.maxArgs() ||
-                            (cmd.mArgs != null && cmd.mArgs.length > 0 && cmd.cmd instanceof ParamCommand && cmd.nArgs >= 1 &&
-                                    ((ParamCommand) cmd.cmd).argsForParam((String) cmd.mArgs[0]) != null && ((ParamCommand) cmd.cmd).argsForParam((String) cmd.mArgs[0]).length + 1 == cmd.nArgs)) {
+                    if (cmd.nArgs == cmd.cmd.maxArgs() || (cmd.mArgs != null && cmd.mArgs.length > 0 && cmd.cmd instanceof ParamCommand && cmd.nArgs >= 1 && ((Param) cmd.mArgs[0]).args().length + 1 == cmd.nArgs)) {
                         return new Suggestion[0];
                     }
 
@@ -106,7 +105,9 @@ 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)) suggestParams(suggestionList, (ParamCommand) cmd.cmd, before, null);
+                    if(cmd.cmd instanceof ParamCommand && (cmd.mArgs == null || cmd.mArgs.length == 0)) {
+                        suggestParams(info, suggestionList, (ParamCommand) cmd.cmd, before, null);
+                    }
                     else suggestArgs(info, cmd.nextArg(), suggestionList, before);
 
                 } else {
@@ -138,7 +139,7 @@ public class SuggestionsManager {
                     }
 
                     if(cmd.cmd instanceof ParamCommand && (cmd.mArgs == null || cmd.mArgs.length == 0)) {
-                        suggestParams(suggestionList, (ParamCommand) cmd.cmd, before, lastWord);
+                        suggestParams(info, suggestionList, (ParamCommand) cmd.cmd, before, lastWord);
                     } else suggestArgs(info, cmd.nextArg(), suggestionList, lastWord, before);
                 } else {
 //                    not a command
@@ -148,7 +149,7 @@ public class SuggestionsManager {
             } else {
 //                lastword > 0 && before = 0
                 suggestCommand(info, suggestionList, lastWord, before);
-                if(showAlias) suggestAlias(info.aliasManager, suggestionList, lastWord);
+                suggestAlias(info.aliasManager, suggestionList, lastWord);
                 suggestApp(info, suggestionList, lastWord, Tuils.EMPTYSTRING);
             }
         }
@@ -170,7 +171,7 @@ public class SuggestionsManager {
         else for(String s : aliasManager.getAliases()) if(s.startsWith(lastWord)) suggestions.add(new Suggestion(Tuils.EMPTYSTRING, s, true, NO_RATE, Suggestion.TYPE_ALIAS));
     }
 
-    private void suggestParams(List<Suggestion> suggestions, ParamCommand cmd, String before, String lastWord) {
+    private void suggestParams(MainPack pack, List<Suggestion> suggestions, ParamCommand cmd, String before, String lastWord) {
         String[] params = cmd.params();
         if (params == null) {
             return;
@@ -178,14 +179,20 @@ public class SuggestionsManager {
 
         if(lastWord == null || lastWord.length() == 0) {
             for (String s : cmd.params()) {
-                int[] args = cmd.argsForParam(s);
-                suggestions.add(new Suggestion(before, s, args == null || args.length == 0, NO_RATE, 0));
+                Param p = cmd.getParam(pack, s).getValue();
+                if(p == null) continue;
+
+                suggestions.add(new Suggestion(before, s, p.args().length == 0, NO_RATE, 0));
             }
         }
         else {
             for (String s : cmd.params()) {
-                int[] args = cmd.argsForParam(s);
-                if (s.startsWith(lastWord) || s.replace("-", Tuils.EMPTYSTRING).startsWith(lastWord)) suggestions.add(new Suggestion(before, s, args == null || args.length == 0, NO_RATE, 0));
+                Param p = cmd.getParam(pack, s).getValue();
+                if(p == null) continue;
+
+                if (s.startsWith(lastWord) || s.replace("-", Tuils.EMPTYSTRING).startsWith(lastWord)) {
+                    suggestions.add(new Suggestion(before, s, p.args().length == 0, NO_RATE, 0));
+                }
             }
         }
     }
@@ -223,6 +230,8 @@ public class SuggestionsManager {
             case CommandAbstraction.CONFIG_FILE:
                 suggestConfigFile(suggestions, prev, before);
                 break;
+            case CommandAbstraction.DEFAULT_APP:
+                suggestDefaultApp(info, suggestions, prev, before);
         }
     }
 
@@ -443,6 +452,31 @@ public class SuggestionsManager {
         }
     }
 
+    private void suggestDefaultApp(MainPack info, List<Suggestion> suggestions, String prev, String before) {
+        suggestions.add(new Suggestion(before, "most_used", false, MAX_RATE, Suggestion.TYPE_PERMANENT));
+        suggestions.add(new Suggestion(before, "null", false, MAX_RATE, Suggestion.TYPE_PERMANENT));
+
+        List<String> names = info.appsManager.getAppLabels();
+        if (prev == null || prev.length() == 0) {
+            for (String s : names) {
+                suggestions.add(new Suggestion(before, s, true, NO_RATE, Suggestion.TYPE_APP));
+            }
+        } else if(prev.length() <= FIRST_INTERVAL) {
+            prev = prev.trim().toLowerCase();
+            for (String n : names) {
+                if(n.toLowerCase().trim().startsWith(prev)) {
+                    suggestions.add(new Suggestion(before, n, true, MAX_RATE, Suggestion.TYPE_APP));
+                }
+            }
+        } else {
+            List<Compare.CompareInfo> infos = Compare.compareInfo(names, prev, min_apps_rate,
+                    AppsManager.USE_SCROLL_COMPARE);
+            for(Compare.CompareInfo i : infos) {
+                suggestions.add(new Suggestion(before, i.s, true, i.rate, Suggestion.TYPE_APP));
+            }
+        }
+    }
+
     private void suggestConfigEntry(List<Suggestion> suggestions, String prev, String before) {
         if(xmlPrefsEntrys == null) {
             xmlPrefsEntrys = new ArrayList<>();
diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/Compare.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/Compare.java
new file mode 100644
index 0000000000000000000000000000000000000000..74e34dcc972ef05e3646ef5aa285c31792eb9931
--- /dev/null
+++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/Compare.java
@@ -0,0 +1,67 @@
+package ohi.andre.consolelauncher.tuils;
+
+import java.text.Normalizer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * Created by francescoandreuzzi on 27/07/2017.
+ */
+
+public class Compare {
+
+    static final char[] allowed_separators = {' ', '-', '_'};
+
+    private static final String ACCENTS_PATTERN = "\\p{InCombiningDiacriticalMarks}+";
+    public static String removeAccents(String s) {
+        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) {
+            Pattern pattern = Pattern.compile(ACCENTS_PATTERN);
+            String decomposed = Normalizer.normalize(s, Normalizer.Form.NFD);
+            return pattern.matcher(decomposed).replaceAll(Tuils.EMPTYSTRING);
+        }
+
+        return s;
+    }
+
+    public static boolean matches(String compared, String comparator, boolean allowSkip, int minRate) {
+        compared = removeAccents(compared);
+        comparator = removeAccents(comparator);
+
+        List<String> s = new ArrayList<>();
+        if(allowSkip) {
+            for(char sep : allowed_separators) {
+                String[] split = compared.split(String.valueOf(sep));
+                s.addAll(Arrays.asList(split));
+            }
+        }
+        s.add(compared);
+
+        for(String st : s) {
+            int rate = 0;
+            for(int i = 0; i < st.length() && i < comparator.length(); i++) {
+                char c1 = st.charAt(i);
+                char c2 = comparator.charAt(i);
+
+                if(c1 == c2) rate++;
+            }
+
+            if(rate >= minRate) return true;
+        }
+
+        return false;
+    }
+
+    public static List<String> matches(List<String> compared, String comparator, boolean allowSkip, int minRate) {
+        List<String> ms = new ArrayList<>();
+
+        for(String s : compared) {
+            if(matches(s, comparator, allowSkip, minRate)) {
+                ms.add(s);
+            }
+        }
+
+        return ms;
+    }
+}
diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/TimeManager.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/TimeManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..32fe7620532f23b15a9c382f77c578ae40b8ccca
--- /dev/null
+++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/TimeManager.java
@@ -0,0 +1,93 @@
+package ohi.andre.consolelauncher.tuils;
+
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.TextUtils;
+import android.text.format.Time;
+import android.text.style.ForegroundColorSpan;
+
+import java.util.Arrays;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import ohi.andre.consolelauncher.managers.SkinManager;
+import ohi.andre.consolelauncher.managers.XMLPrefsManager;
+
+/**
+ * Created by francescoandreuzzi on 26/07/2017.
+ */
+
+public class TimeManager {
+
+    static String[] formats;
+    static Time time;
+
+    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);
+
+        time = new Time();
+
+        formats = format.split(separator);
+        if(formats.length == 0) formats = new String[] {Tuils.EMPTYSTRING};
+
+        Arrays.asList(formats);
+    }
+
+    public static String get(int index) {
+        if(formats == null) return null;
+
+        if(index < 0 || index >= formats.length) index = 0;
+        return formats[index];
+    }
+
+    public static CharSequence replace(CharSequence cs) {
+        return replace(cs, -1, SkinManager.COLOR_NOT_SET);
+    }
+
+    public static CharSequence replace(CharSequence cs, int color) {
+        return replace(cs, -1, color);
+    }
+
+    public static CharSequence replace(CharSequence cs, long tm, int color) {
+        if(tm == -1) {
+            time.setToNow();
+        } else {
+            time.set(tm);
+        }
+
+        Matcher matcher = extractor.matcher(cs.toString());
+        if(matcher.find()) {
+            for(int count = 1; count <= matcher.groupCount(); count++) {
+                String t = get(Integer.parseInt(matcher.group(count)));
+                if(t == null) continue;
+
+                String tf = time.format(t);
+
+                SpannableString spannableString = null;
+                if(color != SkinManager.COLOR_NOT_SET) {
+                    spannableString = new SpannableString(tf);
+                    spannableString.setSpan(new ForegroundColorSpan(color), 0, tf.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+                }
+
+                cs = TextUtils.replace(cs, new String[] {"%t" + matcher.group(count)}, new CharSequence[] {spannableString != null ? spannableString : tf});
+            }
+        }
+
+        String t = get(0);
+        if(t == null) return cs;
+
+        String tf = time.format(t);
+
+        SpannableString spannableString = null;
+        if(color != SkinManager.COLOR_NOT_SET) {
+            spannableString = new SpannableString(tf);
+            spannableString.setSpan(new ForegroundColorSpan(color), 0, tf.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+        }
+        cs = TextUtils.replace(cs, new String[] {"%t"}, new CharSequence[] {spannableString != null ? spannableString : tf});
+
+        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 43bc6d551ff02e2f1fe0444b445a4b2613f25ca1..892ab32df68235fd2101b15855500e8ee6d5f8d5 100755
--- a/app/src/main/java/ohi/andre/consolelauncher/tuils/Tuils.java
+++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/Tuils.java
@@ -1,11 +1,9 @@
 package ohi.andre.consolelauncher.tuils;
 
 import android.annotation.TargetApi;
-import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.ActivityManager.MemoryInfo;
 import android.app.admin.DevicePolicyManager;
-import android.content.ActivityNotFoundException;
 import android.content.ClipData;
 import android.content.ClipboardManager;
 import android.content.ComponentName;
@@ -25,12 +23,18 @@ import android.provider.MediaStore;
 import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.DisplayMetrics;
+import android.util.Log;
 import android.util.TypedValue;
+import android.view.View;
+import android.view.ViewGroup;
+import android.webkit.MimeTypeMap;
 
 import java.io.BufferedReader;
 import java.io.DataOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.PrintWriter;
@@ -41,10 +45,11 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Enumeration;
 import java.util.List;
+import java.util.regex.Pattern;
 
 import dalvik.system.DexFile;
 import ohi.andre.consolelauncher.BuildConfig;
-import ohi.andre.consolelauncher.managers.MusicManager;
+import ohi.andre.consolelauncher.managers.music.MusicManager;
 import ohi.andre.consolelauncher.managers.SkinManager;
 import ohi.andre.consolelauncher.managers.XMLPrefsManager;
 import ohi.andre.consolelauncher.tuils.stuff.FakeLauncherActivity;
@@ -71,15 +76,19 @@ public class Tuils {
 
     public static int getBatteryPercentage(Context context) {
 
-        IntentFilter iFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
-        Intent batteryStatus = context.registerReceiver(null, iFilter);
+        try {
+            IntentFilter iFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
+            Intent batteryStatus = context.registerReceiver(null, iFilter);
 
-        int level = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) : -1;
-        int scale = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1) : -1;
+            int level = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) : -1;
+            int scale = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1) : -1;
 
-        float batteryPct = level / (float) scale;
+            float batteryPct = level / (float) scale;
 
-        return (int) (batteryPct * 100);
+            return (int) (batteryPct * 100);
+        } catch (Exception e) {
+            return -1;
+        }
     }
 
     public static boolean containsExtension(String[] array, String value) {
@@ -163,11 +172,10 @@ public class Tuils {
         c.startActivity(intent);
     }
 
-    public static void requestAdmin(Activity a, ComponentName component, String label) {
+    public static Intent requestAdmin(ComponentName component) {
         Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
         intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, component);
-        intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, label);
-        a.startActivity(intent);
+        return intent;
     }
 
     public static Intent webPage(String url) {
@@ -175,103 +183,43 @@ public class Tuils {
     }
 
     public static double getAvailableInternalMemorySize(int unit) {
-        File path = Environment.getDataDirectory();
-        StatFs stat = new StatFs(path.getPath());
-
-        long blockSize;
-        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
-            blockSize = stat.getBlockSizeLong();
-        } else {
-            blockSize = stat.getBlockSize();
-        }
-
-        long availableBlocks = 0;
-        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
-            availableBlocks = stat.getAvailableBlocksLong();
-        } else {
-            availableBlocks = stat.getAvailableBlocks();
-        }
-
-        return formatSize(availableBlocks * blockSize, unit);
+        return getAvailableSpace(Environment.getDataDirectory(), unit);
     }
 
     public static double getTotalInternalMemorySize(int unit) {
-        File path = Environment.getDataDirectory();
-        StatFs stat = new StatFs(path.getPath());
-
-        long blockSize;
-        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
-            blockSize = stat.getBlockSizeLong();
-        } else {
-            blockSize = stat.getBlockSize();
-        }
-
-        long totalBlocks = 0;
-        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
-            totalBlocks = stat.getBlockCountLong();
-        } else {
-            totalBlocks = stat.getBlockCount();
-        }
-
-        return formatSize(totalBlocks * blockSize, unit);
+        return getTotaleSpace(Environment.getDataDirectory(), unit);
     }
 
     public static double getAvailableExternalMemorySize(int unit) {
-        if (externalMemoryAvailable()) {
-            File path = Environment.getExternalStorageDirectory();
-            StatFs stat = new StatFs(path.getPath());
-
-            long blockSize;
-            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
-                blockSize = stat.getBlockSizeLong();
-            } else {
-                blockSize = stat.getBlockSize();
-            }
-
-            long availableBlocks = 0;
-            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
-                availableBlocks = stat.getAvailableBlocksLong();
-            } else {
-                availableBlocks = stat.getAvailableBlocks();
-            }
-
-            return formatSize(availableBlocks * blockSize, unit);
-        } else {
+        try {
+            return getAvailableSpace(new File(System.getenv("SECONDARY_STORAGE")), unit);
+        } catch (Exception e) {
             return -1;
         }
     }
 
     public static double getTotalExternalMemorySize(int unit) {
-        if (externalMemoryAvailable()) {
-            File path = Environment.getExternalStorageDirectory();
-            StatFs stat = new StatFs(path.getPath());
-
-            long blockSize;
-            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
-                blockSize = stat.getBlockSizeLong();
-            } else {
-                blockSize = stat.getBlockSize();
-            }
-
-            long totalBlocks = 0;
-            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
-                totalBlocks = stat.getBlockCountLong();
-            } else {
-                totalBlocks = stat.getBlockCount();
-            }
-
-            return formatSize(totalBlocks * blockSize, unit);
-        } else {
+        try {
+            return getTotaleSpace(new File(System.getenv("SECONDARY_STORAGE")), unit);
+        } catch (Exception e) {
             return -1;
         }
     }
 
-    public static double percentage(double part, double total) {
-        return round(part * 100 / total, 2);
+    public static double getAvailableSpace(File dir, int unit) {
+        StatFs statFs = new StatFs(dir.getAbsolutePath());
+        long blocks = statFs.getAvailableBlocks();
+        return formatSize(blocks * statFs.getBlockSize(), unit);
+    }
+
+    public static double getTotaleSpace(File dir, int unit) {
+        StatFs statFs = new StatFs(dir.getAbsolutePath());
+        long blocks = statFs.getBlockCount();
+        return formatSize(blocks * statFs.getBlockSize(), unit);
     }
 
-    public static boolean externalMemoryAvailable() {
-        return android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
+    public static double percentage(double part, double total) {
+        return round(part * 100 / total, 2);
     }
 
     public static double formatSize(long bytes, int unit) {
@@ -302,12 +250,16 @@ public class Tuils {
         return round(result, 2);
     }
 
-    public static int max(int... ints) {
-        int max = ints[0];
-        for(int count = 1; count < ints.length; count++) {
-            max = Math.max(max, ints[count]);
-        }
-        return max;
+    public static void deepView(View v) {
+        Tuils.log(v.toString());
+
+        if(!(v instanceof ViewGroup)) return;
+        ViewGroup g = (ViewGroup) v;
+
+        Tuils.log(g.getChildCount());
+        for(int c = 0; c < g.getChildCount(); c++) deepView(g.getChildAt(c));
+
+        Tuils.log("end of parents of: " + v.toString());
     }
 
     public static final int TERA = 0;
@@ -371,7 +323,7 @@ public class Tuils {
     }
 
     private static String getNicePath(String filePath) {
-        String home = Tuils.getInternalDirectoryPath();
+        String home = Environment.getExternalStorageDirectory().getAbsolutePath();
 
         if(filePath.equals(home)) {
             return "~";
@@ -389,6 +341,9 @@ public class Tuils {
     public static int find(Object o, List list) {
         for(int count = 0; count < list.size(); count++) {
             Object x = list.get(count);
+            if(x == null) continue;
+
+            if(o == x) return count;
 
             if (o instanceof XMLPrefsManager.XMLPrefsSave) {
                 try {
@@ -411,39 +366,18 @@ public class Tuils {
         return -1;
     }
 
+    static Pattern pd = Pattern.compile("%d", Pattern.CASE_INSENSITIVE);
+    static Pattern pu = Pattern.compile("%u", Pattern.CASE_INSENSITIVE);
+    static Pattern pp = Pattern.compile("%p", Pattern.CASE_INSENSITIVE);
     public static String getHint(SkinManager skinManager, String currentPath) {
+        String format = skinManager.ssnInfoFormat;
+        if(format.length() == 0) return null;
 
-        if(!skinManager.showUsernameAndDeviceWhenEmpty) {
-            return null;
-        }
-
-        String username = Tuils.EMPTYSTRING;
-        if (skinManager.showUsername) {
-            username = skinManager.username;
-            if (username == null || username.length() == 0) {
-                username = Tuils.EMPTYSTRING;
-            }
-        }
-
-        String deviceName = Tuils.EMPTYSTRING;
-        if(skinManager.showDeviceInSessionInfo) {
-            deviceName = skinManager.deviceName;
-        }
-
-        String path = Tuils.EMPTYSTRING;
-        if(skinManager.showPath) {
-            path = ":" + getNicePath(currentPath);
-        }
+        format = pd.matcher(format).replaceAll(skinManager.deviceName);
+        format = pu.matcher(format).replaceAll(skinManager.username);
+        format = pp.matcher(format).replaceAll(Tuils.getNicePath(currentPath));
 
-        if(username.equals(Tuils.EMPTYSTRING)) {
-            return deviceName + path;
-        } else {
-            if(deviceName.equals(Tuils.EMPTYSTRING)) {
-                return username + path;
-            } else {
-                return username + "@" + deviceName + path;
-            }
-        }
+        return format;
     }
 
     public static int findPrefix(List<String> list, String prefix) {
@@ -524,6 +458,43 @@ public class Tuils {
         return Tuils.EMPTYSTRING;
     }
 
+    public static void log(Object o) {
+        if(o instanceof Throwable) {
+            Log.e("andre", "", (Throwable) o);
+        } else {
+            Log.e("andre", String.valueOf(o));
+        }
+    }
+
+    static FileOutputStream logStream = null;
+    public static void openLogStream(String name) {
+        closeStream();
+
+        try {
+            File file = new File(Tuils.getFolder(), name);
+            logStream = new FileOutputStream(file);
+        } catch (FileNotFoundException e) {}
+    }
+
+    public static void write(Throwable t) {
+        write(Tuils.getStackTrace(t));
+    }
+
+    public static void write(String line) {
+        if(logStream != null) try {
+            logStream.write((line + Tuils.NEWLINE).getBytes());
+        } catch (IOException e) {}
+    }
+
+    public static void closeStream() {
+        if(logStream != null) {
+            try {
+                logStream.close();
+                logStream = null;
+            } catch (IOException e) {}
+        }
+    }
+
     public static String toPlanString(List<String> strings, String separator) {
         if(strings != null) {
             String[] object = new String[strings.size()];
@@ -609,70 +580,34 @@ public class Tuils {
         return true;
     }
 
-    public static String getFileType(File url) {
-        if (url.toString().contains(".doc") || url.toString().contains(".docx")) {
-            return "application/msword";
-        } else if (url.toString().contains(".pdf")) {
-            return "application/pdf";
-        } else if (url.toString().contains(".ppt") || url.toString().contains(".pptx")) {
-            return "application/vnd.ms-powerpoint";
-        } else if (url.toString().contains(".xls") || url.toString().contains(".xlsx")) {
-            return "application/vnd.ms-excel";
-        } else if (url.toString().contains(".zip") || url.toString().contains(".rar")) {
-            return "application/x-wav";
-        } else if (url.toString().contains(".rtf")) {
-            return "application/rtf";
-        } else if (url.toString().contains(".wav") || url.toString().contains(".mp3")) {
-            return "audio/x-wav";
-        } else if (url.toString().contains(".gif")) {
-            return "image/gif";
-        } else if (url.toString().contains(".jpg") || url.toString().contains(".jpeg") || url.toString().contains(".png")) {
-            return "image/jpeg";
-        } else if (url.toString().contains(".txt")) {
-            return "text/plain";
-        } else if (url.toString().contains(".3gp") || url.toString().contains(".mpg") || url.toString().contains(".mpeg") || url.toString().contains(".mpe") || url.toString().contains(".mp4") ||
-                url.toString().contains(".avi")) {
-            return "video/*";
-        } else {
-            return "*/*";
-        }
-    }
-
     public static Intent openFile(File url) {
-        try {
-            Intent intent = new Intent(Intent.ACTION_VIEW);
-            intent.setDataAndType(Uri.fromFile(url), getFileType(url));
+        Uri u = Uri.fromFile(url);
+        Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
 
-            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-            return intent;
-        } catch (ActivityNotFoundException e) {
-            return null;
-        }
+        String extension = MimeTypeMap.getFileExtensionFromUrl(u.toString());
+        String mimetype = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
+
+        intent.setDataAndType(u,mimetype);
+        return intent;
     }
 
     public static Intent shareFile(File url) {
         Intent intent = new Intent(Intent.ACTION_SEND);
         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 
-        intent.setDataAndType(Uri.fromFile(url), getFileType(url));
-        intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(url));
+        Uri u = Uri.fromFile(url);
 
-        return intent;
-    }
+        String extension = MimeTypeMap.getFileExtensionFromUrl(u.toString());
+        String mimetype = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
 
-    public static String getInternalDirectoryPath() {
-        File f = Environment.getExternalStorageDirectory();
-        if(f != null) {
-            return f.getAbsolutePath();
-        }
-        return null;
+        intent.setDataAndType(u,mimetype);
+        intent.putExtra(Intent.EXTRA_STREAM, u);
+
+        return intent;
     }
 
     private static File getTuiFolder() {
-        String internalDir = Tuils.getInternalDirectoryPath();
-        if(internalDir == null) {
-            return null;
-        }
+        File internalDir = Environment.getExternalStorageDirectory();
         return new File(internalDir, TUI_FOLDER);
     }
 
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 940a5c173e740852cc5ee93c7e3dd5be72ee3f3a..bbefb557a069b9a697f956b59fb63860ced0146b 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
@@ -4,5 +4,6 @@ package ohi.andre.consolelauncher.tuils.interfaces;
  * Created by andre on 25/07/15.
  */
 public interface Outputable {
-    void onOutput(String output);
+    void onOutput(CharSequence output, int category);
+    void onOutput(CharSequence output);
 }
diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/Redirectator.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/Redirectator.java
old mode 100755
new mode 100644
diff --git a/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/Suggester.java b/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/Suggester.java
new file mode 100644
index 0000000000000000000000000000000000000000..a972758871535a497de7d93798656767e7dfabd5
--- /dev/null
+++ b/app/src/main/java/ohi/andre/consolelauncher/tuils/interfaces/Suggester.java
@@ -0,0 +1,10 @@
+package ohi.andre.consolelauncher.tuils.interfaces;
+
+/**
+ * Created by francescoandreuzzi on 24/07/2017.
+ */
+
+public interface Suggester {
+
+    void requestUpdate();
+}
diff --git a/app/src/main/res/layout/input_down_layout.xml b/app/src/main/res/layout/input_down_layout.xml
index dfabbfe911c5128675bdae26b096f810c106fd08..a885aa033199db03bb9e4165148a8a7ffbe9a6cc 100755
--- a/app/src/main/res/layout/input_down_layout.xml
+++ b/app/src/main/res/layout/input_down_layout.xml
@@ -116,7 +116,9 @@
                 android:layout_height="wrap_content"
 
                 android:scrollHorizontally="false"
-                android:scrollbars="vertical"/>
+                android:scrollbars="vertical"
+                android:textIsSelectable="true"
+                android:gravity="bottom"/>
 
         </LinearLayout>
 
diff --git a/app/src/main/res/layout/input_up_layout.xml b/app/src/main/res/layout/input_up_layout.xml
index eebdc681fd66e725f0b973e14a26a04fd3f3503d..1980a2b6a19290fc8d430b2a98f480e1b0bf4abe 100755
--- a/app/src/main/res/layout/input_up_layout.xml
+++ b/app/src/main/res/layout/input_up_layout.xml
@@ -79,15 +79,23 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent">
 
-        <TextView
-            android:id="@+id/terminal_view"
+        <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
 
-            android:gravity="bottom"
-            android:scrollHorizontally="false"
-            android:scrollbars="vertical"
-            android:textIsSelectable="true"/>
+            android:orientation="vertical">
+
+            <TextView
+                android:id="@+id/terminal_view"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+
+                android:gravity="bottom"
+                android:scrollHorizontally="false"
+                android:scrollbars="vertical"
+                android:textIsSelectable="true"/>
+
+        </LinearLayout>
 
     </ScrollView>
 
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 38ef6789a645fb2cf2f4451d51ef965bb48b7927..4b15629d8ad084d7d476c0c1a4ef959b23a81a18 100755
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -12,13 +12,14 @@
     <string name="output_error">An unknown error has occurred</string>
     <string name="location_off">Turn on GPS or network location</string>
     <string name="invalid_integer">Invalid integer</string>
+    <string name="activity_not_found">Ativity not found</string>
 
     <!-- busy -->
     <string name="busy">T-UI is busy, wait until the execution finishes or use the command \"ctrlc\"</string>
     <string name="busy_hint">type \"ctrlc\" to stop</string>
 
     <string name="rate_donate_text">\nDo you like my work? Rate on Play Store (command: >>rate) or offer me a coffee (command: >>donate). Thank you for using T-UI.
-        \n\nYou can disable this message with the command "config -set donation_message false"</string>
+        \n\nYou can disable this message with the command\nconfig -set donation_message false</string>
     <string name="firsthelp_text">First time with t-ui? Use the command "tutorial" or "help"</string>
 
     <!-- app mgr -->
@@ -44,6 +45,7 @@
     <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="output_usedefapp">You can use "apps -default_app" instead</string>
 
     <!-- alias -->
     <string name="output_aliasnotfound">Alias not found:</string>
@@ -81,7 +83,7 @@
     <string name="output_nowriteable">You can\'t write or delete this file</string>
 
     <!-- install/uninstall -->
-    <string name="app_installed">\nApp installed:</string>
+    <string name="app_installed">App installed:</string>
 
     <!-- music -->
     <string name="output_playing">Playing:</string>
@@ -143,6 +145,7 @@
         \n-l -> show details about an app
         \n-ps -> show Google Play Store page for an app
         \n-st -> show Settings details for an app
+        \n-default_app -> change the default_app at the specified index ("apps -default_app index appName")
         \n-frc -> force t-ui to launch an app
         \n-file -> open apps.xml
         \nno option -> list your apps
@@ -205,7 +208,7 @@
     </string>
     <string name="help_previous">Play the last track played</string>
     <string name="help_rate">Help T-UI with a positive rate (or negative, I don\'t know)\t;)</string>
-    <string name="help_refresh">Refresh apps and alias</string>
+    <string name="help_refresh">Refresh apps, alias, music, contacts</string>
     <string name="help_restart">Restart t-ui and load modified values</string>
     <string name="help_rm">Remove a file:
         \nUsage:
@@ -233,7 +236,9 @@
     <string name="help_shellcommands">Print Terminal Emulator commands</string>
     <string name="help_status">Get infos about battery charge, wifi status and mobile data</string>
     <string name="help_stop">Stop the player</string>
-    <string name="help_time">Print current time</string>
+    <string name="help_time">Print the current time with the given format
+        \n\nUsage:
+        \n$ time [index]</string>
     <string name="help_track">Print informations about the current track</string>
     <string name="help_tracks">Print all of the tracks in your music folder</string>
     <string name="help_tuixt">Open the text editor.
@@ -286,21 +291,16 @@
         \ncntcts [option] [*optional* contact]
         \n\n-ls -> list your contacts
         \n-l -> show details about a contact
-        \n-new -> create a new contact
+        \n-add -> create a new contact
         \n-edit -> edit an existing contact
         \n-rm -> remove a contact
         \n\nExample:
         \n\ncntcts -edit James Pike
-        \ncntcts -new</string>
+        \ncntcts -add</string>
     <string name="help_exit">Close T-UI and reset launcher preferences</string>
 
     <!-- linux -->
-    <string name="help_cd">Change the current directory
-        \nUsage:
-        \n>>cd [path]
-        \n\nExample:
-        \n>>cd /storage/sdcard1/DCIM
-    </string>
+    <string name="help_ctrlc">Send SIGINT to the current shell process</string>
     <string name="help_open">Open a file with the default application
         \nUsage:
         \n>>open [pathToFile]