diff --git a/nars-dist/NARS.jar b/nars-dist/NARS.jar
index f6a3ceb62b73b073d3367f1ffa3998b6994b71f6..f807e02d8671dc4d2ae34713309b74d4d3fd1f16 100644
Binary files a/nars-dist/NARS.jar and b/nars-dist/NARS.jar differ
diff --git a/nars_core_java/nars/inference/CompositionalRules.java b/nars_core_java/nars/inference/CompositionalRules.java
index 8da6fa6358155b8b676867910b82a36b81e52e32..8c63adebe6a4393143c53f7c457b01f335683a74 100644
--- a/nars_core_java/nars/inference/CompositionalRules.java
+++ b/nars_core_java/nars/inference/CompositionalRules.java
@@ -37,6 +37,43 @@ import nars.storage.Memory;
  */
 public final class CompositionalRules {
     
+    static void IntroVarSameSubject(Sentence originalMainSentence, Sentence subSentence, Term component, Term content, int index,Memory memory) {
+        Sentence cloned=(Sentence) originalMainSentence.clone();
+        Term T1=cloned.getContent();
+        if(!(T1 instanceof CompoundTerm) || !(content instanceof CompoundTerm)) {
+            return;
+        }
+        CompoundTerm T=(CompoundTerm) T1;
+        CompoundTerm T2=(CompoundTerm) content.clone();
+        if((component instanceof Inheritance && content instanceof Inheritance) ||
+           (component instanceof Similarity && content instanceof Similarity)) {
+            CompoundTerm result=T;
+            if(component.equals(content)) {
+                return; //wouldnt make sense to create a conjunction here, would contain a statement twice
+            }
+            if(((Statement)component).getPredicate().equals(((Statement)content).getPredicate()) && !(((Statement)component).getPredicate() instanceof Variable)) {
+                Variable V=new Variable("#depIndVar1");
+                CompoundTerm zw=(CompoundTerm) T.getComponents().get(index).clone();
+                zw=(CompoundTerm) CompoundTerm.setComponent(zw,1,V,memory);
+                T2=(CompoundTerm) CompoundTerm.setComponent(T2,1,V,memory);
+                Conjunction res=(Conjunction) Conjunction.make(zw, T2, memory);
+                T=(CompoundTerm) CompoundTerm.setComponent(T, index, res, memory);
+            }
+            else 
+            if(((Statement)component).getSubject().equals(((Statement)content).getSubject()) && !(((Statement)component).getSubject() instanceof Variable)) {
+                Variable V=new Variable("#depIndVar2");
+                CompoundTerm zw=(CompoundTerm) T.getComponents().get(index).clone();
+                zw=(CompoundTerm) CompoundTerm.setComponent(zw,0,V,memory);
+                T2=(CompoundTerm) CompoundTerm.setComponent(T2,0,V,memory);
+                Conjunction res=(Conjunction) Conjunction.make(zw, T2, memory);
+                T=(CompoundTerm) CompoundTerm.setComponent(T, index, res, memory);
+            }
+            TruthValue truth = TruthFunctions.induction(originalMainSentence.getTruth(), subSentence.getTruth());
+            BudgetValue budget = BudgetFunctions.compoundForward(truth, T, memory);
+            memory.doublePremiseTask(T, truth, budget);
+        }
+    }
+    
     public static Random rand = new Random(1);
     static boolean dedSecondLayerVariableUnification(Task task, Memory memory)
     {
diff --git a/nars_core_java/nars/inference/RuleTables.java b/nars_core_java/nars/inference/RuleTables.java
index ab65f53f5c4d83f094b8e6355ae00b9f40e71df7..b0360c03daa90a6637dc419a45de59b6ed51ea2d 100644
--- a/nars_core_java/nars/inference/RuleTables.java
+++ b/nars_core_java/nars/inference/RuleTables.java
@@ -437,6 +437,9 @@ public class RuleTables {
                 if (s2.getSubject().equals(((Statement) content).getSubject())) {
                     CompositionalRules.introVarInner((Statement) content, s2, statement, memory);
                 }
+                CompositionalRules.IntroVarSameSubject(originalMainSentence,subSentence,component,content,index,memory);
+            } else if ((statement instanceof Equivalence) && (statement.getPredicate() instanceof Statement) && (memory.currentTask.getSentence().isJudgment())) {
+                CompositionalRules.IntroVarSameSubject(originalMainSentence,subSentence,component,content,index,memory);
             }
         }
     }
diff --git a/nars_core_java/nars/language/CompoundTerm.java b/nars_core_java/nars/language/CompoundTerm.java
index 596c1c5cbc607e949983016820d5dd7144e93ef1..0f542d060aee5fdaf3f36c1c8aa4a5e3914be997 100644
--- a/nars_core_java/nars/language/CompoundTerm.java
+++ b/nars_core_java/nars/language/CompoundTerm.java
@@ -252,6 +252,12 @@ public abstract class CompoundTerm extends Term {
             if(op.equals(Symbols.EQUIVALENCE_RELATION)) {
                 return Equivalence.make(arg.get(0), arg.get(1), memory);
             }
+            if(op.equals(Symbols.SIMILARITY_RELATION)) {
+                return Similarity.make(arg.get(0), arg.get(1), memory);
+            }
+            if(op.equals(Symbols.INHERITANCE_RELATION)) {
+                return Inheritance.make(arg.get(0), arg.get(1), memory);
+            }
         }
         return null;
     }