diff --git a/.gitignore b/.gitignore
index 8f91cf5abd77cade2fc4eb3afdbec4d51127a988..3fc61441802c7ae713eb97332a469ddc7a9992b4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,8 @@
-*.iml
-.gradle
 /local.properties
-/.idea/workspace.xml
-/.idea/libraries
-/.idea/caches
-.DS_Store
+/.idea/
 /build
 /captures
+*.iml
+.gradle
+.DS_Store
 .externalNativeBuild
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
deleted file mode 100644
index 30aa626c23142d59e94cc76327172301f159b618..0000000000000000000000000000000000000000
--- a/.idea/codeStyles/Project.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<component name="ProjectCodeStyleConfiguration">
-  <code_scheme name="Project" version="173">
-    <Objective-C-extensions>
-      <file>
-        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
-        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
-        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
-        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
-        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
-        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
-        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
-        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
-        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
-      </file>
-      <class>
-        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
-        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
-        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
-        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
-        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" />
-        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" />
-      </class>
-      <extensions>
-        <pair source="cpp" header="h" fileNamingConvention="NONE" />
-        <pair source="c" header="h" fileNamingConvention="NONE" />
-      </extensions>
-    </Objective-C-extensions>
-  </code_scheme>
-</component>
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
deleted file mode 100644
index 16fa2b3c5d53cf4c6c7bec6efafab8e2c72ad41f..0000000000000000000000000000000000000000
--- a/.idea/gradle.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="GradleSettings">
-    <option name="linkedExternalProjectsSettings">
-      <GradleProjectSettings>
-        <option name="distributionType" value="DEFAULT_WRAPPED" />
-        <option name="externalProjectPath" value="$PROJECT_DIR$" />
-        <option name="modules">
-          <set>
-            <option value="$PROJECT_DIR$" />
-            <option value="$PROJECT_DIR$/common" />
-            <option value="$PROJECT_DIR$/mobile" />
-            <option value="$PROJECT_DIR$/wear" />
-          </set>
-        </option>
-        <option name="resolveModulePerSourceSet" value="false" />
-      </GradleProjectSettings>
-    </option>
-  </component>
-</project>
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index 75dac502959ec4f6e5232282499067f85aa716f5..0000000000000000000000000000000000000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="NullableNotNullManager">
-    <option name="myDefaultNullable" value="android.support.annotation.Nullable" />
-    <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
-    <option name="myNullables">
-      <value>
-        <list size="4">
-          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
-          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
-          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
-          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
-        </list>
-      </value>
-    </option>
-    <option name="myNotNulls">
-      <value>
-        <list size="4">
-          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
-          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
-          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
-          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
-        </list>
-      </value>
-    </option>
-  </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
-    <output url="file://$PROJECT_DIR$/build/classes" />
-  </component>
-  <component name="ProjectType">
-    <option name="id" value="Android" />
-  </component>
-</project>
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index dd960f626537f5b1241cfced3d78b39a9b011bea..0000000000000000000000000000000000000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ProjectModuleManager">
-    <modules>
-      <module fileurl="file://$PROJECT_DIR$/SensorSharing.iml" filepath="$PROJECT_DIR$/SensorSharing.iml" />
-      <module fileurl="file://$PROJECT_DIR$/common/common.iml" filepath="$PROJECT_DIR$/common/common.iml" />
-      <module fileurl="file://$PROJECT_DIR$/mobile/mobile.iml" filepath="$PROJECT_DIR$/mobile/mobile.iml" />
-      <module fileurl="file://$PROJECT_DIR$/wear/wear.iml" filepath="$PROJECT_DIR$/wear/wear.iml" />
-    </modules>
-  </component>
-</project>
\ No newline at end of file
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
deleted file mode 100644
index 7f68460d8b38ac04e3a3224d7c79ef719b1991a9..0000000000000000000000000000000000000000
--- a/.idea/runConfigurations.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="RunConfigurationProducerService">
-    <option name="ignoredProducers">
-      <set>
-        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
-        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
-        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
-      </set>
-    </option>
-  </component>
-</project>
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 94a25f7f4cb416c083d265558da75d457237d671..0000000000000000000000000000000000000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="VcsDirectoryMappings">
-    <mapping directory="$PROJECT_DIR$" vcs="Git" />
-  </component>
-</project>
\ No newline at end of file
diff --git a/common/src/main/java/de/tudresden/inf/st/sensorsharing/common/Utils.java b/common/src/main/java/de/tudresden/inf/st/sensorsharing/common/Utils.java
new file mode 100644
index 0000000000000000000000000000000000000000..15eb6f623723641a0e90a7e6f7b56b696ff47452
--- /dev/null
+++ b/common/src/main/java/de/tudresden/inf/st/sensorsharing/common/Utils.java
@@ -0,0 +1,18 @@
+package de.tudresden.inf.st.sensorsharing.common;
+
+import java.nio.ByteBuffer;
+import java.util.Locale;
+
+public class Utils {
+    public static String formatArray3(float[] a) {
+        return String.format(Locale.getDefault(), "%.2f:%.2f:%.2f", a[0], a[1], a[2]);
+    }
+
+    public static byte[] floatArray2ByteArray(float[] input) {
+        ByteBuffer buffer = ByteBuffer.allocate(4 * input.length);
+        for (float value : input) {
+            buffer.putFloat(value);
+        }
+        return buffer.array();
+    }
+}
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000000000000000000000000000000000..13372aef5e24af05341d49695ee84e5f9b594659
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/mobile/src/main/java/de/tudresden/inf/st/sensorsharing/MainActivity.java b/mobile/src/main/java/de/tudresden/inf/st/sensorsharing/MainActivity.java
index ce87db8f787f80d3c4e99e23f00df481f0ec1ef5..e86a3a3a2a4ab94da74ea9d19be9c79c7848beb8 100644
--- a/mobile/src/main/java/de/tudresden/inf/st/sensorsharing/MainActivity.java
+++ b/mobile/src/main/java/de/tudresden/inf/st/sensorsharing/MainActivity.java
@@ -34,9 +34,12 @@ import org.eclipse.paho.client.mqttv3.MqttMessage;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
 import java.text.DateFormat;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.Locale;
 
+import de.tudresden.inf.st.sensorsharing.common.Utils;
+
 import static de.tudresden.inf.st.sensorsharing.common.Constants.BASE_KEY;
 import static de.tudresden.inf.st.sensorsharing.common.Constants.BASE_KEY_LENGTH;
 import static de.tudresden.inf.st.sensorsharing.common.Constants.MQTT_CHARSET;
@@ -50,21 +53,31 @@ public class MainActivity extends AppCompatActivity implements
         MessageClient.OnMessageReceivedListener {
 
     private static final String TAG = "SensorSharing";
-    private static final String MQTT_TOPIC_SAMSUNG = "sensors/samsung/brightness";
-    private static final int MQTT_DEFAULT_QOS = 0;
-    /** Delay in milliseconds after which the wearable is assumed to be offline */
-    public static final int DELAY_WEARABLE_ASSUMED_OFFLINE = 30000;
+//    private static final String MQTT_TOPIC_SAMSUNG = "sensors/samsung/brightness";
 
+    // sensor management
     private SensorManager mSensorManager;
     private Sensor mLight;
-    private TextView mValueWearBrightness;
+    private Sensor mRotationVector;
+
+    // mqtt management
+    private static final int MQTT_DEFAULT_QOS = 0;
     private MqttAndroidClient mqttAndroidClient;
+    private MqttTopics wearTopics;
+    private MqttTopics phoneTopics;
     private int sensorChangedCounter = 0;
-    private Date lastMessageFromWearable;
+    private boolean sendMqttUpdates;
+
+    // wearable management
+    /** Delay in milliseconds after which the wearable is assumed to be offline */
+    public static final int DELAY_WEARABLE_ASSUMED_OFFLINE = 30000;
+    private Date lastMessageFromWearable = new Date();
     private DateFormat dateTimeFormat = DateFormat.getDateTimeInstance(
             DateFormat.SHORT, android.icu.text.DateFormat.SHORT);
-    private boolean sendMqttUpdates;
-    private MqttTopics wearTopics;
+
+    // sensor values of phone
+    private float[] mRotationVectorValues;
+    private float mLightValue;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -82,7 +95,22 @@ public class MainActivity extends AppCompatActivity implements
             return;
         }
         mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
-        mValueWearBrightness = findViewById(R.id.value_wear_brightness);
+        mRotationVector = mSensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR);
+        if (mRotationVector == null) {
+            mRotationVector = mSensorManager.getDefaultSensor(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR);
+            if (mRotationVector == null) {
+                TextView textView = findViewById(R.id.value_own_rotation);
+                textView.setText("ERROR");
+                Log.e(TAG, "Couldn't find rotation sensor!");
+            } else {
+                Log.w(TAG, "Using alternative rotation sensor!");
+            }
+        }
+
+
+        // initialize sensor values
+        mLightValue = -1;
+        mRotationVectorValues = new float[3];
 
         updateWearStatus(false);
         connectMqtt(null);
@@ -119,6 +147,8 @@ public class MainActivity extends AppCompatActivity implements
                 subTopic = "polar";
         }
         wearTopics = new MqttTopics(subTopic);
+        // use fixed topic for phone for now
+        phoneTopics = new MqttTopics("samsung");
     }
 
     private void setupSendUpdatesCheckbox() {
@@ -178,7 +208,8 @@ public class MainActivity extends AppCompatActivity implements
         options.setAutomaticReconnect(true);
         options.setConnectionTimeout(5);
         try {
-            IMqttToken token = mqttAndroidClient.connect(options, null, new IMqttActionListener() {
+            IMqttToken token = mqttAndroidClient.connect(options,
+                    null, new IMqttActionListener() {
                 @Override
                 public void onSuccess(IMqttToken asyncActionToken) {
                     Log.i(TAG, "Successfully connected to " + serverURI);
@@ -209,14 +240,24 @@ public class MainActivity extends AppCompatActivity implements
 
     @Override
     public void onSensorChanged(SensorEvent sensorEvent) {
-        float lightValue = sensorEvent.values[0];
-        String stringValue = String.valueOf(lightValue);
-        TextView textView = findViewById(R.id.value_own_brightness);
-        textView.setText(stringValue);
-        if (++sensorChangedCounter >= 5) {
-            // only send every 5th change
+        TextView textView;
+        switch (sensorEvent.sensor.getType()) {
+            case Sensor.TYPE_LIGHT:
+                mLightValue = sensorEvent.values[0];
+                textView = findViewById(R.id.value_own_brightness);
+                textView.setText(String.valueOf(mLightValue));
+                break;
+            case Sensor.TYPE_GAME_ROTATION_VECTOR:
+            case Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR:
+                mRotationVectorValues = sensorEvent.values;
+                textView = findViewById(R.id.value_own_rotation);
+                textView.setText(Utils.formatArray3(mRotationVectorValues));
+                break;
+        }
+        if (++sensorChangedCounter >= 15) {
+            // only send every 15th change
             sensorChangedCounter = 0;
-            sendUpdateOfSmartphone(stringValue);
+            sendUpdateOfSmartphone();
         }
     }
 
@@ -229,6 +270,7 @@ public class MainActivity extends AppCompatActivity implements
     protected void onResume() {
         super.onResume();
         mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_UI);
+        mSensorManager.registerListener(this, mRotationVector, SensorManager.SENSOR_DELAY_UI);
         Wearable.getMessageClient(this).addListener(this);
     }
 
@@ -248,12 +290,13 @@ public class MainActivity extends AppCompatActivity implements
             final String updatedValue;
             String topic = null;
             final TextView textViewToUpdate;
+            final byte[] bytesToSendViaMqtt = messageEvent.getData();
 
             switch (path.substring(BASE_KEY_LENGTH)) {
                 case SUB_KEY_BRIGHTNESS:
                     float mWearBrightness = ByteBuffer.wrap(messageEvent.getData()).getFloat();
                     updatedValue = Float.toString(mWearBrightness);
-                    textViewToUpdate = mValueWearBrightness;
+                    textViewToUpdate = findViewById(R.id.value_wear_brightness);
                     topic = wearTopics.mqtt_topic_brightness;
                     break;
                 case SUB_KEY_LINEAR_ACCELERATION:
@@ -290,21 +333,22 @@ public class MainActivity extends AppCompatActivity implements
                 }
             });
             if (topic != null) {
-                sendUpdateOfWearable(topic, updatedValue);
+                sendUpdateOfWearable(topic, bytesToSendViaMqtt);
             }
         }
     }
 
     private String formatByteFloatArray(ByteBuffer buffer) {
+        return formatFloatArray(buffer.asFloatBuffer().array());
+    }
+
+    private String formatFloatArray(float... values) {
         StringBuilder sb = new StringBuilder();
-        final int length = 3;
-        boolean notFirst = false;
-        for (int i = 0; i < length; i++) {
-            if (notFirst) {
+        for (int i = 0; i < values.length; i++) {
+            if (i > 0) {
                 sb.append(" : ");
             }
-            notFirst = true;
-            sb.append(String.format(Locale.getDefault(), "%.2f", buffer.getFloat()));
+            sb.append(String.format(Locale.getDefault(), "%.2f", values[i]));
         }
         return sb.toString();
     }
@@ -315,15 +359,22 @@ public class MainActivity extends AppCompatActivity implements
         }
     }
 
-    private void sendUpdateOfWearable(String topic, String newValue) {
+    private void sendUpdateOfWearable(String topic, byte[] newValue) {
         sendUpdate(topic, newValue);
     }
 
-    private void sendUpdateOfSmartphone(String newValue) {
-        sendUpdate(MQTT_TOPIC_SAMSUNG, newValue);
+    private void sendUpdateOfSmartphone() {
+//        sendUpdate(phoneTopics.mqtt_topic_brightness, ByteBuffer.allocate(4).putFloat(mLightValue).array());
+//        sendUpdate(phoneTopics.mqtt_topic_rotation, Utils.floatArray2ByteArray(mRotationVectorValues));
+        sendUpdate(phoneTopics.mqtt_topic_brightness, Float.toString(mLightValue));
+        sendUpdate(phoneTopics.mqtt_topic_rotation, Arrays.toString(mRotationVectorValues));
     }
 
     private void sendUpdate(String topic, String newValue) {
+        sendUpdate(topic, newValue.getBytes(MQTT_CHARSET));
+    }
+
+    private void sendUpdate(String topic, byte[] bytes) {
         if (!sendMqttUpdates) {
             return;
         }
@@ -337,8 +388,7 @@ public class MainActivity extends AppCompatActivity implements
         }
         // send to MQTT
         try {
-            mqttAndroidClient.publish(topic, newValue.getBytes(MQTT_CHARSET),
-                    MQTT_DEFAULT_QOS, false);
+            mqttAndroidClient.publish(topic, bytes, MQTT_DEFAULT_QOS, false);
         } catch (MqttException e) {
             Log.d(TAG, "mqtt message publish failed", e);
         }
diff --git a/mobile/src/main/res/layout/activity_main.xml b/mobile/src/main/res/layout/activity_main.xml
index 9ad48d1b09c0aa4a381b51066108d598ab3831ef..88f33421aeaa096114b35f195f134b756531dc88 100644
--- a/mobile/src/main/res/layout/activity_main.xml
+++ b/mobile/src/main/res/layout/activity_main.xml
@@ -6,6 +6,26 @@
     android:layout_height="match_parent"
     tools:context="de.tudresden.inf.st.sensorsharing.MainActivity">
 
+    <TextView
+        android:id="@+id/label_own_rotation"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dp"
+        android:layout_marginTop="8dp"
+        android:text="@string/text_rotation"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/label_own_brightness" />
+
+    <TextView
+        android:id="@+id/value_own_rotation"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dp"
+        android:layout_marginTop="8dp"
+        android:text="@android:string/unknownName"
+        app:layout_constraintStart_toEndOf="@+id/label_own_rotation"
+        app:layout_constraintTop_toBottomOf="@+id/value_own_brightness" />
+
     <TextView
         android:id="@+id/label_wear_name"
         android:layout_width="wrap_content"
@@ -65,8 +85,8 @@
         android:id="@+id/separator_wear"
         style="?android:attr/listSeparatorTextViewStyle"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="8dp"
+        android:layout_height="21dp"
+        android:layout_marginTop="32dp"
         android:background="@android:color/darker_gray"
         android:text="@string/text_separator_wear_values"
         app:layout_constraintEnd_toEndOf="parent"
@@ -104,7 +124,7 @@
         android:layout_height="wrap_content"
         android:layout_marginStart="8dp"
         android:layout_marginTop="8dp"
-        android:text="@string/text_own_brightness"
+        android:text="@string/text_brightness"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/label_own_name" />
@@ -115,7 +135,7 @@
         android:layout_height="wrap_content"
         android:layout_marginStart="8dp"
         android:layout_marginTop="8dp"
-        android:text="@string/text_wear_brightness"
+        android:text="@string/text_brightness"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/label_wear_name" />
 
@@ -125,7 +145,7 @@
         android:layout_height="wrap_content"
         android:layout_marginStart="8dp"
         android:layout_marginTop="8dp"
-        android:text="@string/text_wear_acceleration"
+        android:text="@string/text_acceleration"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/label_wear_brightness" />
 
@@ -135,7 +155,7 @@
         android:layout_height="wrap_content"
         android:layout_marginStart="8dp"
         android:layout_marginTop="8dp"
-        android:text="@string/text_wear_rotation"
+        android:text="@string/text_rotation"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/label_wear_acceleration" />
 
diff --git a/mobile/src/main/res/values/strings.xml b/mobile/src/main/res/values/strings.xml
index d3d2f34651087cdd3e42ace93a30c294fbf8717c..6ff84060ddd491329b1e7aae92e60e4d90527622 100644
--- a/mobile/src/main/res/values/strings.xml
+++ b/mobile/src/main/res/values/strings.xml
@@ -1,10 +1,9 @@
 <resources>
     <string name="app_name">SensorSharing</string>
     <string name="text_name">Name</string>
-    <string name="text_own_brightness">Own Brightness</string>
-    <string name="text_wear_brightness">Wear Brightness</string>
-    <string name="text_wear_acceleration">Wear Acceleration</string>
-    <string name="text_wear_rotation">Wear Rotation</string>
+    <string name="text_brightness">Brightness</string>
+    <string name="text_acceleration">Acceleration</string>
+    <string name="text_rotation">Rotation</string>
     <string name="text_connected">Connected</string>
     <string name="text_mqtt_server_uri">MQTT Server URI</string>
     <string name="default_mqtt_server_uri">tcp://10.8.0.119</string>
diff --git a/wear/src/main/java/de/tudresden/inf/st/sensorsharing/MainActivity.java b/wear/src/main/java/de/tudresden/inf/st/sensorsharing/MainActivity.java
index 005e9cccf2cf2fb994ab516e298213e371a98ab4..53b1d2a2f7c3054f258f6540d36ef2c05171b2c1 100644
--- a/wear/src/main/java/de/tudresden/inf/st/sensorsharing/MainActivity.java
+++ b/wear/src/main/java/de/tudresden/inf/st/sensorsharing/MainActivity.java
@@ -19,9 +19,9 @@ import com.google.android.gms.wearable.Node;
 import com.google.android.gms.wearable.Wearable;
 
 import java.nio.ByteBuffer;
-import java.util.Arrays;
 import java.util.List;
-import java.util.Locale;
+
+import de.tudresden.inf.st.sensorsharing.common.Utils;
 
 import static de.tudresden.inf.st.sensorsharing.common.Constants.KEY_BRIGHTNESS;
 import static de.tudresden.inf.st.sensorsharing.common.Constants.KEY_LINEAR_ACCELERATION;
@@ -111,21 +111,17 @@ public class MainActivity extends WearableActivity implements SensorEventListene
             case Sensor.TYPE_ACCELEROMETER:
                 mLinearAccelerationValues = sensorEvent.values;
                 textView = findViewById(R.id.acceleration_value);
-                textView.setText(formatArray3(mLinearAccelerationValues));
+                textView.setText(Utils.formatArray3(mLinearAccelerationValues));
                 break;
             case Sensor.TYPE_GAME_ROTATION_VECTOR:
             case Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR:
                 mRotationVectorValues = sensorEvent.values;
                 textView = findViewById(R.id.rotation_value);
-                textView.setText(formatArray3(mRotationVectorValues));
+                textView.setText(Utils.formatArray3(mRotationVectorValues));
                 break;
         }
     }
 
-    private String formatArray3(float[] a) {
-        return String.format(Locale.getDefault(), "%.2f:%.2f:%.2f", a[0], a[1], a[2]);
-    }
-
     private void sendCurrentValueToAllConnectedNodes() {
         Task<List<Node>> nodesTask = Wearable.getNodeClient(this).getConnectedNodes();
         final MessageClient messageClient = Wearable.getMessageClient(this);
@@ -133,8 +129,8 @@ public class MainActivity extends WearableActivity implements SensorEventListene
             @Override
             public void onSuccess(List<Node> nodes) {
                 final byte[] brightnessData = ByteBuffer.allocate(4).putFloat(mLightValue).array();
-                final byte[] accelerationData = floatArray2ByteArray(mLinearAccelerationValues);
-                final byte[] rotationData = floatArray2ByteArray(mRotationVectorValues);
+                final byte[] accelerationData = Utils.floatArray2ByteArray(mLinearAccelerationValues);
+                final byte[] rotationData = Utils.floatArray2ByteArray(mRotationVectorValues);
                 for (Node node : nodes) {
                     if (sendName) {
                         final byte[] nameData = Build.MODEL.getBytes(MQTT_CHARSET);
@@ -149,14 +145,6 @@ public class MainActivity extends WearableActivity implements SensorEventListene
         });
     }
 
-    private byte[] floatArray2ByteArray(float[] input) {
-        ByteBuffer buffer = ByteBuffer.allocate(4 * input.length);
-        for (float value : input) {
-            buffer.putFloat(value);
-        }
-        return buffer.array();
-    }
-
     @Override
     public void onAccuracyChanged(Sensor sensor, int i) {
         // ignore accuracy changes