diff --git a/build.gradle b/build.gradle
index 13e0db0..386bc69 100644
--- a/build.gradle
+++ b/build.gradle
@@ -58,14 +58,17 @@ task deleteLibs(type: Delete) {
 preBuild.dependsOn downloadx86*/
 
 dependencies {
-    implementation libs.okhttp
     implementation libs.commons.codec
-    implementation libs.ktsh
     implementation libs.appcompat
     implementation libs.material
     implementation libs.activity
     implementation libs.constraintlayout
     implementation libs.room.runtime
+    implementation "androidx.room:room-rxjava3:2.6.1"
+    implementation 'io.reactivex.rxjava3:rxandroid:3.0.2'
+    implementation 'io.reactivex.rxjava3:rxjava:3.1.5'
+    compileOnly 'org.projectlombok:lombok:1.18.34'
+    annotationProcessor 'org.projectlombok:lombok:1.18.34'
     annotationProcessor libs.room.compiler
     testImplementation libs.junit
     androidTestImplementation libs.ext.junit
diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index 02855a4..bda8b94 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -21,7 +21,7 @@
         tools:targetApi="34"
         tools:replace="android:allowBackup">
         <activity
-            android:name=".MainActivity"
+            android:name=".activity.MainActivity"
             android:screenOrientation="portrait"
             android:configChanges="keyboardHidden|orientation|screenSize"
             android:exported="true">
diff --git a/src/main/java/com/alterdekim/fridaapp/MainActivity.java b/src/main/java/com/alterdekim/fridaapp/activity/MainActivity.java
similarity index 69%
rename from src/main/java/com/alterdekim/fridaapp/MainActivity.java
rename to src/main/java/com/alterdekim/fridaapp/activity/MainActivity.java
index a322eef..55b9229 100644
--- a/src/main/java/com/alterdekim/fridaapp/MainActivity.java
+++ b/src/main/java/com/alterdekim/fridaapp/activity/MainActivity.java
@@ -1,15 +1,17 @@
-package com.alterdekim.fridaapp;
+package com.alterdekim.fridaapp.activity;
 
 import android.app.Activity;
 import android.content.Intent;
-import android.net.Uri;
 import android.net.VpnService;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.MenuItem;
 import android.view.View;
+import android.widget.CompoundButton;
+import android.widget.LinearLayout;
 import android.widget.PopupMenu;
+import android.widget.TextView;
 import android.widget.Toast;
 
 import androidx.activity.EdgeToEdge;
@@ -21,18 +23,26 @@ import androidx.core.view.ViewCompat;
 import androidx.core.view.WindowInsetsCompat;
 import androidx.room.Room;
 
+import com.alterdekim.fridaapp.R;
+import com.alterdekim.fridaapp.controller.ControllerId;
+import com.alterdekim.fridaapp.controller.ControllerManager;
+import com.alterdekim.fridaapp.controller.MainActivityController;
+import com.alterdekim.fridaapp.util.Util;
 import com.alterdekim.fridaapp.room.AppDatabase;
 import com.alterdekim.fridaapp.room.Config;
 import com.alterdekim.fridaapp.service.FridaService;
+import com.google.android.material.switchmaterial.SwitchMaterial;
 
 import org.apache.commons.codec.binary.Base32;
 
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
+import java.util.Iterator;
 
 public class MainActivity extends AppCompatActivity implements PopupMenu.OnMenuItemClickListener {
     private static final String TAG = MainActivity.class.getSimpleName();
-    private AppDatabase db;
+
+    private MainActivityController controller;
 
     ActivityResultLauncher<Intent> someActivityResultLauncher = registerForActivityResult(
             new ActivityResultContracts.StartActivityForResult(),
@@ -62,12 +72,18 @@ public class MainActivity extends AppCompatActivity implements PopupMenu.OnMenuI
         super.onCreate(savedInstanceState);
         EdgeToEdge.enable(this);
         setContentView(R.layout.activity_main);
-        this.db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "def-db").build();
+
+        ControllerManager.putController(new MainActivityController());
+        this.controller = (MainActivityController) ControllerManager.getController(ControllerId.MainActivityController);
+
         ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
             Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
             v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
             return insets;
         });
+
+        this.controller.onCreateGUI(this);
+
         findViewById(R.id.addConfig).setOnClickListener(v -> {
             PopupMenu popup = new PopupMenu(this, v);
             popup.setOnMenuItemClickListener(MainActivity.this);
@@ -75,10 +91,25 @@ public class MainActivity extends AppCompatActivity implements PopupMenu.OnMenuI
             popup.show();
         });
 
-        LayoutInflater inflater = getLayoutInflater();
-        for( Config config : db.userDao().getAll() ) {
 
-            View myLayout = inflater.inflate(R.layout.single_config, mainLayout, false);
+        LinearLayout cfg_list = (LinearLayout) findViewById(R.id.config_list);
+        LayoutInflater inflater = getLayoutInflater();
+        Iterator<Config> iter = db.userDao().getAll().iterator();
+        while( iter.hasNext() ) {
+            Config config = iter.next();
+            View cfg_instance = inflater.inflate(R.layout.single_config, cfg_list, false);
+            TextView view_name = (TextView) cfg_instance.findViewById(R.id.config_name);
+            SwitchMaterial view_switch = (SwitchMaterial) cfg_instance.findViewById(R.id.config_switch);
+            //view_switch.setUseMaterialThemeColors(true);
+            view_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+                @Override
+                public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
+                    Log.i(TAG, "onCheckedChanged " + b);
+                }
+            });
+            view_name.setText(config.title);
+
+            if( iter.hasNext() ) inflater.inflate(R.layout.single_divider, cfg_list, false);
         }
     }
 
diff --git a/src/main/java/com/alterdekim/fridaapp/controller/ControllerId.java b/src/main/java/com/alterdekim/fridaapp/controller/ControllerId.java
new file mode 100644
index 0000000..3701946
--- /dev/null
+++ b/src/main/java/com/alterdekim/fridaapp/controller/ControllerId.java
@@ -0,0 +1,5 @@
+package com.alterdekim.fridaapp.controller;
+
+public enum ControllerId {
+    MainActivityController
+}
diff --git a/src/main/java/com/alterdekim/fridaapp/controller/ControllerManager.java b/src/main/java/com/alterdekim/fridaapp/controller/ControllerManager.java
new file mode 100644
index 0000000..be3d8a4
--- /dev/null
+++ b/src/main/java/com/alterdekim/fridaapp/controller/ControllerManager.java
@@ -0,0 +1,17 @@
+package com.alterdekim.fridaapp.controller;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class ControllerManager {
+
+    private static final Map<ControllerId, IController> map = new HashMap<>();
+
+    public static void putController(IController controller) {
+        if( !map.containsKey(controller.getControllerId()) ) map.put(controller.getControllerId(), controller);
+    }
+
+    public static IController getController(ControllerId id) {
+        return map.get(id);
+    }
+}
diff --git a/src/main/java/com/alterdekim/fridaapp/controller/IController.java b/src/main/java/com/alterdekim/fridaapp/controller/IController.java
new file mode 100644
index 0000000..c14b06c
--- /dev/null
+++ b/src/main/java/com/alterdekim/fridaapp/controller/IController.java
@@ -0,0 +1,8 @@
+package com.alterdekim.fridaapp.controller;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+public interface IController {
+    ControllerId getControllerId();
+    void onCreateGUI(AppCompatActivity activity);
+}
diff --git a/src/main/java/com/alterdekim/fridaapp/controller/MainActivityController.java b/src/main/java/com/alterdekim/fridaapp/controller/MainActivityController.java
new file mode 100644
index 0000000..df3dbfc
--- /dev/null
+++ b/src/main/java/com/alterdekim/fridaapp/controller/MainActivityController.java
@@ -0,0 +1,21 @@
+package com.alterdekim.fridaapp.controller;
+
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.room.Room;
+
+import com.alterdekim.fridaapp.room.AppDatabase;
+
+public class MainActivityController implements IController {
+
+    private AppDatabase db;
+
+    @Override
+    public ControllerId getControllerId() {
+        return ControllerId.MainActivityController;
+    }
+
+    @Override
+    public void onCreateGUI(AppCompatActivity activity) {
+        this.db = Room.databaseBuilder(activity.getApplicationContext(), AppDatabase.class, "def-db").build();
+    }
+}
diff --git a/src/main/java/com/alterdekim/fridaapp/room/Config.java b/src/main/java/com/alterdekim/fridaapp/room/Config.java
index 39b1c67..c1f1332 100644
--- a/src/main/java/com/alterdekim/fridaapp/room/Config.java
+++ b/src/main/java/com/alterdekim/fridaapp/room/Config.java
@@ -4,19 +4,21 @@ import androidx.room.ColumnInfo;
 import androidx.room.Entity;
 import androidx.room.PrimaryKey;
 
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+
 @Entity
+@RequiredArgsConstructor
+@Getter
+@Setter
 public class Config {
     @PrimaryKey
     public int uid;
 
     @ColumnInfo(name = "title")
-    public String title;
+    public final String title;
 
     @ColumnInfo(name = "data_b32")
-    public String data_b32;
-
-    public Config(String title, String data_b32) {
-        this.title = title;
-        this.data_b32 = data_b32;
-    }
+    public final String data_b32;
 }
diff --git a/src/main/java/com/alterdekim/fridaapp/service/FridaService.java b/src/main/java/com/alterdekim/fridaapp/service/FridaService.java
index d3e2178..41d6ef0 100644
--- a/src/main/java/com/alterdekim/fridaapp/service/FridaService.java
+++ b/src/main/java/com/alterdekim/fridaapp/service/FridaService.java
@@ -6,16 +6,6 @@ import android.net.VpnService;
 import android.os.ParcelFileDescriptor;
 import android.util.Log;
 
-import com.alterdekim.frida.FridaLib;
-import com.alterdekim.fridaapp.R;
-
-import java.io.IOException;
-import java.util.Objects;
-
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.Response;
-
 public class FridaService extends VpnService {
     private static final String TAG = FridaService.class.getSimpleName();
     private static final String VPN_ADDRESS = "10.66.66.6"; // Only IPv4 support for now
@@ -28,42 +18,16 @@ public class FridaService extends VpnService {
     public void onCreate() {
         setupVPN();
         Log.i(TAG, "Started");
-        // .detachFd()
         try {
             Thread t = new Thread(new NativeBinaryConnection(vpnInterface.dup().detachFd(), getApplicationContext().getApplicationInfo().nativeLibraryDir));
             t.start();
         } catch (Exception e) {
             Log.e(TAG, e.getMessage());
         }
-
-        new Thread(new Runnable() {
-            @Override
-            public void run() {
-                OkHttpClient client = new OkHttpClient();
-
-
-                Request request = new Request.Builder()
-                        .url("https://google.com")
-                        .build();
-                try {
-                    try (Response response = client.newCall(request).execute()) {
-                      //  Log.i(TAG, "Response code: " + response.code());
-                        if (response.body() != null) {
-                         //   Log.i(TAG, "Response body: " + response.body().string());
-                        } else {
-                          //  Log.i(TAG, "Response body: null");
-                        }
-                    }
-                } catch (IOException e) {
-                    Log.e(TAG, Objects.requireNonNull(e.getMessage()));
-                }
-            }
-        }).start();
     }
 
     private void setupVPN() {
         try {
-            //if (vpnInterface == null) {
                 Builder builder = new Builder();
                 builder.setMtu(1400);
                 builder.addAddress(VPN_ADDRESS, 24);
@@ -71,10 +35,7 @@ public class FridaService extends VpnService {
                 builder.addDnsServer("8.8.8.8");
                 //builder.addAllowedApplication();
                 builder.addDisallowedApplication("com.alterdekim.fridaapp");
-                // .setSession(getString(R.string.app_name))
-                // .setConfigureIntent(pendingIntent)
                 vpnInterface = builder.establish();
-           // }
         } catch (Exception e) {
             Log.e(TAG, "error", e);
         }
diff --git a/src/main/java/com/alterdekim/fridaapp/service/NativeBinaryConnection.java b/src/main/java/com/alterdekim/fridaapp/service/NativeBinaryConnection.java
index 99748bb..e5881a5 100644
--- a/src/main/java/com/alterdekim/fridaapp/service/NativeBinaryConnection.java
+++ b/src/main/java/com/alterdekim/fridaapp/service/NativeBinaryConnection.java
@@ -3,11 +3,6 @@ package com.alterdekim.fridaapp.service;
 import android.util.Log;
 
 import com.alterdekim.frida.FridaLib;
-import com.jaredrummler.ktsh.Shell;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.InputStreamReader;
 
 public class NativeBinaryConnection implements Runnable {
     private static final String TAG = NativeBinaryConnection.class.getSimpleName();
diff --git a/src/main/java/com/alterdekim/fridaapp/Util.java b/src/main/java/com/alterdekim/fridaapp/util/Util.java
similarity index 97%
rename from src/main/java/com/alterdekim/fridaapp/Util.java
rename to src/main/java/com/alterdekim/fridaapp/util/Util.java
index cc0807e..851f177 100644
--- a/src/main/java/com/alterdekim/fridaapp/Util.java
+++ b/src/main/java/com/alterdekim/fridaapp/util/Util.java
@@ -1,4 +1,4 @@
-package com.alterdekim.fridaapp;
+package com.alterdekim.fridaapp.util;
 
 import android.content.Context;
 import android.database.Cursor;
diff --git a/src/main/res/layout/activity_main.xml b/src/main/res/layout/activity_main.xml
index c879e1a..bf235d2 100644
--- a/src/main/res/layout/activity_main.xml
+++ b/src/main/res/layout/activity_main.xml
@@ -5,7 +5,7 @@
     android:id="@+id/main"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context=".MainActivity">
+    tools:context=".activity.MainActivity">
 
     <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"