diff --git a/adaptors/julia/moberg.jl b/adaptors/julia/moberg.jl
deleted file mode 100755
index e45888a2b7d500e01666cb0b0e43d23bd4431c2f..0000000000000000000000000000000000000000
--- a/adaptors/julia/moberg.jl
+++ /dev/null
@@ -1,126 +0,0 @@
-#!/usr/bin/julia
-
-struct moberg_status
-    result::Clong
-end
-
-function check_OK(status::moberg_status)
-    if status.result != 0
-        error("Moberg call failed with errno $(status.result)")
-    end
-end
-
-mutable struct moberg
-    handle::Ptr{Nothing}
-end
-
-function moberg() 
-    handle = ccall((:moberg_new, "libmoberg"), Ptr{Nothing}, ())
-    println(handle)
-    m = moberg(handle)
-    function close(h::moberg)
-        println(h)
-        ccall((:moberg_free, "libmoberg"), Nothing, (Ptr{Nothing},),
-              h.handle)
-    end
-    finalizer(close, m)
-    m
-end
-
-mutable struct moberg_analog_in
-    context::Ptr{Nothing}
-    do_read::Ptr{Nothing}
-    handle::moberg
-    moberg_analog_in(m::moberg, index::Unsigned) = (
-        self = new();
-        check_OK(ccall((:moberg_analog_in_open, "libmoberg"),
-                       moberg_status,
-                       (Ptr{Nothing}, Cint, Ref{moberg_analog_in}),
-                       m.handle, index, self));
-        self.handle = m;
-        function close(channel::moberg_analog_in)
-            println(channel)
-            ccall((:moberg_analog_in_close, "libmoberg"),
-                  moberg_status,
-                  (Ptr{Nothing}, Cint, moberg_analog_in),
-                  channel.handle.handle, index, self)
-        end;
-        finalizer(close, self);
-        self
-    )
-end
-
-mutable struct moberg_analog_out
-    context::Ptr{Nothing}
-    do_write::Ptr{Nothing}
-    handle::moberg
-    moberg_analog_out(m::moberg, index::Unsigned) = (
-        self = new();
-        check_OK(ccall((:moberg_analog_out_open, "libmoberg"),
-                       moberg_status,
-                       (Ptr{Nothing}, Cint, Ref{moberg_analog_out}),
-                       m.handle, index, self));
-        self.handle = m;
-        function close(channel::moberg_analog_out)
-            println(channel)
-            ccall((:moberg_analog_out_close, "libmoberg"),
-                  moberg_status,
-                  (Ptr{Nothing}, Cint, moberg_analog_out),
-                  channel.handle.handle, index, self)
-        end;
-        finalizer(close, self);
-        self
-    )
-end
-
-function read(ain::moberg_analog_in)
-    result = Ref{Cdouble}(0.0)
-    check_OK(ccall(ain.do_read,
-                   moberg_status,
-                   (Ptr{Nothing}, Ptr{Cdouble}),
-                   ain.context, result))
-    return result[]
-end
-
-function write(aout::moberg_analog_out, value::Cdouble)
-    check_OK(ccall(aout.do_write,
-                   moberg_status,
-                   (Ptr{Nothing}, Cdouble),
-                   aout.context, value))
-end
-
-function test()
-    m = moberg()
-    println(m)
-    
-    for v in -10.0:2.0:10 
-        for i in 30:31
-            try
-                aout = moberg_analog_out(m, Unsigned(i))
-                value = v + i - 32;
-                write(aout, value)
-                print("$value ")
-            catch
-                println("analog_out $i does not exist")
-            end
-        end
-        println()
-        sleep(0.1)
-        for j in 30:33
-            try
-                ain = moberg_analog_in(m, Unsigned(j))
-                println(read(ain))
-            catch
-                println("analog_in $j does not exist")
-            end
-        end
-        println()
-        GC.gc()
-    end
-end
-
-test()
-
-println("DONE")
-GC.gc()
-println("Really DONE")
diff --git a/adaptors/julia/test_moberg.jl b/adaptors/julia/test_moberg.jl
deleted file mode 100644
index 3f3a22dcb0fe9a9e74cabe7cbb18749d5180689c..0000000000000000000000000000000000000000
--- a/adaptors/julia/test_moberg.jl
+++ /dev/null
@@ -1,66 +0,0 @@
-#!/usr/bin/julia
-
-push!(LOAD_PATH, ".")
-
-using MobergIO
-import MobergIO: read, write
-
-function test()
-    m = MobergIO.Moberg()
-    println(m)
-    
-    for v in -10.0:2.0:10 
-        for i in 30:31
-            try
-                aout = MobergIO.AnalogOut(m, Unsigned(i))
-                value = v + i - 32;
-                write(aout, value)
-                print("$value ")
-            catch ex
-                println("analog_out $i does not exist $(ex)")
-            end
-        end
-        println()
-        sleep(0.01)
-        for j in 30:33
-            try
-                ain = MobergIO.AnalogIn(m, Unsigned(j))
-                println(read(ain))
-            catch ex
-                println("analog_in $j does not exist $(ex)")
-            end
-        end
-        println()
-#        GC.gc()
-    end
-    for v in false:true
-        for i in 30:36
-            try
-                dout = MobergIO.DigitalOut(m, Unsigned(i))
-                value = xor(v, isodd(i))
-                write(dout, value)
-                print("$value ")
-            catch ex
-                println("digital_out $i does not exist $(ex)")
-            end
-        end
-        println()
-        for i in 30:36
-            try
-                din = MobergIO.DigitalIn(m, Unsigned(i))
-                print("$(read(din)) ")
-            catch ex
-                println("digital_out $i does not exist $(ex)")
-            end
-        end
-        println()
-        println()
-        sleep(0.01)
-    end
-end
-
-test()
-
-println("DONE")
-GC.gc()
-println("Really DONE")
diff --git a/moberg.spec.template b/moberg.spec.template
index b4871979ffad4771066e79eb25abc7f036260ce1..85abfd7f288f01c59ad18e1eb099e0c23332e239 100644
--- a/moberg.spec.template
+++ b/moberg.spec.template
@@ -5,11 +5,19 @@ Summary:        Library for abstracting physical I/O
 License:        GPLv3
 Source0:        https://gitlab.control.lth.se/anders_blomdell/moberg/-/archive/master/moberg-__MOBERG_VERSION__.tar.gz
 
+%if 0%{!?python3_pkgversion:1}
+%define python3_pkgversion 3
+%endif
+
 BuildRequires:  gcc
 BuildRequires:  comedilib-devel
 BuildRequires:  valgrind
 BuildRequires:  libxdg-basedir-devel
 BuildRequires:  java-devel
+BuildRequires:  python2-devel
+BuildRequires:  python3-devel
+BuildRequires:  julia
+
 
 %description
 Shared library for abstracting physical process I/O (analog, digital
@@ -45,6 +53,27 @@ Requires: %{name}-devel = %{version}-%{release}
 %description matlab
 Matlab support files for %{name}
 
+%package -n python2-%{name}
+Summary: Python2 support files for %{name}
+Requires: %{name} = %{version}-%{release}
+
+%description -n python2-%{name}
+Python2 support files for %{name}
+
+%package -n python%{python3_pkgversion}-%{name}
+Summary: Python3 support files for %{name}
+Requires: %{name} = %{version}-%{release}
+
+%description -n python%{python3_pkgversion}-%{name}
+Python3 support files for %{name}
+
+%package -n MobergIO.jl
+Summary: Julia support files for %{name}
+Requires: %{name} = %{version}-%{release}
+
+%description -n MobergIO.jl
+Julia support files for %{name}
+
 
 %prep
 %setup -q -n %{name}-__MOBERG_VERSION__
@@ -66,6 +95,7 @@ cp build/moberg ${RPM_BUILD_ROOT}%{_sbindir}
 
 mkdir -p ${RPM_BUILD_ROOT}%{_includedir}
 cp moberg.h ${RPM_BUILD_ROOT}%{_includedir}
+
 # devel
 cp moberg_config.h ${RPM_BUILD_ROOT}%{_includedir}
 cp moberg_device.h ${RPM_BUILD_ROOT}%{_includedir}
@@ -73,6 +103,7 @@ cp moberg_inline.h ${RPM_BUILD_ROOT}%{_includedir}
 cp moberg_module.h ${RPM_BUILD_ROOT}%{_includedir}
 cp moberg_parser.h ${RPM_BUILD_ROOT}%{_includedir}
 
+# Java
 JAVA_ARCH=$(adaptors/java/src/getProperty_os_arch)
 mkdir -p ${RPM_BUILD_ROOT}/opt/java/se.lth.control.realtime.Moberg/jre/lib/${JAVA_ARCH}
 mkdir -p ${RPM_BUILD_ROOT}/opt/java/se.lth.control.realtime.Moberg/jre/lib/ext
@@ -83,7 +114,7 @@ cp adaptors/java/build/libse_lth_control_realtime_moberg_Moberg.so \
 cp adaptors/java/build/Moberg.jar \
    ${RPM_BUILD_ROOT}/opt/java/se.lth.control.realtime.Moberg/jre/lib/ext/
       
-
+# Matlab
 mkdir -p ${RPM_BUILD_ROOT}/opt/matlab/src/moberg
 mkdir -p ${RPM_BUILD_ROOT}%{_includedir}
 cp adaptors/matlab/moberg4simulink.h ${RPM_BUILD_ROOT}%{_includedir}
@@ -92,6 +123,23 @@ cp adaptors/matlab/*in.c ${RPM_BUILD_ROOT}/opt/matlab/src/moberg
 cp adaptors/matlab/*out.c ${RPM_BUILD_ROOT}/opt/matlab/src/moberg
 cp adaptors/matlab/Makefile.mex ${RPM_BUILD_ROOT}/opt/matlab/src/moberg/Makefile
 
+# Python
+(
+    cd adaptors/python
+    export MOBERG_VERSION=__MOBERG_VERSION__
+    %{__python2} setup.py install -O1 \
+        --root=$RPM_BUILD_ROOT --prefix /usr \
+        --record=INSTALLED_python2
+    %{__python3} setup.py install -O1 \
+        --root=$RPM_BUILD_ROOT --prefix /usr \
+        --record=INSTALLED_python3
+)
+
+# Julia
+mkdir -p ${RPM_BUILD_ROOT}/opt/julia/packages/MobergIO/src
+cp adaptors/julia/* ${RPM_BUILD_ROOT}/opt/julia/packages/MobergIO/src
+
+
 %files
 %defattr(-,root,root,-)
 %{_includedir}/moberg.h
@@ -105,12 +153,12 @@ cp adaptors/matlab/Makefile.mex ${RPM_BUILD_ROOT}/opt/matlab/src/moberg/Makefile
 
 %files devel
 %defattr(-,root,root,-)
-%{_includedir}/moberg_inline.h
 %{_includedir}/moberg_config.h
 %{_includedir}/moberg_device.h
 %{_includedir}/moberg_inline.h
 %{_includedir}/moberg_module.h
 %{_includedir}/moberg_parser.h
+%{_libdir}/libmoberg_libtest.so
 
 %files java
 %defattr(-,root,root,-)
@@ -121,3 +169,13 @@ cp adaptors/matlab/Makefile.mex ${RPM_BUILD_ROOT}/opt/matlab/src/moberg/Makefile
 %{_libdir}/libmoberg4simulink.so
 /opt/matlab/src/moberg/*
 %{_includedir}/moberg4simulink.h
+
+%files -n python2-%{name} -f adaptors/python/INSTALLED_python2
+%defattr(-,root,root,-)
+
+%files -n python%{python3_pkgversion}-%{name} -f adaptors/python/INSTALLED_python3
+%defattr(-,root,root,-)
+
+%files -n MobergIO.jl
+%defattr(-,root,root,-)
+/opt/julia/packages/MobergIO
\ No newline at end of file