diff --git a/dataflower.cabal b/dataflower.cabal
--- a/dataflower.cabal
+++ b/dataflower.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: f8c905e3886d672d9325bc3d2737600644d15f243a4c93fdfb69cde4c8de0b6c
+-- hash: f3c31e7bf792a3456fb07d2fe54ce9b968e689a915ac7ce9b658e8c99697b860
 
 name:           dataflower
-version:        0.2.0.0
+version:        0.2.1.0
 synopsis:       A Pure-Haskell Timely Dataflow System
 description:    See README
 homepage:       https://github.com/doublecrowngaming/dataflower#readme
diff --git a/src/Dataflow/Operators.hs b/src/Dataflow/Operators.hs
--- a/src/Dataflow/Operators.hs
+++ b/src/Dataflow/Operators.hs
@@ -15,7 +15,10 @@
   fanout,
   map,
   join2,
-  join3
+  join3,
+  join4,
+  join5,
+  join6
 ) where
 
 import           Dataflow.Primitives (Dataflow, Edge, StateRef, Timestamp,
@@ -73,3 +76,72 @@
   (,,) <$> registerVertex (StatefulVertex stateRef callbackI)
        <*> registerVertex (StatefulVertex stateRef callbackJ)
        <*> registerVertex (StatefulVertex stateRef callbackK)
+
+-- | Construct a stateful vertex with four input edges.
+--
+-- @since 0.2.1.0
+join4 ::
+  state
+  -> (StateRef state -> Timestamp -> i1 -> Dataflow ())
+  -> (StateRef state -> Timestamp -> i2 -> Dataflow ())
+  -> (StateRef state -> Timestamp -> i3 -> Dataflow ())
+  -> (StateRef state -> Timestamp -> i4 -> Dataflow ())
+  -> (StateRef state -> Timestamp -> Dataflow ())
+  -> Dataflow (Edge i1, Edge i2, Edge i3, Edge i4)
+join4 initState callback1 callback2 callback3 callback4 finalizer = do
+  stateRef <- newState initState
+
+  registerFinalizer $ finalizer stateRef
+
+  (,,,) <$> registerVertex (StatefulVertex stateRef callback1)
+        <*> registerVertex (StatefulVertex stateRef callback2)
+        <*> registerVertex (StatefulVertex stateRef callback3)
+        <*> registerVertex (StatefulVertex stateRef callback4)
+
+-- | Construct a stateful vertex with five input edges.
+--
+-- @since 0.2.1.0
+join5 ::
+  state
+  -> (StateRef state -> Timestamp -> i1 -> Dataflow ())
+  -> (StateRef state -> Timestamp -> i2 -> Dataflow ())
+  -> (StateRef state -> Timestamp -> i3 -> Dataflow ())
+  -> (StateRef state -> Timestamp -> i4 -> Dataflow ())
+  -> (StateRef state -> Timestamp -> i5 -> Dataflow ())
+  -> (StateRef state -> Timestamp -> Dataflow ())
+  -> Dataflow (Edge i1, Edge i2, Edge i3, Edge i4, Edge i5)
+join5 initState callback1 callback2 callback3 callback4 callback5 finalizer = do
+  stateRef <- newState initState
+
+  registerFinalizer $ finalizer stateRef
+
+  (,,,,) <$> registerVertex (StatefulVertex stateRef callback1)
+         <*> registerVertex (StatefulVertex stateRef callback2)
+         <*> registerVertex (StatefulVertex stateRef callback3)
+         <*> registerVertex (StatefulVertex stateRef callback4)
+         <*> registerVertex (StatefulVertex stateRef callback5)
+
+-- | Construct a stateful vertex with six input edges.
+--
+-- @since 0.2.1.0
+join6 ::
+  state
+  -> (StateRef state -> Timestamp -> i1 -> Dataflow ())
+  -> (StateRef state -> Timestamp -> i2 -> Dataflow ())
+  -> (StateRef state -> Timestamp -> i3 -> Dataflow ())
+  -> (StateRef state -> Timestamp -> i4 -> Dataflow ())
+  -> (StateRef state -> Timestamp -> i5 -> Dataflow ())
+  -> (StateRef state -> Timestamp -> i6 -> Dataflow ())
+  -> (StateRef state -> Timestamp -> Dataflow ())
+  -> Dataflow (Edge i1, Edge i2, Edge i3, Edge i4, Edge i5, Edge i6)
+join6 initState callback1 callback2 callback3 callback4 callback5 callback6 finalizer = do
+  stateRef <- newState initState
+
+  registerFinalizer $ finalizer stateRef
+
+  (,,,,,) <$> registerVertex (StatefulVertex stateRef callback1)
+          <*> registerVertex (StatefulVertex stateRef callback2)
+          <*> registerVertex (StatefulVertex stateRef callback3)
+          <*> registerVertex (StatefulVertex stateRef callback4)
+          <*> registerVertex (StatefulVertex stateRef callback5)
+          <*> registerVertex (StatefulVertex stateRef callback6)
