diff --git a/lib/korap_rc.js b/lib/korap_rc.js
index 5a650a4..158ecbb 100644
--- a/lib/korap_rc.js
+++ b/lib/korap_rc.js
@@ -18,8 +18,31 @@
             if (username == "") return false;
             if (password == "") return false;
 
+            // Check if already logged in as the correct user
+            const currentLoggedInUser = await page.evaluate(() => {
+                const profileBtn = document.querySelector('.dropdown-btn.profile');
+                if (profileBtn) {
+                    const userNameEl = profileBtn.querySelector('.user-name');
+                    return userNameEl ? userNameEl.textContent.trim() : null;
+                }
+                return null;
+            });
+
+            if (currentLoggedInUser === username) {
+                console.log(`Already logged in as ${username}`);
+                return true;
+            } else if (currentLoggedInUser) {
+                console.log(`Logged in as different user: ${currentLoggedInUser}. Logging out...`);
+                await this.logout(page);
+                await page.goto(this.korap_url, { waitUntil: 'domcontentloaded' });
+            }
+
             await page.waitForSelector('.dropdown-btn', { visible: true });
-            await page.click('.dropdown-btn');
+            const loginBtn = await page.$('.dropdown-btn.login') || await page.$('.dropdown-btn');
+            if (!loginBtn) {
+                return false;
+            }
+            await loginBtn.click();
             await page.waitForSelector('input[name=handle_or_email]', { visible: true });
             const username_field = await page.$("input[name=handle_or_email]")
             if (username_field != null) {
@@ -35,7 +58,7 @@
 
             await page.waitForNavigation({ waitUntil: 'domcontentloaded' }); // Wait for navigation after login
             await page.waitForSelector("#q-field", { visible: true }); // Wait for query field to confirm login
-            const logout = await page.$(".logout")
+            const logout = await page.$(".logout, a[data-testid=\"logout\"], .dropdown-btn.profile")
             if (logout == null) {
                 return false
             }
@@ -143,17 +166,36 @@
 
     async logout(page) {
         try {
-            // Direct navigation to logout URL - most reliable method
-            const currentUrl = await page.url();
-            const logoutUrl = currentUrl.replace(/\/$/, '') + '/logout';
+            // First, try to find the logout link in the page
+            const logoutHref = await page.evaluate(() => {
+                const logoutEl = document.querySelector('a.logout, a[data-testid="logout"]');
+                return logoutEl ? logoutEl.getAttribute('href') : null;
+            });
 
-            await page.goto(logoutUrl, { waitUntil: 'domcontentloaded', timeout: 10000 });
+            if (logoutHref) {
+                const absoluteLogoutUrl = new URL(logoutHref, page.url()).href;
+                await page.goto(absoluteLogoutUrl, { waitUntil: 'domcontentloaded', timeout: 10000 });
+            } else {
+                const currentUrl = await page.url();
+                const baseUrl = currentUrl.replace(/\/$/, '');
+                try {
+                    await page.goto(baseUrl + '/user/logout', { waitUntil: 'domcontentloaded', timeout: 5000 });
+                } catch (e) {
+                    await page.goto(baseUrl + '/logout', { waitUntil: 'domcontentloaded', timeout: 5000 });
+                }
+            }
 
             // Navigate back to main page to ensure clean state for subsequent tests
             await page.goto(this.korap_url, { waitUntil: 'domcontentloaded', timeout: 10000 });
 
-            return true;
+            // Verify we are actually logged out
+            const loggedOut = await page.evaluate(() => {
+                return document.querySelector('a.logout, a[data-testid="logout"], .dropdown-btn.profile') === null;
+            });
+
+            return loggedOut;
         } catch (error) {
+            console.error(`Logout failed: ${error.message}`);
             return false;
         }
     }
