diff --git a/src/graph/graph.hh b/src/graph/graph.hh
index a69deb0..4a036af 100644
--- a/src/graph/graph.hh
+++ b/src/graph/graph.hh
@@ -489,14 +489,14 @@
     }
   }
 
-  template <typename T>
-  vertex_and_table_t<T> as_table (unsigned parent, const void* offset)
+  template <typename T, typename ...Ts>
+  vertex_and_table_t<T> as_table (unsigned parent, const void* offset, Ts... ds)
   {
-    return as_table<T> (index_for_offset (parent, offset));
+    return as_table_from_index<T> (index_for_offset (parent, offset), std::forward<Ts>(ds)...);
   }
 
-  template <typename T>
-  vertex_and_table_t<T> as_table (unsigned index)
+  template <typename T, typename ...Ts>
+  vertex_and_table_t<T> as_table_from_index (unsigned index, Ts... ds)
   {
     if (index >= vertices_.length)
       return vertex_and_table_t<T> ();
@@ -508,7 +508,7 @@
     if (!r.table)
       return vertex_and_table_t<T> ();
 
-    if (!r.table->sanitize (*(r.vertex)))
+    if (!r.table->sanitize (*(r.vertex), std::forward<Ts>(ds)...))
       return vertex_and_table_t<T> ();
 
     return r;
diff --git a/src/graph/markbasepos-graph.hh b/src/graph/markbasepos-graph.hh
index 69f8fc7..d4dd39a 100644
--- a/src/graph/markbasepos-graph.hh
+++ b/src/graph/markbasepos-graph.hh
@@ -36,10 +36,13 @@
 
 struct AnchorMatrix : public OT::Layout::GPOS_impl::AnchorMatrix
 {
-  bool sanitize (graph_t::vertex_t& vertex) const
+  bool sanitize (graph_t::vertex_t& vertex, unsigned class_count) const
   {
-    // TODO
-    return true;
+    int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
+    if (vertex_len < AnchorMatrix::min_size) return false;
+
+    return vertex_len >= AnchorMatrix::min_size +
+        OT::Offset16::static_size * class_count * this->rows;
   }
 
   bool shrink (gsubgpos_graph_context_t& c,
@@ -116,8 +119,11 @@
 {
   bool sanitize (graph_t::vertex_t& vertex) const
   {
-    // TODO
-    return true;
+    int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
+    unsigned min_size = MarkArray::min_size;
+    if (vertex_len < min_size) return false;
+
+    return vertex_len >= get_size ();
   }
 
   bool shrink (gsubgpos_graph_context_t& c,
@@ -194,11 +200,7 @@
   bool sanitize (graph_t::vertex_t& vertex) const
   {
     int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
-    unsigned min_size = OT::Layout::GPOS_impl::MarkBasePosFormat1_2<SmallTypes>::min_size;
-    if (vertex_len < min_size) return false;
-
-    // TODO
-    return true;
+    return vertex_len >= MarkBasePosFormat1::static_size;
   }
 
   hb_vector_t<unsigned> split_subtables (gsubgpos_graph_context_t& c, unsigned this_index)
@@ -368,7 +370,8 @@
 
 
     auto base_array = sc.c.graph.as_table<AnchorMatrix> (this_index,
-                                                         &baseArray);
+                                                         &baseArray,
+                                                         old_count);
     if (!base_array || !base_array.table->shrink (sc.c,
                                                   base_array.index,
                                                   old_count,
@@ -438,8 +441,9 @@
                                  start);
     graph.add_link (&(prime->markArray), prime_id, new_mark_array);
 
+    unsigned class_count = classCount;
     auto base_array =
-        graph.as_table<AnchorMatrix> (sc.this_index, &baseArray);
+        graph.as_table<AnchorMatrix> (sc.this_index, &baseArray, class_count);
     if (!base_array) return -1;
     unsigned new_base_array =
         base_array.table->clone (sc.c,
