diff --git a/server/app/apis/alternatives.py b/server/app/apis/alternatives.py
index 8c247b40da2e33bda5cead7d28ce778f73881c6a..48513250554ccf391bf7647d2cf8211992f6f34a 100644
--- a/server/app/apis/alternatives.py
+++ b/server/app/apis/alternatives.py
@@ -37,7 +37,7 @@ class QuestionAlternatives(Resource):
     def put(self, CID, SOrder, QID, AID):
         args = question_alternative_parser.parse_args(strict=True)
         item = dbc.get.one(QuestionAlternative, AID)
-        item = dbc.edit.question_alternative(item, **args)
+        item = dbc.edit.default(item, **args)
         return item_response(schema.dump(item))
 
     @check_jwt(editor=True)
diff --git a/server/app/apis/answers.py b/server/app/apis/answers.py
index 40e9407fc5d1df9cac874f7d16d28283278adf24..e968e6ecf3d5c70a7987798d3f477cb21fcf7ec0 100644
--- a/server/app/apis/answers.py
+++ b/server/app/apis/answers.py
@@ -37,5 +37,5 @@ class QuestionAnswers(Resource):
     def put(self, CID, TID, AID):
         args = question_answer_edit_parser.parse_args(strict=True)
         item = dbc.get.one(QuestionAnswer, AID)
-        item = dbc.edit.question_answer(item, **args)
+        item = dbc.edit.default(item, **args)
         return item_response(schema.dump(item))
diff --git a/server/app/apis/competitions.py b/server/app/apis/competitions.py
index a18ed85ed92897f016fa44db4f69281b5d749526..cc135c09cd82d2a137bcb80c2e6f66bcc28828a6 100644
--- a/server/app/apis/competitions.py
+++ b/server/app/apis/competitions.py
@@ -42,7 +42,7 @@ class Competitions(Resource):
     def put(self, CID):
         args = competition_parser.parse_args(strict=True)
         item = dbc.get.one(Competition, CID)
-        item = dbc.edit.competition(item, **args)
+        item = dbc.edit.default(item, **args)
 
         return item_response(schema.dump(item))
 
diff --git a/server/app/apis/components.py b/server/app/apis/components.py
index c68ca92864a75b21c5ac03d8a519029a3e44fd0a..01b1d82780963d0468f0e9a17d2c522b3d3ea8a2 100644
--- a/server/app/apis/components.py
+++ b/server/app/apis/components.py
@@ -25,7 +25,7 @@ class ComponentByID(Resource):
     def put(self, CID, SOrder, component_id):
         args = component_parser.parse_args()
         item = dbc.get.one(Component, component_id)
-        item = dbc.edit.component(item, **args)
+        item = dbc.edit.default(item, **args)
         return item_response(schema.dump(item))
 
     @check_jwt(editor=True)
diff --git a/server/app/apis/questions.py b/server/app/apis/questions.py
index 7d16d3c89e660345c510d84dc645f111dbd7fbf4..bd14d389b530d20d943f60ce9541f5f705878660 100644
--- a/server/app/apis/questions.py
+++ b/server/app/apis/questions.py
@@ -48,7 +48,7 @@ class QuestionById(Resource):
         args = question_parser.parse_args(strict=True)
 
         item_question = dbc.get.question(CID, SID, QID)
-        item_question = dbc.edit.question(item_question, **args)
+        item_question = dbc.edit.default(item_question, **args)
 
         return item_response(schema.dump(item_question))
 
diff --git a/server/app/apis/slides.py b/server/app/apis/slides.py
index 3c25f901ba48c86eac2c421da1bd3e659f24350a..4720fd4468f3636ab3058278bafe001e184da639 100644
--- a/server/app/apis/slides.py
+++ b/server/app/apis/slides.py
@@ -44,7 +44,7 @@ class Slides(Resource):
         timer = args.get("timer")
 
         item_slide = dbc.get.slide(CID, SOrder)
-        item_slide = dbc.edit.slide(item_slide, title, timer)
+        item_slide = dbc.edit.default(item_slide, title=title, timer=timer)
 
         return item_response(schema.dump(item_slide))
 
diff --git a/server/app/apis/teams.py b/server/app/apis/teams.py
index 2bb0a23570e5de4abb1668347a6fe287b56e7957..bdf0bb88aea0a4435ee76345cdcbe462ca6ac4b0 100644
--- a/server/app/apis/teams.py
+++ b/server/app/apis/teams.py
@@ -53,5 +53,5 @@ class Teams(Resource):
 
         item_team = dbc.get.team(CID, TID)
 
-        item_team = dbc.edit.team(item_team, name=name, competition_id=CID)
+        item_team = dbc.edit.default(item_team, name=name, competition_id=CID)
         return item_response(schema.dump(item_team))
diff --git a/server/app/apis/users.py b/server/app/apis/users.py
index b9dba528a1a3529ec9e340d4418e44bc2e20fedb..b3423d37cccc1638802e1ee0da398720dbe86217 100644
--- a/server/app/apis/users.py
+++ b/server/app/apis/users.py
@@ -19,7 +19,12 @@ def edit_user(item_user, args):
         if User.query.filter(User.email == args["email"]).count() > 0:
             api.abort(codes.BAD_REQUEST, "Email is already in use")
 
-    return dbc.edit.user(item_user, **args)
+    try:
+        args["name"] = args.get("name").title()
+    except Exception:
+        pass
+
+    return dbc.edit.default(item_user, **args)
 
 
 @api.route("/")
diff --git a/server/app/database/controller/edit.py b/server/app/database/controller/edit.py
index 49fcef87a4d28131501786782dbbf95fc58ac1ae..b1f5bc91e045e43c5f69618a685a39f86c7b081d 100644
--- a/server/app/database/controller/edit.py
+++ b/server/app/database/controller/edit.py
@@ -26,130 +26,28 @@ def switch_order(item1, item2):
     return item1
 
 
-def component(item, x, y, w, h, data):
-    """ Edits position, size and content of the provided component. """
-
-    if x:
-        item.x = x
-    if y:
-        item.y = y
-    if w:
-        item.w = w
-    if h:
-        item.h = h
-    if data:
-        item.data = data
-
-    db.session.commit()
-    db.session.refresh(item)
-    return item
-
-
-def slide(item, title=None, timer=None):
-    """ Edits the title and timer of the slide. """
-
-    if title:
-        item.title = title
-    if timer:
-        item.timer = timer
-
-    db.session.commit()
-    db.session.refresh(item)
-    return item
-
-
-def team(item_team, name=None, competition_id=None):
-    """ Edits the name and competition of the team. """
-
-    if name:
-        item_team.name = name
-    if competition_id:
-        item_team.competition_id = competition_id
-
-    db.session.commit()
-    db.session.refresh(item_team)
-    return item_team
-
-
-def competition(item, name=None, year=None, city_id=None):
-    """ Edits the name and year of the competition. """
-
-    if name:
-        item.name = name
-    if year:
-        item.year = year
-    if city_id:
-        item.city_id = city_id
-
-    db.session.commit()
-    db.session.refresh(item)
-    return item
-
-
-def user(item, name=None, email=None, city_id=None, role_id=None):
-    """ Edits the name, email, city and role of the user. """
-
-    if name:
-        item.name = name.title()
-
-    if email:
-        item.email = email
-
-    if city_id:
-        item.city_id = city_id
-
-    if role_id:
-        item.role_id = role_id
-
+def default(item, **kwargs):
+    """
+    For every keyword argument, set that attribute on item to the given value.
+    Raise error if item doesn't already have that attribute. Do nothing if the
+    value for a given key is None. Works for any type of item.
+
+    Example:
+    >>> user = default(user, name="Karl Karlsson")  # Change name
+    >>> user.name
+    Karl Karlsson
+    >>> user = default(user, efternamn="Jönsson")   # Try to set attribute that doesn't exist
+    AttributeError: Item of type <class 'app.database.models.User'> has no attribute 'efternamn'
+    >>> user = default(user, name=None)             # Nothing happens if value is None
+    >>> user.name
+    Karl Karlsson
+    """
+
+    for key, value in kwargs.items():
+        if not hasattr(item, key):
+            raise AttributeError(f"Item of type {type(item)} has no attribute '{key}'")
+        if value is not None:
+            setattr(item, key, value)
     db.session.commit()
     db.session.refresh(item)
     return item
-
-
-def question(item_question, name=None, total_score=None, type_id=None, slide_id=None):
-    """ Edits the name, score, type and slide of the question. """
-
-    if name:
-        item_question.name = name
-
-    if total_score:
-        item_question.total_score = total_score
-
-    if type_id:
-        item_question.type_id = type_id
-
-    if slide_id:
-        item_question.slide_id = slide_id
-
-    db.session.commit()
-    db.session.refresh(item_question)
-
-    return item_question
-
-
-def question_alternative(item, text=None, value=None):
-
-    if text:
-        item.text = text
-
-    if value:
-        item.value = value
-
-    db.session.commit()
-    db.session.refresh(item)
-
-    return item
-
-
-def question_answer(item, data=None, score=None):
-
-    if data:
-        item.data = data
-
-    if score:
-        item.score = score
-
-    db.session.commit()
-    db.session.refresh(item)
-
-    return item