diff --git a/mutalyzer/Scheduler.py b/mutalyzer/Scheduler.py
index f82671a709cc553172c4e2082220978049b47c0b..f3ad60e6d86331722752e957402d5b17f45ab6d5 100644
--- a/mutalyzer/Scheduler.py
+++ b/mutalyzer/Scheduler.py
@@ -97,9 +97,9 @@ class Scheduler() :
         if settings.TESTING:
             return
 
-        # Mail is set to 'job@webservice' if the batch job was submitted using
-        # the webservice.
-        if mailTo == 'job@webservice':
+        # Mail is set to '<IP ADDRESS>@webservice' if the batch job was
+        # submitted using the webservice without specifying an email address.
+        if mailTo.endswith('@webservice'):
             return
 
         #TODO: Handle Connection errors in a try, except clause
diff --git a/mutalyzer/services/rpc.py b/mutalyzer/services/rpc.py
index 8281da387b4049ffbbdcc7d1410d07cf00d4db66..508cd90530491ea8c0448ee2134fad35ab5c4b4f 100644
--- a/mutalyzer/services/rpc.py
+++ b/mutalyzer/services/rpc.py
@@ -12,7 +12,7 @@ Mutalyzer RPC services.
 from __future__ import unicode_literals
 
 import binning
-from spyne.decorator import srpc
+from spyne.decorator import rpc, srpc
 from spyne.service import ServiceBase
 from spyne.model.primitive import Integer, Boolean, DateTime, Unicode
 from spyne.model.complex import Array
@@ -71,8 +71,8 @@ class MutalyzerService(ServiceBase):
         super(MutalyzerService, self).__init__(environ)
     #__init__
 
-    @srpc(Mandatory.ByteArray, Unicode, Unicode, Unicode, _returns=Unicode)
-    def submitBatchJob(data, process='NameChecker', argument='', email=None):
+    @rpc(Mandatory.ByteArray, Unicode, Unicode, Unicode, _returns=Unicode)
+    def submitBatchJob(ctx, data, process='NameChecker', argument='', email=None):
         """
         Submit a batch job.
 
@@ -80,10 +80,10 @@ class MutalyzerService(ServiceBase):
         website <https://mutalyzer.nl/batch>.
 
         Batch jobs are processed using round-robin scheduling grouped by email
-        address. Per email address, jobs are processed sequentially in order
-        of submission. Jobs with no email address specified end up in a shared
-        group. This means your job is likely to be processed sooner if you
-        provide an email address.
+        address (or client IP address if no email address is specified). Per
+        email address, jobs are processed sequentially in order of submission.
+        This means you will not see any progress on this job until all your
+        earlier jobs have finished.
 
         On error an exception is raised:
           - detail: Human readable description of the error.
@@ -147,7 +147,17 @@ class MutalyzerService(ServiceBase):
         if job is None:
             raise Fault('EPARSE', 'Could not parse input file, please check your file format.')
 
-        result_id = scheduler.addJob(email or 'job@webservice', job, columns,
+        if not email:
+            # If no email address is specified, we create a fake one based on
+            # the caller's IP address. This makes sure the scheduler processes
+            # jobs grouped by user.
+            try:
+                address = unicode(ctx.transport.req_env['REMOTE_ADDR'])
+            except (AttributeError, KeyError):
+                address = 'localhost'
+            email = '%s@webservice' % address
+
+        result_id = scheduler.addJob(email, job, columns,
                                      batch_types[process], argument)
         return result_id