diff a/hat/core/src/main/java/hat/dialect/HATMemoryVarOp.java b/hat/core/src/main/java/hat/dialect/HATMemoryVarOp.java
--- /dev/null
+++ b/hat/core/src/main/java/hat/dialect/HATMemoryVarOp.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package hat.dialect;
+
+import jdk.incubator.code.CodeContext;
+import jdk.incubator.code.CodeTransformer;
+import jdk.incubator.code.Op;
+import jdk.incubator.code.TypeElement;
+import jdk.incubator.code.Value;
+import jdk.incubator.code.dialect.java.ClassType;
+import optkl.util.ops.StatementLikeOp;
+import optkl.util.ops.VarLikeOp;
+
+import java.util.List;
+import java.util.Map;
+
+
+public abstract sealed class HATMemoryVarOp extends HATOp implements VarLikeOp, StatementLikeOp
+        permits HATMemoryVarOp.HATLocalVarOp, HATMemoryVarOp.HATPrivateVarOp, HATMemoryVarOp.HATPrivateInitVarOp {
+
+    private final String varName;
+
+    public HATMemoryVarOp(String varName, List<Value> operands) {
+        super(operands);
+        this.varName = varName;
+    }
+
+    protected HATMemoryVarOp(HATMemoryVarOp that, CodeContext cc) {
+        super(that, cc);
+        this.varName = that.varName;
+    }
+
+    @Override
+    public String varName() {
+        return varName;
+    }
+
+    public abstract ClassType classType();
+
+    public abstract TypeElement invokeType();
+
+    public static final  class HATLocalVarOp extends HATMemoryVarOp {
+
+        public static final String INTRINSIC_NAME = "createLocal";
+
+        private final TypeElement typeElement;
+        private final ClassType klassType;
+        private final TypeElement invokeResultType;
+
+        public HATLocalVarOp(String varName, ClassType javaType, TypeElement typeElement, TypeElement invokeResultType, List<Value> operands) {
+            super(varName, operands);
+            this.typeElement = typeElement;
+            this.klassType = javaType;
+            this.invokeResultType = invokeResultType;
+        }
+
+        public HATLocalVarOp(HATLocalVarOp op, CodeContext copyContext) {
+            super(op, copyContext);
+            this.typeElement = op.resultType();
+            this.klassType = op.klassType;
+            this.invokeResultType = op.invokeResultType;
+        }
+
+        @Override
+        public Op transform(CodeContext copyContext, CodeTransformer opTransformer) {
+            return new HATLocalVarOp(this, copyContext);
+        }
+
+        @Override
+        public TypeElement resultType() {
+            return typeElement;
+        }
+
+        @Override
+        public Map<String, Object> externalize() {
+            return Map.of("hat.dialect.hatSharedVarOp." + varName(), typeElement);
+        }
+
+        @Override
+        public ClassType classType() {
+            return klassType;
+        }
+
+        @Override
+        public TypeElement invokeType() {
+            return invokeResultType;
+        }
+    }
+
+    public static final class HATPrivateVarOp extends HATMemoryVarOp {
+
+        public static final String INTRINSIC_NAME = "createPrivate";
+
+        private final TypeElement typeElement;
+        private final ClassType klassType;
+        private final TypeElement invokeResultType;
+        private final String varName;
+
+        public HATPrivateVarOp(String varName, ClassType javaType, TypeElement typeElement, TypeElement invokeResultType, List<Value> operands) {
+            super(varName, operands);
+            this.varName = varName;
+            this.typeElement = typeElement;
+            this.klassType = javaType;
+            this.invokeResultType = invokeResultType;
+        }
+
+        public HATPrivateVarOp(HATPrivateVarOp op, CodeContext copyContext) {
+            super(op, copyContext);
+            this.varName = op.varName;
+            this.typeElement = op.resultType();
+            this.klassType = op.klassType;
+            this.invokeResultType = op.invokeResultType;
+        }
+
+        @Override
+        public Op transform(CodeContext copyContext, CodeTransformer opTransformer) {
+            return new HATPrivateVarOp(this, copyContext);
+        }
+
+        @Override
+        public TypeElement resultType() {
+            return typeElement;
+        }
+
+        @Override
+        public Map<String, Object> externalize() {
+            return Map.of("hat.dialect.hatPrivateVarOp." + varName, typeElement);
+        }
+
+        @Override
+        public ClassType classType() {
+            return klassType;
+        }
+
+        @Override
+        public TypeElement invokeType() {
+            return invokeResultType;
+        }
+    }
+
+    public static final class HATPrivateInitVarOp extends HATMemoryVarOp {
+
+        private final TypeElement typeElement;
+        private final ClassType klassType;
+        private final TypeElement invokeResultType;
+        private final String varName;
+
+        public HATPrivateInitVarOp(String varName, ClassType javaType, TypeElement typeElement, TypeElement invokeResultType, List<Value> operands) {
+            super(varName, operands);
+            this.varName = varName;
+            this.typeElement = typeElement;
+            this.klassType = javaType;
+            this.invokeResultType = invokeResultType;
+        }
+
+        public HATPrivateInitVarOp(HATPrivateInitVarOp op, CodeContext copyContext) {
+            super(op, copyContext);
+            this.varName = op.varName;
+            this.typeElement = op.resultType();
+            this.klassType = op.klassType;
+            this.invokeResultType = op.invokeResultType;
+        }
+
+        @Override
+        public Op transform(CodeContext copyContext, CodeTransformer opTransformer) {
+            return new HATPrivateInitVarOp(this, copyContext);
+        }
+
+        @Override
+        public TypeElement resultType() {
+            return typeElement;
+        }
+
+        @Override
+        public Map<String, Object> externalize() {
+            return Map.of("hat.dialect.hatPrivateVarInitOp." + varName, typeElement);
+        }
+
+        @Override
+        public ClassType classType() {
+            return klassType;
+        }
+
+        @Override
+        public TypeElement invokeType() {
+            return invokeResultType;
+        }
+    }
+}
