diff --git a/l2ork_addons/raspberry_pi/disis_gpio/build.sh b/l2ork_addons/raspberry_pi/disis_gpio/build.sh
new file mode 100755
index 0000000000000000000000000000000000000000..89c3e652e0f6695d07e7e931cc7055ee8f519d77
--- /dev/null
+++ b/l2ork_addons/raspberry_pi/disis_gpio/build.sh
@@ -0,0 +1,6 @@
+curdir=`pwd`
+git clone git://git.drogon.net/wiringPi
+cd wiringPi/ && git pull && cd wiringPi/ && make static
+cd $curdir
+make
+exit 0
diff --git a/l2ork_addons/raspberry_pi/disis_gpio/chown_gpio b/l2ork_addons/raspberry_pi/disis_gpio/chown_gpio
new file mode 100755
index 0000000000000000000000000000000000000000..5ceef3a74250d3b6f4d1dbb3e967438ec45a5a54
--- /dev/null
+++ b/l2ork_addons/raspberry_pi/disis_gpio/chown_gpio
@@ -0,0 +1,3 @@
+sudo chown -R $USER:$USER /sys/class/gpio/*
+sudo chown $USER:$USER /sys/class/gpio/gpio*/*
+exit 0
diff --git a/l2ork_addons/raspberry_pi/disis_gpio/disis_gpio-help.pd b/l2ork_addons/raspberry_pi/disis_gpio/disis_gpio-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..ba0e841226243a45c5233987dd314fff0f867bb5
--- /dev/null
+++ b/l2ork_addons/raspberry_pi/disis_gpio/disis_gpio-help.pd
@@ -0,0 +1,59 @@
+#N canvas 423 183 777 495 10;
+#X obj 27 312 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X floatatom 424 428 5 0 0 0 - - -, f 5;
+#X obj 424 449 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 27 333 metro 50;
+#X msg 210 126 open;
+#X msg 251 126 close;
+#X msg 26 68 export 27;
+#X msg 215 68 unexport;
+#X msg 26 126 direction in;
+#X msg 115 126 direction out;
+#X obj 424 407 disis_gpio 27;
+#X msg 164 68 export;
+#X msg 26 211 togglepwm \$1;
+#X obj 26 189 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X msg 89 333 pwm \$1;
+#X obj 89 312 nbx 5 14 0 1023 0 0 empty empty empty 0 -8 0 10 -262144
+-1 -1 0 256 0;
+#X text 150 312 pwm range is 0-1023;
+#X msg 95 68 export 18;
+#X floatatom 499 428 5 0 0 0 - - -, f 5;
+#X text 24 27 1st export the desired pin or use "export" without an
+argument if you have pin already specified via previous export call
+or as a creation argument;
+#X text 24 107 2nd set the direction \, and open the pin;
+#X text 24 170 3rd (optional) enable hardware pwm (works only on pin
+18);
+#X text 24 250 4th either start sending data by sending float 0 or
+1 to a regular pin or a 0-1023 range to a pwm (18) pin. If receiving
+data \, start the metro to get updates through the first outlet. Metro
+is not needed if only sending data.;
+#X text 536 428 status (0=closed \, 1 open);
+#X text 336 427 incoming data;
+#X obj 424 312 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X text 444 311 if communicating to a pin without pwm (accepts 0 or
+1);
+#X text 512 406 optional arg sets the pin number;
+#X connect 0 0 3 0;
+#X connect 1 0 2 0;
+#X connect 3 0 10 0;
+#X connect 4 0 10 0;
+#X connect 5 0 10 0;
+#X connect 6 0 10 0;
+#X connect 7 0 10 0;
+#X connect 8 0 10 0;
+#X connect 9 0 10 0;
+#X connect 10 0 1 0;
+#X connect 10 1 18 0;
+#X connect 11 0 10 0;
+#X connect 12 0 10 0;
+#X connect 13 0 12 0;
+#X connect 14 0 10 0;
+#X connect 15 0 14 0;
+#X connect 17 0 10 0;
+#X connect 25 0 10 0;
diff --git a/l2ork_addons/raspberry_pi/disis_gpio/disis_gpio.c b/l2ork_addons/raspberry_pi/disis_gpio/disis_gpio.c
index 74a17243a3066bd8d6bdfa05471de6fd99af49fc..c98a2aeae8340c735d72b4c8eaf2373e2102df9b 100644
--- a/l2ork_addons/raspberry_pi/disis_gpio/disis_gpio.c
+++ b/l2ork_addons/raspberry_pi/disis_gpio/disis_gpio.c
@@ -14,6 +14,8 @@
 #include <errno.h>
 #include <string.h>
 #include <unistd.h>
+#include "g_canvas.h"
+#include "wiringPi/wiringPi/wiringPi.h"
 
 static t_class *disis_gpio_class;
 
@@ -24,61 +26,143 @@ typedef struct _disis_gpio
 {
     t_object x_obj;
     t_outlet *x_out1;
+    t_outlet *x_out2;
     int x_pin;
+    int x_export;
     int x_fdvalue;
     int x_dir;
+    int x_pwm;
+    //int x_pwmrange;
+    t_symbol *x_chown;
 } t_disis_gpio;
 
-static void disis_gpio_enable(t_disis_gpio *x, t_float f, t_float dir)
+static void disis_gpio_close(t_disis_gpio *x);
+
+static void disis_gpio_reflectstatus(t_disis_gpio *x) {
+    if (x->x_fdvalue >= 0) {
+        outlet_float(x->x_out2, 1);
+    } else {
+        outlet_float(x->x_out2, 0);
+    }
+}
+
+static int disis_gpio_isvalidpin(int pin) {
+    int ret;
+    switch (pin) {
+        case 0:
+        case 4:
+        case 7:
+        case 8:
+        case 17:
+        case 18:
+        case 22:
+        case 23:
+        case 24:
+        case 25:
+        case 27:
+            ret = 1;
+            break;
+        default:
+            ret = 0;
+            post("disis_gpio: invalid pin number");
+            break;
+    }
+    return(ret);
+}
+
+static void disis_gpio_export(t_disis_gpio *x, t_float f)
 {
-    char buf[1024];
-    if (f != 0) {
-        if (dir) {
-            sprintf(buf, "gpio export %d out\n", x->x_pin);
-        } else {
-            sprintf(buf, "gpio export %d in\n", x->x_pin);
+    if (x->x_export) {
+        post("disis_gpio: already exported");
+        return;
+    } 
+    if ((int)f != 0 || x->x_pin != 0) {
+        if ( ((int)f != 0 && disis_gpio_isvalidpin((int)f)) || ((int)f == 0 && disis_gpio_isvalidpin(x->x_pin)) ) {
+            if ((int)f != 0)
+                x->x_pin = (int)f;
+            x->x_export = 1;
+            post("disis_gpio: exporting pin %d\n", x->x_pin);
+            if (system(x->x_chown->s_name) < 0) { // first to adjust permissions for /sys/class/gpio so that we can export
+                post("disis_gpio: failed setting permissions to /sys/class/gpio folder");
+                x->x_export = 0;
+            }
+            char buf[1024];
+            //sprintf(buf, "gpio export %d %s\n", x->x_pin, dir->s_name);
+            sprintf(buf, "echo %d > /sys/class/gpio/export\n", x->x_pin);
+            if (system(buf) < 0) {
+                post("disis_gpio: failed to export requested pin");
+                x->x_export = 0;
+            }
+            if (system(x->x_chown->s_name) < 0) { // to adjust permissions within the exported gpio pin
+                post("disis_gpio: failed setting permissions to /sys/class/gpio/gpio* subfolders");
+                x->x_export = 0;
+            }
         }
-    } else sprintf(buf, "gpio unexport %d\n", x->x_pin);
-    system(buf);
+    } else {
+        post("disis_gpio: invalid pin number (0)");
+    }
 }
 
-static void disis_gpio_output(t_disis_gpio *x, t_float f)
+static void disis_gpio_unexport(t_disis_gpio *x)
 {
-    char buf[1024];
-    x->x_dir = f;
-    if (f != 0)
-         sprintf(buf, "gpio -g mode %d out\n",
-            x->x_pin);
-    else sprintf(buf, "gpio -g mode %d in\n",
-        x->x_pin);
-    system(buf);
+    if (x->x_export) {
+        char buf[1024];
+        if (x->x_fdvalue >= 0) {
+            disis_gpio_close(x);
+        }
+        //sprintf(buf, "gpio unexport %d\n", x->x_pin);
+        sprintf(buf, "echo %d > /sys/class/gpio/unexport\n", x->x_pin);
+        if (system(buf) < 0) {
+            post("disis_gpio: failed to unexport requested pin");          
+        }
+	x->x_export = 0;
+    }
 }
 
-static void disis_gpio_open(t_disis_gpio *x, t_float f)
+static void disis_gpio_direction(t_disis_gpio *x, t_symbol *dir)
+{
+    if (strlen(dir->s_name) > 0) {
+        char buf[1024];
+        int d = -1;
+	if (!strcmp(dir->s_name, "in")) d = 0;
+	else if (!strcmp(dir->s_name, "out")) d = 1;
+        if (d >= 0) {
+            x->x_dir = d;
+            //sprintf(buf, "gpio -g mode %d %s\n", x->x_pin, dir->s_name);
+            sprintf(buf, "echo %s > /sys/class/gpio/gpio%d/direction\n", dir->s_name, x->x_pin);
+            if (system(buf) < 0) {
+                post("disis_gpio: failed to set pin direction");
+            }
+        }
+    }
+}
+
+static void disis_gpio_open(t_disis_gpio *x)
 {
     char buf[1024];
     sprintf(buf, "/sys/class/gpio/gpio%d/value", x->x_pin);
-    if (f != 0)
+    if (x->x_fdvalue >= 0)
+        post("disis_gpio: already open");
+    else
     {
-        if (x->x_fdvalue >= 0)
-            post("disis_gpio: already open");
-        else
-        {
-            x->x_fdvalue = open(buf, O_RDWR);
-            if (x->x_fdvalue < 0)
-                post("%s: %s", buf, strerror(errno));
+        x->x_fdvalue = open(buf, O_RDWR);
+        if (x->x_fdvalue < 0) {
+            post("%s: %s", buf, strerror(errno));
         }
     }
+    disis_gpio_reflectstatus(x);
+}
+
+static void disis_gpio_close(t_disis_gpio *x)
+{
+    if (x->x_fdvalue < 0)
+        post("disis_gpio: already closed");
     else
     {
-        if (x->x_fdvalue < 0)
-            post("disis_gpio: already closed");
-        else
-        {
-            close(x->x_fdvalue);
-            x->x_fdvalue = -1;
-        }
+        close(x->x_fdvalue);
+        x->x_fdvalue = -1;
     }
+    disis_gpio_reflectstatus(x);
 }
 
 static void disis_gpio_float(t_disis_gpio *x, t_float f)
@@ -94,6 +178,45 @@ static void disis_gpio_float(t_disis_gpio *x, t_float f)
     }
 }
 
+static void disis_gpio_pwm(t_disis_gpio *x, t_float val)
+{
+    if (x->x_fdvalue != -1 && x->x_pwm && x->x_pin == 18) {
+        pwmWrite (x->x_pin, (int)val);
+    } else {
+        post("disis_gpio: pwm messages can be only sent to opened pin 18 with togglepwm enabled");
+    }
+}
+
+static void disis_gpio_togglepwm(t_disis_gpio *x, t_float on)
+{
+    if (x->x_fdvalue != -1 && x->x_pin == 18) {
+        if (x->x_pwm == (int)on) {
+            if (x->x_pwm)
+                post("disis_gpio: pwm already enabled");
+            else
+                post("disis_gpio: pwm already disabled");
+        } else {
+            x->x_pwm = (int)on;
+            if (x->x_pwm)
+                pinMode(x->x_pin, PWM_OUTPUT);
+            else
+                pinMode(x->x_pin, OUTPUT);
+        }
+    } else {
+        post("disis_gpio: you can toggle pwm only on opened pin 18");
+    }
+}
+
+/*static void disis_gpio_pwmrange(t_disis_gpio *x, t_float r)
+{
+    if (x->x_fdvalue != -1 && x->x_pwm && x->x_pin == 18) {
+        pwmSetRange((int)r);
+        x->x_pwmrange = (int)r;
+    } else {
+        post("disis_gpio: you can toggle pwm only on opened pin 18 with togglepwm enabled");
+    }
+}*/
+
 static void disis_gpio_bang(t_disis_gpio *x)
 {
     char buf[1024];
@@ -123,13 +246,25 @@ static void disis_gpio_bang(t_disis_gpio *x)
     }
 }
 
+static void disis_gpio_free(t_disis_gpio *x) {
+    disis_gpio_unexport(x);
+}
+
 static void *disis_gpio_new(t_floatarg f)
 {
+    if (!disis_gpio_isvalidpin((int)f)) return(NULL);
     t_disis_gpio *x = (t_disis_gpio *)pd_new(disis_gpio_class);
     x->x_out1 = outlet_new(&x->x_obj, gensym("float"));
+    x->x_out2 = outlet_new(&x->x_obj, gensym("float"));
     x->x_fdvalue = -1;
     x->x_pin = f;
+    x->x_export = 0;
     x->x_dir = 0;
+    x->x_pwm = 0;
+    //x->x_pwmrange = 0;
+    char buf[FILENAME_MAX];
+    canvas_makefilename(glist_getcanvas((t_glist*)canvas_getcurrent()), "@pd_extra/disis_gpio/chown_gpio&", buf, FILENAME_MAX);
+    x->x_chown = gensym(buf);
     return (x);
 }
 
@@ -137,13 +272,20 @@ static void *disis_gpio_new(t_floatarg f)
 void disis_gpio_setup(void)
 {
     disis_gpio_class = class_new(gensym("disis_gpio"), (t_newmethod)disis_gpio_new,
-        0, sizeof(t_disis_gpio), 0, A_DEFFLOAT, 0);
-    class_addmethod(disis_gpio_class, (t_method)disis_gpio_enable, gensym("enable"), 
-        A_DEFFLOAT, A_DEFFLOAT, 0);
-    class_addmethod(disis_gpio_class, (t_method)disis_gpio_output, gensym("output"), 
-        A_FLOAT, 0);
-    class_addmethod(disis_gpio_class, (t_method)disis_gpio_open, gensym("open"), 
+        (t_method)disis_gpio_free, sizeof(t_disis_gpio), 0, A_DEFFLOAT, 0);
+    class_addmethod(disis_gpio_class, (t_method)disis_gpio_export, gensym("export"), 
         A_DEFFLOAT, 0);
+    class_addmethod(disis_gpio_class, (t_method)disis_gpio_unexport, gensym("unexport"), 0);
+    class_addmethod(disis_gpio_class, (t_method)disis_gpio_direction, gensym("direction"), 
+        A_DEFSYMBOL, 0);
+    class_addmethod(disis_gpio_class, (t_method)disis_gpio_open, gensym("open"), 0);
+    class_addmethod(disis_gpio_class, (t_method)disis_gpio_close, gensym("close"), 0);
+    class_addmethod(disis_gpio_class, (t_method)disis_gpio_pwm, gensym("pwm"), 
+        A_FLOAT, 0);
+    class_addmethod(disis_gpio_class, (t_method)disis_gpio_togglepwm, gensym("togglepwm"), 
+        A_FLOAT, 0);
+    //class_addmethod(disis_gpio_class, (t_method)disis_gpio_pwmrange, gensym("pwmrange"), 
+    //    A_FLOAT, 0);
     class_addfloat(disis_gpio_class, disis_gpio_float);
     class_addbang(disis_gpio_class, disis_gpio_bang);
 }
diff --git a/l2ork_addons/raspberry_pi/disis_gpio/makefile b/l2ork_addons/raspberry_pi/disis_gpio/makefile
index d4f66235419c0b29a1595734d45df620a77a9c03..373eb62d12b761c92380520cddeeadf2f7ac5b9b 100644
--- a/l2ork_addons/raspberry_pi/disis_gpio/makefile
+++ b/l2ork_addons/raspberry_pi/disis_gpio/makefile
@@ -1,4 +1,4 @@
 NAME=disis_gpio
 CSYM=$(NAME)
-
+APPENDFLAGS=wiringPi/wiringPi/libwiringPi.a
 include ../makefile.include
diff --git a/l2ork_addons/raspberry_pi/disis_gpio/test-gpio.pd b/l2ork_addons/raspberry_pi/disis_gpio/test-gpio.pd
deleted file mode 100644
index bd2e7c5ceeef7355c83dd99f53170340bc85cbc9..0000000000000000000000000000000000000000
--- a/l2ork_addons/raspberry_pi/disis_gpio/test-gpio.pd
+++ /dev/null
@@ -1,25 +0,0 @@
-#N canvas 187 97 450 300 10;
-#X obj 82 58 gpio 4;
-#X msg 73 21 open 1;
-#X msg 134 22 open 0;
-#X obj 215 24 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
-1;
-#X obj 255 24 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
--1;
-#X floatatom 94 96 5 0 0 0 - - -;
-#X obj 95 122 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
--1;
-#X obj 231 62 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
-1;
-#X obj 231 93 metro 1;
-#X obj 175 149 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
-1;
-#X obj 175 180 metro 1;
-#X connect 1 0 0 0;
-#X connect 2 0 0 0;
-#X connect 3 0 0 0;
-#X connect 4 0 0 0;
-#X connect 5 0 6 0;
-#X connect 7 0 8 0;
-#X connect 8 0 0 0;
-#X connect 9 0 10 0;
diff --git a/l2ork_addons/raspberry_pi/disis_spi/disis_spi-help.pd b/l2ork_addons/raspberry_pi/disis_spi/disis_spi-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..0fdca0926a7d379ddce346156ce8f6a99e847f26
--- /dev/null
+++ b/l2ork_addons/raspberry_pi/disis_spi/disis_spi-help.pd
@@ -0,0 +1,44 @@
+#N canvas 640 214 566 406 10;
+#X obj 26 304 disis_spi, f 51;
+#X msg 26 197 open;
+#X msg 202 197 close;
+#X floatatom 26 347 5 0 0 0 - - -, f 5;
+#X floatatom 349 347 5 0 0 0 - - -, f 5;
+#X msg 69 197 open /dev/spidev0.0;
+#X obj 209 262 metro 100;
+#X obj 209 238 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X floatatom 63 347 5 0 0 0 - - -, f 5;
+#X floatatom 101 347 5 0 0 0 - - -, f 5;
+#X floatatom 139 347 5 0 0 0 - - -, f 5;
+#X floatatom 177 347 5 0 0 0 - - -, f 5;
+#X floatatom 215 347 5 0 0 0 - - -, f 5;
+#X floatatom 253 347 5 0 0 0 - - -, f 5;
+#X floatatom 291 347 5 0 0 0 - - -, f 5;
+#X text 27 367 8 channels of incoming analog data (range 0-1023);
+#X text 387 347 status (0=closed \, 1=open);
+#X text 231 238 toggle metro on to get updates;
+#X obj 23 111 pddplink http://moderndevice.com/product/lots-of-pots-lop-board-for-raspberry-pi/
+;
+#X text 23 20 disi_spi works with mcp3008 A/D converter and provides
+8 analog inputs into Raspberry Pi.The easiest way to get mcp3008
+installed on Raspberry Pi is to use Lots of Pots shield made and sold
+by Modern Device (you can get the cheaper NOP board without the pots
+so that you can wire other sensors):;
+#X text 23 151 The open the device simply press open (the implied devicename
+is /dev/spidev0.0) or do open <devicename>. To close device press close.
+;
+#X connect 0 0 3 0;
+#X connect 0 1 8 0;
+#X connect 0 2 9 0;
+#X connect 0 3 10 0;
+#X connect 0 4 11 0;
+#X connect 0 5 12 0;
+#X connect 0 6 13 0;
+#X connect 0 7 14 0;
+#X connect 0 8 4 0;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 0 0;
+#X connect 7 0 6 0;
diff --git a/l2ork_addons/raspberry_pi/disis_spi/disis_spi.c b/l2ork_addons/raspberry_pi/disis_spi/disis_spi.c
index f27b98f57bb65e64eda4c669c85a8f045d4e965b..498d8b3816982f10f71ee1799b430a15c91ae9c1 100644
--- a/l2ork_addons/raspberry_pi/disis_spi/disis_spi.c
+++ b/l2ork_addons/raspberry_pi/disis_spi/disis_spi.c
@@ -12,14 +12,6 @@
  *            It can be only 0.5, 1, 2, 4, 8, 16, 32 MHz.
  *                Will use 1MHz for now and test it further.
  * spifd       -> file descriptor for the SPI device
- *
- * The class contains two constructors that initialize the above
- * variables and then open the appropriate spidev device using spiOpen().
- * The class contains one destructor that automatically closes the spidev
- * device when object is destroyed by calling spiClose().
- * The spiWriteRead() function sends the data "data" of length "length"
- * to the spidevice and at the same time receives data of the same length.
- * Resulting data is stored in the "data" variable after the function call.
  * ****************************************************************************/
 #include "m_pd.h"
 #include <unistd.h>
@@ -30,17 +22,22 @@
 #include <stdio.h>
 #include <errno.h>
 #include <stdlib.h>
+#include <string.h>
 
 static t_class *disis_spi_class;
 
-//#define FILE_PREFIX "/sys/class/gpio/"
-//#define FILE_EXPORT FILE_PREFIX "export"
-
 typedef struct _disis_spi
 {
     t_object x_obj;
     t_outlet *x_out1;
     t_outlet *x_out2;
+    t_outlet *x_out3;
+    t_outlet *x_out4;
+    t_outlet *x_out5;
+    t_outlet *x_out6;
+    t_outlet *x_out7;
+    t_outlet *x_out8;
+    t_outlet *x_out9;
     t_symbol *spidev;
     unsigned char mode;
     unsigned char bitsPerWord;
@@ -55,21 +52,23 @@ static int disis_spi_close(t_disis_spi *spi);
 static void disis_spi_free(t_disis_spi *spi);
 
 /**********************************************************
- * disis_spi_open() :function is called by the constructor.
+ * disis_spi_open() :function is called by the "open" command
  * It is responsible for opening the spidev device
  * "devspi" and then setting up the spidev interface.
- * private member variables are used to configure spidev.
- * They must be set appropriately by constructor before calling
+ * member variables are used to configure spidev.
+ * They must be set appropriately before calling
  * this function.
  * *********************************************************/
 static void disis_spi_open(t_disis_spi *spi, t_symbol *devspi){
     int statusVal = 0;
-    if (devspi == &s_)
+    if (strlen(devspi->s_name) == 0) {
       spi->spidev = gensym("/dev/spidev0.0");
-    else
+    } else {
       spi->spidev = devspi;
-    spi->spifd = open(devspi->s_name, O_RDWR);
+    }
+    spi->spifd = open(spi->spidev->s_name, O_RDWR);
     if(spi->spifd < 0) {
+      statusVal = -1;
       pd_error(spi, "could not open SPI device");
       goto spi_output;
     }
@@ -116,18 +115,19 @@ static void disis_spi_open(t_disis_spi *spi, t_symbol *devspi){
       goto spi_output;
     }
 spi_output:
-    outlet_float(spi->x_out2, statusVal);
+    if (!statusVal) statusVal = 1;
+    else statusVal = 0;
+    outlet_float(spi->x_out9, statusVal);
 }
 
 /***********************************************************
  * disis_spi_close(): Responsible for closing the spidev interface.
- * Called in destructor
  * *********************************************************/
  
 static int disis_spi_close(t_disis_spi *spi){
     int statusVal = -1;
     if (spi->spifd == -1) {
-      pd_error(spi, "disis_spi: device not open\n");
+      pd_error(spi, "disis_spi: device not open");
       return(-1);
     }
     statusVal = close(spi->spifd);
@@ -135,7 +135,9 @@ static int disis_spi_close(t_disis_spi *spi){
       pd_error(spi, "disis_spi: could not close SPI device");
       exit(1);
     }
-    return statusVal;
+    outlet_float(spi->x_out9, 0);
+    spi->spifd = -1;
+    return(statusVal);
 }
 
 /********************************************************************
@@ -195,32 +197,44 @@ static int disis_spi_write_read(t_disis_spi *spi, unsigned char *data, int lengt
  *                   byte3 = b7 - b0
  *    
  * after conversion must merge data[1] and data[2] to get final result
- *
- *
- *
  * *********************************************************************/
  
 static void disis_spi_bang(t_disis_spi *spi)
 {
-  int a2dVal = 0;
+  if (spi->spifd == -1) {
+    pd_error(spi, "device not open %d", spi->spifd);
+    return;
+  }
+  int a2dVal[8];
   int a2dChannel = 0;
   unsigned char data[3];
 
-  data[0] = 1;  //  first byte transmitted -> start bit
-  data[1] = 0b10000000 |( ((a2dChannel & 7) << 4)); // second byte transmitted -> (SGL/DIF = 1, D2=D1=D0=0)
-  data[2] = 0; // third byte transmitted....don't care
+  for (a2dChannel = 0; a2dChannel < 8; a2dChannel++) {
+
+    data[0] = 1;  //  first byte transmitted -> start bit
+    data[1] = 0b10000000 |( ((a2dChannel & 7) << 4)); // second byte transmitted -> (SGL/DIF = 1, D2=D1=D0=0)
+    data[2] = 0; // third byte transmitted....don't care
 
-  disis_spi_write_read(spi, data, sizeof(data));
+    disis_spi_write_read(spi, data, sizeof(data));
+
+    a2dVal[a2dChannel] = 0;
+    a2dVal[a2dChannel] = (data[1]<< 8) & 0b1100000000; //merge data[1] & data[2] to get result
+    a2dVal[a2dChannel] |=  (data[2] & 0xff);
+    //fprintf(stderr,"%d\n", a2dVal);
+  }
 
-  a2dVal = 0;
-  a2dVal = (data[1]<< 8) & 0b1100000000; //merge data[1] & data[2] to get result
-  a2dVal |=  (data[2] & 0xff);
-  fprintf(stderr,"%d\n", a2dVal);
-  outlet_float(spi->x_out1, a2dVal);
+  outlet_float(spi->x_out8, a2dVal[7]);
+  outlet_float(spi->x_out7, a2dVal[6]);
+  outlet_float(spi->x_out6, a2dVal[5]);
+  outlet_float(spi->x_out5, a2dVal[4]);
+  outlet_float(spi->x_out4, a2dVal[3]);
+  outlet_float(spi->x_out3, a2dVal[2]);
+  outlet_float(spi->x_out2, a2dVal[1]);
+  outlet_float(spi->x_out1, a2dVal[0]);
 }
 
 /*************************************************
- * init function. lets user set obj variables
+ * init function.
  * ***********************************************/
 static t_disis_spi *disis_spi_new(t_symbol *devspi){
     t_disis_spi *spi = (t_disis_spi *)pd_new(disis_spi_class);
@@ -228,6 +242,13 @@ static t_disis_spi *disis_spi_new(t_symbol *devspi){
     //t_disis_spi *a2d = disis_spi_new("/dev/spidev0.0", spi_MODE_0, 1000000, 8);
     spi->x_out1 = outlet_new(&spi->x_obj, gensym("float"));
     spi->x_out2 = outlet_new(&spi->x_obj, gensym("float"));
+    spi->x_out3 = outlet_new(&spi->x_obj, gensym("float"));
+    spi->x_out4 = outlet_new(&spi->x_obj, gensym("float"));
+    spi->x_out5 = outlet_new(&spi->x_obj, gensym("float"));
+    spi->x_out6 = outlet_new(&spi->x_obj, gensym("float"));
+    spi->x_out7 = outlet_new(&spi->x_obj, gensym("float"));
+    spi->x_out8 = outlet_new(&spi->x_obj, gensym("float"));
+    spi->x_out9 = outlet_new(&spi->x_obj, gensym("float"));
     spi->spidev = devspi;
     spi->mode = SPI_MODE_0;
     spi->bitsPerWord = 8;
diff --git a/l2ork_addons/raspberry_pi/disis_spi/spi_original.c b/l2ork_addons/raspberry_pi/disis_spi/spi_original.c
index 81caae0bf0c9ba49fa54ca21ec1659509826db47..cf5741e1d1c67f0e41333f22923fa5bcc3aad244 100644
--- a/l2ork_addons/raspberry_pi/disis_spi/spi_original.c
+++ b/l2ork_addons/raspberry_pi/disis_spi/spi_original.c
@@ -203,7 +203,7 @@ int main(void)
 {
   t_spi *a2d = spi_new("/dev/spidev0.0", SPI_MODE_0, 1000000, 8);
   int a2dVal = 0;
-  int a2dChannel = 0;
+  int a2dChannel = 1;
   unsigned char data[3];
 
   while(1)
diff --git a/l2ork_addons/raspberry_pi/gpio/disis_gpio.c b/l2ork_addons/raspberry_pi/gpio/disis_gpio.c
deleted file mode 100644
index 2ee57174fd42470337a066279793658f4cd95622..0000000000000000000000000000000000000000
--- a/l2ork_addons/raspberry_pi/gpio/disis_gpio.c
+++ /dev/null
@@ -1,140 +0,0 @@
-/* gpio - Pi gpio pins via /sys/etc */
-/* see http://elinux.org/RPi_Low-level_peripherals */
-
-/* Copyright Miller Puckette - BSD license */
-
-#include "m_pd.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <string.h>
-#include <unistd.h>
-
-static t_class *gpio_class;
-
-#define FILE_PREFIX "/sys/class/gpio/"
-#define FILE_EXPORT FILE_PREFIX "export"
-
-typedef struct _gpio
-{
-    t_object x_obj;
-    t_outlet *x_out1;
-    int x_pin;
-    int x_fdvalue;
-} t_gpio;
-
-static void gpio_enable(t_gpio *x, t_float f)
-{
-    char buf[1024];
-    if (f != 0)
-         sprintf(buf, "echo %d > /sys/class/gpio/export\n", x->x_pin);
-    else sprintf(buf, "echo %d > /sys/class/gpio/unexport\n", x->x_pin);
-    system(buf);
-}
-
-static void gpio_output(t_gpio *x, t_float f)
-{
-    char buf[1024];
-    if (f != 0)
-         sprintf(buf, "echo out > /sys/class/gpio/gpio%d/direction\n",
-            x->x_pin);
-    else sprintf(buf, "echo in > /sys/class/gpio/gpio%d/direction\n",
-        x->x_pin);
-    system(buf);
-}
-
-static void gpio_open(t_gpio *x, t_float f)
-{
-    char buf[1024];
-    sprintf(buf, "/sys/class/gpio/gpio%d/value", x->x_pin);
-    if (f != 0)
-    {
-        if (x->x_fdvalue >= 0)
-            post("gpio: already open");
-        else
-        {
-            x->x_fdvalue = open(buf, O_RDWR);
-            if (x->x_fdvalue < 0)
-                post("%s: %s", buf, strerror(errno));
-        }
-    }
-    else
-    {
-        if (x->x_fdvalue < 0)
-            post("gpio: already closed");
-        else
-        {
-            close(x->x_fdvalue);
-            x->x_fdvalue = -1;
-        }
-    }
-}
-
-static void gpio_float(t_gpio *x, t_float f)
-{
-    char buf[1024];
-    if (x->x_fdvalue < 0)
-        pd_error(x, "gpio: not open");
-    else
-    {
-        sprintf(buf, "%d\n", (f != 0));
-        if (write(x->x_fdvalue, buf, strlen(buf)) < (int)strlen(buf))
-            pd_error(x, "gpio_float: %s", strerror(errno));
-    }
-}
-
-static void gpio_bang(t_gpio *x)
-{
-    char buf[1024];
-    if (x->x_fdvalue < 0)
-        pd_error(x, "gpio: not open");
-    else
-    {
-        int rval = lseek(x->x_fdvalue, 0, 0);
-        if (rval < 0)
-        {
-            pd_error(x, "gpio_bang (seek): %s", strerror(errno));
-            return;
-        }
-        rval = read(x->x_fdvalue, buf, sizeof(buf)-1);
-        if (rval < 0)
-        {
-            pd_error(x, "gpio_bang (read): %s", strerror(errno));
-            return;
-        }
-        buf[rval] = 0;
-        if (sscanf(buf, "%d", &rval) < 1)
-        {
-            pd_error(x, "gpio_bang: couldn't parse string: %s", buf);
-            return;
-        }
-        outlet_float(x->x_out1, rval);
-    }
-}
-
-static void *gpio_new(t_floatarg f)
-{
-    t_gpio *x = (t_gpio *)pd_new(gpio_class);
-    x->x_out1 = outlet_new(&x->x_obj, gensym("float"));
-    x->x_fdvalue = -1;
-    x->x_pin = f;
-    return (x);
-}
-
-
-void gpio_setup(void)
-{
-    gpio_class = class_new(gensym("gpio"), (t_newmethod)gpio_new,
-        0, sizeof(t_gpio), 0, A_DEFFLOAT, 0);
-    class_addmethod(gpio_class, (t_method)gpio_enable, gensym("enable"), 
-        A_FLOAT, 0);
-    class_addmethod(gpio_class, (t_method)gpio_output, gensym("output"), 
-        A_FLOAT, 0);
-    class_addmethod(gpio_class, (t_method)gpio_open, gensym("open"), 
-        A_FLOAT, 0);
-    class_addfloat(gpio_class, gpio_float);
-    class_addbang(gpio_class, gpio_bang);
-}
diff --git a/l2ork_addons/raspberry_pi/gpio/gpio.c b/l2ork_addons/raspberry_pi/gpio/gpio.c
deleted file mode 100644
index 2ee57174fd42470337a066279793658f4cd95622..0000000000000000000000000000000000000000
--- a/l2ork_addons/raspberry_pi/gpio/gpio.c
+++ /dev/null
@@ -1,140 +0,0 @@
-/* gpio - Pi gpio pins via /sys/etc */
-/* see http://elinux.org/RPi_Low-level_peripherals */
-
-/* Copyright Miller Puckette - BSD license */
-
-#include "m_pd.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <string.h>
-#include <unistd.h>
-
-static t_class *gpio_class;
-
-#define FILE_PREFIX "/sys/class/gpio/"
-#define FILE_EXPORT FILE_PREFIX "export"
-
-typedef struct _gpio
-{
-    t_object x_obj;
-    t_outlet *x_out1;
-    int x_pin;
-    int x_fdvalue;
-} t_gpio;
-
-static void gpio_enable(t_gpio *x, t_float f)
-{
-    char buf[1024];
-    if (f != 0)
-         sprintf(buf, "echo %d > /sys/class/gpio/export\n", x->x_pin);
-    else sprintf(buf, "echo %d > /sys/class/gpio/unexport\n", x->x_pin);
-    system(buf);
-}
-
-static void gpio_output(t_gpio *x, t_float f)
-{
-    char buf[1024];
-    if (f != 0)
-         sprintf(buf, "echo out > /sys/class/gpio/gpio%d/direction\n",
-            x->x_pin);
-    else sprintf(buf, "echo in > /sys/class/gpio/gpio%d/direction\n",
-        x->x_pin);
-    system(buf);
-}
-
-static void gpio_open(t_gpio *x, t_float f)
-{
-    char buf[1024];
-    sprintf(buf, "/sys/class/gpio/gpio%d/value", x->x_pin);
-    if (f != 0)
-    {
-        if (x->x_fdvalue >= 0)
-            post("gpio: already open");
-        else
-        {
-            x->x_fdvalue = open(buf, O_RDWR);
-            if (x->x_fdvalue < 0)
-                post("%s: %s", buf, strerror(errno));
-        }
-    }
-    else
-    {
-        if (x->x_fdvalue < 0)
-            post("gpio: already closed");
-        else
-        {
-            close(x->x_fdvalue);
-            x->x_fdvalue = -1;
-        }
-    }
-}
-
-static void gpio_float(t_gpio *x, t_float f)
-{
-    char buf[1024];
-    if (x->x_fdvalue < 0)
-        pd_error(x, "gpio: not open");
-    else
-    {
-        sprintf(buf, "%d\n", (f != 0));
-        if (write(x->x_fdvalue, buf, strlen(buf)) < (int)strlen(buf))
-            pd_error(x, "gpio_float: %s", strerror(errno));
-    }
-}
-
-static void gpio_bang(t_gpio *x)
-{
-    char buf[1024];
-    if (x->x_fdvalue < 0)
-        pd_error(x, "gpio: not open");
-    else
-    {
-        int rval = lseek(x->x_fdvalue, 0, 0);
-        if (rval < 0)
-        {
-            pd_error(x, "gpio_bang (seek): %s", strerror(errno));
-            return;
-        }
-        rval = read(x->x_fdvalue, buf, sizeof(buf)-1);
-        if (rval < 0)
-        {
-            pd_error(x, "gpio_bang (read): %s", strerror(errno));
-            return;
-        }
-        buf[rval] = 0;
-        if (sscanf(buf, "%d", &rval) < 1)
-        {
-            pd_error(x, "gpio_bang: couldn't parse string: %s", buf);
-            return;
-        }
-        outlet_float(x->x_out1, rval);
-    }
-}
-
-static void *gpio_new(t_floatarg f)
-{
-    t_gpio *x = (t_gpio *)pd_new(gpio_class);
-    x->x_out1 = outlet_new(&x->x_obj, gensym("float"));
-    x->x_fdvalue = -1;
-    x->x_pin = f;
-    return (x);
-}
-
-
-void gpio_setup(void)
-{
-    gpio_class = class_new(gensym("gpio"), (t_newmethod)gpio_new,
-        0, sizeof(t_gpio), 0, A_DEFFLOAT, 0);
-    class_addmethod(gpio_class, (t_method)gpio_enable, gensym("enable"), 
-        A_FLOAT, 0);
-    class_addmethod(gpio_class, (t_method)gpio_output, gensym("output"), 
-        A_FLOAT, 0);
-    class_addmethod(gpio_class, (t_method)gpio_open, gensym("open"), 
-        A_FLOAT, 0);
-    class_addfloat(gpio_class, gpio_float);
-    class_addbang(gpio_class, gpio_bang);
-}
diff --git a/l2ork_addons/raspberry_pi/gpio/gpio.l_arm b/l2ork_addons/raspberry_pi/gpio/gpio.l_arm
deleted file mode 100755
index aca8fbd97b9dc1b20eb2ee09ee2f53fac03e37c6..0000000000000000000000000000000000000000
Binary files a/l2ork_addons/raspberry_pi/gpio/gpio.l_arm and /dev/null differ
diff --git a/l2ork_addons/raspberry_pi/gpio/makefile b/l2ork_addons/raspberry_pi/gpio/makefile
deleted file mode 100644
index dd3e3df141950357184906fd7a83c9d6f905e4aa..0000000000000000000000000000000000000000
--- a/l2ork_addons/raspberry_pi/gpio/makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-NAME=gpio
-CSYM=$(NAME)
-
-include ../makefile.include
diff --git a/l2ork_addons/raspberry_pi/gpio/test-gpio.pd b/l2ork_addons/raspberry_pi/gpio/test-gpio.pd
deleted file mode 100644
index bd2e7c5ceeef7355c83dd99f53170340bc85cbc9..0000000000000000000000000000000000000000
--- a/l2ork_addons/raspberry_pi/gpio/test-gpio.pd
+++ /dev/null
@@ -1,25 +0,0 @@
-#N canvas 187 97 450 300 10;
-#X obj 82 58 gpio 4;
-#X msg 73 21 open 1;
-#X msg 134 22 open 0;
-#X obj 215 24 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
-1;
-#X obj 255 24 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
--1;
-#X floatatom 94 96 5 0 0 0 - - -;
-#X obj 95 122 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
--1;
-#X obj 231 62 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
-1;
-#X obj 231 93 metro 1;
-#X obj 175 149 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
-1;
-#X obj 175 180 metro 1;
-#X connect 1 0 0 0;
-#X connect 2 0 0 0;
-#X connect 3 0 0 0;
-#X connect 4 0 0 0;
-#X connect 5 0 6 0;
-#X connect 7 0 8 0;
-#X connect 8 0 0 0;
-#X connect 9 0 10 0;
diff --git a/l2ork_addons/raspberry_pi/makeall.sh b/l2ork_addons/raspberry_pi/makeall.sh
new file mode 100755
index 0000000000000000000000000000000000000000..fb1dff3cfeab2601b595c8ec2724b1d7bb276f3d
--- /dev/null
+++ b/l2ork_addons/raspberry_pi/makeall.sh
@@ -0,0 +1,10 @@
+cd disis_gpio
+./build.sh
+chmod 4755 chown_gpio
+cd ../
+
+cd disis_spi
+make
+cd ../
+
+exit 0
diff --git a/l2ork_addons/raspberry_pi/makefile.include b/l2ork_addons/raspberry_pi/makefile.include
index 23cef8b87c0431d6178f1f1f390af12d5c18a3ae..7bb5c60e9274fedff2b96b892a1c8af251a0b603 100644
--- a/l2ork_addons/raspberry_pi/makefile.include
+++ b/l2ork_addons/raspberry_pi/makefile.include
@@ -1,5 +1,3 @@
-current: l_i386 l_ia64
-
 # which OS to compile for
 UNAME := $(shell uname -s)
 ifeq ($(UNAME),Linux)
@@ -36,6 +34,11 @@ endif
 ifeq ($(UNAME_MACHINE),ppc)
   ARCH = powerpc
 endif
+ifeq ($(UNAME_MACHINE),armv6l)
+  ARCH = l_arm
+endif
+
+current: $(ARCH)
 
 # ----------------------- Windows -----------------------
 
@@ -62,6 +65,7 @@ PDNTLIB = $(PDNTLDIR)\libc.lib \
 
 l_i386: $(NAME).l_i386
 l_ia64: $(NAME).l_ia64
+l_arm: $(NAME).l_arm
 
 .SUFFIXES: .l_i386 .l_ia64 .l_arm
 
@@ -75,21 +79,21 @@ LINUXINCLUDE =  $(UNIXINCLUDE)
 
 .c.l_i386:
 	$(CC) $(LINUXCFLAGS) $(LINUXINCLUDE) -m32 -o $*.o -c $*.c
-	$(CC) -m32 -shared -o $*.l_i386 $*.o -lc -lm
+	$(CC) -m32 -shared -o $*.l_i386 $*.o -lc -lm $(APPENDFLAGS)
 	strip --strip-unneeded $*.l_i386
 	rm -f $*.o
 	mv $(NAME).l_i386 $(NAME).pd_linux
 
 .c.l_ia64:
 	cc $(LINUXCFLAGS) $(LINUXINCLUDE) -fPIC -o $*.o -c $*.c
-	ld  -shared -o $*.l_ia64 $*.o -lc -lm
+	ld  -shared -o $*.l_ia64 $*.o -lc -lm $(APPENDFLAGS)
 	strip --strip-unneeded $*.l_ia64
 	rm $*.o
 	mv $(NAME).l_ia64 $(NAME).pd_linux
 
 .c.l_arm:
 	cc $(LINUXCFLAGS) $(LINUXINCLUDE) -o $*.o -c $*.c
-	ld  -shared -o $*.l_arm $*.o -lc -lm
+	ld  -shared -o $*.l_arm $*.o -lc -lm $(APPENDFLAGS)
 	strip --strip-unneeded $*.l_arm
 	rm $*.o
 	mv $(NAME).l_arm $(NAME).pd_linux
@@ -100,7 +104,7 @@ ifeq ($(ARCH),l_ia64)
 	make l_ia64
 endif
 ifeq ($(ARCH),l_arm)
-		make l_arm
+	make l_arm
 endif
 ifeq ($(ARCH),l_i386)
 	make l_i386