diff --git a/nars_core/nars/control/ConceptProcessing.java b/nars_core/nars/control/ConceptProcessing.java
index e46d58afebee2e632c6c1fda8f08efbac00788ee..37bc769771ce2f9e2015b126769da6c19038d968 100644
--- a/nars_core/nars/control/ConceptProcessing.java
+++ b/nars_core/nars/control/ConceptProcessing.java
@@ -7,12 +7,12 @@ import nars.main.Parameters;
 import nars.entity.*;
 import nars.inference.TemporalRules;
 import nars.inference.TruthFunctions;
-import nars.io.handlers.OutputHandler;
+import nars.io.events.OutputHandler;
 import nars.io.Symbols;
 import nars.language.*;
 import nars.operator.Operation;
 import nars.plugin.mental.InternalExperience;
-import nars.util.Events;
+import nars.io.events.Events;
 import nars.storage.LevelBag;
 
 import static nars.inference.LocalRules.revisible;
diff --git a/nars_core/nars/control/DerivationContext.java b/nars_core/nars/control/DerivationContext.java
index 8183dc9cb4422f69bca5a794c0e4590bd0c1a7dc..47b9e0b4d2735bc3883780188ec421fa5e17651c 100644
--- a/nars_core/nars/control/DerivationContext.java
+++ b/nars_core/nars/control/DerivationContext.java
@@ -6,11 +6,11 @@ package nars.control;
 
 import java.util.ArrayList;
 import java.util.List;
-import nars.util.Events;
+import nars.io.events.Events;
 import nars.storage.Memory;
 import nars.main.NAR;
 import nars.main.Parameters;
-import nars.util.Plugin;
+import nars.plugin.Plugin;
 import nars.entity.BudgetValue;
 import nars.entity.Concept;
 import nars.entity.Sentence;
diff --git a/nars_core/nars/control/GeneralInferenceControl.java b/nars_core/nars/control/GeneralInferenceControl.java
index 1647eb9125733219b7b895fe0ea37209b492793a..04396291f27682927ce4f3aba5045a7826dbe82b 100644
--- a/nars_core/nars/control/GeneralInferenceControl.java
+++ b/nars_core/nars/control/GeneralInferenceControl.java
@@ -6,7 +6,7 @@ package nars.control;
 
 import nars.main.Parameters;
 import nars.entity.Concept;
-import nars.util.Events;
+import nars.io.events.Events;
 import nars.entity.Task;
 import nars.entity.TermLink;
 import nars.inference.BudgetFunctions;
diff --git a/nars_core/nars/control/TemporalInferenceControl.java b/nars_core/nars/control/TemporalInferenceControl.java
index 099a6b7effe0845bb74230da8780c67baca828f3..9d522bb074c33845cffdcf092d30319c63ef6c12 100644
--- a/nars_core/nars/control/TemporalInferenceControl.java
+++ b/nars_core/nars/control/TemporalInferenceControl.java
@@ -20,7 +20,7 @@ import nars.language.CompoundTerm;
 import nars.operator.Operation;
 import nars.storage.LevelBag;
 import nars.storage.Memory;
-import nars.util.Events;
+import nars.io.events.Events;
 
 /**
  *
diff --git a/nars_core/nars/entity/BudgetValue.java b/nars_core/nars/entity/BudgetValue.java
index 02ade69a964464252a396b5ac9fc5aca36715cbe..88393f22906aa906821bf546a3d4a5c91321b017 100644
--- a/nars_core/nars/entity/BudgetValue.java
+++ b/nars_core/nars/entity/BudgetValue.java
@@ -25,7 +25,7 @@ import nars.main.Parameters;
 import static nars.main.Parameters.TRUTH_EPSILON;
 import nars.inference.BudgetFunctions;
 import nars.io.Symbols;
-import nars.util.Texts;
+import nars.io.Texts;
 import static nars.inference.UtilityFunctions.and;
 import static nars.inference.UtilityFunctions.aveGeo;
 import static nars.inference.UtilityFunctions.or;
diff --git a/nars_core/nars/entity/Concept.java b/nars_core/nars/entity/Concept.java
index 505a8b84f92152f332b6efeb817957e4cc22b2ac..2d26e2d7c6a019b5c831c836a5565ff487624f48 100644
--- a/nars_core/nars/entity/Concept.java
+++ b/nars_core/nars/entity/Concept.java
@@ -26,11 +26,11 @@ import java.util.Collections;
 import java.util.List;
 
 import nars.control.ConceptProcessing;
-import nars.util.Events.BeliefSelect;
-import nars.util.Events.TaskLinkAdd;
-import nars.util.Events.TaskLinkRemove;
-import nars.util.Events.TermLinkAdd;
-import nars.util.Events.TermLinkRemove;
+import nars.io.events.Events.BeliefSelect;
+import nars.io.events.Events.TaskLinkAdd;
+import nars.io.events.Events.TaskLinkRemove;
+import nars.io.events.Events.TermLinkAdd;
+import nars.io.events.Events.TermLinkRemove;
 import nars.storage.Memory;
 import nars.main.Shell;
 import nars.main.Parameters;
diff --git a/nars_core/nars/entity/Sentence.java b/nars_core/nars/entity/Sentence.java
index 0f0111c95e8c513b46e21c3e76c8991fa6783c95..ba18665a14eb2976c65f0908799bcd69d526b2bf 100644
--- a/nars_core/nars/entity/Sentence.java
+++ b/nars_core/nars/entity/Sentence.java
@@ -32,7 +32,7 @@ import nars.inference.TemporalRules;
 import nars.inference.TruthFunctions;
 import nars.inference.TruthFunctions.EternalizedTruthValue;
 import nars.io.Symbols;
-import nars.util.Texts;
+import nars.io.Texts;
 import nars.language.CompoundTerm;
 import nars.language.Conjunction;
 import nars.language.Equivalence;
diff --git a/nars_core/nars/entity/TruthValue.java b/nars_core/nars/entity/TruthValue.java
index f7ef3cb3bb22a4bef05c636514b19cd52bf239e8..474a8ae7d476abae37e155507a78c5a3e1d9c040 100644
--- a/nars_core/nars/entity/TruthValue.java
+++ b/nars_core/nars/entity/TruthValue.java
@@ -24,7 +24,7 @@ import java.io.Serializable;
 import nars.main.Parameters;
 import static nars.main.Parameters.TRUTH_EPSILON;
 import nars.io.Symbols;
-import nars.util.Texts;
+import nars.io.Texts;
 import nars.language.Term;
 
 
diff --git a/nars_core/nars/inference/LocalRules.java b/nars_core/nars/inference/LocalRules.java
index e4807a05a1a6145443f03d8b029a59832c512929..5c35773165789110b60d6adb8598c0539e99d9f4 100644
--- a/nars_core/nars/inference/LocalRules.java
+++ b/nars_core/nars/inference/LocalRules.java
@@ -22,8 +22,8 @@ package nars.inference;
 
 import java.util.ArrayList;
 import nars.main.Parameters;
-import nars.util.Events.Answer;
-import nars.util.Events.Unsolved;
+import nars.io.events.Events.Answer;
+import nars.io.events.Events.Unsolved;
 import nars.storage.Memory;
 import nars.control.DerivationContext;
 import nars.entity.BudgetValue;
@@ -37,7 +37,7 @@ import nars.entity.TruthValue;
 import static nars.inference.TemporalRules.matchingOrder;
 import static nars.inference.TemporalRules.reverseOrder;
 import static nars.inference.TruthFunctions.temporalProjection;
-import nars.io.handlers.OutputHandler;
+import nars.io.events.OutputHandler;
 import nars.io.Symbols;
 import nars.language.CompoundTerm;
 import static nars.language.CompoundTerm.extractIntervals;
diff --git a/nars_core/nars/inference/RuleTables.java b/nars_core/nars/inference/RuleTables.java
index 50fc899711b2affce2408753f7a255ba9e6c3697..454ed74e04128385e0b10f247ea8c35fcc9b8e5f 100644
--- a/nars_core/nars/inference/RuleTables.java
+++ b/nars_core/nars/inference/RuleTables.java
@@ -20,7 +20,7 @@
  */
 package nars.inference;
 
-import nars.util.Events;
+import nars.io.events.Events;
 import nars.storage.Memory;
 import nars.main.Parameters;
 import nars.control.DerivationContext;
diff --git a/nars_core/nars/io/Narsese.java b/nars_core/nars/io/Narsese.java
index 96873b1f039667b3eff81bb6ecca121ecee54ac1..1ef8d8d9b6184c85bbdecc8920b1aa596f876d36 100644
--- a/nars_core/nars/io/Narsese.java
+++ b/nars_core/nars/io/Narsese.java
@@ -12,7 +12,6 @@ import nars.entity.Sentence;
 import nars.entity.Stamp;
 import nars.entity.Task;
 import nars.entity.TruthValue;
-import nars.util.Texts;
 import static nars.inference.BudgetFunctions.truthToQuality;
 import static nars.io.Symbols.ARGUMENT_SEPARATOR;
 import static nars.io.Symbols.BUDGET_VALUE_MARK;
diff --git a/nars_core/nars/io/Symbols.java b/nars_core/nars/io/Symbols.java
index cf5ac61f0fee769f088415b649c886c2b7c934b0..8a15821c1cf03e3fac95983a9e1e6ab92f5a06a1 100644
--- a/nars_core/nars/io/Symbols.java
+++ b/nars_core/nars/io/Symbols.java
@@ -22,9 +22,9 @@ package nars.io;
 
 import java.util.HashMap;
 import java.util.Map;
-import nars.io.handlers.OutputHandler.ERR;
-import nars.io.handlers.OutputHandler.IN;
-import nars.io.handlers.OutputHandler.OUT;
+import nars.io.events.OutputHandler.ERR;
+import nars.io.events.OutputHandler.IN;
+import nars.io.events.OutputHandler.OUT;
 
 
 public class Symbols {
diff --git a/nars_core/nars/util/Texts.java b/nars_core/nars/io/Texts.java
similarity index 96%
rename from nars_core/nars/util/Texts.java
rename to nars_core/nars/io/Texts.java
index 29ebc47bd2373356bc1f1728260aa5a6ac669394..c9ead4d3d4cdb96b2773d4c2175b2b5f1590f8ea 100644
--- a/nars_core/nars/util/Texts.java
+++ b/nars_core/nars/io/Texts.java
@@ -1,4 +1,4 @@
-package nars.util;
+package nars.io;
 
 import nars.io.Symbols;
 import java.nio.CharBuffer;
diff --git a/nars_core/nars/io/handlers/AnswerHandler.java b/nars_core/nars/io/events/AnswerHandler.java
similarity index 86%
rename from nars_core/nars/io/handlers/AnswerHandler.java
rename to nars_core/nars/io/events/AnswerHandler.java
index af16a585bd9c9851e4538df29dabd18699f567d0..a19457aa6b347865a6f546c7a22e25595cb18415 100644
--- a/nars_core/nars/io/handlers/AnswerHandler.java
+++ b/nars_core/nars/io/events/AnswerHandler.java
@@ -2,10 +2,10 @@
  * Here comes the text of your license
  * Each line should be prefixed with  * 
  */
-package nars.io.handlers;
+package nars.io.events;
 
-import nars.util.EventEmitter.EventObserver;
-import nars.util.Events.Answer;
+import nars.io.events.EventEmitter.EventObserver;
+import nars.io.events.Events.Answer;
 import nars.main.NAR;
 import nars.entity.Sentence;
 import nars.entity.Task;
diff --git a/nars_core/nars/util/EventEmitter.java b/nars_core/nars/io/events/EventEmitter.java
similarity index 99%
rename from nars_core/nars/util/EventEmitter.java
rename to nars_core/nars/io/events/EventEmitter.java
index c8d30394742f89bcf9748b8e5d06f14e698e1858..ce89c39130a559dd8eacbfc15882b606d5ded46a 100644
--- a/nars_core/nars/util/EventEmitter.java
+++ b/nars_core/nars/io/events/EventEmitter.java
@@ -1,5 +1,5 @@
 
-package nars.util;
+package nars.io.events;
 
 import java.util.ArrayDeque;
 import java.util.ArrayList;
diff --git a/nars_core/nars/io/handlers/EventHandler.java b/nars_core/nars/io/events/EventHandler.java
similarity index 89%
rename from nars_core/nars/io/handlers/EventHandler.java
rename to nars_core/nars/io/events/EventHandler.java
index ad96546224163ae820f6bd4eda18d1c6c26e2c73..012bde3857d30b85e1232ec68978fbe4d2b37bf7 100644
--- a/nars_core/nars/io/handlers/EventHandler.java
+++ b/nars_core/nars/io/events/EventHandler.java
@@ -1,7 +1,6 @@
-package nars.io.handlers;
+package nars.io.events;
 
 import nars.main.NAR;
-import nars.util.EventEmitter;
 
 /**
  *
diff --git a/nars_core/nars/util/Events.java b/nars_core/nars/io/events/Events.java
similarity index 95%
rename from nars_core/nars/util/Events.java
rename to nars_core/nars/io/events/Events.java
index dd522149e0c223e8e21d3d6c971ec8200746d01d..8cb106346404a0b2f76e66b4bb8226dd39cfb315 100644
--- a/nars_core/nars/util/Events.java
+++ b/nars_core/nars/io/events/Events.java
@@ -1,207 +1,207 @@
-package nars.util;
-
-import java.util.Arrays;
-import java.util.List;
-import nars.util.EventEmitter.EventObserver;
-import nars.control.GeneralInferenceControl;
-import nars.control.DerivationContext;
-import nars.entity.Concept;
-import nars.entity.Sentence;
-import nars.entity.Task;
-
-/** empty event classes for use with EventEmitter */
-public class Events {
-
-
-    /** fired at the beginning of each NAR multi-cycle execution*/
-    public static class CyclesStart {     } 
-    
-    /** fired at the end of each NAR multi-cycle execution */
-    public static class CyclesEnd {     }
-    
-    /** fired at the beginning of each memory cycle */
-    public static class CycleStart {     } 
-    
-    /** fired at the end of each memory cycle */
-    public static class CycleEnd {     }
-
-    /** fired at the beginning of each individual Memory work cycle */
-    public static class WorkCycleStart {
-    }
-
-    /** fired at the end of each Memory individual cycle */
-    public static class WorkCycleEnd {
-    }
-
-    /** called before memory.reset() proceeds */
-    public static class ResetStart {
-    }
-
-    /** called after memory.reset() proceeds */
-    public static class ResetEnd {
-    }
-    
-    
-    public static class ConceptNew extends ParametricInferenceEvent<Concept> {
-        public ConceptNew(Concept c, long when) {
-            super(c, when);
-        }
-        
-        @Override public String toString() {
-            return "Concept Created: " + object;
-        }        
-    }
-    
-    public static class Perceive {    }
-    
-    public static class ConceptForget { }
-    
-    public static class EnactableExplainationAdd { }
-    public static class EnactableExplainationRemove { }
-    
-    abstract public static class ConceptBeliefAdd implements EventObserver {  
-        
-        abstract public void onBeliefAdd(Concept c, Task t, Object[] extra);
-        
-        @Override public void event(Class event, Object[] args) {
-            onBeliefAdd( (Concept)args[0], (Task)args[1], (Object[])args[2]);
-        }
-        
-    }
-    
-    abstract public static class ConceptBeliefRemove implements EventObserver { 
-        
-        abstract public void onBeliefRemove(Concept c, Sentence removed, Task t, Object[] extra);
-        
-        @Override public void event(Class event, Object[] args) {
-            onBeliefRemove( (Concept)args[0], (Sentence)args[1], (Task)args[2], (Object[])args[3]);
-        }        
-
-    }
-    
-    public static class ConceptGoalAdd { }
-    public static class ConceptGoalRemove { }
-    public static class ConceptQuestionAdd { }
-    public static class ConceptQuestionRemove { }
-
-    
-    //Executive & Planning
-    public static class UnexecutableGoal {   }
-    public static class UnexecutableOperation {   }
-    public static class NewTaskExecution {    }
-    public static class InduceSucceedingEvent {    }
-    
-
-    public static class TermLinkAdd { }
-    public static class TermLinkRemove { }
-    public static class TaskLinkAdd { }
-    public static class TaskLinkRemove { }
-    
-    public static class Answer { }
-    public static class Unsolved { }
-    
-    
-    
-    abstract public static class ConceptFire implements EventObserver { 
-        
-        /**
-         * use:
-         * Concept n.getCurrentConcept()
-         * TaskLink n.getCurrentTaskLink()
-         */
-        abstract public void onFire(GeneralInferenceControl n);
-        
-        @Override public void event(Class event, Object[] args) {
-            onFire((GeneralInferenceControl)args[0]);
-        }
-        
-    }
-    abstract public static class TaskImmediateProcess implements EventObserver { 
-
-        abstract public void onProcessed(Task t, DerivationContext n);
-        
-        @Override public void event(Class event, Object[] args) {
-            onProcessed((Task)args[0], (DerivationContext)args[1]);
-        }
-        
-    }
-    public static class TermLinkSelect { }
-    public static class BeliefSelect { }
-    
-    /** called from RuleTables.reason for a given Belief */
-    public static class BeliefReason {    }
-    
-    public static class ConceptUnification { } //2nd level unification in CompositionalRules
-
-    abstract public static class TaskAdd implements EventObserver { 
-        
-        abstract public void onTaskAdd(Task t, String reason);
-        
-        @Override public void event(Class event, Object[] args) {
-            onTaskAdd((Task)args[0], (String)args[1]);
-        }
-    }
-    public static class TaskRemove { }
-    public static class TaskDerive {    }
-
-    public static class PluginsChange {    }
-
-    //public static class UnExecutedGoal {    }
-
-    public static class ConceptDirectProcessedTask {    }
-
-    abstract public static class InferenceEvent {
-
-        public final long when;
-        public final List<StackTraceElement> stack;
-
-        //how many stack frames down to record from; we don't need to include the current and the previous (InferenceEvent subclass's constructor
-        int STACK_PREFIX = 4;
-
-        protected InferenceEvent(long when) {
-            this(when, 0);
-        }
-        
-        protected InferenceEvent(long when, int stackFrames) {
-            this.when = when;
-            
-            if (stackFrames > 0) {
-                List<StackTraceElement> sl = Arrays.asList(Thread.currentThread().getStackTrace());
-
-                int frame = 0;
-                
-                for (StackTraceElement e : sl) {
-                    frame++;
-                    if (e.getClassName().equals("nars.core.NAR")) {
-                        break;
-                    }                    
-                }
-                if (frame - STACK_PREFIX > stackFrames)
-                    frame = STACK_PREFIX + stackFrames;
-                this.stack = sl.subList(STACK_PREFIX, frame);
-            }
-            else {
-                this.stack = null;
-            }
-        }
-
-        public Class getType() {
-            return getClass();
-        }
-
-    }
-
-    abstract public static class ParametricInferenceEvent<O> extends InferenceEvent {    
-        public final O object;
-
-        public ParametricInferenceEvent(O object, long when) {
-            super(when);
-            this.object = object;
-        }
-        
-        
-        
-    }
-    
-    
-}
+package nars.io.events;
+
+import java.util.Arrays;
+import java.util.List;
+import nars.io.events.EventEmitter.EventObserver;
+import nars.control.GeneralInferenceControl;
+import nars.control.DerivationContext;
+import nars.entity.Concept;
+import nars.entity.Sentence;
+import nars.entity.Task;
+
+/** empty event classes for use with EventEmitter */
+public class Events {
+
+
+    /** fired at the beginning of each NAR multi-cycle execution*/
+    public static class CyclesStart {     } 
+    
+    /** fired at the end of each NAR multi-cycle execution */
+    public static class CyclesEnd {     }
+    
+    /** fired at the beginning of each memory cycle */
+    public static class CycleStart {     } 
+    
+    /** fired at the end of each memory cycle */
+    public static class CycleEnd {     }
+
+    /** fired at the beginning of each individual Memory work cycle */
+    public static class WorkCycleStart {
+    }
+
+    /** fired at the end of each Memory individual cycle */
+    public static class WorkCycleEnd {
+    }
+
+    /** called before memory.reset() proceeds */
+    public static class ResetStart {
+    }
+
+    /** called after memory.reset() proceeds */
+    public static class ResetEnd {
+    }
+    
+    
+    public static class ConceptNew extends ParametricInferenceEvent<Concept> {
+        public ConceptNew(Concept c, long when) {
+            super(c, when);
+        }
+        
+        @Override public String toString() {
+            return "Concept Created: " + object;
+        }        
+    }
+    
+    public static class Perceive {    }
+    
+    public static class ConceptForget { }
+    
+    public static class EnactableExplainationAdd { }
+    public static class EnactableExplainationRemove { }
+    
+    abstract public static class ConceptBeliefAdd implements EventObserver {  
+        
+        abstract public void onBeliefAdd(Concept c, Task t, Object[] extra);
+        
+        @Override public void event(Class event, Object[] args) {
+            onBeliefAdd( (Concept)args[0], (Task)args[1], (Object[])args[2]);
+        }
+        
+    }
+    
+    abstract public static class ConceptBeliefRemove implements EventObserver { 
+        
+        abstract public void onBeliefRemove(Concept c, Sentence removed, Task t, Object[] extra);
+        
+        @Override public void event(Class event, Object[] args) {
+            onBeliefRemove( (Concept)args[0], (Sentence)args[1], (Task)args[2], (Object[])args[3]);
+        }        
+
+    }
+    
+    public static class ConceptGoalAdd { }
+    public static class ConceptGoalRemove { }
+    public static class ConceptQuestionAdd { }
+    public static class ConceptQuestionRemove { }
+
+    
+    //Executive & Planning
+    public static class UnexecutableGoal {   }
+    public static class UnexecutableOperation {   }
+    public static class NewTaskExecution {    }
+    public static class InduceSucceedingEvent {    }
+    
+
+    public static class TermLinkAdd { }
+    public static class TermLinkRemove { }
+    public static class TaskLinkAdd { }
+    public static class TaskLinkRemove { }
+    
+    public static class Answer { }
+    public static class Unsolved { }
+    
+    
+    
+    abstract public static class ConceptFire implements EventObserver { 
+        
+        /**
+         * use:
+         * Concept n.getCurrentConcept()
+         * TaskLink n.getCurrentTaskLink()
+         */
+        abstract public void onFire(GeneralInferenceControl n);
+        
+        @Override public void event(Class event, Object[] args) {
+            onFire((GeneralInferenceControl)args[0]);
+        }
+        
+    }
+    abstract public static class TaskImmediateProcess implements EventObserver { 
+
+        abstract public void onProcessed(Task t, DerivationContext n);
+        
+        @Override public void event(Class event, Object[] args) {
+            onProcessed((Task)args[0], (DerivationContext)args[1]);
+        }
+        
+    }
+    public static class TermLinkSelect { }
+    public static class BeliefSelect { }
+    
+    /** called from RuleTables.reason for a given Belief */
+    public static class BeliefReason {    }
+    
+    public static class ConceptUnification { } //2nd level unification in CompositionalRules
+
+    abstract public static class TaskAdd implements EventObserver { 
+        
+        abstract public void onTaskAdd(Task t, String reason);
+        
+        @Override public void event(Class event, Object[] args) {
+            onTaskAdd((Task)args[0], (String)args[1]);
+        }
+    }
+    public static class TaskRemove { }
+    public static class TaskDerive {    }
+
+    public static class PluginsChange {    }
+
+    //public static class UnExecutedGoal {    }
+
+    public static class ConceptDirectProcessedTask {    }
+
+    abstract public static class InferenceEvent {
+
+        public final long when;
+        public final List<StackTraceElement> stack;
+
+        //how many stack frames down to record from; we don't need to include the current and the previous (InferenceEvent subclass's constructor
+        int STACK_PREFIX = 4;
+
+        protected InferenceEvent(long when) {
+            this(when, 0);
+        }
+        
+        protected InferenceEvent(long when, int stackFrames) {
+            this.when = when;
+            
+            if (stackFrames > 0) {
+                List<StackTraceElement> sl = Arrays.asList(Thread.currentThread().getStackTrace());
+
+                int frame = 0;
+                
+                for (StackTraceElement e : sl) {
+                    frame++;
+                    if (e.getClassName().equals("nars.core.NAR")) {
+                        break;
+                    }                    
+                }
+                if (frame - STACK_PREFIX > stackFrames)
+                    frame = STACK_PREFIX + stackFrames;
+                this.stack = sl.subList(STACK_PREFIX, frame);
+            }
+            else {
+                this.stack = null;
+            }
+        }
+
+        public Class getType() {
+            return getClass();
+        }
+
+    }
+
+    abstract public static class ParametricInferenceEvent<O> extends InferenceEvent {    
+        public final O object;
+
+        public ParametricInferenceEvent(O object, long when) {
+            super(when);
+            this.object = object;
+        }
+        
+        
+        
+    }
+    
+    
+}
diff --git a/nars_core/nars/io/handlers/OutputHandler.java b/nars_core/nars/io/events/OutputHandler.java
similarity index 88%
rename from nars_core/nars/io/handlers/OutputHandler.java
rename to nars_core/nars/io/events/OutputHandler.java
index ec4110ba1e63dea9e2a5680d0512677d0cde9941..11241ecc01f8b0bdac7efe3ab8f8a855eff3bb83 100644
--- a/nars_core/nars/io/handlers/OutputHandler.java
+++ b/nars_core/nars/io/events/OutputHandler.java
@@ -1,8 +1,7 @@
-package nars.io.handlers;
+package nars.io.events;
 
-import nars.io.handlers.EventHandler;
-import nars.util.EventEmitter;
-import nars.util.Events.Answer;
+import nars.io.events.EventHandler;
+import nars.io.events.Events.Answer;
 import nars.storage.Memory;
 import nars.main.NAR;
 
diff --git a/nars_core/nars/io/handlers/TextOutputHandler.java b/nars_core/nars/io/events/TextOutputHandler.java
similarity index 93%
rename from nars_core/nars/io/handlers/TextOutputHandler.java
rename to nars_core/nars/io/events/TextOutputHandler.java
index 0d7d0efbf10ca671021d338a7613702013c9df0b..af5aae241235907e659a29ff296e9174de0d2a12 100644
--- a/nars_core/nars/io/handlers/TextOutputHandler.java
+++ b/nars_core/nars/io/events/TextOutputHandler.java
@@ -18,10 +18,10 @@
  * You should have received a copy of the GNU General Public License
  * along with Open-NARS.  If not, see <http://www.gnu.org/licenses/>.
  */
-package nars.io.handlers;
+package nars.io.events;
 
-import nars.io.handlers.OutputHandler;
-import nars.util.Texts;
+import nars.io.events.OutputHandler;
+import nars.io.Texts;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.PrintStream;
@@ -29,15 +29,15 @@ import java.io.PrintWriter;
 import java.io.Serializable;
 import java.io.StringWriter;
 import java.util.Arrays;
-import nars.util.Events.Answer;
+import nars.io.events.Events.Answer;
 import nars.main.NAR;
 import nars.entity.Sentence;
 import nars.entity.Task;
-import nars.io.handlers.OutputHandler.ECHO;
-import nars.io.handlers.OutputHandler.ERR;
-import nars.io.handlers.OutputHandler.EXE;
-import nars.io.handlers.OutputHandler.IN;
-import nars.io.handlers.OutputHandler.OUT;
+import nars.io.events.OutputHandler.ECHO;
+import nars.io.events.OutputHandler.ERR;
+import nars.io.events.OutputHandler.EXE;
+import nars.io.events.OutputHandler.IN;
+import nars.io.events.OutputHandler.OUT;
 
 /**
  * To read and write experience as Task streams
diff --git a/nars_core/nars/language/Term.java b/nars_core/nars/language/Term.java
index 3e3e06070fb2d6ad9a622fa3119a30606cb60db8..5d4b57185904a65dcf24413cb30cbf9f334d1c56 100644
--- a/nars_core/nars/language/Term.java
+++ b/nars_core/nars/language/Term.java
@@ -29,7 +29,7 @@ import nars.operator.ImaginationSpace;
 import nars.inference.TemporalRules;
 import nars.io.Symbols;
 import nars.io.Symbols.NativeOperator;
-import nars.util.Texts;
+import nars.io.Texts;
 import nars.operator.Operation;
 import nars.operator.Operator;
 //import nars.util.sort.SortedList;
diff --git a/nars_core/nars/language/Variable.java b/nars_core/nars/language/Variable.java
index a19136d4ab9d29f225ddffc220c99660ad73cfb1..a26c400a100b5a25f294a076c351607cdda88a52 100644
--- a/nars_core/nars/language/Variable.java
+++ b/nars_core/nars/language/Variable.java
@@ -25,7 +25,7 @@ import nars.main.Parameters;
 import static nars.io.Symbols.VAR_DEPENDENT;
 import static nars.io.Symbols.VAR_INDEPENDENT;
 import static nars.io.Symbols.VAR_QUERY;
-import nars.util.Texts;
+import nars.io.Texts;
 import static nars.language.Variable.newName;
 
 /**
diff --git a/nars_core/nars/main/NAR.java b/nars_core/nars/main/NAR.java
index 214446d19c6abb67dfb5e0e3a8c591c34c980e19..0df55f506eeb3dff7338f328e3eed8f064a8b2aa 100644
--- a/nars_core/nars/main/NAR.java
+++ b/nars_core/nars/main/NAR.java
@@ -1,10 +1,10 @@
 package nars.main;
 
 import java.io.BufferedReader;
-import nars.util.Plugin;
+import nars.plugin.Plugin;
 import nars.storage.Memory;
-import nars.util.Events;
-import nars.util.EventEmitter;
+import nars.io.events.Events;
+import nars.io.events.EventEmitter;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
@@ -20,15 +20,15 @@ import java.util.List;
 import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import nars.util.EventEmitter.EventObserver;
+import nars.io.events.EventEmitter.EventObserver;
 import nars.entity.BudgetValue;
 import nars.entity.Concept;
 import nars.entity.Sentence;
 import nars.entity.Stamp;
 import nars.entity.Task;
 import nars.language.Interval;
-import nars.io.handlers.AnswerHandler;
-import nars.io.handlers.OutputHandler.ERR;
+import nars.io.events.AnswerHandler;
+import nars.io.events.OutputHandler.ERR;
 import nars.io.Symbols;
 import nars.io.Narsese;
 import nars.io.Narsese.InvalidInputException;
@@ -37,8 +37,8 @@ import nars.operator.Operator;
 import nars.perception.SensoryChannel;
 import nars.language.Term;
 import nars.storage.LevelBag;
-import nars.util.Events.CyclesEnd;
-import nars.util.Events.CyclesStart;
+import nars.io.events.Events.CyclesEnd;
+import nars.io.events.Events.CyclesStart;
 
 
 /**
diff --git a/nars_core/nars/main/Shell.java b/nars_core/nars/main/Shell.java
index 6a67b378844735a718f6c30fbfe71f7cf59721f1..9ea4c11d1258b73257c69068fff21e889988a84f 100644
--- a/nars_core/nars/main/Shell.java
+++ b/nars_core/nars/main/Shell.java
@@ -26,7 +26,7 @@ import java.io.PrintWriter;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import nars.main.NAR;
-import nars.io.handlers.TextOutputHandler;
+import nars.io.events.TextOutputHandler;
 
 /**
  * Run Reasoner
diff --git a/nars_core/nars/operator/Operator.java b/nars_core/nars/operator/Operator.java
index 90c409ca51788910c005fccb21c46512376ef52a..399a4fcf9f6eafa2aecb4c34fc2ce64c2b74ab51 100644
--- a/nars_core/nars/operator/Operator.java
+++ b/nars_core/nars/operator/Operator.java
@@ -21,7 +21,7 @@
 
 package nars.operator;
 
-import nars.util.Plugin;
+import nars.plugin.Plugin;
 import java.util.Arrays;
 import java.util.List;
 import nars.storage.Memory;
@@ -30,7 +30,7 @@ import nars.main.Parameters;
 import nars.entity.BudgetValue;
 import nars.entity.Task;
 import nars.entity.TruthValue;
-import nars.io.handlers.OutputHandler.EXE;
+import nars.io.events.OutputHandler.EXE;
 import nars.language.Product;
 import nars.language.Statement;
 import nars.language.Term;
diff --git a/nars_core/nars/operator/mental/Anticipate.java b/nars_core/nars/operator/mental/Anticipate.java
index 382139ee1bb6b36a3936c0865511a55139646631..3833fa8d6f714630c6ce8fb7f1ee2827a5bca300 100644
--- a/nars_core/nars/operator/mental/Anticipate.java
+++ b/nars_core/nars/operator/mental/Anticipate.java
@@ -28,9 +28,9 @@ import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
-import nars.util.EventEmitter.EventObserver;
-import nars.util.Events;
-import nars.util.Events.CycleEnd;
+import nars.io.events.EventEmitter.EventObserver;
+import nars.io.events.Events;
+import nars.io.events.Events.CycleEnd;
 import nars.storage.Memory;
 import nars.main.NAR;
 import nars.main.Parameters;
@@ -41,9 +41,9 @@ import nars.entity.Stamp;
 import nars.entity.Task;
 import nars.entity.TruthValue;
 import nars.inference.BudgetFunctions;
-import nars.io.handlers.OutputHandler.ANTICIPATE;
-import nars.io.handlers.OutputHandler.CONFIRM;
-import nars.io.handlers.OutputHandler.DISAPPOINT;
+import nars.io.events.OutputHandler.ANTICIPATE;
+import nars.io.events.OutputHandler.CONFIRM;
+import nars.io.events.OutputHandler.DISAPPOINT;
 import nars.io.Symbols;
 import nars.language.Interval;
 import nars.language.Product;
diff --git a/nars_core/nars/operator/misc/MathExpression.java b/nars_core/nars/operator/misc/MathExpression.java
index d6a4edfcc653f3cc60e989b12b4be8dd6b3c68cd..ea4c296d0d7c1831e9589f91126046ba99613dbf 100644
--- a/nars_core/nars/operator/misc/MathExpression.java
+++ b/nars_core/nars/operator/misc/MathExpression.java
@@ -2,8 +2,8 @@ package nars.operator.misc;
 
 import java.util.List;
 import nars.storage.Memory;
-import nars.util.Texts;
-import static nars.util.Texts.unescape;
+import nars.io.Texts;
+import static nars.io.Texts.unescape;
 import nars.language.Inheritance;
 import nars.language.Product;
 import nars.language.Term;
diff --git a/nars_core/nars/util/Plugin.java b/nars_core/nars/plugin/Plugin.java
similarity index 94%
rename from nars_core/nars/util/Plugin.java
rename to nars_core/nars/plugin/Plugin.java
index bad436e65b93c58bea7f746e47df7dd115e6f8cb..3daf93723da5d07b2314cf9916c3212f8beee9b7 100644
--- a/nars_core/nars/util/Plugin.java
+++ b/nars_core/nars/plugin/Plugin.java
@@ -1,4 +1,4 @@
-package nars.util;
+package nars.plugin;
 
 import java.io.Serializable;
 import nars.main.NAR;
diff --git a/nars_core/nars/plugin/mental/Abbreviation.java b/nars_core/nars/plugin/mental/Abbreviation.java
index 5ddd47ac4b572fd7bf6e5e64f1610394d4206466..a09710b545a9d18d09977724aa55700b40d2948e 100644
--- a/nars_core/nars/plugin/mental/Abbreviation.java
+++ b/nars_core/nars/plugin/mental/Abbreviation.java
@@ -1,10 +1,10 @@
 package nars.plugin.mental;
 
-import nars.util.Plugin;
+import nars.plugin.Plugin;
 import com.google.common.collect.Lists;
 import java.util.ArrayList;
-import nars.util.EventEmitter.EventObserver;
-import nars.util.Events.TaskDerive;
+import nars.io.events.EventEmitter.EventObserver;
+import nars.io.events.Events.TaskDerive;
 import nars.storage.Memory;
 import nars.main.NAR;
 import nars.main.Parameters;
diff --git a/nars_core/nars/plugin/mental/Counting.java b/nars_core/nars/plugin/mental/Counting.java
index b678b9b614759a9bfd8e227540e3eef0ef74beba..f77542cdfc7c4f02072391bbca4d329e9f0d66be 100644
--- a/nars_core/nars/plugin/mental/Counting.java
+++ b/nars_core/nars/plugin/mental/Counting.java
@@ -1,10 +1,10 @@
 package nars.plugin.mental;
 
-import nars.util.EventEmitter.EventObserver;
-import nars.util.Events;
+import nars.io.events.EventEmitter.EventObserver;
+import nars.io.events.Events;
 import nars.storage.Memory;
 import nars.main.NAR;
-import nars.util.Plugin;
+import nars.plugin.Plugin;
 import nars.entity.BudgetValue;
 import nars.entity.Sentence;
 import nars.entity.Stamp;
diff --git a/nars_core/nars/plugin/mental/Emotions.java b/nars_core/nars/plugin/mental/Emotions.java
index edb6f3f335b013cecc356e06b0a361e09f8afa79..e09213e8b62bcf727c0c3c1555e0d229b618abc3 100644
--- a/nars_core/nars/plugin/mental/Emotions.java
+++ b/nars_core/nars/plugin/mental/Emotions.java
@@ -13,7 +13,7 @@ import nars.io.Symbols;
 import nars.language.Inheritance;
 import nars.language.SetInt;
 import nars.language.Term;
-import nars.util.Plugin;
+import nars.plugin.Plugin;
 
 /** emotional value; self-felt internal mental states; variables used to record emotional values */
 public class Emotions implements Plugin {
diff --git a/nars_core/nars/plugin/mental/InternalExperience.java b/nars_core/nars/plugin/mental/InternalExperience.java
index eed934de62523c579de43ce5cbb6787c13bd1daf..17b15c545ecabf9830abb0978da09883d005b49f 100644
--- a/nars_core/nars/plugin/mental/InternalExperience.java
+++ b/nars_core/nars/plugin/mental/InternalExperience.java
@@ -1,9 +1,9 @@
 package nars.plugin.mental;
 
-import nars.util.Plugin;
+import nars.plugin.Plugin;
 import java.util.Arrays;
-import nars.util.EventEmitter.EventObserver;
-import nars.util.Events;
+import nars.io.events.EventEmitter.EventObserver;
+import nars.io.events.Events;
 import nars.storage.Memory;
 import nars.main.NAR;
 import nars.main.Parameters;
diff --git a/nars_core/nars/plugin/misc/RuntimeNARSettings.java b/nars_core/nars/plugin/misc/RuntimeNARSettings.java
index 0cc6a2f9214f8a03ef28e74a643269c86d706b1b..8f655327ebcd054be2261781e2dd641d3453ade2 100644
--- a/nars_core/nars/plugin/misc/RuntimeNARSettings.java
+++ b/nars_core/nars/plugin/misc/RuntimeNARSettings.java
@@ -5,7 +5,7 @@
 
 package nars.plugin.misc;
 
-import nars.util.Plugin;
+import nars.plugin.Plugin;
 import nars.main.NAR;
 import nars.main.Parameters;
 
diff --git a/nars_core/nars/storage/Memory.java b/nars_core/nars/storage/Memory.java
index 0cd2b0bad1426b06ab8b85a0e0af9279b9ebddd9..e02eb0f8320565893cae39de4702c72435528a27 100644
--- a/nars_core/nars/storage/Memory.java
+++ b/nars_core/nars/storage/Memory.java
@@ -21,8 +21,8 @@
 package nars.storage;
 
 import nars.control.ConceptProcessing;
-import nars.util.Events;
-import nars.util.EventEmitter;
+import nars.io.events.Events;
+import nars.io.events.EventEmitter;
 import java.io.Serializable;
 import java.util.ArrayDeque;
 import java.util.Arrays;
@@ -34,9 +34,9 @@ import java.util.Random;
 import nars.main.NAR;
 import nars.main.NAR.RuntimeParameters;
 import nars.main.Parameters;
-import nars.util.Events.ResetEnd;
-import nars.util.Events.ResetStart;
-import nars.util.Events.TaskRemove;
+import nars.io.events.Events.ResetEnd;
+import nars.io.events.Events.ResetStart;
+import nars.io.events.Events.TaskRemove;
 import nars.control.DerivationContext;
 import nars.control.GeneralInferenceControl;
 import nars.control.TemporalInferenceControl;
@@ -50,8 +50,8 @@ import nars.entity.Task;
 import nars.entity.TruthValue;
 import nars.inference.BudgetFunctions;
 import static nars.inference.BudgetFunctions.truthToQuality;
-import nars.io.handlers.OutputHandler.IN;
-import nars.io.handlers.OutputHandler.OUT;
+import nars.io.events.OutputHandler.IN;
+import nars.io.events.OutputHandler.OUT;
 import nars.io.Symbols;
 import nars.language.Tense;
 import nars.language.Term;
diff --git a/nars_gui/nars/gui/InferenceLogger.java b/nars_gui/nars/gui/InferenceLogger.java
index 33bb5a1fdaf2f00c59e48cb04256fe754d80a484..080d05bc99be32923e8ada19a8ebe69abe5a48af 100644
--- a/nars_gui/nars/gui/InferenceLogger.java
+++ b/nars_gui/nars/gui/InferenceLogger.java
@@ -24,9 +24,9 @@ import java.io.PrintStream;
 import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
-import nars.util.Events.ConceptNew;
-import nars.util.Events.TaskAdd;
-import nars.util.Events.TaskRemove;
+import nars.io.events.Events.ConceptNew;
+import nars.io.events.Events.TaskAdd;
+import nars.io.events.Events.TaskRemove;
 import nars.main.NAR;
 import nars.entity.Concept;
 import nars.entity.Task;
diff --git a/nars_gui/nars/gui/NARControls.java b/nars_gui/nars/gui/NARControls.java
index 370b92181ba6713835ea01af5084479f6167a363..ce9e93b0eef22e860b74231f9e53260fb33e2a93 100644
--- a/nars_gui/nars/gui/NARControls.java
+++ b/nars_gui/nars/gui/NARControls.java
@@ -45,8 +45,8 @@ import javax.swing.JMenuBar;
 import javax.swing.JMenuItem;
 import javax.swing.JPanel;
 import javax.swing.SwingUtilities;
-import nars.util.EventEmitter.EventObserver;
-import nars.util.Events;
+import nars.io.events.EventEmitter.EventObserver;
+import nars.io.events.Events;
 import nars.storage.Memory;
 import nars.main.NAR;
 import nars.main.Parameters;
@@ -56,11 +56,11 @@ import nars.gui.output.SentenceTablePanel;
 import nars.gui.output.SwingLogPanel;
 import nars.gui.output.TaskTree;
 import nars.gui.output.graph.NARGraphPanel;
-import nars.io.handlers.OutputHandler;
-import nars.io.handlers.TextOutputHandler;
+import nars.io.events.OutputHandler;
+import nars.io.events.TextOutputHandler;
 import nars.language.Interval.PortableInteger;
-import nars.util.Events.CycleEnd;
-import nars.util.Events.CyclesEnd;
+import nars.io.events.Events.CycleEnd;
+import nars.io.events.Events.CyclesEnd;
 
 public class NARControls extends JPanel implements ActionListener, EventObserver {
 
diff --git a/nars_gui/nars/gui/NARSwing.java b/nars_gui/nars/gui/NARSwing.java
index 51a9ddf06fa41def5dddf357da27e326bec2dbe5..f73eba1c91ad50b3b0376ab7e9a20ae4a665933a 100644
--- a/nars_gui/nars/gui/NARSwing.java
+++ b/nars_gui/nars/gui/NARSwing.java
@@ -30,7 +30,7 @@ import javax.swing.JFrame;
 import javax.swing.UIManager;
 import javax.swing.border.EmptyBorder;
 import nars.main.NAR;
-import nars.io.handlers.TextOutputHandler;
+import nars.io.events.TextOutputHandler;
 
 /**
  * The main Swing GUI class of the open-nars project.  
diff --git a/nars_gui/nars/gui/graph/SentenceGraph.java b/nars_gui/nars/gui/graph/SentenceGraph.java
index 99411d506bb7b1c4ce30fc9d4265e103089b5cc2..52c25941320bf384c30f6199148bc87c9d8682ea 100644
--- a/nars_gui/nars/gui/graph/SentenceGraph.java
+++ b/nars_gui/nars/gui/graph/SentenceGraph.java
@@ -1,257 +1,257 @@
-package nars.gui.graph;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import nars.util.EventEmitter;
-import nars.util.EventEmitter.EventObserver;
-import nars.util.Events;
-import nars.storage.Memory;
-import nars.entity.Concept;
-import nars.entity.Item;
-import nars.entity.Sentence;
-import nars.entity.Task;
-import nars.language.CompoundTerm;
-import nars.language.Interval.PortableDouble;
-import nars.language.Statement;
-import nars.language.Term;
-import org.jgrapht.EdgeFactory;
-import org.jgrapht.graph.DirectedMultigraph;
-
-
-
-abstract public class SentenceGraph<E> extends DirectedMultigraph<Term, E> implements EventObserver {
-    public final Memory memory;
-
-    public static class GraphChange { }
-    
-    private boolean needInitialConcepts;
-    private boolean started;
-    
-    public final Map<Sentence, List<E>> components = new HashMap();
-    
-    public final EventEmitter event = new EventEmitter( GraphChange.class );
-    PortableDouble minConceptPri;
-            
-    public SentenceGraph(Memory memory, PortableDouble minConceptPri) {
-        super(/*null*/new EdgeFactory() {
-
-            @Override public Object createEdge(Object v, Object v1) {
-                return null;
-            }
-            
-        });
-        this.minConceptPri = minConceptPri;
-        this.memory = memory;
-        
-        reset();
-        
-        start();
-        
-    }
-    
-    private void setEvents(boolean n) {
-        if (memory!=null) {
-            memory.event.set(this, n, 
-                    Events.CyclesEnd.class, 
-                    Events.ConceptForget.class, 
-                    Events.ConceptBeliefAdd.class, 
-                    Events.ConceptBeliefRemove.class, 
-                    Events.ConceptGoalAdd.class, 
-                    Events.ConceptGoalRemove.class, 
-                    Events.ResetEnd.class
-                    );
-        }
-    }
-    
-    public void start() {
-        if (started) return;        
-        started = true;
-        setEvents(true);        
-    }
-    
-    public void stop() {
-        if (!started) return;
-        started = false;
-        setEvents(false);
-    }
-
-    
-    @Override
-    public void event(final Class event, final Object[] a) {
-//        if (event!=FrameEnd.class)
-//            System.out.println(event + " " + Arrays.toString(a));
-        
-        if (event == Events.ConceptForget.class) {
-            //remove all associated beliefs
-            Concept c = (Concept)a[0];
-            
-            //create a clone of the list for thread safety
-            for (Task b : new ArrayList<Task>(c.beliefs)) {
-                remove(b.sentence);
-            }            
-        }
-        else if (event == Events.ConceptBeliefAdd.class) {
-            Concept c = (Concept)a[0];
-            Sentence s = ((Task)a[1]).sentence;
-            if(c.getPriority() > minConceptPri.get()) {
-                add(s, c);
-            }
-        }
-        else if (event == Events.ConceptBeliefRemove.class) {
-            Concept c = (Concept)a[0];
-            Sentence s = (Sentence)a[1];
-            remove(s);
-        }
-        /*else if (event == Events.ConceptGoalAdd.class) {
-            Concept c = (Concept)a[0];
-            Sentence s = ((Task)a[1]).sentence;
-            add(s, c);
-        }
-        else if (event == Events.ConceptGoalRemove.class) {
-            Concept c = (Concept)a[0];
-            Sentence s = (Sentence)a[1];
-            remove(s);
-        }*/
-        else if (event == Events.CyclesEnd.class) {
-            if (needInitialConcepts)
-                getInitialConcepts();
-        }
-        else if (event == Events.ResetEnd.class) {
-            reset();
-        }
-    }    
-    
-
-    
-        
-    protected boolean remove(Sentence s) {
-        List<E> componentList = components.get(s);
-        if (componentList!=null) {
-            for (E e : componentList) {
-                if (!containsEdge(e))
-                    continue;
-                Term source = getEdgeSource(e);
-                Term target = getEdgeTarget(e);
-                removeEdge(e);
-                ensureTermConnected(source);
-                ensureTermConnected(target);
-            }
-            componentList.clear();
-            components.remove(s);        
-            return true;
-        }
-        return false;
-    }
-    
-    public void reset() {
-        try {
-            this.removeAllEdges( new ArrayList(edgeSet()) );
-        }
-        catch (Exception e) {
-            System.err.println(e);
-        }
-        
-        try {
-            this.removeAllVertices( new ArrayList(vertexSet()) );
-        }
-        catch (Exception e) {
-            System.err.println(e);
-        }
-        
-        if (!edgeSet().isEmpty()) {
-            System.err.println(this + " edges not empty after reset()");
-            System.exit(1);
-        }
-        if (!vertexSet().isEmpty()) {
-            System.err.println(this + " vertices not empty after reset()");
-            System.exit(1);
-        }
-            
-        needInitialConcepts = true;
-    }
-    
-    private void getInitialConcepts() {
-        needInitialConcepts = false;
-
-        try {
-            for (final Concept c : memory) {
-                for (final Task ts : c.beliefs) {                
-                    add(ts.sentence, c);
-                }
-            }        
-        }
-        catch (NoSuchElementException e) { }
-    }
-    
-    protected final void ensureTermConnected(final Term t) {
-        if (inDegreeOf(t)+outDegreeOf(t) == 0)  removeVertex(t);        
-    }
-    
-        
-    abstract public boolean allow(Sentence s);
-    
-    abstract public boolean allow(CompoundTerm st);    
-    
-    public boolean remove(final E s) {
-        if (!containsEdge(s))
-            return false;
-        
-        Term from = getEdgeSource(s);
-        Term to = getEdgeTarget(s);
-        
-        
-        boolean r = removeEdge(s);
-        
-        
-        ensureTermConnected(from);
-        ensureTermConnected(to);
-
-        if (r)
-            event.emit(GraphChange.class, null, s);
-        return true;
-    }
-    
-   
-    protected void addComponents(final Sentence parentSentence, final E edge) {
-        List<E> componentList = components.get(parentSentence);
-        if (componentList == null) {
-            componentList = new ArrayList(1);
-            components.put(parentSentence, componentList);
-        }
-        componentList.add(edge);        
-    }
-    
-    public boolean add(final Sentence s, final Item c) {         
-
-        if (!allow(s))
-            return false;               
-        
-        if (s.term instanceof CompoundTerm) {
-            CompoundTerm cs = (CompoundTerm)s.term;
-        
-            if (cs instanceof Statement) {
-                
-                
-                Statement st = (Statement)cs;
-                if (allow(st)) {                                                    
-                    
-                    if (add(s, st, c)) {
-                        event.emit(GraphChange.class, st, null);
-                        return true;
-                    }
-                }
-            }
-                
-        }        
-        
-        return false;
-    }    
-    
-    /** default behavior, may override in subclass */
-    abstract public boolean add(final Sentence s, final CompoundTerm ct, final Item c);
-
-    
-}
+package nars.gui.graph;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import nars.io.events.EventEmitter;
+import nars.io.events.EventEmitter.EventObserver;
+import nars.io.events.Events;
+import nars.storage.Memory;
+import nars.entity.Concept;
+import nars.entity.Item;
+import nars.entity.Sentence;
+import nars.entity.Task;
+import nars.language.CompoundTerm;
+import nars.language.Interval.PortableDouble;
+import nars.language.Statement;
+import nars.language.Term;
+import org.jgrapht.EdgeFactory;
+import org.jgrapht.graph.DirectedMultigraph;
+
+
+
+abstract public class SentenceGraph<E> extends DirectedMultigraph<Term, E> implements EventObserver {
+    public final Memory memory;
+
+    public static class GraphChange { }
+    
+    private boolean needInitialConcepts;
+    private boolean started;
+    
+    public final Map<Sentence, List<E>> components = new HashMap();
+    
+    public final EventEmitter event = new EventEmitter( GraphChange.class );
+    PortableDouble minConceptPri;
+            
+    public SentenceGraph(Memory memory, PortableDouble minConceptPri) {
+        super(/*null*/new EdgeFactory() {
+
+            @Override public Object createEdge(Object v, Object v1) {
+                return null;
+            }
+            
+        });
+        this.minConceptPri = minConceptPri;
+        this.memory = memory;
+        
+        reset();
+        
+        start();
+        
+    }
+    
+    private void setEvents(boolean n) {
+        if (memory!=null) {
+            memory.event.set(this, n, 
+                    Events.CyclesEnd.class, 
+                    Events.ConceptForget.class, 
+                    Events.ConceptBeliefAdd.class, 
+                    Events.ConceptBeliefRemove.class, 
+                    Events.ConceptGoalAdd.class, 
+                    Events.ConceptGoalRemove.class, 
+                    Events.ResetEnd.class
+                    );
+        }
+    }
+    
+    public void start() {
+        if (started) return;        
+        started = true;
+        setEvents(true);        
+    }
+    
+    public void stop() {
+        if (!started) return;
+        started = false;
+        setEvents(false);
+    }
+
+    
+    @Override
+    public void event(final Class event, final Object[] a) {
+//        if (event!=FrameEnd.class)
+//            System.out.println(event + " " + Arrays.toString(a));
+        
+        if (event == Events.ConceptForget.class) {
+            //remove all associated beliefs
+            Concept c = (Concept)a[0];
+            
+            //create a clone of the list for thread safety
+            for (Task b : new ArrayList<Task>(c.beliefs)) {
+                remove(b.sentence);
+            }            
+        }
+        else if (event == Events.ConceptBeliefAdd.class) {
+            Concept c = (Concept)a[0];
+            Sentence s = ((Task)a[1]).sentence;
+            if(c.getPriority() > minConceptPri.get()) {
+                add(s, c);
+            }
+        }
+        else if (event == Events.ConceptBeliefRemove.class) {
+            Concept c = (Concept)a[0];
+            Sentence s = (Sentence)a[1];
+            remove(s);
+        }
+        /*else if (event == Events.ConceptGoalAdd.class) {
+            Concept c = (Concept)a[0];
+            Sentence s = ((Task)a[1]).sentence;
+            add(s, c);
+        }
+        else if (event == Events.ConceptGoalRemove.class) {
+            Concept c = (Concept)a[0];
+            Sentence s = (Sentence)a[1];
+            remove(s);
+        }*/
+        else if (event == Events.CyclesEnd.class) {
+            if (needInitialConcepts)
+                getInitialConcepts();
+        }
+        else if (event == Events.ResetEnd.class) {
+            reset();
+        }
+    }    
+    
+
+    
+        
+    protected boolean remove(Sentence s) {
+        List<E> componentList = components.get(s);
+        if (componentList!=null) {
+            for (E e : componentList) {
+                if (!containsEdge(e))
+                    continue;
+                Term source = getEdgeSource(e);
+                Term target = getEdgeTarget(e);
+                removeEdge(e);
+                ensureTermConnected(source);
+                ensureTermConnected(target);
+            }
+            componentList.clear();
+            components.remove(s);        
+            return true;
+        }
+        return false;
+    }
+    
+    public void reset() {
+        try {
+            this.removeAllEdges( new ArrayList(edgeSet()) );
+        }
+        catch (Exception e) {
+            System.err.println(e);
+        }
+        
+        try {
+            this.removeAllVertices( new ArrayList(vertexSet()) );
+        }
+        catch (Exception e) {
+            System.err.println(e);
+        }
+        
+        if (!edgeSet().isEmpty()) {
+            System.err.println(this + " edges not empty after reset()");
+            System.exit(1);
+        }
+        if (!vertexSet().isEmpty()) {
+            System.err.println(this + " vertices not empty after reset()");
+            System.exit(1);
+        }
+            
+        needInitialConcepts = true;
+    }
+    
+    private void getInitialConcepts() {
+        needInitialConcepts = false;
+
+        try {
+            for (final Concept c : memory) {
+                for (final Task ts : c.beliefs) {                
+                    add(ts.sentence, c);
+                }
+            }        
+        }
+        catch (NoSuchElementException e) { }
+    }
+    
+    protected final void ensureTermConnected(final Term t) {
+        if (inDegreeOf(t)+outDegreeOf(t) == 0)  removeVertex(t);        
+    }
+    
+        
+    abstract public boolean allow(Sentence s);
+    
+    abstract public boolean allow(CompoundTerm st);    
+    
+    public boolean remove(final E s) {
+        if (!containsEdge(s))
+            return false;
+        
+        Term from = getEdgeSource(s);
+        Term to = getEdgeTarget(s);
+        
+        
+        boolean r = removeEdge(s);
+        
+        
+        ensureTermConnected(from);
+        ensureTermConnected(to);
+
+        if (r)
+            event.emit(GraphChange.class, null, s);
+        return true;
+    }
+    
+   
+    protected void addComponents(final Sentence parentSentence, final E edge) {
+        List<E> componentList = components.get(parentSentence);
+        if (componentList == null) {
+            componentList = new ArrayList(1);
+            components.put(parentSentence, componentList);
+        }
+        componentList.add(edge);        
+    }
+    
+    public boolean add(final Sentence s, final Item c) {         
+
+        if (!allow(s))
+            return false;               
+        
+        if (s.term instanceof CompoundTerm) {
+            CompoundTerm cs = (CompoundTerm)s.term;
+        
+            if (cs instanceof Statement) {
+                
+                
+                Statement st = (Statement)cs;
+                if (allow(st)) {                                                    
+                    
+                    if (add(s, st, c)) {
+                        event.emit(GraphChange.class, st, null);
+                        return true;
+                    }
+                }
+            }
+                
+        }        
+        
+        return false;
+    }    
+    
+    /** default behavior, may override in subclass */
+    abstract public boolean add(final Sentence s, final CompoundTerm ct, final Item c);
+
+    
+}
diff --git a/nars_gui/nars/gui/input/KeyboardInputPanel.java b/nars_gui/nars/gui/input/KeyboardInputPanel.java
index 4e22a0a0ce9f3e42f2e1283522fdd8ed473d070f..6a6a68de992abf73e84732b008dfdd5ef4279e03 100644
--- a/nars_gui/nars/gui/input/KeyboardInputPanel.java
+++ b/nars_gui/nars/gui/input/KeyboardInputPanel.java
@@ -14,8 +14,8 @@ import static java.awt.event.KeyEvent.CHAR_UNDEFINED;
 import java.awt.event.KeyListener;
 import javax.swing.JTextArea;
 import nars.main.NAR;
-import nars.util.Texts;
-import static nars.util.Texts.n2;
+import nars.io.Texts;
+import static nars.io.Texts.n2;
 
 /**
  * Direct keyboard input
diff --git a/nars_gui/nars/gui/input/TextInputPanel.java b/nars_gui/nars/gui/input/TextInputPanel.java
index 30d84ad1dc8b598fdacca339a2259180a965be8e..82a6b74eac9838f9d0380655fa8be7db300c80b6 100644
--- a/nars_gui/nars/gui/input/TextInputPanel.java
+++ b/nars_gui/nars/gui/input/TextInputPanel.java
@@ -53,7 +53,7 @@ import nars.gui.FileTreeModel;
 import nars.gui.input.TextInputPanel.InputAction;
 import nars.gui.input.TextInputPanel.TextInputMode;
 import static nars.gui.output.SwingLogPanel.setConsoleFont;
-import nars.io.handlers.OutputHandler.OUT;
+import nars.io.events.OutputHandler.OUT;
 
 
 public class TextInputPanel extends NPanel /*implements ActionListener*/ {
diff --git a/nars_gui/nars/gui/output/ConceptsPanel.java b/nars_gui/nars/gui/output/ConceptsPanel.java
index 5d86808d669fc47fb41a4501919ff8ed590996a5..e8113fdb8bcf690d0bf6deb7a54a4695afe2ab37 100644
--- a/nars_gui/nars/gui/output/ConceptsPanel.java
+++ b/nars_gui/nars/gui/output/ConceptsPanel.java
@@ -28,9 +28,9 @@ import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JTextArea;
 import javax.swing.JTextField;
-import nars.util.EventEmitter.EventObserver;
-import nars.util.Events;
-import nars.util.Events.CyclesEnd;
+import nars.io.events.EventEmitter.EventObserver;
+import nars.io.events.Events;
+import nars.io.events.Events.CyclesEnd;
 import nars.main.NAR;
 import nars.entity.Concept;
 import nars.entity.Sentence;
diff --git a/nars_gui/nars/gui/output/LogPanel.java b/nars_gui/nars/gui/output/LogPanel.java
index 66755f704eb84452ed6d81693f3879cbc7a7746a..d4fb51f7500141bdb1c5bac43efbc4f6f46713ed 100644
--- a/nars_gui/nars/gui/output/LogPanel.java
+++ b/nars_gui/nars/gui/output/LogPanel.java
@@ -32,11 +32,11 @@ import nars.gui.InferenceLogger;
 import nars.gui.InferenceLogger.LogOutput;
 import nars.gui.NARControls;
 import nars.gui.WrapLayout;
-import nars.io.handlers.EventHandler;
-import nars.io.handlers.OutputHandler;
-import nars.io.handlers.OutputHandler.ERR;
-import nars.io.handlers.OutputHandler.EXE;
-import nars.io.handlers.TextOutputHandler;
+import nars.io.events.EventHandler;
+import nars.io.events.OutputHandler;
+import nars.io.events.OutputHandler.ERR;
+import nars.io.events.OutputHandler.EXE;
+import nars.io.events.TextOutputHandler;
 
 abstract public class LogPanel extends NPanel implements LogOutput {
 
diff --git a/nars_gui/nars/gui/output/PluginPanel.java b/nars_gui/nars/gui/output/PluginPanel.java
index 0ed66f9cbf01e7aacde8c959ff64d40e0efd6ca8..663698fe741e93a45a2aa0a311f75476f5395842 100644
--- a/nars_gui/nars/gui/output/PluginPanel.java
+++ b/nars_gui/nars/gui/output/PluginPanel.java
@@ -24,11 +24,11 @@ import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.SwingUtilities;
 import javax.swing.border.BevelBorder;
-import nars.util.EventEmitter.EventObserver;
-import nars.util.Events;
+import nars.io.events.EventEmitter.EventObserver;
+import nars.io.events.Events;
 import nars.main.NAR;
 import nars.main.NAR.PluginState;
-import nars.util.Plugin;
+import nars.plugin.Plugin;
 import nars.gui.util.PackageUtility;
 
 /**
diff --git a/nars_gui/nars/gui/output/SwingLogPanel.java b/nars_gui/nars/gui/output/SwingLogPanel.java
index ad744b99783b46adc24760993e78c8831147d6f1..0d1ce0a5f73c6158061a73270e6b285c9465521e 100644
--- a/nars_gui/nars/gui/output/SwingLogPanel.java
+++ b/nars_gui/nars/gui/output/SwingLogPanel.java
@@ -17,7 +17,7 @@ import javax.swing.text.DefaultEditorKit;
 import javax.swing.text.JTextComponent;
 import nars.gui.NARControls;
 import nars.gui.output.SwingLogText.LogLine;
-import nars.io.handlers.TextOutputHandler;
+import nars.io.events.TextOutputHandler;
 
 public class SwingLogPanel extends LogPanel {
 
diff --git a/nars_gui/nars/gui/output/SwingLogText.java b/nars_gui/nars/gui/output/SwingLogText.java
index aaa97c3d1907b56cdf87d6e4566d9d949163ea8d..a8398399fc088301bba9971671b55b2538bcf1d8 100644
--- a/nars_gui/nars/gui/output/SwingLogText.java
+++ b/nars_gui/nars/gui/output/SwingLogText.java
@@ -15,7 +15,7 @@ import nars.entity.Task;
 import nars.entity.TruthValue;
 import nars.inference.TruthFunctions;
 import nars.inference.UtilityFunctions;
-import nars.io.handlers.OutputHandler.OUT;
+import nars.io.events.OutputHandler.OUT;
 
 
 public class SwingLogText extends SwingText  {
diff --git a/nars_gui/nars/gui/output/TablePanel.java b/nars_gui/nars/gui/output/TablePanel.java
index 2d14db0272d138cd3eeacc3184246eab5eaa4862..a21621ceab56654ee3212b4fe0331e9f5b848c2f 100644
--- a/nars_gui/nars/gui/output/TablePanel.java
+++ b/nars_gui/nars/gui/output/TablePanel.java
@@ -9,7 +9,7 @@ import javax.swing.JScrollPane;
 import javax.swing.JTable;
 import javax.swing.table.DefaultTableModel;
 import nars.main.NAR;
-import nars.io.handlers.OutputHandler;
+import nars.io.events.OutputHandler;
 
 
 public abstract class TablePanel extends NPanel  {
diff --git a/nars_gui/nars/gui/output/TaskTree.java b/nars_gui/nars/gui/output/TaskTree.java
index ac408bee9b6d07e1df47b52642325d522aeeb301..8d105ede5b009dc25dd48cc84e298cdaf1813fa0 100644
--- a/nars_gui/nars/gui/output/TaskTree.java
+++ b/nars_gui/nars/gui/output/TaskTree.java
@@ -27,10 +27,10 @@ import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.tree.DefaultTreeCellRenderer;
 import javax.swing.tree.DefaultTreeModel;
 import javax.swing.tree.TreeNode;
-import nars.util.EventEmitter.EventObserver;
-import nars.util.Events.CyclesEnd;
-import nars.util.Events.TaskAdd;
-import nars.util.Events.TaskRemove;
+import nars.io.events.EventEmitter.EventObserver;
+import nars.io.events.Events.CyclesEnd;
+import nars.io.events.Events.TaskAdd;
+import nars.io.events.Events.TaskRemove;
 import nars.main.NAR;
 import nars.entity.Concept;
 import nars.entity.Task;
diff --git a/nars_gui/nars/gui/output/graph/NARGraphVis.java b/nars_gui/nars/gui/output/graph/NARGraphVis.java
index 7743c86e1ec6be877828734d6fb42e9b9cf9a9a9..a3c93bea03ef6d6512005b297699a07b1089f515 100644
--- a/nars_gui/nars/gui/output/graph/NARGraphVis.java
+++ b/nars_gui/nars/gui/output/graph/NARGraphVis.java
@@ -24,9 +24,9 @@ import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
 import javax.swing.JPanel;
 import javax.swing.JTextField;
-import nars.util.EventEmitter.EventObserver;
-import nars.util.Events.CyclesEnd;
-import nars.util.Events.ResetEnd;
+import nars.io.events.EventEmitter.EventObserver;
+import nars.io.events.Events.CyclesEnd;
+import nars.io.events.Events.ResetEnd;
 import nars.main.NAR;
 import nars.gui.output.graph.layout.CircleLayout;
 import nars.gui.util.DefaultGraphizer;
diff --git a/nars_gui/nars/gui/util/MemoryObserver.java b/nars_gui/nars/gui/util/MemoryObserver.java
index 9e687decf588ed829e73ba03879bff60520130e1..f86f5b9cdcea4b1b1c04bfc56a4feed233567d04 100644
--- a/nars_gui/nars/gui/util/MemoryObserver.java
+++ b/nars_gui/nars/gui/util/MemoryObserver.java
@@ -1,14 +1,14 @@
 package nars.gui.util;
 
-import nars.io.handlers.EventHandler;
-import nars.util.Events;
-import nars.util.Events.CycleEnd;
-import nars.util.Events.CycleStart;
+import nars.io.events.EventHandler;
+import nars.io.events.Events;
+import nars.io.events.Events.CycleEnd;
+import nars.io.events.Events.CycleStart;
 import nars.storage.Memory;
 import nars.main.NAR;
 import nars.entity.Concept;
 import nars.entity.Task;
-import nars.io.handlers.OutputHandler;
+import nars.io.events.OutputHandler;
 
 public abstract class MemoryObserver extends EventHandler {
 
diff --git a/nars_lab/nars/lab/grid2d/main/TestChamber.java b/nars_lab/nars/lab/grid2d/main/TestChamber.java
index 0fba94d10c3c2fa21c1c29d5ea46cfa6d600fe4f..c6d9a384ea87abd0566853c91f77e99a6a57b13f 100644
--- a/nars_lab/nars/lab/grid2d/main/TestChamber.java
+++ b/nars_lab/nars/lab/grid2d/main/TestChamber.java
@@ -1,8 +1,8 @@
 package nars.lab.grid2d.main;
 
 import java.util.List;
-import nars.util.EventEmitter.EventObserver;
-import nars.util.Events;
+import nars.io.events.EventEmitter.EventObserver;
+import nars.io.events.Events;
 import nars.main.NAR;
 import nars.main.Parameters;
 import nars.lab.grid2d.main.Cell.Logic;
diff --git a/nars_lab/nars/lab/language/LanguageGUI.java b/nars_lab/nars/lab/language/LanguageGUI.java
index 931f796550ddd2d49e259a13f10efb0f09761a58..280a25bb88da5a345da1f2d3769c7b0a854e8b70 100644
--- a/nars_lab/nars/lab/language/LanguageGUI.java
+++ b/nars_lab/nars/lab/language/LanguageGUI.java
@@ -18,7 +18,7 @@ import java.util.logging.Logger;
 import nars.main.NAR;
 import nars.entity.Sentence;
 import nars.gui.NARSwing;
-import nars.io.handlers.AnswerHandler;
+import nars.io.events.AnswerHandler;
 
 /**
  *
diff --git a/nars_lab/nars/lab/launcher/NARGame.java b/nars_lab/nars/lab/launcher/NARGame.java
index 097933f5b5b91ca6fbfd00adc7e94115fd6ace69..792bae2d252a1f2eb8e907c8e7e8cbd60963f302 100644
--- a/nars_lab/nars/lab/launcher/NARGame.java
+++ b/nars_lab/nars/lab/launcher/NARGame.java
@@ -1,7 +1,7 @@
 package nars.lab.launcher;
 
-import nars.util.EventEmitter.EventObserver;
-import nars.util.Events;
+import nars.io.events.EventEmitter.EventObserver;
+import nars.io.events.Events;
 import nars.storage.Memory;
 import nars.main.NAR;
 import nars.gui.NARSwing;
diff --git a/nars_lab/nars/lab/microworld/SupervisedRecognition.java b/nars_lab/nars/lab/microworld/SupervisedRecognition.java
index 2ed76a77042846fa22408343b1aa7aaaf8da87ab..a8f66dbb70584dd89a869faa0e4b851860a791c2 100644
--- a/nars_lab/nars/lab/microworld/SupervisedRecognition.java
+++ b/nars_lab/nars/lab/microworld/SupervisedRecognition.java
@@ -9,7 +9,7 @@ import nars.main.NAR;
 import nars.entity.Sentence;
 import nars.entity.Task;
 import nars.gui.NARSwing;
-import nars.io.handlers.AnswerHandler;
+import nars.io.events.AnswerHandler;
 import nars.io.Narsese;
 
 /**
diff --git a/nars_lab/nars/lab/plugin/app/farg/FluidAnalogiesAgents.java b/nars_lab/nars/lab/plugin/app/farg/FluidAnalogiesAgents.java
index db8666460e99b08b7617785b1656b4ccf97e976f..a14838ef58b4da6d5c52f7834b787c0498a367ae 100644
--- a/nars_lab/nars/lab/plugin/app/farg/FluidAnalogiesAgents.java
+++ b/nars_lab/nars/lab/plugin/app/farg/FluidAnalogiesAgents.java
@@ -6,7 +6,7 @@
 package nars.lab.plugin.app.farg;
 
 import nars.main.NAR;
-import nars.util.Plugin;
+import nars.plugin.Plugin;
 import nars.language.Term;
 import nars.storage.LevelBag;
 
diff --git a/nars_lab/nars/lab/plugin/app/farg/Workspace.java b/nars_lab/nars/lab/plugin/app/farg/Workspace.java
index 2b9e39daac7d58bdbed204688a1a3fe04927353d..dc6e48f149c00232b89470312c8bf9f326b68eee 100644
--- a/nars_lab/nars/lab/plugin/app/farg/Workspace.java
+++ b/nars_lab/nars/lab/plugin/app/farg/Workspace.java
@@ -5,8 +5,8 @@
 
 package nars.lab.plugin.app.farg;
 
-import nars.util.EventEmitter.EventObserver;
-import nars.util.Events.CycleEnd;
+import nars.io.events.EventEmitter.EventObserver;
+import nars.io.events.Events.CycleEnd;
 import nars.main.NAR;
 import nars.entity.Concept;
 import nars.storage.LevelBag;
diff --git a/nars_lab/nars/lab/plugin/input/PerceptionAccel.java b/nars_lab/nars/lab/plugin/input/PerceptionAccel.java
index 980618f8a40e56cb3530e4bb3813ec9d6563baff..3d1b0c330888bec741b9fc2ed3c0889e6629d7dc 100644
--- a/nars_lab/nars/lab/plugin/input/PerceptionAccel.java
+++ b/nars_lab/nars/lab/plugin/input/PerceptionAccel.java
@@ -5,11 +5,11 @@
 package nars.lab.plugin.input;
 
 import java.util.ArrayList;
-import nars.util.EventEmitter;
-import nars.util.Events;
+import nars.io.events.EventEmitter;
+import nars.io.events.Events;
 import nars.main.NAR;
 import nars.main.Parameters;
-import nars.util.Plugin;
+import nars.plugin.Plugin;
 import nars.control.DerivationContext;
 import nars.entity.BudgetValue;
 import nars.entity.Concept;
diff --git a/nars_lab/nars/lab/plugin/mental/GlobalAnticipation.java b/nars_lab/nars/lab/plugin/mental/GlobalAnticipation.java
index 577dfc76a6b49a8d948b73bc8702de35cc33b99f..ab1cc7ceaecce6916b67156d856eec7e4e9b7aca 100644
--- a/nars_lab/nars/lab/plugin/mental/GlobalAnticipation.java
+++ b/nars_lab/nars/lab/plugin/mental/GlobalAnticipation.java
@@ -8,12 +8,12 @@ package nars.lab.plugin.mental;
 import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.List;
-import nars.util.EventEmitter;
-import nars.util.Events;
+import nars.io.events.EventEmitter;
+import nars.io.events.Events;
 import nars.main.NAR;
 import nars.main.NAR.PluginState;
 import nars.main.Parameters;
-import nars.util.Plugin;
+import nars.plugin.Plugin;
 import nars.control.DerivationContext;
 import nars.entity.BudgetValue;
 import nars.entity.Concept;
diff --git a/nars_lab/nars/lab/predict/Predict_NARS_Core.java b/nars_lab/nars/lab/predict/Predict_NARS_Core.java
index ceb359c97e59b3336f10f1a6def39b9ee2081dcb..8a3a9259694cfd8f203239b740cfd9f3c5d20b5e 100644
--- a/nars_lab/nars/lab/predict/Predict_NARS_Core.java
+++ b/nars_lab/nars/lab/predict/Predict_NARS_Core.java
@@ -16,7 +16,7 @@ import java.util.Random;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import javax.swing.ImageIcon;
-import nars.util.Events.TaskImmediateProcess;
+import nars.io.events.Events.TaskImmediateProcess;
 import nars.main.NAR;
 import nars.main.Parameters;
 import nars.control.DerivationContext;
@@ -24,7 +24,7 @@ import nars.entity.Sentence;
 import nars.entity.Task;
 import nars.gui.NARSwing;
 import nars.inference.TruthFunctions;
-import nars.io.handlers.AnswerHandler;
+import nars.io.events.AnswerHandler;
 import nars.lab.ioutils.ChangedTextInput;
 import nars.io.Narsese;
 import nars.language.Term;
diff --git a/nars_lab/nars/lab/testutils/OutputCondition.java b/nars_lab/nars/lab/testutils/OutputCondition.java
index 97d860b62d294c15a2e3781ad72fff5a074e6c00..586867d5f9de2fedb61d671010d02a3eb136bc74 100644
--- a/nars_lab/nars/lab/testutils/OutputCondition.java
+++ b/nars_lab/nars/lab/testutils/OutputCondition.java
@@ -8,7 +8,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import nars.main.NAR;
-import nars.io.handlers.OutputHandler;
+import nars.io.events.OutputHandler;
 
 /**
  * Monitors an output stream for certain conditions. Used in testing and
diff --git a/nars_lab/nars/lab/testutils/OutputContainsCondition.java b/nars_lab/nars/lab/testutils/OutputContainsCondition.java
index 331d2cbeaefebf6c56ceffff421ca0210ba93212..d30477a4cf46a39528d39d6e8bc439b6b052acf7 100644
--- a/nars_lab/nars/lab/testutils/OutputContainsCondition.java
+++ b/nars_lab/nars/lab/testutils/OutputContainsCondition.java
@@ -11,7 +11,7 @@ import java.util.TreeSet;
 import nars.main.NAR;
 import nars.entity.Sentence;
 import nars.entity.Task;
-import nars.io.handlers.TextOutputHandler;
+import nars.io.events.TextOutputHandler;
 import nars.operator.Operator.ExecutionResult;
 
 /**
diff --git a/nars_lab/nars/lab/testutils/TuneTuffy.java b/nars_lab/nars/lab/testutils/TuneTuffy.java
index 35c76c52821bc248e2af7f68ce1044ab84389dd4..542cb99fc72ed8f228ad9ad79a120f9522a8790c 100644
--- a/nars_lab/nars/lab/testutils/TuneTuffy.java
+++ b/nars_lab/nars/lab/testutils/TuneTuffy.java
@@ -6,12 +6,12 @@ package nars.lab.testutils;
 
 import java.io.File;
 import java.io.FileNotFoundException;
-import nars.util.Events.Answer;
+import nars.io.events.Events.Answer;
 import nars.main.NAR;
 import nars.entity.Sentence;
 import nars.entity.Task;
-import nars.io.handlers.EventHandler;
-import nars.io.handlers.OutputHandler.OUT;
+import nars.io.events.EventHandler;
+import nars.io.events.OutputHandler.OUT;
 import nars.io.Narsese;
 import nars.language.Term;
 
diff --git a/nars_lab/nars/lab/tictactoe/GridButtonPanel.java b/nars_lab/nars/lab/tictactoe/GridButtonPanel.java
index 6daf7e962d52bc4723244c65a1a34cbf132054b0..994f92ce397c26a83279241e9dc4166543393cb6 100644
--- a/nars_lab/nars/lab/tictactoe/GridButtonPanel.java
+++ b/nars_lab/nars/lab/tictactoe/GridButtonPanel.java
@@ -15,8 +15,8 @@ import java.awt.event.MouseWheelListener;
 import java.lang.reflect.Array;
 import javax.swing.JButton;
 import javax.swing.SwingUtilities;
-import nars.util.EventEmitter.EventObserver;
-import nars.util.Events.CyclesEnd;
+import nars.io.events.EventEmitter.EventObserver;
+import nars.io.events.Events.CyclesEnd;
 import nars.main.NAR;
 import nars.entity.Concept;
 
diff --git a/nars_lab/nars/lab/tictactoe/TicTacToe.java b/nars_lab/nars/lab/tictactoe/TicTacToe.java
index bac779e3d3a51232a6acf0c19bee9870c4699ed3..3f41324bc47d4e75459461fc0e754a0bfa476c15 100644
--- a/nars_lab/nars/lab/tictactoe/TicTacToe.java
+++ b/nars_lab/nars/lab/tictactoe/TicTacToe.java
@@ -37,18 +37,18 @@ import java.util.Set;
 import javax.swing.JButton;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
-import nars.util.EventEmitter.EventObserver;
+import nars.io.events.EventEmitter.EventObserver;
 import nars.storage.Memory;
 import nars.main.NAR;
 import nars.entity.BudgetValue;
 import nars.entity.Concept;
 import nars.entity.Task;
 import nars.gui.NARSwing;
-import nars.io.handlers.OutputHandler.OUT;
+import nars.io.events.OutputHandler.OUT;
 import nars.language.Term;
 import nars.operator.Operation;
 import nars.operator.Operator;
-import nars.util.Events.CyclesEnd;
+import nars.io.events.Events.CyclesEnd;
 
 /**
  *
diff --git a/nars_lab/nars/lab/vision/SymRecognizer.java b/nars_lab/nars/lab/vision/SymRecognizer.java
index 7408c9debf755cb071934cb0ebd50b09aa513fae..4693dc4e9cc74f322330d00c7de7a623cf080700 100644
--- a/nars_lab/nars/lab/vision/SymRecognizer.java
+++ b/nars_lab/nars/lab/vision/SymRecognizer.java
@@ -20,7 +20,7 @@ import javax.swing.*;
 import nars.main.NAR;
 import nars.main.Parameters;
 import nars.entity.Sentence;
-import nars.io.handlers.AnswerHandler;
+import nars.io.events.AnswerHandler;
 import nars.io.Narsese;
 
 
diff --git a/nars_lab/nars/lab/vision/SymRecognizerWithVisionChannel.java b/nars_lab/nars/lab/vision/SymRecognizerWithVisionChannel.java
index 78f4f07c870497d4b3af05b58ecd1a7d12d5ae0e..d984b92fc0294d0ace8534b42761448558f04d71 100644
--- a/nars_lab/nars/lab/vision/SymRecognizerWithVisionChannel.java
+++ b/nars_lab/nars/lab/vision/SymRecognizerWithVisionChannel.java
@@ -18,7 +18,7 @@ import javax.swing.*;
 import nars.main.NAR;
 import nars.main.Parameters;
 import nars.entity.Sentence;
-import nars.io.handlers.AnswerHandler;
+import nars.io.events.AnswerHandler;
 import nars.io.Narsese;
 
 
diff --git a/nars_test/nars/core/NALTest.java b/nars_test/nars/core/NALTest.java
index 210e59e412534e113b0a8fac30596b8b045e054e..5f305d0b8bf6451a18db37db74a19bb5ce6b7c6d 100644
--- a/nars_test/nars/core/NALTest.java
+++ b/nars_test/nars/core/NALTest.java
@@ -12,7 +12,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import nars.gui.InferenceLogger;
-import nars.io.handlers.TextOutputHandler;
+import nars.io.events.TextOutputHandler;
 import static org.junit.Assert.assertTrue;
 import org.junit.Test;
 import org.junit.experimental.ParallelComputer;
diff --git a/nars_test/nars/core/TermTest.java b/nars_test/nars/core/TermTest.java
index c66c06333feb14b2e094434b388419a109cbc33a..36f393ae1dd7761a67654b06e463d3d832bb373d 100644
--- a/nars_test/nars/core/TermTest.java
+++ b/nars_test/nars/core/TermTest.java
@@ -21,7 +21,7 @@ import nars.main.Parameters;
 import java.util.TreeSet;
 import nars.entity.Concept;
 import nars.io.Symbols.NativeOperator;
-import nars.util.Texts;
+import nars.io.Texts;
 import nars.io.Narsese;
 import nars.language.CompoundTerm;
 import nars.language.Inheritance;
diff --git a/nars_test/nars/core/TestMultistepEdited.java b/nars_test/nars/core/TestMultistepEdited.java
index ddb5465b150170e695bbf939353768cc652f545c..01425f16a4a173b8143919709e9ad7575f9cfca0 100644
--- a/nars_test/nars/core/TestMultistepEdited.java
+++ b/nars_test/nars/core/TestMultistepEdited.java
@@ -1,7 +1,7 @@
 package nars.core;
 
 import nars.main.NAR;
-import nars.io.handlers.TextOutputHandler;
+import nars.io.events.TextOutputHandler;
 import org.junit.Test;
 
 /**
diff --git a/nars_test/nars/core/VariableTest.java b/nars_test/nars/core/VariableTest.java
index 68fd5bc8f3ebcc11c921840fde47f1550a5df0a7..3bc785b294005cc555ab5778465fa48b3f534c60 100644
--- a/nars_test/nars/core/VariableTest.java
+++ b/nars_test/nars/core/VariableTest.java
@@ -5,9 +5,9 @@
 package nars.core;
 
 import java.util.concurrent.atomic.AtomicBoolean;
-import nars.util.Events.Answer;
+import nars.io.events.Events.Answer;
 import nars.main.NAR;
-import nars.io.handlers.EventHandler;
+import nars.io.events.EventHandler;
 import nars.lab.testutils.OutputContainsCondition;
 import static org.junit.Assert.assertTrue;
 import org.junit.Before;
diff --git a/nars_test/nars/perf/BagFairness.java b/nars_test/nars/perf/BagFairness.java
index da48d48dfc82e747550576e0a135b640819d62e8..f6dfea10355b1f11293960a240e648a8de196d58 100644
--- a/nars_test/nars/perf/BagFairness.java
+++ b/nars_test/nars/perf/BagFairness.java
@@ -3,13 +3,13 @@ package nars.perf;
 import automenta.vivisect.TreeMLData;
 import java.awt.Color;
 import java.util.ArrayList;
-import nars.util.EventEmitter.EventObserver;
-import nars.util.Events;
+import nars.io.events.EventEmitter.EventObserver;
+import nars.io.events.Events;
 import nars.main.NAR;
 import nars.main.Parameters;
 import automenta.vivisect.swing.NWindow;
 import automenta.vivisect.timeline.LineChart;
-import nars.util.Texts;
+import nars.io.Texts;
 import nars.storage.Bag;
 import automenta.vivisect.timeline.Chart;
 import automenta.vivisect.timeline.MultiTimeline;
diff --git a/nars_test/nars/util/TextsTest.java b/nars_test/nars/util/TextsTest.java
index 0cf2016ae4a80fe98f1c4157bf47032c7e1350cf..f9d8fe7c0d4ff48961d9ed8359b176a216c838c1 100644
--- a/nars_test/nars/util/TextsTest.java
+++ b/nars_test/nars/util/TextsTest.java
@@ -1,5 +1,6 @@
 package nars.util;
 
+import nars.io.Texts;
 import static org.junit.Assert.assertEquals;
 import org.junit.Test;
 
diff --git a/nars_web/src/nars/web/NARConnection.java b/nars_web/src/nars/web/NARConnection.java
index db8dba74fb39262b1b82456fbb75ea49e20622c9..1e7f5e861dae2d46b5de8eb870d7e5a90a35bf47 100644
--- a/nars_web/src/nars/web/NARConnection.java
+++ b/nars_web/src/nars/web/NARConnection.java
@@ -7,8 +7,8 @@
 package nars.web;
 
 import nars.main.NAR;
-import nars.io.handlers.TextOutputHandler;
-import nars.io.handlers.TextOutputHandler.LineOutput;
+import nars.io.events.TextOutputHandler;
+import nars.io.events.TextOutputHandler.LineOutput;
 
 /**
  * An instance of a web socket session to a NAR