Index: contrib/queryparser/src/test/org/apache/lucene/queryParser/core/nodes/TestQueryNode.java
===================================================================
--- contrib/queryparser/src/test/org/apache/lucene/queryParser/core/nodes/TestQueryNode.java	(revision 0)
+++ contrib/queryparser/src/test/org/apache/lucene/queryParser/core/nodes/TestQueryNode.java	(revision 0)
@@ -0,0 +1,34 @@
+package org.apache.lucene.queryParser.core.nodes;
+
+import java.util.Arrays;
+
+import org.apache.lucene.util.LuceneTestCase;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+public class TestQueryNode extends LuceneTestCase {
+ 
+  /* LUCENE-2227 bug in QueryNodeImpl.addChildren */
+  public void testAddChildren() throws Exception {
+    FieldQueryNode nodeA = new FieldQueryNode("foo", "A", 0, 1);
+    FieldQueryNode nodeB = new FieldQueryNode("foo", "B", 1, 2);
+    BooleanQueryNode bq = new BooleanQueryNode(Arrays.asList(new QueryNode[] { nodeA }));
+    bq.add(Arrays.asList(new QueryNode[] { nodeB }));
+    assertEquals(2, bq.getChildren().size());
+  }
+}

Property changes on: contrib\queryparser\src\test\org\apache\lucene\queryParser\core\nodes\TestQueryNode.java
___________________________________________________________________
Added: svn:eol-style
   + native

Index: contrib/queryparser/src/java/org/apache/lucene/queryParser/core/nodes/QueryNodeImpl.java
===================================================================
--- contrib/queryparser/src/java/org/apache/lucene/queryParser/core/nodes/QueryNodeImpl.java	(revision 919748)
+++ contrib/queryparser/src/java/org/apache/lucene/queryParser/core/nodes/QueryNodeImpl.java	(working copy)
@@ -74,7 +74,7 @@
           .getLocalizedMessage(QueryParserMessages.NODE_ACTION_NOT_SUPPORTED));
     }
 
-    for (QueryNode child : getChildren()) {
+    for (QueryNode child : children) {
       add(child);
     }
 
Index: contrib/CHANGES.txt
===================================================================
--- contrib/CHANGES.txt	(revision 919748)
+++ contrib/CHANGES.txt	(working copy)
@@ -54,6 +54,9 @@
  
  * LUCENE-2284: MatchAllDocsQueryNode toString() created an invalid XML tag.
    (Frank Wesemann via Robert Muir)
+
+ * LUCENE-2277: QueryNodeImpl threw ConcurrentModificationException on 
+   add(List<QueryNode>). (Frank Wesemann via Robert Muir)
    
 API Changes
 
