diff --git a/Changes b/Changes
index 13db6ce..b048dc5 100644
--- a/Changes
+++ b/Changes
@@ -5,6 +5,7 @@
 - Add pipe response rewriting (#794)
 - Fix datatype for query statistics (close #802)
 - Remove admin test data from database migration (close #808)
+- Remove user default settings from the database migration (close #810)
 
 # version 0.78.2
 
diff --git a/src/main/resources/db/test/V3.6__insert_default_settings.sql b/src/main/resources/db/test/V3.6__insert_default_settings.sql
index 5bd5264..4208ac4 100644
--- a/src/main/resources/db/test/V3.6__insert_default_settings.sql
+++ b/src/main/resources/db/test/V3.6__insert_default_settings.sql
@@ -1,2 +1,2 @@
-INSERT INTO default_setting(username,settings) 
-	VALUES ("bubbles",'{"pos-foundry":"corenlp", "lemma-foundry":"opennlp"}');
+--INSERT INTO default_setting(username,settings) 
+--	VALUES ("bubbles",'{"pos-foundry":"corenlp", "lemma-foundry":"opennlp"}');
diff --git a/src/test/java/de/ids_mannheim/korap/config/TestBase.java b/src/test/java/de/ids_mannheim/korap/config/TestBase.java
new file mode 100644
index 0000000..fab897b
--- /dev/null
+++ b/src/test/java/de/ids_mannheim/korap/config/TestBase.java
@@ -0,0 +1,49 @@
+package de.ids_mannheim.korap.config;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.Map;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.net.HttpHeaders;
+
+import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
+import de.ids_mannheim.korap.exceptions.KustvaktException;
+import de.ids_mannheim.korap.exceptions.StatusCodes;
+import de.ids_mannheim.korap.utils.JsonUtils;
+import jakarta.ws.rs.client.Entity;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response.Status;
+
+public abstract class TestBase extends SpringJerseyTest {
+
+	protected Response createUpdateDefaultSettings (String username, Map<String, Object> map)
+            throws KustvaktException {
+        Response response = target().path(API_VERSION).path("~" + username)
+                .path("setting").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue(username, "pass"))
+                .put(Entity.json(map));
+        return response;
+    }
+	
+	protected void testDeleteSetting (String username) throws KustvaktException {
+        Response response = target().path(API_VERSION).path("~" + username)
+                .path("setting").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue(username, "pass"))
+                .delete();
+        assertEquals(Status.OK.getStatusCode(), response.getStatus());
+        response = target().path(API_VERSION).path("~" + username)
+                .path("setting").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue(username, "pass"))
+                .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32").get();
+        assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
+        String entity = response.readEntity(String.class);
+        JsonNode node = JsonUtils.readTree(entity);
+        assertEquals(StatusCodes.NO_RESOURCE_FOUND,
+                node.at("/errors/0/0").asInt());
+        assertEquals(username, node.at("/errors/0/2").asText());
+    }
+}
diff --git a/src/test/java/de/ids_mannheim/korap/rewrite/FoundryRewriteTest.java b/src/test/java/de/ids_mannheim/korap/rewrite/FoundryRewriteTest.java
index 15c3d7a..3d543f3 100644
--- a/src/test/java/de/ids_mannheim/korap/rewrite/FoundryRewriteTest.java
+++ b/src/test/java/de/ids_mannheim/korap/rewrite/FoundryRewriteTest.java
@@ -5,14 +5,18 @@
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
+
 import com.fasterxml.jackson.databind.JsonNode;
 
 import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
 import de.ids_mannheim.korap.config.Attributes;
 import de.ids_mannheim.korap.config.KustvaktConfiguration;
-import de.ids_mannheim.korap.config.SpringJerseyTest;
+import de.ids_mannheim.korap.config.TestBase;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.query.serialize.QuerySerializer;
 import de.ids_mannheim.korap.user.KorAPUser;
@@ -27,7 +31,7 @@
  * @date 18/06/2015
  */
 // MH todo: check position and information of rewrites!
-public class FoundryRewriteTest extends SpringJerseyTest {
+public class FoundryRewriteTest extends TestBase {
 
     // private static String simple_add_query = "[pos=ADJA]";
     // private static String simple_rewrite_query = "[base=Haus]";
@@ -74,8 +78,12 @@
     @Test
     public void testRewritePosFoundryWithUserSetting ()
             throws KustvaktException {
-        // EM: see
-        // full/src/main/resources/db/insert/V3.6__insert_default_settings.sql
+		Map<String, Object> map = new HashMap<>();
+		map.put("pos-foundry", "corenlp");
+		map.put("lemma-foundry", "opennlp");
+		Response response = createUpdateDefaultSettings("bubbles", map);
+		assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
+
         String username = "bubbles";
         QuerySerializer s = new QuerySerializer();
         s.setQuery("[pos=ADJA]", "poliqarp");
@@ -85,12 +93,13 @@
         assertEquals(node.at("/query/wrap/foundry").asText(), "corenlp");
         assertEquals(node.at("/query/wrap/rewrites/0/scope").asText(),
                 "foundry");
+        
+        testRewriteLemmaFoundryWithUserSetting(username);
+        testDeleteSetting(username);
     }
 
-    @Test
-    public void testRewriteLemmaFoundryWithUserSetting ()
+    private void testRewriteLemmaFoundryWithUserSetting (String username)
             throws KustvaktException {
-        String username = "bubbles";
         QuerySerializer s = new QuerySerializer();
         s.setQuery("[base=Haus]", "poliqarp");
         String result = rewriteHandler.processQuery(s.toJSON(),
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/UserSettingControllerTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/UserSettingControllerTest.java
index 176e31b..e7e7ef3 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/UserSettingControllerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/UserSettingControllerTest.java
@@ -6,40 +6,30 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import jakarta.ws.rs.client.Entity;
-
 import org.junit.jupiter.api.Test;
+
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.net.HttpHeaders;
-import jakarta.ws.rs.core.Response;
-import jakarta.ws.rs.core.Response.Status;
 
 import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
 import de.ids_mannheim.korap.config.Attributes;
-import de.ids_mannheim.korap.config.SpringJerseyTest;
+import de.ids_mannheim.korap.config.TestBase;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.exceptions.StatusCodes;
 import de.ids_mannheim.korap.utils.JsonUtils;
+import jakarta.ws.rs.client.Entity;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response.Status;
 
 /**
  * @author margaretha
  */
-public class UserSettingControllerTest extends SpringJerseyTest {
+public class UserSettingControllerTest extends TestBase {
 
     private String username = "UserSetting_Test";
 
     private String username2 = "UserSetting.Test2";
 
-    public Response sendPutRequest (String username, Map<String, Object> map)
-            throws KustvaktException {
-        Response response = target().path(API_VERSION).path("~" + username)
-                .path("setting").request()
-                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
-                        .createBasicAuthorizationHeaderValue(username, "pass"))
-                .put(Entity.json(map));
-        return response;
-    }
-
     @Test
     public void testCreateSettingWithJson () throws KustvaktException {
         String json = "{\"pos-foundry\":\"opennlp\",\"metadata\":[\"author\", \"title\","
@@ -65,7 +55,7 @@
         map.put("pos-foundry", "opennlp");
         map.put("resultPerPage", 25);
         map.put("metadata", "author title textSigle availability");
-        Response response = sendPutRequest(username2, map);
+        Response response = createUpdateDefaultSettings(username2, map);
         assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
         testRetrieveSettings(username2, "opennlp", 25,
                 "author title textSigle availability", false);
@@ -77,7 +67,7 @@
     public void testputRequestInvalidKey () throws KustvaktException {
         Map<String, Object> map = new HashMap<>();
         map.put("key/", "invalidKey");
-        Response response = sendPutRequest(username2, map);
+        Response response = createUpdateDefaultSettings(username2, map);
         assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
         JsonNode node = JsonUtils.readTree(response.readEntity(String.class));
         assertEquals(StatusCodes.INVALID_ARGUMENT,
@@ -159,26 +149,6 @@
                 node.at("/errors/0/0").asInt());
     }
 
-    private void testDeleteSetting (String username) throws KustvaktException {
-        Response response = target().path(API_VERSION).path("~" + username)
-                .path("setting").request()
-                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
-                        .createBasicAuthorizationHeaderValue(username, "pass"))
-                .delete();
-        assertEquals(Status.OK.getStatusCode(), response.getStatus());
-        response = target().path(API_VERSION).path("~" + username)
-                .path("setting").request()
-                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
-                        .createBasicAuthorizationHeaderValue(username, "pass"))
-                .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32").get();
-        assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
-        String entity = response.readEntity(String.class);
-        JsonNode node = JsonUtils.readTree(entity);
-        assertEquals(StatusCodes.NO_RESOURCE_FOUND,
-                node.at("/errors/0/0").asInt());
-        assertEquals(username, node.at("/errors/0/2").asText());
-    }
-
     // EM: deleting a non-existing key does not throw an error,
     // because
     // the purpose of the request has been achieved.
@@ -209,7 +179,7 @@
         map.put("pos-foundry", "malt");
         map.put("resultPerPage", 15);
         map.put("metadata", "author title");
-        Response response = sendPutRequest(username, map);
+        Response response = createUpdateDefaultSettings(username, map);
         assertEquals(Status.OK.getStatusCode(), response.getStatus());
         testRetrieveSettings(username, "malt", 15, "author title", false);
     }
