diff --git a/freelus/views.py b/freelus/views.py
index e6e0d1a09c03682d86656d2cd907c317af90d665..ea926dfb1bd4b5c8ea56256e3cdc74569fa59564 100644
--- a/freelus/views.py
+++ b/freelus/views.py
@@ -47,19 +47,24 @@ def change_lus_in_slowal_frame(request):
         frame_id = request.POST['frame_id']
         lu_ids = json.loads(request.POST['lu_ids'])
         frame = Frame.objects.get(id=frame_id)
-        frame.lexical_units.clear()
+
+        frame_lexical_units = set(map(lambda lu: lu.id, frame.lexical_units.all()))
+        frame_lexical_units_to_remove = frame_lexical_units.difference(set(map(lambda lu_id: int(lu_id), lu_ids)))
 
         entry = Entry.objects.get(pk=entry_id)
-        entry.lexical_units.clear()
-        for lu_id in lu_ids:
+        for lu_id in frame_lexical_units_to_remove:
             lu = LexicalUnit.objects.get(pk=lu_id)
-            lu.entry = entry
-            lu.save()
-            frame.lexical_units.add(lu)
-            entry.lexical_units_count = entry.lexical_units_count + 1
+            entry.lexical_units.remove(lu)
+            frame.lexical_units.remove(lu)
+            entry.lexical_units_count = entry.lexical_units_count - 1
+
+        if len(frame.lexical_units.all()) == 0:
+            remove_frame_in_progress(frame, request.user)
+        else:
+            frame.save()
 
-        frame.save()
         entry.save()
+
         return JsonResponse({})
 
     return JsonResponse({})
@@ -316,15 +321,7 @@ def remove_frame_in_progress(request):
         frame_id = request.POST['frame_id']
         frame = Frame.objects.get(id=frame_id)
         if frame.in_building:
-
-            Assignment.assign(user=request.user, subject=frame)
-            for argument in frame.arguments.all():
-                argument.argument_connections.all().delete()
-                # ArgumentConnection.objects.filter(argument=argument).delete()
-                argument.example_connections.all().delete()
-                argument.delete()
-            frame.alternation_meanings.all().delete()
-            frame.delete()
+            remove_frame_in_progress(frame, request.user)
         else:
             return JsonResponse({})
         return JsonResponse({})
@@ -332,6 +329,18 @@ def remove_frame_in_progress(request):
     return JsonResponse({})
 
 
+@transaction.atomic
+def remove_frame_in_progress(frame, user):
+    Assignment.assign(user=user, subject=frame)
+    for argument in frame.arguments.all():
+        argument.argument_connections.all().delete()
+        # ArgumentConnection.objects.filter(argument=argument).delete()
+        argument.example_connections.all().delete()
+        argument.delete()
+    frame.alternation_meanings.all().delete()
+    frame.delete()
+
+
 @ajax_required
 @transaction.atomic
 def change_frame_status_to_building(request):