diff --git a/Simulation/Aivika/GPSS/Block.hs b/Simulation/Aivika/GPSS/Block.hs
--- a/Simulation/Aivika/GPSS/Block.hs
+++ b/Simulation/Aivika/GPSS/Block.hs
@@ -13,6 +13,7 @@
        (Block(..),
         GeneratorBlock(..),
         withinBlock,
+        processBlock,
         traceBlock) where
 
 import Control.Monad
@@ -46,6 +47,12 @@
                -> Block a a
 withinBlock m =
   Block { blockProcess = \a -> m >> return a }
+
+-- | Process every transact within the block.
+processBlock :: (a -> Process b)
+                -- ^ process the transact
+                -> Block a b
+processBlock = Block
 
 -- | Trace the specified block.
 traceBlock :: String -> Block a b -> Block a b
diff --git a/Simulation/Aivika/GPSS/Block/Generate.hs b/Simulation/Aivika/GPSS/Block/Generate.hs
--- a/Simulation/Aivika/GPSS/Block/Generate.hs
+++ b/Simulation/Aivika/GPSS/Block/Generate.hs
@@ -12,7 +12,10 @@
 module Simulation.Aivika.GPSS.Block.Generate
        (streamGeneratorBlock0,
         streamGeneratorBlock,
-        streamGeneratorBlockM) where
+        streamGeneratorBlockM,
+        signalGeneratorBlock0,
+        signalGeneratorBlock,
+        signalGeneratorBlockM) where
 
 import Simulation.Aivika
 import Simulation.Aivika.GPSS.Block
@@ -49,3 +52,37 @@
                          -- ^ the input stream of data
                          -> GeneratorBlock (Transact a)
 streamGeneratorBlock0 s = streamGeneratorBlock s 0
+
+-- | Return a generator block by the specified signal and priority computation.
+signalGeneratorBlockM :: Signal (Arrival a)
+                         -- ^ the input signal of data
+                         -> Event Int
+                         -- ^ the transact priority
+                         -> GeneratorBlock (Transact a)
+signalGeneratorBlockM s priority =
+  let handle block a =
+        do p <- priority
+           t <- liftSimulation $ newTransact a p
+           runProcess $
+             do takeTransact t
+                blockProcess block t
+  in GeneratorBlock $ \block ->
+  do h <- liftEvent $
+          handleSignal s $
+          handle block
+     finallyProcess neverProcess
+       (liftEvent $ disposeEvent h)
+
+-- | Return a generator block by the specified signal and priority.
+signalGeneratorBlock :: Signal (Arrival a)
+                        -- ^ the input signal of data
+                        -> Int
+                        -- ^ the transact priority
+                        -> GeneratorBlock (Transact a)
+signalGeneratorBlock s = signalGeneratorBlockM s . return
+
+-- | Return a generator block by the specified signal using zero priority.
+signalGeneratorBlock0 :: Signal (Arrival a)
+                         -- ^ the input signal of data
+                         -> GeneratorBlock (Transact a)
+signalGeneratorBlock0 s = signalGeneratorBlock s 0
diff --git a/Simulation/Aivika/Trans/GPSS/Block.hs b/Simulation/Aivika/Trans/GPSS/Block.hs
--- a/Simulation/Aivika/Trans/GPSS/Block.hs
+++ b/Simulation/Aivika/Trans/GPSS/Block.hs
@@ -13,6 +13,7 @@
        (Block(..),
         GeneratorBlock(..),
         withinBlock,
+        processBlock,
         traceBlock) where
 
 import Control.Monad
@@ -50,6 +51,14 @@
 {-# INLINABLE withinBlock #-}
 withinBlock m =
   Block { blockProcess = \a -> m >> return a }
+
+-- | Process every transact within the block.
+processBlock :: MonadDES m
+                => (a -> Process m b)
+                -- ^ process the transact
+                -> Block m a b
+{-# INLINABLE processBlock #-}
+processBlock = Block
 
 -- | Trace the specified block.
 traceBlock :: MonadDES m => String -> Block m a b -> Block m a b
diff --git a/Simulation/Aivika/Trans/GPSS/Block/Generate.hs b/Simulation/Aivika/Trans/GPSS/Block/Generate.hs
--- a/Simulation/Aivika/Trans/GPSS/Block/Generate.hs
+++ b/Simulation/Aivika/Trans/GPSS/Block/Generate.hs
@@ -12,7 +12,10 @@
 module Simulation.Aivika.Trans.GPSS.Block.Generate
        (streamGeneratorBlock0,
         streamGeneratorBlock,
-        streamGeneratorBlockM) where
+        streamGeneratorBlockM,
+        signalGeneratorBlock0,
+        signalGeneratorBlock,
+        signalGeneratorBlockM) where
 
 import Simulation.Aivika.Trans
 import Simulation.Aivika.Trans.GPSS.Block
@@ -55,3 +58,43 @@
                          -> GeneratorBlock m (Transact m a)
 {-# INLINABLE streamGeneratorBlock0 #-}
 streamGeneratorBlock0 s = streamGeneratorBlock s 0
+
+-- | Return a generator block by the specified signal and priority computation.
+signalGeneratorBlockM :: MonadDES m
+                         => Signal m (Arrival a)
+                         -- ^ the input signal of data
+                         -> Event m Int
+                         -- ^ the transact priority
+                         -> GeneratorBlock m (Transact m a)
+{-# INLINABLE signalGeneratorBlockM #-}
+signalGeneratorBlockM s priority =
+  let handle block a =
+        do p <- priority
+           t <- liftSimulation $ newTransact a p
+           runProcess $
+             do takeTransact t
+                blockProcess block t
+  in GeneratorBlock $ \block ->
+  do h <- liftEvent $
+          handleSignal s $
+          handle block
+     finallyProcess neverProcess
+       (liftEvent $ disposeEvent h)
+
+-- | Return a generator block by the specified signal and priority.
+signalGeneratorBlock :: MonadDES m
+                        => Signal m (Arrival a)
+                        -- ^ the input signal of data
+                        -> Int
+                        -- ^ the transact priority
+                        -> GeneratorBlock m (Transact m a)
+{-# INLINABLE signalGeneratorBlock #-}
+signalGeneratorBlock s = signalGeneratorBlockM s . return
+
+-- | Return a generator block by the specified signal using zero priority.
+signalGeneratorBlock0 :: MonadDES m
+                         => Signal m (Arrival a)
+                         -- ^ the input signal of data
+                         -> GeneratorBlock m (Transact m a)
+{-# INLINABLE signalGeneratorBlock0 #-}
+signalGeneratorBlock0 s = signalGeneratorBlock s 0
diff --git a/aivika-gpss.cabal b/aivika-gpss.cabal
--- a/aivika-gpss.cabal
+++ b/aivika-gpss.cabal
@@ -1,5 +1,5 @@
 name:            aivika-gpss
-version:         0.4
+version:         0.5
 synopsis:        GPSS-like DSL for Aivika
 description:
     This package allows defining simulation models in terms of a GPSS-like
