diff --git a/accounts/models.py b/accounts/models.py
index ff9dfa7..cb21b54 100644
--- a/accounts/models.py
+++ b/accounts/models.py
@@ -279,6 +279,9 @@ class RealizedSemantics(Model):
     # wykonane ramki (wypelniane dla semantyka)
     made_frames = PositiveIntegerField(db_column='wykonane_ramki',
                                        default=0)
+    # wspoldzielone ramki (wypelniane dla semantyka)
+    related_frames = PositiveIntegerField(db_column='wspoldzielone_ramki',
+                                          default=0)
     # poprawione ramki (wypelniane dla supersemantyka)
     corr_frames = PositiveIntegerField(db_column='poprawione_ramki',
                                        default=0)
diff --git a/dictionary/ajax_lemma_status.py b/dictionary/ajax_lemma_status.py
index 2a85574..1b3530a 100644
--- a/dictionary/ajax_lemma_status.py
+++ b/dictionary/ajax_lemma_status.py
@@ -117,10 +117,10 @@ def lemma_status_change(request, status_id, lemma_id):
        not lemma_obj.status.next_statuses.filter(pk=new_status.pk).exists()):
         raise AjaxError('wrong change')
 
-    actual_semantic_frames = SemanticFrame.objects.none()
+    visible_semantic_frames = SemanticFrame.objects.none()
     next_status = False
     if(new_status):
-        actual_semantic_frames = backup_lemma_and_get_frames(lemma_obj)
+        visible_semantic_frames = backup_lemma_and_get_frames(lemma_obj)
     
     if(new_status and new_status.priority > lemma_obj.status.priority):
         next_status = True
@@ -223,8 +223,10 @@ def lemma_status_change(request, status_id, lemma_id):
          and next_status):
         ### naliczanie oplat za gotowosc semantyczna
         frame_value = 12.0
-        update_sem_stats_ready_s(lemma_obj.entry_obj, actual_semantic_frames, 
-                                 lemma_obj.semanticist, new_status, frame_value)
+        related_frame_value = 2.0
+        update_sem_stats_ready_s(lemma_obj.entry_obj, visible_semantic_frames,
+                                 lemma_obj.semanticist, new_status, frame_value,
+                                 related_frame_value)
         add_new_frames_to_phraseologic_propositions(lemma_obj)
         changed = True
     # zmiana statusu hasla na sprawdzone semantycznie
@@ -236,8 +238,8 @@ def lemma_status_change(request, status_id, lemma_id):
         part_bonus = 2.0
         connection_bonus = 0.1
         ### naliczanie oplat za sprawdzenie i bonusow
-        update_sem_stats_conf_s(entry=lemma_obj.entry_obj, 
-                                semantic_frames=actual_semantic_frames, 
+        update_sem_stats_conf_s(entry=lemma_obj.entry_obj,
+                                checked_sem_frames_backup=visible_semantic_frames,
                                 semanticist=lemma_obj.semanticist, 
                                 supersemanticist=request.user, 
                                 status=new_status,
@@ -273,7 +275,7 @@ def lemma_status_change(request, status_id, lemma_id):
                                      lemma=lemma_obj,
                                      status=new_status)
         status_change.save()
-        status_change.semantic_frames.add(*actual_semantic_frames.all())
+        status_change.semantic_frames.add(*visible_semantic_frames.all())
         lemma_obj.status_history.add(status_change)    
         
     if new_status:
@@ -472,45 +474,59 @@ def update_lemma_stats_conf_f(lemma, phraseologist, superphraseologist, status,
     phraseologist.user_stats.phraseology_real_history.add(phraseologist_real_lemma)
 
 ####################### semantics #############################     
-def update_sem_stats_ready_s(entry, semantic_frames, semanticist, status, frame_value):
-    actual_frames_count = semantic_frames.count()
-    sem_dict = {'made_frames': actual_frames_count,
-                'cash': frame_value*float(actual_frames_count)}
+def update_sem_stats_ready_s(entry, visible_semantic_frames, semanticist, status,
+                             frame_value, related_frame_value):
+    actual_frames = entry.actual_frames()
+    actual_frames_count = actual_frames.count()
 
-    realized_semantics = RealizedSemantics(entry=entry, cash=sem_dict['cash'],
-                                           made_frames=sem_dict['made_frames'],
+    related_frames = entry.related_frames()
+    related_frames_count = related_frames.count()
+
+    cash = frame_value*float(actual_frames_count) + related_frame_value*float(related_frames_count)
+
+
+    realized_semantics = RealizedSemantics(entry=entry, cash=cash,
+                                           made_frames=actual_frames_count,
+                                           related_frames=related_frames_count,
                                            status=status, bonus=False)
     realized_semantics.save()
-    realized_semantics.frames.add(*semantic_frames.all())
+    realized_semantics.frames.add(*visible_semantic_frames.all())
     semanticist.user_stats.semantics_real_history.add(realized_semantics)
 
-def update_sem_stats_conf_s(entry, semantic_frames, semanticist, supersemanticist, status,
-                               checked_frame_value, corrected_frame_value, 
-                               bonus_factor, part_bonus_factor, connection_bonus):
+def update_sem_stats_conf_s(entry, checked_sem_frames_backup, semanticist, supersemanticist, status,
+                            checked_frame_value, corrected_frame_value,
+                            bonus_factor, part_bonus_factor, connection_bonus):
     ready_statuses = Lemma_Status.objects.filter(type__sym_name='ready_s')
     q_ready_statuses = [Q(status=ready_status) for ready_status in ready_statuses.all()]
         
     ready_semantics = RealizedSemantics.objects.filter(reduce(operator.or_, q_ready_statuses))
-    ready_sem_frames= ready_semantics.get(entry=entry).frames
-    checked_sem_frames = semantic_frames
-    ready_to_checked_diffs = get_frames_differences(ready_sem_frames.all(), checked_sem_frames.all())
-    checked_to_ready_diffs = get_frames_differences(checked_sem_frames.all(), ready_sem_frames.all())
+    ready_sem_visible_frames = ready_semantics.get(entry=entry).frames
+    ready_sem_actual_frames = entry.filter_local(ready_sem_visible_frames)
+    ready_sem_related_frames = entry.filter_related(ready_sem_visible_frames)
+
+    checked_sem_actual_frames = entry.actual_frames()
+    checked_sem_related_frames = entry.related_frames()
+
+    actual_ready_to_checked_diffs = get_frames_differences(ready_sem_actual_frames.all(), checked_sem_actual_frames.all())
+    actual_checked_to_ready_diffs = get_frames_differences(checked_sem_actual_frames.all(), ready_sem_actual_frames.all())
+
+    visible_ready_to_checked_diffs = get_frames_differences(ready_sem_visible_frames.all(), checked_sem_frames_backup.all())
     
-    connections_amount = count_connections(ready_to_checked_diffs)
-    sem_cash = (bonus_factor*float(len(ready_to_checked_diffs['matching_frames'])) +
-                part_bonus_factor*float(len(ready_to_checked_diffs['part_matching_frames'])) +
+    connections_amount = count_connections(entry, visible_ready_to_checked_diffs)
+    sem_cash = (bonus_factor*float(len(actual_ready_to_checked_diffs['matching_frames'])) +
+                part_bonus_factor*float(len(actual_ready_to_checked_diffs['part_matching_frames'])) +
                 connection_bonus*float(connections_amount))
-    sem_dict = {'same_frames': len(ready_to_checked_diffs['matching_frames']),
-                'part_same_frames': len(ready_to_checked_diffs['part_matching_frames']),
-                'wrong_frames': len(ready_to_checked_diffs['missing_frames']),
+    sem_dict = {'same_frames': len(actual_ready_to_checked_diffs['matching_frames']),
+                'part_same_frames': len(actual_ready_to_checked_diffs['part_matching_frames']),
+                'wrong_frames': len(actual_ready_to_checked_diffs['missing_frames']),
                 'added_connections': connections_amount,
                 'cash': sem_cash}
     
-    supersem_cash = (float(len(checked_to_ready_diffs['missing_frames'])+len(checked_to_ready_diffs['part_matching_frames']))*corrected_frame_value +
-                     float(len(ready_to_checked_diffs['matching_frames']))*checked_frame_value)
-    supersem_dict = {'same_frames': len(checked_to_ready_diffs['matching_frames']),
-                     'part_same_frames': len(checked_to_ready_diffs['part_matching_frames']),
-                     'redo_frames': len(checked_to_ready_diffs['missing_frames']),
+    supersem_cash = (float(len(actual_checked_to_ready_diffs['missing_frames'])+len(actual_checked_to_ready_diffs['part_matching_frames']))*corrected_frame_value +
+                     float(len(actual_ready_to_checked_diffs['matching_frames']))*checked_frame_value)
+    supersem_dict = {'same_frames': len(actual_checked_to_ready_diffs['matching_frames']),
+                     'part_same_frames': len(actual_checked_to_ready_diffs['part_matching_frames']),
+                     'redo_frames': len(actual_checked_to_ready_diffs['missing_frames']),
                      'cash': supersem_cash}
      
     supersem_real_semantics = RealizedSemantics(entry=entry, 
@@ -521,7 +537,7 @@ def update_sem_stats_conf_s(entry, semantic_frames, semanticist, supersemanticis
                                                 status=status, 
                                                 bonus=False)
     supersem_real_semantics.save()
-    supersem_real_semantics.frames.add(*semantic_frames.all())
+    supersem_real_semantics.frames.add(*checked_sem_frames_backup.all())
     supersemanticist.user_stats.semantics_real_history.add(supersem_real_semantics)
                 
     sem_real_semantics = RealizedSemantics(entry=entry, 
@@ -533,15 +549,16 @@ def update_sem_stats_conf_s(entry, semantic_frames, semanticist, supersemanticis
                                            status=status,
                                            bonus=True)
     sem_real_semantics.save()
-    sem_real_semantics.frames.add(*semantic_frames.all())
+    sem_real_semantics.frames.add(*checked_sem_frames_backup.all())
     semanticist.user_stats.semantics_real_history.add(sem_real_semantics)
     
-def count_connections(differences):
-    amount = 0 
+def count_connections(entry, differences):
+    amount = 0
+    schemata = entry.actual_schemata()
     for frame in differences['matching_frames']:
-        amount += frame.connected_schemata().count()
+        amount += frame.connected_schemata().filter(pk__in=schemata).count()
     for frame in differences['part_matching_frames']:
-        amount += frame.connected_schemata().count()
+        amount += frame.connected_schemata().filter(pk__in=schemata).count()
     return amount
 
 def remove_semantic_payments(entry):
diff --git a/dictionary/ajax_lemma_view.py b/dictionary/ajax_lemma_view.py
index 2663687..b472270 100644
--- a/dictionary/ajax_lemma_view.py
+++ b/dictionary/ajax_lemma_view.py
@@ -830,12 +830,24 @@ def disrelate_entries(request, lemma_id, preview_lemma_id):
     error, lemma, preview_lemma = check_if_selected_and_get(lemma_id, preview_lemma_id)
     if not error:
         error = check_if_has_rights_to_relate(lemma, request.user)
+    if not error:
+        error = check_if_share_sematic_frames(lemma, preview_lemma)
     if error:
         raise AjaxError(error)
     else:
         cancel_entries_relation(request, lemma, preview_lemma)
     return {}
 
+def check_if_share_sematic_frames(lemma, preview_lemma):
+    error = ''
+    lemma_visible_frames = lemma.entry_obj.visible_frames()
+    preview_visible_frames = preview_lemma.entry_obj.visible_frames()
+
+    if (lemma_visible_frames.filter(pk__in=preview_visible_frames).exists() or
+        preview_visible_frames.filter(pk__in=lemma_visible_frames).exists()):
+        error = 'shared frames'
+    return error
+
 def cancel_entries_relation(request, lemma, preview_lemma):
     lemma_entry, preview_lemma_entry = get_entries(lemma, preview_lemma)
     lemma_entry.rel_entries.remove(preview_lemma_entry)
diff --git a/dictionary/ajax_user_stats.py b/dictionary/ajax_user_stats.py
index 6028f66..aa9a345 100644
--- a/dictionary/ajax_user_stats.py
+++ b/dictionary/ajax_user_stats.py
@@ -239,6 +239,9 @@ def get_semantics_stats(user):
     ncorr_frames = RealizedSemantics.objects.filter(user_stats__user=user).aggregate(Sum('ncorr_frames'))['ncorr_frames__sum']
     if ncorr_frames == None:
         ncorr_frames = 0
+    related_frames = RealizedSemantics.objects.filter(user_stats__user=user).aggregate(Sum('related_frames'))['related_frames__sum']
+    if related_frames == None:
+        related_frames = 0
     made_frames = RealizedSemantics.objects.filter(user_stats__user=user).aggregate(Sum('made_frames'))['made_frames__sum']
     if made_frames == None:
         made_frames = 0   
@@ -257,6 +260,7 @@ def get_semantics_stats(user):
                       'corr_frames': corr_frames,
                       'part_corr_frames': part_corr_frames,
                       'checked_frames': ncorr_frames+corr_frames+part_corr_frames,
+                      'related_frames': related_frames,
                       'made_frames': made_frames,
                       'efficacy': round(efficacy, 2),
                       'added_connections' : added_connections}
diff --git a/dictionary/models.py b/dictionary/models.py
index 1ea63bf..59be341 100644
--- a/dictionary/models.py
+++ b/dictionary/models.py
@@ -1369,7 +1369,7 @@ class AspectRelationsGroup(Model):
         return ','.join(str_ls)
     
 class Entry(Model):
-    name = CharField(max_length=64, db_column='nazwa') # usunieto , unique=True
+    name = CharField(max_length=64, db_column='nazwa')
     # czesc mowy
     pos = ForeignKey('POS', db_column='czesc_mowy', related_name='entries')
     # powiazane lematy
@@ -1395,23 +1395,45 @@ class Entry(Model):
             ('change_semantics', u'Może edytować semantykę.'),
             ('view_semantics', u'Może oglądać semantykę.'),
         )
-    
+
+    def related_frames(self):
+        visible = self.visible_frames()
+        actual = self.actual_frames()
+        return visible.exclude(pk__in=actual)
+
+    def visible_frames(self):
+        frames = []
+        for frame in self.all_frames():
+            for lu in frame.lexical_units.all():
+                if self.meanings.filter(pk=lu.pk).exists():
+                    frames.append(frame.pk)
+                    break
+        return get_model('semantics', 'SemanticFrame').objects.filter(pk__in=frames)
+
+    def all_frames(self):
+        frames = self.actual_frames()
+        for entry in self.rel_entries.all():
+            new_frames = entry.actual_frames()
+            frames |= new_frames
+        return get_model('semantics', 'SemanticFrame').objects.filter(pk__in=frames)
+
     def actual_frames(self):
-        # frame_ids = []
-        # lexical_units = self.meanings.order_by('sense')
-        # for lexical_unit in lexical_units:
-        #     frame_ids.extend([f.id for f in lexical_unit.actual_frames()])
-        # return get_model('semantics', 'SemanticFrame').objects.filter(id__in=list(set(frame_ids)))
         return self.semantic_frames.filter(next__isnull=True, removed=False)
+
+    def actual_schemata(self):
+        return self.lemmas.get(old=False).frames.all()
+
+    def filter_local(self, frames):
+        return frames.filter(pk__in=self.semantic_frames.all())
+
+    def filter_related(self, frames):
+        return frames.exclude(pk__in=self.semantic_frames.all())
     
     def matching_connections(self, schema, position, phrase_type):
 
         matching_connections = []
 
-        frames = self.actual_frames()
-        for entry in self.rel_entries.all():
-            new_frames = entry.actual_frames()
-            frames |= new_frames
+        frames = self.visible_frames()
 
         for frame in frames:
             for compl in frame.complements.all():
diff --git a/dictionary/saving.py b/dictionary/saving.py
index b86715d..baae225 100644
--- a/dictionary/saving.py
+++ b/dictionary/saving.py
@@ -9,12 +9,8 @@ from wordnet.models import LexicalUnit
 def get_semantic_operations(lemma, schemata_conversions):
     connections = []
     operations = []
-    # frames = lemma.entry_obj.actual_frames()
 
-    frames = lemma.entry_obj.actual_frames()
-    for entry in lemma.entry_obj.rel_entries.all():
-        new_frames = entry.actual_frames()
-        frames |= new_frames
+    frames = lemma.entry_obj.visible_frames()
 
     for conv in schemata_conversions:
         schema_operations = get_reconnect_operations_and_extend_connections(frames,
diff --git a/dictionary/static/js/lemma-view.js b/dictionary/static/js/lemma-view.js
index 142e105..ca5e87c 100644
--- a/dictionary/static/js/lemma-view.js
+++ b/dictionary/static/js/lemma-view.js
@@ -3567,13 +3567,15 @@ function restore_lemma() {
 	        HideProgressAnimation();
 	        error_alert('Nie zaznaczono hasła w zakładce "Schematy" lub "Podglądzie hasła".');
 	        return false;
-	      }
-	      else if (result == 'can not edit') {
+	      } else if (result == 'can not edit') {
 		    HideProgressAnimation();
 		    error_alert('Brak uprawnień do edycji hasła.');
 		    return false;
-		  }
-	      else {
+		  } else if (result == 'shared frames') {
+		    HideProgressAnimation();
+		    error_alert('Nie można anulować: Hasła współdzielą ramy semantyczne.');
+		    return false;
+		  } else {
 	        HideProgressAnimation();
 	        return true;
 	      }
diff --git a/dictionary/templates/sel_user_stats.html b/dictionary/templates/sel_user_stats.html
index 0e80e21..927b884 100644
--- a/dictionary/templates/sel_user_stats.html
+++ b/dictionary/templates/sel_user_stats.html
@@ -123,12 +123,13 @@
 <table class='PaymentsTable'>
   <tr> 
     <td class='EmptyCell' colspan=1></td> 
-	<td class='ColumnHeader' colspan=7>Semantycy:</td>
+	<td class='ColumnHeader' colspan=8>Semantycy:</td>
 	<td class='ColumnHeader' colspan=3>Supersemantycy:</td>
   </tr>
   <tr> 
 	<td class='ColumnHeader'>Kwota za wykonaną pracę:</td>
 	<td class='ColumnHeader'>Bonus:</td>
+	<td class='ColumnHeader'>Współdzielone ramy:</td>
 	<td class='ColumnHeader'>Wykonane ramy:</td>
 	<td class='ColumnHeader'>Poprawnie wykonane ramy:</td>
 	<td class='ColumnHeader'>Częściowo poprawnie wykonane ramy:</td>
@@ -142,6 +143,7 @@
   <tr> 
 	<td>{{semantics_work_stats.earned_cash}} zł</td>
 	<td>{{semantics_work_stats.bonus_cash}} zł</td>
+	<td>{{semantics_work_stats.related_frames}}</td>
 	<td>{{semantics_work_stats.made_frames}}</td>
 	<td>{{semantics_work_stats.prop_frames}}</td>
 	<td>{{semantics_work_stats.part_prop_frames}}</td>
diff --git a/semantics/management/commands/find_hanging_connections.py b/semantics/management/commands/find_hanging_connections.py
index 25a8b02..a645a58 100644
--- a/semantics/management/commands/find_hanging_connections.py
+++ b/semantics/management/commands/find_hanging_connections.py
@@ -16,7 +16,7 @@ class Command(BaseCommand):
 def find_hanging_connections():
     lemmas = Lemma.objects.filter(old=False).order_by('entry_obj__name')
     for lemma in lemmas:
-        frames = lemma.entry_obj.actual_frames()
+        frames = lemma.entry_obj.visible_frames()
         for frame in frames:
             for compl in frame.complements.all():
                 for real in compl.realizations.all():
diff --git a/semantics/validation.py b/semantics/validation.py
index 641565e..1430de9 100644
--- a/semantics/validation.py
+++ b/semantics/validation.py
@@ -8,15 +8,15 @@ from semantics.utils import get_structural_matching_frame
 
 def validate_frames(lemma_id):
     lemma = Lemma.objects.get(id=lemma_id)
-    actual_frames = lemma.entry_obj.actual_frames()
+    visible_frames = lemma.entry_obj.visible_frames()
     error_msg = u''
-    for frame in actual_frames.all():
-        error_msg = frame_valid(lemma, frame, actual_frames)
+    for frame in visible_frames.all():
+        error_msg = frame_valid(lemma, frame, visible_frames)
         if error_msg:
             break
     return error_msg
         
-def frame_valid(lemma, frame, actual_frames):
+def frame_valid(lemma, frame, frames):
     error_msg = ''
     complements = frame.complements.all()
     if not arguments_exists(complements):
@@ -33,7 +33,7 @@ def frame_valid(lemma, frame, actual_frames):
         error_msg = u'Semantyka: Rama semantyczna %d zawiera argumenty bez zdefiniowanych preferencji selekcyjnych.' % frame.id
     elif not examples_added(frame):
         error_msg = u'Semantyka: Rama semantyczna %d nie ma dopiętych przykładów.' % frame.id
-    elif duplicates_exists(frame, actual_frames):
+    elif duplicates_exists(frame, frames):
         error_msg = u'Semantyka: Rama semantyczna %d posiada duplikaty.' % frame.id
     elif not schemas_reflex_agreed(lemma, frame):
         error_msg = u'Semantyka: Rama semantyczna %d ma dopięte elementy o niezgodnej zwrotności.' % frame.id
@@ -107,8 +107,12 @@ def examples_added(frame):
             return True
     return False
 
-def duplicates_exists(frame, actual_frames):
-    frames_to_check = actual_frames.exclude(id=frame.id)
+def duplicates_exists(frame, frames):
+    # frazeologicznych ram nie sprawdzamy
+    if frame.complements.filter(roles__role='Lemma').exists():
+        return False
+
+    frames_to_check = frames.exclude(id=frame.id)
     if get_structural_matching_frame(frames_to_check, frame):
         return True
     return False
@@ -236,7 +240,7 @@ def validate_schemas(lemma_id):
     return error_msg
 
 def all_schemas_used(lemma):
-    frames = lemma.entry_obj.actual_frames()
+    frames = lemma.entry_obj.visible_frames()
     schemas = lemma.frames
     for schema in schemas.all():
         if not schema_is_bad(lemma, schema) and not schema_used(schema, frames):
diff --git a/semantics/views.py b/semantics/views.py
index 0b913f3..ca22d97 100644
--- a/semantics/views.py
+++ b/semantics/views.py
@@ -92,10 +92,7 @@ def create_frames_context(lemma_id, user):
     frames_dict = {}
     frame_units = {}
  
-    frames = lemma.entry_obj.actual_frames()
-    for entry in connected:
-        new_frames = entry.actual_frames()
-        frames |= new_frames
+    frames = lemma.entry_obj.all_frames()
         
     for frame in frames:
         alternations[frame.id] = {}