diff --git a/client/android/Notifier/.idea/gradle.xml b/client/android/Notifier/.idea/gradle.xml
index 7394c74d1c189ec6fa502d51a1cc846442715437..ad3290601eb70de70ea079048ac147b83b929ec7 100644
--- a/client/android/Notifier/.idea/gradle.xml
+++ b/client/android/Notifier/.idea/gradle.xml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
+  <component name="GradleMigrationSettings" migrationVersion="1" />
   <component name="GradleSettings">
     <option name="linkedExternalProjectsSettings">
       <GradleProjectSettings>
diff --git a/client/android/Notifier/app/src/main/AndroidManifest.xml b/client/android/Notifier/app/src/main/AndroidManifest.xml
index aa1a9424c647011e9b5ef6798e31be735ab060bd..8e5f378d23115fc908f97c3ca23f47fbd49c9601 100644
--- a/client/android/Notifier/app/src/main/AndroidManifest.xml
+++ b/client/android/Notifier/app/src/main/AndroidManifest.xml
@@ -3,6 +3,8 @@
     xmlns:tools="http://schemas.android.com/tools"
     package="com.mobilesec.client.notifier">
 
+    <uses-permission android:name="android.permission.INTERNET"/>
+
     <application
         android:allowBackup="true"
         android:dataExtractionRules="@xml/data_extraction_rules"
diff --git a/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/MainActivity.java b/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/MainActivity.java
index ce5bffa9968450976e40da474fe49e7477f46eae..fc7f649becb3cb2a3373cfc0351626303e3acb16 100644
--- a/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/MainActivity.java
+++ b/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/MainActivity.java
@@ -1,14 +1,12 @@
 package com.mobilesec.client.notifier;
 
-import static android.provider.Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS;
-
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.core.app.NotificationCompat;
 import androidx.core.app.NotificationManagerCompat;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
 
 import android.app.NotificationChannel;
 import android.app.NotificationManager;
-import android.content.Intent;
 import android.content.IntentFilter;
 import android.os.Build;
 import android.os.Bundle;
@@ -29,12 +27,10 @@ public class MainActivity extends AppCompatActivity {
         // Register notification receiver
         br = new NotificationBroadcastReceiver();
         IntentFilter intentFilter = new IntentFilter();
-        intentFilter.addAction("com.mobilesec.client.notifier");
-        registerReceiver(br,intentFilter);
+        intentFilter.addAction("com.mobilesec.client.notifier.NotifierService");
+        LocalBroadcastManager.getInstance(this).registerReceiver(br, intentFilter);
 
         createNotificationChannel();
-
-        startActivity(new Intent(ACTION_NOTIFICATION_LISTENER_SETTINGS));
     }
 
     private void createNotificationChannel() {
@@ -42,8 +38,8 @@ public class MainActivity extends AppCompatActivity {
         // the NotificationChannel class is new and not in the support library
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             // TODO: Better name and description; move to resources?
-            CharSequence name = "notifierChannel";//getString(R.string.channel_name);
-            String description = "Notification channel for Notifier app."; //getString(R.string.channel_description);
+            CharSequence name = "notifierChannel";
+            String description = "Notification channel for Notifier app.";
             int importance = NotificationManager.IMPORTANCE_DEFAULT;
             NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
             channel.setDescription(description);
diff --git a/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/NotificationBroadcastReceiver.java b/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/NotificationBroadcastReceiver.java
index dbaefd036fa53c8fe72131822c74486503008351..8cb893a9b63c4a302a8ca9d9ac67679049d8bf0e 100644
--- a/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/NotificationBroadcastReceiver.java
+++ b/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/NotificationBroadcastReceiver.java
@@ -1,15 +1,53 @@
 package com.mobilesec.client.notifier;
 
+import android.app.Notification;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.os.Bundle;
 import android.util.Log;
 
+import io.grpc.ManagedChannel;
+import io.grpc.ManagedChannelBuilder;
+import io.grpc.notifier.Nothing;
+import io.grpc.notifier.NotifierComGrpc;
+import io.grpc.notifier.SendMessageRequest;
+import io.grpc.stub.StreamObserver;
+
 public class NotificationBroadcastReceiver extends BroadcastReceiver {
 
+    private ManagedChannel channel;
+    private final NotifierComGrpc.NotifierComStub asyncStub;
+
+    public NotificationBroadcastReceiver() {
+        channel = ManagedChannelBuilder.forAddress("192.168.0.127", 8080).usePlaintext().build();
+        Log.i("NOTIFIER[NotificationBroadcastReceiver]", String.format("ConnectivityState: %s", channel.getState(true).name()));
+        asyncStub = NotifierComGrpc.newStub(channel);
+    }
+
     @Override
     public void onReceive(Context context, Intent intent) {
         Log.i("NOTIFIER[onReceive]", "Received notification.");
-        // TODO: Upload to server here
+        Bundle notification = intent.getBundleExtra("Notification");
+        String m = notification.getCharSequence(Notification.EXTRA_TEXT).toString();
+        SendMessageRequest message = SendMessageRequest.newBuilder().setMessage(m).build();
+        asyncStub.sendMessage(message, new StreamObserver<Nothing>() {
+            @Override
+            public void onNext(Nothing value) {
+
+            }
+
+            @Override
+            public void onError(Throwable t) {
+                Log.w("NOTIFIER[onReceive]", t);
+                Log.i("NOTIFIER[NotificationBroadcastReceiver]", String.format("ConnectivityState: %s", channel.getState(true).name()));
+                Log.w("NOTIFIER[onReceive]", "Failed to send message.");
+            }
+
+            @Override
+            public void onCompleted() {
+                Log.i("NOTIFIER[onReceive]", "Completed sendMessage.");
+            }
+        });
     }
 }
diff --git a/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/NotifierService.java b/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/NotifierService.java
index 4caadab75973d129b77d144d05e877339f906a24..556c9523af3bc66eafa6795e59b8389353f9f5bc 100644
--- a/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/NotifierService.java
+++ b/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/NotifierService.java
@@ -7,19 +7,19 @@ import android.service.notification.NotificationListenerService;
 import android.service.notification.StatusBarNotification;
 import android.util.Log;
 
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+
 // SEE https://developer.android.com/training/notify-user/build-notification
 public class NotifierService extends NotificationListenerService {
-    public NotifierService() {
-    }
 
     @Override
     public void onNotificationPosted(StatusBarNotification sbn) {
         Bundle b = sbn.getNotification().extras;
 
         Log.i("NOTIFIER[NotificationListenerService.onNotificationPosted]",
-                "ID :" + sbn.getId() + "|" + b.getCharSequence(Notification.EXTRA_TITLE) + "|" + b.getCharSequence(Notification.EXTRA_TEXT) + "|" + sbn.getPackageName());
-        Intent intent = new  Intent("com.mobilesec.client.notifier.NotifierService");
-        intent.putExtra("Notification Code", sbn.getNotification().extras);
-        sendBroadcast(intent);
+                String.format("[%s]:[%d]: %s | %s", sbn.getPackageName(), sbn.getId(), b.getCharSequence(Notification.EXTRA_TITLE), b.getCharSequence(Notification.EXTRA_TEXT)));
+        Intent intent = new Intent("com.mobilesec.client.notifier.NotifierService");
+        intent.putExtra("Notification", sbn.getNotification().extras);
+        LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
     }
 }
\ No newline at end of file
diff --git a/server/server.py b/server/server.py
index 25fb0e2bc4a53325afe9b358d15907d0b0a42be3..072bee804da43af19ff0bf3d5acba171794b8d66 100644
--- a/server/server.py
+++ b/server/server.py
@@ -1,8 +1,12 @@
+import sys
+sys.path.insert(0, '..')
+sys.path.insert(0, '../shared/netcode')
+
 import grpc
 from concurrent import futures
 
-from netcode.netcode_pb2_grpc import *
-from netcode.netcode_pb2 import *
+from shared.netcode.netcode_pb2_grpc import *
+from shared.netcode.netcode_pb2 import *
 
 class NotifierService(NotifierComServicer):
     def SendMessage(self, request, context):
@@ -12,7 +16,7 @@ class NotifierService(NotifierComServicer):
 if __name__ == "__main__":
     server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
     add_NotifierComServicer_to_server(
-        NotifierService, server)
+        NotifierService(), server)
     server.add_insecure_port('[::]:8080')
     server.start()
     server.wait_for_termination()