diff --git a/SensorLib/rxsensorlib/.gitignore b/SensorLib/rxsensorlib/.gitignore
new file mode 100644
index 00000000..796b96d1
--- /dev/null
+++ b/SensorLib/rxsensorlib/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/SensorLib/rxsensorlib/build.gradle b/SensorLib/rxsensorlib/build.gradle
new file mode 100644
index 00000000..95cba9b2
--- /dev/null
+++ b/SensorLib/rxsensorlib/build.gradle
@@ -0,0 +1,41 @@
+apply plugin: 'com.android.library'
+apply plugin: 'com.github.dcendents.android-maven'
+
+group='com.github.gradlman.SensorLib'
+version = '1.0'
+
+android {
+ compileSdkVersion 27
+
+
+
+ defaultConfig {
+ minSdkVersion 21
+ targetSdkVersion 27
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+
+}
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+
+ api 'io.reactivex.rxjava2:rxandroid:2.1.0'
+ api 'io.reactivex.rxjava2:rxjava:2.2.6'
+ implementation 'com.android.support:appcompat-v7:27.1.1'
+ testImplementation 'junit:junit:4.12'
+ androidTestImplementation 'com.android.support.test:runner:1.0.2'
+ androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+ api project(path: ':sensorlib')
+}
diff --git a/SensorLib/rxsensorlib/proguard-rules.pro b/SensorLib/rxsensorlib/proguard-rules.pro
new file mode 100644
index 00000000..f1b42451
--- /dev/null
+++ b/SensorLib/rxsensorlib/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/SensorLib/rxsensorlib/src/androidTest/java/de/fau/sensorlib/rx/ExampleInstrumentedTest.java b/SensorLib/rxsensorlib/src/androidTest/java/de/fau/sensorlib/rx/ExampleInstrumentedTest.java
new file mode 100644
index 00000000..2568659f
--- /dev/null
+++ b/SensorLib/rxsensorlib/src/androidTest/java/de/fau/sensorlib/rx/ExampleInstrumentedTest.java
@@ -0,0 +1,28 @@
+package de.fau.sensorlib.rx;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest
+{
+ @Test
+ public void useAppContext()
+ {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getTargetContext();
+
+ assertEquals("de.fau.sensorlib.rx.test", appContext.getPackageName());
+ }
+}
diff --git a/SensorLib/rxsensorlib/src/main/AndroidManifest.xml b/SensorLib/rxsensorlib/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..b805ad33
--- /dev/null
+++ b/SensorLib/rxsensorlib/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
diff --git a/SensorLib/rxsensorlib/src/main/java/de/fau/sensorlib/rx/RxSensorDataProcessor.java b/SensorLib/rxsensorlib/src/main/java/de/fau/sensorlib/rx/RxSensorDataProcessor.java
new file mode 100644
index 00000000..e3ca9df4
--- /dev/null
+++ b/SensorLib/rxsensorlib/src/main/java/de/fau/sensorlib/rx/RxSensorDataProcessor.java
@@ -0,0 +1,123 @@
+package de.fau.sensorlib.rx;
+
+import de.fau.sensorlib.SensorDataProcessor;
+import de.fau.sensorlib.dataframe.SensorDataFrame;
+import de.fau.sensorlib.sensors.AbstractSensor;
+import io.reactivex.Observable;
+import io.reactivex.subjects.PublishSubject;
+
+public class RxSensorDataProcessor extends SensorDataProcessor
+{
+
+ public enum SensorState
+ {
+ CREATED, CONNECTING, CONNECTED, DISCONNECTED, CONNECTION_LOST, STREAMING_STARTED, STREAMING_STOPPED
+ }
+
+ public static class SensorNotification
+ {
+ private final AbstractSensor sensor;
+ private final T notification;
+
+ public SensorNotification(AbstractSensor sensor, T notification)
+ {
+ this.sensor = sensor;
+ this.notification = notification;
+ }
+
+ public AbstractSensor getSensor()
+ {
+ return sensor;
+ }
+
+ public T getNotification()
+ {
+ return notification;
+ }
+ }
+
+ private PublishSubject> sensorStateSubject = PublishSubject.create();
+ private PublishSubject> sensorSamplingRateSubject = PublishSubject.create();
+ private PublishSubject> sensorNotificationSubject = PublishSubject.create();
+ private PublishSubject newDataSubject = PublishSubject.create();
+
+
+ @Override
+ public void onSensorCreated(AbstractSensor sensor)
+ {
+ sensorStateSubject.onNext(new SensorNotification(sensor, SensorState.CREATED));
+ }
+
+ @Override
+ public void onConnected(AbstractSensor sensor)
+ {
+ sensorStateSubject.onNext(new SensorNotification(sensor, SensorState.CONNECTED));
+ }
+
+ @Override
+ public void onConnecting(AbstractSensor sensor)
+ {
+ sensorStateSubject.onNext(new SensorNotification(sensor, SensorState.CONNECTING));
+ }
+
+ @Override
+ public void onDisconnected(AbstractSensor sensor)
+ {
+ sensorStateSubject.onNext(new SensorNotification(sensor, SensorState.DISCONNECTED));
+ }
+
+ @Override
+ public void onConnectionLost(AbstractSensor sensor)
+ {
+ sensorStateSubject.onNext(new SensorNotification(sensor, SensorState.CONNECTION_LOST));
+ }
+
+ @Override
+ public void onStartStreaming(AbstractSensor sensor)
+ {
+ sensorStateSubject.onNext(new SensorNotification(sensor, SensorState.STREAMING_STARTED));
+ }
+
+ @Override
+ public void onStopStreaming(AbstractSensor sensor)
+ {
+ sensorStateSubject.onNext(new SensorNotification(sensor, SensorState.STREAMING_STOPPED));
+ }
+
+ @Override
+ public void onSamplingRateChanged(AbstractSensor sensor, double newSamplingRate)
+ {
+ sensorSamplingRateSubject.onNext(new SensorNotification(sensor, newSamplingRate));
+ }
+
+ @Override
+ public void onNotify(AbstractSensor sensor, Object notification)
+ {
+ sensorNotificationSubject.onNext(new SensorNotification