diff --git a/nars_core/nars/main/Plugins.java b/nars_core/nars/main/Plugins.java
index db9e24ee180ec2cd267483d6fa632116a7a74e0f..6a03ce4944e6244c6088789164f1dd082ca34bf8 100644
--- a/nars_core/nars/main/Plugins.java
+++ b/nars_core/nars/main/Plugins.java
@@ -8,6 +8,10 @@ import nars.plugin.misc.RuntimeNARSettings;
 import nars.plugin.mental.Emotions;
 import nars.plugin.mental.Counting;
 import nars.plugin.mental.Abbreviation;
+import nars.plugin.mental.ComplexEmotions;
+import nars.language.SetInt;
+import nars.language.Term;
+import nars.plugin.perception.VisionChannel;
 
 /**
  * Default set of NAR parameters which have been classically used for development.
@@ -17,8 +21,11 @@ public class Plugins {
     public NAR init(NAR n) {         
         n.addPlugin(new RuntimeNARSettings());
         n.addPlugin(new Emotions());
-        n.addPlugin(new Anticipate());      // expect an event  
-        
+        n.addPlugin(new Anticipate());      // expect an event 
+        n.addPlugin(new ComplexEmotions());
+        Term label = SetInt.make(new Term("bright"));
+        n.addSensoryChannel(label.toString(),
+                            new VisionChannel(label, n, n, 1, 1));
         boolean full_internal_experience = false;
         if(!full_internal_experience) {
             n.addPlugin(new InternalExperience());
diff --git a/nars_core/nars/plugin/perception/VisionChannel.java b/nars_core/nars/plugin/perception/VisionChannel.java
new file mode 100644
index 0000000000000000000000000000000000000000..95d3e9f0485735999c7baa1c0e2b027860081978
--- /dev/null
+++ b/nars_core/nars/plugin/perception/VisionChannel.java
@@ -0,0 +1,71 @@
+package nars.plugin.perception;
+
+import nars.entity.BudgetValue;
+import nars.entity.Sentence;
+import nars.entity.Stamp;
+import nars.main.NAR;
+import nars.entity.Task;
+import nars.entity.TruthValue;
+import nars.inference.BudgetFunctions;
+import nars.io.Symbols;
+import nars.language.Inheritance;
+import nars.language.Term;
+import nars.main.Parameters;
+
+public class VisionChannel extends SensoryChannel {
+    double[][] inputs;
+    boolean[][] updated;
+    int cnt_updated = 0;
+    int height = 0;
+    int width = 0;
+    Term label;
+    NAR nar;
+    public VisionChannel(Term label, NAR nar, SensoryChannel reportResultsTo, int width, int height) {
+        super(nar,reportResultsTo);
+        this.nar = nar;
+        this.height = height;
+        this.width = width;
+        this.label = label;
+        inputs = new double[height][width];
+        updated = new boolean[height][width];
+    }
+    
+    public boolean AddToMatrix(Task t) {
+        int x = t.getTerm().term_indices[2];
+        int y = t.getTerm().term_indices[3];
+        inputs[y][x] = t.sentence.getTruth().getFrequency();
+        if(!updated[y][x]) {
+            cnt_updated++;
+            updated[y][x] = true;
+        }
+        if(cnt_updated == height*width) {
+            cnt_updated = 0;
+            updated = new boolean[height][width];
+            return true;
+        }
+        return false;
+    }
+    
+    @Override
+    public NAR addInput(Task t) {
+        if(AddToMatrix(t)) //new data complete
+            step_start();
+        return nar;
+    }
+    
+    @Override
+    public void step_start()
+    {
+        Sentence s = new Sentence(Inheritance.make(new Term("A"), this.label), 
+                                                   Symbols.JUDGMENT_MARK, 
+                                                   new TruthValue(1.0f,
+                                                   Parameters.DEFAULT_JUDGMENT_CONFIDENCE), 
+                                                   new Stamp(nar.memory));
+        Task T = new Task(s, new BudgetValue(Parameters.DEFAULT_JUDGMENT_PRIORITY,
+                                             Parameters.DEFAULT_JUDGMENT_DURABILITY,
+                                             BudgetFunctions.truthToQuality(s.truth)), true);
+        this.results.add(T);//feeds results into "upper" sensory channels:
+        this.step_finished(); 
+    }
+    
+}