diff --git a/nars_core_java/nars/entity/Concept.java b/nars_core_java/nars/entity/Concept.java
index 07acbff97000a88aa86c88a1a899595025a31508..527f00bb6ccb18c3366ab6e84542b9270b4c6e0d 100644
--- a/nars_core_java/nars/entity/Concept.java
+++ b/nars_core_java/nars/entity/Concept.java
@@ -353,6 +353,16 @@ public final class Concept extends Item {
     public Term getTerm() {
         return term;
     }
+    
+    /**
+     * Return the questions, called in ComposionalRules
+     * in dedConjunctionByQuestion only
+     *
+     * @return The associated term
+     */
+    public ArrayList<Task> getQuestions() {
+        return questions;
+    }
 
     /**
      * Return a string representation of the concept, called in ConceptBag only
diff --git a/nars_core_java/nars/inference/CompositionalRules.java b/nars_core_java/nars/inference/CompositionalRules.java
index 5139c54bf503719c4c25355d14503e7a0977ba9d..c4d9f7736132a6f1f6301f8f40e7a753f8cdbd6d 100644
--- a/nars_core_java/nars/inference/CompositionalRules.java
+++ b/nars_core_java/nars/inference/CompositionalRules.java
@@ -43,27 +43,70 @@ public final class CompositionalRules {
      * @param memory Reference to the memory
      */
     static void dedConjunctionByQuestion(Sentence sentence, Sentence belief, Memory memory) {
-        if(sentence==null || belief==null || memory.currentConcept==null || memory.currentTask==null)
+        if(sentence==null || belief==null || memory.currentTask==null || sentence.isQuestion() || belief.isQuestion())
             return;
-        Task parent = memory.currentTask.getParentTask();
-        if(parent==null)
-            return;
-        parent=parent.getParentTask();
-        if(parent==null)
-            return;
-        Term pcontent = parent.getContent();
         Term term1 = sentence.getContent();
         Term term2 = belief.getContent();
-        if(pcontent==null || !(pcontent instanceof Conjunction) || !parent.getSentence().isQuestion() || 
-           !((CompoundTerm)pcontent).containComponent(term1) || !((CompoundTerm)pcontent).containComponent(term2)) {
-            return;
+        ArrayList<LinkedList<Concept>> bag=memory.getConceptBag().getItemTable();
+        for(LinkedList<Concept> baglevel : bag)
+        {
+            for(Concept concept : baglevel)
+            {
+                for(Task question : concept.getQuestions())
+                {
+                    if(question==null)
+                        continue;
+                    Sentence qu=question.getSentence();
+                    if(qu==null)
+                        continue;
+                    Term pcontent = qu.getContent();
+                    if(pcontent==null || !(pcontent instanceof Conjunction) || ((CompoundTerm)pcontent).containVar()) {
+                        continue;
+                    }
+                    if(!(term1 instanceof Conjunction) && !(term2 instanceof Conjunction)) {
+                        if(!((CompoundTerm)pcontent).containComponent(term1) || !((CompoundTerm)pcontent).containComponent(term2)) {
+                            continue;
+                        }
+                    }
+                    if(term1 instanceof Conjunction) {
+                        if(!(term2 instanceof Conjunction) && !((CompoundTerm)pcontent).containComponent(term2)) {
+                            continue;
+                        }
+                        if(((CompoundTerm)term1).containVar()) {
+                            continue;
+                        }
+                        for(Term t : ((CompoundTerm)term1).getComponents()) {
+                            if(!((CompoundTerm)pcontent).containComponent(t)) {
+                                continue;
+                            }
+                        }
+                    }
+                    if(term2 instanceof Conjunction) {
+                        if(!(term1 instanceof Conjunction) && !((CompoundTerm)pcontent).containComponent(term1)) {
+                            continue;
+                        }
+                        if(((CompoundTerm)term2).containVar()) {
+                            continue;
+                        }
+                        for(Term t : ((CompoundTerm)term2).getComponents()) {
+                            if(!((CompoundTerm)pcontent).containComponent(t)) {
+                                continue;
+                            }
+                        }
+                    }
+                    Term conj = Conjunction.make(term1, term2, memory);
+                    TruthValue truthT = memory.currentTask.getSentence().getTruth();
+                    TruthValue truthB = memory.currentBelief.getTruth();
+                    if(truthT==null || truthB==null) {
+                        return;
+                    }
+                    TruthValue truthAnd = TruthFunctions.intersection(truthT, truthB);
+                    BudgetValue budget = BudgetFunctions.compoundForward(truthAnd, conj, memory);
+                    memory.doublePremiseTask(conj, truthAnd, budget);
+                    break;
+                }
+            }
         }
-        Term conj = Conjunction.make(term1, term2, memory);
-        TruthValue truthT = memory.currentTask.getSentence().getTruth();
-        TruthValue truthB = memory.currentBelief.getTruth();
-        TruthValue truthAnd = TruthFunctions.intersection(truthT, truthB);
-        BudgetValue budget = BudgetFunctions.compoundForward(truthAnd, conj, memory);
-        memory.doublePremiseTask(conj, truthAnd, budget);
     }
     
     /* -------------------- intersections and differences -------------------- */
diff --git a/nars_core_java/nars/storage/Bag.java b/nars_core_java/nars/storage/Bag.java
index 55e4e04449f3eb0e051529c57be1835bb0a215f0..67e4f8b7c29e76448ba2576ad046332c5ba41a55 100644
--- a/nars_core_java/nars/storage/Bag.java
+++ b/nars_core_java/nars/storage/Bag.java
@@ -434,4 +434,8 @@ public abstract class Bag<E extends Item> {
     public void setShowLevel(int showLevel) {
         this.showLevel = showLevel;
     }
+    
+    public ArrayList<LinkedList<E>> getItemTable() {
+        return itemTable;
+    }
 }
diff --git a/nars_core_java/nars/storage/Memory.java b/nars_core_java/nars/storage/Memory.java
index 44ca276fbdc5c9a4321eb09c6154d586f2e05e23..93c9d522723a873080e43686ad11843ae72cc034 100644
--- a/nars_core_java/nars/storage/Memory.java
+++ b/nars_core_java/nars/storage/Memory.java
@@ -649,6 +649,10 @@ public class Memory {
     public AtomicInteger getConceptForgettingRate() {
         return conceptForgettingRate;
     }
+    
+    public ConceptBag getConceptBag() {
+        return concepts;
+    }
 
     class NullInferenceRecorder implements IInferenceRecorder {