diff --git a/test/korap-ui.js b/test/korap-ui.js
index 3f27386..8d5a819 100644
--- a/test/korap-ui.js
+++ b/test/korap-ui.js
@@ -8,54 +8,7 @@
 const KORAP_LOGIN =  process.env.KORAP_LOGIN || "user2";
 const KORAP_PWD = process.env.KORAP_PWD || "password2";
 const KORAP_QUERIES = "geht"
-// const korap_rc = require('../lib/korap_rc.js');
-
-async function KorAPlogin(page, username, password) {
-    await page.goto(KORAP_URL, { waitUntil: 'networkidle0' });
-    const username_field = await page.$("body > aside > div > fieldset > form > input[type=text]")
-
-    if (username_field != null) {
-        await username_field.type(username);
-        await page.keyboard.press("Tab")
-        await page.keyboard.type(password)
-        await page.keyboard.press("Enter")
-    }
-
-    await page.waitForNavigation({ waitUntil: 'networkidle2' });
-    logout = await page.$("body > header > div > a[class=logout]")
-    if (logout == null) {
-        return false
-    }
-
-    let value = await page.evaluate(logout => logout.textContent, logout)
-    if (!value.match(/(Abmelden|Logout)/)) {
-        return false
-    }
-    return true
-}
-
-async function KorAPlogout(page) {
-    const logout_button = await page.$("a[class=logout]")
-    if (logout_button == null) {
-        return false
-    }
-    await page.click("a[class=logout]")
-    const username_field = await page.$("body > aside > div > fieldset > form > input[type=text]")
-    assert.notEqual(username_field, null)
-    return true
-}
-
-async function search(page, query) {
-    const query_field = await page.$("body > header > form > div > input[name=q]")
-    assert.notEqual(query_field, null)
-    await query_field.type(query)
-    await page.keyboard.press("Enter")
-    await page.waitForNavigation();
-    const total_results = await page.$("#total-results")
-    assert.notEqual(total_results, null, "cannot find total results")
-    const hits = Number(await page.evaluate(total_results => total_results.textContent, total_results))
-    return hits
-}
+const korap_rc = require('../lib/korap_rc.js').new(KORAP_URL);
 
 describe('Running KorAP UI tests on ' + KORAP_URL, () => {
     const screenshot = 'screenshot.png'
@@ -71,13 +24,13 @@
 
     it('Login into KorAP with incorrect credentials fails',
         (async () => {
-            const login_result = await KorAPlogin(page, KORAP_LOGIN, KORAP_PWD + "*")
+            const login_result = await  korap_rc.login(page, KORAP_LOGIN, KORAP_PWD + "*")
             login_result.should.be.false
         })).timeout(10000)
 
     it('Login into KorAP with correct credentials succeeds',
         (async () => {
-            const login_result = await KorAPlogin(page, KORAP_LOGIN, KORAP_PWD)
+            const login_result = await korap_rc.login(page, KORAP_LOGIN, KORAP_PWD)
             login_result.should.be.true
         })).timeout(10000)
 
@@ -85,20 +38,15 @@
 
     it('Search for "' + KORAP_QUERIES + '" has approx. ' + expected_hits + ' hits',
         (async () => {
-            glimpse = await page.$("input[name=cutoff]")
-            glimpse_value = await (await glimpse.getProperty('checked')).jsonValue()
-            if (glimpse_value) {
-                glimpse = await page.$("input[name=cutoff]")
-                await page.click("#glimpse")
-            }
-            const hits = await search(page, KORAP_QUERIES)
+            await korap_rc.assure_glimpse_off(page)
+            const hits = await korap_rc.search(page, KORAP_QUERIES)
             await page.screenshot({ path: screenshot })
             hits.should.be.approximately(expected_hits, 10)
         })).timeout(20000)
 
     it('Logout works',
         (async () => {
-            const logout_result = await KorAPlogout(page)
+            const logout_result = await korap_rc.logout(page)
             logout_result.should.be.true
         })).timeout(10000)
 
