Index: lucene/common-build.xml
===================================================================
--- lucene/common-build.xml	(revision 1036137)
+++ lucene/common-build.xml	(working copy)
@@ -65,6 +65,7 @@
   </condition>
   <property name="tests.multiplier" value="1" />
   <property name="tests.codec" value="random" />
+  <property name="tests.randomCodecPerField" value="true"/>
   <property name="tests.locale" value="random" />
   <property name="tests.timezone" value="random" />
   <property name="tests.directory" value="random" />
Index: lucene/contrib/benchmark/res-Standard.txt
===================================================================
--- lucene/contrib/benchmark/res-Standard.txt	(revision 0)
+++ lucene/contrib/benchmark/res-Standard.txt	(revision 0)
@@ -0,0 +1,285 @@
+Using org.apache.lucene.store.NIOFSDirectory
+open commit=single
+found commit=delsingle
+found commit=delmulti
+found commit=multi
+found commit=single
+reader=DirectoryReader(_42:C10000000->_0 )
+
+HITS q=body:state s=null tot=2172250
+  0 doc=377386 score=1.7867323
+  1 doc=2184549 score=1.7867323
+  2 doc=2184556 score=1.7867323
+  3 doc=2184580 score=1.7867323
+  4 doc=2184584 score=1.7867323
+  5 doc=2184589 score=1.7867323
+  6 doc=2184602 score=1.7867323
+  7 doc=2184611 score=1.7867323
+  8 doc=2187621 score=1.7867323
+  9 doc=2187629 score=1.7867323
+
+HITS q=body:unit* s=null tot=2014672
+  0 doc=0 score=1.0
+  1 doc=1 score=1.0
+  2 doc=2 score=1.0
+  3 doc=3 score=1.0
+  4 doc=4 score=1.0
+  5 doc=5 score=1.0
+  6 doc=6 score=1.0
+  7 doc=7 score=1.0
+  8 doc=8 score=1.0
+  9 doc=9 score=1.0
+  995 expanded terms
+
+HITS q=body:un*d s=null tot=569634
+  0 doc=0 score=1.0
+  1 doc=1 score=1.0
+  2 doc=3 score=1.0
+  3 doc=4 score=1.0
+  4 doc=6 score=1.0
+  5 doc=7 score=1.0
+  6 doc=8 score=1.0
+  7 doc=14 score=1.0
+  8 doc=15 score=1.0
+  9 doc=16 score=1.0
+  1281 expanded terms
+
+HITS q=body:united~0.6 s=null tot=1049
+  0 doc=698605 score=0.8536385
+  1 doc=3868794 score=0.8536385
+  2 doc=7038983 score=0.8536385
+  3 doc=1531596 score=0.63626456
+  4 doc=2584337 score=0.63626456
+  5 doc=4701785 score=0.63626456
+  6 doc=5754526 score=0.63626456
+  7 doc=7871974 score=0.63626456
+  8 doc=8924715 score=0.63626456
+  9 doc=1979783 score=0.5090116
+  50 expanded terms
+
+HITS q=body:united~0.7 s=null tot=651
+  0 doc=698605 score=0.9069276
+  1 doc=3868794 score=0.9069276
+  2 doc=7038983 score=0.9069276
+  3 doc=1531596 score=0.6759839
+  4 doc=2584337 score=0.6759839
+  5 doc=4701785 score=0.6759839
+  6 doc=5754526 score=0.6759839
+  7 doc=7871974 score=0.6759839
+  8 doc=8924715 score=0.6759839
+  9 doc=1979783 score=0.5407871
+  22 expanded terms
+
+HITS q=body:unit body:state s=null tot=2670698
+  0 doc=770770 score=2.2748127
+  1 doc=3940959 score=2.2748127
+  2 doc=7111148 score=2.2748127
+  3 doc=377386 score=2.1831603
+  4 doc=2727395 score=2.1831603
+  5 doc=2789177 score=2.1831603
+  6 doc=2809684 score=2.1831603
+  7 doc=3547575 score=2.1831603
+  8 doc=5897584 score=2.1831603
+  9 doc=5959365 score=2.1831603
+
+HITS q=+body:unit +body:state s=null tot=1481220
+  0 doc=770770 score=2.2748127
+  1 doc=3940959 score=2.2748127
+  2 doc=7111148 score=2.2748127
+  3 doc=377386 score=2.1831603
+  4 doc=2727395 score=2.1831603
+  5 doc=2789177 score=2.1831603
+  6 doc=2809684 score=2.1831603
+  7 doc=3547575 score=2.1831603
+  8 doc=5897584 score=2.1831603
+  9 doc=5959365 score=2.1831603
+
+HITS q=body:"unit state" s=null tot=1338850
+  0 doc=770770 score=3.216548
+  1 doc=3940959 score=3.216548
+  2 doc=7111148 score=3.216548
+  3 doc=1239076 score=2.7856123
+  4 doc=1439945 score=2.7856123
+  5 doc=2296254 score=2.7856123
+  6 doc=2370955 score=2.7856123
+  7 doc=2810275 score=2.7856123
+  8 doc=2818412 score=2.7856123
+  9 doc=2826425 score=2.7856123
+checksum=4393807020
+ns by query/coll:
+  q=body:state s=null h=2172250
+    t=0
+      94774101 c=20044707
+      88834762 c=20044707
+      89439696 c=20044707
+      65102688 c=20044707
+      62069118 c=20044707 **
+      82937207 c=20044707
+      63002742 c=20044707
+      62943609 c=20044707
+      62764790 c=20044707
+      62866238 c=20044707
+      62973166 c=20044707
+      63114795 c=20044707
+      62845100 c=20044707
+      62691088 c=20044707
+      62877654 c=20044707
+      78184444 c=20044707
+      83978035 c=20044707
+      83563423 c=20044707
+      85838356 c=20044707
+      83306515 c=20044707
+  q=body:unit* s=null h=2014672
+    t=0
+      101498190 c=45
+      105788933 c=45
+      78325329 c=45
+      111327128 c=45
+      82016997 c=45
+      105040771 c=45
+      70441425 c=45
+      71106904 c=45
+      70352617 c=45
+      70616653 c=45
+      70580178 c=45
+      71207762 c=45
+      70315915 c=45
+      80200029 c=45
+      70246919 c=45 **
+      93811206 c=45
+      93653932 c=45
+      93436210 c=45
+      93538811 c=45
+      93488185 c=45
+  q=body:un*d s=null h=569634
+    t=0
+      327392837 c=74
+      54591582 c=74
+      39012690 c=74
+      36700097 c=74
+      37180100 c=74
+      44047635 c=74
+      33100732 c=74
+      35189283 c=74
+      33068718 c=74
+      32907643 c=74 **
+      33529563 c=74
+      32993981 c=74
+      32926143 c=74
+      33544155 c=74
+      33095816 c=74
+      61681436 c=74
+      44301486 c=74
+      44035670 c=74
+      43332561 c=74
+      43458286 c=74
+  q=body:united~0.6 s=null h=1049
+    t=0
+      114576079 c=44955098
+      576333140 c=44955098
+      399133786 c=44955098
+      787092046 c=44955098
+      114515663 c=44955098
+      110340231 c=44955098
+      234714261 c=44955098
+      73134769 c=44955098
+      73864025 c=44955098
+      72228727 c=44955098
+      185106338 c=44955098
+      99315766 c=44955098
+      70416410 c=44955098 **
+      72847699 c=44955098
+      70726064 c=44955098
+      92927508 c=44955098
+      92894967 c=44955098
+      92381173 c=44955098
+      92810756 c=44955098
+      92762164 c=44955098
+  q=body:united~0.7 s=null h=651
+    t=0
+      30554967 c=44955098
+      22941364 c=44955098
+      92210918 c=44955098
+      160358229 c=44955098
+      25357949 c=44955098
+      22006573 c=44955098
+      22896950 c=44955098
+      22146877 c=44955098
+      22154225 c=44955098
+      23907415 c=44955098
+      41692579 c=44955098
+      21725572 c=44955098
+      21672489 c=44955098
+      22661357 c=44955098
+      21470003 c=44955098 **
+      28600920 c=44955098
+      28610052 c=44955098
+      28511628 c=44955098
+      28712380 c=44955098
+      28520008 c=44955098
+  q=body:unit body:state s=null h=2670698
+    t=0
+      315913187 c=35931043
+      226535141 c=35931043
+      249232745 c=35931043
+      225092931 c=35931043 **
+      227910614 c=35931043
+      226052298 c=35931043
+      225711551 c=35931043
+      226503706 c=35931043
+      226990561 c=35931043
+      226619352 c=35931043
+      226167273 c=35931043
+      225811852 c=35931043
+      225332294 c=35931043
+      226629327 c=35931043
+      226466058 c=35931043
+      301996588 c=35931043
+      301249693 c=35931043
+      300748767 c=35931043
+      300444234 c=35931043
+      270147831 c=35931043
+  q=+body:unit +body:state s=null h=1481220
+    t=0
+      292154142 c=35931043
+      211018244 c=35931043
+      208932209 c=35931043 **
+      209286994 c=35931043
+      210293455 c=35931043
+      225986211 c=35931043
+      210201909 c=35931043
+      209816281 c=35931043
+      210238644 c=35931043
+      209990628 c=35931043
+      209926745 c=35931043
+      224707138 c=35931043
+      209724235 c=35931043
+      211031048 c=35931043
+      214385091 c=35931043
+      277908293 c=35931043
+      294442638 c=35931043
+      280465419 c=35931043
+      280283905 c=35931043
+      260582253 c=35931043
+  q=body:"unit state" s=null h=1338850
+    t=0
+      755757617 c=27624219
+      565350665 c=27624219
+      562018202 c=27624219
+      561358535 c=27624219 **
+      636772918 c=27624219
+      563467384 c=27624219
+      569486872 c=27624219
+      563222518 c=27624219
+      562541158 c=27624219
+      596901712 c=27624219
+      562736417 c=27624219
+      561385207 c=27624219
+      562767459 c=27624219
+      574895403 c=27624219
+      721607625 c=27624219
+      739769123 c=27624219
+      753829669 c=27624219
+      751113868 c=27624219
+      750646727 c=27624219
+      747326900 c=27624219

Property changes on: lucene/contrib/benchmark/res-Standard.txt
___________________________________________________________________
Added: svn:keywords
   + Date Author Id Revision HeadURL
Added: svn:eol-style
   + native

Index: lucene/contrib/benchmark/res-trunk.txt
===================================================================
--- lucene/contrib/benchmark/res-trunk.txt	(revision 0)
+++ lucene/contrib/benchmark/res-trunk.txt	(revision 0)
@@ -0,0 +1,184 @@
+Using org.apache.lucene.store.NIOFSDirectory
+Using TaskType: perf.SearchTask
+open commit=single
+found commit=delsingle
+found commit=delmulti
+found commit=multi
+found commit=single
+reader=DirectoryReader(_2:C100000->_0 )
+
+RUN: body:state
+
+HITS q=body:state s=null tot=66586
+  0 doc=31683 score=0.6216621
+  1 doc=6465 score=0.52749777
+  2 doc=89702 score=0.5102744
+  3 doc=34617 score=0.49732968
+  4 doc=37938 score=0.49732968
+  5 doc=40169 score=0.49732968
+  6 doc=91695 score=0.49732968
+  7 doc=88878 score=0.4865276
+  8 doc=7515 score=0.45682645
+  9 doc=33356 score=0.44300243
+
+RUN: body:unit*
+
+HITS q=body:unit* s=null tot=64020
+  0 doc=0 score=1.0
+  1 doc=1 score=1.0
+  2 doc=2 score=1.0
+  3 doc=3 score=1.0
+  4 doc=4 score=1.0
+  5 doc=5 score=1.0
+  6 doc=6 score=1.0
+  7 doc=7 score=1.0
+  8 doc=8 score=1.0
+  9 doc=9 score=1.0
+  166 expanded terms
+
+RUN: body:uni*
+
+HITS q=body:uni* s=null tot=74963
+  0 doc=0 score=1.0
+  1 doc=1 score=1.0
+  2 doc=2 score=1.0
+  3 doc=3 score=1.0
+  4 doc=4 score=1.0
+  5 doc=5 score=1.0
+  6 doc=6 score=1.0
+  7 doc=7 score=1.0
+  8 doc=8 score=1.0
+  9 doc=9 score=1.0
+  980 expanded terms
+
+RUN: body:u*d
+
+HITS q=body:u*d s=null tot=18277
+  0 doc=0 score=1.0
+  1 doc=1 score=1.0
+  2 doc=3 score=1.0
+  3 doc=4 score=1.0
+  4 doc=6 score=1.0
+  5 doc=7 score=1.0
+  6 doc=8 score=1.0
+  7 doc=14 score=1.0
+  8 doc=15 score=1.0
+  9 doc=16 score=1.0
+  772 expanded terms
+
+RUN: body:un*d
+
+HITS q=body:un*d s=null tot=14719
+  0 doc=0 score=1.0
+  1 doc=1 score=1.0
+  2 doc=3 score=1.0
+  3 doc=4 score=1.0
+  4 doc=6 score=1.0
+  5 doc=7 score=1.0
+  6 doc=8 score=1.0
+  7 doc=14 score=1.0
+  8 doc=15 score=1.0
+  9 doc=16 score=1.0
+  283 expanded terms
+
+RUN: body:united~1.0
+
+HITS q=body:united~1.0 s=null tot=15
+  0 doc=10514 score=0.27043164
+  1 doc=9180 score=0.20229188
+  2 doc=98900 score=0.20229188
+  3 doc=57708 score=0.12137512
+  4 doc=75166 score=0.11443356
+  5 doc=18073 score=0.096111685
+  6 doc=31928 score=0.096111685
+  7 doc=36410 score=0.08450989
+  8 doc=11020 score=0.07592164
+  9 doc=21485 score=0.06760791
+  5 expanded terms
+
+RUN: body:united~2.0
+
+HITS q=body:united~2.0 s=null tot=1517
+  0 doc=94559 score=0.2790579
+  1 doc=29180 score=0.17502172
+  2 doc=45805 score=0.17014398
+  3 doc=94568 score=0.15785898
+  4 doc=10514 score=0.1538946
+  5 doc=11270 score=0.15118365
+  6 doc=39076 score=0.14870884
+  7 doc=36171 score=0.12994508
+  8 doc=25749 score=0.12656307
+  9 doc=9180 score=0.11511828
+  50 expanded terms
+
+RUN: body:unit~1.0
+
+HITS q=body:unit~1.0 s=null tot=63846
+  0 doc=8767 score=0.6532169
+  1 doc=51630 score=0.3079424
+  2 doc=45941 score=0.25143394
+  3 doc=42082 score=0.23344281
+  4 doc=9000 score=0.1580841
+  5 doc=3034 score=0.15311009
+  6 doc=9059 score=0.14868079
+  7 doc=22055 score=0.13976695
+  8 doc=95677 score=0.13503006
+  9 doc=11093 score=0.13367294
+  50 expanded terms
+
+RUN: body:unit~2.0
+
+HITS q=body:unit~2.0 s=null tot=63846
+  0 doc=8767 score=0.6519559
+  1 doc=51630 score=0.308043
+  2 doc=45941 score=0.25151604
+  3 doc=42082 score=0.23351908
+  4 doc=9000 score=0.15786102
+  5 doc=3034 score=0.1531601
+  6 doc=9059 score=0.14785023
+  7 doc=22055 score=0.1398126
+  8 doc=95677 score=0.13507417
+  9 doc=11093 score=0.13371661
+  50 expanded terms
+
+RUN: body:unit body:state
+
+HITS q=body:unit body:state s=null tot=71542
+  0 doc=31683 score=0.89471126
+  1 doc=89702 score=0.71672213
+  2 doc=34617 score=0.71576905
+  3 doc=37938 score=0.71576905
+  4 doc=40169 score=0.71576905
+  5 doc=91695 score=0.71576905
+  6 doc=88878 score=0.7002223
+  7 doc=89819 score=0.6991013
+  8 doc=55403 score=0.6326564
+  9 doc=55404 score=0.6326564
+
+RUN: +body:unit +body:state
+
+HITS q=+body:unit +body:state s=null tot=58425
+  0 doc=31683 score=0.89471126
+  1 doc=89702 score=0.71672213
+  2 doc=34617 score=0.71576905
+  3 doc=37938 score=0.71576905
+  4 doc=40169 score=0.71576905
+  5 doc=91695 score=0.71576905
+  6 doc=88878 score=0.7002223
+  7 doc=89819 score=0.6991013
+  8 doc=55403 score=0.6326564
+  9 doc=55404 score=0.6326564
+
+RUN: body:"unit state"
+
+HITS q=body:"unit state" s=null tot=54506
+  0 doc=31683 score=1.2651248
+  1 doc=34617 score=1.0120999
+  2 doc=37938 score=1.0120999
+  3 doc=40169 score=1.0120999
+  4 doc=91695 score=1.0120999
+  5 doc=88878 score=0.99011683
+  6 doc=89702 score=0.99011683
+  7 doc=55403 score=0.8945784
+  8 doc=55404 score=0.8945784
+  9 doc=32555 score=0.8855874

Property changes on: lucene/contrib/benchmark/res-trunk.txt
___________________________________________________________________
Added: svn:keywords
   + Date Author Id Revision HeadURL
Added: svn:eol-style
   + native

Index: lucene/contrib/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/CreateIndexTask.java
===================================================================
--- lucene/contrib/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/CreateIndexTask.java	(revision 1036137)
+++ lucene/contrib/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/CreateIndexTask.java	(working copy)
@@ -133,7 +133,6 @@
 
     final String defaultCodec = config.get("default.codec", null);
     if (defaultCodec != null) {
-      CodecProvider.setDefaultCodec(defaultCodec);
       CodecProvider.getDefault().setDefaultFieldCodec(defaultCodec);
     }
 
Index: lucene/src/java/org/apache/lucene/index/codecs/CodecProvider.java
===================================================================
--- lucene/src/java/org/apache/lucene/index/codecs/CodecProvider.java	(revision 1036137)
+++ lucene/src/java/org/apache/lucene/index/codecs/CodecProvider.java	(working copy)
@@ -39,7 +39,7 @@
 public class CodecProvider {
   private SegmentInfosWriter infosWriter = new DefaultSegmentInfosWriter();
   private SegmentInfosReader infosReader = new DefaultSegmentInfosReader();
-  private String defaultFieldCodec = defaultCodec;
+  private String defaultFieldCodec = "Standard";
   private final Map<String, String> perFieldMap = new HashMap<String, String>();
 
   
@@ -47,7 +47,6 @@
 
   private final Set<String> knownExtensions = new HashSet<String>();
 
-  private static String defaultCodec = "Standard";
 
   public final static String[] CORE_CODECS = new String[] {"Standard", "Pulsing", "PreFlex", "SimpleText"};
 
@@ -102,15 +101,6 @@
   public static CodecProvider getDefault() {
     return defaultCodecs;
   }
-
-  /** Used for testing. @lucene.internal */
-  public synchronized static void setDefaultCodec(String s) {
-    defaultCodec = s;
-  }
-  /** Used for testing. @lucene.internal */
-  public synchronized static String getDefaultCodec() {
-    return defaultCodec;
-  }
   
   /**
    * Sets the {@link Codec} for a given field. Not that setting a fields code is
@@ -175,6 +165,5 @@
     register(new PreFlexCodec());
     register(new PulsingCodec(1));
     register(new SimpleTextCodec());
-    setDefaultFieldCodec(CodecProvider.getDefaultCodec());
   }
 }
Index: lucene/src/test/org/apache/lucene/index/RandomIndexWriter.java
===================================================================
--- lucene/src/test/org/apache/lucene/index/RandomIndexWriter.java	(revision 1036137)
+++ lucene/src/test/org/apache/lucene/index/RandomIndexWriter.java	(working copy)
@@ -24,7 +24,6 @@
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.analysis.MockAnalyzer;
 import org.apache.lucene.document.Document;
-import org.apache.lucene.index.codecs.CodecProvider;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.Version;
@@ -84,7 +83,7 @@
     flushAt = _TestUtil.nextInt(r, 10, 1000);
     if (LuceneTestCase.VERBOSE) {
       System.out.println("RIW config=" + w.getConfig());
-      System.out.println("codec default=" + CodecProvider.getDefaultCodec());
+      System.out.println("codec default=" + w.getConfig().getCodecProvider().getDefaultFieldCodec());
     }
   } 
 
Index: lucene/src/test/org/apache/lucene/index/Test2BTerms.java
===================================================================
--- lucene/src/test/org/apache/lucene/index/Test2BTerms.java	(revision 1036137)
+++ lucene/src/test/org/apache/lucene/index/Test2BTerms.java	(working copy)
@@ -123,7 +123,7 @@
   @Ignore("Takes ~4 hours to run on a fast machine!!  And requires that you don't use PreFlex codec.")
   public void test2BTerms() throws IOException {
 
-    if ("PreFlex".equals(CodecProvider.getDefaultCodec())) {
+    if ("PreFlex".equals(CodecProvider.getDefault().getDefaultFieldCodec())) {
       throw new RuntimeException("thist test cannot run with PreFlex codec");
     }
 
Index: lucene/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java
===================================================================
--- lucene/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java	(revision 1036137)
+++ lucene/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java	(working copy)
@@ -37,6 +37,7 @@
 import org.apache.lucene.document.Field;
 import org.apache.lucene.document.Fieldable;
 import org.apache.lucene.index.IndexWriterConfig.OpenMode;
+import org.apache.lucene.index.codecs.CodecProvider;
 import org.apache.lucene.document.NumericField;
 import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.search.FieldCache;
@@ -57,7 +58,7 @@
 */
 
 public class TestBackwardsCompatibility extends LuceneTestCase {
-
+  
   // Uncomment these cases & run them on an older Lucene
   // version, to generate an index to test backwards
   // compatibility.  Then, cd to build/test/index.cfs and
@@ -167,8 +168,7 @@
       }
 
       try {
-        writer = new IndexWriter(dir, newIndexWriterConfig(
-          TEST_VERSION_CURRENT, new MockAnalyzer())
+        writer = new IndexWriter(dir, newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(), CodecProvider.getDefault())
           .setMergeScheduler(new SerialMergeScheduler()) // no threads!
         );
         // TODO: Make IndexWriter fail on open!
@@ -214,8 +214,8 @@
       String fullPath = fullDir(oldNames[i]);
       Directory dir = FSDirectory.open(new File(fullPath));
 
-      IndexWriter w = new IndexWriter(dir, new IndexWriterConfig(
-          TEST_VERSION_CURRENT, new MockAnalyzer()));
+      IndexWriter w = new IndexWriter(dir, newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(),
+          CodecProvider.getDefault()));
       w.optimize();
       w.close();
 
@@ -233,8 +233,8 @@
       Directory dir = FSDirectory.open(new File(fullPath));
 
       Directory targetDir = newDirectory();
-      IndexWriter w = new IndexWriter(targetDir, newIndexWriterConfig(
-          TEST_VERSION_CURRENT, new MockAnalyzer()));
+      IndexWriter w = new IndexWriter(targetDir, newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(),
+          CodecProvider.getDefault()));
       w.addIndexes(new Directory[] { dir });
       w.close();
 
@@ -254,8 +254,8 @@
       IndexReader reader = IndexReader.open(dir);
       
       Directory targetDir = newDirectory();
-      IndexWriter w = new IndexWriter(targetDir, newIndexWriterConfig(
-          TEST_VERSION_CURRENT, new MockAnalyzer()));
+      IndexWriter w = new IndexWriter(targetDir, newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(),
+          CodecProvider.getDefault()));
       w.addIndexes(new IndexReader[] { reader });
       w.close();
       reader.close();
@@ -374,7 +374,8 @@
 
     Directory dir = FSDirectory.open(new File(dirName));
     // open writer
-    IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer()).setOpenMode(OpenMode.APPEND));
+    IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(),
+        CodecProvider.getDefault()).setOpenMode(OpenMode.APPEND));
     // add 10 docs
     for(int i=0;i<10;i++) {
       addDoc(writer, 35+i);
@@ -418,7 +419,8 @@
     searcher.close();
 
     // optimize
-    writer = new IndexWriter(dir, newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer()).setOpenMode(OpenMode.APPEND));
+    writer = new IndexWriter(dir, newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(),
+        CodecProvider.getDefault()).setOpenMode(OpenMode.APPEND));
     writer.optimize();
     writer.close();
 
@@ -465,7 +467,8 @@
     searcher.close();
 
     // optimize
-    IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer()).setOpenMode(OpenMode.APPEND));
+    IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(),
+        CodecProvider.getDefault()).setOpenMode(OpenMode.APPEND));
     writer.optimize();
     writer.close();
 
@@ -488,6 +491,7 @@
 
     Directory dir = FSDirectory.open(new File(dirName));
     IndexWriterConfig conf = new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer()).setMaxBufferedDocs(10);
+    conf.setCodecProvider(CodecProvider.getDefault());
     ((LogMergePolicy) conf.getMergePolicy()).setUseCompoundFile(doCFS);
     ((LogMergePolicy) conf.getMergePolicy()).setUseCompoundDocStore(doCFS);
     IndexWriter writer = new IndexWriter(dir, conf);
@@ -500,6 +504,7 @@
 
     // open fresh writer so we get no prx file in the added segment
     conf = new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer()).setMaxBufferedDocs(10);
+    conf.setCodecProvider(CodecProvider.getDefault());
     ((LogMergePolicy) conf.getMergePolicy()).setUseCompoundFile(doCFS);
     ((LogMergePolicy) conf.getMergePolicy()).setUseCompoundDocStore(doCFS);
     writer = new IndexWriter(dir, conf);
@@ -527,7 +532,8 @@
     try {
       Directory dir = FSDirectory.open(new File(fullDir(outputDir)));
 
-      IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer()).setMaxBufferedDocs(-1).setRAMBufferSizeMB(16.0));
+      IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(),
+          CodecProvider.getDefault()).setMaxBufferedDocs(-1).setRAMBufferSizeMB(16.0));
       ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundFile(true);
       ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(10);
       for(int i=0;i<35;i++) {
Index: lucene/src/test/org/apache/lucene/index/TestLazyProxSkipping.java
===================================================================
--- lucene/src/test/org/apache/lucene/index/TestLazyProxSkipping.java	(revision 1036137)
+++ lucene/src/test/org/apache/lucene/index/TestLazyProxSkipping.java	(working copy)
@@ -69,7 +69,7 @@
         int numDocs = 500;
         
         Directory directory = new SeekCountingDirectory(new RAMDirectory());
-        IndexWriter writer = new IndexWriter(directory, newIndexWriterConfig( TEST_VERSION_CURRENT, new MockAnalyzer(MockTokenizer.WHITESPACE, true, false)).setMaxBufferedDocs(10));
+        IndexWriter writer = new IndexWriter(directory, newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(MockTokenizer.WHITESPACE, true, false)).setMaxBufferedDocs(10));
         ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundFile(false);
         ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundDocStore(false);
         for (int i = 0; i < numDocs; i++) {
@@ -120,7 +120,7 @@
     }
  
     public void testLazySkipping() throws IOException {
-        assumeFalse("This test cannot run with SimpleText codec", CodecProvider.getDefaultCodec().equals("SimpleText"));
+        assumeFalse("This test cannot run with SimpleText codec", getRandomFieldCodec(this.field).equals("SimpleText"));
         // test whether only the minimum amount of seeks()
         // are performed
         performTest(5);
Index: lucene/src/test/org/apache/lucene/search/TestPrefixRandom.java
===================================================================
--- lucene/src/test/org/apache/lucene/search/TestPrefixRandom.java	(revision 1036137)
+++ lucene/src/test/org/apache/lucene/search/TestPrefixRandom.java	(working copy)
@@ -27,7 +27,6 @@
 import org.apache.lucene.index.Term;
 import org.apache.lucene.index.TermsEnum;
 import org.apache.lucene.index.RandomIndexWriter;
-import org.apache.lucene.index.codecs.CodecProvider;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.AttributeSource;
 import org.apache.lucene.util.BytesRef;
@@ -57,7 +56,7 @@
 
     // we generate aweful prefixes: good for testing.
     // but for preflex codec, the test can be very slow, so use less iterations.
-    String codec = CodecProvider.getDefaultCodec();
+    final String codec = getRandomFieldCodec("field");
     int num = codec.equals("PreFlex") ? 200 * RANDOM_MULTIPLIER : 2000 * RANDOM_MULTIPLIER;
     for (int i = 0; i < num; i++) {
       field.setValue(_TestUtil.randomUnicodeString(random, 10));
Index: lucene/src/test/org/apache/lucene/search/TestRegexpRandom2.java
===================================================================
--- lucene/src/test/org/apache/lucene/search/TestRegexpRandom2.java	(revision 1036137)
+++ lucene/src/test/org/apache/lucene/search/TestRegexpRandom2.java	(working copy)
@@ -58,7 +58,6 @@
     RandomIndexWriter writer = new RandomIndexWriter(random, dir, 
         newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(MockTokenizer.KEYWORD, false))
         .setMaxBufferedDocs(_TestUtil.nextInt(random, 50, 1000)));
-    
     Document doc = new Document();
     Field field = newField("field", "", Field.Store.NO, Field.Index.NOT_ANALYZED);
     doc.add(field);
@@ -135,8 +134,7 @@
   public void testRegexps() throws Exception {
     // we generate aweful regexps: good for testing.
     // but for preflex codec, the test can be very slow, so use less iterations.
-    String codec = CodecProvider.getDefaultCodec();
-    int num = codec.equals("PreFlex") ? 100 * RANDOM_MULTIPLIER : 1000 * RANDOM_MULTIPLIER;
+    int num = getRandomFieldCodec("field").equals("PreFlex") ? 100 * RANDOM_MULTIPLIER : 1000 * RANDOM_MULTIPLIER;
     for (int i = 0; i < num; i++) {
       String reg = AutomatonTestUtil.randomRegexp(random);
       assertSame(reg);
Index: lucene/src/test/org/apache/lucene/util/LuceneTestCase.java
===================================================================
--- lucene/src/test/org/apache/lucene/util/LuceneTestCase.java	(revision 1036137)
+++ lucene/src/test/org/apache/lucene/util/LuceneTestCase.java	(working copy)
@@ -35,6 +35,8 @@
 import org.apache.lucene.index.codecs.preflex.PreFlexCodec;
 import org.apache.lucene.index.codecs.preflexrw.PreFlexRWCodec;
 import org.apache.lucene.index.codecs.pulsing.PulsingCodec;
+import org.apache.lucene.index.codecs.simpletext.SimpleTextCodec;
+import org.apache.lucene.index.codecs.standard.StandardCodec;
 import org.apache.lucene.search.BooleanQuery;
 import org.apache.lucene.search.FieldCache;
 import org.apache.lucene.search.FieldCache.CacheEntry;
@@ -73,6 +75,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.IdentityHashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -146,6 +149,8 @@
   // tests)
   /** Gets the codec to run tests with. */
   static final String TEST_CODEC = System.getProperty("tests.codec", "random");
+  /** Get if a random codec per field should be used */ // only use random per field if no explicit codec is set
+  static final boolean TEST_RAMDOM_CODEC_PER_FIELD = "random".equals(TEST_CODEC) && Boolean.parseBoolean(System.getProperty("tests.randomCodecPerField", "true"));
   /** Gets the locale to run tests with */
   static final String TEST_LOCALE = System.getProperty("tests.locale", "random");
   /** Gets the timezone to run tests with */
@@ -215,7 +220,7 @@
   static Codec installTestCodecs() {
     final CodecProvider cp = CodecProvider.getDefault();
 
-    savedDefaultCodec = CodecProvider.getDefaultCodec();
+    savedDefaultCodec = cp.getDefaultFieldCodec();
     String codec = TEST_CODEC;
 
     final boolean codecHasParam;
@@ -235,7 +240,6 @@
       }
     }
 
-    CodecProvider.setDefaultCodec(codec);
     cp.setDefaultFieldCodec(codec);
 
     if (codec.equals("PreFlex")) {
@@ -268,7 +272,6 @@
     cp.unregister(cp.lookup("MockFixedIntBlock"));
     cp.unregister(cp.lookup("MockVariableIntBlock"));
     swapCodec(new PulsingCodec(1));
-    CodecProvider.setDefaultCodec(savedDefaultCodec);
     cp.setDefaultFieldCodec(savedDefaultCodec);
 
   }
@@ -322,6 +325,7 @@
     timeZone = TEST_TIMEZONE.equals("random") ? randomTimeZone(random) : TimeZone.getTimeZone(TEST_TIMEZONE);
     TimeZone.setDefault(timeZone);
     testsFailed = false;
+    randomCodecProvider = new RandomCodecProvider(random);
   }
   
   @AfterClass
@@ -342,11 +346,11 @@
       }
     stores = null;
     // if tests failed, report some information back
-    if (testsFailed)
+    if (testsFailed) {
       System.out.println("NOTE: test params are: codec=" + codec + 
         ", locale=" + locale + 
-        ", timezone=" + (timeZone == null ? "(null)" : timeZone.getID()));
-    if (testsFailed) {
+        ", timezone=" + (timeZone == null ? "(null)" : timeZone.getID()) + 
+       (TEST_RAMDOM_CODEC_PER_FIELD?", "+randomCodecProvider.toString():""));
       System.err.println("NOTE: all tests run in this JVM:");
       System.err.println(Arrays.toString(testClassesRun.toArray()));
     }
@@ -614,10 +618,20 @@
 
   /** create a new index writer config with random defaults */
   public static IndexWriterConfig newIndexWriterConfig(Version v, Analyzer a) {
-    return newIndexWriterConfig(random, v, a);
+    return newIndexWriterConfig(random, v, a, TEST_RAMDOM_CODEC_PER_FIELD ? randomCodecProvider : CodecProvider.getDefault());
   }
   
+  /** create a new index writer config with random defaults */
+  public static IndexWriterConfig newIndexWriterConfig(Version v, Analyzer a, CodecProvider codecProvider) {
+    return newIndexWriterConfig(random, v, a, codecProvider);
+  }
+  
+  /** create a new index writer config with random defaults */
   public static IndexWriterConfig newIndexWriterConfig(Random r, Version v, Analyzer a) {
+    return newIndexWriterConfig(r, v, a, TEST_RAMDOM_CODEC_PER_FIELD ? randomCodecProvider : CodecProvider.getDefault());
+  }
+  
+  public static IndexWriterConfig newIndexWriterConfig(Random r, Version v, Analyzer a, CodecProvider codecProvider) {
     IndexWriterConfig c = new IndexWriterConfig(v, a);
     if (r.nextBoolean()) {
       c.setMergePolicy(new LogDocMergePolicy());
@@ -642,7 +656,9 @@
       logmp.setCalibrateSizeByDeletes(r.nextBoolean());
       logmp.setMergeFactor(_TestUtil.nextInt(r, 2, 20));
     }
-    
+    if (codecProvider != null) {
+      c.setCodecProvider(codecProvider);
+    }
     c.setReaderPooling(r.nextBoolean());
     c.setReaderTermsIndexDivisor(_TestUtil.nextInt(r, 1, 4));
     return c;
@@ -844,6 +860,8 @@
   // seed for individual test methods, changed in @before
   private long seed;
   
+  protected static CodecProvider randomCodecProvider;
+  
   private static final Random seedRand = new Random();
   protected static final Random random = new Random();
 
@@ -944,6 +962,52 @@
     }
   }
   
+  /** Returns the codec for the given field uses in this testcase */
+  public static String getRandomFieldCodec(String field) {
+    CodecProvider provider = TEST_RAMDOM_CODEC_PER_FIELD ? randomCodecProvider : CodecProvider.getDefault();
+    return provider.getFieldCodec(field);
+  }
+  
+  static class RandomCodecProvider extends CodecProvider {
+
+    private final Codec[] codecs;
+    private final Map<String, String> perFieldMap = new HashMap<String, String>();
+    private final Random random;
+
+    RandomCodecProvider(Random random) {
+      this.codecs = new Codec[] { new StandardCodec(), new SimpleTextCodec(),
+          new MockSepCodec(), new PulsingCodec(1 + random.nextInt(10)),
+          new MockVariableIntBlockCodec(1 + random.nextInt(10)),
+          new MockFixedIntBlockCodec(1 + random.nextInt(10)),
+          new PreFlexRWCodec()};
+      for (int i = 0; i < codecs.length; i++) {
+        register(codecs[i]);
+      }
+      this.random = random;
+    }
+
+    @Override
+    public synchronized String getFieldCodec(String name) {
+      if (!perFieldMap.containsKey(name)) { // select a codec at random
+        setFieldCodec(name, codecs[random.nextInt(codecs.length)].name);
+      }
+      return super.getFieldCodec(name);
+    }
+
+    @Override
+    public synchronized void setFieldCodec(String field, String codec) {
+      if (!perFieldMap.containsKey(field)) {
+        perFieldMap.put(field, codec);
+      }
+      super.setFieldCodec(field, codec);
+    }
+
+    @Override
+    public String toString() {
+      return "RandomCodecProvider [perFieldMap=" + perFieldMap + "]";
+    }
+  }
+  
   @Ignore("just a hack")
   public final void alwaysIgnoredTestMethod() {}
 }
