diff --git a/plugins/serial2002/serial2002.c b/plugins/serial2002/serial2002.c
index a4a01fd6e489f73aab188e84e0a00f5c897b258c..379da56e3f9f59a0a0b0683ed7925ceaaa69dcdb 100644
--- a/plugins/serial2002/serial2002.c
+++ b/plugins/serial2002/serial2002.c
@@ -51,7 +51,7 @@ struct moberg_device_context {
   } port;
   struct remap_analog {
     int count;
-    struct map {
+    struct analog_map {
       unsigned char index;
       unsigned long maxdata;
       double min;
@@ -61,7 +61,7 @@ struct moberg_device_context {
   } analog_in, analog_out;
   struct remap_digital {
     int count;
-    struct {
+    struct digital_map {
       unsigned char index;
     } map[32];
   } digital_in, digital_out,
@@ -109,7 +109,7 @@ static struct moberg_status analog_in_read(
   struct moberg_channel_context *channel = &analog_in->channel_context;
   struct moberg_device_context *device = channel->device;
   struct serial2002_data data = { 0, 0 };
-  struct map map = device->analog_in.map[channel->index];
+  struct analog_map map = device->analog_in.map[channel->index];
   struct moberg_status result = serial2002_poll_channel(
     device->port.fd, map.index);
   if (! OK(result)) {
@@ -129,11 +129,9 @@ static struct moberg_status analog_out_write(
   struct moberg_channel_analog_out *analog_out,
   double value)
 {
-  fprintf(stderr, "%s\n", __FUNCTION__);
-
   struct moberg_channel_context *channel = &analog_out->channel_context;
   struct moberg_device_context *device = channel->device;
-  struct map map = device->analog_out.map[channel->index];
+  struct analog_map map = device->analog_out.map[channel->index];
   long as_long = value - map.min / map.delta;
   if (as_long < 0) {
     value = 0;
@@ -148,7 +146,25 @@ static struct moberg_status digital_in_read(
   struct moberg_channel_digital_in *digital_in,
   int *value)
 {
-  fprintf(stderr, "%s\n", __FUNCTION__);
+  if (! value) { goto err_einval; }
+
+  struct moberg_channel_context *channel = &digital_in->channel_context;
+  struct moberg_device_context *device = channel->device;
+  struct serial2002_data data = { 0, 0 };
+  struct digital_map map = device->digital_in.map[channel->index];
+  struct moberg_status result = serial2002_poll_digital(
+    device->port.fd, map.index);
+  if (! OK(result)) {
+    goto return_result;
+  }
+  result = serial2002_read(device->port.fd, 1000, &data);
+  if (OK(result)) {
+    *value = data.value != 0;
+  }
+return_result:
+  return result;
+err_einval:
+  return MOBERG_ERRNO(EINVAL);
   *value = 1;
   return MOBERG_OK;
 }
@@ -157,13 +173,36 @@ static struct moberg_status digital_out_write(
   struct moberg_channel_digital_out *digital_out,
   int value)
 {
-  fprintf(stderr, "%s\n", __FUNCTION__);
-  return MOBERG_OK;
+  struct moberg_channel_context *channel = &digital_out->channel_context;
+  struct moberg_device_context *device = channel->device;
+  struct digital_map map = device->digital_out.map[channel->index];
+  struct serial2002_data data = { is_digital, map.index, value != 0 };
+  return serial2002_write(device->port.fd,  data);
 }
 
-static struct moberg_status encoder_in_read(struct moberg_channel_encoder_in *encoder_in,
-                           long *value)
+static struct moberg_status encoder_in_read(
+  struct moberg_channel_encoder_in *encoder_in,
+  long *value)
 {
+  if (! value) { goto err_einval; }
+  
+  struct moberg_channel_context *channel = &encoder_in->channel_context;
+  struct moberg_device_context *device = channel->device;
+  struct serial2002_data data = { 0, 0 };
+  struct digital_map map = device->encoder_in.map[channel->index];
+  struct moberg_status result = serial2002_poll_channel(
+    device->port.fd, map.index);
+  if (! OK(result)) {
+    goto return_result;
+  }
+  result = serial2002_read(device->port.fd, 1000, &data);
+  if (OK(result)) {
+    *value = (data.value);
+  }
+return_result:
+  return result;
+err_einval:
+  return MOBERG_ERRNO(EINVAL);
   fprintf(stderr, "%s\n", __FUNCTION__);
   return MOBERG_OK;
 }