diff --git a/src/main/java/org/opennars/lab/launcher/Launcher.java b/src/main/java/org/opennars/lab/launcher/Launcher.java
index f48141a4ca3d141f9df01295a26b34575701e44b..9d72c53178e31083643b08028b46ebb28b8c1aff 100755
--- a/src/main/java/org/opennars/lab/launcher/Launcher.java
+++ b/src/main/java/org/opennars/lab/launcher/Launcher.java
@@ -21,10 +21,7 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.InvocationTargetException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.net.URLConnection;
+import java.net.*;
 import java.text.ParseException;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -438,8 +435,12 @@ public class Launcher extends javax.swing.JFrame {
      *
      * @param evt
      */
-    private void jLabel9MouseClicked(java.awt.event.MouseEvent evt) {                                     
-        org.opennars.lab.microworld.Pong.main(null);
+    private void jLabel9MouseClicked(java.awt.event.MouseEvent evt) {
+        try {
+            org.opennars.lab.microworld.Pong.main(null);
+        } catch (UnknownHostException e) {
+            e.printStackTrace();
+        }
         this.dispose();
     }                                    
 
@@ -466,8 +467,12 @@ public class Launcher extends javax.swing.JFrame {
      *
      * @param evt
      */
-    private void jLabel11MouseClicked(java.awt.event.MouseEvent evt) {                                      
-        org.opennars.lab.microworld.SimNAR.main(null);
+    private void jLabel11MouseClicked(java.awt.event.MouseEvent evt) {
+        try {
+            org.opennars.lab.microworld.SimNAR.main(null);
+        } catch (UnknownHostException e) {
+            e.printStackTrace();
+        }
         this.dispose();
     }                                     
 
diff --git a/src/main/java/org/opennars/lab/metric/MetricReporter.java b/src/main/java/org/opennars/lab/metric/MetricReporter.java
new file mode 100644
index 0000000000000000000000000000000000000000..636b7aa6a1f81580718242879ef5fc1487860f5e
--- /dev/null
+++ b/src/main/java/org/opennars/lab/metric/MetricReporter.java
@@ -0,0 +1,50 @@
+package org.opennars.lab.metric;
+
+import org.opennars.main.Nar;
+
+import java.io.IOException;
+import java.net.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+public class MetricReporter {
+    public List<MetricSensor> sensors = new ArrayList<>();
+
+    public String narsVersion = Nar.VERSION;
+    public long runId = new Random().nextInt();
+
+    public void connect(String targetHost, int targetPort) throws UnknownHostException {
+        receiverTarget = InetAddress.getByName(targetHost);
+        receiverTargetPort = targetPort;
+    }
+
+    public void sendFromAllSensors() {
+        for(final MetricSensor iSensor : sensors) {
+            send(iSensor.getValueAsString(), iSensor.getName());
+        }
+    }
+
+    private void send(final String dataAsString, final String metricPathName) {
+        final String timestampAsString = "-1"; // -1 leads to automatic timestamping on arrival of the message
+
+        String metricPath = narsVersion + "_name=" + metricPathName + "_runId=" + runId;
+
+        String payload = metricPath +" "+ dataAsString +" "+ timestampAsString + "\n";
+
+        final byte[] serializedPayload = payload.getBytes();
+
+        final DatagramPacket packet = new DatagramPacket(serializedPayload, serializedPayload.length, receiverTarget, receiverTargetPort);
+        try {
+            DatagramSocket datagramSocket = new DatagramSocket();
+            datagramSocket.send(packet);
+        } catch (SocketException e) {
+            // unlikely to happen - ignored
+        } catch (IOException e) {
+            // unlikely to happen - ignored
+        }
+    }
+
+    private InetAddress receiverTarget;
+    private int receiverTargetPort;
+}
diff --git a/src/main/java/org/opennars/lab/metric/MetricSensor.java b/src/main/java/org/opennars/lab/metric/MetricSensor.java
new file mode 100644
index 0000000000000000000000000000000000000000..6e47af3c4e2be5e42de2ebd5d62441803e0d95b9
--- /dev/null
+++ b/src/main/java/org/opennars/lab/metric/MetricSensor.java
@@ -0,0 +1,7 @@
+package org.opennars.lab.metric;
+
+public interface MetricSensor {
+    String getName();
+
+    String getValueAsString();
+}
diff --git a/src/main/java/org/opennars/lab/microworld/Pong.java b/src/main/java/org/opennars/lab/microworld/Pong.java
index 95dee1adcb028e9a36a952060893e9a669248aac..d4f7fe113867aceb0732a372485f0c1d0b31c037 100755
--- a/src/main/java/org/opennars/lab/microworld/Pong.java
+++ b/src/main/java/org/opennars/lab/microworld/Pong.java
@@ -14,6 +14,8 @@
  */
 package org.opennars.lab.microworld;
 
+import org.opennars.lab.metric.MetricReporter;
+import org.opennars.lab.metric.MetricSensor;
 import org.opennars.storage.Memory;
 import org.opennars.main.Nar;
 //import org.opennars.nal.nal8.Operation;
@@ -26,6 +28,7 @@ import processing.event.MouseEvent;
 
 import java.awt.*;
 import java.io.File;
+import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.logging.Level;
@@ -46,7 +49,41 @@ import org.opennars.operator.Operator;
 public class Pong extends Frame {
     public boolean verbose = true;
 
-    public Pong() {
+    public int ballHits;
+    public int ballMisses;
+
+    public int t = 0;
+
+    public MetricReporter metricReporter;
+
+    public Pong() throws UnknownHostException {
+        metricReporter = new MetricReporter();
+        metricReporter.connect("127.0.0.1", 1212);
+
+        metricReporter.sensors.add(new MetricSensor() {
+            @Override
+            public String getName() {
+                return "ballHits";
+            }
+
+            @Override
+            public String getValueAsString() {
+                return "" + ballHits;
+            }
+        });
+
+        metricReporter.sensors.add(new MetricSensor() {
+            @Override
+            public String getName() {
+                return "ballMisses";
+            }
+
+            @Override
+            public String getValueAsString() {
+                return "" + ballMisses;
+            }
+        });
+
         String[] args = {"Pong"};
         MyPapplet mp = new MyPapplet ();
         mp.setSize(800,600);
@@ -200,6 +237,8 @@ public class Pong extends Frame {
                 if(Math.abs(agent.x - ball.x) < middle_distance) {
                     //touching the ball?
                     if(Math.abs(agent.x - ball.x) < middle_distance && ball.y < 120) { //same here
+                        ballHits++;
+
                         String s = "<{SELF} --> [good]>. :|:";
                         if(!s.equals(this.LastInput)) {
                             if (verbose) {
@@ -217,6 +256,8 @@ public class Pong extends Frame {
                         this.LastInput = s;
                     }
                 } else {
+                    ballMisses++;
+
                     if(agent.x < ball.x) {
                         String s = "<{right} --> [on]>. :|:";
                         if(!s.equals(this.LastInput)) {
@@ -241,9 +282,14 @@ public class Pong extends Frame {
                     System.out.println("bad mr_nars");
                     nar.addInput("(--,<{SELF} --> [good]>). :|:");
                 }*/
-                
+
+                t++;
                 nar.cycles(10);
 
+                if (t%100==0) {
+                    metricReporter.sendFromAllSensors();
+                }
+
                 if(lastAction==0 && random(1.0f) < Alpha) { //if Nar hasn't decided chose a executable random action
                     lastAction = (int) random((float) nActions);
                     if(obj.x == 0) {
@@ -1352,7 +1398,7 @@ public class Pong extends Frame {
 
     }
 
-    public static void main(String[] args) {
+    public static void main(String[] args) throws UnknownHostException {
         NARSwing.themeInvert();
         new Pong();
     }
diff --git a/src/main/java/org/opennars/lab/microworld/SimNAR.java b/src/main/java/org/opennars/lab/microworld/SimNAR.java
index bfb99c0847092de52843f98e5a1d0d9f3dec71a1..f59530ce769bee80813bfdd114e92fdfd2d51763 100755
--- a/src/main/java/org/opennars/lab/microworld/SimNAR.java
+++ b/src/main/java/org/opennars/lab/microworld/SimNAR.java
@@ -14,6 +14,8 @@
  */
 package org.opennars.lab.microworld;
 
+import org.opennars.lab.metric.MetricReporter;
+import org.opennars.lab.metric.MetricSensor;
 import org.opennars.storage.Memory;
 import org.opennars.main.Nar;
 //import org.opennars.nal.nal8.Operation;
@@ -25,6 +27,7 @@ import processing.core.PImage;
 import processing.event.MouseEvent;
 
 import java.awt.*;
+import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.logging.Level;
@@ -41,7 +44,36 @@ import org.opennars.operator.Operator;
 
 public class SimNAR extends Frame {
 
-    public SimNAR() {
+    public MetricReporter metricReporter;
+
+    public SimNAR() throws UnknownHostException {
+        metricReporter = new MetricReporter();
+        metricReporter.connect("127.0.0.1", 1212);
+
+        metricReporter.sensors.add(new MetricSensor() {
+            @Override
+            public String getName() {
+                return "ateGood";
+            }
+
+            @Override
+            public String getValueAsString() {
+                return "" + counterAteGood;
+            }
+        });
+
+        metricReporter.sensors.add(new MetricSensor() {
+            @Override
+            public String getName() {
+                return "ateBad";
+            }
+
+            @Override
+            public String getValueAsString() {
+                return "" + counterAteBad;
+            }
+        });
+
         String[] args = {"Microworld"};
         MyPapplet mp = new MyPapplet ();
         mp.setSize(800,600);
@@ -1405,7 +1437,7 @@ fill(138,138,128);
 
     }
 
-    public static void main(String[] args) {
+    public static void main(String[] args) throws UnknownHostException {
         NARSwing.themeInvert();
         new SimNAR();
     }