Check for negative return from % operator
diff --git a/heron/api/src/java/com/twitter/heron/streamlet/impl/groupings/JoinCustomGrouping.java b/heron/api/src/java/com/twitter/heron/streamlet/impl/groupings/JoinCustomGrouping.java
index 3559f64..5e8deb3 100644
--- a/heron/api/src/java/com/twitter/heron/streamlet/impl/groupings/JoinCustomGrouping.java
+++ b/heron/api/src/java/com/twitter/heron/streamlet/impl/groupings/JoinCustomGrouping.java
@@ -47,6 +47,9 @@
     List<Integer> ret = new ArrayList<>();
     V obj = (V) values.get(0);
     int index = keyExtractor.apply(obj).hashCode() % taskIds.size();
+    if (index < 0) {
+      index = (index + taskIds.size()) % taskIds.size();
+    }
     ret.add(taskIds.get(index));
     return ret;
   }
diff --git a/heron/api/src/java/com/twitter/heron/streamlet/impl/groupings/ReduceByKeyAndWindowCustomGrouping.java b/heron/api/src/java/com/twitter/heron/streamlet/impl/groupings/ReduceByKeyAndWindowCustomGrouping.java
index 03ef822..5e2d71e 100644
--- a/heron/api/src/java/com/twitter/heron/streamlet/impl/groupings/ReduceByKeyAndWindowCustomGrouping.java
+++ b/heron/api/src/java/com/twitter/heron/streamlet/impl/groupings/ReduceByKeyAndWindowCustomGrouping.java
@@ -49,6 +49,9 @@
     List<Integer> ret = new ArrayList<>();
     V obj = (V) values.get(0);
     int index = keyExtractor.apply(obj).hashCode() % taskIds.size();
+    if (index < 0) {
+      index = (index + taskIds.size()) % taskIds.size();
+    }
     ret.add(taskIds.get(index));
     return ret;
   }