diff --git a/src/cfgrammar.c b/src/cfgrammar.c
index b4a3aef368d4e5017039e554680d1674b4404d98..67361c836b62f4f1c4be0cd82a892e6f221fe41c 100644
--- a/src/cfgrammar.c
+++ b/src/cfgrammar.c
@@ -37,7 +37,8 @@ static void collect_nts(HCFGrammar *grammar, HCFChoice *symbol);
 static void collect_geneps(HCFGrammar *grammar);
 
 
-static const HParsedToken *h_act_first(const HParseResult *p)
+// XXX to be consolidated with glue.c when merged upstream
+const HParsedToken *h_act_first(const HParseResult *p)
 {
   assert(p->ast);
   assert(p->ast->token_type == TT_SEQUENCE);
diff --git a/src/parsers/ignoreseq.c b/src/parsers/ignoreseq.c
index 95e54b89f5b237f218de0642bd7ed7f6a1c875e7..e4bf43238e981a398d4e8cb0e2fddb3517870d07 100644
--- a/src/parsers/ignoreseq.c
+++ b/src/parsers/ignoreseq.c
@@ -2,6 +2,10 @@
 #include "parser_internal.h"
 
 
+// XXX I'm thinking these parsers should be removed entirely in favor of an
+//     equivalent family of HActions.  --pesco
+
+
 //
 // general case: parse sequence, pick one result
 //
@@ -27,6 +31,18 @@ static HParseResult* parse_ignoreseq(void* env, HParseState *state) {
   return res;
 }
 
+extern const HParsedToken *h_act_first(const HParseResult *p);
+extern const HParsedToken *h_act_last(const HParseResult *p);
+
+// XXX to be consolidated with glue.c when merged upstream
+const HParsedToken *h_act_second(const HParseResult *p) {
+  assert(p->ast);
+  assert(p->ast->token_type == TT_SEQUENCE);
+  assert(p->ast->seq->used > 0);
+
+  return p->ast->seq->elements[1];
+}
+
 static HCFChoice* desugar_ignoreseq(HAllocator *mm__, void *env) {
   HIgnoreSeq *seq = (HIgnoreSeq*)env;
   HCFSequence *hseq = h_new(HCFSequence, 1);
@@ -41,6 +57,16 @@ static HCFChoice* desugar_ignoreseq(HAllocator *mm__, void *env) {
   ret->seq[0] = hseq;
   ret->seq[1] = NULL;
   ret->action = NULL;
+
+  if(seq->which == 0)
+    ret->reshape = h_act_first;
+  else if(seq->which == 1)
+    ret->reshape = h_act_second;    // for h_middle
+  else if(seq->which == seq->len-1)
+    ret->reshape = h_act_last;
+  else
+    ret->reshape = NULL;    // XXX
+
   return ret;
 }
 
diff --git a/src/parsers/whitespace.c b/src/parsers/whitespace.c
index 6115e09f338e4beb26be0ff79d6195dc312f7aca..f9fa59f6fb15ec923f956042e3abbab591d9129a 100644
--- a/src/parsers/whitespace.c
+++ b/src/parsers/whitespace.c
@@ -17,9 +17,11 @@ static HParseResult* parse_whitespace(void* env, HParseState *state) {
 
 static const char SPACE_CHRS[6] = {' ', '\f', '\n', '\r', '\t', '\v'};
 
-static const HParsedToken *h_act_last(const HParseResult *p) {
+// XXX to be consolidated with glue.c when merged upstream
+const HParsedToken *h_act_last(const HParseResult *p) {
   assert(p->ast);
   assert(p->ast->token_type == TT_SEQUENCE);
+  assert(p->ast->seq->used > 0);
 
   return p->ast->seq->elements[p->ast->seq->used-1];
 }