diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,7 @@
+2024-09-07
+        * Version bump (4.0). (#532)
+        * Add support for array updates. (#36)
+
 2024-07-07
         * Version bump (3.20). (#522)
         * Add support for struct field updates. (#520)
diff --git a/copilot-interpreter.cabal b/copilot-interpreter.cabal
--- a/copilot-interpreter.cabal
+++ b/copilot-interpreter.cabal
@@ -1,6 +1,6 @@
 cabal-version:       >=1.10
 name:                copilot-interpreter
-version:             3.20
+version:             4.0
 synopsis:            Interpreter for Copilot.
 description:
   Interpreter for Copilot.
@@ -44,7 +44,7 @@
     base       >= 4.9 && < 5,
     pretty     >= 1.0 && < 1.2,
 
-    copilot-core >= 3.20 && < 3.21
+    copilot-core >= 4.0 && < 4.1
 
   exposed-modules:
 
diff --git a/src/Copilot/Interpret/Eval.hs b/src/Copilot/Interpret/Eval.hs
--- a/src/Copilot/Interpret/Eval.hs
+++ b/src/Copilot/Interpret/Eval.hs
@@ -19,8 +19,8 @@
 import Copilot.Core            (Expr (..), Field (..), Id, Name, Observer (..),
                                 Op1 (..), Op2 (..), Op3 (..), Spec, Stream (..),
                                 Trigger (..), Type (..), UExpr (..), Value (..),
-                                arrayElems, specObservers, specStreams,
-                                specTriggers, updateField)
+				arrayElems, arrayUpdate, specObservers,
+                                specStreams, specTriggers, updateField)
 import Copilot.Interpret.Error (badUsage)
 
 import           Prelude hiding (id)
@@ -32,6 +32,7 @@
 import Data.List         (transpose)
 import Data.Maybe        (fromJust)
 import Data.Typeable     (Typeable)
+import GHC.TypeLits      (KnownNat, Nat, natVal)
 
 -- | Exceptions that may be thrown during interpretation of a Copilot
 -- specification.
@@ -265,7 +266,8 @@
 -- Haskell function operating on the same types as the
 -- 'Copilot.Core.Operators.Op3'.
 evalOp3 :: Op3 a b c d -> (a -> b -> c -> d)
-evalOp3 (Mux _) = \ !v !x !y -> if v then x else y
+evalOp3 (Mux         _)  = \ !v !x !y -> if v then x else y
+evalOp3 (UpdateArray ty) = \xs n x -> arrayUpdate xs (fromIntegral n) x
 
 -- | Turn a stream into a key-value pair that can be added to an 'Env' for
 -- simulation.
