diff --git a/src/query/frontend/ast/ast.hpp b/src/query/frontend/ast/ast.hpp
index e9ff0bbf0..f4b66daef 100644
--- a/src/query/frontend/ast/ast.hpp
+++ b/src/query/frontend/ast/ast.hpp
@@ -550,6 +550,27 @@ class Return : public Clause {
   Return(int uid) : Clause(uid) {}
 };
 
+class With : public Clause {
+  friend class AstTreeStorage;
+
+ public:
+  void Accept(TreeVisitorBase &visitor) override {
+    visitor.Visit(*this);
+    for (auto &expr : named_expressions_) {
+      expr->Accept(visitor);
+    }
+    if (where_) where_->Accept(visitor);
+    visitor.PostVisit(*this);
+  }
+
+  bool distinct_{false};
+  std::vector<NamedExpression *> named_expressions_;
+  Where *where_ = nullptr;
+
+ protected:
+  With(int uid) : Clause(uid) {}
+};
+
 class Delete : public Clause {
   friend class AstTreeStorage;
 
diff --git a/src/query/frontend/ast/ast_visitor.hpp b/src/query/frontend/ast/ast_visitor.hpp
index 27024e70b..871f32c84 100644
--- a/src/query/frontend/ast/ast_visitor.hpp
+++ b/src/query/frontend/ast/ast_visitor.hpp
@@ -12,6 +12,7 @@ class PropertyLookup;
 class Create;
 class Match;
 class Return;
+class With;
 class Pattern;
 class NodeAtom;
 class EdgeAtom;
@@ -47,6 +48,6 @@ using TreeVisitorBase = ::utils::Visitor<
     DivisionOperator, ModOperator, NotEqualOperator, EqualOperator,
     LessOperator, GreaterOperator, LessEqualOperator, GreaterEqualOperator,
     UnaryPlusOperator, UnaryMinusOperator, Identifier, Literal, PropertyLookup,
-    Create, Match, Return, Pattern, NodeAtom, EdgeAtom, Delete, Where,
+    Create, Match, Return, With, Pattern, NodeAtom, EdgeAtom, Delete, Where,
     SetProperty, SetProperties, SetLabels, RemoveProperty, RemoveLabels>;
 }
diff --git a/src/query/frontend/logical/operator.cpp b/src/query/frontend/logical/operator.cpp
index 2ec7a5c5d..9a888768d 100644
--- a/src/query/frontend/logical/operator.cpp
+++ b/src/query/frontend/logical/operator.cpp
@@ -835,5 +835,28 @@ bool ExpandUniquenessFilter<TAccessor>::ExpandUniquenessFilterCursor::Pull(
 template class ExpandUniquenessFilter<VertexAccessor>;
 template class ExpandUniquenessFilter<EdgeAccessor>;
 
+Accumulate::Accumulate(std::shared_ptr<LogicalOperator> input, const std::vector<Symbol> &symbols) :
+    input_(input), symbols_(symbols) {}
+
+void Accumulate::Accept(LogicalOperatorVisitor &visitor) {
+  visitor.Visit(*this);
+  input_->Accept(visitor);
+  visitor.PostVisit(*this);
+}
+std::unique_ptr<Cursor> Accumulate::MakeCursor(GraphDbAccessor &db) {
+  return std::unique_ptr<Cursor>();
+}
+
+AdvanceCommand::AdvanceCommand(std::shared_ptr<LogicalOperator> input) : input_(input) {}
+
+void AdvanceCommand::Accept(LogicalOperatorVisitor &visitor) {
+  visitor.Visit(*this);
+  input_->Accept(visitor);
+  visitor.PostVisit(*this);
+}
+std::unique_ptr<Cursor> AdvanceCommand::MakeCursor(GraphDbAccessor &db) {
+  return std::unique_ptr<Cursor>();
+}
+
 }  // namespace plan
 }  // namespace query
diff --git a/src/query/frontend/logical/operator.hpp b/src/query/frontend/logical/operator.hpp
index d33c5f923..03eafe0a9 100644
--- a/src/query/frontend/logical/operator.hpp
+++ b/src/query/frontend/logical/operator.hpp
@@ -54,14 +54,15 @@ class RemoveProperty;
 class RemoveLabels;
 template <typename TAccessor>
 class ExpandUniquenessFilter;
+class Accumulate;
+class AdvanceCommand;
 
 /** @brief Base class for visitors of @c LogicalOperator class hierarchy. */
-using LogicalOperatorVisitor =
-    ::utils::Visitor<CreateNode, CreateExpand, ScanAll, Expand, NodeFilter,
-                     EdgeFilter, Filter, Produce, Delete, SetProperty,
-                     SetProperties, SetLabels, RemoveProperty, RemoveLabels,
-                     ExpandUniquenessFilter<VertexAccessor>,
-                     ExpandUniquenessFilter<EdgeAccessor>>;
+using LogicalOperatorVisitor = ::utils::Visitor<
+    CreateNode, CreateExpand, ScanAll, Expand, NodeFilter, EdgeFilter, Filter,
+    Produce, Delete, SetProperty, SetProperties, SetLabels, RemoveProperty,
+    RemoveLabels, ExpandUniquenessFilter<VertexAccessor>,
+    ExpandUniquenessFilter<EdgeAccessor>, Accumulate, AdvanceCommand>;
 
 /** @brief Base class for logical operators.
  *
@@ -741,5 +742,26 @@ class ExpandUniquenessFilter : public LogicalOperator {
   };
 };
 
+class Accumulate : public LogicalOperator {
+ public:
+  Accumulate(std::shared_ptr<LogicalOperator> input, const std::vector<Symbol> &symbols);
+  void Accept(LogicalOperatorVisitor &visitor) override;
+  std::unique_ptr<Cursor> MakeCursor(GraphDbAccessor &db) override;
+
+ private:
+  std::shared_ptr<LogicalOperator> input_;
+  const std::vector<Symbol> symbols_;
+};
+
+class AdvanceCommand : public LogicalOperator {
+ public:
+  AdvanceCommand(std::shared_ptr<LogicalOperator> input);
+  void Accept(LogicalOperatorVisitor &visitor) override;
+  std::unique_ptr<Cursor> MakeCursor(GraphDbAccessor &db) override;
+
+ private:
+  std::shared_ptr<LogicalOperator> input_;
+};
+
 }  // namespace plan
 }  // namespace query