Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 647e2ea4f54e975bd697890e305f6c7f6d4e7462)
+++ src/Parser/DeclarationNode.cc	(revision 44adf1b408dc3453ae636391512592322192a1da)
@@ -101,5 +101,5 @@
 DeclarationNode * DeclarationNode::clone() const {
 	DeclarationNode * newnode = new DeclarationNode;
-	newnode->set_next( maybeCopy( get_next() ) );
+	newnode->next = maybeCopy( next );
 	newnode->name = name ? new string( *name ) : nullptr;
 
@@ -717,6 +717,6 @@
 
 		// there may be typedefs chained onto the type
-		if ( o->get_next() ) {
-			set_last( o->get_next()->clone() );
+		if ( o->next ) {
+			set_last( o->next->clone() );
 		} // if
 	} // if
Index: src/Parser/ExpressionNode.h
===================================================================
--- src/Parser/ExpressionNode.h	(revision 647e2ea4f54e975bd697890e305f6c7f6d4e7462)
+++ src/Parser/ExpressionNode.h	(revision 44adf1b408dc3453ae636391512592322192a1da)
@@ -26,5 +26,5 @@
 		if ( nullptr == expr ) return nullptr;
 		ExpressionNode * node = new ExpressionNode( ast::shallowCopy( expr.get() ) );
-		node->set_next( maybeCopy( get_next() ) );
+		node->next = maybeCopy( next );
 		return node;
 	}
Index: src/Parser/InitializerNode.cc
===================================================================
--- src/Parser/InitializerNode.cc	(revision 647e2ea4f54e975bd697890e305f6c7f6d4e7462)
+++ src/Parser/InitializerNode.cc	(revision 44adf1b408dc3453ae636391512592322192a1da)
@@ -36,5 +36,5 @@
 		: expr( _expr ), aggregate( aggrp ), designator( des ), kids( nullptr ), maybeConstructed( true ), isDelete( false ) {
 	if ( aggrp )
-		kids = dynamic_cast< InitializerNode * >( get_next() );
+		kids = next;
 
 	if ( kids )
@@ -48,8 +48,8 @@
 
 	if ( aggrp )
-		kids = dynamic_cast< InitializerNode * >( get_next() );
+		kids = next;
 
 	if ( kids )
-		set_next( nullptr );
+		next = nullptr;
 } // InitializerNode::InitializerNode
 
@@ -73,5 +73,5 @@
 			while ( curdes != nullptr) {
 				curdes->printOneLine(os);
-				curdes = (ExpressionNode *)(curdes->get_next());
+				curdes = curdes->next;
 				if ( curdes ) os << ", ";
 			} // while
@@ -87,5 +87,5 @@
 
 	InitializerNode *moreInit;
-	if ( (moreInit = dynamic_cast< InitializerNode * >( get_next() ) ) ) {
+	if ( ( moreInit = next ) ) {
 		moreInit->printOneLine( os );
 	} // if
@@ -98,5 +98,5 @@
 		std::vector<ast::ptr<ast::Designation>> designlist;
 		InitializerNode * child = next_init();
-		for ( ; child != nullptr ; child = dynamic_cast< InitializerNode * >( child->get_next() ) ) {
+		for ( ; child != nullptr ; child = child->next ) {
 			std::deque<ast::ptr<ast::Expr>> desList;
 			buildList( child->designator, desList );
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 647e2ea4f54e975bd697890e305f6c7f6d4e7462)
+++ src/Parser/ParseNode.h	(revision 44adf1b408dc3453ae636391512592322192a1da)
@@ -64,7 +64,4 @@
 	virtual ParseList<Next> * clone() const = 0;
 
-	Next * get_next() const { return next; }
-	void set_next( Next * newlink ) { next = newlink; }
-
 	Next * get_last() {
 		Next * current = static_cast<Next *>( this );
Index: src/Parser/StatementNode.cc
===================================================================
--- src/Parser/StatementNode.cc	(revision 647e2ea4f54e975bd697890e305f6c7f6d4e7462)
+++ src/Parser/StatementNode.cc	(revision 44adf1b408dc3453ae636391512592322192a1da)
@@ -54,13 +54,13 @@
 		StatementNode * nextStmt = new StatementNode(
 			new ast::DeclStmt( decl->location, maybeBuild( decl ) ) );
-		set_next( nextStmt );
-		if ( decl->get_next() ) {
-			get_next()->set_next( new StatementNode( dynamic_cast< DeclarationNode * >(decl->get_next()) ) );
-			decl->set_next( 0 );
+		next = nextStmt;
+		if ( decl->next ) {
+			next->next = new StatementNode( decl->next );
+			decl->next = nullptr;
 		} // if
 	} else {
-		if ( decl->get_next() ) {
-			set_next( new StatementNode( dynamic_cast< DeclarationNode * >( decl->get_next() ) ) );
-			decl->set_next( 0 );
+		if ( decl->next ) {
+			next = new StatementNode( decl->next );
+			decl->next = nullptr;
 		} // if
 		agg = decl;
@@ -87,10 +87,10 @@
 	ClauseNode * prev = this;
 	// find end of list and maintain previous pointer
-	for ( ClauseNode * curr = prev; curr != nullptr; curr = (ClauseNode *)curr->get_next() ) {
-		ClauseNode * node = strict_dynamic_cast< ClauseNode * >(curr);
+	for ( ClauseNode * curr = prev; curr != nullptr; curr = curr->next ) {
+		ClauseNode * node = curr;
 		assert( dynamic_cast<ast::CaseClause *>( node->clause.get() ) );
 		prev = curr;
 	} // for
-	ClauseNode * node = dynamic_cast< ClauseNode * >(prev);
+	ClauseNode * node = prev;
 	// convert from StatementNode list to Statement list
 	std::vector<ast::ptr<ast::Stmt>> stmts;
@@ -332,6 +332,6 @@
 	clause->when_cond = notZeroExpr( maybeMoveBuild( when ) );
 
-	ExpressionNode * next = dynamic_cast<ExpressionNode *>( targetExpr->get_next() );
-	targetExpr->set_next( nullptr );
+	ExpressionNode * next = targetExpr->next;
+	targetExpr->next = nullptr;
 	buildMoveList( next, clause->target_args );
 
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision 647e2ea4f54e975bd697890e305f6c7f6d4e7462)
+++ src/Parser/TypeData.cc	(revision 44adf1b408dc3453ae636391512592322192a1da)
@@ -494,5 +494,5 @@
 	for ( auto i = outputList.begin() ;
 			i != outputList.end() ;
-			++i, n = (DeclarationNode*)n->get_next() ) {
+			++i, n = n->next ) {
 		// Only the object type class adds additional assertions.
 		if ( n->variable.tyClass != ast::TypeDecl::Otype ) {
@@ -639,5 +639,5 @@
 	for ( auto i = outputForall.begin() ;
 			i != outputForall.end() ;
-			++i, n = (DeclarationNode*)n->get_next() ) {
+			++i, n = n->next ) {
 		// Only the object type class adds additional assertions.
 		if ( n->variable.tyClass != ast::TypeDecl::Otype ) {
@@ -1272,5 +1272,5 @@
 	auto members = ret->members.begin();
 	ret->hide = td->enumeration.hiding == EnumHiding::Hide ? ast::EnumDecl::EnumHiding::Hide : ast::EnumDecl::EnumHiding::Visible;
-	for ( const DeclarationNode * cur = td->enumeration.constants; cur != nullptr; cur = dynamic_cast< DeclarationNode * >( cur->get_next() ), ++members ) {
+	for ( const DeclarationNode * cur = td->enumeration.constants; cur != nullptr; cur = cur->next, ++members ) {
 		if ( cur->enumInLine ) {
 			// Do Nothing
@@ -1500,7 +1500,7 @@
 	assert( ! function.params );
 	// loop over declaration first as it is easier to spot errors
-	for ( DeclarationNode * decl = function.oldDeclList; decl != nullptr; decl = dynamic_cast< DeclarationNode * >( decl->get_next() ) ) {
+	for ( DeclarationNode * decl = function.oldDeclList; decl != nullptr; decl = decl->next ) {
 		// scan ALL parameter names for each declaration name to check for duplicates
-		for ( DeclarationNode * param = function.idList; param != nullptr; param = dynamic_cast< DeclarationNode * >( param->get_next() ) ) {
+		for ( DeclarationNode * param = function.idList; param != nullptr; param = param->next ) {
 			if ( *decl->name == *param->name ) {
 				// type set => parameter name already transformed by a declaration names so there is a duplicate
@@ -1524,5 +1524,5 @@
 	//    rtb( a, b, c ) const char * b; {} => int rtn( int a, const char * b, int c ) {}
 
-	for ( DeclarationNode * param = function.idList; param != nullptr; param = dynamic_cast< DeclarationNode * >( param->get_next() ) ) {
+	for ( DeclarationNode * param = function.idList; param != nullptr; param = param->next ) {
 		if ( ! param->type ) {							// generate type int for empty parameter type
 			param->type = new TypeData( TypeData::Basic );
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 647e2ea4f54e975bd697890e305f6c7f6d4e7462)
+++ src/Parser/parser.yy	(revision 44adf1b408dc3453ae636391512592322192a1da)
@@ -127,5 +127,5 @@
 
 	// Start at second variable in declaration list and clone the type specifiers for each variable.
-	for ( DeclarationNode * cur = dynamic_cast<DeclarationNode *>( declList->get_next() ); cur != nullptr; cur = dynamic_cast<DeclarationNode *>( cur->get_next() ) ) {
+	for ( DeclarationNode * cur = declList->next ; cur != nullptr; cur = cur->next ) {
 		cl->cloneBaseType( cur, copyattr );				// cur is modified
 	} // for
@@ -139,5 +139,5 @@
 void distExt( DeclarationNode * declaration ) {
 	// distribute EXTENSION across all declarations
-	for ( DeclarationNode *iter = declaration; iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) {
+	for ( DeclarationNode *iter = declaration ; iter != nullptr ; iter = iter->next ) {
 		iter->set_extension( true );
 	} // for
@@ -146,5 +146,5 @@
 void distInl( DeclarationNode * declaration ) {
 	// distribute INLINE across all declarations
-	for ( DeclarationNode *iter = declaration; iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) {
+	for ( DeclarationNode *iter = declaration ; iter != nullptr ; iter = iter->next ) {
 		iter->set_inLine( true );
 	} // for
@@ -153,5 +153,5 @@
 void distQual( DeclarationNode * declaration, DeclarationNode * qualifiers ) {
 	// distribute qualifiers across all non-variable declarations in a distribution statemement
-	for ( DeclarationNode * iter = declaration; iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) {
+	for ( DeclarationNode * iter = declaration ; iter != nullptr ; iter = iter->next ) {
 		// SKULLDUGGERY: Distributions are parsed inside out, so qualifiers are added to declarations inside out. Since
 		// addQualifiers appends to the back of the list, the forall clauses are in the wrong order (right to left). To
